AGB  ·  Impressum  







Anmelden
Nützliche Links
Registrieren

Generics (Objectlist) in Komponenten

Ein Thema von Keldorn · begonnen am 27. Jun 2012 · letzter Beitrag vom 30. Jun 2012
Antwort Antwort
Keldorn

Registriert seit: 6. Mär 2003
Ort: Meißen
834 Beiträge
 
Delphi XE2 Professional
 
#1

Generics (Objectlist) in Komponenten

  Alt 27. Jun 2012, 20:10
Delphi-Version: XE2
Hallo
Ich scheitere mal wieder an den generics. Wie kann ich eine beliebige generische Objectliste an eine Komponente übergeben und innerhalb einer Komponente verwenden?

z.B. für eine Einstellungskomponente wie im Anhang, die ich gern mit einer generics.objectlist untersetzen möchte. Im Panel rechts soll man weitere Komponenten platzieren können, wo die eigentlichen Einstellungen für jedes einzelne Objekt vornehmen kann. Die ganze Logik mit neu/löschen etc soll die Kompo übernehmen und nur 2 Ereignisse für das Lesen und Setzen eines einzelnen Objektes bereitstellen.

Das wäre alles nicht das Thema, aber ich weiß eben nicht, wie ich die generics.objetlist mit unbekannten Typ hinterlege…
hat jemand einen kleinen Tipp für mich,
Danke im Voraus Frank
Miniaturansicht angehängter Grafiken
kompo.png  

Lükes Grundlage der Programmierung:
Es wird nicht funktionieren
(Murphy)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
27.599 Beiträge
 
Delphi XE3 Professional
 
#2

AW: Generics (Objectlist) in Komponenten

  Alt 27. Jun 2012, 20:20
Du erstellst dir einen Typen für diese Liste.

Delphi-Quellcode:
type
  TDeineListe = TObjectList<TDeinObjekt>;
Und verwendest diesen Typen, genauso, wie du auch die nichtgenerische TObjectList verwenden würdest.


Aber:
Wenn du diesen Typen für ein Published-Property verwenden willst, dann gibt es ein klitzekleines Problem, denn im "internen" Klassennamen der TDeineListe gibt es < und >,
da TDeineListe nur ein Alias ist ist, wärend der eigentliche Typ "TObjectList<TDeinObjekt>" lautet und genau diese Zeichen sind in der VCL nicht für Typtbezeichner erlaubt.

Lösung: Ein "nichtgerneischer" Typ, also in der letzen Ableitung.

Delphi-Quellcode:
type
  TDeineGenListe = TObjectList<TDeinObjekt>;

  TDeineListe = class(TDeineGenListe)
    // wenn hier nix ist, dann geht auch das Nächste.
  end;

  TDeineListe = class(TDeineGenListe);

// oder ohne den unnützen Zwischentypen/Alias

type
  TDeineListe = class(TObjectList<TDeinObjekt>);


Weitere Typen kannst du natürlich nur über Vererbung bereitstellen, da du deiner "VCL"-Komponente natürlich nur einen Typen bekanntmachen kannst.
(abgesehn, wenn man es auf mehere Zugangspunkte, also Methoden und/oder Property verteilt)

Also entweder für die Übergabepunkte TObject (nicht "List") nutzen, was der Vorfahre aller Delphiklassen ist.
Oder eben ein generischer Typ (wie oben genannt) als Vorfahre und für die Schnittstellen dann davon weitere Typen ableiten.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
Delphi-Tage 2005-2014

Geändert von himitsu (27. Jun 2012 um 20:27 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von sx2008
sx2008

Registriert seit: 15. Feb 2008
Ort: Baden-Württemberg
2.280 Beiträge
 
Delphi 2007 Professional
 
#3

AW: Generics (Objectlist) in Komponenten

  Alt 28. Jun 2012, 01:44
Du könntest aber auch das Wort "Generics" mal temporär komplett aus deinem Gedächtnis streichen.
Denn die VCL bietet seit Delphi 2 einen Weg Objekte innerhalb TStrings zu speichern.
Eine Listbox hat ja das Property Items.
Man kann nun für jeden Eintrag in Items ein zusätzliches Object speichern.
Delphi-Quellcode:
var
  p : TMobilphone;
begin
  p := TMobilphone.Create;
  p.Name := 'S3';
  p.Preis := 599.0;
  listbox1.Items.AddObject('Samsung S3', p);

  p := TMobilphone.Create;
  p.Name := '4S';
  p.Preis := 599.0;
  listbox1.Items.AddObject('IPhone 4S', p);
Diese Objekte kann man natürlich auch wieder auslesen; is klar.
Damit kannst du TListBox, TComboBox, TMemo unverändert verwenden und zusätzlich Objekte speichern.

http://delphi.about.com/od/vclusing/..._addobject.htm
http://delphi.about.com/od/delphitip...gs-objects.htm
  Mit Zitat antworten Zitat
Benutzerbild von jaenicke
jaenicke

Registriert seit: 10. Jun 2003
Ort: Berlin
4.779 Beiträge
 
Delphi XE6 Enterprise
 
#4

AW: Generics (Objectlist) in Komponenten

  Alt 28. Jun 2012, 05:32
Das Casten ist da dank Generics nach außen gar nicht mehr notwendig. Ich habe dafür einfach eine generische TStringObjectList geschrieben, die den alten Code 1:1 ersetzt, aber dabei dank Generics typsicher ist.

Auf die Typsicherheit ganz zu verzichten macht aber nur dann Sinn, wenn es sich damit nicht machen lässt. Und da bin ich mir hier nicht ganz sicher wie das gemeint ist.
Ich scheitere mal wieder an den generics. Wie kann ich eine beliebige generische Objectliste an eine Komponente übergeben und innerhalb einer Komponente verwenden?
Wenn du damit meinst, dass du ein Objekt hast, an das du parallel wahlweise verschiedene generische Objektlisten übergeben willst, geht das nicht, da ein gemeinsamer Vorfahr fehlt.

Eine Möglichkeit wäre die Klasse so zu definieren:
Delphi-Quellcode:
type
  TMySettings<T> = class
  public
    property MyList: TObjectList<T>
  end;
Dann kann der Benutzer sich selbst die passende erzeugen und verwenden.

Wenn es aber ein und dieselbe Komponente sein soll, die man auf ein Formular legen soll, dann geht das so nicht. Dann bliebe wirklich nur ohne Generics zu arbeiten oder als Typ in der Liste TValue (Unit RTTI) zu nehmen. Das ist ein Typ, der ähnlich wie Variants funktioniert, aber keine Typumwandlungen macht. Wenn ich einen Integer reinlege, kann ich keinen String herausholen. Ich kann aber auch einen String hineinpacken.
Sebastian Jänicke
Alle eigenen Projekte sind eingestellt, ebenso meine Homepage, Downloadlinks usw. im Forum bleiben aktiv!
  Mit Zitat antworten Zitat
Keldorn

Registriert seit: 6. Mär 2003
Ort: Meißen
834 Beiträge
 
Delphi XE2 Professional
 
#5

AW: Generics (Objectlist) in Komponenten

  Alt 30. Jun 2012, 08:25
Hallo,

danke für eure Antworten

kurz noch mal zum besseren Verständnis: ich habe z.B. meine Einstellungsklasse, mit diversen Objectlisten für diverse Einstellungen (TBasisObjectList<Tobject1>, TBasisObjectList<Tobject2>, TBasisObjectList<Tobject3>, …) und will dann in meiner Einstellungsform dann für jede Objectlist eine solche Kompo verwenden.

sx2008: ja, die Vorgehensweise kenne ich. Aber das macht die Sache für mich nicht einfacher, ich will ja die ganze Logik in der Komponente haben. Das würde so dann nicht funktionieren, wenn ich die Objekte mit dranhänge oder dann später die Objektliste wieder aufbaue.


Eine Möglichkeit wäre die Klasse so zu definieren:
Delphi-Quellcode:
type
  TMySettings<T> = class
  public
    property MyList: TObjectList<T>
  end;
Genau, aber was ich ja bräuchte wäre das als Komponente
  TFrameXYZ<T> = class(TFrame) Geht so leider nicht.

Ich muß noch mal drüber schlafen, werde es wahrscheinlich so machen, dass ich mir die listen in der Art übergebe
procedure Proc_ObjectListeDatenSetzen<T: class>(AList: TObjectList<T>); Und die Daten dann dort auslese und in eine normale ObjectList übertrage. Ich hatte halt gehofft, ich kann direkt mit der übergebenen Liste weiterarbeiten, das würde vieles vereinfachen.

Gruß Frank

Lükes Grundlage der Programmierung:
Es wird nicht funktionieren
(Murphy)
  Mit Zitat antworten Zitat
Benutzerbild von jaenicke
jaenicke

Registriert seit: 10. Jun 2003
Ort: Berlin
4.779 Beiträge
 
Delphi XE6 Enterprise
 
#6

AW: Generics (Objectlist) in Komponenten

  Alt 30. Jun 2012, 09:08
Genau, aber was ich ja bräuchte wäre das als Komponente
  TFrameXYZ<T> = class(TFrame) Geht so leider nicht.
Nicht direkt, nein, aber indirekt mit einem nicht ganz schönen Trick schon, siehe Anhang.

Ob das Sinn macht, ist eine andere Frage. Denn irgendwo muss man den Typ ja schon explizit behandeln für solche Komponenten.
Angehängte Dateien
Dateityp: 7z Generic Frame.7z (517,5 KB, 12x aufgerufen)
Sebastian Jänicke
Alle eigenen Projekte sind eingestellt, ebenso meine Homepage, Downloadlinks usw. im Forum bleiben aktiv!
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
27.599 Beiträge
 
Delphi XE3 Professional
 
#7

AW: Generics (Objectlist) in Komponenten

  Alt 30. Jun 2012, 10:06
Delphi hat leider ein sehr großes Problem, bei der Framevererbung, speziell der FormDesigner kommt damit oftmals einfach nicht klar
und wenn er was nicht versteht, dann sagt er sich einfach (ohne uns ein Wort zu sagen, was ihm nicht gefällt) "das ist eine TForm" und fertig.
Bei TForm-Nachfahren fällt dieses Problem natürlich nicht auf.

Das merkt man ganz schnell, wenn der Frame urplötzlich einen Border und Titelleiste bekommt.
Wenn man das dann speichert, kann man dieses Frame nurgends mehr verwenden, denn wenn im Programm dann der DFM-Loader dieses Frame laden soll, dann kracht es gewaltig, sobald Property der TForms auftauchen, wie z.B. ClientHeight, welche es im TFrame nicht gibt.



De Trick mit dem "TFrame" als Zwischentyp hilft zwar das Frame als Frame im Formdesigner zu laden, aber wenn/da der Formdesigner dieses nicht richtig läd, sieht man natürlich das Edit nicht im Formdesigner, bzw. eben auch nicht alle anderen Komponenten, welche man auf den Vorfahren legen würde.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
Delphi-Tage 2005-2014

Geändert von himitsu (30. Jun 2012 um 10:19 Uhr)
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

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 · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 14:59 Uhr.
Powered by vBulletin® Copyright ©2000 - 2014, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2014 by Daniel R. Wolf