Практика
Свойства компонентов в потоках

:: Меню ::
:: На главную ::
:: FAQ ::
:: Заметки ::
:: Практика ::
:: Win API ::
:: Проекты ::
:: Скачать ::
:: Секреты ::
:: Ссылки ::

:: Сервис ::
:: Написать ::

:: MVP ::

:: RSS ::

Яндекс.Метрика


Сегодня мы поговорим о свойствах компонентов, а именно, об их сохранении и восстановлении. Для хранения настроек можно использовать INI-файлы или реестр, а можно воспользоваться потоком. И если о INI-файлах и реестре знают все, то о возможности сохранения свойств компонентов в потоке знают не многие.

Для этих целей у класса TStream и его потомков есть два метода: для записи - WriteComponent и WriteComponentRes, и парные им для чтения из потока - ReadComponent и ReadComponentRes.

Сразу стоит отметить одно очень важное обстоятельство: потоки сохраняют не все свойства. Для всех компонентов сохраняются их позиция и размеры, а вот остальные сохраняемые свойства у каждого компонента свои. Например, в TStringGrid строки, введенные в ячейки, в поток не пишутся, а TMemo прекрасно сохраняет введенный пользователем текст.

В качестве примера создадим форму и бросим на нее несколько компонентов, в том числе способных воспринимать введенный пользователем текст. Вообще неважно, какие компоненты будут на форме, я же для примера выбрал те, которые имеют событие OnMouseDown, чтобы продемонстрировать сохранение позиции компонента в потоке (TPanel, TMemo, TListView, TEdit). Наделим эти компоненты возможностью перемещаться по форме, для этого в событии OnMouseDown каждого компонента напишем соответствующий код, приведенный ниже.

(* Перемещаем TPanel *)
procedure TForm1.Panel1MouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
   ReleaseCapture;
   ( Sender as TPanel ).Perform( WM_SYSCOMMAND, $F012, 0 );
end;

(* Перемещаем TMemo *)
procedure TForm1.Memo1MouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
   ReleaseCapture;
   ( Sender as TMemo ).Perform( WM_SYSCOMMAND, $F012, 0 );
end;

(* Перемещаем TListView *)
procedure TForm1.ListView1MouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
   ReleaseCapture;
   ( Sender as TListView ).Perform( WM_SYSCOMMAND, $F012, 0 );
end;

(* Перемещаем TEdit *)
procedure TForm1.Edit1MouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
   ReleaseCapture;
   ( Sender as TEdit ).Perform( WM_SYSCOMMAND, $F012, 0 );
end;

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

(* Сохраняем свойства компонентов в потоке *)
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
var
  FileStream: TFileStream;
begin
   // Сохраняем свойства TPanel
   FileStream := TFileStream.Create( 'Panel.sav', fmCreate );
   FileStream.WriteComponent( Panel1 );
   FileStream.Free;
   // Сохраняем свойства TMemo
   FileStream := TFileStream.Create( 'Memo.sav', fmCreate );
   FileStream.WriteComponent( Memo1 );
   FileStream.Free;
   // Сохраняем свойства TListView
   FileStream := TFileStream.Create( 'ListView.sav', fmCreate );
   FileStream.WriteComponent( ListView1 );
   FileStream.Free;
   // Сохраняем свойства TEdit
   FileStream := TFileStream.Create( 'Edit.sav', fmCreate );
   FileStream.WriteComponent( Edit1 );
   FileStream.Free;
end;

Теперь все, что осталось, это прочитать свойства компонентов при создании формы.

(* Читаем свойства компонентов из потока *)
procedure TForm1.FormCreate(Sender: TObject);
var
  FileStream: TFileStream;
begin
   // Читаем свойства TPanel
   if FileExists( 'Panel.sav' ) then
   begin
      FileStream := TFileStream.Create( 'Panel.sav', fmOpenRead );
      FileStream.ReadComponent( Panel1 );
      FileStream.Free;
   end;
   // Читаем свойства TMemo
   if FileExists( 'Memo.sav' ) then
   begin
      FileStream := TFileStream.Create( 'Memo.sav', fmOpenRead );
      FileStream.ReadComponent( Memo1 );
      FileStream.Free;
   end;
   // Читаем свойства TListView
   if FileExists( 'ListView.sav' ) then
   begin
      FileStream := TFileStream.Create( 'ListView.sav', fmOpenRead );
      FileStream.ReadComponent( ListView1 );
      FileStream.Free;
   end;
   // Читаем свойства TEdit
   if FileExists( 'Edit.sav' ) then
   begin
      FileStream := TFileStream.Create( 'Edit.sav', fmOpenRead );
      FileStream.ReadComponent( Edit1 );
      FileStream.Free;
   end;
end;

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

(* Сохраняем свойства компонентов в потоке *)
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
var
  FileStream: TFileStream;
begin
   FileStream := TFileStream.Create( 'Components.sav', fmCreate );
   // Сохраняем свойства TPanel
   FileStream.WriteComponent( Panel1 );
   // Сохраняем свойства TMemo
   FileStream.WriteComponent( Memo1 );
   // Сохраняем свойства TListView
   FileStream.WriteComponent( ListView1 );
   // Сохраняем свойства TEdit
   FileStream.WriteComponent( Edit1 );
   FileStream.Free;
end;

(* Читаем свойства компонентов из потока *)
procedure TForm1.FormCreate(Sender: TObject);
var
  FileStream: TFileStream;
begin
   if FileExists( 'Components.sav' ) then
   begin
      FileStream := TFileStream.Create( 'Components.sav', fmOpenRead );
      // Читаем свойства TPanel
      FileStream.ReadComponent( Panel1 );
      // Читаем свойства TMemo
      FileStream.ReadComponent( Memo1 );
      // Читаем свойства TListView
      FileStream.ReadComponent( ListView1 );
      // Читаем свойства TEdit
      FileStream.ReadComponent( Edit1 );
      FileStream.Free;
   end;
end;

Будьте внимательны, считывать свойства компонентов нужно в той же последовательности, в которой они были сохранены.

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

На сегодня все. Удачи в программировании.

.: Пример к данной статье :.


При использовании материала - ссылка на сайт обязательна