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 :

Code issu d'une StringList non exécuté


Sujet :

Delphi

  1. #1
    Nouveau membre du Club

    Homme Profil pro
    Artisan en électronique
    Inscrit en
    Février 2007
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Artisan en électronique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Février 2007
    Messages : 16
    Points : 38
    Points
    38
    Par défaut Code issu d'une StringList non exécuté
    Bonjour,

    J'ai besoin de manipuler une ligne de code, en lui changeant des morceaux selon les cas, pour cela j'utilise des StringList.
    Quand je récupère le contenu final de la StringList, je m'attends à ce qu'il soit exécuté, mais rien ne se passe, comme si c'était du texte et pas du code exécutable.
    Voici un exemple simplifié:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    procedure TForm1.Button_TestClick(Sender: TObject);
    var
      SL: TStringList;
    begin
      SL := TStringList.Create;
      SL.Add('Windows.Beep(800, 500);');
      Memo1.Text := SL.Strings[0];
     
      SL.Strings[0];    // Ici, je récupère: Windows.Beep(800, 500); en espérant que ce code soit exécuté mais aucun son ne sort !
                        // Pourtant Memo1.Text me montre que SL.String[0] contient bien: Windows.Beep(800, 500);
      SL.Free;
    end;
    En pratique, c'est par exemple keybd_event(VK_NUMPAD0, MapvirtualKey(VK_NUMPAD0, 0), 0, 0); que j'utilise et qui n'est pas exécuté en sortie de StringList alors que si je l'écris directement, il l'est.

    Si quelqu'un a la réponse, je le remercie d'avance.

  2. #2
    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
    Bonjour,

    Delphi est un langage "compilé", le code source est traduit en code machine binaire interprété directement par le processeur.

    il est existe des interpréteur de langage Pascal (PascalScript, DWScript...) qui permettent d'évaluer une expression Pascal depuis le programme, mais je ne pense pas que ce soit le besoin ici.

    je suppose que le besoin est tout simplement d'utiliser des variables (grand débutant en programmation ?).

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    procedure TForm1.Button_TestClick(Sender: TObject);
    var
      a, b: Integer;
    begin
      a := IntToStr(Edit1.Text);  // lire le nombre tapé dans Edit1 - conversion chaîne vers entier
      b := IntToStr(Edit2.Text); // lire le nombre tapé dans Edit2
      Windows.Beep(a, b); // faire un beep avec ces deux valeurs
    end;
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

  3. #3
    Nouveau membre du Club

    Homme Profil pro
    Artisan en électronique
    Inscrit en
    Février 2007
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Artisan en électronique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Février 2007
    Messages : 16
    Points : 38
    Points
    38
    Par défaut
    Bonjour Paul TOTH,

    Que je suis débutant, ça ne fait aucun doute !
    Même si, depuis de nombreuses années, je lis assiduement vos réponses pertinentes dans ce forum.

    Ce ne sont pas les variables qui me posent problème.
    Comme je le disais dans mon exemple, c'est la ligne de code entière qui n'est pas exécutée quand elle provient d'un StringList.

    Si J'écris Windows.Beep(800, 500); le son est joué
    mais, si j'ai envoyé cette ligne comme texte 'Windows.Beep(800, 500);' dans un StringList, quand je la récupère pour l'exécuter, elle ne produit rien, comme si ce n'était qu'un texte.

    Je ne comprends pas, je pensais que le fait que j'ai écrit moi-même cette ligne dans mon code ou qu'elle le soit en live par la StringList quand je lui dis: SL.String[0] entraînerait dans les deux cas la même réaction du programme, soit un son de 800 Hz pendant 500 ms.

    Dans mon message, Windows.Beep(800, 500); c'était juste pour donner un exemple court.

    En pratique, j'envoie, par exemple, dans une première StringList: SL1.Add('keybd_event(VK_NUMPAD4, MapvirtualKey(VK_NUMPAD4, 0), 0, 0);');
    dans un autre StringList: SL2.Add('keybd_event(VK_NUMPAD0, MapvirtualKey(VK_NUMPAD0, 0), 0, 0);');
    et dans une troisième, SL3.Add(' ...avec d'autres valeurs ...');

    A la fin, selon les besoins de mon programme, je ne récupère que certaines de ces lignes et dans un certain ordre.
    Je les envoie par exemple dans une autre StringList qui s'appelle SL_Finale, pour y faire du nettoyage, du classement et là, je voudrais bien qu'en faisant: SL.Text ou avec une boucle qui lit toutes les lignes de SL, ces lignes soient exécutées.
    mais ça n'est pas le cas.
    Si je teste, par exemple, avec un Memo, mon tri est bon, le résultat dans SL_Finale est bon, et donc SL.Text contient bien toutes les lignes que je voudrais voir exécuter.
    Pourquoi, ces lignes qui fonctionnent quand elles sont écrites en clair ne fonctionnent plus quand elles sortent de la StringList, elles semblent ne plus être considérées comme que du simple texte et pas du code exécutable.

    Existe-t-il un autre moyen , sans passer par les StringList, pour classer des lignes de code et les réinjecter tout en restant exécutables ?

    Je pensais qu'en faisant, comme dans l'exemple de mon premier message: SL.Add('Windows.Beep(800, 500);'); puis SL.Text j'aurais le même résultat qu'en écrivant simplement : Windows.Beep(800, 500);

  4. #4
    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
    non, encore une fois le source Delphi est compilé sous la forme d'un .exe qui ne contient pas le source mais une traduction binaire directement exploité par le processeur qui ne comprend rien à rien, il faut tout lui dire en codes informatiques

    par contre j'en reviens à ma première réponse :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    var
      Key: Integer;
    begin
      keybd_event(Key, MapvirtualKey(Key, 0), 0, 0);
    end;
    il ne reste plus qu'à manipuler une liste d'entiers pour faire varier la valeur de Key

    en version un peu bourrin on pourrait faire ceci

    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
     
     var
      Codes, SL: TStringList;
      Index: Integer;
    begin
      Codes := TStringList.Create;
      Codes.Add('VK_NUMPAD0=' + IntToStr(VK_NUMPAD0));
      Codes.Add('VK_NUMPAD1=' + IntToStr(VK_NUMPAD1));
      Codes.Add('VK_NUMPAD2=' + IntToStr(VK_NUMPAD2));
     
      SL := TStringList.Create;
      SL.Add('VK_NUMPAD0');
      SL.Add('VK_NUMPAD1');
     
      for Index := 0 to SL.Count - 1 do
      begin
        Key := StrToInt(Codes.Values[SL[Index]);
        keybd_event(Key, MapvirtualKey(Key, 0), 0, 0);
      end;
    end;
    Codes contient donc des valeurs de type "VK_NUMPAD0=96", Codes.Values['VK_NUMPAD0'] retourne donc la chaîne "96" que l'on converti en entier avec StrToInt et qu'on peut alors utiliser dans la fonction keyb_event
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

  5. #5
    Nouveau membre du Club

    Homme Profil pro
    Artisan en électronique
    Inscrit en
    Février 2007
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Artisan en électronique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Février 2007
    Messages : 16
    Points : 38
    Points
    38
    Par défaut
    Merci

  6. #6
    Membre confirmé Avatar de Galet
    Homme Profil pro
    Consultant/Programmeur Robotique industrielle
    Inscrit en
    Mars 2010
    Messages
    323
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Consultant/Programmeur Robotique industrielle

    Informations forums :
    Inscription : Mars 2010
    Messages : 323
    Points : 484
    Points
    484
    Par défaut
    Bonjour Alain_31,

    Il me semble que tu confonds une variable avec une commande. La ligne stockée dans ta stringlist est 'inerte', c'est seulement une phrase qui décrit une action, mais pas l'action elle-même.
    Pour effectuer une action, il te faut une commande, ce que tu obtiens en écrivant directement ta ligne. A la compilation de ta ligne, Delphi transforme la ligne en commande. Ton exécutable contiendra donc une suite de commandes, elles même exécutées plus ou moins directement par le microprocesseur.
    C'est un peu comme Magrit avec son tableau 'Ceci n'est pas une pipe'. Il te faut faire la différence entre l'action et sa description.

    C'est pourquoi Paul précise la différence entre les langages interprétés et les langages compilés.

    Peux-tu décrire ton besoin ?
    Windows 10 / Delphi Tokyo
    "Les choses ne changent pas. Change ta façon de les voir, cela suffit" Lao Tseu

  7. #7
    Nouveau membre du Club

    Homme Profil pro
    Artisan en électronique
    Inscrit en
    Février 2007
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Artisan en électronique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Février 2007
    Messages : 16
    Points : 38
    Points
    38
    Par défaut
    Merci pour cette réponse, claire pour le débutant que je suis.

    "Pour effectuer une action, il te faut une commande, ce que tu obtiens en écrivant directement ta ligne."
    Le "directement" m'éclaire.

    Ceci dit, je ne confonds pas variable et commande et je n'aurais pas appelé "variable" la ligne de commande que je récupère dans ma StringList.
    Mais je comprends maintenant que, pour le processeur, ce n'est pas une commande mais l'image texte d'une commande.

    Ta comparaison avec la pipe de Magritte est très claire.

    Merci à vous deux d'être là !

    Je peux clore le sujet.

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

Discussions similaires

  1. [XL-2016] Enregistreur de macro crée une macro non exécutable
    Par MonSavon dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 15/04/2017, 14h01
  2. Réponses: 0
    Dernier message: 07/04/2011, 14h38
  3. Exécuter du code php issue d'une base Mysql
    Par yobogs dans le forum Langage
    Réponses: 2
    Dernier message: 30/05/2008, 13h30
  4. Exécuter une requête non-query
    Par Piet dans le forum MS SQL Server
    Réponses: 10
    Dernier message: 07/02/2007, 15h01
  5. [CR] Impression de données non issues d'une base de données
    Par jeroe dans le forum SAP Crystal Reports
    Réponses: 3
    Dernier message: 04/04/2005, 09h09

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