Autor Beitrag
mcbain
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 60
Erhaltene Danke: 1



BeitragVerfasst: 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:
ausblenden 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:
ausblenden Delphi-Quelltext
1:
 property SearchUser: string read FSearchUser write SetSearchUser;					


ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19315
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 60
Erhaltene Danke: 1



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 648
Erhaltene Danke: 85

WIN 2000, WIN XP
D5 Prof
BeitragVerfasst: 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

ausblenden Delphi-Quelltext
1:
  const AktUser : string = '';					


zu definieren, welche Du dann in eienr if-Abfrage auf ihre Änderung abfragst:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
  if aUser <> AktUser then 
  begin
    AktUser := aUser;
    fGivenName := self.GetUserGivenName();
  end;

_________________
Toleranz ist eine Grundvoraussetzung für das Leben.
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19315
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Do 24.02.11 09:39 
user profile iconmcbain hat folgendes geschrieben Zum zitierten Posting springen:
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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 60
Erhaltene Danke: 1



BeitragVerfasst: 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

ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19315
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Do 24.02.11 11:06 
user profile iconmcbain hat folgendes geschrieben Zum zitierten Posting springen:
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:
user profile iconjaenicke hat folgendes geschrieben Zum zitierten Posting springen:
Schau dir einmal ComponentState an, speziell csDesigning und csLoading. ;-)