1、delphi7.0 学习经验积累 原 2006 年开始学习 delphi 一路以来的经验积累吐血大公开。若这些经验对你有所帮助,能使你少走些许弯路,恳请能告诉我,或若愿意和我分享经验,探讨 vb、delphi、vc、asp 问题请留下评论或 email。本人email:。用得不多。=2006、10、11 在制作 DLL 时,在最后一定要把要发布的函数列出来,不然调用时会程序初始化失败,无法进入;exports FunctionName;MKDir(Path) 函数创建文件夹;在创建数据库时,用户名需要设为 Admin,改成 txtx 时发生了“无法启动应用程序。工作组信息文件丢失”的错误。20
2、06、10、12StrUnits 单元中DupeString 函数 = VB string 函数 重复 N 次某字符PosEx 可以从某个特定位置开始查找某字符MidStr 函数 = VB Mid 函数ReverseString 函数 翻转字符串StuffString 函数 向一个字符串在某位置插入一个子字符串RightStr 函数,从字符串最后取字符StrRScan 字符最后次出现的指针只有有序的数字和字母才能作为集合(sets),且个数不能超过 255 个.TStrings 对象的 NameValueSeparator 属性可以设置 TStrings 对象的文本包含Name 和 Value
3、,如 a=1,设置 NameValueSeparator:=可以使用 getName 等方法提取 Name 和 Value2006、10、17ItemProps 属性可以控制 valueeditlist 控件显示下拉框,在使用时需要注意self.vldFields.Row-1,因为表头的 Key value 行 index=0 procedure TForm1.vldFieldsClick(Sender: TObject);beginself.vldFields.ItemPropsself.vldFields.Row-1.EditStyle:=esPickList; /显示下拉框self.vl
4、dFields.ItemPropsself.vldFields.Row-1.PickList:= TargetFields;end;2006、10、18今天发现在 SQL 中,若两文本字段其中一个文本字段为 null(非“),另一个文本字段非 Null 则两个字段可通过等号检索到(F1=F2),而若两个文本字段都为null 时则等号检索不到,但用不等号也不能检索出来。很奇怪!2006、10、23只有在 Richedit 处于活动时才自动滚屏 或发送 EM_SCROLLCARET sendmessage(self.rdtHistory.Handle ,EM_SCROLLCARET,0,0)200
5、6、10、24TIDUDPSERVER 在设置 DefaultPort 之前必须设置 Active 为 false,否则新端口无效.FlashWindow 必须传入 Application.Handle 才能实现闪动标题栏FlashWindow(self.Handle ,true);FlashWindow(application.Handle,true);2006、10、25可以设置动态控件数组,如 chk:array of TcheckBox; 然后 setlength 即可;在动态创建数组时,必须设置控件的 parent 属性,一般为 TWinControl 类对象,如 form1,否则控
6、件无法显示。API 中指针类型参数不能随便设为空,否则有可能引起地址访问失败。2006、10、26AnsiStrRScan 函数可以从右边提取字符串,如: AnsiStrRScan(abcdefg,d) 结果=defg2006、10、30控件的 Perform 方法很有用,可代替对该控件的 sendmessge 方法,如checkbox.perform(BM_SETCHECK, Ord(CheckIt), 0); 选中复选框在文件传输时使用 TFileStream 而非 TMemoryStream 可提高速度。速度可由200K 提高到 10M2006、11、1在 showmodule 对话框窗
7、体时不需要手动 self.close 关闭窗体,把 button 的ModaulResult 设为 mrOK 会自动关闭窗体,且不能在 formcreate 中关闭2006、11、3可以使用 strtoint 的报错信息来判断是否数字类型,也可以用 trystrtoint 函数,是数字返回 true2006、11、6messagedlg 的返回值为 mrOK,mrCancelTAdoQuery 对象的 FieldByName(Name).AsString 可提供对 Open 方法返回的数据集值的直接操控读取.2006、11、8strCat 函数将改变头一个参数的值. strcat(a,b) 返
8、回 a+b, a 的值也变成a+b.2006、11、13RTF 的合并不复制到剪贴板也可以,如下:self.RichTextBox3.TextRTF:=self.RichTextBox2.TextRTF;self.RichTextBox3.SelLength:=length(self.RichTextBox3.Text);self.RichTextBox1.SelStart:=length(self.RichTextBox1.Text);self.RichTextBox1.SelRTF:=self.RichTextBox3.TextRTF;LockWindowsUpdate API 函数可以锁
9、住控件,暂停刷新屏幕,值取 0 时停止锁定,可用于避免屏幕闪烁2006、11、14GIF 插入 richtextbox 网上说可以使用 QQ 带的 imageole.dll 支持。QQ、MSN 派生自 webBrowser2006、11、15AnsiEndsText 函数可以判断一个字符串是否是另一个字符串的结尾,可用来判断扩展名如 AnsiEndsText(.jpg,name) true 则是 jpg 格式,也可用 ExtractFileExt 函数判断。加入 JPEG 单元 TPictrue 的 loadFromFile 才可以打开 JPEG 格式图片。若无JPEG 单元,OpenPict
10、ureDialog 在选择 jpg 格式图片时会引发非法图片格式的错误。今天发送“TXM1.5“文件夹失败,可以采用 DirectionaryExist 和 FileExist 来判断是文件还是文件夹,不能用判断是否有扩展名。strLineNO:array of array of String; /定义二维动态数组 ,用setLength(strLineNO,2,DS.RecordCount); 定义数组大小2006、11、16创建带 FORM 的 DLL 时需要添加一个 UNIT 到 DLL 工程,在工程文件里 export 创建窗体的函数,在 DLL 里写窗体操作类,若都写到 DLL 工程
11、文件里运行时会提示“Resource * NOT FOUND“ *窗体类名。调用 com 对象时使用:(如同 vb 的 CreateObject)obj:=CreateOleObject(Mapinfo.Application); /Comobj 单元也可以使用 CreateComObject2006、11、17setmessage 发送按钮单击事件必须发送一对 WM_LBUTTONDOWN 和 WM_LBUTTONUP,其它都不管用。API BlockInput 可以阻塞键盘输入2006、11、20判断 pchar 类型变量是否为空可用 p,否则 p 空值时 pTrunc(Itemj.X*1
12、00000)若 Itemj.X14.12784 会出现 1412784trunc(dblTmp) 结果 1412784=1412784恶心的 delphi!2007、01、19TGlyph 图象使用的位图“The lower left pixel of the bitmap is reserved for the “Transparent“ color.”,经试验,发现若要使用透明色,需要把位图bmp 格式转成 index 模式,索引色模式,非常用的 RGB 模式,然后把底色改成color table 中的最后一个颜色2007、02、04遍历文件夹下所有文件时可以使用 TStringList
13、来保存遍历结果。然后遍历返回后循环 Tstringlist 变量中文件名。Delphi 中的 Excel 对象索引(参数提示 index)都是从 1 开始并非 0 开始。2007、02、05Delphi 中 Excel 的 Worksheet 需要先 Activate 才能对 Range 进行 Select 操作。否则会报错。2007、02、06在向 TImageList 动态添加图片时,若要实现透明图片效果,可以使用ImageList.AddMasked 和 ReplaceMasked 代替 Add 和 Replace,如:intIndex:=self.imglstICON.AddMasked(bmpHead,bmpHead.Canvas.Pixels0,0); /使透明其中第一个参数是要添加的 BMP,第二个参数是透明色,这里取左上角第一个象素值。其它的动态添加方法试验时好像都不能实现透明。