gpt4 book ai didi

delphi - TDBGrid 重复行

转载 作者:行者123 更新时间:2023-12-02 00:38:32 26 4
gpt4 key购买 nike

我正在将一些软件从 Delphi 5 转换为 Delphi 10.2。

我们有一个 TDBGrid,它链接到一个数据源,该数据源又链接到一个表。所以像这样:

TDBGrid.DataSource := GroupDS;
GroupDS.DataSet := MemoryTable;

MemoryTable 有 1 条记录。但是,无论我尝试什么,TDBGrid 都会复制单个记录。此行为仅发生在 D10.2 中。在D5中正常显示单条记录。我可以在表上调用 RecordCount 并验证其中仅存在 1 条记录。

如果我可以提供任何其他信息,请告诉我。这一切都发生在 VCL 中,因此没有太多代码可以显示。我不知道 IDE 发布的 20 年间是否发生了一些变化。

我编写了一个测试应用程序来重现此问题。

代码:

EmpGrpMember := InitializeACRTable;

EmpGrpMember.InMemory := True;
EmpGrpMember.IndexDefs.Add('GroupGUID', 'GroupGUID', [ixPrimary, ixUnique]);
EmpGrpMember.IndexDefs.Add('GroupName', 'GroupName', [ixUnique]);
EmpGrpMember.IndexName := 'GroupName';
EmpGrpMember.FieldDefs.Add('GroupGUID', ftString, 40);
EmpGrpMember.FieldDefs.Add('GroupName', ftString, 100);
EmpGrpMember.TableName := 'EmpGrpMember';

EmpGrpMemberDS.DataSet := EmpGrpMember;
DBGrid1.DataSource := EmpGrpMemberDS;
EmpGrpMember.Open;
EmpGrpMember.Insert;
EmpGrpMember.FieldByName('GroupGUID').AsString := '123';
EmpGrpMember.FieldByName('GroupName').AsString := 'wwww';
EmpGrpMember.Post;

dfm:

object Form1: TForm1
Left = 0
Top = 0
Caption = 'Form1'
ClientHeight = 336
ClientWidth = 635
Color = clBtnFace
Font.Charset = DEFAULT_CHARSET
Font.Color = clWindowText
Font.Height = -11
Font.Name = 'Tahoma'
Font.Style = []
OldCreateOrder = False
OnCreate = FormCreate
PixelsPerInch = 96
TextHeight = 13
object DBGrid1: TDBGrid
Left = 144
Top = 96
Width = 225
Height = 121
Options = [dgTitles, dgColumnResize, dgColLines, dgRowLines, dgTabs, dgRowSelect, dgAlwaysShowSelection, dgConfirmDelete, dgCancelOnExit]
TabOrder = 0
TitleFont.Charset = DEFAULT_CHARSET
TitleFont.Color = clWindowText
TitleFont.Height = -11
TitleFont.Name = 'Tahoma'
TitleFont.Style = []
Columns = <
item
Expanded = False
FieldName = 'GroupName'
Title.Caption = 'Member of Groups'
Width = 191
Visible = True
end>
end
object EmpGrpMemberDS: TDataSource
Left = 488
Top = 216
end
end

我仍然得到相同的结果。我的 dbgrid 最终显示 4 个“www”,而它应该只显示 1 个。我在表上执行了 .recordcount,它只显示 1 条记录。

最佳答案

下面的最小示例项目几乎完全复制了您的项目,除了它使用 TClientDataSet 作为数据集而不是 AddAim。

它仅正确显示一行。因此问题出在使用上TACR 表的。所以,除非你很幸运并且这里有人认识到问题并且知道如何解决它,您需要使用 AddAim 解决问题。

代码:

  type
TForm1 = class(TForm)
DataSource1: TDataSource;
DBGrid1: TDBGrid;
EmpGrpMember: TClientDataSet;
procedure FormCreate(Sender: TObject);
public
end;

[...]
procedure TForm1.FormCreate(Sender: TObject);
var
AField : TField;
begin
AField := TStringField.Create(Self);
AField.FieldKind := fkData;
AField.FieldName := 'GroupGUID';
AField.Size := 255;
AField.DataSet := EmpGrpMember;

AField := TStringField.Create(Self);
AField.FieldKind := fkData;
AField.Size := 255;
AField.FieldName := 'GroupName';
AField.DataSet := EmpGrpMember;

EmpGrpMember.IndexDefs.Add('GroupGUID', 'GroupGUID', [ixPrimary, ixUnique]);
EmpGrpMember.IndexDefs.Add('GroupName', 'GroupName', [ixUnique]);
EmpGrpMember.IndexName := 'GroupName';

EmpGrpMember.CreateDataSet;
EmpGrpMember.InsertRecord(['123', 'www']);

end;

当然,如果你可以通过修改上面的项目来复制你的问题,那就有可能是值得研究的事情。

更新要调试您的问题,请为网格的 DrawCell 事件设置一个处理程序,如下所示

procedure TForm1.DBGrid1DrawColumnCell(Sender: TObject; const Rect: TRect;
DataCol: Integer; Column: TColumn; State: TGridDrawState);
begin
DataCol := DataCol;
end;

在其中放置一个断点。当断点触发时,您应该发现从它跟踪到 VCL 源代码,您最终会到达 Grids.Pas 中 DrawCells 过程内的 while 循环。检查 while 的条件应该会告诉您为什么该行显示两次。

关于delphi - TDBGrid 重复行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55228364/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com