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 :

Utilisation du .Tag pour stocker un objet en 64bits


Sujet :

Langage Delphi

  1. #1
    Membre expérimenté Avatar de guillemouze
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    876
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Novembre 2004
    Messages : 876
    Points : 1 448
    Points
    1 448
    Par défaut Utilisation du .Tag pour stocker un objet en 64bits
    Salut a tous,
    je n'ai pas a proprement parler de problème, mais je me pose juste quelques questions quant à l’évolutivité de ma façon de coder (dans l'optique de passer prochainement sur une version de Delphi qui n'a pas 15 ans, D7 -> 10.2).
    Aujourd'hui, je suis en train de stocker un objet dans le Tag d'un menu item. Je fais donc simplement
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    miRenommer.Tag := integer(tmpTabSheet);
    Mais comment se code va se comporter ce code à la migration ? le Tag est il passé en 64bits (je l'éspère !) ? Du coup il faudrait que je fasse mon cast avec un NativeInt, mais je ne l'ai pas en D7.
    Y a-t'il une autre facon de caster qui soit disponible en D7, et compatible avec une compilation x64 sur XE, ou faudra-il que je repasse sur tous mes stockage dans un tag pour passer en NativeInt ?

    Merci

  2. #2
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 459
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    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 : 13 459
    Points : 24 873
    Points
    24 873
    Par défaut
    NativeInt ou NativeUInt sont 32 ou 64 bits selon le compilateur

    Déclare-toi le type en D7 avant de migrer

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    type
      NativeInt = Integer;
    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
    Rédacteur/Modérateur
    Avatar de Andnotor
    Inscrit en
    Septembre 2008
    Messages
    5 694
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 694
    Points : 13 130
    Points
    13 130
    Par défaut
    Je confirme que Tag est maintenant un NativeInt.

    Et pour rebondir sur la proposition de Shai, tu peux conditionner cette déclaration par la version du compilateur (23 = XE2), sinon NativeInt sera faux en 64 bits.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    {$IF CompilerVersion < 23}
      type NativeInt = integer;
    {$ENDIF}

  4. #4
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 459
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    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 : 13 459
    Points : 24 873
    Points
    24 873
    Par défaut
    J'ai abandonné le Tag depuis longtemps pour stocker un pointeur, je préfère stocker la valeur d'un type Enuméré ou alors Indice vers un array ou une TObjectList

    Dans ton cas

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    miRenommer.Tag := integer(tmpTabSheet);
    devient
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    miRenommer.Tag := tmpTabSheet.PageIndex;
    et

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    TTabSheet(miRenommer.Tag).PageControl.ActivePage := TTabSheet(miRenommer.Tag);
    devient
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    PageControlMachin.ActivePageIndex := miRenommer.Tag ;
    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

  5. #5
    Expert éminent sénior
    Avatar de Paul TOTH
    Homme Profil pro
    Freelance
    Inscrit en
    Novembre 2002
    Messages
    8 964
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    Points : 28 445
    Points
    28 445
    Par défaut
    je ne saurais trop te conseiller de ne plus utiliser ce genre de pratiques qui, même si elles fonctionnent, rendent le code difficile à maintenir

    si ton menu est créé dynamiquement, c'est le plus simple tu crées une classe dérivée de TMenuItem et tu lui ajoutes un membre du type de l'objet que tu veux lui associer.

    si ton menu est créé dans l'IDE il reste possible de s'en sortir par la surcharge de classe

    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
     
    unit Unit1;
     
    interface
     
    uses
      Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
      Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, Vcl.Menus;
     
    type
      TMenuItem = class(Vcl.Menus.TMenuItem) // à l'intérieur de cette fiche les TMenuItem possèdent un membre Button
        Button: TButton;
      end;
     
      TForm1 = class(TForm)
        MainMenu1: TMainMenu;
        Objects1: TMenuItem;
        MenuObjet1: TMenuItem;
        MenuObjet2: TMenuItem;
        Button1: TButton;
        Button2: TButton;
        procedure FormCreate(Sender: TObject);
        procedure MenuObjectClick(Sender: TObject);
      private
        { Déclarations privées }
      public
        { Déclarations publiques }
      end;
     
    var
      Form1: TForm1;
     
    implementation
     
    {$R *.dfm}
     
    procedure TForm1.FormCreate(Sender: TObject);
    begin
    // exemple d'association
      MenuObjet1.Button := Button1;
      MenuObjet2.Button := Button2;
    end;
     
    procedure TForm1.MenuObjectClick(Sender: TObject);
    begin
    // plus de doute sur ce que l'on fait
      ShowMessage('le Menu ' + TMenuItem(Sender).Name + ' est associé au bouton ' + TMenuItem(Sender).Button.Name);
    end;
     
    end.
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

  6. #6
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 459
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    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 : 13 459
    Points : 24 873
    Points
    24 873
    Par défaut
    Tout comme Paul Toth, je trouve qu'il manque un mécanisme explicite comme le OnCreateNodeClass du TTreeView où l'on peut définir sa propre classe de nœud, dans beaucoup de situations, cela sera tellement plus propre que l'astuce de la surcharge via homonyme qui est quand même une astuce que je trouve magnifique mais totalement incompréhensible avec le FindClass
    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

  7. #7
    Membre expérimenté Avatar de guillemouze
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    876
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Novembre 2004
    Messages : 876
    Points : 1 448
    Points
    1 448
    Par défaut
    Merci pour les infos.
    @Shai et AndNotOr, j'ai déjà une unité qui gère la compatibilité, qui contient notamment DecimalSeparator, je vais y rajouter le NativeInt.
    @Shai 2, j'avais fait comme ca au debut, mais je fais des tests au moment du OnContextPopup, et du coup, pour ne pas les refaire au OnClick du MenuItem, je préfère passer directement l'objet concerné.
    @Paul, c'est une technique intéressante, mais principalement dans le cas d'un menu dynamique. Si il est statique, tu forces la redéclaration du type, et donc tous les TMenuItem de cette fiche auront un champ Button.
    En tout cas merci de vos réponses.

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

Discussions similaires

  1. Réponses: 4
    Dernier message: 23/06/2008, 17h10
  2. [Python] Est-ce une bonne idée d'utiliser des modules pour stocker des objets ?
    Par Neolander dans le forum Développement 2D, 3D et Jeux
    Réponses: 1
    Dernier message: 05/04/2008, 14h45
  3. Utiliser une variable pour stocker les noms d'objets.
    Par en_gel_ho dans le forum Access
    Réponses: 4
    Dernier message: 03/01/2007, 16h44
  4. utiliser un script pour inserer des objets 3D
    Par s_mihai dans le forum Général JavaScript
    Réponses: 5
    Dernier message: 09/08/2005, 13h52

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