![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Сохранение настроек формы и всех компонентов в файл [D5, WinME]
James007 © (2002-06-23 16:36:00)Помогите пожалуйста, Мне надо пример в котором бы сохранялись настройки формы и настройки всех компонентов в файл(фомат файла такой же как в dfm), т.к. я создаю некоторые компоненты динамически(по нажатию кнопок), и мне надо, чтобы при следующем запуске все оставалось на своих местах(сохранение в ini или реестр не удобно).Напишите пример, плиз.
Юрий Зотов (2002-06-29 17:48:00) [1]Должно работать. Правда, код неэффективный - огромное количество ненужных операций по созданию и уничтожению компонентов.
James007 (2002-06-29 17:39:00) [2]А я немного сделал по другому, вроде бы работает, проверял, надо еще на одном примере проверить!!!!!
Application.Initialize;
if FileExists("Meneger.dat") then
begin
Application.CreateForm(TFMain, FMain);
FMain.DestroyComponents;
FMain:=TFMain(ReadComponentResFile("Meneger.dat", FMain));
end
else
Application.CreateForm(TFMain, FMain);
Юрий Зотов (2002-06-25 19:28:00) [3]Что-то в этом духе.
var
P: pointer;
begin
Application.Initialize;
if FileExists("Initemp.dfm") then
begin
Form1 := TForm1(ReadComponentResFile("Initemp.dfm", TForm1.CreateNew(Form1)));
P := @Application.MainForm;
P^ := Form1
end
else Application.CreateForm(TForm1, Form1);
Application.Run;
WriteComponentResFile("Initemp.dfm", Form1);
end.
James007 (2002-06-24 16:33:00) [4]Юрий Зотов, ответьте на последнее сообщение
James007 (2002-06-24 11:07:00) [5]Вот у меня получилось, но одно "но", у меня открывается форма
со всеми сохраненными настройками, а потом сверху открывается форма программы
т.е. Application.CreateForm(TForm1, Form1); открывает две формы.
и все изменения записываются только для формы, которая создана
на этапе создания программы. Но вторая форма открывается с изменениями
как мне сделать, чтобы показывалась форма с изменениями???????????????
Вот мой пример:
Application.Initialize;
if FileExists("Initemp.dfm") then
Form1:=TForm1(ReadComponentResFile("Initemp.dfm", TForm1.CreateNew(Form1)));
Application.CreateForm(TForm1, Form1);
Application.Run;
WriteComponentResFile("Initemp.dfm", Form1);
Юрий Зотов (2002-06-23 23:40:00) [6]Не Button сохраняйте, а ФОРМУ!!! Всю разом!!!
Форма - это же тоже компонент - вот она вместе со всем своим содержимым и запишется. И ничего запоминать не нужно.
Естественно, прочитать сама себя форма не сможет, это надо делать извне (например, из другой формы). Выше я давал пример чтения.
James007 (2002-06-23 22:43:00) [7]Вот я пробовал написать сохранение(для примера):
//Здесь я создаю на форме кнопку
procedure TForm1.Button3Click(Sender: TObject);
begin
BButton:=TButton.Create(Self);
BButton.Parent:=Self;
BButton.Caption:="Привет";
WriteComponentResFile("Initemp.dfm", BButton);
end;
//Здесь я читаю из файла свойства кнопки
procedure TForm1.FormCreate(Sender: TObject);
begin
//Здесь должна быть проверка на наличие файла.
Form1:=TForm1(ReadComponentResFile("Initemp.dfm",
TForm1.CreateNew(BButton)));
end;
Правильно ли я делаю????????
И один вопрос, если правильно, то мне нужно будет запоминать имя каждого компонента для записи .
Юрий Зотов (2002-06-23 21:37:00) [8]> Я же создаю программно некоторые компоненты,
> т.е. в dfm. их нет.
Без разницы. WriteComponentResFile запишет Вам новый DFM с заданным Вами же именем. ЛЮБЫМ именем и даже с ЛЮБЫМ расширением (но по внутреннему формату это будет точно такой же DFM, что и обычный). И в нем будет все, что Вы на момент записи насоздавали - только следите, чтобы Owner"ом при создании новых компонентов назначалась именно форма.
Соответственно, ReadComponentResFile это же самое состояние формы и восстановит - то, которое было на момент записи файла.
James007 (2002-06-23 21:01:00) [9]Я же создаю программно некоторые компоненты, т.е. в dfm. их нет.
Потом я их удаляю. Просто такая программа в которой мне нужно создавать программно компоненты. И всякий раз мне надо запоминать все компоненты, какие есть на форме и их свойства. Я где-то видел как это делать, но уже не помню(там надо было до запуска формы проверить изменилась ли форма, потом,если изменилась считать с файла, а после завершения программы запомнить все изменения формы в файл совершенно такой же как и dfm).
Напишите пожалуйста небольшой пример. ИЛИ КТО ЗНАЕТ, ГДЕ ТАКОЕ НАПИСАНО, НАПИШИТЕ ССЫЛКУ.
James007 (2002-06-23 20:34:00) [10]Я же создаю программно некоторые компоненты, т.е. в dfm. их нет.
Напишите пожалуйста не большой пример.
Юрий Зотов (2002-06-23 19:57:00) [11]Об этом и говорилось.
James007 (2002-06-23 19:12:00) [12]А если прогараммно, а не через компоненты, сохранять ввиде свойств объектов как в dfm????
Юрий Зотов (2002-06-23 17:15:00) [13]См. Write/ReadComponentResFile - пишете всю форму разом и получаете DFM в ресурсовом формате. Читаете так:
Form1 := TForm1(ReadComponentResFile(..., TForm1.CreateNew(...)));
VID (2002-06-23 17:09:00) [14]ну коли неудобно, то юзай компонент RxFormStorage из пакета RxLib - удобнее нету :)