Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   Delphi Generische Liste sichtbar im Objekt-Inspektor (https://www.delphipraxis.net/203716-generische-liste-sichtbar-im-objekt-inspektor.html)

Andreas L. 16. Mär 2020 13:27

Generische Liste sichtbar im Objekt-Inspektor
 
Hallo,
eine eigene Komponente soll eine Listen-Eigenschaft haben die im Objekt-Inpsektor auch bearbeitet werden kann. Bisher habe ich für solche Eigenschaften eine TOwnedCollection mit TCollectionItem verwendet. Das funktioniert auch in Delphi 10.3 einwandfrei. Jetzt würde ich gerne wissen ob ich so eine Funktionalität auch mit Generics erreichen kann?

Wenn ich versuche eine generische TCollection zu definieren bekomme ich folgender Fehlermeldung:
Zitat:

[dcc32 Fehler] Unit1.pas(18): E2003 Undeklarierter Bezeichner: 'TOwnedCollection<>'
Mein Code:
Delphi-Quellcode:
uses
  ..., System.Generics.Defaults, System.Generics.Collections, System.ContNrs;

type
  TMyItem = class(TCollectionItem)
  private
    FText: string;
  published
    property Text: string read FText write FText;
  end;

  TMyCollection = class(TOwnedCollection<TMyItem>); // <-- Fehler
Mit einer TCollection statt TOwnedCollection kommt der selbe Fehler. Wenn ich einfach eine generische TObjectList verwende kann diese nicht im Objekt-Inspektor bearbeitet werden. Kompilieren lässt sich das aber problemlos.

Brauche ich vielleicht eine andere Listen-Klasse als TObjectList? Oder gehts auch mit TCollection und ich mache was falsch? Oder bleibt mir nichts anderes übrig als es wie bisher zu machen?

Beispiel:
Delphi-Quellcode:
  ...

  TlcfBrowserCollectionItem = class;

  TlcfBrowserCollection = class(TOwnedCollection)
  protected
    function GetBrowser(Index: Integer): TlcfBrowserCollectionItem;
    procedure SetBrowser(Index: Integer; Value: TlcfBrowserCollectionItem);
  public
    function Add: TlcfBrowserCollectionItem; reintroduce; overload; virtual;
    property Browsers[Index: Integer]: TlcfBrowserCollectionItem
      read GetBrowser write SetBrowser; default;
  end;

  TlcfBrowserCollectionItem = class(TCollectionItem)
  private
    FBrowserName: String;
  protected
    procedure SetBrowserName(Value: String);
  public
    procedure AssignTo(Dest: TPersistent); override;
  published
    property BrowserName: String
      read FBrowserName write SetBrowserName;
  end;

  ...
Hat jemand eine Idee?

Uwe Raabe 16. Mär 2020 14:34

AW: Generische Liste sichtbar im Objekt-Inspektor
 
Erstmal ist die Fehlermeldung ja recht eindeutig: Du hast offenbar nirgendwo eine generische TOwnedCollection<T> deklariert. Aber selbst wenn, ist der Erfolg nicht unbedingt garantiert.

Der Umstand, daß eine Collection im Objekt-Inspektor bearbeitet werden kann, liegt daran, daß in ColnEdit.pas (zu finden in Source\Property Editors) für von TCollection abgleitete Properties ein Editor registriert wird. Ob der mit einer generischen Collection zurechtkommt bedarf zumindest einer Überprüfung.

Die TObjectList-Abkömmlinge erfüllen diese Voraussetzung aber gar nicht und benötigen daher einen eigenen Property Editor.


Alle Zeitangaben in WEZ +1. Es ist jetzt 16:32 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