Форум: "Основная";
Текущий архив: 2002.04.22;
Скачать: [xml.tar.bz2];
Внизsave/load to/from file Найти похожие ветки
← →
Nikit (2002-04-08 12:58) [0]В форме находятся комбобоксы со значениями и созданные run-time
объекты (панели с дочерними Timage). В процессе работы панели
перемещаются пользователем по форме (drag-n-drop). Все прекрасно
работает - осталось последнее - SAVE/Load to File все properties всех
объектов формы (включая дочерние) чтобы при открытии файла все объекты
встали на места и приняли значения на момент последнего сохранения
файла. Надеюсь что не очень путанно объяснил. Очень буду блгодарен за
подробный пример. Спасибо.
Никит@
← →
Song (2002-04-08 13:04) [1]Вам нужно просто запомнить значения Left и Top панелей в реестре или в файле. Проблема-то в чём, в невозможности реализации сохранения?
← →
Nikit (2002-04-09 14:10) [2]все верно - вся проблема только в том,что я начинающий:)
Я сохраняю в реестре все значения - и когда считываю - то объектов, для которыx сохранены параметры, нет на форме ( они были созданы Run-time).
Поэтому наверняка (я так думаю) должен быть способ сохранения формы со всеми компонентами на определенный момент времени и при считывании из файла - создание формы с нуля.
Ну как бы - текст самой формы записывается в файл в бинарном или другом виде (только не текстовом а то юзеры будут там шариться)
и при считывании форма образуется просто из этого текста. Вот так бы было идеально.
Спасибо за ответ.
Никит@
← →
Song (2002-04-09 14:21) [3]Просто надо сначала создать объекты, а потом считывать значения их положения. И они все переустановятся в нужные позиции.
← →
Nikit (2002-04-09 15:02) [4]Спасибо Song ©
а попроще никак?
для меня это сложно (либо исходник какой-нибудь - если можно - покажите - так я разберусь)
Пока так и делаю - создаю и пытаюсь поставить на нужную позицию
нифига не получается и непонятно где ошибка -
потому и прошу помочь - бъюсь уже неделю
Никит@
← →
Song (2002-04-09 15:38) [5]Пока так и делаю - создаю и пытаюсь поставить на нужную позицию
нифига не получается и непонятно где ошибка -
потому и прошу помочь - бъюсь уже неделю
Без кода ничего не получится. Приведите того место где Вы ставите, а он не ставится.
а попроще никак?
Я не думаю, что это сложно.
Решение 1. Реестр
Делаете в ключе Software ключ с названием своей программы, в нём ключ, например Settings, а в нём, ключи последовательно всех меток, восстановить положение которых Вам нужно. А в него уже добавляете два подключа: Left и Top. Для них записываете нужные позиции. При чтении эти же позиции загоняете в соответствующие свойства.
Решение 2. TIniFile
Здесь тоже самое, но только в файл *.ini такие же секции. Извини, я не перевариваю этот класс, поэтому разбирайтесь сами.
Решение 3. Нетипизированный файл.
Храните все данные в таком файле.
Задаёте Record, например
Type Settings=Record
Panel1Left,Panel1Top
....
PanelNLeft,PanelNTop:ShortInt;
End;
Procedure SaveSettings;
Var ff:File of Settings;
R:Setings;
Begin
// Здесь присваиваете переменной R все положения панелей/
AssignFile("имя_файла");
ReWrite(ff);
Write(ff,R)
CloseFile(ff);
End;
Procedure ReadSettings;
Var ff:File of Settings;
R:Setings;
Begin
{$I-}
AssignFile("имя_файла");
Reset(ff);
IF IOresult<>0 then Exit; //к примеру
Read(ff,R)
CloseFile(ff);
// Здесь читаете все значения позиций из переменной R
{$I+}
End;
← →
Nikit (2002-04-09 15:56) [6]вот за это большое спасибо
буду делать по третьему варианту
так как количество меток всегда разное и первый вариантр не подходит
с ini - тоже как-то громоздко ( объектов около 80-100 штук) - для каждого писать позицию простым текстом... как-то это...
СПАСИБО - СЕЛ делать
Никит@
← →
Song (2002-04-09 15:59) [7]Кстати, по-моему т.к. "так как количество меток всегда разное" не подходит как раз третий вариант, а первый-то самый подходящий...
← →
Nikit (2002-04-09 16:05) [8]так-так-так:(
>>а в нём, ключи последовательно всех меток, восстановить положение которых Вам нужно...
1. Количество меток всегда разное - какое количество ключей нужно сделать для меток?
2. Как работать с реестром в смысле сохранить/загрузить - направьте пожалуйста (адрес или место хэлпа или название компонента или программной конструкции)
спасибо
Никит@
← →
Song (2002-04-09 16:14) [9]Создавая метки в run-time, сохраняйте ссылки памяти на них в массиве статическом или динамическом, например:
Var arr: array [1..100] of TPanel;
n:=1;
Arr[n]:=TPanel.Create(nil);
...
а потом записывайте ключи по кол-ву n или High(Arr)+1
А лучше всего динамический массив
Var arr: array of TPanel;
← →
Song (2002-04-09 16:16) [10]А по поводу 2, см. TRegistry
← →
Nikit (2002-04-09 16:18) [11]ok - спасибо - сел разбираться
Никит@
← →
Nikit (2002-04-10 18:17) [12]и все-таки - возвращаясь к раннему
что-то не так в коде...
//сохраняем форму в текстовый файл
procedure TForm1.SaveFile(Component: TComponent; const FileName: string);
var
ms: TMemoryStream;
fs: TFileStream;
begin
fs := TFileStream.Create(FileName, fmCreate or fmOpenWrite);
ms := TMemoryStream.Create;
try
ms.WriteComponent(Form1);
ms.position := 0;
ObjectBinaryToText(ms, fs);
finally
ms.Free;
fs.free;
end;
end;
??????????????? Объектов, созданных run-time - в файле - нет
почему?????
Ведь...Parent у них - Form1
...
//так были созданы run-time панели класса TMyPanel дочернего TPanel
...
smPan:=TMyPanel.Create(Panel3);
smPan.Top:=53+i*(625 div (s-1));
smPan.Parent:=Form1;
...
procedure TForm1.LoadFile(Component: TComponent; const FileName: string);
var
ms: TMemoryStream;
fs: TFileStream;
begin
ms := TMemoryStream.Create;
fs := TFileStream.Create(FileName, fmOpenRead);
try
DelComponents(Form1);//free все компоненты формы
{осовбождаем форму от компонентов чтобы не получилось что объект с таким же именем уже существует}
ObjectTextToBinary(fs, ms);
ms.position := 0;
ms.ReadComponent(Form1);
finally
ms.Free;
fs.free;
end;
end;
здесь все нормально и со свойствами и с объектами.
Поясните коли несложно для Вас,
Спасибо
Никит@
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2002.04.22;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.007 c