Сохранить размер динамических столбцов

Я работаю в Tdbadvgrid от TMS. Я добавляю столбцы динамически на основе длины запроса sql. Все отлично работает, за исключением сохранения ширины столбца. Добавление столбцов:

  //Captions
  for i := 0 to oRow.Count - 1 do
  begin
    grdFieldData.Columns.Insert(1);
    grdFieldData.Cells[i + 1, 0] := TabelList.Captions[i].Caption;
  end;

  //Data
  for r := 0 to TabelList.Count - 1 do //rows
  begin
    for c := 0 to oRow.Count - 1 do //cols
    begin
      grdFieldData.Cells[c+1, r+1] := TabelList.Rows[r].Fields[c].Value;
    end;
    if r <> TabelList.Count - 1 then
      grdFieldData.RowCount := grdFieldData.RowCount + 1;
  end;

Теперь функция сохранения встроена в TMS TDBAdvGrid и выглядит так: Параметры размера столбца

Я пробовал возиться со всеми вариантами, но безуспешно.

В таблице есть 1 фиксированная строка (для заголовков) и одна пустая строка. Строка существует только потому, что количество фиксированных строк должно быть меньше, чем количество строк. При сохранении данных в файл .ini или в реестр он сохраняет и загружает первый столбец, но динамически добавленные столбцы записываются как значение по умолчанию (64), но никогда не сохраняются/загружаются, когда я перетаскиваю их для настройки размера. Таблица файлов .ini выглядит следующим образом:

[Recept]
Col0=20
Col1=97
Col2=64
Col3=64
Col4=64
Col5=64
Col6=64
Col7=64
Col8=64
Col9=64
Col10=64
Col11=64
Col12=64
Col13=64
Col14=64

При загрузке это выглядит так: Сетка

Кто-нибудь знает, что я могу сделать, чтобы столбцы сохранялись правильно, поэтому ширина будет сохранена?


person H4rdstyler    schedule 14.03.2016    source источник
comment
Пробовали ли вы самостоятельно обрабатывать процедуру сохранения/загрузки? Вы должны заглянуть в их код и проверить, когда он вызывается. Возможно, это не подходит для этой ситуации или вам нужно вручную вызывать функции сохранения/загрузки, когда это необходимо.   -  person smooty86    schedule 14.03.2016
comment
Я пробовал управлять сохранением и загрузкой самостоятельно, да. Это ничего не меняет к сожалению.   -  person H4rdstyler    schedule 14.03.2016
comment
Я предлагаю опубликовать это на форуме поддержки TMS. Они почти всегда отвечают в течение 24 часов, и у нас очень хорошие шансы решить вашу проблему.   -  person TomT    schedule 14.03.2016
comment
Кроме того, когда получите ответ от TMS, опубликуйте его здесь. Кто-то, столкнувшийся с той же проблемой, поблагодарит вас за это и, возможно, купит вам пива :)   -  person RBA    schedule 14.03.2016
comment
Мой руководитель не уверен, где у него информация для входа на веб-сайт tms, и сказал мне на данный момент снизить ее приоритет. Но я создал собственное решение для загрузки и сохранения ширины столбцов в файле ini. Я с удовольствием опубликую это, но должен ли я рассматривать это решение для исправления? Все работает без нареканий :)   -  person H4rdstyler    schedule 14.03.2016


Ответы (1)


Итак, после нескольких часов сидения с ним, я решил, что нет причин так сильно бороться с чем-то встроенным, когда я могу просто построить что-то простое самостоятельно.

В этом случае он просто сохраняется в выбранный ini-файл в выбранном каталоге. Имя файла и каталог в настоящее время жестко запрограммированы для каждого унаследованного класса. Возможность их изменения может быть легко реализована. Возможно, даже селектор каталогов на кнопку или что-то в этом роде.

Код для загрузки (вызывается на FormShow):

procedure TfrmReceptEditor.LoadColWidths;
var
  Ini: TIniFile;
  i: Integer;
  path: String;
  filename: String;
begin
  inherited;
  path := 'C:\';
  filename := 'grid.ini';
  Ini := TIniFile.Create(path + filename);
  try
    for i := 0 to grdFieldData.ColCount - 1 do
    begin
      grdFieldData.Columns.Items[i].Width := Ini.ReadInteger('Recept','col'+IntToStr(i),75);
    end;
    grdFieldData.FixedColWidth := 20;
  finally
    Ini.Free;
  end
end;

И код для сохранения данных (на FormClose):

procedure TfrmReceptEditor.SaveColWidths;
var
  Ini: TIniFile;
  i: Integer;
  path: String;
  filename: String;
begin
  inherited;
  path := 'C:\';
  filename := 'grid.ini';
  Ini := TIniFile.Create(path + filename);
  try
    for i := 0 to grdFieldData.ColCount - 1 do
    begin
      Ini.WriteInteger('Recept', 'col'+IntToStr(i), grdFieldData.Columns.Items[i].Width);
    end;
  finally
    Ini.Free;
  end;
end;

Некоторые могут захотеть встроить функции для проверки существования файлов Ini (т. е. правильности введенного пути). Но он будет работать гладко, даже если файл не существует, он просто создаст его.

person H4rdstyler    schedule 15.03.2016