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 :

[Erreur] Un objet constante ne peut être passé comme paramètre Var


Sujet :

Delphi

  1. #1
    Membre confirmé Avatar de WebPac
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    947
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 947
    Points : 512
    Points
    512
    Par défaut [Erreur] Un objet constante ne peut être passé comme paramètre Var
    Bonjour tout le monde,

    je désirais faire cette fonction :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    procedure InsureSlashFinal( var aChemin : string );
    begin
      if RightStr( aChemin, 1 ) <> '\' then
        aChemin := aChemin + '\';
    end;
    Tout se passe bien avec des strings, j'ai voulu faire de même avec le texte d'une Combobox, il me dit que les types doivent être les même (string et TCaption), donc je double la fonction et fait celle-ci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    procedure InsureSlashFinalCaption( var aCaption : TCaption );
    begin
      if RightStr( aCaption, 1 ) <> '\' then
        aCaption := aCaption + '\';
    end;
    Mais à ce moment là, il me donne comme erreur de compilation :
    Un objet constante ne peut être passé comme paramètre Var
    L'aide de Delphi ne donne rien pour ce message. Et je ne vois pas trop comment je pourrais faire pour que ça fonctionne. Ce serrait si pratique.

  2. #2
    Membre éclairé
    Avatar de denokan
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mars 2002
    Messages
    434
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2002
    Messages : 434
    Points : 746
    Points
    746
    Par défaut
    salut

    j'ai recemment eu le même soucis en vba, j'ai contourné le problème en modifiant ma procedure modifiante, par ex :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    function InsureSlashFinal(aChemin : String);
    begin
    ...
      InsureSlashFinal := blablabla
    end;
     
    MaComboBox.Caption := InsureSlashFinal(MaComboBox.Caption)
    Donnez un poisson à un homme et il mangera pendant un jour... Apprenez-lui à pêcher et il s'assiéra dans une barque et boira de la bière toute la journée

  3. #3
    Expert éminent
    Avatar de qi130
    Homme Profil pro
    Expert Processus IT
    Inscrit en
    Mars 2003
    Messages
    3 911
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France

    Informations professionnelles :
    Activité : Expert Processus IT
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2003
    Messages : 3 911
    Points : 6 032
    Points
    6 032
    Par défaut
    Pourquoi une procédure et pas une fonction ?


    Regarde aussi si tu disposes de la fonction IncludeTrailingBackslash, ou mieux de IncludeTrailingPathDelimiter.

    Pour contourner le pb du TCaption, utilises l' Items[itemindex] ?
    "Il n'y a pas de bonnes réponses à une mauvaise question." (M. Godet)
    -----------------------
    Pensez à cloturer votre sujet - Aucune réponse aux sollicitations techniques par MP
    Usus magister est optimus

  4. #4
    Membre confirmé
    Avatar de Philippe Gormand
    Inscrit en
    Mars 2002
    Messages
    330
    Détails du profil
    Informations forums :
    Inscription : Mars 2002
    Messages : 330
    Points : 647
    Points
    647
    Par défaut


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    Procedure Affiche(S : TComboBox);
    Begin
       S.Text := 'Toto';
    End;
     
    Procedure TForm1.Button1Clicl(Sender : TObject);
    Var
       S  : String;
     
    Begin
         S := Toto;
         Affiche(ComboBox1);
    End;
    Si ça peut te mettre sur la voie.

    La procédure Affiche, pointe sur l'objet ComboBox1.

    A+
    Rien n'est moins sur que l'incertain : Pierre DAC

  5. #5
    Membre confirmé Avatar de WebPac
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    947
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 947
    Points : 512
    Points
    512
    Par défaut
    Pourquoi une procédure et non une fonction ?
    Pour ne pas qu'il y ait une possibilité d'erreur de manipulation dans le futur (oublie de mettre MaVar := ...). Et pour ne pas avoir à écrire 2X la même variable à chaque fois que j'utilise la méthode.

    J'aurrais utilisé une fonction si la valeur en paramètre et la valeur de sortie n'étaient pas forcément la même variable, dans le cas présent, c'est forcément le cas, donc j'ai pensé qu'une procédure était plus conseillée.

    Je vais regarder du côté de IncludeTrailingBackslash et de IncludeTrailingPathDelimiter, je ne connaissais pas ces méthodes merci.

    Philippe Gormand, salut, je ne vois pas ce que je dois comprendre avec ton exemple.

  6. #6
    Membre confirmé
    Avatar de Philippe Gormand
    Inscrit en
    Mars 2002
    Messages
    330
    Détails du profil
    Informations forums :
    Inscription : Mars 2002
    Messages : 330
    Points : 647
    Points
    647
    Par défaut
    Dans mon exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    Procedure Affiche(S : TComboBox);
    Begin
       S.Text := 'Toto';
    End;
     
    Procedure TForm1.Button1Clicl(Sender : TObject);
    Begin
         Affiche(ComboBox1);
    End;
    Je montre que la procédure Affiche pointe directement sur l'objet "Comobox1", et toutes ses propriétés deviennent accessibles.

    Tu pourais faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    procedure InsureSlashFinalCaption( var aCaption : TComboBox);
    begin
      if RightStr( aCaption.Text, 1 ) <> '\' then
        aCaption.Text := aCaption.Text + '\';
    end;

    La propriété Text est un dérivé de TControl.
    Regarde l'utilisation de la propriété SelText de TComboBox. C'est une autre façon d'accéter au contenu du ComboBox.
    Rien n'est moins sur que l'incertain : Pierre DAC

  7. #7
    Membre confirmé Avatar de WebPac
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    947
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 947
    Points : 512
    Points
    512
    Par défaut
    Ton exemple ne marche que pour les ComboBox, je voudrais pouvoir le faire indépendament du composant.

    SelText retourne juste le texte sélectionné et je ne peux pas utiliser Items[itemindex] car le texte n'est pas forcément dans la liste des items, la Combobox n'étant pas en DropDownList mais juste en DropDown.

    Pour l'instant, je le fais à la main espérant comprendre cette erreur un jour.

  8. #8
    Modérateur
    Avatar de tourlourou
    Homme Profil pro
    Biologiste ; Progr(amateur)
    Inscrit en
    Mars 2005
    Messages
    3 865
    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 865
    Points : 11 334
    Points
    11 334
    Billets dans le blog
    6
    Par défaut
    le type TCaption est déclaré protected dans TControl : il est accessible directement en lecture, mais passe par un setter en écriture : voici sûrement l'explication : il est donc comme en lecture seule vis-à-vis du paramétre var...
    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 !

  9. #9
    Membre confirmé Avatar de WebPac
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    947
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 947
    Points : 512
    Points
    512
    Par défaut
    Je viens de vérifier et ce sont les property des classes qu'on ne peut passer en var d'une procédure. Ce n'est pas seulement pour les property qui possèdent un Setter en write mais aussi les property ayant un write sans Setter.

    Cette limitation est vraiment fort dommage, va falloir que je trouve une autre solution.

    Je mets en [Résollu] puisqu'on sait d'où vient l'erreur de compilation.

  10. #10
    Membre éclairé
    Avatar de denokan
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mars 2002
    Messages
    434
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2002
    Messages : 434
    Points : 746
    Points
    746
    Par défaut
    peut-être que ce post pourrai t'aider
    http://www.developpez.net/forums/sho...light=property
    Donnez un poisson à un homme et il mangera pendant un jour... Apprenez-lui à pêcher et il s'assiéra dans une barque et boira de la bière toute la journée

  11. #11
    Membre confirmé Avatar de WebPac
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    947
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 947
    Points : 512
    Points
    512
    Par défaut
    Merci denokan pour la recherche que tu as effectué, mais je pense que je fais revenir à une méthode plus classique, soit le faire "à la main" soit avec IncludeTrailingPathDelimiter, c'est plus simple que de devoir passer par des fonctions qui travaillent sur les champs publiés d'un objet.

    Le but était surtout de comprendre le message d'erreur de compilation et s'il existait une solution simple et efficace.

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

Discussions similaires

  1. Réponses: 3
    Dernier message: 19/08/2010, 17h17
  2. Réponses: 3
    Dernier message: 04/01/2010, 19h32
  3. Réponses: 8
    Dernier message: 18/07/2008, 16h06
  4. Erreur accès fichier, connexion réseau peut être perdue!
    Par CAPRI_456 dans le forum VBA Access
    Réponses: 4
    Dernier message: 18/12/2007, 21h13
  5. Réponses: 6
    Dernier message: 03/09/2003, 10h29

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