Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/delphi/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Delphi TDBGrid复制行_Delphi - Fatal编程技术网

Delphi TDBGrid复制行

Delphi TDBGrid复制行,delphi,Delphi,我正在将一些软件从Delphi5转换为Delphi10.2 我们有一个TDBGrid,它链接到一个数据源,该数据源链接到一个表。 比如说: TDBGrid.DataSource := GroupDS; GroupDS.DataSet := MemoryTable; 记忆表中有一条记录。然而,无论我尝试了什么,TDBGrid都在复制单个记录。这种行为只发生在D10.2中。在D5中,它正常显示单个记录。我可以调用表上的RecordCount并验证其中只有一条记录 请让我知道,如果有任何其他信息,我

我正在将一些软件从Delphi5转换为Delphi10.2

我们有一个TDBGrid,它链接到一个数据源,该数据源链接到一个表。 比如说:

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;