CYFROWY BARON • PROGRAMOWANIE • Zobacz wątek - zapisywanie wlasciwosci komponentow

zapisywanie wlasciwosci komponentow

dział ogólny

zapisywanie wlasciwosci komponentow

Nowy postprzez arturhalaczkiewicz » piątek, 16 grudnia 2011, 13:53

Witam,
maci moze jakis pomysl na zapisanie wlasciwosci wszystkich komponentow z Formy (i formy tez) , tak aby pozniej mozna bylo je z automatu odczytac? Nie dziala funkcja ReadComponent bo probuje nadpisac juz istniejace komponenty, a ja probuje zrobic cos takiego aby za kazdym razem gdy user otwiera forme to wczytuja sie (z sqla) poprzednie ustawienia komponentow z tego okna, ale tez nie wszystkie, jedynie polozenie, rozmiary, kolejnosc tabel i metody sortowania. Oczywiscie mozna recznie zapisywac wszystkie wlasciwosci i pozniej recznie je odczytywac ale chcialem napisac taka rutynke co z automatu odczyta te paramatry i podmieni odpowiednie wlasciwosci. Form jest kilkanasci, na kazdej po kilka/kilkanascie komponentow :(
pozdr
Artur
Avatar użytkownika
arturhalaczkiewicz
Bladawiec
Bladawiec
 
Posty: 13
Dołączył(a): piątek, 16 grudnia 2011, 13:48
Podziękował : 1
Otrzymał podziękowań: 0
System operacyjny: windows 7
Kompilator: builder 6 prof
Gadu Gadu: 0
    Windows XPFirefox

Re: zapisywanie wlasciwosci komponentow

Nowy postprzez Cyfrowy Baron » piątek, 16 grudnia 2011, 14:00

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:

KOD cpp:     UKRYJ  
// 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:

KOD cpp:     UKRYJ  
// 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.
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows XPFirefox

Re: zapisywanie wlasciwosci komponentow

Nowy postprzez arturhalaczkiewicz » piątek, 16 grudnia 2011, 14:03

właśnie niestety nie za bardzo :(
jeżeli na formularzu już SĄ komponenty o takich nazwach i jakiśtam właściwościach to ReadComponent wywala błąd :(
procedure odczytu i zapisu, konwersji do txt i zapisu odczytu z sqla napisalem, ale dla wszystkich danych komponentu ...
Avatar użytkownika
arturhalaczkiewicz
Bladawiec
Bladawiec
 
Posty: 13
Dołączył(a): piątek, 16 grudnia 2011, 13:48
Podziękował : 1
Otrzymał podziękowań: 0
System operacyjny: windows 7
Kompilator: builder 6 prof
Gadu Gadu: 0
    Windows XPFirefox

Re: zapisywanie wlasciwosci komponentow

Nowy postprzez arturhalaczkiewicz » piątek, 16 grudnia 2011, 14:18

opiszę dokładnie z kodem :)
oto procedurka zapisująca (najwazniejszy fragment):

KOD cpp:     UKRYJ  
   // Ustawienia FORMY
    TMemoryStream* pms = new TMemoryStream();
    TStringStream* pss = new TStringStream(Fustawienia);
    pms->WriteComponent(reinterpret_cast<TForm *>(Sender));
    pms->Seek(0, soFromBeginning);
    ObjectBinaryToText(pms, pss);
    pss->Seek(0, soFromBeginning);
    Fustawienia = pss->DataString;
 

i Fustawienia wrzucam do mysqla

a tak to odczytuje:

KOD cpp:     UKRYJ  
    if (MD->ZQ_Rozkaz->RecordCount>0) // czy jest taki rekord
    {
      TMemoryStream* pmsO = new TMemoryStream();
      TStringStream* pssO = new TStringStream(Ustawienia);
      try
      {
          ObjectTextToBinary(pssO, pmsO);
          pmsO->Seek(0, soFromBeginning);
      }
      catch(...)
      {
          ShowMessage("BŁĄD przy nadawaniu odczycie ustawień okien!");
      }

      pmsO->ReadComponent(reinterpret_cast<TForm *>(Sender));

      delete pmsO;
      delete pssO;
    }


i ten ReadComponent jeżeli natrafi na istniejący już komponent to się wywala mówiąc:
A component named cośtam already exists!
Avatar użytkownika
arturhalaczkiewicz
Bladawiec
Bladawiec
 
Posty: 13
Dołączył(a): piątek, 16 grudnia 2011, 13:48
Podziękował : 1
Otrzymał podziękowań: 0
System operacyjny: windows 7
Kompilator: builder 6 prof
Gadu Gadu: 0
    Windows XPFirefox

Re: zapisywanie wlasciwosci komponentow

Nowy postprzez Cyfrowy Baron » sobota, 17 grudnia 2011, 01:01

Dlatego też napisałem, że powinieneś posłużyć się plikiem konfiguracyjnym. Swego czasu polymorphism wspominał o jakiejś metodzie, ale już nie pamiętam o co chodziło.
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows XPFirefox


Powrót do Ogólne problemy z programowaniem

Kto przegląda forum

Użytkownicy przeglądający ten dział: Brak zalogowanych użytkowników i 6 gości