![]() |
Stringliste als Property funktioniert nicht
Hallo,
ich habe eine Komponente von TStringgrid abgeleitet:
Delphi-Quellcode:
Die beiden Methoden:
TfdStringGrid = class(TStringGrid)
private FTest1: TStringList; public constructor Create (Sender: TComponent); override; procedure Datenzeigen; published property Test1: TStringList read FTest1 write FTest1; end;
Delphi-Quellcode:
Jetzt kann ich im Property Editor für Test1 irgend einen Wert eingeben und speichern (ohne eine Fehlermeldung auszulösen).
constructor TfdStringGrid.Create (Sender: TComponent);
begin inherited; FTest1 := TStringList.Create; Datenzeigen; end; procedure TfdStringGrid.Datenzeigen; begin showmessage ('Test1: '+FTest1.Text); end; Wenn ich aber unmittelbar darauf noch einmal den Propertyeditor für Test1 aufrufen will (Doppelklick im Objektinspektor), kommt folgende Exception: TFont kann nicht zu TRicheditstrings zugewiesen werden. Danach spielt die IDE zunehmend verrückt. Der Versuch, nach dieser Fehlermeldung irgend etwas zu kompilieren, erzeugt mir die Exception: Zugriffsverletzung bei Adresse 5003F3D2 im Modul 'rtl120.bpl'. Lesen von Adresse 00000001. |
AW: Stringliste als Property funktioniert nicht
Hallo,
Zum einen solltest du besser TStrings als formalen Typ benutzen. Und dann brauchen solche Published Objekt-Properties immer einen Setter:
Delphi-Quellcode:
Gruß
TfdStringGrid = class(TStringGrid)
private FTest1: TStrings; procedure SetTest1(const Value: TStrings); public constructor Create (Sender: TComponent); override; procedure Datenzeigen; published property Test1: TStrings read FTest1 write SetTest1; end; constructor TfdStringGrid.Create (Sender: TComponent); begin inherited; FTest1 := TStringList.Create; Datenzeigen; end; procedure TfdStringGrid.SetTest1(const Value: TStrings) begin if Assigned(Value) then FTest1.Assign(Value); end; procedure TfdStringGrid.Datenzeigen; begin showmessage ('Test1: '+FTest1.Text); end; Neutral General |
AW: Stringliste als Property funktioniert nicht
Danke, ich werde es so versuchen. Aber jetzt verstehe ich gar nichts mehr: Laut Delphi Hilfe
Zitat:
Nur aus Interesse: Warum braucht das Ding eigentlich eine Setter Routine, die tut doch nichts anderes als den Zeiger zuweisen? |
AW: Stringliste als Property funktioniert nicht
Hallo,
Du darfst TStrings nicht instanzieren! Aber das tut der Code auch nicht. Instanziert wird eine TStringlist:
Delphi-Quellcode:
Ein Setter wird benötigt eben weil KEIN Zeiger zugewiesen werden soll!
// Dekleration
private FTest1: TStrings; // Instanzierung FTest1 := TStringList.Create; Im Setter übernimmt deine FTest1-Stringliste nur die Daten der im Setter übergebenen TStrings!
Delphi-Quellcode:
if Assigned(Value) then
FTest1.Assign(Value); |
AW: Stringliste als Property funktioniert nicht
Danke nochmal, jetzt habe ich es verstanden auch.
Ich war der Meinung, assign würde nur den Zeiger setzen. Es funktioniert übrigens (aber das ist ja fast zu erwarten, wenn man es richtig macht). Fein, dass es dieses Forum gibt. Nach dem Erfolgserlebnis leg ich mich schlafen - Gute Nacht. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 16:34 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