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,體驗一下吧。