Delphi之所以能在.Net與Java“兩座大山”重壓之下,至今仍被廣大編程愛好者喜愛、支持,究其原因,除了VCL框架設計精妙之外,強大的數據庫程序開發能力也是其長盛不衰的關鍵因素之一。說到數據庫開發不能不提到Delphi中自帶的功能強勁的數據感知組件,這些組件中最為常用的當屬DBGrid組件,這個組件提供了二維表的數據顯示方式,一次提供的信息量大、結構鮮明、一目了然。雖然它有這麼多優點,然而“沒有銀彈”(其大意為沒有一種形式可以解決所有的問題)這句IT界中人所共知的箴言又開始應驗了,它有不少缺點,其中一個就是:當你開發一個數據庫應用程序時,如果所用的數據表中帶有MEMO(備注類型)的字段,你會注意到,在DBGrid的缺省顯示方式下,這種類型的字段將顯示成“(MEMO)”的形式(如圖1所示)。MEMO字段類型中數據表中的主要功能是存放相對比較大數量的文本或是文本與數字的結合,在大多數數據庫中這種類型的數據有規定的數量上的限定。
只能顯示“(MEMO)”這種形式顯然不能夠滿足用戶的需要,為了能夠使得數據被實際顯示出來,我們需要寫一些代碼,對DBGrid做一點功能上的增強。首先,我們要先在數據庫中建立一張表,命名為TestTable,這張表中至少要有一個MEMO類型的字段,把它命名為Data。然後我們來給字段的OnGetText事件寫一段代碼實現上面的需求。操作步驟如下:
1. 把你的TDataset組件與剛才新建的數據庫中的TestTable表相連接。
2. 雙擊TDataset組件來打開字段編輯器(FIElds editor)。
3. 添加MEMO字段Data.
4. 選中該字段,在對象檢查器中(Object Inspector)雙擊OnGetText事件建立事件句柄。
編寫代碼如下:
procedure TForm1.DBTableDataGetText(Sender: TFIEld;
var Text: String;
DisplayText: Boolean);
begin
Text := Copy(DBTableData.AsString, 1, 50);
end;
TDataset對象的名字是“DBTable”,MEMO字段的名字是“Data”,因此缺省情況下連接到MEMO字段的TMEMOFIEld名字是“DBTableData”。我們在代碼中告訴DBGrid將MEMO字段顯示成文本方式,就是把實際的內容顯示出來。這裡有一個值得注意的地方,因為MEMO字段可以容納比較多的文本,在DBGrid中全部顯示出來的話,DBGrid就會被撐得很大,所以我們做了限制,只是把MEMO中的前50個字符顯示出來。(如圖2)
顯示的工作完成之後,我們還想對顯示出來的文本進行編輯,這在缺省狀態下是不可以實現的,我們准備另建一個窗體,在上面放置一個DBMemo組件,用它來對文本進行編輯,思考到這裡還有一個需要解決的問題,如何來觸發一次編輯過程呢?就用鍵盤的回車鍵吧,當記錄指針指向這條記錄時,按下回車鍵,則彈出一個窗體,上面的DBMemo組件可以顯示並且編輯文本。實現代碼如下:
procedure TForm1.DBGrid1KeyDown(
Sender: TObject;
var Key: Word;
Shift: TShiftState);
begin
//如果按下的是回車鍵則觸發下面的代碼
if Key = VK_RETURN then
begin
if DBGrid1.SelectedFIEld = DBTableData then
//建立新的窗體
with TMemoEditorForm.Create(nil) do
try
//讀取數據庫中的數據用DBMemo來顯示
DBMemoEditor.Text := DBTableData.AsString;
ShowModal;
DBTable.Edit;
DBTableData.AsString := DBMemoEditor.Text;
finally
Free;
end;
end;
end;
上面的步驟實現之後,實際的程序運行效果是這樣的(如圖3)。
動動你的腦筋、理清思路、列出算法,很多知名軟件中的很酷功能我們都能夠來實現,各位讀者月友,打開Delphi,體驗一下吧。