我正在转换一些软件从德尔菲5到德尔福10.2。
我们有一个链接到数据源的TDBGrid,该数据源是一个表的链接。所以就像这样:
TDBGrid.DataSource := GroupDS;
GroupDS.DataSet := MemoryTable;MemoryTable中有1条记录。然而,无论我尝试了什么,TDBGrid都是在复制单个记录。这种行为只发生在D10.2中。在D5中,它通常显示单个记录。我可以调用表上的RecordCount并验证其中只有1条记录。
如果我能提供任何其他信息,请告诉我。这一切都发生在VCL的东西,所以没有太多的代码显示。我不知道在发行IDEs的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,它只显示了一个记录。
发布于 2019-03-18 19:28:35
下面的最小示例项目实际上完全复制了您的项目,只不过它使用TClientDataSet作为数据集而不是AddAim数据集。
它只正确地显示了一行。因此,问题在于TACRTable的使用。因此,除非您运气好,并且这里的人认识到了这个问题并知道如何解决它,否则您需要使用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;当然,如果您可以通过修改上面的项目来复制您的问题,那么可能会有一些值得研究的地方。
要调试问题,请为网格的事件设置一个处理程序,如下所示
procedure TForm1.DBGrid1DrawColumnCell(Sender: TObject; const Rect: TRect;
DataCol: Integer; Column: TColumn; State: TGridDrawState);
begin
DataCol := DataCol;
end;在里面放个断点。当断点运行时,您会发现从它跟踪到VCL源,最终会在while过程中到达Grids.Pas过程中的一个Grids.Pas循环。检查while的条件应该会显示为什么要显示两次行。
https://stackoverflow.com/questions/55228364
复制相似问题