** laifik |
Отправлено: 19.10.2004, 10:20 |
|
Не зарегистрирован
|
У меня есть Form1, на которой расположены компоненты Edit, Label, которые я могу перетаскивать методом Drag&Doc. Изменив местоположение объектов, я хочу запомнить эту картинку в бинарный файл.
Делаю это так:
[CODE]TFileStream* ActionLog;
ActionLog=new TFileStream("Complex.bin", fmOpenWrite);
ActionLog->WriteComponent(FormMove);
delete ActionLog;
[CODE]
Вроде все сохраняется.
Затем форму я закрываю. При новой активизации формы компоненты расположены как изначально (т.е. не передвинуты). Мне нужно загрузить бинарный файл так, чтобы компоненты разместились на форме так, как я их сохранила. Делаю так:
[CODE]
TFileStream* ActionLog;
ActionLog=new TFileStream("Complex.bin", fmOpenRead);
FormMove = (TFormMove*)ActionLog->ReadComponent((TComponent*)FormMove);
delete ActionLog;
[CODE]
Но вот загрузка срабатывает не правильно. Выдается сообщение, что такие компоненты уже существуют. А если этот бинарный файл загрузить на совсем пустую форму в другом приложение, то выдается сообщение, что такие компоненты не найдены.
Помогите, пожалуйста, решить эту задачку! |
|
Doga |
Отправлено: 19.10.2004, 13:04 |
|
Мастер участка
Группа: Участник
Сообщений: 575
|
Будьте проще!
Сохроняйте положение своих Control'ов в *.INI — файле или в реестре, а при загрузке формы устанавливайте для них сохранённые значения. Или можете использоватьуже готовый компонент TFormPlacement из библиотеки RxLib.
|
|
laifik |
Отправлено: 19.10.2004, 13:10 |
|
Дежурный стрелочник
Группа: Участник
Сообщений: 70
|
QUOTE (Doga @ 19/10/2004, 14:06) | Будьте проще!
Сохроняйте положение своих Control'ов в *.INI — файле или в реестре, а при загрузке формы устанавливайте для них сохранённые значения. |
Не имею малейшего представления, как это делается. У Вас нет случайно примера на эту тему? Буду очень благодарна. |
|
Doga |
Отправлено: 19.10.2004, 14:34 |
|
Мастер участка
Группа: Участник
Сообщений: 575
|
С *.INI — файлом например так:
CODE |
//---------------------------------------------------------------------------
void __fastcall TYourForm::LoadYourCfg()
{
TStringList *CfgList = new TStringList();
if (FileExist("YourForm.ini"))
{
CfgList->LoadFromFile("YourForm.ini");
if (CfgList->Count > 0)
{
WINDOWPLACEMENT WindowPlacement;
WindowPlacement.length = sizeof(WINDOWPLACEMENT);
for (int i = 0; i < CfgList->Count; i++)
{
//Положение и состояние окна
if (CfgList->Names[i] == "СОСТОЯНИЕ ОКНА")
{
WindowPlacement.showCmd = CfgList->Values[CfgList->Names[i]].ToIntDef(SW_SHOWNORMAL);
}
else if (CfgList->Names[i] == "ВЕРХНЯЯ ГРАНИЦА")
{
WindowPlacement.rcNormalPosition.top = CfgList->Values[CfgList->Names[i]].ToIntDef(YourForm->Top);
}
else if (CfgList->Names[i] == "ЛЕВАЯ ГРАНИЦА")
{
WindowPlacement.rcNormalPosition.left = CfgList->Values[CfgList->Names[i]].ToIntDef(YourForm->Left);
}
else if (CfgList->Names[i] == "НИЖНЯЯ ГРАНИЦА")
{
WindowPlacement.rcNormalPosition.bottom = CfgList->Values[CfgList->Names[i]].ToIntDef(YourForm->Bottom);
}
else if (CfgList->Names[i] == "ПРАВАЯ ГРАНИЦА")
{
WindowPlacement.rcNormalPosition.right = CfgList->Values[CfgList->Names[i]].ToIntDef(YourForm->Right);
}
//Положение TEdit1
else if (CfgList->Names[i] == "TEDIT1->LEFT")
{
TEdit1->Left = CfgList->Values[CfgList->Names[i]].ToIntDef(TEdit1->Left);
}
else if (CfgList->Names[i] == "TEDIT1->TOP")
{
TEdit1->Top = CfgList->Values[CfgList->Names[i]].ToIntDef(TEdit1->Top);
}
//И так далее ...
}
//Восстановление положения окна
SetWindowPlacement(Handle, &WindowPlacement);
if (WindowPlacement.showCmd == SW_SHOWMAXIMIZED)
{
WindowState = wsMaximized;
}
}
}
delete CfgList;
}
//---------------------------------------------------------------------------
void __fastcall TYourForm::SaveYourCfg()
{
TStringList *CfgList = new TStringList();
CfgList->Clear();
//Положение и состояние окна
WINDOWPLACEMENT WindowPlacement;
WindowPlacement.length = sizeof(WINDOWPLACEMENT);
if (GetWindowPlacement(Handle, &WindowPlacement))
{
CfgList->Append("СОСТОЯНИЕ ОКНА=" + IntToStr((int)WindowPlacement.showCmd));
CfgList->Append("ВЕРХНЯЯ ГРАНИЦА=" + IntToStr((int)WindowPlacement.rcNormalPosition.top));
CfgList->Append("ЛЕВАЯ ГРАНИЦА=" + IntToStr((int)WindowPlacement.rcNormalPosition.left));
CfgList->Append("НИЖНЯЯ ГРАНИЦА=" + IntToStr((int)WindowPlacement.rcNormalPosition.bottom));
CfgList->Append("ПРАВАЯ ГРАНИЦА=" + IntToStr((int)WindowPlacement.rcNormalPosition.right));
}
//Положение TEdit1
CfgList->Append("TEDIT1->LEFT=" + IntToStr(TEdit1->Left));
CfgList->Append("TEDIT1->TOP=" + IntToStr(TEdit1->Top));
//И так далее ...
CfgList->SaveToFile("YourForm.ini");
delete CfgList;
}
//---------------------------------------------------------------------------
|
Вот как то так ...
|
|
** laifik |
Отправлено: 19.10.2004, 18:12 |
|
Не зарегистрирован
|
Ого... Я думала, это гораздо проще. Над этим нужно поработать.
А пока, спасибо большое! |
|
Guest |
Отправлено: 20.10.2004, 03:39 |
|
Не зарегистрирован
|
Как сказал Doga легче использовать TFormPlacement, но для Вашей задачи надо TFormStorage все из того же RXlib.
Вообщем качайте и ставть RxLib и не изобретайте калеса )))
|
|
Sl@Sh |
Отправлено: 22.10.2004, 09:27 |
|
Мастер участка
Группа: Участник
Сообщений: 383
|
А иногда нужно и в файл. В этом случая есть одно удобство : если есть несколько часто используемых конфигураций настроек в разных файлах, то загрузить нужные настройки удобнее из файла.
В этом случае можно так :
TStrings *MySet;
MySet->Add("Что угодно");
...
MySet->SaveToFile(FName);
Но как видно, здесь используются строки. Хотя это хоть и неудобство, но вполне решимо( например IntToStr(str) — если нужно что-то типа int записать)
Удачи !
|
|