Lazarus と SQLdb コンポーネントを使用して単純な SQLite 3 アプリケーションを作成しようとしています。
データベースに接続して、TDBGrid
. 問題は、テキスト フィールドであるすべての列に、DB 内の文字列ではなく値 "(MEMO)" が表示されることです。
このソースは忘れましたが、これは tdbgrid のメモ フィールドで行っていることです。gettext イベントについては blueish が正しいです。これをコードに実装する方法は次のとおりです。
MemoDifier というクラスを作成します。
MemoDifier = class
public
procedure DBGridOnGetText(Sender: TField; var aText: string;
DisplayText: boolean);
end;
コードの実装セクションに、次のように記述します。
procedure MemoDifier.DBGridOnGetText(Sender: TField; var aText: string;
DisplayText: boolean);
begin
if (DisplayText) then
aText := Sender.AsString;
end;
次に、フォームの tdbgrid コントロールをクリックし、オブジェクト インスペクター(Lazarus IDE) で [イベント] タブをクリックし、下にスクロールして OnPrepareCanvas イベントを見つけます。ダブルクリックしてコードを生成します。次に、tdbgrid コントロールの名前など、ニーズに合わせてコードを変更します。
procedure Tmainui.TDBGrid1PrepareCanvas(sender: TObject;
DataCol: Integer; Column: TColumn; AState: TGridDrawState);
var
MemoFieldReveal: MemoDifier;
begin
if (DataCol = 1) then
begin
try
TDBGrid1.Columns.Items[0].Field.OnGetText := @MemoFieldReveal.DBGridOnGetText;
TDBGrid1.Columns.Items[1].Field.OnGetText := @MemoFieldReveal.DBGridOnGetText;
TDBGrid1.Columns.Items[2].Field.OnGetText := @MemoFieldReveal.DBGridOnGetText;
except
On E: Exception do
begin
ShowMessage('Exception caught : ' + E.Message);
end;
end;
end;
end;
変数 MemoFieldReveal はクラス MemoDifier を指します。(MEMO) テキストを表示する tdbgrid 項目/フィールドのインデックス番号を指すようにインデックス (Items[x]) を変更することを忘れないでください。
メモ欄は では表示できませんTDBGrid
。フォームに追加TDBMemo
して、同じ に接続しTDataSource
ます。この場合、メモにテキストが表示されます。
IRC で述べたように、クエリのフィールドをフォームに追加して (「フィールド」コンポーネントが生成されるように)、TMemoField.GetText
イベントを実装する必要があります。
オブジェクト インスペクタに「fields」フィールドを入力すると、コンポーネントを生成するエディタが表示されるかどうかを確認します (Zeos iirc ではそうします)。
この記事では解決策を示します: Delphi の TDBGrid で MEMO フィールドを表示および編集します。
ここで私はあなたがしなければならないことを要約します:
OnGetText = MyDataSetMyFieldGetText
の ) に追加します (たとえば、ここでは という名前の a )TMemoField
MyField
TTable
MyDataSet
.pas > interface
> type
> フォーム定義内に、追加します
procedure MyDataSetMyFieldGetText(Sender: TField; var Text: string; DisplayText: Boolean);
.pas > implementation
> このメソッドを追加します
procedure TDM.WorkVisiteNoteGetText(Sender: TField; var Text: string; DisplayText: Boolean);
begin
Text := Copy(WorkVisiteNote.AsString, 1, 100);
end;