Entwickler-Ecke

Delphi Language (Object-Pascal) / CLX - TStrings im als Eigenschaft im Objektinspektor


CyDummy - So 19.01.03 22:53
Titel: TStrings im als Eigenschaft im Objektinspektor
Hallöchen!

Warum funktionert der folgende Quellcode nicht?


Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
TThumbnailComponent = class(TGroupBox)
protected
  ThumbsList: TStringList; // Namen
published
  // Liste aller Thumbnails
  property Thumbnails: TStringList read ThumbsList write ThumbsList;
end;

constructor TThumbnailComponent.Create(AOwner: TComponent);
begin
  [...]
  ThumbsList := TStringList.Create;
  [...]
end;


Ich hoffe es kann mir jemand helfen, ich sitze nämlich schon den ganzen Tag an dieser Ecke fest...


smiegel - So 19.01.03 22:57

Hallo,

was kommt für eine Fehlermeldung?

Liegt es daran, dass ThumbsList als protected und nicht als private deklariert wird?


CyDummy - So 19.01.03 23:38

Nein, damit hat es wohl nichts zu tun... Ich habe zu dem Thema zwar eine Stelle in meinem schlauen Buch gefunden, die hilft mir allerdings auch nicht weiter:

[...] Dabei können diese Klassen so weit gehen, dass sie zwar eine virtuelle Methode deklarieren, die in allen abgeleiteten Klassen überschrieben wird, dass sie diese selbst jedoch gar nicht implementieren.
Um eine derartige Methode zu deklarieren, die nur als Platzhalter für die Methoden abgeleiteter Klassen dient, können Sie sie mit der Direktive abstract als abstrakte Methode deklarieren.[...]

Quelltext
1:
procedure Arbeite; virtual; abstract;                    

Diese Deklaration hat den Vorteil, dass Sie die Methode nicht im Implementationsteil der Unit definieren müssen und dass ein Aufruf dieser Methode zu einem Laufzeitfehler mit der Nummer 210 führt, wodurch sichergestellt ist, dass diese Methode nicht versehentlich aufgerufen wird. In Methoden abgeleiteter Klassen, die abstrakte Methoden überschreiben, dürfen Sie daher die geerbte abstrakte Methode auch nicht mit inherited aufrufen.
Beispiele für abstrakte Klassen der VCL sind TStream, TStrings und TPersistent.


smiegel - So 19.01.03 23:43

Hallo,

Du brauchst keine Abstrakte-Klassen.

Hast Du bei der Deklaration Deines Objectes den Constructor Create überschrieben?


Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
TThumbnailComponent = class(TGroupBox) 
private
  ThumbsList: TStringList; // Namen 
published 
  // Liste aller Thumbnails 
  property Thumbnails: TStringList read ThumbsList write ThumbsList; 
public
  constructor Create(aOwner:TComponent); override;
end; 


constructor TThumbnailComponent.Create(AOwner: TComponent); 
begin 
  inherited Create(aOwner);
  ThumbsList := TStringList.Create; 
  [...] 
end;


CyDummy - Mo 20.01.03 00:44

Jep, hab ich.

Auch dieser Versuch hat leider nicht funktioniert:

Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
TThumbnailComponent = class(TGroupBox) 
protected 
  ThumbsList: String; // Namen 
  procedure SetThumbsList(New: TStrings);
  function GetThumbsList: TStrings;
published 
  // Liste aller Thumbnails 
  property Thumbnails: TStrings read GetThumbsList write SetThumbsList; 
public 
  constructor Create(aOwner:TComponent); override; 
end; 


constructor TThumbnailComponent.Create(AOwner: TComponent); 
begin 
  inherited Create(aOwner); 
  [...] 
end;

procedure TThumbnailComponent.SetThumbsList(New: TStrings);
begin
  ThumbsList := New.CommaText;
end;

function TThumbnailComponent.GetThumbsList: TStrings;
begin
  Result.CommaText := ThumbsList;
end;


Keldorn - Mo 20.01.03 13:34

Hallo

in deiner thumbnailcomponente existiert keine instanz von Thumblist
und da kann der folgende Aufruf nicht funktionieren

Quelltext
1:
2:
3:
4:
procedure TThumbnailComponent.SetThumbsList(New: TStrings);
begin
  ThumbsList := New.CommaText;
end;

erstell eine instanz bei create und im destructor destroy gibst du sie wieder frei

Quelltext
1:
2:
3:
4:
function TThumbnailComponent.GetThumbsList: TStrings;
begin
  Result.CommaText := ThumbsList;
end;

geht auch in die Hose. result gibt es auch nicht instanz. Abgesehen ist davon ist der Aufruft falsch, wenn schon, dann Result.CommaText := ThumbsList.commatext.
du kannst dir schnell irgendwo ein speicherloch schaffen,wenn du nicht aufpaßt.statt commatext, kannst du auch die Assign-Methoden verwenden, um die Listen zu kopieren. mit thumblist:=New hast du ein speicherloch.
laß die Getmethode und greif bei read direkt auf die Thumblist zu. die Übergabe kann an einer anderen Stelle,außerhalb, erfolgen
blabla.commatext:=Thumbnailcomponent.thumblist.commatext.
Mfg Frank