返回
{***************************************************************}
{***               FVision Unit Version1.0                   ***}
{***                    蓝蚂蚁工作室                         ***}
{***************************************************************}
{***                      工具单元                           ***}
{***************************************************************}
{$O+,F+,X+,I-}
Unit FTool;
Interface
Uses Dos,Crt;

Type
  St5=string[5];

Function  FName(S:PathStr):PathStr;
Function  FPath(S:PathStr):PathStr;
Function  ExePath: PathStr;
Function  ExeName: NameStr;
Function  Ch_Name(S:PathStr;E:ExtStr):PathStr;
Procedure ChangePath(PathName:PathStr);
Procedure ClearKbBuf;
Function  Int_Str(Int:LongInt;Size:Integer):string;
Function  IntStr(Int:LongInt):string;
Function  StrsInt(S:string):LongInt;
Function  ReaStr(Rea:Real;Wei:Integer):string;
Function  StrReal(S:string):Real;
Function  Hexs(N:Byte):St5;
Function  HexStr(Number: Word): ST5;
Function  StrHex(S:string):LongInt;
Function  GetLength(S:string):Integer;
Function  PosIn(PosX,PosY,X1,Y1,X2,Y2:Integer):Boolean;
Function  UpCases(S:string):string;
Function  UpCaseStr(var S:string):string;
Function  Exist_Fi(FullFileName:string):Boolean;
Procedure ReNameFile(Name,NewName:PathStr);
Procedure DeleteFile(Name:PathStr);
Procedure SetKbRate(Rate,Delay:Byte);
Function  InsSpace(var S:string;Len:Byte):string;
Function  InsNull(var S:string;Len:Byte):string;
Function  InsSpaceFront(var S:string;Len:Byte):string;
Function  DelSpace(var S:string):string;
Function  DelNull(var S:string):string;
Function  DelSpaceTail(var S:string):string;
Function  GetBuMa(Yu:Integer):Integer;
Function  IsImdNum(S:string):Boolean;
Function  Max(X,Y:Longint):Longint;
Function  Min(X,Y:Longint):Longint;
Procedure SwapInt(var X:Integer;var Y:Integer);
Implementation

Const
  Hex : array[0..15] of Char =
   ('0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F');

Function FName(S:PathStr): PathStr;
var
  Dir: DirStr;
  Name: NameStr;
  Ext: ExtStr;
begin
  FSplit(S, Dir, Name, Ext);
  FName := Name + Ext;
end;

Function FPath(S:PathStr): PathStr;
var
  Dir: DirStr;
  Name: NameStr;
  Ext: ExtStr;
begin
  FSplit(S, Dir, Name, Ext);
  if Dir[Length(Dir)] <> '\' then Dir:=Dir+'\';
  FPath := Dir;
end;

Function ExePath: PathStr;
var
  EXEName: PathStr;
  Dir: DirStr;
  Name: NameStr;
  Ext: ExtStr;
begin
  if Lo(DosVersion) >= 3 then EXEName := ParamStr(0);
  FSplit(EXEName, Dir, Name, Ext);
  if Dir[Length(Dir)] <> '\' then Dir:=Dir+'\';
  ExePath := Dir;
end;

Function ExeName: NameStr;
var
  EXEName: PathStr;
  Dir: DirStr;
  Name: NameStr;
  Ext: ExtStr;
begin
  if Lo(DosVersion) >= 3 then EXEName := ParamStr(0);
  FSplit(EXEName, Dir, Name, Ext);
  ExeName := Name;
end;

Function Ch_Name(S:PathStr;E:ExtStr): PathStr;
var
  Dir: DirStr;
  Name: NameStr;
  Ext: ExtStr;
begin
  FSplit(S, Dir, Name, Ext);
  Ch_Name:=Dir+Name+'.'+E;
end;

Procedure ChangePath(PathName:PathStr);
var
  D: DirStr;
  N: NameStr;
  E: ExtStr;
begin
  PathName := FExpand(PathName);
  FSplit(PathName, D, N, E);
  if D[Length(D)]='\' then Dec(D[0]);
  Chdir(D);
end;

Procedure  ClearKbBuf;
begin
  while KeyPressed do Readkey;
end;

Function  Int_Str(Int:LongInt;Size:Integer):string;
var
  Cha:LongInt;
  StrI:string;
  Fu:Boolean;
begin
  StrI:='';
  Fu:=False;
  if Int<0 then
  begin
    Int:=(-Int);
    Fu:=True;
  end;
  while Int>9 do
  begin
    Cha:=Int mod 10;
    StrI:=Chr(Cha+Ord('0'))+StrI;
    Int:=Int div 10;
  end;
  StrI:=Chr(Int+Ord('0'))+StrI;
  while (Byte(StrI[0])<Size) do
    StrI:='0'+StrI;
  if Fu then StrI:='-'+StrI;
  Int_Str:=StrI;
end;

Function  IntStr(Int:LongInt):string;
var
  Cha:LongInt;
  StrI:string;
  Fu:Boolean;
begin
  StrI:='';
  Fu:=False;
  if Int<0 then
  begin
    Int:=(-Int);
    Fu:=True;
  end;
  while Int>9 do
  begin
    Cha:=Int mod 10;
    StrI:=Chr(Cha+Ord('0'))+StrI;
    Int:=Int div 10;
  end;
  StrI:=Chr(Int+Ord('0'))+StrI;
  if Fu then StrI:='-'+StrI;
  IntStr:=StrI;
end;

Function  UpCases(S:string):string;
var
  i:Byte;Ss:string;
begin
  Ss:='';
  for i:=1 to Length(S) do
  Ss:=Ss+UpCase(S[i]);
  UpCases:=Ss;
end;

Function UpCaseStr(var S:string):string;
var
  i:Byte;
begin
  for i:=1 to Length(S) do
  S[i]:=UpCase(S[i]);
  UpCaseStr:=S;
end;

Function StrsInt(S:string):LongInt;
var
  i,Wei:Integer;
  Int:LongInt;
  HexFlag,MinusFlag:Boolean;
begin
  Int:=0;
  HexFlag:=False;
  MinusFlag:=False;
  UpCaseStr(S);
  if S[1]='-' then MinusFlag:=True;
  if S[Length(S)]='H' then HexFlag:=True;
  if HexFlag then Wei:=16 else Wei:=10;
  for i:=1 to Byte(S[0]) do
  if S[i] in ['0'..'9'] then
    Int:=Int*Wei+Ord(S[i])-Ord('0')
  else if (S[i] in ['A'..'F']) and HexFlag then
         Int:=Int*Wei+Ord(S[i])-Ord('A')+10;
  if MinusFlag then Int:=-Int;
  StrsInt:=Int;
end;

Function  ReaStr(Rea:Real;Wei:Integer):string;
var
  St1,St2:string;
begin
  St1:=IntStr(Trunc(Rea));
  St2:=IntStr(Trunc((Rea-Trunc(Rea))*Wei));
  ReaStr:=St1+'.'+St2;
end;

Function StrReal(S:string):Real;
var
  Temp:Real;
  Code:Integer;
begin
  Val(S,Temp,Code);
  StrReal:=Temp;
end;

Function HexStr(Number: Word): ST5;
    Function Hex_Char(Number: Word): Char;
    Begin
      If Number<10 then
        Hex_Char:=Char(Number+48)
      else
        Hex_Char:=Char(Number+55);
    end; { Function Hex_Char }

Var
  S: ST5;
Begin
    S:='';
    S:=Hex_Char( (Number shr 1) div 2048);
    Number:=( ((Number shr 1) mod 2048) shl 1)+
            (Number and 1) ;
    S:=S+Hex_Char(Number div 256);
    Number:=Number mod 256;
    S:=S+Hex_Char(Number div 16);
    Number:=Number mod 16;
    S:=S+Hex_Char(Number);
    HexStr:=S+'H';
end; { Function Hex_string }

Function  StrHex(S:string):LongInt;
var
  i,j:Byte;
  He:LongInt;
begin
  if UpCase(S[Length(S)])<>'H' then
  begin
    StrHex:=StrsInt(S);
    Exit;
  end;
  He:=0;
  for j:=1 to Length(S)-1 do
  for i:=0 to 15 do
  if UpCase(S[j])=Hex[i] then He:=He shl 4 + i;
  StrHex:=He;
end;

Function GetLength(S:string):Integer;
var
  Len,i:Integer;
begin
  Len:=0;
  for i:=1 to Length(S) do
  if S[i]<>'~' then Inc(Len);
  GetLength:=Len;
end;

Function PosIn(Posx,Posy,x1,y1,x2,y2:Integer):Boolean;
begin
  PosIn:=False;
  if (Posx>=x1)and(Posx<=x2)and(Posy>=y1)and(Posy<=y2) then PosIn:=True;
end;

Function Exist_Fi(FullFileName:string):Boolean;
var
  FileInfor:SearchRec;
  Attr:Byte;
begin
  Attr:=ReadOnly+Hidden+SysFile+Archive;
  FindFirst(FullFileName,Attr,FileInfor);
  Exist_Fi:=DosError=0;
end;

Procedure ReNameFile(Name,NewName:PathStr);
var
  F:file;
begin
  if not Exist_Fi(Name) then Exit;
  if Exist_Fi(NewName) then
  begin
    Assign(F,NewName);
    Erase(F);
  end;
  Assign(F,Name);
  ReName(F,NewName);
end;

Procedure DeleteFile(Name:PathStr);
var
  F:file;
begin
  if Exist_Fi(Name) then
  begin
    Assign(F,Name);
    Erase(F);
  end;
end;

Procedure SetKbRate(Rate,Delay:Byte);
var
  R:Registers;
begin
  R.ax:=$0305;
  R.bh:=rate;
  R.bl:=delay;
  Intr($16,R);
end;

Function Hexs(N:Byte):St5;
begin
  Hexs:=Hex[N div 16]+Hex[N mod 16];
end;

Function InsSpace(var S:string;Len:Byte):string;
var
  i:Integer;
begin
  for i:=Length(S)+1 to Len do
  S:=S+' ';
  InsSpace:=S;
end;

Function InsNull(var S:string;Len:Byte):string;
var
  i:Integer;
begin
  for i:=Length(S)+1 to Len do
  S:=S+#0;
  InsNull:=S;
end;

Function InsSpaceFront(var S:string;Len:Byte):string;
var
  i:Integer;
begin
  for i:=Length(S)+1 to Len do
  S:=' '+S;
  InsSpaceFront:=S;
end;

Function DelSpace(var S:string):string;
var
  i:Integer;
begin
  i:=0;
  while (i<Length(S))and(S[i+1]=' ') do Inc(i);
  Delete(S,1,i);
  i:=Length(S)+1;
  while (i>1)and(S[i-1]=' ') do Dec(i);
  Delete(S,i,Length(S)-i+1);
  DelSpace:=S;
end;

Function DelNull(var S:string):string;
var
  Temp:Integer;
begin
  Temp:=Pos(#0,S);
  if Temp<>0 then Delete(S,Temp,Length(S)-Temp+1);
  DelNull:=S;
end;

Function DelSpaceTail(var S:string):string;
var
  i:Integer;
begin
  i:=Length(S)+1;
  while (i>1)and(S[i-1]=' ') do Dec(i);
  Delete(S,i,Length(S)-i+1);
  DelSpaceTail:=S;
end;

Function GetBuMa(Yu:Integer):Integer;
begin
  Yu:=Yu mod 256;
  if Yu>=0 then
    GetBuMa:=Yu
  else
    GetBuMa:=Yu+256;
end;

Function IsImdNum(S:string):Boolean;
var
  i:Integer;
begin
  IsImdNum:=True;
  if S='' then Exit;
  if not (S[1] in ['0'..'9']) then
  begin
    IsImdNum:=False;
    Exit;
  end;
  for i:=1 to Length(S)-1 do
  if not (S[i] in ['0'..'9','a'..'f','A'..'F']) then
  begin
    IsImdNum:=False;
    Exit;
  end;
  if Length(S)>1 then
  if not (S[Length(S)] in ['0'..'9','a'..'f','A'..'F','h','H']) then
  begin
    IsImdNum:=False;
    Exit;
  end;
end;

Function Max(X,Y:Longint):Longint;
begin
  if X>Y then
    Max:=X
  else
    Max:=Y;
end;

Function Min(X,Y:Longint):Longint;
begin
  if X<Y then
    Min:=X
  else
    Min:=Y;
end;

Procedure SwapInt(var X:Integer;var Y:Integer);
var
  Temp:Integer;
begin
  Temp:=X;
  X:=Y;
  Y:=Temp;
end;

end.