Einzelnen Beitrag anzeigen

Andreas L.

Registriert seit: 23. Mai 2011
Ort: Furth im Wald
308 Beiträge
 
Delphi 11 Alexandria
 
#1

Generische Liste sichtbar im Objekt-Inspektor

  Alt 16. Mär 2020, 13:27
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?
Andreas Lauß
Blog
  Mit Zitat antworten Zitat