delphi7學習經驗積累

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

歡迎轉載,但請註明出處,保留作者和版權信息。

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

發佈了56 篇原創文章 · 獲贊 3 · 訪問量 25萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章