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 :

[Message d'erreur] Un objet constante ne peut pas être passé comme var


Sujet :

Delphi

  1. #1
    Membre habitué Avatar de vbcasimir
    Profil pro
    Inscrit en
    Mars 2003
    Messages
    455
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Mars 2003
    Messages : 455
    Points : 168
    Points
    168
    Par défaut [Message d'erreur] Un objet constante ne peut pas être passé comme var
    Bonjour ,

    Je ne comprends ce qui ne va pas dans mon code qui pourtant me parait simple ....

    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
     
     
    procedure TForm1.Button2Click(Sender: TObject);
    var chemin   : string;
        ListExe : TStringList;
        x , New , Neww: integer;
     
    begin
    chemin := 'C:\Projet_Delphi\PlaningExe\cheminExe.txt';
    OpenDialog1.Execute ;
    Label1.Caption := OpenDialog1.FileName;
    EcrireDansFichier (chemin , ComboBox1.Text + ':' + ComboBox2.Text + ':' + ComboBox3.Text , OpenDialog1.FileName);
    Button1.enabled := true;
    ListExe := RecupProgExe (chemin) ;
     
    //for x := 0 to ListExe.count - 1 do
       New := pos(';',ListExe[0]);
       Neww := Length(ListExe[0]);
       Edit2.Text := DELETE (ListExe[0] , New , Neww);
     
    //listBox1.Items.AddStrings(ListExe);
    end;
    donc pour résumer je recupère dans un fichier des données que je transmets à un TStringList aprés quoi je souhaiterais découper mes lignes en deux grâce au séparateur ";" ...

    J'utilise donc le fonction 'POS' et 'DELETE' mais apparemment lorsque je lance l'execution il me répond le message :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
     
    "un objet constante ne peut pas être passé comme paramétre var"

    alors j'ai donc essayé d'afficher au moins la position du caractère ";" dans ma chaine avec la fonction POS pour ça tout se passe bien mais dés lors où j'utilise la fonction DELETE (voir le code ci-dessus) là j'ai le massage d'erreur ???

    c@simir

  2. #2
    Membre du Club
    Profil pro
    Inscrit en
    Août 2002
    Messages
    48
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2002
    Messages : 48
    Points : 43
    Points
    43
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    s : string 
    ..
       s := ListExe.strings[0];
        DELETE(s, New , Neww);
       Edit2.Text := s;

  3. #3
    Membre expérimenté
    Avatar de Bloon
    Homme Profil pro
    Consultant Freelance
    Inscrit en
    Avril 2002
    Messages
    467
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Consultant Freelance
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2002
    Messages : 467
    Points : 1 339
    Points
    1 339
    Par défaut
    Les paramètres var attendent une adresse de variable. En accèdant à ListExe[0], tu passes par la propriété strings du TStringList, soit en fait une fonction qui renvoie un string.

    Il faut donc passer par une variable intermédiaire ou bien utiliser une fonction utilitaire pour faire la séparation, comme par exemple :

    http://delphi.developpez.com/faq/?pa...chaine#explode

    (attention, le code proposé a été mal retranscrit, il faut remplacer les <i> par [i] tant que c'est pas corrigé)

    Bloon
    A lire : Les règles du club
    Delphi : La FAQ - Articles

  4. #4
    Membre habitué Avatar de vbcasimir
    Profil pro
    Inscrit en
    Mars 2003
    Messages
    455
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Mars 2003
    Messages : 455
    Points : 168
    Points
    168
    Par défaut
    effectivement ça passe ... mais pourquoi faut-il le mettre sous cette forme j'ai souvent remarqué avec Delphi qu'il faut déclarer avant dans une variable avant de faire "passer" dans certains objets ..

    Par ailleurs j'ai laissé sous la forme "ListExe[0]" au lieu de "ListExe.strings[0]" et ça fonctionne quand même ... les deux formes sont - elles équivalentes ?

    Merci
    c@simir

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Août 2002
    Messages
    48
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2002
    Messages : 48
    Points : 43
    Points
    43
    Par défaut
    Par ailleurs j'ai laissé sous la forme "ListExe[0]" au lieu de "ListExe.strings[0]" et ça fonctionne quand même ... les deux formes sont - elles équivalentes ?
    aide en ligne
    TStringList.Strings

    Enumère des chaînes référencées par un indice de base zéro.

    property Strings[Index: Integer]: string; default;

    Description

    La propriété Strings permet de lire ou de modifier une chaîne située à une position donnée. Index indique la position de la chaîne, sachant que la première chaîne a l'indice 0, la seconde l'indice 1, etc. Pour trouver une chaîne donnée dans la liste, utilisez la méthode IndexOf.

    Strings est la propriété par défaut des objets liste de chaînes. Il est donc possible d'omettre l'identificateur Strings pour accéder à la propriété Strings d'un objet liste de chaînes. Par exemple, les deux lignes suivantes sont légales et font la même chose*:

    MyStringList.Strings[0] := 'Voici la première chaîne';

    MyStringList[0] := 'Voici la première chaîne';

  6. #6
    Membre expérimenté
    Avatar de Bloon
    Homme Profil pro
    Consultant Freelance
    Inscrit en
    Avril 2002
    Messages
    467
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Consultant Freelance
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2002
    Messages : 467
    Points : 1 339
    Points
    1 339
    Par défaut
    Par ailleurs j'ai laissé sous la forme "ListExe[0]" au lieu de "ListExe.strings[0]" et ça fonctionne quand même ... les deux formes sont - elles équivalentes ?
    Oui, car la propriété Strings de TStrings est déclarée comme propriété par défaut :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    property Strings[Index: Integer]: string read Get write Put; default;
    Bloon
    A lire : Les règles du club
    Delphi : La FAQ - Articles

  7. #7
    Membre habitué Avatar de vbcasimir
    Profil pro
    Inscrit en
    Mars 2003
    Messages
    455
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Mars 2003
    Messages : 455
    Points : 168
    Points
    168
    Par défaut
    ok je comprends mieux ....

    Merci beaucoup :o
    c@simir

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

Discussions similaires

  1. Réponses: 4
    Dernier message: 07/01/2010, 14h41
  2. Réponses: 3
    Dernier message: 04/01/2010, 19h32
  3. Message d'erreur: Un composant ActiveX ne peut pas créer un objet
    Par amnass dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 22/05/2009, 07h12
  4. Erreur Excel "La mémoire ne peut pas être "read""
    Par DaBeam dans le forum Macros et VBA Excel
    Réponses: 0
    Dernier message: 16/05/2008, 10h29
  5. Réponses: 10
    Dernier message: 04/07/2006, 20h57

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