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
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!