Форум: "Начинающим";
Текущий архив: 2010.01.24;
Скачать: [xml.tar.bz2];
ВнизЗапись свойства компонента 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;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.005 c