Zapis zmienionych właściwości komponentu

0

Heja

Mam pytanie, odpalam sobię formatkę, na której powiedzmy jest Label. I teraz z powiedzmy że z poziomu kodu zmieniam właściwość Top tegoż komponentu (albo jakąś inną publiczną). Jak przy zamykaniu (czy w jakimkolwiek innym momencie) wyłapać zmienione właściwości komponentu (pod pojęciem zmienionych rozumiem takie które zmieniły się w porównaniu do tych po odpaleniu programu) ? Można by co prawda zapisać pewne wartości właściwości na początku, i na końcu porównać ale zastanawiam się czy można to zrobić prościej ?

Z góry dziękuję
Pozdrawiam
b

0

Utworzyć tablicę zmian, do której wpisuje się np nazwy komponentów o zmienionych właściwościach. Tablicę uaktualniać od razu po dokonaniu jakiejś zmiany.

0

jakoś automagicznie nie masz możliwości stwierdzić, które właściwości się zmieniły. Możesz co najwyżej automatycznie* po starcie spisać stan komponentów (wybranych, wszystkich) a potem porównać (też automatycznie*) co się zmieniło.

  • automatycznie, tzn nie wypisywać co ma być sprawdzane, tylko przy użyciu RTTI
0

Dzięki za odpowiedzi. Choć tak naprawdę obie składają się na to co chciałem (nie chciałem) zrobić w ostateczności. Pomysł pelsta chciałem wykorzystać do obczajenia co się zmienia, pomysł misiekd chciałem wykorzystać do zrzutu stanu/zapisu obserwowanych właściwości.

Ale skoro już ktoś temat podłapał, to mam pytanie dodatkowe.
Jak wiadomo, większość rzeczy (np TForm) dziedziczy po TPersistent. Mają więc one zdolność "serializacji" do strumieni. Czy jest jakaś możliwość, aby to uczynić w runtime ? Innymi słowy zapisać dfm'ke działającej formatki ? Oczywiście pytam o sposób "jednolinijkowy" a nie o pisanie własnej metody do tego celu.

Z góry dziękuję
Pozdrawiam
b

0

Uhm, no nie użyłem dr. google'a:

www.experts-exchange.com/Programming/Languages/Pascal/Delphi/Q_20851702.html+delphi,+save+to+dfm+at+runtime&hl=pl&ct=clnk&cd=2&gl=pl

Sprubuje to obczaić w domu, czy powstaje z tego coś na wzór dfm'a.
b

0

Ja proponuję szybkie, ale kompletnie nieprofesjonalne rozwiązanie:

procedure TForm.ZapiszKomponent(what:tcomponent;name:string);
var
   F: TFileStream;
begin
  F := TFileStream.Create(extractfilepath(application.ExeName)+'\files\'+name+'.dat', fmCreate or fmShareCompat);
   try
     F.WriteComponent(what);
   finally
     F.Free;
   end;
end;

procedure TForm.WczytajKomponent(what:tcomponent;name:string);
var
  F: TFileStream;
begin
if not fileexists(extractfilepath(application.ExeName)+'\files\'+name+'.dat') then exit;
  F := TFileStream.Create(extractfilepath(application.ExeName)+'\files\'+name+'.dat', fmOpenRead or fmShareDenyWrite);
   try
    F.ReadComponent(what);
  finally
    F.Free;
  end;
end;

Działanie powyższego kodu jest proste. Kiedy chcemy zapisać dany komponent (niestety wszystkie jego właściwości), to wykonujemy procedurę 'ZapiszKomponent' tak:

ZapiszKomponent(komponent,'nazwa');

Objekt "komponent" zostanie zapisany do pliku "nazwa.dat" w folderze "/files". Wczytywanie komponentu jest zupełnie odwrotne. W parametrach podajemy nazwę (taka jak przy zapisywaniu) oraz komponent, który ma zostać wczytany (musi już istnieć).

Myślę, że to pomoże :)

0

Dzienks. A dało by się jakoś wymusić zapis w stylu tekstowej dfm'ki ? Bo to jest jakby binarny format dfm, a tekstowy ?

b

1 użytkowników online, w tym zalogowanych: 0, gości: 1