Как сохранить и восстановить форму?
Итак, у меня есть форма с несколькими десятками элементов управления, и кто-то хотел бы сохранить, а затем восстановить их содержимое и настройки - какой переключатель был выбран, какова была позиция этого вверх / вниз и т. Д.
Я также хотел бы хранить любые записи, добавленные в список во время выполнения.
Какой самый простой способ сделать это? DfmToString и обратный? Написать / прочитать.INI? Что-то другое?
2 ответа
Решение PRUZ - это готовое решение; JVCL с открытым исходным кодом, и использовать JvFormStorage просто. Но вы также можете использовать собственный механизм потоковой передачи Delphi без использования сторонних компонентов. Вот пример:
procedure SaveComponentToFile(Component: TComponent; const FileName: TFileName);
var
FileStream : TFileStream;
MemStream : TMemoryStream;
begin
MemStream := nil;
if not Assigned(Component) then
raise Exception.Create('Component is not assigned');
FileStream := TFileStream.Create(FileName,fmCreate);
try
MemStream := TMemoryStream.Create;
MemStream.WriteComponent(Component);
MemStream.Position := 0;
ObjectBinaryToText(MemStream, FileStream);
finally
MemStream.Free;
FileStream.Free;
end;
end;
SaveComponentToFile принимает экземпляр компонента плюс имя файла и передает компонент в файл в удобочитаемом тексте.
Чтобы загрузить компонент из файла, вы можете использовать такой код:
procedure LoadComponentFromFile(Component: TComponent; const FileName: TFileName);
var
FileStream : TFileStream;
MemStream : TMemoryStream;
i: Integer;
begin
MemStream := nil;
if not Assigned(Component) then
raise Exception.Create('Component is not assigned');
if FileExists(FileName) then
begin
FileStream := TFileStream.Create(FileName,fmOpenRead);
try
for i := Component.ComponentCount - 1 downto 0 do
begin
if Component.Components[i] is TControl then
TControl(Component.Components[i]).Parent := nil;
Component.Components[i].Free;
end;
MemStream := TMemoryStream.Create;
ObjectTextToBinary(FileStream, MemStream);
MemStream.Position := 0;
MemStream.ReadComponent(Component);
Application.InsertComponent(Component);
finally
MemStream.Free;
FileStream.Free;
end;
end;
end;
LoadComponentFromFile принимает экземпляр компонента и имя файла, а затем загружает содержимое файла в экземпляр компонента. Чтобы избежать конфликта имен, мы освобождаем все существующие собственные компоненты экземпляра перед загрузкой в него данных файла.
Теперь вы можете использовать приведенный выше код для сохранения формы в файл:
SaveComponentToFile(FSecondForm,ExtractFilePath(Application.ExeName)+ 'formdata.txt');
FSecondForm - это экземпляр формы, и он будет сохранен в файле "formdata.txt" в той же папке, что и файл EXE.
И чтобы загрузить FSecondForm из файла "formdata.txt", мы пишем это:
if not Assigned(FSecondForm) then
FSecondForm := TfrmSecond.Create(Application);
LoadComponentFromFile(FSecondForm,ExtractFilePath(Application.ExeName)+ 'formdata.txt');
FSecondForm.Show;
LoadComponentFromFile должен сначала создать экземпляр, поэтому мы проверяем, назначен ли FSecondForm, если нет, то создаем его экземпляр (это экземпляр класса TfrmSecond), а затем загружаем в него данные файла. И в итоге мы показываем загруженную форму.
Это довольно легко для чтения / записи свойств компонента или объекта, или формы позиции в INI-файле или реестре. Все, что вам нужно, существует в помощь. Вам просто нужно решить, когда вы хотите прочитать их (при создании, перед показом...) и сохранить их (при закрытии, ...). Это зависит от того, что вы сохраняете / восстанавливаете. Если вы собираетесь использовать готовые компоненты и хотите сохранить положение формы, то обязательно проверьте, как они работают с несколькими мониторами. Если вы делаете это по-своему, вы должны позаботиться об этом сами. Например, у вас может быть ноутбук и большой 22-дюймовый монитор, и положение формы было сохранено при использовании большого монитора. Позже, если вы откроете эту форму на ноутбуке, она может отображаться на экране, поэтому вы не сможете увидеть Форма, если этот случай не обрабатывается должным образом.