IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
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

Langage Delphi Discussion :

TList ErreurType Record, Object ou Class requis


Sujet :

Langage Delphi

  1. #1
    Membre actif
    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Décembre 2003
    Messages
    167
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : Distribution

    Informations forums :
    Inscription : Décembre 2003
    Messages : 167
    Points : 208
    Points
    208
    Par défaut TList ErreurType Record, Object ou Class requis
    Bonjour

    Je viens de remarquer un comportement bizarre du compilateur avec Tlist et la façon d’accéder à un élément de la liste
    Le code d'exemple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    unit Unit1;
     
    interface
     
    uses
      Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
      Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls;
     
    type
      tmonobjet = class(tobject)
        fstrNom : string;
        fstrDescription : string;
      end;
     
      tmaliste = class (tlist)
      protected
        function Get(Index: longword): tmonobjet;
        procedure Put(Index: longword; Item: tmonobjet);
      public
        function Add(Item: tmonobjet): int64;
        procedure Clear;override;
        procedure Delete(Index: longword);
        procedure Remove(index : longword);
        property items[Index: longword]: tmonobjet read Get write Put; default;
        constructor Create ;overload;
        destructor Destroy ;override;
      end;
     
      TForm1 = class(TForm)
        Button1: TButton;
        procedure Button1Click(Sender: TObject);
      private
        { Déclarations privées }
      public
        { Déclarations publiques }
      end;
     
    var
      Form1: TForm1;
     
    implementation
     
    {$R *.dfm}
     
    procedure TForm1.Button1Click(Sender: TObject);
    var
      uneListe : tmaliste;
      unObjet : tmonobjet;
      index : longword;
      index2 : integer;
    begin
      uneliste := tmaliste.Create;
      unObjet := tmonobjet.Create;
      unObjet.fstrNom :='object';
      unObjet.fstrDescription := 'description object';
      uneliste.Add(unobjet);
      index := 1;
      caption := uneliste[index].fstrnom;
      caption := uneliste[index2].fstrnom;           // <- erreur
      caption := uneliste[1].fstrnom;                // <- erreur
      uneliste.Free
    end;
     
    { tmaliste }
     
    function tmaliste.Add(Item: tmonobjet): int64;
    begin
      result := inherited add(item);
    end;
     
    procedure tmaliste.Clear;
    begin
      While (Count>0) do
        Delete(Count-1);
    end;
     
    constructor tmaliste.Create;
    begin
      inherited Create;
    end;
     
    procedure tmaliste.Delete(Index: longword);
    var
      tTemp : tmonobjet;
    begin
      tTemp:=Get(Index);
      inherited Delete(Index);
      if assigned(tTemp) then tTemp.free;
    end;
     
    destructor tmaliste.Destroy;
    begin
      clear;
      inherited;
    end;
     
    function tmaliste.Get(Index: longword): tmonobjet;
    begin
      result := tmonobjet ( inherited items[index] );
    end;
     
    procedure tmaliste.Put(Index: longword; Item: tmonobjet);
    var
      tTemp : tmonobjet;
    begin
      tTemp := get(index);
      inherited put(index,item);
      if assigned (tTemp) then tTemp.free;
    end;
     
    procedure tmaliste.Remove(index: longword);
    begin
      inherited Delete(Index);
    end;
     
    end.
    J'ai une erreur du compilateur des que je tente d'accéder à un élément soit via un chiffre directement ou une variable de type integer
    [dcc32 Erreur] Unit1.pas(59): E2018 Type Record, Object ou Class requis
    cela serait il lié au fait que j'ai déclaré items avec un index de type longword ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    property items[Index: longword]: tmonobjet read Get write Put; default;
    je me rends compte en écrivant que cela ne doit pas forcement bien marcher si je dépasse les 2147483647 éléments dans ma liste
    car tlist gère les élément avec index de type integer

  2. #2
    Rédacteur/Modérateur
    Avatar de Andnotor
    Inscrit en
    Septembre 2008
    Messages
    5 693
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 693
    Points : 13 128
    Points
    13 128
    Par défaut
    Tiré de l'aide Delphi :

    Si une classe a une propriété par défaut, vous pouvez accéder à cette propriété en utilisant la forme abrégée object[index] équivalente à object.property[index]. Par exemple, étant donné les déclarations précédentes, StringArray.Strings[7] peut s'abréger en StringArray[7]. Une classe peut n'avoir qu'une seule propriété par défaut avec une signature donnée (liste de paramètres en tableau), mais il est possible de surcharger la propriété par défaut. Changer ou masquer la propriété par défaut dans les classes dérivées peut entraîner un comportement inattendu, car le compilateur effectue toujours les liaisons aux propriétés de manière statique.
    Dans ton cas, c'est l'Items déclaré au niveau du TList auquel tu accèdes et non celui que tu as redéfini. TList.Items étant une liste de pointeurs non typés, le compilateur râle.

  3. #3
    Membre actif
    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Décembre 2003
    Messages
    167
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : Distribution

    Informations forums :
    Inscription : Décembre 2003
    Messages : 167
    Points : 208
    Points
    208
    Par défaut
    Merci Andnotor

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. E2018 Type Record, Object ou Class requis
    Par Skrins dans le forum Bases de données
    Réponses: 9
    Dernier message: 23/04/2013, 11h12
  2. Erreur "Type Record, Object ou Class requis"
    Par gogéta91 dans le forum Débuter
    Réponses: 5
    Dernier message: 31/07/2008, 09h16
  3. Création d'un object sur classe dynamique
    Par TicTacToe dans le forum Delphi
    Réponses: 16
    Dernier message: 16/04/2007, 17h49
  4. type record, objerct ou classe requis ?
    Par babou54 dans le forum Delphi
    Réponses: 3
    Dernier message: 10/01/2007, 13h39
  5. [Création de compo] Stocker une TList de records dans un dfm
    Par Benjamin GAGNEUX dans le forum Composants VCL
    Réponses: 6
    Dernier message: 29/10/2004, 11h01

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo