程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 更多編程語言 >> Delphi >> Delphi入門點點滴滴

Delphi入門點點滴滴

編輯:Delphi
“聰明的程序員用Delphi!”現在,真是有越來越多的人開始用Delphi了。不過,高手畢竟是少數,像我這樣的菜鳥可謂遍地都是,哈哈。既然是菜鳥自然就有一大堆很菜的問題,什麼這個怎麼設置、那個怎麼寫的……所以,以下我就以我所積累的那一點點經驗和論壇上常見的小問題作一個總結性發言(全場熱烈鼓掌!哎,這鮮花我就收下了,那個什麼爛番茄就不要扔上來了嘛)

  
  ==系統應用篇==

  A.Delphi自代了大量的常用控件,如Delphi5就有一百多了,而今年出的Delphi6更是Delphi5的1.5倍。這麼多控件,就是在1024*768的分辨率下也無法全部顯示他們的組件面板,而每次要按那兩顆小按鈕來顯示更多的面板,真是非常不方便!但通過添加下面那一個注冊表鍵值就能實現組件面板自動展開:
  [HKEY_CURRENT_USERSoftwareBorlandDelphiX.0Extras]
  "AutoPaletteSelect"="1"
  (注:X.0表示你的Delphi的版本號;如果沒有Extras主鍵則新建即可,下同)

  B.每次新建窗體,然後設置其字體、大小……真是好麻煩的!那就再添加一個以下的鍵值,讓系統自動來設置吧:
  [HKEY_CURRENT_USERSoftwareBorlandDelphiX.0FormDesign]
  "DefaultFont"="宋體,9,_"
  (注:_表示空格,也可以用Bold(粗體)等代替)

  C.自定義工作環境,讓它更加適合自己。
    •設置工具欄。在Delphi的工具欄右鍵單擊,選Customize,然後挑選需要的按鈕拖到工具上,把不要的拖出來。我常用的是:Standard工具欄下的Open、Open Project、Save、Save All、Undo、Redo;Debug工具欄下的Pause、Add Watch、Program Reset、Run;Desktop工具欄下的Save Current Desktop、Set Debug Desktop;Component Palette工具欄。
    •設置窗口布局。為了能跟高效的編寫程序,合理的布置各個窗口是很重要的。我常用的窗口有:Object Inspector、Project Manager(VIEw|Project Manager)、Watch List(Run|Add Watch...) ,具體的停放位置如圖1。
  
  設置好各個窗體後按Desktop工具欄上的Save Current Desktop按鈕保存。
    •設置顯示顏色。讓代碼的顏色更符合自己的習慣,有利於編寫時思維的清晰。Tools|Editor Options打開Editor PropertIEs,選Color標簽頁,設置代碼顏色。以下僅解釋一下幾個常用的:
    Whitespace:空白處,即背景;
    Comment:注釋;
    Reserved Word:保留字;
    String:字符串;
    Number:數字;
    Execution Point:正在執行的當前行(即F7步入時所到達的那一行);
    Enabled break:斷點;
    Error line:錯誤發生行;

  D.掌握一些Delphi編程中的快捷鍵,能夠極大程度的提高效率,還不會讓你因為過多無聊的設置等而感到厭煩,現在如果不用這些快捷鍵,我會很不適應這樣的編程的!以下我就介紹一下我常用的幾個快捷鍵:
  Esc : 選擇當前選中組件的容器(通常是Panel,GroupBox或Form等);
  Ctrl+方向鍵 :將所選組件移動一個像素;
  Ctrl+Shift+方向鍵 :將所選組件移動一大格(類似Fireworks中按住Shift再用方向鍵移動時的效果);
  Shift+方向鍵 :調整選中組件的大小,每次一像素;
  Shift+選中組件 :按住Shift鍵再用鼠標點擊組件,可以同時選擇多個組件;
  Ctrl+鼠標左鍵 :在procedure中掉用其他的函數(如一個自定義的過程),在這個調用處按住Ctrl會發現當鼠標移上去的時候變成了一個類似超鏈接的格式,鼠標單擊就能直接轉到所調用的此函數的實現部分。這個功能我可是用的最多了,讓我找模塊變得非常方便!
  Ctrl+Shift+C :在一個對象中聲明了一個方法,然後把光標放到它的上面,按下Ctrl+Shift+C就可以為他的實現建立一個基本框架,如:
  TForm1 = class(TForm)
    private
      { Private declarations }
    public
      { Public declarations }
      procedure Mine;
    end;
  把光標放到procedure Mine這行,按下Ctrl+Shift+C,下面這段代碼將自動插入到單元中:
  procedure TForm1.Mine;
  begin

  end;

  
  ==窗體操作篇==

      在有多個窗體的程序中,Delphi默認是將它們在程序啟動時全部創建(只是都隱藏了,只顯示一個主窗體),這樣,那些暫時不必要啟動的窗體就占用了許多內存空間。所以我們需要在菜單Project|Options...的Forms標簽頁下,將那些暫時不要啟動的窗體從“Auto-create forms”下轉移到“Available forms”中。這樣,這些窗體的創建和釋放就需要代碼來實現了。
  A.兩種創建窗體方法之比較。對於這些非自動創建的窗體,我們必須在Show之前Creat(Self)或Create(Application),將其創建。如Form2.Creat(Self)和Form2.Create(Application),可是,它們兩個到底有什麼區別呢?其實兩者區別不大,
  但如果Owner是屬於別的窗口或控件的話,當它的Owner被釋放的時候,該Owner所擁有的也會被釋放。關鍵的區別是由誰來管理該窗體的資源。用第一種方法創建,該窗體的資源由編程者來負責管理;用第二種方法創建,該窗體的資源由Application來管理。

  B.幾種窗體的釋放方法。既然是為了節約內存,那麼用完了的窗體就應該“搬出”內存。在這裡我列舉幾個大同小異的方法:
  (1)
  procedure TForm1.Button1Click(Sender :TObject);
  begin
  ......
  if Form2 = nil then
    Form2:=TForm2.Create(Application);
  Form2.ShowModal;
  ......
  end;

  procedure TForm2.close(Sender: TObject; var Action: TCloseAction);
  begin
    ModalResult := mrNone;
    Action := caFree;
    Form2 := nil;
  end;
  (2)
  procedure TForm1.Button1Click(Sender :TObject);
  begin
    if not Assigned(Form2) then
    begin
      Application.CreateForm(TForm2,Form2);
      try
        Form2.ShowModal;
      finally
        Form2.Free;
        Form2 := nil;
      end;
    end
    else
      Form2.ShowModal;
  end;
  (3)
  procedure TForm2.Button1Click(Sender :TObject);
  begin
    Form2.Close;
    Form2.Release;
  end;

  
  ==控件使用篇==

  A.大名鼎鼎的RXLib控件包是由三位俄羅斯高手編寫的,非常的出色!不過,內容太多了,要用好也不容易。我在此拿RxRichEdit簡單地說幾點。
    •好多人都問RxLib怎麼安裝,似乎的確有點復雜,呵呵,所以我也順便說一下:
      運行rxinst.exe將RxLib先安裝到Program FilesBorlandDelphi5(或6)RX文件夾下,然後打開Delphi,選FileOpen...,將RXCTL5.DPK、RXDB5.DPK、RXBDE5.DPK分別打開後按compile,繼續打開:DCLRX5.DPK、DCLRXDB5.DPK和DCLRXBD5.DPK,將這三個分別按compile後按install就可以了:-)
    •AllowObjects屬性。Win98下默認設置為True,右鍵菜單沒有問題,但設為False時快捷菜單會連續出現兩次;Win2000下,設為True時會使右鍵菜單無法彈出,而False時卻顯示正常。所以,為了系統的兼容性,需要判斷當前OS版本:
  procedure TFormMain.FormCreate(Sender: TObject);
  var
    OSVI:OSVERSIONINFO;
  ......
  begin
    OSVI.dwOSVersionInfoSize:=sizeof(OSVERSIONINFO);
    GetVersionEx(OSVI);
    case OSVI.dwPlatformId of
      1:RxRichEdit1.AllowObjects:=true;
      2:RxRichEdit1.AllowObjects:=false;
    end;
  .......
  end;
  但我不知這個屬性為什麼會有這麼一個問題,還望高手指點。
    •OnURLClick事件。RXRichEdit有自動將網頁地址轉為超鏈接格式,但具體的行為還是要自己寫代碼的,不然這些地址就成了個空殼了:
  procedure TFormMain.RXRichEdit1URLClick(Sender: TObject; const URLText: String; Button: TMouseButton);
  begin
    if Button = mbLeft then
      ShellExecute(Handle, nil, PChar(URLText), nil, nil, SW_SHOW);
  end;

  B.為了節約內存,優化運行,我們總是動態創建組件。可當用完之後,如果不及時徹底的將其從內存中清理出去,那就有違我們的初衷了。可怎麼“殺死”所創建的組件? 比如創建了一個Edit控件,現在想讓它消失,但用Edit.Free後,調用Edit.Text卻仍然存在……我們知道,光Free是不行的,這只是將Edit所指向的內存空間釋放了,但是指針並沒有設定為nil,當調用Edit.Text時,Delphi仍然會根據Edit提供的指針訪問已經釋放的內存區域,所以會產生Access Violation ....錯誤。所以我們需要在Free後Edit:=nil或者FreeAndNil(只在Delphi5下有效)將指針nil掉,才能保證以後的正常運行。

  C.將各控件的提示文本顯示於狀態行上。這個可用Application的OnHint事件,但由於Application為不可件對象,因此可以采用如下方法:
  ......
    public
      procedure DisplayHint(Sender: TObject); //聲明一個方法用於顯示提示文本
    end;
  ......
  procedure TForm1.DisplayHint(Sender: TObject); //實現部分
  begin
    StatusBar1.SimpleText := GetLongHint(Application.Hint);
  end;

  procedure TForm1.FormCreate(Sender: TObject);
  begin
    Application.OnHint := DisplayHint;
  end;
  這樣顯示在狀態欄裡的文本和提示框(就是那個自動出現的黃色小框)裡的是一樣的。如果想要在狀態欄裡的提示文本更加詳細怎麼辦?其實,只要控件的Hint屬性這樣寫:MyHint|It's just a MyHint!,就可以讓“|”前的內容顯示在提示框(Help Hint box)裡,“|”的後面的內容顯示在狀態欄裡了。

  D.ListView使用中的一些要點。以下以一個兩列的ListVIEw為例。
    →增加一行:
  with ListVIEw1 do
    begin
      ListItem:=Items.Add;
      ListItem.Caption:='第一列內容';
      ListItem.SubItems.Add('第二列內容');
    end;
    →清空ListVIEw1:
  ListVIEw1.Items.Clear;
    →得到當前被選中行的行的行號以及刪除當前行:
  For i:=0 to ListVIEw1.Items.Count-1 Do
    If ListView1.Items[i].Selected then  //i=ListVIEw1.Selected.index
      begin
        ListVIEw1.Items.Delete(i);  //刪除當前選中行
      end;
  當然,ListVIEw有OnSelectItem事件,可以判斷選擇了哪行,用個全局變量把它賦值出來。
    →讀某行某列的操作:
  Edit1.Text := listvIEw1.Items[i].Caption;  //讀第i行第1列
  Edit2.Text := listvIEw1.Items[i].SubItems.strings[0];  //讀第i行第2列
  Edit3.Text := listvIEw1.Items[i].SubItems.strings[1];  //讀第i行第3列
  以次類推,可以用循環讀出整列。
    →將焦點上移一行:
  For i:=0 to ListVIEw1.Items.Count-1 Do
    If (ListVIEw1.Items[i].Selected) and (i>0) then
      begin
        ListVIEw1.SetFocus;
        ListVIEw1.Items.Item[i-1].Selected := True;
      end;
  不過在Delphi6中,ListVIEw多了一個ItemIndex屬性,所以只要
  ListVIEw1.SetFocus;
  ListVIEw1.ItemIndex:=3;
  就能設定焦點了。

  
  ==其他==

    •為了優化軟件,使其精益求精,當用到數組時經常采用動態數組。在聲明時,如:A : array of string,然後在使用數組之前,SetLength(A,3)設置數組長度為3,即A[0],A[1],A[2],這樣就可以了。當需要擴大數組長度時,再一次:SecLength(A,5),那麼,就增加了A[3]和A[4],而前面的A[0],A[1],A[2]裡的值不會清空;同樣,如果SecLength(A,3)後再SecLength(A,1)的話,就只剩A[0]了,A[1]和A[2]自動被清除內存。注意:動態數組是從“0”開始的,所以SetLength(A,1)後High(A)=0的!!
      最後當不再用這個動態數組了,而程序還沒有要退出,那為了節省內存用:A:=nil來釋放掉這個數組,這下真正達到了“綠色環保”:)

    •“怎麼獲取當前程序運行的路徑”這個問題經常能夠在論壇上看到。的確,這個函數在編程中不時的要用到的。其實有好幾個函數都能達到這個效果:
  →GetCurrentDirectory():WinAPI函數,具體用法如下:
          var
            MyCurrentDir:Array[0..144] of Char; //存儲當前絕對路徑
          begin
            GetCurrentDirectory(SizeOf(MyCurrentDir),MyCurrentDir); //取得當前絕對路徑,最後得到的格式如:C:WindowsSYSTEM
            MyCurrentDir:=MyCurrentDir+'MySoftName.exe';
          end;
  →GetCurrentDir():GetCurrentDirectory經過Delphi封裝後的一個函數,用法簡單:MyCurrentDir:=GetCurrentDir。最後得到的格式如:C:WindowsSYSTEM
      還有就是可以直接得到路徑的函數:ExtractFilePath(ParamStr(0))、ExtractFilePath(Application.exename)等。

    •系統的關機、重新啟動等操作的消息。這也是一個常有人問的問題,在此我也順便在提一下:
  關機:ExitWindowsEx(EWX_SHUTDOWN,32);
  重新啟動:ExitWindowsEx(EWX_REBOOT,32);
  注銷:ExitWindowsEx(EWX_LOGOFF,32);
  關閉電源:ExitWindowsEx(EWX_POWEROFF,32);

    •在Delphi中,除了使用#39外,要在程序中(如ShowMessage中)顯示“單個單引號”要如何處理?'''和'''''都會出現編譯錯誤。其實,是四個單引號表示一個單引號,也就是是 '''',第二個和第三表明這是一個“'”,第一個和第四個是表明這是一個字符型。呵呵,很有趣哦:)

    •ShowMessage中的漢化問題。ShowMessage中的按鈕都是E文的,讓人很不舒服。其實經過我們的一番DIY,也能把它們都弄成中文的。
      首先要保存當前的工程,然後選Project|Languages|Add...,出現Add Language對話框,選擇你要漢化的工程(也可以自定義文件夾),Next;選最後一項“中文(中國)”,Next;Next;Next;Finish;OK;然後就出現了Translation Manager對話框,在左邊選“中文(中國)|Resource Scripts|Projet1_DRC(這個具體要看你的工程文件名)”,然後右邊的列表裡找到“Const_SMsgDlgOK”項,將其的“中文(中國)(translated)”格改為“確定”(原為OK),保存後退出。這下,再運行一下程序,哈哈,是不是就是中文按鈕啦!
      不過,ShowMessage這種類型的信息對話框非常簡單了,可以在系統調試期間顯示給開發人員一些過程信息。但由於過於簡單,所以我建議在軟件的正式版中不要使用這樣的對話框。而且,最好用MessageBox代替ShowMessage以減小軟件的體積,例如,同樣一個DLL文件,采用MessageBox 編譯後的DLL文件大小為58K,而ShowMessage後就變成了301K!!

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved