Autor |
Beitrag |
mcbain
      
Beiträge: 60
Erhaltene Danke: 1
|
Verfasst: Mi 23.02.11 16:44
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
      
Beiträge: 19315
Erhaltene Danke: 1747
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: 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 
      
Beiträge: 60
Erhaltene Danke: 1
|
Verfasst: 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
      
Beiträge: 648
Erhaltene Danke: 85
WIN 2000, WIN XP
D5 Prof
|
Verfasst: Do 24.02.11 09:15
_________________ Toleranz ist eine Grundvoraussetzung für das Leben.
|
|
jaenicke
      
Beiträge: 19315
Erhaltene Danke: 1747
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: 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. 
|
|
mcbain 
      
Beiträge: 60
Erhaltene Danke: 1
|
Verfasst: 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
      
Beiträge: 19315
Erhaltene Danke: 1747
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Do 24.02.11 11:06
|
|
|