Zapisuj właściwości do pliku konfiguracyjnego np.
*.ini, z wykorzystaniem klasy
TIniFile. Możesz jeszcze ewentualnie zapisywać właściwości komponentów - każdego oddzielnie, do pliku tekstowego i z niego go odczytywać:
Funkcje odczytuje dane z pamięci i konwertuje je na łańcuch znaków. Żeby zobaczyć jak działa wywołamy ją w zdarzeniu OnClick dla przycisku Button1, przy czym odczytamy informacje o komponencie Button2 i zapiszemy je w obiekcie Memo1:
// Plik źródłowy np. Unit1.cpp
//---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop
#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------------------------
AnsiString ComponentToString(TComponent *c)
{
AnsiString as;
TMemoryStream* pms = new TMemoryStream();
TStringStream* pss = new TStringStream(as);
try
{
pms->WriteComponent(c);
pms->Seek(0, soFromBeginning);
ObjectBinaryToText(pms, pss);
pss->Seek(0, soFromBeginning);
as = pss->DataString;
}
catch(...)
{
ShowMessage("Błąd strumienia danych.");
}
delete pms;
delete pss;
return as;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
Memo1->Text = ComponentToString(Button2);
}
Tak zapisane informacje można zmienić i przekonwertować ponownie, albo raczej przekazać ponownie do wybranego obiektu, w tym przypadku do obiektu Button2. W tym celu napiszemy funkcję StringToComponent i przekażemy jej jako argumentu odwołanie do komponentu Button2 oraz zawartość obiektu Memo1. Przed wywołaniem funkcji w zdarzeniu OnClick dla przycisku Button2 proponuję dokonać małych zmian w opisie obiektu, w oknie edycji Memo1, można zmienić np wartość Left na 240, powinno to spowodować przesunięcie obiektu Button2 o dodatkowe 120 pikseli w lewo:
// Plik źródłowy np. Unit1.cpp
......
//---------------------------------------------------------------------------
void StringToComponent(TComponent *c, AnsiString as)
{
TMemoryStream* pms = new TMemoryStream();
TStringStream* pss = new TStringStream(as);
try
{
ObjectTextToBinary(pss, pms);
pms->Seek(0, soFromBeginning);
}
catch(...)
{
ShowMessage("Błąd strumienia danych");
}
pms->ReadComponent(c);
delete pms;
delete pss;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button2Click(TObject *Sender)
{
StringToComponent(Button2, Memo1->Text);
}
To jednak kiepskie rozwiązanie. Sugeruję posłużyć się jednak plikiem konfiguracyjnym, gdyż nie wszystkie właściwości obiektów można w ten sposób zapisać. W przypadku prostych komponentów to się sprawdzi, ale nie zadziała np. w przypadku tabel.