Entwickler-Ecke
Grafische Benutzeroberflächen (VCL & FireMonkey) - Komponente Property setzen
mcbain - Mi 23.02.11 16:44
Titel: Komponente Property setzen
Hallo,
ich habe eine eigene Komponente geschrieben, welche auch wunderbar funktioniert.
Die Komponente hat mehrere Properties nach folgendem Schema:
Delphi-Quelltext
1:
| property GivenName: string read FGivenName write SetGivenName; |
Es wird also jedesmal SetGivenName() aufgerufen, wenn in GivenName geschrieben wird.
Jetzt habe ich aber die Eigenschaft SearchUser, welche eine Funktion SetSearchUser aufruft, die allen anderen Attributen einen Wert zuweist:
Delphi-Quelltext
1:
| property SearchUser: string read FSearchUser write SetSearchUser; |
Delphi-Quelltext
1: 2: 3: 4: 5: 6:
| procedure SetSearchUser(aUser:string); begin ... FGivenName := self.GetUserGivenName(); ... end |
D.H. ich schreibe in die Eigenschaft SearchUser einen String und anschließend setzt mir die Funktion SetSearchUser dieser Eigenschaft alle anderen Attribute.
Das Problem ist nun, dass jedes Mal die Attribute überschrieben werden, sobald ich die Anwendung mit der Komponente darauf starte. Sprich er liest beim Start zuerst den Wert aus, schreibt ihn dann in ein Property und überschreibt diesen Wert nochmal mit dem gleichen Wert.
Kann mir da jemand einen Tip geben bitte?
Vielen Dank.
jaenicke - Mi 23.02.11 16:51
Schau dir einmal ComponentState an, speziell csDesigning und csLoading. ;-)
Denn die Eigenschaft wird auch beim Laden der Komponenten auf dem Formular und ggf. auch zur Designzeit gesetzt.
mcbain - Do 24.02.11 08:48
Vielen Dank, das ist schonmal nicht schlecht.
Aber wie bekomme ich es jetzt hin, dass ich steuern kann wann SetGivenName ausgeführt wird und wann nicht? Ich muss ja sicherstellen, dass GivenName nicht jedesmal überschrieben wird, sobald ich mit SetSearchUser einen Wert reinschreibe, sondern eben nur, wenn ich explizit den Wert in GivenName ändere.
Vielen Dank nochmal.
Tranx - Do 24.02.11 09:15
Eine Möglichkeit wäre - wahrscheinlich wird mich jetzt der eine oder andere steinigen - in der Prozedur SetSearchUser eine lokale Variable mit
Delphi-Quelltext
1:
| const AktUser : string = ''; |
zu definieren, welche Du dann in eienr if-Abfrage auf ihre Änderung abfragst:
Delphi-Quelltext
1: 2: 3: 4: 5:
| if aUser <> AktUser then begin AktUser := aUser; fGivenName := self.GetUserGivenName(); end; |
jaenicke - Do 24.02.11 09:39
mcbain hat folgendes geschrieben : |
| Ich muss ja sicherstellen, dass GivenName nicht jedesmal überschrieben wird, sobald ich mit SetSearchUser einen Wert reinschreibe, sondern eben nur, wenn ich explizit den Wert in GivenName ändere. |
SetGivenName wird doch gar nicht aufgerufen, wenn du FGivenName befüllst.
Und in SetSearchUser kannst du schauen, ob csLoading gesetzt ist, und nur wenn nicht die anderen aktualisieren. Ganz wie du willst. Also eigentlich verstehe ich das Problem vielleicht nicht ganz. :nixweiss:
mcbain - Do 24.02.11 10:56
Vielen Dank.
SetGivenName wird tatsächlich nicht gesetzt, wenn in FGivenName geschrieben wird. Sorry, mein Fehler.
Jedoch wird bei Erstellung der Form, auf dem die Komponente liegt, SetVererbung ausgeführt, und zwar erst nachdem SetSearchUser bereits ausgeführt wurde. Also kann ich nicht in SetSearchUser mit
Delphi-Quelltext
1: 2:
| if NOT (csLoading in self.ComponentState) then ... |
operieren.
Ich habe jetzt aber die Abfrage in meine Funktion SetGivenName gepackt und es scheint, dass diese Funktion wirklich nur noch durchlaufen wird, wenn ich SetGivenName explizit aufrufe, und nicht über SetSearchUser das Attribut setze.
Noch eine Frage, ist das csLoading Flag auch zur Designzeit gesetzt? Da mit Sicherheit SetVererbung auch ausgeführt wird, wenn die Komponente auf der Form platziert wird. Ich möchte aber SetGivenName nicht über csDesigning auschließen, da ich ja die Property auch zur Design-Zeit setzen möchte.
Vielen Dank nochmal.
jaenicke - Do 24.02.11 11:06
mcbain hat folgendes geschrieben : |
| Noch eine Frage, ist das csLoading Flag auch zur Designzeit gesetzt? |
Wenn das Formular gerade in die IDE geladen wird, sollte es gesetzt sein, ja.
Und wie du überhaupt abfragst, ob du in der IDE im Designer bist, hatte ich schon geschrieben:
jaenicke hat folgendes geschrieben : |
| Schau dir einmal ComponentState an, speziell csDesigning und csLoading. ;-) |
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!