Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Read Write Property (https://www.delphipraxis.net/66572-read-write-property.html)

ozz 31. Mär 2006 16:19


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

Elvis 31. Mär 2006 16:33

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.

sniper_w 31. Mär 2006 16:33

Re: Read Write Property
 
Du musst es so schreiben damit deine WRITE Prozedur überhaupt aufgerufen wird:
Delphi-Quellcode:
IMyClass.Stopwords := EineVariable;//-> implizit -->>WriteStopwordlist(EineVariable);

ozz 31. Mär 2006 17:51

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:

himitsu 31. Mär 2006 18:07

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?

ozz 31. Mär 2006 20:04

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.

himitsu 31. Mär 2006 20:45

Re: Read Write Property
 
Na dann laß doch das WRITE einfach weg
Delphi-Quellcode:
property Stopwords: TStringList read FStopwords;
und Leite das Ereignis OnChange von FStopwords auf eine Funktion um, welche dann die Datenbank aktualisiert.

Irgendwie so?
Delphi-Quellcode:
Constructor MyClass.Create;
  Begin
    Inherited;
    FStopwords := TStringList.Create;
    FStopwords.OnChange := @Self.WriteStopwordlist;
    ....
  End;
Ansonsten fällt mir auch nichts anderes mehr ein, außer eben noch die Add-Prozedur selber zu erstellen (siehe oben).

ozz 4. Apr 2006 17:14

Re: Read Write Property
 
Danke himitsu.
Das ist genau, was ich gesucht habe. :spin:


Alle Zeitangaben in WEZ +1. Es ist jetzt 16:41 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz