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

Delphi Discussion :

Utilisation du type TVarRec avec des TLabel


Sujet :

Delphi

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    157
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 157
    Points : 67
    Points
    67
    Par défaut Utilisation du type TVarRec avec des TLabel
    Bonjour,

    Je voudrais transmettre en paramètre d'une procédure une série d'objet de forme tels que des TPanel, TLabel, TButton etc... Comme je voudrais que le nombre et le type des paramètres soient variable, j'utilise un array of const en paramètre de ma procédure. dans ce cas c'est des TLabel. voila la procedure:

    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
     
     procedure proc_TVarRec(tab: Array of const)
     var
       I: Integer;
       lb  : TLabel;
       str : string;
     begin
       // 1ere partie
      for I := 0 to High(tab) do
      begin
        case VType of
          vtObject : showMessage(VObject.ClassName) ;
          vtClass  :  showMessage(VClass.ClassName) ;
        end;
      end;
     
      // 2eme partie
      lb := tab[0];
      ln.caption := 'Cap';
     end;
    Alors cette procédure est une procédure de test pour l'inclure dans un programme plus important.

    et je fais l'appel
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    lb1,lb2 : TLabel
    proc_TVarRec([lb1,lb2]);
    Le problème c'est que dans la première partie de la procédure VType est détecté comme identificateur non déclaré. Est ce que c'est une unité qui me manque ou la version que j'utilise de Delphi qui prend pas en charge ce type (j'utilise delphi 2005) ?

    Dans la deuxième partie j'ai une erreur TLabel et TVarRec incompatible. Est ce que vous auriez une solution pour faire un cast dans mon parmètre en TLabel et pouvoir l'utiliser comme un label classique (Affecter un text, le rendre visible ou non,...) ?

  2. #2
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 021
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 021
    Points : 40 935
    Points
    40 935
    Billets dans le blog
    62
    Par défaut
    Bonjour,


    Le problème c'est que dans la première partie de la procédure VType est détecté comme identificateur non déclaré
    je comprends l'interpréteur, car il s'agit de Vtype de quoi ? dans votre boucle il n'y a aucune référence aux valeurs contenues en paramètres ,si encore dans la boucle, il y avait une référence à tab[i]

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     for I := 0 to High(tab) do
      begin
       with tab[i] do  
       case VType of
          vtObject : showMessage(VObject.ClassName) ;
          vtClass  :  showMessage(VClass.ClassName) ;
        end;
      end;
    pour la deuxième partie, désolidarisée du bloc case cela n'a déjà pas beaucoup de sens ! de plus si l'objet n'est pas un TLabel cela va planter
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    lb:=TLabel(tab[0]);
    une série d'objet de forme
    Avez vous songé, s'il ne s'agit que d'objet , a TObjectList quoique ce doc pointe sur la version D2009
    MVP Embarcadero
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs États : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd

  3. #3
    Modérateur
    Avatar de tourlourou
    Homme Profil pro
    Biologiste ; Progr(amateur)
    Inscrit en
    Mars 2005
    Messages
    3 844
    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 844
    Points : 11 274
    Points
    11 274
    Billets dans le blog
    6
    Par défaut
    Si ce sont tous des objets (des instances), pas besoin de différencier avec des classes (des types) : un tableau d'objets suffirait (une liste est pê plus élégante).
    Delphi 5 Pro - Delphi 10.4 Rio 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 !

  4. #4
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    157
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 157
    Points : 67
    Points
    67
    Par défaut
    Merci pour votre aide,

    Pour la première partie j'avais bien défini la référence de tab[i] (Erreur en tapant). mais le VType n'est pas reconnu identificateur non déclaré.

    Pour la deuxième partie j'ai testé le cast avec le TLabel
    mais ça indique un transcrypte incorrect

  5. #5
    Modérateur
    Avatar de tourlourou
    Homme Profil pro
    Biologiste ; Progr(amateur)
    Inscrit en
    Mars 2005
    Messages
    3 844
    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 844
    Points : 11 274
    Points
    11 274
    Billets dans le blog
    6
    Par défaut
    lb := TLabel( tab[0].vtObject ); ?
    En vérifiant le type : if tab[0].vtObject is TLabel then lb := TLabel( tab[0].vtObject );
    Delphi 5 Pro - Delphi 10.4 Rio 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 !

Discussions similaires

  1. Réponses: 3
    Dernier message: 27/02/2008, 12h07
  2. Réponses: 1
    Dernier message: 11/05/2007, 20h36
  3. Réponses: 2
    Dernier message: 02/04/2007, 12h53
  4. Créer un type matrice avec des templates
    Par souading3000 dans le forum C++
    Réponses: 2
    Dernier message: 15/06/2006, 12h24
  5. utilisation d'un CopyFile avec des edits.??
    Par EssaiEncore dans le forum Langage
    Réponses: 2
    Dernier message: 25/11/2005, 17h32

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