C++ Builder
| Главная | Уроки | Статьи | FAQ | Форум | Downloads | Литература | Ссылки | RXLib | Диски |

 
Сохранение формы, в бинарный файл
** 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]
Но вот загрузка срабатывает не правильно. Выдается сообщение, что такие компоненты уже существуют. А если этот бинарный файл загрузить на совсем пустую форму в другом приложение, то выдается сообщение, что такие компоненты не найдены.
Помогите, пожалуйста, решить эту задачку! cool.gif
Doga
Отправлено: 19.10.2004, 13:04


Мастер участка

Группа: Участник
Сообщений: 575



Будьте проще! smile.gif
Сохроняйте положение своих Control'ов в *.INI — файле или в реестре, а при загрузке формы устанавливайте для них сохранённые значения. Или можете использоватьуже готовый компонент TFormPlacement из библиотеки RxLib.
laifik
Отправлено: 19.10.2004, 13:10


Дежурный стрелочник

Группа: Участник
Сообщений: 70



QUOTE (Doga @ 19/10/2004, 14:06)
Будьте проще! smile.gif
Сохроняйте положение своих Control'ов в *.INI — файле или в реестре, а при загрузке формы устанавливайте для них сохранённые значения.

Не имею малейшего представления, как это делается. У Вас нет случайно примера на эту тему? Буду очень благодарна. smile.gif
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;
}
//---------------------------------------------------------------------------


Вот как то так ... smile.gif
** laifik
Отправлено: 19.10.2004, 18:12


Не зарегистрирован







Ого... Я думала, это гораздо проще. Над этим нужно поработать.
А пока, спасибо большое! smile.gif
Guest
Отправлено: 20.10.2004, 03:39


Не зарегистрирован







Как сказал Doga легче использовать TFormPlacement, но для Вашей задачи надо TFormStorage все из того же RXlib.

Вообщем качайте и ставть RxLib и не изобретайте калеса smile.gif)))
Sl@Sh
Отправлено: 22.10.2004, 09:27


Мастер участка

Группа: Участник
Сообщений: 383



А иногда нужно и в файл. В этом случая есть одно удобство : если есть несколько часто используемых конфигураций настроек в разных файлах, то загрузить нужные настройки удобнее из файла.

В этом случае можно так :

TStrings *MySet;
MySet->Add("Что угодно");
...
MySet->SaveToFile(FName);

Но как видно, здесь используются строки. Хотя это хоть и неудобство, но вполне решимо( например IntToStr(str) — если нужно что-то типа int записать)

Удачи !


Вернуться в Вопросы программирования в C++Builder