Минимальный пример проекта, приведенный ниже, практически точно копирует ваш проект, за исключением того, что он использует 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;
Конечно, если вы можете повторить свою проблему, изменив вышеупомянутый проект, возможно, есть кое-что, на что стоит обратить внимание.
Обновление Чтобы отладить вашу проблему, установите обработчик для события DrawCell сетки, например,
procedure TForm1.DBGrid1DrawColumnCell(Sender: TObject; const Rect: TRect;
DataCol: Integer; Column: TColumn; State: TGridDrawState);
begin
DataCol := DataCol;
end;
Установите в нем точку останова. Когда точка останова сработает, вы обнаружите, что при трассировке источника VCL от него вы в конечном итоге получите цикл while
внутри процедуры DrawCells
в Grids.Pas. Проверка состояния while
должна показать вам, почему вы получаете строку, отображаемую дважды.
Я нашел, использовал ли я self.navigationItem.title = 'Blah';
вместо self.title
, это работало бы.