FMX.TGrid, как позволить пользователю перемещать столбцы, не путая данные

Я сделал очень простой тест-проект в Delphi 10.2 с использованием FMX. Настройка проста:

  • TGrid, который привязан к TClientDataSet (сделано в дизайнере).
  • кнопка, которая позволяет пользователю открыть файл XML

Все это прекрасно работает, и TGrid заполняется всеми записями из XML-файла. Файл XML создается другим TClientDataSet из более старого проекта.

Теперь о проблеме.
Когда я перемещаю столбец в другую позицию, все данные портятся. Я делаю это, просто удерживая мышь на столбце, а затем перетаскивая его на несколько столбцов вправо.
Сначала это выглядит хорошо, но когда вы начинаете прокручивать по вертикали, кажется, что данные больше не находятся в правильных столбцах.
У меня такое ощущение, что он только корректирует данные в визуальной части сетки, и как только вы начинаете прокручивать данные, они больше не попадают в правильные столбцы.

Это известная ошибка или что-то не так с моим проектом.
Как я уже говорил, в этом проекте нет абсолютно никакого кода, все сделано в конструкторе. (за исключением клиента clientdataset1.LoadFromFile)

2 ответа

Решение

Это исправило это для меня. Я просто перемещаю поля, которые были перемещены в сетке также в ClientDataSet, и до сих пор, кажется, это работает.

procedure TForm1.Grid1ColumnMoved(Column: TColumn; FromIndex, ToIndex: Integer);
var
  FieldFrom : string;
  FieldTo   : string;
begin
  FieldFrom := Grid1.ColumnByIndex(FromIndex).Header;
  FieldTo   := Grid1.ColumnByIndex(ToIndex).Header;

  ClientDataSet1.FieldByName(FieldFrom).Index := FromIndex;
  ClientDataSet1.FieldByName(FieldTo).Index   := ToIndex;
end;

Но я просто хотел бы, чтобы был лучший способ узнать из TColumn, какое имя поля задействовано. Похоже, самая важная информация отсутствует в этом классе.

Вы можете попробовать заполнить ваши данные вручную (Grid: TGrid; CDS: TClientDataSet):

procedure TForm1.FormCreate(Sender: TObject);
var
  I: Integer;
  Col: TColumn;
begin
  CDS.Active := True;
  for I := 0 to CDS.FieldDefs.Count - 1 do begin
    Col := TColumn.Create(Grid);
    Grid.AddObject(Col);
    Col.Header := CDS.FieldDefs[I].Name;
    Col.Tag := I;
  end;
  Grid.RowCount := CDS.RecordCount;
end;

procedure TForm1.GridGetValue(Sender: TObject; const ACol, ARow: Integer; var Value: TValue);
begin
  CDS.First;
  CDS.MoveBy(ARow);
  Value := CDS.Fields[ACol].Text;
end;

И после этого вы можете использовать мое решение для столбцов: /questions/20692741/fmx-tgrid-ongetvalue-posle-peremescheniya-stolbtsa

Другие вопросы по тегам