Delphi TDBGrid复制行
我正在将一些软件从Delphi5转换为Delphi10.2 我们有一个TDBGrid,它链接到一个数据源,该数据源链接到一个表。 比如说:Delphi TDBGrid复制行,delphi,Delphi,我正在将一些软件从Delphi5转换为Delphi10.2 我们有一个TDBGrid,它链接到一个数据源,该数据源链接到一个表。 比如说: TDBGrid.DataSource := GroupDS; GroupDS.DataSet := MemoryTable; 记忆表中有一条记录。然而,无论我尝试了什么,TDBGrid都在复制单个记录。这种行为只发生在D10.2中。在D5中,它正常显示单个记录。我可以调用表上的RecordCount并验证其中只有一条记录 请让我知道,如果有任何其他信息,我
TDBGrid.DataSource := GroupDS;
GroupDS.DataSet := MemoryTable;
记忆表中有一条记录。然而,无论我尝试了什么,TDBGrid都在复制单个记录。这种行为只发生在D10.2中。在D5中,它正常显示单个记录。我可以调用表上的RecordCount并验证其中只有一条记录
请让我知道,如果有任何其他信息,我可以提供。这一切都发生在VCL的东西,所以没有太多的代码显示。我不知道在IDE发布的20年间是否有什么变化
我编写了一个测试应用程序来重新创建此问题
代码:
dfm:
对象格式1:t格式1
左=0
Top=0
标题='Form1'
ClientHeight=336
ClientWidth=635
颜色=clBtnFace
Font.Charset=默认字符集
Font.Color=clWindowText
字体高度=-11
Font.Name='Tahoma'
Font.Style=[]
OldCreateOrder=False
OnCreate=FormCreate
PixelsPerInch=96
text高度=13
对象DBGrid1:TDBGrid
左=144
Top=96
宽度=225
高度=121
选项=[dgTitles、dgColumnResize、dgColLines、dgRowLines、dgTabs、dgRowSelect、dgAlwaysShowSelection、dgConfirmDelete、dgCancelOnExit]
TabOrder=0
TitleFont.Charset=默认字符集
TitleFont.Color=clWindowText
标题字体高度=-11
TitleFont.Name='Tahoma'
TitleFont.Style=[]
列=<
项目
扩展=错误
FieldName='GroupName'
Title.Caption='组成员'
宽度=191
可见=真
结束>
终止
对象EmpGrpMemberDS:TDataSource
左=488
顶部=216
终止
终止
我仍然得到同样的结果。我的dbgrid最后显示4个“www”,它应该只显示1个。我在表上做了一个.recordcount,它只显示了一条记录。下面的最小示例项目实际上完全复制了您的项目,除了 它使用TClientDataSet作为数据集,而不是AddAim数据集 它只正确地显示一行。因此,问题在于使用 默契的。所以,除非你运气好,这里有人认出 如果你知道如何解决这个问题,你需要用AddAim解决这个问题 代码: 当然,如果您可以通过修改上述项目来复制您的问题,那么 可能是值得研究的事情 更新要调试您的问题,请为网格的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
的状态应该会告诉您为什么要显示两次行。EmpGrpMember的数据类型是什么,以及该q与您最近使用的相同标题的q有何不同?EmpGrpMember是一个默认值。很好地强制转换到TDataset。TClientDataset或任何其他数据集是否也存在此问题?问题可能在组件中。像TDBGrid这样的组件可能甚至不会询问记录计数,而是只请求下一条记录,直到数据集报告它的Eof。也许这有点问题…好的,谢谢。不幸的是,我们不得不使用Aidam的图书馆。。而且他们还提供几乎0的支持。我将尝试使用此测试应用程序,看看是否可以重新创建问题。现在,您知道问题毫无疑问地存在于AddAim组件中,如果您有源代码,至少可以调试它,并且知道是否可以跟踪原因,您可以修复它。请参阅关于使用Tartable调试行为的更新。@D.D有一种很好的方法可以反转通过显示缺陷,“我们必须使用”到“我们不能使用”。无论是谁负责,都应该意识到这一缺陷,我相信一个通情达理的人(令人惊讶的是,大多数人都是通情达理的)会改变库。但也要记住,一些组件制造商可能会选择只支持最新的Delphi版本。
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
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;