3

ClientDataSets とローカル ファイル ストレージを使用するアプリがあります。一部の情報は DB グリッドに表示され、途切れていることがわかりました。文字列の最初の 500 文字程度が表示されましたが、基になるフィールドを長くする必要がありました。そこで、コードに戻り、基礎となる FieldDefs のサイズと表示幅を増やしました。新しいデータセットも作成しました (設計時)。最後に、アプリケーションを実行し、新しいデータベースを作成しました。それでも、500 文字までしか表示されませんでした。

フィールドの長さを制限している原因を確認するには、どこを見ればよいですか?

4

1 に答える 1

4

TDBGrid500 文字を表示する列は通常の画面幅よりも広いため、列幅の内部制限に達しているのではないかと思います。(VCL ソースを調べたい場合は、これをチェックしてください。 から始めてGrids.pasください。)

通常、 はTDBGrid1 つの列に多くのテキストを表示しません。これはユーザーによる大量のスクロールにつながり、幅の広いテキストを読むための水平スクロールはほとんどの人にとって非常に煩わしいものです。

これを行う通常の方法はftMemo、実質的に無制限のテキスト コンテンツを含めることができる type フィールドを使用することです。列が に割り当てられているTDBGrid場合、グリッド列には が表示され(MEMO)、アプリケーションは列のクリックまたはダブルクリックを処理して、 付きのセカンダリ フォームを表示するTEditTRichEdit、列の内容全体を表示/編集します。

オブジェクトインスペクタで使用して、次の列が定義された名前付きのTDBGridにアタッチされた例を次に示します (役に立ちませんが、例です) 。TClientDataSetCDSCDS.FieldDefs

Column      Persistent Name    FieldType    Size
------      ---------------    ---------    ----
ID          CDSID              ftInteger     0
Name        CDSName            ftString     25
Notes       CDSNotes           ftMemo        0

基になるデータセットが存在しないため、 を割り当て、FileName次のコードを使用して実行時に作成します。

procedure TForm1.FormCreate(Sender: TObject);
begin
  if not FileExists(CDS.FileName) then
  begin
    CDS.CreateDataSet;
    CDS.Active := True;
    CDS.InsertRecord([1, 'John Smith', 'This is some longer text'#13'for testing.']);
    CDS.InsertRecord([2, 'Fred Jones', 'A note about Fred goes'#13'here for now.']);
    CDS.Active := False;
  end;
  CDS.Active := True;
end;

TDataSourceフォームに a を置き、に設定DataSourceCDSます。を追加しTDBGrid、 に設定しDataSetましたDataSource1

オブジェクト インスペクタで を選択しTDBGrid、[イベント] タブに移動して、イベントに次を追加しますOnCellClick(もちろん、表示のためだけです)。

procedure TForm1.DBGrid1CellClick(Column: TColumn);
begin
  if Column.FieldName := 'CDSNotes' then
    ShowMessage(Column.Field.AsString); // Display other form here instead
end;

CDSNotesの行 1 の列をクリックした後の表示は次のTDBGridとおりです。

ここに画像の説明を入力

で長いテキスト列の部分的なコンテンツを表示する必要がある場合TDBGridは、次のようなものを使用できます。

procedure TForm2.CDSNotesGetText(Sender: TField; var Text: string;
  DisplayText: Boolean);
begin
  // Again, a trivial example using an arbitrary chunk of the first 20
  // characters just for demo purposes.
  if DisplayText then
    Text := Copy(Sender.AsString, 1, 20)
  else
    // Not for display only; return all the text.
    Text := Sender.AsString;
end;

上記のサンプル アプリでこれを行うと、表示が次のように変わります。

ここに画像の説明を入力

于 2012-05-11T00:01:46.990 に答える