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 :

Comment ajouter un objet dans un TLIST ?


Sujet :

Langage Delphi

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé

    Homme Profil pro
    Informaticien retraité
    Inscrit en
    Mars 2010
    Messages
    369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Informaticien retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2010
    Messages : 369
    Billets dans le blog
    1
    Par défaut Comment ajouter un objet dans un TLIST ?
    je suis sous W10 avec Delphi 6 PE.

    J'essaie d'utiliser un TLIst comme index dynamique poyr des enregsirements dans un fichier binaire.
    L'accès au fichier binaire fonctionne bien.

    J'ai créé un objet constituant un éément de mon index, composé de deux entités:
    - une clé binaire représentée dans ARRAY OF BYTE dynamique
    - un index dans mon fichier, contenu dans un INTEGER.
    Ma clé binaire est composée d'une partie texte avec une longueur fixe de 20 caractures (paramétrée par une constante) et une partie binaire représentée par une valeur integer pour la démo. Ma clé est donc de 24 caractères.

    Mon objet contenant la clé est défini comme suit:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    type
      pTIndexElement = ^TIndexElement;
      TIndexElement = class
        Key: array of byte;
        private
          fIndex: integer;
        published
          constructor CreateNew(aSize: integer);
          destructor Destroy; override;
          property Index: integer read fIndex write fIndex;
      end;
    Je peux créer cet objet le le charger avec mes valeurs sans problème.

    Mais ensuite, il faut l'ajouter à un TLIST et j'ai toujours une violation de mémoire.
    Je fais comme ceci:
    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
    var
      IDX: TList;
    ...
    procedure TForm1.Button2Click(Sender: TObject);
    var
      IE: TIndexElement;
      s: string;
      pb: pByte;
      kint, ind: integer;
      p: Pointer;
    begin
      IE := TIndexElement.CreateNew(TextKeyLength+BinaryKeyLength);
      s := LeftStr(Edit1.Text+StringOfChar(' ',TextKeyLength),TextKeyLength);
      kint := SpinEdit1.Value;
      ind  := SpinEdit2.Value;
      pb := pByte(@IE.Key[0]);
    showmessage('a1');
      Move(s,pb^,TextKeyLength);
    showmessage('a2');
      inc(pb,TextKeyLength);
      Move(kint,pb^,BinaryKeyLength);
    showmessage('a3');
      IE.Index := ind;
    showmessage('a4');
      IDX.Add(IE);              // violation de mémoire
      IDX.Add(@IE);             // violation de mémoire
      IDX.Add(Pointer(IE));     // violation de mémoire
    showmessage('a5');
    end;
    Quelque soit la syntaxe de la méthode ADD parmi les 3 essayés, j'ai toujours une violation de mémoire.
    Mon l$MEssage a4 apparaît, mais pas le a5.

    En pièce jointe, j'ai mis un fichier ZIP avec le projet complet.

    Pourriez-vous me mettre sur la voie, s'il vous plaît ! Merci d'avabce !
    Fichiers attachés Fichiers attachés

  2. #2
    Expert éminent
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    14 093
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 14 093
    Par défaut
    Tu peux aussi utiliser une TObjectList, cela sera un poil plus élégant pour le transtypage

    Tu peux même dériver une TObjectList pour redefinir Items et avoir le cast automatique, ainsi que la libération automatique

    Sache que TIndexElement est un objet donc un pointeur déguisé donc inutile de faire un pointeur de pointeur

    N'oublie pas le IDX := TList.Create ou IDX := TObjectList.Create(True); qu'il semble te manquer (je n'ai pas regardé le zip mais c'est ce que l'on voit dans l'extrait)

    Avec TList, le plus explicite

    Avec TObjectList, le plus simple

    l'utilisation

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    // Avec TList en mode parano
    TObject(Pointer(IDX.Items[I])) as TIndexElement).Index ...
     
    // Avec TObjectList en mode parano
    (IDX.Items[I] as TIndexElement).Index ...
     
    // Les deux en mode simpliste
    TIndexElement(IDX.Items[I]).Index ...

    Et enfin la dérivée qui est le plus pratique mais plus long au début, avec Add et Insert redéfini, tu as plus de chance que cela soit des TIndexElement comme Items, protégé à la compilation

    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
    type
      TIndexElements = class(TObjectList)
      private
        function GetItem(Index: Integer): TIndexElement;
        procedure SetItem(Index: Integer; const Value: TIndexElement);
      public
        function Add(AObject: TIndexElement): Integer;
        procedure Insert(Index: Integer; AObject: TIndexElement);
        // idéalement, redéfinir toutes les méthodes qui renvoient un TObject
        property Items[Index: Integer]: TIndexElement read GetItem write SetItem; default;
      end;
     
    { TIndexElements }
     
    function TIndexElements.Add(AObject: TIndexElement): Integer;
    begin
      Result := inherited Add(AObject);
    end;
     
    procedure TIndexElements.Insert(Index: Integer; AObject: TIndexElement);
    begin
      inherited Insert(Index, AObject);
    end;
     
    function TIndexElements.GetItem(Index: Integer): TIndexElement;
    begin
      Result := TIndexElement(inherited GetItem(Index));
    end;
     
    procedure TIndexElements.SetItem(Index: Integer; const Value: TIndexElement);
    begin
      inherited SetItem(Index, Value);
    end;
    et l'utilisation est la plus lisible

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    IDX.Items[I].Index ...
     
    // Encore plus court possible
    IDX[I].Index ...
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  3. #3
    Expert confirmé
    Avatar de anapurna
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2002
    Messages
    3 491
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 491
    Par défaut
    Salut

    regarde cette conversation

    sinon utilise un TstringList, il y a une methode AddObject ou tu peut injecter du texte et un objet

  4. #4
    Membre éclairé

    Homme Profil pro
    Informaticien retraité
    Inscrit en
    Mars 2010
    Messages
    369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Informaticien retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2010
    Messages : 369
    Billets dans le blog
    1
    Par défaut
    Merci à vous deux !

    Les premiers essais sont concluants, je vais donc l'engager dans cette voie.
    Un grand Merci :

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

Discussions similaires

  1. Réponses: 1
    Dernier message: 15/06/2022, 12h37
  2. Réponses: 2
    Dernier message: 23/08/2017, 11h39
  3. Réponses: 2
    Dernier message: 19/05/2009, 23h41
  4. Comment Manipuler des objets dans une liste de type TList ?
    Par PadawanDuDelphi dans le forum Delphi
    Réponses: 1
    Dernier message: 02/11/2006, 15h40
  5. [système] Comment ajouter un item dans le context menu de Windows ?
    Par ddmicrolog dans le forum API, COM et SDKs
    Réponses: 8
    Dernier message: 29/06/2005, 17h03

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