【问题标题】:What properties determine ClientDataSet field sizes?哪些属性决定了 ClientDataSet 字段的大小?
【发布时间】:2012-05-10 20:43:35
【问题描述】:

我有一个使用 ClientDataSets 和本地文件存储的应用程序。一些信息显示在数据库网格中,我发现它被截断了——显示了字符串的前 500 个字符左右,但基础字段需要更长。所以我回到我的代码并增加了底层 FieldDef 的大小以及它们的显示宽度。我还创建了一个新数据集(在设计时)。最后,我运行了应用程序,并创建了一个新数据库。然而,只显示了大约 500 个字符。

我应该在哪里查看限制我的字段长度的因素?

【问题讨论】:

  • 字段大小(字符串字段类型的最大字符数)存储在TField.Size中,所以首先建议你检查这个值。
  • 您希望如何在 DBGrid 中显示 500 个或更多字符? (您能说主要滚动问题吗?我看到您的用户未来会出现重复性压力伤害。)执行此操作的典型方法是显示部分文本,并允许用户双击阅读其余部分;当他们这样做时,您会打开一个带有 TMemo 或 TRichEdit 或其他控件的辅助窗口,以可读格式显示整个文本。
  • @Ken,对您的评论 +1(我希望在答案中看到这一点 ;-)。我讨厌网格列试图从当前位置自动调整超过一页滚动的大小。不手动拖动滚动条就无法阅读内容,因此我更喜欢提示窗口或通过双击显示其余内容。
  • @Ken,乍一看似乎很奇怪,但网格只有两列,文本是 9 或 10 pt。很少编辑长 TStringField 条目。 UI 的视觉外观类似于文字处理器中的表格。我在csulb.edu/~acolburn/screenshot.doc 发布了部分截图
  • @AlC,TDBGrid 对你的 UI 来说是个糟糕的选择(就像你选择 Word 文档来发布示例屏幕截图一样 )。您可能会查看TVirtualStringTree,它具有您似乎需要的功能,或者是TDBGrid 的替代品,如ExpressQuantumGridTDBGrid 对此的支持并不是开箱即用的。

标签: delphi tclientdataset


【解决方案1】:

我怀疑您遇到了TDBGrid 列宽的内部限制,因为显示 500 个字符的列将超过典型的屏幕宽度。 (如果您想浏览 VCL 源代码,可以检查此项;以 Grids.pas 开头。)

通常,TDBGrid 不会在单个列中显示大量文本。它会导致用户大量滚动,而水平滚动阅读宽文本对大多数人来说非常烦人。

执行此操作的常用方法是使用ftMemo 类型字段,它可以包含几乎无限的文本内容。当列分配给TDBGrid 时,网格列显示(MEMO),应用程序处理单击或双击列以显示带有TEditTRichEdit 的辅助表单以显示/编辑专栏的全部内容。

下面是一个TDBGrid 示例,它附加到名为CDSTClientDataSet,并在对象检查器中使用CDS.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,并将它的DataSource 设置为CDS。我添加了一个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;

这是点击TDBGrid第1行的CDSNotes列后的显示:

如果您必须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;

对上面的示例应用程序执行此操作会将显示更改为:

【讨论】:

    猜你喜欢
    • 2021-09-23
    • 1970-01-01
    • 1970-01-01
    • 2012-12-28
    • 1970-01-01
    • 2011-08-02
    相关资源
    最近更新 更多