:: 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;
|
Будьте внимательны, считывать свойства компонентов нужно в той же
последовательности, в которой они были сохранены.
Поэкспериментируйте с примером, перетаскивайте компоненты, вводите текст.
И последнее, если вы откроете сохраненные файлы в каком-нибудь текстовом
редакторе, например в блокноте, то сможете увидеть, у какого компонента
какие свойства сохраняются.
На сегодня все. Удачи в программировании.
.: Пример к данной статье :.
|
При использовании материала - ссылка на сайт обязательна
|
|