Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Stringliste als Property funktioniert nicht (https://www.delphipraxis.net/152411-stringliste-als-property-funktioniert-nicht.html)

idefix2 21. Jun 2010 22:11

Stringliste als Property funktioniert nicht
 
Hallo,

ich habe eine Komponente von TStringgrid abgeleitet:
Delphi-Quellcode:
  TfdStringGrid = class(TStringGrid)
  private
    FTest1: TStringList;
  public
    constructor Create (Sender: TComponent); override;
    procedure Datenzeigen;
  published
    property Test1: TStringList read FTest1 write FTest1;
  end;
Die beiden Methoden:
Delphi-Quellcode:
constructor TfdStringGrid.Create (Sender: TComponent);
begin
inherited;
FTest1 := TStringList.Create;
Datenzeigen;
end;

procedure TfdStringGrid.Datenzeigen;
begin
showmessage ('Test1: '+FTest1.Text);
end;
Jetzt kann ich im Property Editor für Test1 irgend einen Wert eingeben und speichern (ohne eine Fehlermeldung auszulösen).
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.

Neutral General 21. Jun 2010 22:15

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:
 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;
Gruß
Neutral General

idefix2 21. Jun 2010 22:25

AW: Stringliste als Property funktioniert nicht
 
Danke, ich werde es so versuchen. Aber jetzt verstehe ich gar nichts mehr: Laut Delphi Hilfe

Zitat:

Von TStrings abgeleitete Objekte ermöglichen die Speicherung und Bearbeitung von String-Listen. TStrings enthalten abstrakte bzw. rein virtuelle (C++ Terminologie) Methoden und sollten nicht direkt instantiiert werden.
ist TStrings doch eine abstrakte Klasse und sollte nur als Vorfahrklasse von irgend etwas verwendet werden, wo die abstrakten Methoden dann überschrieben werden (wie z.B. TStringlist). Es fällt mir aber auf, dass ich schon in verschiedenen Klassen TStrings gesehen habe, habe mich dort gewundert, aber bis jetzt noch nicht darüber nachgedacht.

Nur aus Interesse: Warum braucht das Ding eigentlich eine Setter Routine, die tut doch nichts anderes als den Zeiger zuweisen?

Neutral General 21. Jun 2010 22:47

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:
// Dekleration
private
    FTest1: TStrings;

// Instanzierung
 FTest1 := TStringList.Create;
Ein Setter wird benötigt eben weil KEIN Zeiger zugewiesen werden soll!
Im Setter übernimmt deine FTest1-Stringliste nur die Daten der im Setter übergebenen TStrings!

Delphi-Quellcode:
if Assigned(Value) then
    FTest1.Assign(Value);

idefix2 21. Jun 2010 23:05

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 01:53 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