公用函数库

{**********************************************
***? Name: PublicFunc;
***? Author: lyz 2004-3-17;
***
***? Function: 公共函数;
**********************************************}
unit PublicFunc;

interface

uses
? Windows, Math , SysUtils, Classes ,ShlObj, ActiveX, ComObj, Registry, Db,
? Controls, Dialogs, XMLDoc, XMLIntf;

type
{ TStream seek origins }
? TFolderNo = (Desktop, StartMenu, Programs);

type

?TCPUID?= array[1..4] of Longint;
?TVendor?= array [0..11] of char;

? TObjList=class (TList)
? public
??? destructor Destroy; override;
??? procedure Clear; override;
??? procedure SaveToStream(stream: TStream); virtual;
??? procedure LoadFromStream(stream: TStream); virtual;
? end;

var
? _DecNum: Integer;

? _RoundValue: Double;

? _EquMinValue: Double;

? _ZeroMinValue: Double;

?

?

//*************LYZ
function StrIsEmpty (s: String): Boolean;

//procedure StringWrite (f: file; s: String);

//procedure StringRead (f: file; s: String);

function SLtrim (s: String): String;

function STrim (s: String): String;

function SAllTrim (s: String): String;

function SRemoveSpace (s: String): String;//除掉空格

procedure SSplitString (s: String; s1: String; s2: String);

procedure SSplitString1 (s: String; s1: String; s2: String);

function SIntToStrFix (n: Integer; cnt: Integer): String;

function ARound (v: Double): Double;???//求

function ARoundN (v: Double; n: Integer): Double;? //保留几位小数

function AEqu (v1: Double; v2: Double): Boolean;??? //两个是否相等

function ASmall (v1: Double; v2: Double): Boolean;? file://v1 < v2

function ABig (v1: Double; v2: Double): Boolean;??? file://v1 > v2

function AIsZero (v1: Double): Boolean;? file://判断是否为零

function AMax (a: Double; b: Double): Double;? file://返回大值

function AMin (a: Double; b: Double): Double;? file://返回小值

procedure ASwap (p1: Double; p2: Double);? file://交

function IMax (a: Integer; b: Integer): Integer; file://返回大值

function IMin (a: Integer; b: Integer): Integer; file://返回小值

procedure ISwap (p1: Integer; p2: Integer);? file://交

function RealToStr (v: Double): String;?? file://Double转换成String

function RealToStr1 (v: Double): String;

function StrToReal (s: String): Double;? file://String转换成Double

function RealStr (v: Double): String;??? file://Double转换成String

function RealStrN (v: Double; dec: Integer): String;? file://保留几位小数 Double转换成String

function RealDateN(v: Double): String;? file://日期转化成字符

function IsDate(const str: string): Boolean;

function GetDate(const str: string): TDateTime;? file://字符转化成日期

function RealStr1 (v: Double; len: Integer; dec: Integer): String;

function RealStr2 (v: Double; len: Integer; dec: Integer): String;

function RealStr3 (v: Double; len: Integer; dec: Integer): String;

function RealStr4 (v: Double; len: Integer; dec: Integer): String;

function StrInt (s: String): Integer;?? file://string 转换成 integer
file://xml

procedure WriteXMLValue(XML : IXMLNode; Const mc : string; Var Val: string);

procedure ReadXMLValue(XML : IXMLNode; Const mc : string; Var Val: string);

file://以下是保存为数据流
procedure WriteToStream (stream: TStream; const Number: Integer); overload;

procedure WriteToStream (stream: TStream; const Number: Int64); overload;

procedure WriteToStream (stream: TStream; const v: Cardinal); overload;

procedure WriteToStream (stream: TStream; const v: Word); overload;

procedure WriteToStream (stream: TStream; const Filestr: String); overload;

procedure WriteToStream (stream: TStream; const v: Double); overload;

procedure WriteToStream (stream: TStream; const Bool: Boolean); overload;

procedure ReadFromStream (stream: TStream; var v: Cardinal); overload;

procedure WriteToStream (stream: TStream; const Number: Extended); overload;

procedure ReadFromStream (stream: TStream; var v: Extended); overload;

procedure ReadFromStream (stream: TStream; var Number: Integer); overload;

procedure ReadFromStream (stream: TStream; var Number: Int64); overload;

procedure ReadFromStream (stream: TStream; var v: Word); overload;

procedure ReadFromStream (stream: TStream; var Filestr: String); overload;

procedure ReadFromStream (stream: TStream; var v: Double); overload;

procedure ReadFromStream (stream: TStream; var Bool: Boolean); overload;

procedure WriteToStream (stream: TStream; const sList: TStringList); overload;

procedure ReadFromStream (stream: TStream; var sList: TStringList); overload;

procedure WriteToStream (stream: TStream; const iary: array of Integer); overload;

procedure ReadFromStream (stream: TStream; var iary: array of Integer); overload;

function StrLike (sou: String; key: String): Boolean;? file://sou中是否包括key

function SRight (s: String; n: Integer): String;????? file://取右边多少个字符

procedure LoadFileList (Path: String; slist: TStrings; noPath: Boolean);

function TimeTicket: Longint;

function MonthOfDate (date: TDateTime): Integer;

function DayOfDate (date: TDateTime): Integer;

function YearOfDate (date: TDateTime): Integer;

function GetSplitWord (s: String; splitc: Char): String;

function HexToInt (s: String): Integer;???????? file://16进制转换成10进制

function TransStrByTable (sou: String; ori: TStringList; des: TStringList): String;

procedure LoadTransTable (fn: String; sou: TStringList; tag: TStringList);

function MakeFilePath (s: String): String;

function RemoveNote (s: String): String;

function MakePath (path: String): String;

function Blone (tj: String; v: String): Boolean;

function CodeStr (s: String): String;

function DeCodeStr (s: String): String;

function GetValueFromStr (vname: String; s: String; txt: String): Boolean;

function GetParaList (txt: String; ss: TStringList): Boolean;

function SReplace (txt: String; sou: String; tag: String): String;

Function GetOSInfo: String;???? file://NT 还是 Windows 98?取得当前操作平台

function GetCurrentUserName : string; file://获取当前Windows用户的登录名

Procedure SetLink(FolderNo: TFolderNo; ACmdFile, Parameter, LinkName: string);//创建快捷方式

function Myrandom(Num: Integer): integer;//一个利用系统时间产生随机数的程序该随机数的范围是0到Num

function GetMouseHwndAndClassName(Sender: TObject): string;

function GetMousePosHwndAndClassName(Sender: TPoint): string; file://获取当前鼠标位置的类名和句柄

function GetIdeDiskSerialNumber : String;? file://取Ide硬盘序列号函数

file://得到CpuID号
function GetCPUID : TCPUID; assembler; register;

function GetCPUVendor : TVendor; assembler; register;

function GetCPUIDStr: String;

{日期型字段显示过程,在OnGetText事件中调用}
procedure DateFieldGetText(Sender: TField; var Text: String);

{日期型字段输入判断函数,在OnSetText事件中调用}
function DateFieldSetText(Sender: TField; const Text: String):Boolean;

? file://不能输入字符
function CheckNullValue(var Key: Char): Boolean;
{判断输入的字符是否是数字}
function CheckInputNum(const IsInteger: Boolean; AStr: string; var Key: Char): Boolean;

file://得到下一编号
function? GetNextStrId(const PreId: string): string;?? // preId := 'LX000000';

implementation

file://得到下一编号
function? GetNextStrId(const PreId: string): string;?? // preId := 'LX000000';
var
? I,n,n1:?? Integer;
? s,s1:? string;
? c:???? char;
begin
? n := Length(PreId);
? n1 := 0;
? for I := n downto 1 do begin
??? c := PreId[I];
??? if? (Ord(c) >= 65) and (Ord(c) <= 90) then begin
?????? n1 := I;
?????? Break;
??? end;
? end;
? s := Copy(PreId, 1, n1);
? s1 := Copy(PreId, n1 + 1, 100);
? s1 := IntToStr(StrInt(s1) + 1);
? result := s1;
? for I := 1 to? n - n1 - Length(s1) do
??? Result := '0' + Result;
? result := s + Result;
end;

file://不能输入字符
function CheckNullValue(var Key: Char): Boolean;
const
? ControlKeySet = [Char(#13)];
begin
? Key := #0;
? Result := True;
end;

{判断输入的字符是否是数字}
function CheckInputNum(const IsInteger: Boolean; AStr: string; var Key: Char): Boolean;
const
? NumberSet = ['0' .. '9', '.', '-'];
? ControlKeySet = [Char(#8), Char(#13)];
begin
? if Key in ControlKeySet then begin
??? Result := True;
??? Exit;
? end;

? if not (Key in NumberSet) then Key := #0;
? if (Key = '.') and ((Length(AStr) = 0) or (Pos('.', AStr) > 0)) then
??? Key := #0;

? file://不能前两个同时为0
? if (Length(AStr) = 1) and (AStr[1] = '0') and (Key = '0') then Key := #0;

? file://不能有多个负号
? if (Pos('-', AStr) >= 0) and (Key = '-') then Key := #0;

? if IsInteger then begin
??? if key = '.' then Key := #0;
//??? if (Length(AStr) = 1) and (AStr[1] = '0') or (Key = '.') then Key := #0;
? end;
? Result := Key <> #0;
end;

{日期型字段显示过程,在OnGetText事件中调用}
procedure DateFieldGetText(Sender: TField; var Text: String);
var
? dDate: TDate;
? wYear,wMonth,wDay: Word;
? aryTestYMD: Array [1..2] of Char ;{测试输入掩码用临时数组}
? iYMD: Integer;
begin
? iYMD := 0;
? dDate:= Sender.AsDateTime;
? DecodeDate(dDate,wYear,wMonth,wDay);
? {测试输入掩码所包含的格式.}
? aryTestYMD:= '年';
? if StrScan(PChar(Sender.EditMask), aryTestYMD[1]) <> nil then iYMD:= 1;
? aryTestYMD:= '月';
? if StrScan(PChar(Sender.EditMask), aryTestYMD[1]) <> nil then iYMD:= 2;
? aryTestYMD:= '日';
? if StrScan(PChar(Sender.EditMask), aryTestYMD[1]) <> nil then iYMD:= 3;
? case iYMD of
??? 1:{输入掩码为:”yyyy年”的格式.}
??? Text:= IntToStr(wYear) + '年';
??? 2: {输入掩码为:”yyyy年mm月”的格式.}
??? Text:= IntToStr(wYear) + '年' + IntToStr(wMonth) + '月';
??? 3: {输入掩码为:”yyyy年mm月dd日”的格式.}
??? Text:= IntToStr(wYear) + '年' + IntToStr(wMonth) + '月' + IntToStr(wDay) + '日';
??? else {默认为:”yyyy年mm月dd日”的格式.}
??? Text:= IntToStr(wYear) + '年' + IntToStr(wMonth) + '月' + IntToStr(wDay) + '日';
? end;
end;

{日期型字段输入判断函数,在OnSetText事件中调用}
function DateFieldSetText(Sender: TField; const Text: String):Boolean;
var
? dDate: TDate;
? sYear,sMonth,sDay: String;
? aryTestYMD: Array [1..2] of Char;
? iYMD: Integer;
begin
? iYMD := 0;
{获得用户输入的日期}
? sYear := Copy(Text, 1, 4);
? sMonth:= Copy(Text, 7, 2);
? SDay? := Copy(Text, 11, 2);
{测试输入掩码所包含的格式.}
? aryTestYMD := '年';
? if StrScan( PChar(Sender.EditMask), aryTestYMD[1] ) <> nil then iYMD := 1;
? aryTestYMD := '月';
? if StrScan( PChar(Sender.EditMask), aryTestYMD[1] ) <> nil then iYMD := 2;
? aryTestYMD := '日';
? if StrScan( PChar(Sender.EditMask), aryTestYMD[1] ) <> nil then iYMD := 3;
? {利用Try…Except进行输入的日期转换}
? try begin
??? case iYMD of
????? 1: {输入掩码为:”yyyy年”的格式.}
??????? begin
??????? dDate := StrToDate( sYear + '-01-01' );{中文Windows默认的日期格式为:yyyy-mm-dd.下同}
??????? Sender.AsDateTime := dDate;
??????? end;
????? 2: {输入掩码为:”yyyy年mm月”的格式.}
??????? begin
??????? dDate := StrToDate( sYear + '-' + sMonth + '-01' );
??????? Sender.AsDateTime:=dDate;
??????? end;
????? 3: {输入掩码为:”yyyy年mm月dd日”的格式.}
??????? begin
??????? dDate := StrToDate( sYear + '-' + sMonth + '-' + sDay );
??????? Sender.AsDateTime := dDate;
??????? end;
????? else {默认为:”yyyy年mm月dd日”的格式.}
??????? begin
??????? dDate := StrToDate( sYear + '-' + sMonth + '-' + sDay );
??????? Sender.AsDateTime := dDate;
??????? end;
??? end;
??? DateFieldSetText := True;
? end;
? except
??? {日期转换出错}
??? begin
????? showmessage( PChar ( Text + '不是有效的日期!'));
????? DateFieldSetText := False;
??? end;
end;

end;


function GetMouseHwndAndClassName(Sender: TObject): string;
var
rPos: TPoint;
begin
? Result := '';
? if boolean(GetCursorPos(rPos)) then Result := GetMousePosHwndAndClassName(rPos);
end;

function GetMousePosHwndAndClassName(Sender: TPoint): string;
var
? hWnd: THandle;
? aName: array [0..255] of char;
? tmpstr: string;
begin
? tmpstr := '';
? hWnd := WindowFromPoint(Sender);
? tmpstr := 'Handle : ' + IntToStr(hWnd);

? if boolean(GetClassName(hWnd, aName, 256)) then
??? tmpstr := 'ClassName : ' + string(aName)
? else
??? tmpstr := 'ClassName : not found';
? Result := tmpstr;?
end;

function Myrandom(Num: Integer): integer;
var
? T: _SystemTime;
? X: integer;
? I: integer;
begin
? Result := 0;
? Randomize;
? If Num = 0 then Exit;
? GetSystemTime(T);
? X := Trunc(T.wMilliseconds/10) * T.wSecond * 1231;
? X := X + random(1);
? if X < 0 then X := -X;
? X := Random(X);
? X := X mod num;
? for I := 0 to X do
??? X := Random(Num);
? Result := X;
end;


function GetCurrentUserName : string;
const
? cnMaxUserNameLen = 254;
var
? sUserName : string;
? dwUserNameLen : Dword;
begin
? dwUserNameLen := cnMaxUserNameLen-1;
? SetLength( sUserName, cnMaxUserNameLen );
? GetUserName(Pchar( sUserName ), dwUserNameLen );
? SetLength( sUserName, dwUserNameLen );
? Result := sUserName;
end;

Procedure SetLink(FolderNo: TFolderNo; ACmdFile, Parameter, LinkName: string);
var
? MyObject : Iunknown;
? MySLink : IShellLink;
? MyPFile : IPersistFile;
? FileName : string;
? Directory : string;
? WFileName : WideString;
? MyReg : TRegIniFile;
? tmpFolderNo : string;
begin
? if FolderNo = Desktop then tmpFolderNo:= 'Desktop';
? if FolderNo = StartMenu then tmpFolderNo:= 'StartMenu';
? if FolderNo = Programs then tmpFolderNo:= 'Programs';
???
? MyObject := CreateComObject(CLSID_ShellLink);
? MySLink := MyObject as IShellLink;
? MyPFile := MyObject as IPersistFile;
? FileName := ACmdFile;
? with MySLink do
? begin
??? SetArguments(Pchar(Parameter));
??? SetPath(Pchar(FileName));
??? SetWorkingDirectory(Pchar(ExtractFilePath(FileName)));
? end;
? MyReg := TRegIniFile.Create('Software/MicroSoft/Windows/CurrentVersion/Explorer');

? Directory := MyReg.ReadString('Shell Folders', tmpFolderNo,'');
? file://CreateDir(Directory);
? WFileName := Directory + '/' + LinkName + '.lnk';
? MyPFile.Save(PWChar(WFileName),False);
? MyReg.Free;
end;


Function GetOSInfo: String;
var
? VI: TOSVersionInfo;
begin
? Result:= '';
? VI.dwOSVersionInfoSize := SizeOf(VI);
? GetVersionEx(VI);//取得正在运行的Windeows和Win32操作系统的版本

//? VI.dwPlatformId
? Result:= Result + Format('%d%d%d',[VI.dwMajorVersion,VI.dwMinorVersion,VI.dwBuildNumber]);
? Result:= Result + GetIdeDiskSerialNumber + GetCPUIDStr;
? case Win32Platform of
??? VER_PLATFORM_WIN32_WINDOWS: Result := Result + 'Windows 95/98';
??? VER_PLATFORM_WIN32_NT: Result := Result + 'Windows NT';
? else
??? Result := Result + 'Windows32';
? end;
end;

function GetCPUID : TCPUID; assembler; register;
asm
? PUSH??? EBX???????? {Save affected register}
? PUSH??? EDI
? MOV???? EDI,EAX???? {@Resukt}
? MOV???? EAX,1
? DW????? $A20F?????? {CPUID Command}
? STOSD???????????? {CPUID[1]}
? MOV???? EAX,EBX
? STOSD?????????????? {CPUID[2]}
? MOV???? EAX,ECX
? STOSD?????????????? {CPUID[3]}
? MOV???? EAX,EDX
? STOSD?????????????? {CPUID[4]}
? POP???? EDI?????{Restore registers}
? POP???? EBX
end;

function GetCPUVendor : TVendor; assembler; register;
asm
? PUSH??? EBX?????{Save affected register}
? PUSH??? EDI
? MOV???? EDI,EAX???{@Result (TVendor)}
? MOV???? EAX,0
? DW????? $A20F????{CPUID Command}
? MOV???? EAX,EBX
? XCHG??EBX,ECX???? {save ECX result}
? MOV???ECX,4
@1:
? STOSB
? SHR???? EAX,8
? LOOP??? @1
? MOV???? EAX,EDX
? MOV???ECX,4
@2:
? STOSB
? SHR???? EAX,8
? LOOP??? @2
? MOV???? EAX,EBX
? MOV???ECX,4
@3:
? STOSB
? SHR???? EAX,8
? LOOP??? @3
? POP???? EDI?????{Restore registers}
? POP???? EBX
end;

function GetCPUIDStr: String;
var
? CPUID : TCPUID;
? I???? : Integer;
? S???: TVendor;
begin
? Result := '';
?for I := Low(CPUID) to High(CPUID)? do CPUID[I] := -1;
??? CPUID?:= GetCPUID;
? Result := Result + IntToHex(CPUID[1],8);
? Result := Result + IntToHex(CPUID[2],8);
? Result := Result + IntToHex(CPUID[3],8);
? Result := Result + IntToHex(CPUID[4],8);
? S := GetCPUVendor;
? Result := Result + S;
end;

function GetIdeDiskSerialNumber : String;? file://取Ide硬盘序列号函数
? type
??? TSrbIoControl = packed record
??? HeaderLength : ULONG;
??? Signature : Array[0..7] of Char;
??? Timeout : ULONG;
??? ControlCode : ULONG;
??? ReturnCode : ULONG;
??? Length : ULONG;
? end;
? SRB_IO_CONTROL = TSrbIoControl;
? PSrbIoControl = ^TSrbIoControl;

? TIDERegs = packed record
??? bFeaturesReg : Byte; // Used for specifying SMART "commands".
??? bSectorCountReg : Byte; // IDE sector count register
??? bSectorNumberReg : Byte; // IDE sector number register
??? bCylLowReg : Byte; // IDE low order cylinder value
??? bCylHighReg : Byte; // IDE high order cylinder value
??? bDriveHeadReg : Byte; // IDE drive/head register
??? bCommandReg : Byte; // Actual IDE command.
??? bReserved : Byte; // reserved. Must be zero.
? end;
? IDEREGS = TIDERegs;
? PIDERegs = ^TIDERegs;

? TSendCmdInParams = packed record
??? cBufferSize : DWORD;
??? irDriveRegs : TIDERegs;
??? bDriveNumber : Byte;
??? bReserved : Array[0..2] of Byte;
??? dwReserved : Array[0..3] of DWORD;
??? bBuffer : Array[0..0] of Byte;
? end;
? SENDCMDINPARAMS = TSendCmdInParams;
? PSendCmdInParams = ^TSendCmdInParams;

? TIdSector = packed record
??? wGenConfig : Word;
??? wNumCyls : Word;
??? wReserved : Word;
??? wNumHeads : Word;
??? wBytesPerTrack : Word;
??? wBytesPerSector : Word;
??? wSectorsPerTrack : Word;
??? wVendorUnique : Array[0..2] of Word;
??? sSerialNumber : Array[0..19] of Char;
??? wBufferType : Word;
??? wBufferSize : Word;
??? wECCSize : Word;
??? sFirmwareRev : Array[0..7] of Char;
??? sModelNumber : Array[0..39] of Char;
??? wMoreVendorUnique : Word;
??? wDoubleWordIO : Word;
??? wCapabilities : Word;
??? wReserved1 : Word;
??? wPIOTiming : Word;
??? wDMATiming : Word;
??? wBS : Word;
??? wNumCurrentCyls : Word;
??? wNumCurrentHeads : Word;
??? wNumCurrentSectorsPerTrack : Word;
??? ulCurrentSectorCapacity : ULONG;
??? wMultSectorStuff : Word;
??? ulTotalAddressableSectors : ULONG;
??? wSingleWordDMA : Word;
??? wMultiWordDMA : Word;
??? bReserved : Array[0..127] of Byte;
? end;
? PIdSector = ^TIdSector;

const
? IDE_ID_FUNCTION = $EC;
? IDENTIFY_BUFFER_SIZE = 512;
? DFP_RECEIVE_DRIVE_DATA = $0007c088;
? IOCTL_SCSI_MINIPORT = $0004d008;
? IOCTL_SCSI_MINIPORT_IDENTIFY = $001b0501;
? DataSize = sizeof(TSendCmdInParams)-1+IDENTIFY_BUFFER_SIZE;
? BufferSize = SizeOf(SRB_IO_CONTROL)+DataSize;
? W9xBufferSize = IDENTIFY_BUFFER_SIZE+16;

var
? hDevice : THandle;
? cbBytesReturned : DWORD;
? pInData : PSendCmdInParams;
? pOutData : Pointer; // PSendCmdOutParams
? Buffer : Array[0..BufferSize-1] of Byte;
? srbControl : TSrbIoControl absolute Buffer;

? procedure ChangeByteOrder( var Data; Size : Integer );
? var
??? ptr : PChar;
??? i : Integer;
??? c : Char;
? begin
??? ptr := @Data;
??? for i := 0 to (Size shr 1)-1 do begin
????? c := ptr^;
????? ptr^ := (ptr+1)^;
????? (ptr+1)^ := c;
????? Inc(ptr,2);
???? end;
? end;

begin
? Result := '';
? FillChar(Buffer,BufferSize,#0);
? if Win32Platform=VER_PLATFORM_WIN32_NT then begin // Windows NT, Windows 2000
// Get SCSI port handle
??? hDevice := CreateFile( '//./Scsi0:',GENERIC_READ or GENERIC_WRITE, FILE_SHARE_READ or FILE_SHARE_WRITE,
????????????????????????? nil, OPEN_EXISTING, 0, 0 );
??? if hDevice=INVALID_HANDLE_VALUE then Exit;
??? try
????? srbControl.HeaderLength := SizeOf(SRB_IO_CONTROL);
????? System.Move('SCSIDISK',srbControl.Signature,8);
????? srbControl.Timeout := 2;
????? srbControl.Length := DataSize;
????? srbControl.ControlCode := IOCTL_SCSI_MINIPORT_IDENTIFY;
????? pInData := PSendCmdInParams(PChar(@Buffer) + SizeOf(SRB_IO_CONTROL));
????? pOutData := pInData;
????? with pInData^ do begin
??????? cBufferSize := IDENTIFY_BUFFER_SIZE;
??????? bDriveNumber := 0;
??????? with irDriveRegs do begin
????????? bFeaturesReg := 0;
????????? bSectorCountReg := 1;
????????? bSectorNumberReg := 1;
????????? bCylLowReg := 0;
????????? bCylHighReg := 0;
????????? bDriveHeadReg := $A0;
????????? bCommandReg := IDE_ID_FUNCTION;
??????? end;
????? end;
????? if not DeviceIoControl( hDevice, IOCTL_SCSI_MINIPORT,
????? @Buffer, BufferSize, @Buffer, BufferSize,
????? cbBytesReturned, nil ) then Exit;
??? finally
????? CloseHandle(hDevice);
??? end;
? end else begin // Windows 95 OSR2, Windows 98
??? hDevice := CreateFile( '//./SMARTVSD', 0, 0, nil, CREATE_NEW, 0, 0 );
??? if hDevice=INVALID_HANDLE_VALUE then Exit;
??? try
????? pInData := PSendCmdInParams(@Buffer);
????? pOutData := @pInData^.bBuffer;
????? with pInData^ do begin
??????? cBufferSize := IDENTIFY_BUFFER_SIZE;
??????? bDriveNumber := 0;
??????? with irDriveRegs do begin
????????? bFeaturesReg := 0;
????????? bSectorCountReg := 1;
????????? bSectorNumberReg := 1;
????????? bCylLowReg := 0;
????????? bCylHighReg := 0;
????????? bDriveHeadReg := $A0;
????????? bCommandReg := IDE_ID_FUNCTION;
??????? end;
????? end;
????? if not DeviceIoControl( hDevice, DFP_RECEIVE_DRIVE_DATA,
??????????? pInData, SizeOf(TSendCmdInParams)-1, pOutData,
??????????? W9xBufferSize, cbBytesReturned, nil ) then Exit;
??? finally
????? CloseHandle(hDevice);
??? end;
? end;
? with PIdSector(PChar(pOutData)+16)^ do begin
??? ChangeByteOrder(sSerialNumber,SizeOf(sSerialNumber));
??? SetString(Result,sSerialNumber,SizeOf(sSerialNumber));
? end;
end;

procedure TObjList.Clear;
begin
? inherited;

end;

destructor TObjList.Destroy;
begin

? inherited;
end;

function StrIsEmpty (s: String): Boolean;
begin
? Result := False;
? if s = '' then
??? Result := True;
end;

{procedure StringWrite (f: file; s: String);
begin
end;

procedure StringRead (f: file; s: String);
begin
end;
?}
function SLtrim (s: String): String;
begin
end;

function STrim (s: String): String;
begin
end;

function SAllTrim (s: String): String;
begin
end;

function SRemoveSpace (s: String): String;
var
? I???? : Integer;
? Count : Integer;
begin
? Result:= '';
? Count := length(s);
? for I := 1 to Count do begin
??? if s[I] <> ' ' then begin
????? Result? := Result + s[I];
??? end;
? end;
end;

procedure SSplitString (s: String; s1: String; s2: String);
begin
end;

procedure SSplitString1 (s: String; s1: String; s2: String);
begin
end;

function SIntToStrFix (n: Integer; cnt: Integer): String;
begin
end;

function ARound (v: Double): Double;
begin
? Result := Round(V);
end;

function ARoundN (v: Double; n: Integer): Double;
var
? I?? : Integer;
begin
? result := v;
? for I := 0 to N - 1 do begin
??? Result := Result * 10;
? end;
? Result := Round(Result);
? for I := 0 to N - 1 do begin
??? Result := Result / 10;
? end;
end;

function AEqu (v1: Double; v2: Double): Boolean;
begin
? result := False;
? if v1 = v2 then
??? result := True
end;

function ASmall (v1: Double; v2: Double): Boolean;
begin
? result := False;
? if v1 < v2 then
??? result := True;
end;

function ABig (v1: Double; v2: Double): Boolean;
begin
? result := False;
? if v1 > v2 then
??? result := True;
end;

function AIsZero (v1: Double): Boolean;
begin
? Result := False;
? if V1 = 0 then Result := True;
end;

function AMax(a: Double; b: Double): Double;
begin
? if a >= b then
??? result := a
? else
??? result := b;
end;

function AMin(a: Double; b: Double): Double;
begin
? if a >= b then
??? result := b
? else
??? result := a;
end;

procedure ASwap (p1: Double; p2: Double);
begin

end;

function IMax(a: Integer; b: Integer): Integer;
begin
?if a >= b then
?? result := a
?else
?? result := b;
end;

function IMin(a: Integer; b: Integer): Integer;
begin
?if a >= b then
?? result := b
?else
?? result := a;
end;

procedure ISwap (p1: Integer; p2: Integer);
begin

end;

function RealToStr (v: Double): String;
begin
? result := FloatToStr(v);
end;

function RealToStr1 (v: Double): String;
begin
end;

function StrToReal(s: String): Double;
var
? I : Integer;
? B : Boolean;
begin
? B := True;
? result := 0;
? for I := 1 to length(s) do begin
??? if (ord(s[I]) > 57) or (ord(s[I]) < 48) then begin
????? if ord(s[I]) <> 46 then begin
??????? B := False;
??????? Break;
????? end;
??? end;
? end;

? if B and (Length(s) <> 0) then
??? result := StrToFloat(s)
end;

function RealStr (v: Double): String;
begin
? result := FloatToStr(v);
end;

function FloatToFloat(Const D: Double; Const N: integer): Double;
var
? I?? : integer;
? Max : LongInt;
begin
? Max := 1;
? for I := 1 to N do begin
??? Max := Max * 10;
? end;
? result := D * Max;
? result := Round(result);
? result := result / Max;
end;

function RealStrN (v: Double; dec: Integer): String;
var
? TD : Double;
begin
? TD := FloatToFloat(V, dec);
? result := FloatToStr(TD);
end;

function RealDateN(v: Double): String;
var
? Year, Month, Day : word;
begin
? DecodeDate(v, Year, Month, Day);
? result := IntToStr(year) + '年' + IntToStr(Month) + '月' + IntToStr(Day) + '日';
end;

function IsDate(const str: string): Boolean;
begin
? try
??? StrToDate(str);
? except
??? Result := False;
??? Exit;
? end;
? Result := True;
end;

function GetDate(const str: string): TDateTime;
var
? NewStr: string;
begin
? NewStr := str;
? NewStr := StringReplace(NewStr,'年','-',[]);
? NewStr := StringReplace(NewStr,'月','-',[]);
? NewStr := StringReplace(NewStr,'日','',[]);

? if IsDate(NewStr) then Result := StrToDate(NewStr)
? else Result := SysUtils.Date;
end;

function RealStr1 (v: Double; len: Integer; dec: Integer): String;
begin
?
end;

function RealStr2 (v: Double; len: Integer; dec: Integer): String;
begin
end;

function RealStr3 (v: Double; len: Integer; dec: Integer): String;
begin
end;

function RealStr4 (v: Double; len: Integer; dec: Integer): String;
begin
end;

function StrInt (s: String): Integer;
var
? I : Integer;
? B : Boolean;
begin
? B := True;
? result := 0;
? if s = '' then begin
??? result := 0;
??? Exit;
? end;
? for I := 1 to length(s) do begin
??? if (ord(s[I]) > 57) or (ord(s[I]) < 48) then begin
????? B := False;
????? Break;
??? end;
? end;

? if B and (Length(s) <> 0) then
??? result := StrToInt(s)
end;

procedure WriteXMLValue(XML : IXMLNode; Const mc : string; Var Val: string);
var
? Child_Node : IXMLNode;
begin
? Child_Node := XML.AddChild(mc);
? Child_Node.Text := Val;
end;

procedure ReadXMLValue(XML : IXMLNode; Const mc : string; Var Val: string);
var
? Child_Node : IXMLNode;
begin
? Child_Node := XML.ChildNodes.First;
? if (Child_Node.NodeName = mc) then
??? Val := Child_Node.Text;
end;

procedure ReadFromStream(Stream: TStream; var Bool: Boolean);
begin
? Stream.Read(Bool,SizeOf(Bool));
end;

procedure ReadFromStream(Stream: TStream; var Number: integer);
begin
? Stream.Read(Number,SizeOf(Number));
end;

procedure ReadFromStream (stream: TStream; var Number: Int64); overload;
begin
? Stream.Read(Number,SizeOf(Number));
end;

procedure ReadFromStream(Stream: TStream; var Filestr: string);
var
? Count : integer;
? I : integer;
? S : Char;
begin
? Filestr := '';
? Count := 0;
? ReadFromStream(Stream, Count);
? for I := 1 to Count do begin
??? Stream.Read(S, 1);
??? Filestr:= Filestr + s;
? end;
end;

procedure WriteToStream(Stream: TStream; const Number: integer);
begin
? Stream.Write(Number,SizeOf(Number));
end;

procedure WriteToStream (stream: TStream; const Number: Int64); overload;
begin
? Stream.Write(Number,SizeOf(Number));
end;
file://将filestr 写入流中
procedure WriteToStream(Stream: TStream; const Filestr: string);
var
? Count : integer;
? I : integer;
? S : Char;
begin
? Count:= length(Filestr);
? WriteToStream(Stream,Count);

? for I:= 1 to Count do begin
??? S := FileStr[I];
??? Stream.Write(S, 1);
? end;
end;

procedure WriteToStream (stream: TStream; const Number: Extended); overload;
begin
? Stream.Write(Number,SizeOf(Number));
end;

procedure ReadFromStream (stream: TStream; var v: Extended); overload;
begin
? Stream.Read(v,SizeOf(v));?
end;

procedure WriteToStream(Stream: TStream; const Bool: Boolean);
begin
? Stream.Write(Bool,Sizeof(Bool));
end;

procedure WriteToStream (stream: TStream; const v: Cardinal); overload;
begin
end;

procedure WriteToStream (stream: TStream; const v: Word); overload;
begin
end;

procedure WriteToStream (stream: TStream; const v: Double); overload;
begin
? Stream.Write(V , sizeof(V));
end;


procedure ReadFromStream (stream: TStream; var v: Cardinal); overload;
begin
end;

procedure ReadFromStream (stream: TStream; var v: Word); overload;
begin
end;

procedure ReadFromStream (stream: TStream; var v: Double); overload;
begin
? Stream.Read(V , sizeof(v));
end;

procedure WriteToStream (stream: TStream; const sList: TStringList); overload;
begin
end;

procedure ReadFromStream (stream: TStream; var sList: TStringList); overload;
begin
end;

procedure WriteToStream (stream: TStream; const iary: array of Integer); overload;
begin
end;

procedure ReadFromStream (stream: TStream; var iary: array of Integer); overload;
begin
end;

function StrLike (sou: String; key: String): Boolean;
begin
? result := False;
? if pos(sou, key) > 0 then
??? result := True;
end;

function SRight (s: String; n: Integer): String;
var
? I?? : Integer;
begin
? Result := '';
? for I := 1 to n do begin
??? Result := Result + s[I];
? end;
end;

procedure LoadFileList (Path: String; slist: TStrings; noPath: Boolean);
begin
end;

function TimeTicket: Longint;
begin
? Result := 0;
end;

function MonthOfDate (date: TDateTime): Integer;
begin
? Result := 0;
end;

function DayOfDate (date: TDateTime): Integer;
begin
? Result := 0;
end;

function YearOfDate (date: TDateTime): Integer;
begin
? Result := 0;
end;

function GetSplitWord (s: String; splitc: Char): String;
begin
end;

function HexToInt (s: String): Integer;
begin
? Result := 0;
end;

function TransStrByTable (sou: String; ori: TStringList; des: TStringList): String;
begin
end;

procedure LoadTransTable (fn: String; sou: TStringList; tag: TStringList);
begin
end;

function MakeFilePath (s: String): String;
begin
end;

function RemoveNote (s: String): String;
begin
end;

function MakePath (path: String): String;
begin
end;

function Blone (tj: String; v: String): Boolean;
begin
? Result := False;
end;

function CodeStr (s: String): String;
begin
end;

function DeCodeStr (s: String): String;
begin
end;

function GetValueFromStr (vname: String; s: String; txt: String): Boolean;
begin
? Result := False;
end;

function GetParaList (txt: String; ss: TStringList): Boolean;
begin
? Result := False;
end;

function SReplace (txt: String; sou: String; tag: String): String;
begin
end;


procedure TObjList.LoadFromStream(stream: TStream);
var
? I : integer;
? tmpCount : integer;
? tmp: TObject;?
begin
? ReadFromStream(Stream, tmpCount);
? for I:= 0 to tmpCount - 1 do begin
??? Stream.Read(tmp, SizeOf(tmp));
??? Add(tmp);
? end;
end;

procedure TObjList.SaveToStream(stream: TStream);
var
? I : integer;
? tmp: TObject;
begin
? WriteToStream(Stream, Count);
? for I:= 0 to Count - 1 do begin
??? tmp := Items[I];
??? Stream.Write(tmp, Sizeof(tmp));
? end;
end;

end.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值