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

Вниз

Сохранение настроек формы и всех компонентов в файл   Найти похожие ветки 

 
James007 ©   (2002-06-23 16:36) [0]

Помогите пожалуйста, Мне надо пример в котором бы сохранялись настройки формы и настройки всех компонентов в файл(фомат файла такой же как в dfm), т.к. я создаю некоторые компоненты динамически(по нажатию кнопок), и мне надо, чтобы при следующем запуске все оставалось на своих местах(сохранение в ini или реестр не удобно).Напишите пример, плиз.


 
VID ©   (2002-06-23 17:09) [1]

ну коли неудобно, то юзай компонент RxFormStorage из пакета RxLib - удобнее нету :)


 
Юрий Зотов ©   (2002-06-23 17:15) [2]

См. Write/ReadComponentResFile - пишете всю форму разом и получаете DFM в ресурсовом формате. Читаете так:

Form1 := TForm1(ReadComponentResFile(..., TForm1.CreateNew(...)));


 
James007 ©   (2002-06-23 19:12) [3]

А если прогараммно, а не через компоненты, сохранять ввиде свойств объектов как в dfm????


 
Юрий Зотов ©   (2002-06-23 19:57) [4]

Об этом и говорилось.


 
James007 ©   (2002-06-23 20:34) [5]

Я же создаю программно некоторые компоненты, т.е. в dfm. их нет.
Напишите пожалуйста не большой пример.


 
James007 ©   (2002-06-23 21:01) [6]

Я же создаю программно некоторые компоненты, т.е. в dfm. их нет.
Потом я их удаляю. Просто такая программа в которой мне нужно создавать программно компоненты. И всякий раз мне надо запоминать все компоненты, какие есть на форме и их свойства. Я где-то видел как это делать, но уже не помню(там надо было до запуска формы проверить изменилась ли форма, потом,если изменилась считать с файла, а после завершения программы запомнить все изменения формы в файл совершенно такой же как и dfm).
Напишите пожалуйста небольшой пример. ИЛИ КТО ЗНАЕТ, ГДЕ ТАКОЕ НАПИСАНО, НАПИШИТЕ ССЫЛКУ.



 
Юрий Зотов ©   (2002-06-23 21:37) [7]

> Я же создаю программно некоторые компоненты,
> т.е. в dfm. их нет.

Без разницы. WriteComponentResFile запишет Вам новый DFM с заданным Вами же именем. ЛЮБЫМ именем и даже с ЛЮБЫМ расширением (но по внутреннему формату это будет точно такой же DFM, что и обычный). И в нем будет все, что Вы на момент записи насоздавали - только следите, чтобы Owner"ом при создании новых компонентов назначалась именно форма.

Соответственно, ReadComponentResFile это же самое состояние формы и восстановит - то, которое было на момент записи файла.


 
James007 ©   (2002-06-23 22:43) [8]

Вот я пробовал написать сохранение(для примера):
//Здесь я создаю на форме кнопку
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 23:40) [9]

Не Button сохраняйте, а ФОРМУ!!! Всю разом!!!

Форма - это же тоже компонент - вот она вместе со всем своим содержимым и запишется. И ничего запоминать не нужно.

Естественно, прочитать сама себя форма не сможет, это надо делать извне (например, из другой формы). Выше я давал пример чтения.


 
James007 ©   (2002-06-24 11:07) [10]

Вот у меня получилось, но одно "но", у меня открывается форма
со всеми сохраненными настройками, а потом сверху открывается форма программы
т.е. 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);


 
James007 ©   (2002-06-24 16:33) [11]

Юрий Зотов, ответьте на последнее сообщение


 
Юрий Зотов ©   (2002-06-25 19:28) [12]

Что-то в этом духе.


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-29 17:39) [13]

А я немного сделал по другому, вроде бы работает, проверял, надо еще на одном примере проверить!!!!!
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-29 17:48) [14]

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



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

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

Наверх




Память: 0.5 MB
Время: 0.012 c
1-47494
Evants
2002-07-04 10:36
2002.07.15
Снова ТListBox (избегание ошибки)


1-47344
strel
2002-07-01 17:16
2002.07.15
Как изменять значения переменных в DLL ??


3-47123
Oleon
2002-06-21 16:43
2002.07.15
Работа с цифрами.


14-47715
ATLANTIDO
2002-05-27 00:10
2002.07.15
предлагаю ...


1-47567
Karen
2002-06-28 12:03
2002.07.15
Что это?