Entwickler-Ecke

Delphi Language (Object-Pascal) / CLX - TStrings/TStringlist als Property??


neuling82 - Do 21.08.03 09:55
Titel: TStrings/TStringlist als Property??
Hey Leute, ich möchte in meiner Kompo eine Property schaffen, welche mehrere Strings fassen kann! bisher habe ich das so gelöst: (Pseudocode)


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
private
FempfangsMSN: Tstrings;
FempfangsSMSC: Tstrings;

published
    { Published-Deklarationen }
  property Empfangs_MSN: TStrings read FempfangsMSN write FempfangsMSN;
  property Empfangs_SMSC: TStrings read FempfangsSMSC write FempfangsSMSC;

constructor
FEmpfangsSMSC:=TStringlist.create;
FempfangsMSN:=TStringlist.create;


Ich kann das Feld im Objektinspektor öffnen, etwas der Liste hinzufügen, diese schließen, jedoch wenn ich das Feld das nächste mal öffne will bekomme ich eie Fehlermeldung bei Adresse FFFFFFFD

Wenn ich später im Objekt einen Stringlisteneditor haben möchte bei der Property Empfangs_SMSC, muss die Property und deren Variablen dann vom Type TStrings oder vom Typ TStringlist sein? Muss ich dann sowohl die Property als auch die dazugehörige variable im Constructor erzeugen und wieder freigeben im Destructor? oder nur die Variable?


maximus - Do 21.08.03 12:46

Hallo,

Zitat:
TStrings oder vom Typ TStringlist


ich würde sagen TStringlist, weil TStrings eine abstrakte klasse ist.

Zitat:
Muss ich dann sowohl die Property als auch die dazugehörige variable im Constructor erzeugen und wieder freigeben im Destructor? oder nur die Variable?


Nur die dazugehörige variable! Da die property nur ein 'redirect' auf das entsprechende variablen-feld ist...und klar in constructor erzeugen, im decstructor killen :D


Motzi - Do 21.08.03 15:02

TStrings ist zwar eine abstrakte Klasse, aber wenn du die Variable mit TStringList.Create instanzierst passt das!

Aber was viel wichiger ist! FempfangsMSN und FempfangsMSC sind Instanzen einer Klasse, also nur Pointer. Mit "write FempfangsMSN" überschreibst du also den alten Pointer! Stattdessen solltest du eine Set-Methode einrichten und die übergebene StringListe per Assign() deiner StringListe zuweisen.


neuling82 - Do 21.08.03 15:06

das hört sich ja gut an, aber könntest du mir evtl mal ein kleines Bsp. Posten?? Währe sehr dankbar


Motzi - Do 21.08.03 18:19
Titel: Re: TStrings/TStringlist als Property??
Biddeschön:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
private
FempfangsMSN: TStrings;
FempfangsSMSC: TStrings;
procedure SetEmpfangs_MSN(Value: TStrings);
procedure SetEmpfangs_SMSC(Value: TStrings);
published
    { Published-Deklarationen }
  property Empfangs_MSN: TStrings read FempfangsMSN write SetEmpfangs_MSN;
  property Empfangs_SMSC: TStrings read FempfangsSMSC write SetEmpfangs_SMSC;

constructor
FEmpfangsSMSC:=TStringlist.create;
FempfangsMSN:=TStringlist.create;

procedure SetEmpfangs_MSN(Value: TStrings);
begin
  FempfangsMSN.Assign(Value);
end;

procedure SetEmpfangs_SMSC(Value: TStrings);
begin
  FempfangsSMSC.Assign(Value);
end;


Keldorn - Do 21.08.03 18:37

@ neuling82
öhm, warum muß motzi das gleiche Bespiel posten, was du von AHUser hier [http://www.delphi-groups.de/YaBBSe/index.php?board=7;action=display;threadid=16448] hier bekommen hast? :roll:
wenn das wieder nicht funktioneiert, zeig m,al deinen kompletten Contructor.

Mfg Frank


Tino - Fr 22.08.03 09:18

Hier die entsprechende Antwort:
AHUser hat folgendes geschrieben:
Du brauchst eine write Methode (SetEmpfangs_MSN).

Der Object Inspector hält seine eigene StringListe. Nach beendigung des Stringlisten-Editors weist er dieser der Eigenschaft zu in der Annahme, dass diese Eigenschaft eine Write-Methode hat, die dann die StringListe des OI in die der Instanz kopiert.

Delphi-Quelltext
1:
2:
3:
4:
5:
procedure SetEmpfangs_MSN(Value: TStrings);
begin
  if Value <> FempfangMSN then
    FempfangMSN.Assign(Value);
end;