![]() |
Read Write Property
Hallo zusammen,
ich bin mal wieder etwas blind. Ich habe eine Klasse MyClass. Diese enthält eine Property Stopwords(mit Lese- und Schreibzugriff). In meinem Hauptprogramm habe ich davon eine Instanz mit dem Namen IMyClass. Wenn ich per .add Werte der Property zuordne, wird die Write der Property nicht aufgerufen. Was mache ich da falsch? Danke für die Hilfe.
Delphi-Quellcode:
type MyClass = class FStopwords:TStringList; procedure WriteStopwordlist(value:TStringList); property Stopwords: TStringList read FStopwords write WriteStopwordlist; end;
Delphi-Quellcode:
begin;
.... IMyClass.Stopwords.Add(StopwordListView.Items[i].Caption); ... end |
Re: Read Write Property
Ändere das Feld und die Setter prozedur auf private, die property auf public.
Außerdem beginnt ein Setter nach Standard mit "Set","set" oder "set_". Zum Problem: Es gibt keins. Es wird der Getter der Property ausgeführt, damit die StringList Add aufrufen kann. Dein Feld und die Property enthält doch nur einen Zeiger auf die Liste. Der wird ja nicht geändert, also muss der Setter nicht ausgeführt werden. |
Re: Read Write Property
Du musst es so schreiben damit deine WRITE Prozedur überhaupt aufgerufen wird:
Delphi-Quellcode:
IMyClass.Stopwords := EineVariable;//-> implizit -->>WriteStopwordlist(EineVariable);
|
Re: Read Write Property
Danke sniper_w und Elvis, eine Sache verstehe ich aber dann nicht....
Die Property ist von Typ Stringlist. ADD ist Standard bei Stringlist. Daher meine Frage: 1. Wie kann ich der Property einen einzelnen Wert hinzufügen, wenn ich die ADD nicht benutzen kann (bzw. wie in meinem Beispiel die Daten ins Nirvana schieße)? Nochmal implementieren? :gruebel: |
Re: Read Write Property
Wie sniper_w schon sagte, wird bei dir nur READ aufgerufen, da du ja ein Unterelement des Objekts nurtzt, wozu es erstmal ausgelesen (per READ) wird und dann dessen Prozedure aufgerufen wird.
Du müßtest z.B. eine eigene Add-Prozedure erstellen, welche intern FStopwords.ADD aufruft ... z.B.
Delphi-Quellcode:
Procedure TMyClass.StopwordsAdd(S: String);
Begin FStopwords.ADD(S); End; // und so dann aufrufen IMyClass.StopwordsAdd(StopwordListView.Items[i].Caption); Was machst'n in WriteStopwordlist? Der Inhalt von StopwordListView.Items[i].Caption sollte ja dennoch in FStopwords hinzugefügt werden? |
Re: Read Write Property
Hallo himitsu,
ich habe es verstanden, kann aber das Problem nicht lösen. vielleicht dazu noch einige Erläuterungen. Was macht die Procedure? Stopwordliste ist eine normale TStringlist mit einer Liste von Wörtern. Ich will diese über die Property verwalten und auch in die Datenbank schreiben (writeStopwordlist) und lesen(ReadStoplist). Ich könnte das Lesen und Schreiben der Liste auch in zwei extra public Proceduren auslagern, dann müßte ich es aber explizit anstoßen. Mein Ziel war, diese transparent hinter der Property verschwinden zu lassen (auch die Datenbankzugriffe). Vielleicht ist auch das Konzept das Problem. |
Re: Read Write Property
Na dann laß doch das WRITE einfach weg
Delphi-Quellcode:
und Leite das Ereignis OnChange von FStopwords auf eine Funktion um, welche dann die Datenbank aktualisiert.
property Stopwords: TStringList read FStopwords;
Irgendwie so?
Delphi-Quellcode:
Ansonsten fällt mir auch nichts anderes mehr ein, außer eben noch die Add-Prozedur selber zu erstellen (siehe oben).
Constructor MyClass.Create;
Begin Inherited; FStopwords := TStringList.Create; FStopwords.OnChange := @Self.WriteStopwordlist; .... End; |
Re: Read Write Property
Danke himitsu.
Das ist genau, was ich gesucht habe. :spin: |
Alle Zeitangaben in WEZ +1. Es ist jetzt 07:13 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz