На форме имеется StringGrid1, у которого выставлена автоматическая нумерация строк в фиксированном столбце и разрешено редактирование таблицы, т.е.
Options -> goFixedRowNumbering = True, goEditing = True. Также есть 2 кнопки:
первая добавляет строку в таблицу, т.е. увеличивает RowCount на единицу, при помощи второй мы можем сохранить наш StringGrid в файл (StringGrid1.SaveToFile('1.dat'))
Количество строк таблицы заранее не известно, поэтому на этапе дизайна установлено значение = 2 (т.е. 1 фиксированная строка и одна обычная).
Запускаем программу, заполняем таблицу, добавляя в нее строки. Затем сохраняем результат. Все работает...
Теперь нам понадобилось чтобы при запуске программы таблица заполнялась данными из файла. Обрабатываем событие формы OnShow:
- Код: Выделить всё
StringGrid1.LoadFromFile('1.dat');
Запускаем программу и видим что добавленные нами строки не отображаются, видно лишь то количество строк, которое указано на этапе дизайна StringGrid'a
StringGrid1.Options -> goAutoAddRows = True не помогает.
Первое, что приходит в голову, изменить свойство SaveOptions, т.е. в обработчике кнопки сохранения в начале поместить код:
- Код: Выделить всё
StringGrid1.SaveOptions:= [soDesign, soContent];
(soAttributes и soPosition нам в данном случае не нужны, я проверял ))
Запускаем... Видим то же самое, хотя наш сохраненный файл изменился (в нем появились Options). Далее все эксперименты проводил с этим файлом (т.е. кнопку "Сохранить" не нажимал)
Т.е. задача состоит в том, чтобы заранее определить количесто строк таблицы в файле или что и как нужно подкрутить, чтобы они все отобразились. Предварительно во время дизайна выставить значение 100500 строк не интересно, хотя это сняло бы частично всю проблему.
Ведь в файле сохраняется количество строк, даже если они пустые! (сохраненный файл представляет собой xml-ку, где все понятно написано)
Далее самое интересное. Не помню почему, но решил я задавать StringGrid'у SaveOptions не в обработчике нажатия кнопки, а в FormShow, т.е.:
- Код: Выделить всё
procedure TForm1.FormShow(Sender: TObject);
begin
StringGrid1.SaveOptions:= [soDesign, soContent];
StringGrid1.LoadFromFile('1.dat');
end;
И, о чудо! Все сохраненные строки показались, НО! Пропала нумерация строк (goFixedRowNumbering. Кстати значение этой опции не сохраняется в файле, ни True, ни False, вообще никак)!
Конечно можно ее добавить в FormShow:
- Код: Выделить всё
StringGrid1.SaveOptions:= [soDesign, soContent];
StringGrid1.LoadFromFile('1.dat');
StringGrid1.Options:= StringGrid1.Options + [goFixedRowNumbering];
Так все работает как надо, но я пошел дальше. Стало интересно каким образом SaveOptions влияют на загрузку файла (третью строку, там где StringGrid1.Options, временно закомментировал. Оказалось, если оставить
- Код: Выделить всё
StringGrid1.SaveOptions:= [soDesign];
показывается пустая сетка с нужным количеством строк, но без какого-либо контента вообще, а если
- Код: Выделить всё
StringGrid1.SaveOptions:= [soContent];
видим нашу сетку без дополнительных строк, но с контентом и нумерацией.
Так вот, почему изменение параметров сохранения влияет на загрузку файла, в то время как файл остается неизменным?
P.S. Lazarus 1.0.4 x86