2016/6/30 10:12:06 delphi7 tips

2016/7/4 0:41:58  倒叙
  1. for i:=7 downto 1do
    ....

     

2016/7/3 22:24:27 for in do
for betStart:=1 to 7 do
    ShowMessage(IntToStr(betStart));

 

2016/7/3 19:38:17 Howto convert a float or double to string in delphi
Symptom:
2.You need to convert a float or double to a string in pascal 
3.
4.Cause:
5.none 
6.
7.Solution:
8.You can use the FunctionFloatToStr wich takes a float parameter.You can use the DoubleToStrfor converting a double.
9.
10.Here a little example:
11.
12.procedure TForm1.Button1Click(Sender:TObject);
13.var s : string;
14.var mydoubleD : double;
15.begin
16. mydoubleD :=3.14152341234234;
17. s :=FloatToStr( mydoubleD );
18.
19.//you could as well use s in the ShowMessage:-)
20.ShowMessage('Your Double is: '+FloatToStr(mydoubleD));
21.end;
22.
23.
24.Disclaimer:
25.The information provided in this document is intended for your information only.Lubby makes no claims to the validity of this information.Use of this information is at own risk!

 

2016/7/2 18:42:40 怎么使用 HMAC Sha256 算法
  1. https://github.com/fundamentalslib/fundamentals5
    下载最新的package,然后找到Source\Utils\flchash.pas 文件,以及Source\flcinclude.inc 复制到安装目录的import下面

     

    一个简单的例子
    unit Unit1;
    interface
    uses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, flchash, FlatUtils, FlatCtrls, StdCtrls;
    type
      TForm1 = class(TForm)
        FlatButton1: TFlatButton;
        FlatMemo1: TFlatMemo;
        FlatEdit1: TFlatEdit;
        FlatEdit2: TFlatEdit;
        procedure FlatButton1Click(Sender: TObject);
      private
        { Private declarations }
      public
        { Public declarations }
      end;
    var
      Form1: TForm1;
    implementation
    {$R *.dfm}
    procedure TForm1.FlatButton1Click(Sender: TObject);
    begin
      flatMemo1.Text := SHA512DigestToHexA(CalcHMAC_SHA512(flatEdit1.Text, flatEdit2.Text));
    end;
    end.

     

 
2016/7/2 13:14:51 判断是否为数字,是则返回数字,否则返回0 
比如我要判断一个文本框里输入的字符串能不能转换为integer类型,如果能,则返回转换后的整型数据,如果不能,则返回整数0,那么我就可以用strtointdef这个函数.
写法如下:
假设edit1.text:='1000';
则strtointdef(edit1.text,0)返回值为1000.
如果edit1.text:='fdafds',则返回值为0.
(如果你用strtoint(edit1.text)当edit1.text:='fdads'时会报错的)我们可以用strtointdef这个函数来判断一个文本框输入的是否是整数.

 

2016/7/2 12:25:50 提取字符串里面的数字
 
{ List Numberic  }
type
    TCharSet = set of Char;
function StripNonConforming(const S: string;const ValidChars: TCharSet): string;
var
    DestI: Integer;
    SourceI: Integer;
begin
    SetLength(Result, Length(S));
    DestI := 0;
    for SourceI := 1 to Length(S) do
        if S[SourceI] in ValidChars then
        begin
            Inc(DestI);
            Result[DestI] := S[SourceI]
        end;
    SetLength(Result, DestI)
end;
function StripNonNumeric(const S: string): string;
begin
    Result := StripNonConforming(S, ['0'..'9'])
end;

 

2016/7/2 1:28:25 表格自动列宽
 
function DBGridAutoSize(mDBGrid: TDBGrid; mOffset: Integer = 15): Boolean;
 var
   I: Integer;
 begin
   Result := False;
   if not Assigned(mDBGrid) then
     Exit;
   if not Assigned(mDBGrid.DataSource) then
     Exit;
   if not Assigned(mDBGrid.DataSource.DataSet) then
     Exit;
   if not mDBGrid.DataSource.DataSet.Active then
     Exit;
   for I := 0 to mDBGrid.Columns.Count - 1 do
   begin
     if not mDBGrid.Columns[I].Visible then
       Continue;
     DBGridRecordSize(mdbgrid.Columns[i]);
     if Assigned(mDBGrid.Columns[I].Field) then
       mDBGrid.Columns[I].Width := Max(mDBGrid.Columns[I].Field.Tag,
         mDBGrid.Canvas.TextWidth(mDBGrid.Columns[I].Title.Caption)) + mOffset
     else
       mDBGrid.Columns[I].Width :=
         mDBGrid.Canvas.TextWidth(mDBGrid.Columns[I].Title.Caption) + mOffset;
     mDBGrid.Refresh;
     //  Application.ProcessMessages;
   end;
   Result := True;
 end; { DBGridAutoSize }

 

2016/7/1 20:53:36 询问是否退出:
if Application.MessageBox('您好,确定要退出本程序吗', '提示', MB_OKCANCEL) = IDOK then
    Application.Terminate;

 

2016/7/1 20:44:37 MessageBox 用法

MessageBox对话框是比较常用的一个信息对话框,其不仅能够定义显示的信息内容、信息提示图标,而且可以定义按钮组合及对话框的标题,是一个功能齐全的信息对话框信息提示图标,而且可以定义按钮组合及对话框的标题,是一个功能齐全的信息对框。

 1、函数原型及参数

 function MessageBox(hWnd: HWND;Text,Caption:PChar;Type:Word):Integer;

 hWnd:对话框父窗口句柄,对话框显示在Delphi窗体内,可使用窗体的Handle属性,否则可用0,使其直接作为桌面窗口的子窗口。

 Text:欲显示的信息字符串。

 Caption:对话框标题字符串。

 Type:对话框类型常量。

 该函数的返回值为整数,用于对话框按钮的识别。

 2、类型常量

 对话框的类型常量可由按钮组合、缺省按钮、显示图标、运行模式四种常量组合而成。

 1)按钮组合常量

 MB_OK = $00000000;         //一个确定按钮

 MB_OKCANCEL = $00000001;      //一个确定按钮,一个取消按钮

 MB_ABORTRETRYIGNORE = $00000002;  //一个异常终止按钮,一个重试按钮,一个忽略按钮

 MB_YESNOCANCEL = $00000003;     //一个是按钮,一个否按钮,一个取消按钮

 MB_YESNO = $00000004;        //一个是按钮,一个否按钮

 MB_RETRYCANCEL = $00000005;     //一个重试按钮,一个取消按钮

 2)缺省按钮常量

 MB_DEFBUTTON1 = $00000000;     //第一个按钮为缺省按钮

 MB_DEFBUTTON2 = $00000100;     //第二个按钮为缺省按钮

 MB_DEFBUTTON3 = $00000200;     //第三个按钮为缺省按钮

 MB_DEFBUTTON4 = $00000300;     //第四个按钮为缺省按钮

 3)图标常量

 MB_ICONHAND = $00000010;        //“×”号图标

 MB_ICONQUESTION = $00000020;      //“?”号图标

 MB_ICONEXCLAMATION = $00000030;    //“!”号图标

 MB_ICONASTERISK = $00000040;      //“i”图标

 MB_USERICON = $00000080;        //用户图标

 MB_ICONWARNING = MB_ICONEXCLAMATION;  //“!”号图标

 MB_IConERROR = MB_ICONHAND;      //“×”号图标

 MB_ICONINFORMATION = MB_ICONASTERISK; //“i”图标

 MB_ICONSTOP = MB_ICONHAND;       //“×”号图标

 4)运行模式常量

 MB_APPLMODAL = $00000000;    //应用程序模式,在未结束对话框前也能切换到另一应用程序

 MB_SYSTEMMODAL = $00001000;   //系统模式,必须结束对话框后,才能做其他操作

 MB_TASKMODAL = $00002000;    //任务模式,在未结束对话框前也能切换到另一应用程序

 MB_HELP = $00004000;       //HelpButton

 3、函数返回值

 0            //对话框建立失败

 idOk =1        //按确定按钮

 idCancel =2      //按取消按钮

 idAbout =3       //按异常终止按钮

 idRetry =4       //按重试按钮

 idIgnore =5      //按忽略按钮

 idYes =6        //按是按钮

 idNo =7        //按否按钮

 

例子:messagebox(0,'没有选择播放类型','错误',MB_ICONEXCLAMATION );

--Application.MessageBox('MessageBox','警告',MB_ICONWARNING+MB_YesNo);

--MessageBox(Form1.Handle,'MessageBox','提示',MB_ICONINFORMATION+MB_OkCancel);

--MessageBox(Form1.Handle,'MessageBox','提示‘,MB_ICONINFORMATION+MB_OkCancel+MB_DEFBUTTON2);

-- if MessageBox(Form1.Handle,'MessageBox','提示',MB_ICONINFORMATION+MB_OkCancel)= idOk then

 begin

 ShowMessage('Ok');

 end;

 

 

 
2016/7/1 15:12:56  数字转字符串
A:=IntToStr(123)

 

2016/7/1 12:26:00  Delphi正则表达式使用方法(TPerlRegEx)
 
目前主流的delphi下的正则表达式,应该是 PerlRegEx 。   
    官方网站: http://www.regular-expressions.info/delphi.html
    直接下载: http://www.regular-expressions.info/download/TPerlRegEx.zip    
安装方法(我使用的delphi版本是 delphi2007):
1、先把解压的 TPerlRegEx 文件夹放在 Delphi 的根目录下的 Imports 目录中。
2、目前最新 For Win32 的版本是可以在 Delphi7,Delphi 2006,Delphi 2007,Delphi 2009 下使用。 
     我用的是2007,于是就打开了PerlRegExD2007.dpk ,在 Project Manager 窗口中的 PerlRegExD2007.bpl 上点击右键,执行 Install。这时在 Tool Palette 的列表中已经有了 TPerlRegEx,在 JGsoft 组。
3、Tools -> Options -> Environment Options -> Delphi Options -> Library-Win32 -> Library path ->
添加路径:$(BDS)\Imports\TPerlRegEx (注:就是刚才放置的路径)。
4、打开delphi根目录下 Imports\TPerlRegEx\pcre ,把 pcre3.dll 文件复制到 C:\WINDOWS\system32 文件夹下,这个文件夹里是windows系统存放 dll 文件的大本营。如果不复制pcre3.dll,在应用 TPerlRegEx 正则的时候,系统提示出错。
5、用delphi打开 Imports\TPerlRegEx 目录下的 pcre.pas 文件,找到 //{$DEFINE PCRE_STATICLINK} ,把之前的注释 // 删除;找到 {$DEFINE PCRE_LINKDLL} ,把它注释掉,即改为 //{$DEFINE PCRE_LINKDLL} 。注意:这点非常重要,如果不这样改的话,在软件开发完成后,分发到其他电脑上的时候,软件就会提示“缺少pcre3.dll错误”。这样修改的原因,是把正则直接封包到 exe 文件里,而不需要链接 pcre3.dll 了;封包进 exe,付出的代价是软件增大了 100KB 左右的大小,当然比起必须携带 pcre3.dll来说,这是有意义的付出。 
6、可以使用了! 直接 uses PerlRegEx 或从 Tool Palette 添加都可以。 TPerlRegEx 安装设置完成后,就可以舒心地使用了,一些简单的使用方法如下: 
 
//查找是否存在
var
  reg: TPerlRegEx;
begin
  reg := TPerlRegEx.Create(nil);
  reg.Subject := 'CodeGear Delphi 2007 for Win32';
  reg.RegEx   := '\d';
  if reg.Match then
    ShowMessage('找到了')
  else
    ShowMessage('没找到');
  FreeAndNil(reg);
end;
//替换一般字符串
var
reg: TPerlRegEx;
begin
reg := TPerlRegEx.Create(nil);
reg.Subject := '我爱DELPHI, 但Delphi不爱我!';
reg.RegEx   := 'Delphi';
reg.Replacement := '';
reg.ReplaceAll;
ShowMessage(reg.Subject); //返回: 我爱DELPHI, 但◆不爱我!          
FreeAndNil(reg);
end;
//分别显示找到的每一个和总数
var
  reg: TPerlRegEx;
  num: Integer; //用 num 来计数
begin
  reg := TPerlRegEx.Create(nil);  reg.Subject := 'CodeGear Delphi 2007 for Win32';
  reg.RegEx   := '\d';  num := 0;
  while reg.MatchAgain do  //MatchAgain 是下一个
  begin
    ShowMessage(reg.MatchedExpression); //将分别显示: 2 0 0 7 3 2
    Inc(num);
  end;
    ShowMessage(IntToStr(num)); //6  FreeAndNil(reg);
end;
//目标字符串的位置与长度
var
  reg: TPerlRegEx;
begin
  reg := TPerlRegEx.Create(nil);  reg.Subject := 'CodeGear Delphi 2007 for Win32';
  reg.RegEx   := 'Delphi';  while reg.MatchAgain do  //很明显: 本例只能找到一个结果
  begin
    ShowMessage(reg.MatchedExpression); //找到的字符串: Delphi
    ShowMessage(IntToStr(reg.MatchedExpressionOffset)); //它所在的位置: 10
    ShowMessage(IntToStr(reg.MatchedExpressionLength)); //它的长度: 6
  end;  FreeAndNil(reg);
end;
// Matchedexpression_r 与Subexpression_rs[0]
var
reg: TPerlRegEx;
begin
reg := TPerlRegEx.Create(nil);
reg.Subject := 'CodeGear Delphi 2007';
reg.RegEx   := 'Delphi';
while reg.MatchAgain do
begin
   ShowMessage(reg.Matchedexpression_r); //Delphi; 这是匹配到的内容
   ShowMessage(reg.Subexpression_rs[0]); //Delphi; 也可以这样显示匹配到的内容
end;
{
Subexpression_rs 是一个数组:
Subexpression_rs[1] 储存第 1 个表达式匹配的内容;
Subexpression_rs[2] 储存第 2 个表达式匹配的内容;
Subexpression_rs[n] 储存第 n 个表达式匹配的内容;
Subexpression_rs[0] 储存整个表达式匹配的内容;
Matchedexpression_r 表示的不过是 Subexpression_rs[0].
}
FreeAndNil(reg);
end;
//提取子表达式匹配到的内容
var
reg: TPerlRegEx;
begin
reg := TPerlRegEx.Create(nil);
reg.Subject := 'abc A1111 BB222 CCC33 DDDD4';
reg.RegEx   :='\b([A-D]+)([1-4]+)\b'; //这个表达式有两个子表达式构成
while reg.MatchAgain do
begin
   ShowMessage(reg.Subexpression_rs[0]); //将分别显示: A1111 BB222 CCC33DDDD4
   ShowMessage(reg.Subexpression_rs[1]); //将分别显示: A BB CCC DDDD
   ShowMessage(reg.Subexpression_rs[2]); //将分别显示: 1111 222 33 4
   {另外:
     reg.Subexpression_rCount     是子表达式的个数;
     reg.Subexpression_rLengths[n] 是第 n 个表达式返回的字符串的长度;
     reg.Subexpression_rOffsets[n] 是第 n 个表达式返回的字符串在源字符串中的位置
    }
end;
FreeAndNil(reg);
end;
//子表达式不能超过 MAX_SUBexpression_rS = 99 个, MAX_SUBexpression_rS 是TPerlRegEx 的内置常数.
//设定搜索范围: Start、Stop
var
reg: TPerlRegEx;
begin
reg := TPerlRegEx.Create(nil);
reg.Subject := 'ababab';
reg.RegEx   := 'ab';
reg.Replacement := '';
reg.Start := 1;
reg.Stop := 2;
while reg.MatchAgain do
begin
   reg.Replace;
end;
ShowMessage(reg.Subject); //返回: ◆abab
reg.Subject := 'ababab';
reg.Start := 3;
reg.Stop := 4;
while reg.MatchAgain do
begin
   reg.Replace;
end;
ShowMessage(reg.Subject); //返回: ab◆ab
reg.Subject := 'ababab';
reg.Start := 5;
reg.Stop := 6;
while reg.MatchAgain do
begin
   reg.Replace;
end;
ShowMessage(reg.Subject); //返回: abab◆
FreeAndNil(reg);
end;
// Replace
var
reg: TPerlRegEx;
begin
reg := TPerlRegEx.Create(nil);
reg.RegEx   := 'ab';
reg.Replacement := '';
reg.Subject := 'ababab';
reg.ReplaceAll;
ShowMessage(reg.Subject); //返回: ◆◆◆
reg.Subject := 'ababab';
//下面四行程序, 相当于 reg.ReplaceAll;
while reg.MatchAgain do
begin
   reg.Replace;
end;
ShowMessage(reg.Subject); //返回: ◆◆◆
FreeAndNil(reg);
end;
{
ReplaceAll 函数返回的是 Boolean;
Replace 函数返回的是 Replacement 的值, 当然是不能赋值的, 它仅仅是返回值.
}
// Compile、Study
var
reg: TPerlRegEx;
begin
reg := TPerlRegEx.Create(nil);
reg.RegEx   := 'ab';
reg.Options := [preCaseLess];
reg.Compile; {编译表达式}
reg.Study; {Study 方法会检查是否编译, 如果没有编译则执行 Compile}
reg.Replacement := '';
reg.Subject := 'abAbaB';
reg.ReplaceAll;
ShowMessage(reg.Subject); {返回: ◆◆◆}
FreeAndNil(reg);
end;
{
编译表达式, 会加快执行速度、降低启动速度;
如果表达式比较复杂而又多次执行, 应该先编译;
编译内容包括表达式选项.
}
// EscapeRegExChars 函数可以自动为特殊字符加转义符号 \
var
reg: TPerlRegEx;
begin
reg := TPerlRegEx.Create(nil);
reg.Subject := 'C++Builer';
reg.RegEx   :=reg.EscapeRegExChars('C+') + '{2}'; {相当于 'C\+{2}'}
reg.Replacement := '';
reg.ReplaceAll;
ShowMessage(reg.Subject); {返回: ◆Builer}
FreeAndNil(reg);
end;
//字符串分割: Split
var
reg: TPerlRegEx;
List: TStrings;
begin
List := TStringList.Create;
reg := TPerlRegEx.Create(nil);
reg.Subject := 'aaa,bbb,ccc,ddd';
reg.RegEx   := ',';{这里可是运行相当复杂的分割符啊}
reg.Split(List,MaxInt); {第一个参数读入的是 Subject; 第二个参数是分成多少份}
{ 输入一个最大整数, 表示能分多少就分多少}
ShowMessage(List.Text);
{返回:
    aaa
    bbb
    ccc
    ddd
}
FreeAndNil(reg);
List.Free;
end;

 

 
2016/7/1 2:18:30 if command
 
Example code : Illustrate the different flavours of the if statement 
 begin
  // Illustrate a simple if statement that executes true
   If True then ShowMessage('True!');
  // Illustrate the same, but with multiple actions
   If 1 = 1 then
   begin
     ShowMessage('We now have');
     ShowMessage('multiple lines');
   end;
  // Illustrate a simple if statement that fails
   If 1 = 2 then ShowMessage('1 = 2');
  // Illustrate an if then else statement
  // Note the lack of a ';' after the 'then' clause
   If False
   then ShowMessage('True')
   else ShowMessage('False');
  // Nested if statements - Delphi sensibly manages associations
   If true then
     If false then
       ShowMessage('Inner then satisfied')
     else
       ShowMessage('Inner else satisfied')
   else
     ShowMessage('Outer else satisfied')
 end;
 
Show full unit code 
    True!
   We now have
   multiple lines
   False
   Inner else satisfied

 

 
1. 如何让窗体加载图片:
  1. 改变窗体颜色:先选择窗体,修改窗体的“color”属性就可以了;
  2. 加入图片,先在窗体上加入一个image控件,控件在“Additional”控件选项卡中;
  3. 修改image控件属性:picture;在出现的窗口右下方有“load...”加入一张图片即可;如果image显示图片全部就修改image的“stretch”属性,改为“True”就可以了;
2. delphi中用Memo控件,F9执行时会显示“memo1”,如何清除
  1. Lines属性那里清除
3.  您好!向您请教一个问题:我在delphi 7中运行一个程序,提示:file not found 'EditNew.dcu'
  1. 两个办法解决,不用你去设置的,任选其一;
  2. 1,把D:\ERP\dcu 文件下EditNew.dcu 文件复制到你的工程根目录
  3. 2,把EditNew.dcu 复制到你的Delphi7安装目录的Lib文件夹下面,如我装在D盘,就是在D:\Program Files\Borland\Delphi7\Lib 目录下
  4. 按我说的去做,包你OK
2016/7/1 1:30:36   Delphi 字符串截取函数

如果要使用LeftStr,RightStr,MidStr必需引用系统单元StrUtils;

声明变量Str:string;

Str:=HelloWorld;

1,LeftStr(Str,2)=He;//从Str字符串变量的最左边(第一个字符包括第一个字符)开始截取2个字符;

2,RightStr(Str,2)=ld;//从Str字符串变量的最右边(第一个字符包括第一个字符)开始截取2个字符;

3,MidStr(Str,2,2)=el;//从Str字符串变量的中第2个字符开始取长度为2个字符的字符串;

另外有一个函数Copy

4,Copy(Str,2,2)=el;//从Str字符串变量的中第2个字符开始取长度为2个字符的字符串;(类似于MidStr);

 

 

 



posted @ 2016-07-05 09:53  乾坤颠倒  阅读(818)  评论(0编辑  收藏  举报