Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2010.01.24;
Скачать: CL | DM;

Вниз

Запись свойства компонента Visible в файл с помощью TFileStream   Найти похожие ветки 

 
azl   (2009-12-01 18:11) [0]

Здравствуйте, уважаемые мастера.
Есть такая проблема.
Вкратце, так:
Создаем форму, кидаем на нее 3 кнопки, пишем для первой и третьей кнопки следующий код:

procedure TForm1.Button1Click(Sender: TObject);
var
 fs: TFileStream;
begin
 Button2.Visible := false;
 fs := TFileStream.Create("C:\file.dat", fmCreate or fmOpenWrite);
 fs.WriteComponent(Button2);
 fs.Free;
end;

procedure TForm1.Button3Click(Sender: TObject);
var
 fs: TFileStream;
begin
 fs := TFileStream.Create("C:\file.dat", fmOpenRead);
 fs.ReadComponent(Button2);
 fs.Free;
end;


Т.е., с помощью TFileStream создаем файл и записываем в него компонент Button2, а потом считываем из файла.
Проблема заключается в том, что свойство Visible не записывается в файл.
Я нажимаю Button1, потом закрываю приложение, запускаю его снова и нажимаю Button3. При нажатии Button3 кнопка 2 не исчезает, а по идее, должна, ведь при записи в файл у нее свойство Visible было равно false.

Если делать наоборот, тот же эффект. А именно, Button2.Visible присваиваю false в Object Inspector. Пишу следующий код.

procedure TForm1.Button1Click(Sender: TObject);
var
 fs: TFileStream;
begin
 Button2.Visible := true;
 fs := TFileStream.Create("C:\file.dat", fmCreate or fmOpenWrite);
 fs.WriteComponent(Button2);
 fs.Free;
end;

procedure TForm1.Button3Click(Sender: TObject);
var
 fs: TFileStream;
begin
 fs := TFileStream.Create("C:\file.dat", fmOpenRead);
 fs.ReadComponent(Button2);
 fs.Free;
end;


В этом случае, Button2 не появляется при нажатии на Button3, а нужно, чтобы она была видимой.

Объясню, зачем мне это нужно. Есть приложение на котором расположено 6 кнопок и RxRichEdit. В ходе выполнения программы свойства кнопок меняются: Enabled и Visible на False или True, и Caption. А также, меняется текст RxRichEdit.
В определенный момент мне нужно сохранить состояние кнопок и их Caption, а также, текст из RxRixhEdit.
Потом мне нужно, например, на следующий день, загрузить данные и восстановить все состояния кнопок и их надписи, а также текст из RxRichEdit. Как в игре, сохраниться, а потом загрузить игру снова.
Все хорошо, но вот свойство Visible не меняется. Когда, нужно, чтобы кнопка была видна, она не видна и наоборот.
Что можете посоветовать?


 
Evgnevius ©   (2009-12-01 18:52) [1]

А все остальные свойства сохраняются и читаются? Ну например, положение объекта на форме? Или тебе нужна только видимость кнопки? А текст из RxRichEdit сохраняется?


 
Evgnevius ©   (2009-12-01 19:00) [2]

Я бы вообще не пользовался этим сомнительным классом (TFileStream), а использовал бы ini-файлы для хранения нужных мне параметров. Писанины больше, однако работает надёжно.


 
azl   (2009-12-01 19:23) [3]


> А все остальные свойства сохраняются и читаются? Ну например,
>  положение объекта на форме? Или тебе нужна только видимость
> кнопки? А текст из RxRichEdit сохраняется?

Да, все остальные свойства (по крайней мере, которые мне нужны) сохраняются и читаются. Положение кнопки на форме - однозначно. Проверил специально, хотя мне это и не нужно было, так в целях эксперимента.
Текст из RxRichEdit сохраняется и читается.
Сохраняется так: RxRichEdit1.Lines.SaveToStream(fs);
А читается так: RxRichEdit1.Lines.LoadFromStream(fs);

Отчего же "сомнительным классом"? Отнюдь не сомнительный, очень даже полезная вещь.
По поводу ini файлов думал, но есть свои нюансы, не с ini-файлами, а вообще. У меня много данных, которые я записываю в поток, помимо компонентов. Скажем, в этот же поток я пишу еще данные из 8 массивов [1..500]. И хочу, чтобы это все хранилось в одном файле, а не в нескольких.


 
Медвежонок Пятачок ©   (2009-12-01 19:34) [4]

Все хорошо, но вот свойство Visible не меняется.

1. Читаешь не оттуда куда реально пишешь.
2. Видимость кнопки где-то еще меняется кодом помимо чтения паблишед свойств из файла
3. Другая подобная ерунда.


 
Медвежонок Пятачок ©   (2009-12-01 19:42) [5]

Ну и забыл еще про приколы со свойствами имеющими директиву default

если кнопка по дефолту видима (так написан ее класс), то ее видимость=тру в файл не попадет.

и если на момент чтения из файла она была невидима, то чтение из того файла не сделает ее видимой. так как свойства в файле не будет вообще.


 
Медвежонок Пятачок ©   (2009-12-01 19:44) [6]

поэтому либо пропсторадж какой-нибудь юзать, либо писать свой механизм четния/записи. (без read/writecomponent)


 
azl   (2009-12-01 21:40) [7]


> Ну и забыл еще про приколы со свойствами имеющими директиву
> default
>
> если кнопка по дефолту видима (так написан ее класс), то
> ее видимость=тру в файл не попадет.
>
> и если на момент чтения из файла она была невидима, то чтение
> из того файла не сделает ее видимой. так как свойства в
> файле не будет вообще.

Все понятно, спасибо.
Ну можно с помощью массива. Перед записью в файл, в массив типа boolean записать состояние Visible и закатать это дело в поток. А потом считать из потока данные в массив и уже присвоить значения кнопкам.


 
azl   (2009-12-01 21:48) [8]


> Ну и забыл еще про приколы со свойствами имеющими директиву
> default

А как же тогда Button1.[b]Enabled[/b]? Ведь это тоже умолчание. Но это свойство меняется.



Страницы: 1 вся ветка

Текущий архив: 2010.01.24;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.014 c
15-1258538079
Palladin
2009-11-18 12:54
2010.01.24
Семь раз отмерь, один раз отрежь.


2-1259737915
Timur&Co
2009-12-02 10:11
2010.01.24
Подсчет итемов ListView


15-1258619414
Юрий
2009-11-19 11:30
2010.01.24
С днем рождения ! 19 ноября 2009 четверг


2-1260086750
FEV
2009-12-06 11:05
2010.01.24
Изображения из Access в Delphi


15-1258446035
_
2009-11-17 11:20
2010.01.24
Довлоадеры. Какой выбрать?