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 :

Stocker des entiers dans Objects de TStrings


Sujet :

Langage Delphi

  1. #1
    Inactif  
    Profil pro
    Inscrit en
    Février 2003
    Messages
    4 341
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2003
    Messages : 4 341
    Points : 5 953
    Points
    5 953
    Par défaut Stocker des entiers dans Objects de TStrings
    Bonjour,

    Voila, dans une combo box, j'affiche une liste de nom provenant d'une table
    SQLite. La table ne contient qu'un identifiant et un nom (en gros)
    Je veux stocker dans Items de ma ComboBox, les Noms à afficher et les Ident, pour pouvoir les retrouver facilement.

    J'ai pensé utiliser Objects pour stocker mes entiers, mais comment faire ?

    Pour l'instant j'ai
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    Var
      pEntier : ^Integer;
     
    GetMem( pEntier, SizeOf(Integer));
    pEntier^ := MonIdSQLite;
    MaCombo.Items.AddObject( NomSQLite, TObject( pEntier));
    Ca passe à la compile
    Ensuite si je fais
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    Var
      unEntier : Integer;
     
    unEntier := Integer( MaCombo.Objects[ n]);
    Ca ne va pas être bon ! Je pense !

    Et surtout, comment je dois fais pour libérer la mémoire (tout ces GetMem...) faut bien que je les vire non ?

    Si vous avez des idées, merci

    Kwasin

  2. #2
    Expert confirmé
    Avatar de anapurna
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2002
    Messages
    3 421
    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 421
    Points : 5 820
    Points
    5 820
    Par défaut
    salut

    pourquoi tu passe par un pointeur ?
    si tu transtype directement (meme si c'est pas beau)
    tu n'aura pas a liberer la memoire

    autre solution tu creer un objet TintegeObj

    @+ Phil
    Nous souhaitons la vérité et nous trouvons qu'incertitude. [...]
    Nous sommes incapables de ne pas souhaiter la vérité et le bonheur, et sommes incapables ni de certitude ni de bonheur.
    Blaise Pascal
    PS : n'oubliez pas le tag

  3. #3
    Expert éminent Avatar de Graffito
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    5 993
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 5 993
    Points : 7 903
    Points
    7 903
    Par défaut
    Bonjour,

    C'était presque bon, mais c'est encore plus simple (et pour nos developpements pro, on l'utilise souvent) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    MaCombo.Items.AddObject( NomSQLite, Pointer( MonIdSQLite));
    ...
    unEntier := Integer( MaCombo.Objects[ n]);
    et évidement pas d'objects à libérer à la fin.
    " Le croquemitaine ! Aaaaaah ! Où ça ? " ©Homer Simpson

  4. #4
    Inactif  
    Profil pro
    Inscrit en
    Février 2003
    Messages
    4 341
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2003
    Messages : 4 341
    Points : 5 953
    Points
    5 953
    Par défaut
    Bonjour,
    et merci pour vos réponses.

    Juste une question, si je fais comme tu dis Grafito, dans une boucle, ma valeur va changer à chaque ligne de la requete, mais ma variable sera la même, et donc Pointer( MonIDSQLite) lui ne changera pas.

    Au final, tout les Objects de la combo pointeront sur le même endroit et je auront donc tous la même valeur ?

    Non ??? J'ai rien compris ?

  5. #5
    Inactif  
    Profil pro
    Inscrit en
    Février 2003
    Messages
    4 341
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2003
    Messages : 4 341
    Points : 5 953
    Points
    5 953
    Par défaut
    Bon, apres test, Graphito tu as entierement raison . Je n'en doutais pas, d'ailleurs.

    Par contre j'avoue ne pas comprendre le fonctionnement de tout ça. Comment ça s'explique au final.


    Pour pas que je reste comme un c.. qqun aurait-il un moment pour m'expliquer le mécanisme qui se cache derriere ?

    Merci d'avance

  6. #6
    Modérateur
    Avatar de tourlourou
    Homme Profil pro
    Biologiste ; Progr(amateur)
    Inscrit en
    Mars 2005
    Messages
    3 858
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Biologiste ; Progr(amateur)

    Informations forums :
    Inscription : Mars 2005
    Messages : 3 858
    Points : 11 301
    Points
    11 301
    Billets dans le blog
    6
    Par défaut
    c'est un transtypage : tu dis au compilo de prendre des vessies pour des lanternes : un integer (4 octets) pour un pointeur (4 octets) ; ça lui permet d'accepter d'affecter la valeur prise comme pointeur à un objet (propriété objects).
    évidemment, à toi de transtyper en sens inverse à la récupération.
    c'est limite bricolage, mais super pratique !
    pour peu que tu documentes ton code, histoire que quelqu'un ne récupère pas l'objet en ayant la mauvaise idée de faire appel à une fonction qu'il n'aura donc pas...
    Delphi 5 Pro - Delphi 11.3 Alexandria Community Edition - CodeTyphon 6.90 sous Windows 10 ; CT 6.40 sous Ubuntu 18.04 (VM)
    . Ignorer la FAQ Delphi et les Cours et Tutoriels Delphi nuit gravement à notre code !

  7. #7
    Expert éminent Avatar de Graffito
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    5 993
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 5 993
    Points : 7 903
    Points
    7 903
    Par défaut
    Bonjour,

    Lorsqu'on utilise un utilise une variable objet, l'information qui est affectée et passée aux instructions, fonctions et procédures qui utilisent la variable est un pointeur vers l'allocation mémoire de l'objet.

    Tant qu'on ne fait pas appel à une variable interne de l'objet ou à une de ses méthodes (comme "free" par exemple), rien n'empèche d'affecter à ce pointeur n'importe quelle valeur qui tient sur 4 octets comme un entier ou une référence à un autre objet.
    " Le croquemitaine ! Aaaaaah ! Où ça ? " ©Homer Simpson

  8. #8
    Inactif  
    Profil pro
    Inscrit en
    Février 2003
    Messages
    4 341
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2003
    Messages : 4 341
    Points : 5 953
    Points
    5 953
    Par défaut
    Merci d'avoir eclairer mes lanternes
    Je suis comme ça, j'aime bien comprendre ce que je code

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

Discussions similaires

  1. Comment stocker des entiers dans un tableau ?
    Par ING KAM dans le forum Collection et Stream
    Réponses: 2
    Dernier message: 04/07/2015, 13h55
  2. Stocker des entier à partir d'un fichier dans une ArrayList
    Par FstDsi dans le forum Collection et Stream
    Réponses: 6
    Dernier message: 10/07/2009, 11h07
  3. Réponses: 15
    Dernier message: 04/03/2009, 20h46
  4. Réponses: 2
    Dernier message: 15/06/2005, 17h32
  5. [XML] stocker des données dans un fichier XML
    Par R3iTt0R dans le forum XML/XSL et SOAP
    Réponses: 5
    Dernier message: 27/05/2005, 16h51

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