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

Composants VCL Delphi Discussion :

TDosCommand Pb de récupération


Sujet :

Composants VCL Delphi

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    96
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 96
    Points : 50
    Points
    50
    Par défaut [Resolu]TDosCommand Pb de récupération
    Bonjour

    J'utilise ce composant et son évenement OnNewLine pour récupérer l'affichage de chaque ligne Dos suite à l'éxécution d'un exe.
    Je ne veux pas afficher ces lignes, je ne prend que certaines parties de l'affichage de chaque ligne.
    J'ai donc associé à l'évenement OnNewLine du composant une procédure qui va traiter la ligne et récupérer ce que je veux.
    Il n'y a pas de problème si je veux afficher ce que j'ai récupéré sur un Mémo mais si je veux le stocker dans un string, il ne se passe rien.... Pas d'erreur, le string reste vierge..

    Une idée ?
    Merci

  2. #2
    Membre émérite
    Avatar de ALWEBER
    Homme Profil pro
    Expert Delphi
    Inscrit en
    Mars 2006
    Messages
    1 496
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 69
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Expert Delphi

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 496
    Points : 2 762
    Points
    2 762
    Billets dans le blog
    10
    Par défaut
    Peut être envoyer le Memo1.text dans le string et retirer tous les #10 et #13

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    96
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 96
    Points : 50
    Points
    50
    Par défaut
    Oui je peux toujours faire ça, mais devoir écrire dans un memo pour balancer dans mon string, je trouve ça inutile, une perte de temps.
    C'est quand même bizarre que ce composant ce comporte comme ca ?

    Merci de la réponse

    P.S : Euh, c'est quoi #10 et #13 ?

  4. #4
    Expert confirmé
    Avatar de popo
    Homme Profil pro
    Analyste programmeur Delphi / C#
    Inscrit en
    Mars 2005
    Messages
    2 674
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Analyste programmeur Delphi / C#
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 2 674
    Points : 5 259
    Points
    5 259
    Par défaut
    Question qui peut paraître con mais j'ai déjà eu ce problème et mis un moment avant de comprendre :
    Est-ce que quelque part tu utilise ton string ? Suivant le paramétrage, il n'affecte pas de valeur à une variable si celle ci n'est pas utilisée ensuite.

    Par ailleurs, un string est limité à 255 caractères. Peux être que Delphi ne veux pas mettre dans un string de 255 caractères, le contenu d'un fichier qui en fais beaucoup plus.

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    96
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 96
    Points : 50
    Points
    50
    Par défaut
    Je demande que ce string soit affiché plus loin dans le programme
    Vu que j'intercepte ligne par ligne et que je ne prend que quelques mots à chaque fois, mon string ne contient clairement pas plus de 255 caractères.

  6. #6
    Membre émérite
    Avatar de ALWEBER
    Homme Profil pro
    Expert Delphi
    Inscrit en
    Mars 2006
    Messages
    1 496
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 69
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Expert Delphi

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 496
    Points : 2 762
    Points
    2 762
    Billets dans le blog
    10
    Par défaut
    P.S : Euh, c'est quoi #10 et #13 ?
    ce sont les caractères de retour au début de ligne et ligne suivante. ce qui fait que tout ne se voit pas dans le transfert du memo vers le string. Exemple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    MaChaine := StringReplace (MaChaine,#13,'',rfReplaceAll])

  7. #7
    Expert éminent sénior
    Avatar de Cl@udius
    Homme Profil pro
    Développeur Web
    Inscrit en
    Février 2006
    Messages
    4 878
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Février 2006
    Messages : 4 878
    Points : 10 008
    Points
    10 008
    Par défaut
    Salut
    Citation Envoyé par popo Voir le message
    Par ailleurs, un string est limité à 255 caractères. Peux être que Delphi ne veux pas mettre dans un string de 255 caractères, le contenu d'un fichier qui en fais beaucoup plus.
    Seul ShortString est limité à 255 caractères.
    Une string (par défaut AnsiString, voir la directive {$H+}) est limitée à ~2^31 caractères. Donc le problème ne vient surement pas de là.


    Citation Envoyé par inspecteur rick Voir le message
    Il n'y a pas de problème si je veux afficher ce que j'ai récupéré sur un Mémo mais si je veux le stocker dans un string, il ne se passe rien.... Pas d'erreur, le string reste vierge..
    L'évènement OnNewLine fournit le paramètre NewLine qui est de type string. Tu peux très bien l'utiliser pour effectuer ton traitement et extirper les données qui t'intéresse.

    @+ Claudius

  8. #8
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    96
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 96
    Points : 50
    Points
    50
    Par défaut
    Oui en effet j'arrive à traiter la chaine NewLine et "extirper" ce que je veux puisque j'arrive à affiche ces infos dans un mémo.
    Mais le problème vient que je ne peut pas exporter ces infos dans un string....

  9. #9
    Expert éminent sénior
    Avatar de Cl@udius
    Homme Profil pro
    Développeur Web
    Inscrit en
    Février 2006
    Messages
    4 878
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Février 2006
    Messages : 4 878
    Points : 10 008
    Points
    10 008
    Par défaut
    Re,
    Citation Envoyé par inspecteur rick Voir le message
    Mais le problème vient que je ne peut pas exporter ces infos dans un string....
    Si tu nous donnais une p'tit bout de code, on pourrait surement trouver où se trouve le problème.

    @+

  10. #10
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    96
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 96
    Points : 50
    Points
    50
    Par défaut
    Ok, pas de problème. Euh, je suis débutant, vous moquez pas du code....

    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
    procedure TTraitement.DosCommandNewLine(Sender: TObject; NewLine: String; OutputType: TOutputType);
    var
    i: integer;
    ID, name: string;
    begin
    i:=15;
    ID:=''; Name:='';
    If Pos('ID',Newline) =  12 then
        begin
          while Newline[i]<>':' do begin
          ID:= ID+ Newline[i];
          inc(i);
          end;
          i:=Pos('file',Newline)+11;
          While i <> Length(NewLine) do begin
          Name:= Name+ Newline[i];
          inc(i);
          end;
    Comment:=Comment +ID+ ' : ' + Name + '|';
        end;
    end;
    Voici la déclaration de la classe TTraitement
    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
    TTraitement= class(TObject)
    FormattedTitle: String;
    URL: String;
    VideoBitrate: String;
    AudioBitrate: String;
    Resolution: String;
    Framerate: String;
    TestVideo: Boolean;
    NomDuFichier: String;
    Comment: String;
    DosCommand : TDosCommand;
    Public
    constructor  Create(NomFichier: string);
    destructor Destroy; override;
    function ListeLanguagesAudio : String;
    function ListeLangauagesSousTitre : String;
    function ListeFormatAudio: String;
    function Lengths: String;
    function size: String;
    function TitreTraduit :  String;
    function TitreOriginal: String;
    function VideoFormat: String;
    procedure DosCommandNewLine(Sender: TObject; NewLine: String; OutputType: TOutputType);
    procedure LanceMkvmerge ;
    end;

  11. #11
    Rédacteur


    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    7 171
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 7 171
    Points : 15 060
    Points
    15 060
    Billets dans le blog
    1
    Par défaut
    Salut,
    Citation Envoyé par inspecteur rick
    Il n'y a pas de problème si je veux afficher ce que j'ai récupéré sur un Mémo mais si je veux le stocker dans un string, il ne se passe rien.... Pas d'erreur, le string reste vierge..
    Si dans ton gestionnaire d'événements tu reçois bien une string non nulle, valide ta routine de parsing dans un programme de test.

    Quel OS et quelle version de Delphi utilises-tu ?
    Indique nous un exemple de chaîne que tu analyses.
    Citation Envoyé par inspecteur rick
    je suis débutant, vous moquez pas du code....
    Ce n'est pas l'objectif du forum.
    Débutant, nous l'avons tous été un jour mais la pluspart l'oublie ;-)

  12. #12
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    96
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 96
    Points : 50
    Points
    50
    Par défaut
    Salut et merci de répondre

    J'ai donc sorti ma procédure dans un programme test que voici :

    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
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    unit Principale;
     
    interface
     
    uses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, StdCtrls, MediaInfoDll, DosCommand;
     
    type
      TForm2 = class(TForm)
        Button1: TButton;
        Memo1: TMemo;
        DosCommand: TDosCommand;
        procedure Button1Click(Sender: TObject);
        procedure DosCommandNewLine(Sender: TObject; NewLine: String; OutputType: TOutputType);
      private
        { Déclarations privées }
          public
        { Déclarations publiques }
          end;
     
    var
      Form2: TForm2;
      Chaine: string;
      AccesFonctionsMedia: MesFonctionMediaInfo;
     
    implementation
     
    {$R *.dfm}
     
    procedure TForm2.Button1Click(Sender: TObject);
    begin
    AccesFonctionsMedia:=MesFonctionMediaInfo.create();
    Chaine:='';
    DosCommand:=TDosCommand.Create(nil);
    DosCommand.OnNewLine:=DosCommandNewLine;
    DosCommand.CommandLine :='Je met la commande';
    DosCommand.Execute;
    DosCommand.SendLine('Exit', True);
    DosCommand.free;
    ShowMessage(Chaine);
    end;
     
    procedure Tform2.DosCommandNewLine(Sender: TObject; NewLine: String; OutputType: TOutputType);
    var
    i: integer;
    ID, name: string;
    begin
    i:=15;
    ID:=''; Name:='';
    If Pos('ID',Newline) =  12 then
        begin
          while Newline[i]<>':' do begin
          ID:= ID+ Newline[i];
          inc(i);
          end;
          i:=Pos('file',Newline)+11;
          While i <> Length(NewLine) do begin
          Name:= Name+ Newline[i];
          inc(i);
          end;
    Chaine:=Chaine+ ID + ' : ' + Name +'|';
    //Memo1.Lines.Add(ID + ' : ' + Name +'|');
        end;
    end;
     
    end.
    Donc voilà, j'ai un avertissement à la compilation sur la non présence du composant sur la form mais vu que je le créer dynamiquement, c'est pas un problème pour l'exécution.
    Donc lorsque je passe le programme pas à pas(F8) je ne vois que les variables locale donc je ne vois pas la valeur de la variable Chaine mais le programme passe bien sur l'affectation de Chaine.
    Affichage correct dans le mémo mais vierge dans la string Chaine

    Exemple de chaines analysées : Attachment ID 119737988: type 'image/jpeg', size 492119 bytes, file name 'Affiche du film HD.jpg'

    Version Delphi : CodeGear™ Delphi® pour Microsoft® Windows™ Version 11.0.2627.5503

    OS : Windows xp home.

    Encore merci

  13. #13
    Rédacteur


    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    7 171
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 7 171
    Points : 15 060
    Points
    15 060
    Billets dans le blog
    1
    Par défaut
    Affichage correct dans le mémo
    Donc la gestion des paramètres de l'événement du composant n'est pas en cause.

    Pour l'exemple de la chaîne à analyser, ton traitement est correcte. Il doit y avoir un pb de portée ou une duplication de nom de champ.
    Précise Self.Comment dans TTraitement.DosCommandNewLine.

    Vérifie si tu n'as pas un autre événement qui se déclencherait tout de suite après DosCommandNewLine effacant le contenu de comment...

    Tu peux utiliser cette astuce de débug utilisant une console :
    http://delphi.developpez.com/faq/?page=application#consoledansgui

  14. #14
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    96
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 96
    Points : 50
    Points
    50
    Par défaut
    Salut

    Euh, si tu regardes mon dernier poste. J'ai sorti la procedure qui pose problème dans un prog test où il n'y a qu'un bouton et un mémo.
    Il n'y donc que les événements liés au bouton et à TdosCommand
    La variable globale "Chaine" n'est affecté que lors de l'appel de la procédure DosCommandNewLine.

    J'ai rajouté ca dans DosCommandNewLine

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    {$IFDEF DEBUG}
      AllocConsole;
      Chaine:=Chaine+ ID + ' : ' + Name +'|';
      WriteLn(Chaine);
    {$ENDIF}
    Dans la fenetre DOS, je vois bien ce que doit contenir "Chaine".
    J'suis perdu là.......

    Merci

  15. #15
    Rédacteur


    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    7 171
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 7 171
    Points : 15 060
    Points
    15 060
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par inspecteur rick
    Euh, si tu regardes mon dernier poste. J'ai sorti la procedure qui pose problème dans un prog test où il n'y a qu'un bouton et un mémo.
    Il n'y donc que les événements liés au bouton et à TdosCommand
    Oui tu as raison, mais dans tous remue-méninges il y une part de déchets.
    Citation Envoyé par inspecteur rick
    Dans la fenetre DOS, je vois bien ce que doit contenir "Chaine".
    J'suis perdu là.......
    Peut être, mais on avance

    Essaie ceci dans le main:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    ShowMessage(Chaine);
    DosCommand.free;

  16. #16
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    96
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 96
    Points : 50
    Points
    50
    Par défaut
    J'suis content que tu persistes, ca fait plaisir

    Mais, l'intervention (par rapport au code de départ)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    ShowMessage(Chaine);
    DosCommand.free;
    ne fonctionne pas. Mon ShowMessage reste vierge....

  17. #17
    Rédacteur


    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    7 171
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 7 171
    Points : 15 060
    Points
    15 060
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par inspecteur rick
    J'suis content que tu persistes, ca fait plaisir
    Quitte à faire quelque chose autant le faire pleinement.
    Bon là je dois installer le composant et tester ton programme.
    Mais je dois remonter une sauvegarde car hier j'ai supprimé mes projets de tests sur ce compo

  18. #18
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    96
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 96
    Points : 50
    Points
    50
    Par défaut
    Quitte à faire quelque chose autant le faire pleinement.
    Ok, grand merci à toi

    Si t'as besoin de quelque chose, dis le moi.

  19. #19
    Rédacteur


    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    7 171
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 7 171
    Points : 15 060
    Points
    15 060
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par inspecteur rick
    Si t'as besoin de quelque chose, dis le moi.
    Et bien pour commencer j'ai besoin d'un million d'euros.

    Sinon le pb se situe dans le comportement asynchrone du composant,
    " the cool thing of this component is that you do not need to wait the end of the program to get back the output. it comes line by line."

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    procedure TForm1.Button1Click(Sender: TObject);
    begin
      Chaine:='';
      Writeln('Debut');
      DosCommand.Execute;
      DosCommand.SendLine('Exit', True);
      Writeln('Fin');
      ShowMessage(Chaine);
    end;
    En utilisant la console de debug on voit que les mots debut et fin sont affichés avant la première ligne retournée par une commande du Shell.
    Tout comme l'appel à ShowMessage

    Il faut donc mémoriser temporairement le résultat et le récupérer dans l'event OnTerminated.

  20. #20
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    96
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 96
    Points : 50
    Points
    50
    Par défaut
    J'ai donc associé l'évènement Ontermined du composant à la procedure

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    procedure Tform2.DosCommandOnterminated(Sender: TObject);
    begin
    ShowMessage(Chaine);
    end;
    Et j'ai rajouté
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    DosCommand.OnTerminated:=DosCommandOnterminated;
    Comme je l'ai fait pour OnNewLine mais j'ai une erreur InvalidOperation (le cadevas ne permet pas de dessiner) et l'arrêt ce fait sur TDosThread.Execute de TDosCommand.pas.
    J'ai essayé 4 fois et à la cinquième, miracle j'ai l'affichage dans le showmessage.

    Mais l'erreur revient après.

    On progresse.

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Récupération valeur d'une propriété type TStrings
    Par Stéphane Vaillant dans le forum Langage
    Réponses: 2
    Dernier message: 01/03/2003, 11h47
  2. [XMLRAD] récupération de donnée
    Par Mitch79 dans le forum XMLRAD
    Réponses: 7
    Dernier message: 30/01/2003, 15h36
  3. Réponses: 5
    Dernier message: 09/01/2003, 11h55
  4. récupération d'images
    Par MANU_2 dans le forum Composants VCL
    Réponses: 3
    Dernier message: 05/08/2002, 18h36
  5. Réponses: 4
    Dernier message: 05/06/2002, 12h15

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