AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Stringliste als Property funktioniert nicht

Ein Thema von idefix2 · begonnen am 21. Jun 2010 · letzter Beitrag vom 22. Jun 2010
Antwort Antwort
idefix2

Registriert seit: 17. Mär 2010
Ort: Wien
1.027 Beiträge
 
RAD-Studio 2009 Pro
 
#1

Stringliste als Property funktioniert nicht

  Alt 21. Jun 2010, 23:11
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.
  Mit Zitat antworten Zitat
Benutzerbild von Neutral General
Neutral General

Registriert seit: 16. Jan 2004
Ort: Bendorf
5.219 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#2

AW: Stringliste als Property funktioniert nicht

  Alt 21. Jun 2010, 23:15
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
Michael
"Programmers talk about software development on weekends, vacations, and over meals not because they lack imagination,
but because their imagination reveals worlds that others cannot see."
  Mit Zitat antworten Zitat
idefix2

Registriert seit: 17. Mär 2010
Ort: Wien
1.027 Beiträge
 
RAD-Studio 2009 Pro
 
#3

AW: Stringliste als Property funktioniert nicht

  Alt 21. Jun 2010, 23:25
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?
  Mit Zitat antworten Zitat
Benutzerbild von Neutral General
Neutral General

Registriert seit: 16. Jan 2004
Ort: Bendorf
5.219 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#4

AW: Stringliste als Property funktioniert nicht

  Alt 21. Jun 2010, 23:47
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);
Michael
"Programmers talk about software development on weekends, vacations, and over meals not because they lack imagination,
but because their imagination reveals worlds that others cannot see."
  Mit Zitat antworten Zitat
idefix2

Registriert seit: 17. Mär 2010
Ort: Wien
1.027 Beiträge
 
RAD-Studio 2009 Pro
 
#5

AW: Stringliste als Property funktioniert nicht

  Alt 22. Jun 2010, 00:05
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.
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 08:47 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