当前位置:   article > 正文

Delphi常用函数总结_delphi trim

delphi trim

 1、提取字符串中子字符串

  1. function RightStr
  2. (Const Str: String; Size: Word): String;
  3. begin
  4. if Size > Length(Str) then Size := Length(Str) ;
  5. RightStr := Copy(Str, Length(Str)-Size+1, Size)
  6. end;
  7. // --------------------------------------
  8. function MidStr
  9. (Const Str: String; From, Size: Word): String;
  10. begin
  11. MidStr := Copy(Str, From, Size)
  12. end;
  13. // --------------------------------------
  14. function LeftStr
  15. (Const Str: String; Size: Word): String;
  16. begin
  17. LeftStr := Copy(Str, 1, Size)
  18. end;
  19. // --------------------------------------------------
  20. function BetweenString(SrcStr: string; Str1, Str2: string): string;
  21. var
  22.   Pos1, Pos2: Integer;
  23.   TempStr: string;
  24. begin
  25.   Pos1 := Pos(Str1, SrcStr);
  26.   TempStr := Copy(SrcStr, Pos1 + Length(Str1), Length(SrcStr) - Length(Str1));
  27.   Pos2 := Pos(Str2, TempStr);
  28.   Result := Copy(TempStr, 1, Pos2 - 1);
  29. end;

-------------------------------------------------------------

if not TryStrToFloat(Trim(self.CbbCostMultiple.Text), fCostMultiple)then
  begin
    ShowInfoMsg('计费倍率填写有误!');
    exit;
  end; 

TryStrToFloat:判断转换类型同时进行变量赋值

------------------------------------------------------------------

Delphi 时间的比较 

时间比较函数
CompareDateTime() //比较两个时间是否相同(只比较日期部分,不比较年份部份,比较两个日期时间直接可以直接比较A日期<B日期)
CompareDate() //比较两个时间的日期是否相同
CompareTime() //比较两个时间的时分秒是否相同
SameDateTime() //比较两个时间是否相同
SameDate() //比较两个时间的日期部分是否相同
SameTime() //比较两个时间的时分秒是否相同

前3个函数 的返回值是-1,0,1

前者 < 后者 返回 -1

前者 = 后者 返回 0

前者 > 后者 返回 1

后3个函数的返回值是True,False
 

  1. program Project1;
  2. {$APPTYPE CONSOLE}
  3. uses
  4. SysUtils,DateUtils;
  5. var
  6. date1,date2:TDateTime;
  7. r1,r2,r3:Integer;
  8. b1,b2,b3:Boolean;
  9. begin
  10. date1:= StrToDateTime('2019-08-08 10:01:00');
  11. date2:= StrToDateTime('2019-08-08 10:00:00');
  12. r1:=compareDatetime(date1,date2);//1
  13. r2:=CompareDate(date1,date2); //0
  14. r3:=CompareTime(date1,date2); //1
  15. b1:=SameDateTime(date1,date2);//FALSE
  16. b2:=SameDate(date1,date2);//TRUE
  17. b3:=SameTime(date1,date2);//FALSE
  18. date1:= StrToDateTime('2019-08-08 10:01:00');
  19. date2:= StrToDateTime('2019-08-08 10:02:00');
  20. r1:=compareDatetime(date1,date2);//-1
  21. r2:=CompareDate(date1,date2); //0
  22. r3:=CompareTime(date1,date2); //-1
  23. b1:=SameDateTime(date1,date2);//FALSE
  24. b2:=SameDate(date1,date2);//TRUE
  25. b3:=SameTime(date1,date2);//FALSE
  26. date1:= StrToDateTime('2019-09-08 10:01:00');
  27. date2:= StrToDateTime('2019-08-08 10:01:00');
  28. r1:=compareDatetime(date1,date2);//1
  29. r2:=CompareDate(date1,date2); //1
  30. r3:=CompareTime(date1,date2); //0
  31. b1:=SameDateTime(date1,date2);//FALSE
  32. b2:=SameDate(date1,date2);//FALSE
  33. b3:=SameTime(date1,date2);//TRUE
  34. end.

----------------------------------------------------------------------------------- 

delphi函数trim()与trunc()区别:一个对字符串操作一个对数字操作

  1. procedure TForm1.FormCreate(Sender: TObject);
  2. var
  3. f : double;
  4. begin
  5. f := 1.50;
  6. showmessage(IntToStr(Trunc(f))); // 1 截取
  7. showmessage(IntToStr(Round(f))); // 2 四舍五入
  8. showmessage(IntToStr(Ceil(f))); // 2 向上取整
  9. showmessage(IntToStr(floor(f))); // 1 向下取整
  10. f := 1.40;
  11. showmessage(IntToStr(Trunc(f))); // 1 截取
  12. showmessage(IntToStr(Round(f))); // 1 四舍五入
  13. showmessage(IntToStr(Ceil(f))); // 2 向上取整
  14. showmessage(IntToStr(floor(f))); // 1 向下取整
  15. f := -1.50;
  16. showmessage(IntToStr(Trunc(f))); // -1 截取
  17. showmessage(IntToStr(Round(f))); // -2 四舍五入
  18. showmessage(IntToStr(Ceil(f))); // -1 向上取整
  19. showmessage(IntToStr(floor(f))); // -2 向下取整
  20. f := -1.40;
  21. showmessage(IntToStr(Trunc(f))); // -1 截取
  22. showmessage(IntToStr(Round(f))); // -1 四舍五入
  23. showmessage(IntToStr(Ceil(f))); // -1 向上取整
  24. showmessage(IntToStr(floor(f))); // -2 向下取整
  25. // showmessage(IntToStr(Integer(f))); //不能这样 Error
  26. // 截取就是你能看到的整数是多少就是多少
  27. // 四舍五入, 这个不用多说了
  28. // 向上取整, 比这个值大的 最小整数
  29. // 向下取整, 比这个值小的 最大整数
  30. end;

========================================================= 

string字符串转换Byte[]字节数组

  1. procedure TForm1.Button1Click(Sender: TObject);
  2. var
  3.   s:string;
  4.   P:PChar;
  5.   B:array of Byte;
  6. begin
  7.   s:='Hello';
  8.   SetLength(B,Length(S)+1);
  9.   P:=PChar(S);
  10.   CopyMemory(B,p,Length(S)+1);
  11.   Showmessage(Char(B[0]));
  12. end;
  13. procedure TForm1.Button1Click(Sender: TObject);
  14. var
  15.   s:string;
  16.   ab:array of byte;
  17.   i:integer;
  18. begin
  19.   s:='this is a test';
  20.   SetLength(ab,Length(s));
  21.   for i:=1 to length(s) do
  22.     ab[i]:=byte(s[i]);
  23. end;
  24.  b: array[1..7] of byte;
  25.  s: string
  26.   SetLength(s, 7);
  27.   Move(b[1],s[1], 7 );

===================================================

Delphi Val函数

在这里Val和iif都是你所用的数据库中的函数
在delphi中Val是一个将字符串转换为数字的函数,
Val(S; var V; var Code: Integer)第一个参数是要转换的字符串,第二个参数存放转换后的数字,可以是整数或浮点数,第三个参数存放出错的字符索引值,例如:
Var 
  V, Code: Integer;
begin
  Val('123.445',V,Code);
end;

转换后: V = 123, Code = 4,表示字符串'123.445'转换为整数是123,在字符串第4位转换出错

=============================================

有用的小函数IIF

某些情况下直接使用IIF可以使程序变得更加简洁,Delphi没有现成的,写一个也很简单:

function iif(Condition: Boolean; TrueReturn, FalseReturn: Variant): Variant;
begin
  if Condition then
    Result := TrueReturn
  else
    Result := FalseReturn;
end;
=====================================================
判断字符串里是否包含有某个文本
StrUtils. AnsiContainsText

 =====================================================

搜索文件返回搜索结果

  1. procedure TGlobal.MakeFileList(Path, FileExt: string;out LFileList :TStringList);
  2. var
  3. sch: TSearchrec;
  4. begin
  5. {确认路径为文件夹}
  6. if(rightStr(trim(Path),1)<>'\')then
  7. Path := trim(Path) + '\'
  8. else
  9. Path := trim(Path);
  10. {确认路径正确}
  11. if not DirectoryExists(Path) then exit;
  12. if FindFirst(Path + '*', faAnyfile, sch) = 0 then
  13. begin
  14. repeat
  15. Application.ProcessMessages;
  16. if ((sch.Name = '.') or (sch.Name = '..')) then
  17. Continue;
  18. if DirectoryExists(Path + sch.Name) then
  19. begin
  20. MakeFileList(Path + sch.Name, FileExt, LFileList);
  21. // LFileList.AddStrings(LFileList); // ccm 20220901改,解决Out of Memory
  22. end
  23. else
  24. begin
  25. // if(UpperCase(extractfileext(Path + sch.Name)) = UpperCase(FileExt)) or (FileExt = '.*') then
  26. if(UpperCase(extractfileext(Path + sch.Name)) = UpperCase(FileExt)) then // ccm 20220901改,解决Out of Memory
  27. LFileList.Add(Path + sch.Name);
  28. end;
  29. until FindNext(sch) <> 0;
  30. SysUtils.FindClose(sch);
  31. end;
  32. end;

================================

获取程序的名称

ChangeFileExt(ExtractFileName(Application.ExeName), '')

================================

PAnsiChar转String

  1. var
  2.   aRecvByteArr: array of Byte;
  3.     MyStream  :TMemoryStream;
  4.     pCommType :TCommType;//读命令为优先级显示至主窗口
  5.     rstr      :String;
  6.     tpDevice  :pEnMeter;
  7.     strIDNum  :string;
  8.     temprstr  :string;
  9. begin
  10.     rstr := '';
  11.     SetLength(aRecvByteArr, pvReqeust.RecvBufferLen);
  12.     Move(pvReqeust.RecvBuffer^, aRecvByteArr[0], pvReqeust.RecvBufferLen);
  13.     SetLength(rstr, pvReqeust.RecvBufferLen);
  14.     CopyMemory(PAnsiChar(rstr), @aRecvByteArr[0], pvReqeust.RecvBufferLen);
  15.     rstr := StrToHexStr(rstr);

============================================================

字符串转16进制字符串 

function StrToHexStr(const S:string):string;
//字符串转换成16进制字符串
var
    I               :integer;
begin
    result:='';
    for I:=1 to Length(S) do result:=result+IntToHex(Ord(S[I]),2);
end;

==================================================================

字节转AnsiString 

var
  aRecvByteArr:array of Byte;
  s:AnsiString;
  i:Integer;
begin
    SetLength(aRecvByteArr,pvReqeust.RecvBufferLen);
    Move(pvReqeust.RecvBuffer,aRecvByteArr[0],pvReqeust.RecvBufferLen);
    for i := 0 to pvReqeust.RecvBufferLen do
      begin
        s := s+ IntToHex(aRecvByteArr[i],2);
      end;

===================================================

金额大写

  1. function Tform1.SmallTOBig(small:real):string;
  2. var SmallMonth,BigMonth:string;
  3. wei1,qianwei1:string[2];
  4. wei,qianwei,dianweizhi,qian:integer;
  5. IsNeg: Boolean;
  6. begin
  7. {------- 修改参数令值更精确 -------}
  8. {小数点后的位数,需要的话也可以改动该值}
  9. qianwei:=-2;
  10. {转换成货币形式,需要的话小数点后加多几个零}
  11. Smallmonth:=formatfloat('0.00',small);
  12. {---------------------------------}
  13. // 处理负数,正数不用这段代码
  14. if Pos('-',Smallmonth) > 0 then
  15. begin
  16. IsNeg := True;
  17. Smallmonth := StringReplace(Smallmonth,'-','',[]);
  18. end;
  19. dianweizhi :=pos('.',Smallmonth);{小数点的位置}
  20. {循环小写货币的每一位,从小写的右边位置到左边}
  21. for qian:=length(Smallmonth) downto 1 do
  22. begin
  23. {如果读到的不是小数点就继续}
  24. if qian<>dianweizhi then
  25. begin
  26. {位置上的数转换成大写}
  27. case strtoint(copy(Smallmonth,qian,1)) of
  28. 1:wei1:='壹'; 2:wei1:='贰';
  29. 3:wei1:='叁'; 4:wei1:='肆';
  30. 5:wei1:='伍'; 6:wei1:='陆';
  31. 7:wei1:='柒'; 8:wei1:='捌';
  32. 9:wei1:='玖'; 0:wei1:='零';
  33. end;
  34. {判断大写位置,可以继续增大到real类型的最大值,可是谁有那么多钱}
  35. case qianwei of
  36. -3:qianwei1:='厘';
  37. -2:qianwei1:='分';
  38. -1:qianwei1:='角';
  39. 0 :qianwei1:='元';
  40. 1 :qianwei1:='拾';
  41. 2 :qianwei1:='佰';
  42. 3 :qianwei1:='千';
  43. 4 :qianwei1:='万';
  44. 5 :qianwei1:='拾';
  45. 6 :qianwei1:='佰';
  46. 7 :qianwei1:='千';
  47. 8 :qianwei1:='亿';
  48. 9 :qianwei1:='十';
  49. 10:qianwei1:='佰';
  50. 11:qianwei1:='千';
  51. end;
  52. inc(qianwei);
  53. BigMonth :=wei1+qianwei1+BigMonth;{组合成大写金额}
  54. end;
  55. end;
  56. BigMonth := StringReplace(BigMonth, '零仟', '零',[rfReplaceAll]);
  57. BigMonth := StringReplace(BigMonth, '零佰', '零',[rfReplaceAll]);
  58. BigMonth := StringReplace(BigMonth, '零拾', '零',[rfReplaceAll]);
  59. BigMonth := StringReplace(BigMonth, '零角', '零',[rfReplaceAll]);
  60. BigMonth := StringReplace(BigMonth, '零零', '零',[rfReplaceAll]);
  61. BigMonth := StringReplace(BigMonth, '零零', '零',[rfReplaceAll]);
  62. BigMonth := StringReplace(BigMonth, '零零', '零',[rfReplaceAll]);
  63. BigMonth := StringReplace(BigMonth, '零亿', '亿',[rfReplaceAll]);
  64. BigMonth := StringReplace(BigMonth, '零万', '万',[rfReplaceAll]);
  65. BigMonth := StringReplace(BigMonth, '零分', '整',[rfReplaceAll]);
  66. BigMonth := StringReplace(BigMonth, '零元', '元',[rfReplaceAll]);
  67. if BigMonth = '整' then
  68. Result := '零元整'
  69. else
  70. begin
  71. BigMonth := StringReplace(BigMonth, '亿万', '亿零',[rfReplaceAll]);
  72. BigMonth := StringReplace(BigMonth, '零元', '元',[rfReplaceAll]);
  73. end;
  74. SmallTOBig:=BigMonth;
  75. if IsNeg then
  76. SmallTOBig:='负' + BigMonth;
  77. end;
  1. function MoneySpeechC(Money: Currency): string; //数字转换为中文大写
  2. var
  3. temp: string;
  4. resu: string;
  5. i, j: integer;
  6. len: integer;
  7. Num: array[0..9] of string;
  8. A: array[0..13] of string;
  9. begin
  10. Num[0] := '零';
  11. Num[1] := '壹';
  12. Num[2] := '贰';
  13. Num[3] := '叁';
  14. Num[4] := '肆';
  15. Num[5] := '伍';
  16. Num[6] := '陆';
  17. Num[7] := '柒';
  18. Num[8] := '捌';
  19. Num[9] := '玖';
  20. A[0] := '分';
  21. A[1] := '角';
  22. A[2] := '元';
  23. A[3] := '拾';
  24. A[4] := '佰';
  25. A[5] := '仟';
  26. A[6] := '万';
  27. A[7] := '拾';
  28. A[8] := '佰';
  29. A[9] := '仟';
  30. A[10] := '亿';
  31. A[11] := '拾';
  32. A[12] := '佰';
  33. A[13] := '仟';
  34. temp := trim(inttostr(round(Money * 100)));
  35. len := length(temp);
  36. resu := '';
  37. if (len > 13) or (len = 0) then
  38. begin
  39. exit;
  40. end;
  41. for i := 1 to len do
  42. begin
  43. j := strtoint(copy(temp, i, 1));
  44. resu := resu + Num[j] + A[len - i];
  45. end;
  46. len := length(resu);
  47. result := copy(resu, 0, len - 8);
  48. end;

查找进程

  1. function FindProcess(AFileName: string): boolean;
  2. var
  3. hSnapshot: THandle; //用于获得进程列表
  4. lppe: TProcessEntry32; //用于查找进程
  5. Found: Boolean; //用于判断进程遍历是否完成
  6. begin
  7. Result := False;
  8. hSnapshot := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0); //获得系统进程列表
  9. lppe.dwSize := SizeOf(TProcessEntry32); //在调用Process32First API之前,需要初始化lppe记录的大小
  10. Found := Process32First(hSnapshot, lppe); //将进程列表的第一个进程信息读入ppe记录中
  11. while Found do
  12. begin
  13. if ((UpperCase(ExtractFileName(lppe.szExeFile)) = UpperCase(AFileName)) or (UpperCase(lppe.szExeFile) = UpperCase(AFileName))) then
  14. begin
  15. Result := True;
  16. end;
  17. Found := Process32Next(hSnapshot, lppe); //将进程列表的下一个进程信息读入lppe记录中
  18. end;
  19. end;

==============================================

CheckSum函数

  1. function TForm1.GetBCDStr(tstr: string): string;
  2. var
  3.   j: integer;
  4. begin
  5.   result := '';
  6.   j := length(tstr);
  7.   while j > 0 do
  8.   begin
  9.     result := result + copy(tstr, j - 1, 2);
  10.     j := j - 2;
  11.   end;
  12. end;
  13. function TForm1.GetCheckSum(SourceStr: string): string;
  14. begin
  15.   SourceStr := copy(SourceStr, 1, length(SourceStr) - 4);
  16.   result := self.GetBCDStr(self.GetCRC16Data(SourceStr));
  17.   result := SourceStr + result;
  18. end;
  19. function TForm1.GetCRC16Data(SourceStr: string): string;
  20. const
  21.   GENP = $A001;  //多项式公式X16+X15+X2+1(1100 0000 0000 0101)
  22. var
  23.   Data: array[0..255] of Byte;
  24.   i, j, Count: Integer;
  25.   Res: Word;
  26.   szData: string;
  27.   crc: Word;
  28.   tmp: Byte;
  29.   procedure CalOneByte(AByte: Byte);//计算1个字节的校验码
  30.   var
  31.     j: Integer;
  32.   begin
  33.     crc := crc xor AByte;   //将数据与CRC寄存器的低8位进行异或
  34.     for j := 0 to 7 do      //对每一位进行校验
  35.     begin
  36.       tmp := crc and 1;        //取出最低位
  37.       crc := crc shr 1;        //寄存器向右移一位
  38.       crc := crc and $7FFF;    //将最高位置0
  39.       if tmp = 1 then         //检测移出的位,如果为1,那么与多项式异或
  40.         crc := crc xor GENP;
  41.       crc := crc and $FFFF;
  42.     end;
  43.   end;
  44.   function CalCRC16(AData: array of Byte; AStart, AEnd: Integer): Word;
  45.   var
  46.     i: Integer;
  47.   begin
  48.     crc := $FFFF;             //将余数设定为FFFF
  49.     for i := AStart to AEnd do   //对每一个字节进行校验
  50.       CalOneByte(AData[i]);
  51.     Result := crc;
  52.   end;
  53. begin
  54.   szData := SourceStr;    //读入欲校验的字符串
  55.   Count := length(SourceStr) div 2; //读入需要计算的字符串长度
  56.   if not (Count mod 2) = 0 then
  57.     exit; //确保有效字节
  58.   i := 1;
  59.   j := 0;
  60.   for j := 0 to Count - 1 do
  61.   begin
  62.     if (i mod 2) = 0 then    //每2个字符放入一个字节中
  63.       i := i + 1;
  64.     if i >= Length(szData) then
  65.       exit;
  66.     Data[j] := StrToInt('$' + copy(szData, i, 2)); //取出字符并转换为16进制数
  67.     i := i + 1;
  68.   end;
  69.   Res := CalCRC16(Data, Low(Data), Count - 1);
  70.   result := IntToHex(Res, 4);
  71. end;

=================================================

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家自动化/article/detail/234327
推荐阅读
相关标签
  

闽ICP备14008679号