Delphi 具有行高变量的DBGRID

Delphi 具有行高变量的DBGRID,delphi,delphi-xe,Delphi,Delphi Xe,我想在DBGRID中显示如下: 设想“网格”如下所示: ID-描述 1-网格的第1行 2-网格的第2行 3-网格的第3行 现在,假设描述列的大小已更改,并且不再显示单词“GRID” 我也想留下来 ID-描述 1-文件的第1行 网格 2-第2行的 网格 3-第3行的 网格 有没有可能???不是你所要求的,但可能有帮助。。。我曾经使用此代码在标准DBGrid中显示完整的备注字段: TMyForm = class(TForm) ... private FormMemoRect:

我想在DBGRID中显示如下:

设想“网格”如下所示:

ID-描述

1-网格的第1行
2-网格的第2行
3-网格的第3行

现在,假设描述列的大小已更改,并且不再显示单词“GRID”

我也想留下来

ID-描述

1-文件的第1行
网格
2-第2行的
网格
3-第3行的
网格

有没有可能???

不是你所要求的,但可能有帮助。。。我曾经使用此代码在标准DBGrid中显示完整的备注字段:

  TMyForm = class(TForm)
    ...
  private
    FormMemoRect: TRect;
    MemoGrid: TDBGrid;
    BMemo: TBitBtn;
    ...

Procedure TMyForm.FormMemoDeactivate(Sender: TObject);
Begin
    (Sender As TForm).Close;
    Sender.Free;
End;

Procedure TMyForm.BMemoClick(Sender: TObject);
Var FormMemo: TForm;
Begin
    MemoGrid.SetFocus;

    FormMemo := TForm.Create(Self);
    With TMemo.Create(FormMemo) Do Begin
        Parent := FormMemo;
        Align := alClient;
        ReadOnly := True;
        WordWrap := True;
        ScrollBars := ssVertical;
        Lines.Text := MemoGrid.DataSource.DataSet.Fields[TComponent(Sender).Tag].AsString;
    End;

    With FormMemo Do Begin
        OnDeactivate := FormMemoDeactivate;
        Left := FormMemoRect.Left;
        Top := FormMemoRect.Top;
        Width := Max(FormMemoRect.Right - FormMemoRect.Left, 300);
        Height := FormMemoRect.Bottom - FormMemoRect.Top;
        BorderStyle := bsNone;

        Show;
    End;
End;

Procedure TMyForm.GrdMemoDrawColumnCell(Sender: TObject; Const Rect: TRect; DataCol: Integer; Column: TColumn; State: TGridDrawState);
Begin
    If (gdFocused In State) Then Begin
        If Column.Field.DataType In [ftBlob, ftMemo] Then Begin
            {Desenha botão para visualização do Memo}
            FormMemoRect.Left := TWinControl(Sender).ClientToScreen(Rect.TopLeft).X;
            FormMemoRect.Right := TWinControl(Sender).ClientToScreen(Rect.BottomRight).X;
            FormMemoRect.Top := TWinControl(Sender).ClientToScreen(Rect.BottomRight).Y;
            FormMemoRect.Bottom := FormMemoRect.Top + 100;

            If Not Assigned(BMemo) Then
                BMemo := TBitBtn.Create(Self);
            BMemo.Parent := TWinControl(Sender).Parent;
            BMemo.Width := 16;
            BMemo.Height := 16;
            BMemo.Caption := '...';
            BMemo.OnClick := BMemoClick;
            BMemo.Tag := Column.Field.Index;
            BMemo.Left := TWinControl(Sender).Left + Rect.Right - BMemo.Width + 1;
            BMemo.Top := TWinControl(Sender).Top + Rect.Top + 2;

            MemoGrid := TDBGrid(Sender);
        End
        Else
            FreeAndNil(BMemo);
    End;
End;
对于Blob/Memo字段,您可能还发现执行一些自定义GetText以直接在网格中显示某些内容非常有用:

Procedure TMyForm.DataSetMemoGetText(Sender: TField; var Text: String; DisplayText: Boolean);
Begin
    Text := Copy(Sender.AsString, 1, 50);

    If Text <> Sender.AsString Then
        Text := Text + '...';
End;
Procedure TMyForm.datasetmemogetext(发送方:TField;变量文本:String;显示文本:Boolean);
开始
Text:=副本(Sender.AsString,1,50);
如果是Text Sender.AsString,则
文本:=文本+“…”;
结束;
这就是结果的样子。


PS:很抱歉使用了非标准的代码样式。

那么您要求的是在db网格中对单元格进行文字包装?您是否希望不同的行自动具有不同的高度?或者为所有行设置一个属性?我需要自动具有不同高度的行。。使用这个[link]()不能直接应用于DB网格。您必须获得该库或类似库,或者推出自己的自定义网格控件。尽管我建议不要使用DB网格——数据感知控件虽然很容易让东西工作,但在这样的领域会变得更加困难——而且工作方式也过时了。您最好只使用一个标准的网格,它可以有可变的行大小,并手动将数据输入其中(从这个意义上说,您似乎有很多定制要做)。这个示例只是说明性的。我真正需要的是换行并显示文本。[链接]但我将尝试使用stringgrid组件…Fwiw,devexpress tcxGrid可以在绑定(DB感知)和未绑定模式下使用。它的主要缺点(除了devex VCL库的大小)是成本。