delphi7学习经验积累

来源:互联网 发布:插画用什么软件 编辑:程序博客网 时间:2024/05/20 01:34
2006年开始学习delphi一路以来的经验积累吐血大公开。若这些经验对你有所帮助,能使你少走些许弯路,恳请能告诉我,或若愿意和我分享经验,探讨vb、delphi、vc、asp问题请留下评论或email。本人email:boythl#163.com。
===================================================

2006、10、11 
在制作DLL时,在最后一定要把要发布的函数列出来,不然调用时会程序初始化失败,无法进入;
 exports FunctionName;

MKDir(Path) 函数创建文件夹;

在创建数据库时,用户名需要设为Admin,改成txtx时发生了“无法启动应用程序。工作组信息文件丢失”的错误。

2006、10、12
StrUnits单元中
 DupeString 函数 = VB string函数  重复N次某字符
 PosEx可以从某个特定位置开始查找某字符
 MidStr函数 = VB Mid函数
 ReverseString函数 翻转字符串
 StuffString函数 向一个字符串在某位置插入一个子字符串
 RightStr 函数,从字符串最后取字符
 StrRScan 字符最后次出现的指针

只有有序的数字和字母才能作为集合(sets),且个数不能超过255个.

TStrings对象的NameValueSeparator属性可以设置TStrings对象的文本包含Name和Value,如a=1,设置NameValueSeparator:='='可以使用getName等方法提取Name和Value

2006、10、17
ItemProps属性可以控制valueeditlist控件显示下拉框,在使用时需要注意self.vldFields.Row-1,因为表头的Key value行index=0
procedure TForm1.vldFieldsClick(Sender: TObject);
begin
    self.vldFields.ItemProps[self.vldFields.Row-1].EditStyle:=esPickList;    //显示下拉框
    self.vldFields.ItemProps[self.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)

2006、10、24
TIDUDPSERVER在设置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,否则控件无法显示。
API中指针类型参数不能随便设为空,否则有可能引起地址访问失败。

2006、10、26
AnsiStrRScan 函数可以从右边提取字符串,如: AnsiStrRScan('abcdefg','d') 结果='defg'

2006、10、30
控件的Perform方法很有用,可代替对该控件的sendmessge方法,如checkbox.perform(BM_SETCHECK, Ord(CheckIt), 0); 选中复选框
在文件传输时使用TFileStream而非TMemoryStream可提高速度。速度可由200K提高到10M

2006、11、1
在showmodule对话框窗体时不需要手动self.close关闭窗体,把button的ModaulResult设为mrOK会自动关闭窗体,且不能在formcreate中关闭

2006、11、3
可以使用strtoint的报错信息来判断是否数字类型,也可以用trystrtoint函数,是数字返回true

2006、11、6
messagedlg的返回值为mrOK,mrCancel
TAdoQuery对象的FieldByName('Name').AsString可提供对Open方法返回的数据集值的直接操控读取.

2006、11、8
strCat函数将改变头一个参数的值. strcat(a,b) 返回a+b, a 的值也变成a+b.

2006、11、13
RTF的合并不复制到剪贴板也可以,如下:
  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函数可以锁住控件,暂停刷新屏幕,值取0时停止锁定,可用于避免屏幕闪烁

2006、11、14
GIF插入richtextbox网上说可以使用QQ带的imageole.dll支持。QQ、MSN派生自webBrowser

2006、11、15
  AnsiEndsText函数可以判断一个字符串是否是另一个字符串的结尾,可用来判断扩展名如AnsiEndsText('.jpg',name) true则是jpg格式,也可用 ExtractFileExt函数判断。
  加入JPEG单元TPictrue的loadFromFile才可以打开JPEG格式图片。若无JPEG单元,OpenPictureDialog在选择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工程文件里运行时会提示"Resource ** NOT FOUND" **窗体类名。
调用com对象时使用:(如同vb的CreateObject)
obj:=CreateOleObject('Mapinfo.Application');  //Comobj单元
也可以使用CreateComObject

2006、11、17
setmessage发送按钮单击事件必须发送一对WM_LBUTTONDOWN和WM_LBUTTONUP,其它都不管用。
API BlockInput可以阻塞键盘输入

2006、11、20
判断pchar类型变量是否为空可用p^<>#0,不可直接用P<>'',否则p空值时p<>''为true
构造器不用overload, constructor Create(const MSG:WideString);    函数体里 inherited Create(IsSuspended);
点击系统菜单里的关闭、最大化、最小化按钮会发送WM_SYSCOMMAND消息,WParam参数分别为:SC_CLOSE/  SC_SIZE/  SC_MOVE / SC_MINIMIZE / SC_MAXIMIZE/SC_RESTORE(恢复先前的视图位置)

2006、11、21
在做快捷方式时发现pwidechar不能使用pchar直接类型转换,好像是不兼容的。得用StringToWideChar来转换

2006、11、22
使用了ocx的时候,在安装时需要用reg注册该OCX,否则会无法启动,“程序出现异常。软件发生未知异常”或是“程序遇到问题需要关闭”,然后程序崩溃。前者会提示“未注册类别”,后者会出现modaule kernel32.dll等。
在创建TCustromForm类的继承类时,若构造器不同于TCustomForm预定义create方法时,不能使用override,编译器提示'create' hide virtual method of base type 'TCustomForm',使用reintroduce关键字可以取消编译器警告。如:constructor Create(AOwner: TComponent;const UserOnline:TStringList);reintroduce;

2006、11、24
在释放窗体时BORLAND推荐使用release,因为该方法会等待所有的过程执行完毕后释放内存,不推荐使用terminate和destroy
SecondsBetween可以获取两时间Tdatetime间的秒数,若直接使用两Tdatetime时间相减,将得到一个浮点值,且单位是天,需要乘以86400方得到秒。
format函数中,%%可以输出%

2006、11、27
非模态对话框关闭时释放窗体所在的内存可在onclose事件里使用 Action:=caFree;

2006、11、28
使用expandfullpath返回的路径是相对当前目录的路径,可以用getCurrentDir函数返回当前目录,使用SetCurrentDir( ExtractFilePath(application.ExeName));可把exe所在目录设为当前目录,建议每次使用expandfullpath前都手动设定当前目录,因为当前目录经常会变化.比如用户使用公用对话框选择了文件名或保存文件名,都会引起当前目录改变.

2006、11、29
SQL语句支持五大join连接查询,left join ,right join, outer join, full join ,inner join
sql中创建查询语法: Create View View_Name AS (Select col_name FROM TABNAME WHERE CONDITION) ACCESS不直接支持Create View,需要使用adodb.connection对象

2006、12、07
TImage组件只有在stretch=true时,align=alClient才会发挥作用;
下面两句可以重绘画板,
  self.imgDraw.Picture:=nil;
  self.imgDraw.Canvas.FillRect(self.imgDraw.canvas.ClipRect);   //使画板填白,使用canvas.brush.color颜色

2006、12、12
ACCESS支持的SQL不支持replace函数,但支持left,right和mid等函数,以下sql语句替代replace函数使用.chr(10)是要删除的换行符.
UPDATE NODE SET NODE.Node_ID =left(node_ID,instr(Node_ID,chr(10))-1) &  mid(node_ID,instr(Node_ID,chr(10))+1)
闪烁标题栏按钮必须true和false配合使用,true开始,false停止,并使用application.Handle,
flashWindow(application.Handle,false);

2006、12、19
strAlloc字符指针申请内存,strDispose释放strAlloc申请的字符指针内存.

2006、12、22
下面两种方法可以打开文件所在的文件夹,并定位到文件上.
  WinExec('explorer /n,/select,'+FileName,SW_SHOWNORMAL);
 // shellexecute(0,'open','explorer.exe','/e,/select,'+FileName,nil,SW_SHOWNORMAL);
API函数MAKELPARAM可以根据低位和高位数字合成LPARAM,传给window Message的参数.

2006、12、23
SetForegroundWindow 将一个窗口带到最上层(z-order),但若函数由非foreground进程调用,将只是闪动任务栏图标,并不会将窗体提前。
Delphi带API帮助中SetActiveWindow 一节如此描述:
The SetForegroundWindow window function, on the other hand, activates a window and forces it into the foreground. An application should only call SetForegroundWindow if it needs to display critical errors or information that needs the user's immediate attention .

2007、01、05
idudpclient和idudpserver同时使用同一端口时会给idtcpclient分配一个随机端口。若只使用idudpserver监听和发送消息则端口和给定的相同。

2007、01、18
使用trunc函数判断是否有第六位小数时遇到个奇怪问题。语句如下:
Item[j].X*100000<>Trunc((Item[j].X*100000))
若Item[j].X=14.12784 会出现1412784<>1412783 的情况,就是trunc会使结果减1,网上讨论是类型转换问题。今天偶然解决,方法:
dblTmp:double;
dblTmp:=Item[j].X*100000;
dblTmp<>trunc(dblTmp)  结果1412784=1412784
恶心的delphi!

2007、01、19
TGlyph图象使用的位图“The lower left pixel of the bitmap is reserved for the "Transparent" color.”,经试验,发现若要使用透明色,需要把位图bmp格式转成index模式,索引色模式,非常用的RGB模式,然后把底色改成color table中的最后一个颜色

2007、02、04
遍历文件夹下所有文件时可以使用TStringList来保存遍历结果。然后遍历返回后循环Tstringlist变量中文件名。
Delphi中的Excel对象索引(参数提示index)都是从1开始并非0开始。

2007、02、05
Delphi中Excel的Worksheet需要先Activate才能对Range进行Select操作。否则会报错。

2007、02、06
在向TImageList动态添加图片时,若要实现透明图片效果,可以使用ImageList.AddMasked和ReplaceMasked代替Add和Replace,如:
intIndex:=self.imglstICON.AddMasked(bmpHead,bmpHead.Canvas.Pixels[0,0]);  //使透明
其中第一个参数是要添加的BMP,第二个参数是透明色,这里取左上角第一个象素值。
其它的动态添加方法试验时好像都不能实现透明。

 

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

非注明转载的文章和blog在未特殊声明情况下一般为本人原创,版权 lonefox 所有,

http://blog.csdn.net/boythl

欢迎转载,但请注明出处,保留作者和版权信息。

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

原创粉丝点击