Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

  1. #1
    Futur Membre du Club
    TObjectList<T> ne peut contenir des instances de classes dérivant de T ?
    Hello,

    J'ai voulu utiliser TObjectList<T> pour stocker des instances de colonnes dans une liste.

    Le problème est que Delphi ne me laisse ajouter que des instances de T dans cette liste, et râle quand je veux ajouter des instances de classes dérivées de T !

    C'est dommage car c'est classique d'avoir une classe de base et des classes dérivées spécialisées.

    Confirmez vous cette limitation ?

    Emmanuel

  2. #2
    Rédacteur/Modérateur

    Bonjour,

    Il faut remplacer le T par le type d'objet. Je peux stocker des formes dans un TObjectList de la manière suivante
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    ListedeFormes : TObjectList<TForm>;

    et accéder à tout objet de cette forme, pourvu de bien transtyper
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    TForm(ListedeFormes[i]).Caption:='toto'

    Confirmez-vous cette limitation ?
    Non ou alors, pour moi, vous expliquez mal votre problème, ce qu'un bout de code aurait montré
    La seule chose absolue dans un monde comme le nôtre, c'est l'humour. » Albert Einstein

    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Tokyo, Rio, Sidney) et peut être quelques autres
    SGBD : Firebird 2.5, 3, SQLite
    générateurs Etats : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Ubuntu, Androïd

  3. #3
    Expert éminent sénior
    ce n'est pas le cas, peut-on voir ton code ?

    démonstration
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
     
    uses
      System.Generics.Collections;
     
    procedure TForm1.FormCreate(Sender: TObject);
    var
      L: TObjectList<TComponent>;
    begin
      L := TObjectList<TComponent>.Create(False);
      L.Add(Self);
      L.Free;
    end;
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

  4. #4
    Futur Membre du Club
    Je sais qu'il faut remplacer T par le type d'objet.

    Ma question portait sur l'ajout dans la liste, d'instances de classes dérivées de T.

    Exemple :

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    type
      TExemple = class
      end;
     
      TExemple1 = class(TExemple)
      end;
     
      TExemple2 = class(TExemple)
      end;


    Pour répondre à ma question, oui c'est bien possible. Il n'y a pas de limitation. J'avais fait une erreur dans le type d'une variable locale.

    Ceci passe bien à la compilation :

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    var
      Exemples: TObjectList<TExemple>;
    begin
      Exemples := TObjectList<TExemple>.Create(True);
      Exemples.Add(TExemple1.Create);
      Exemples.Add(TExemple2.Create);