Как сохранить и восстановить форму?

Так, у меня есть форма с несколькими дюжинами средств управления, и кто-то хотел бы сохранить и более позднее восстановление их содержание и настройки - какой переключатель был установлен, каково было Положение этого/вниз и т.д.

Я также хотел бы сохранить любые записи, добавленные к полю списка во время выполнения.

Что самый простой путь состоит в том, чтобы сделать это? DfmToString и реверс? Запись-чтение.INI? Что-то еще?

15
задан duplode 23 January 2017 в 15:29
поделиться

2 ответа

Решение ПРУЗа - это готовое решение; 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), а затем загрузить в него данные файла. И в итоге показываем загруженную форму.

24
ответ дан 1 December 2019 в 02:45
поделиться

Достаточно легко читать / записывать свойства компонента или объекта, или позицию формы в INI файл или реестр. Все, что вам нужно, существует в помощи. Вам просто нужно решить, когда вы хотите их прочитать (при создании, перед показом ...) и сохранить (при закрытии ...). Это зависит от того, что вы сохраняете / восстанавливаете. Если вы собираетесь использовать готовые компоненты и хотите сохранить позицию формы, то обязательно проверьте, как они относятся к нескольким мониторам. Если вы делаете это по-своему, вам следует позаботиться об этом самостоятельно. Например, у вас может быть ноутбук и большой 22-дюймовый монитор, и положение формы было сохранено, пока использовался ваш большой монитор. Позже, если вы откроете эту форму на ноутбуке, она может отображаться на экране, поэтому вы не можете видеть форму, если с этим делом не обращаются должным образом.

2
ответ дан 1 December 2019 в 02:45
поделиться
Другие вопросы по тегам:

Похожие вопросы: