Une source liée à MsDos qui ne fonctionne pas

Utilisateur anonyme - 25 août 2005 à 17:38
rick hunteur Messages postés 5 Date d'inscription lundi 26 février 2007 Statut Membre Dernière intervention 28 juillet 2010 - 12 janv. 2009 à 18:49
Salut à tous j'avais lancé le débat sur la possibilité d'ouvrir une invite MsDos et de l'incruster dans une FORM. Divers solutions m'avaient été proposées mais résultats : des beugues. Je remercie évidemment les personnes qui ont bien voulu m'apporté une aide sur ce topic.

J'ai trouvé une source qui répond presque à mes attentes (voir les différences après). Elle vient de Laurent Dardenne voir le site http://Laurent-ardenne.Developpez.com (je me permet de citer ce site vu la collaboration entre les 2 et puis la source est disponible donc c'est pas pour rien):

nit Main;
{ Programme de démonstration du composant TDosCommand version d'origine
http://Laurent-Dardenne.Developpez.com

Comment l'utiliser ce composant :
---------------
- Saisissez votre commande dans la propriété 'CommandLine'
- executez the processus avec la méthode 'Execute'
- Si vous souhaitez arrêter le processus avant sa fin normal, utilisez la méthode 'Stop'
- Si vous souhaitez que le processus s'arrête après XXX seconde d'activité,
utilisez la propriété 'MaxTimeAfterBeginning'
- Si vous souhaitez que le processus s'arrête après XXX seconde sans donnée reçue en entrée,
utilisez la propriété 'MaxTimeAfterLastOutput'
- Pour rediriger directement la sortie du process vers un composant memo ou un richedit, ...
utilisez la propriété 'OutputLines',
exemple : DosCommand1.OutputLnes := Memo1.Lines;
- vous pouvez accéder à toutes les sorties de la dernière commande par la propriété 'Lines' ;
- vous pouvez changer la priorité du processus avec la propriété 'Priority';
la valeur de la priorité doit être une de ces valeurs :
[HIGH_PRIORITY_CLASS, IDLE_PRIORITY_CLASS,NORMAL_PRIORITY_CLASS, REALTIME_PRIORITY_CLASS]
- vous pouvez recevoir un événement pour chaque nouvelle ligne et pour la
fin du processus avec les événements suivants :
procedure OnNewLine(Sender: TObject; NewLine: string;OutputType: TOutputType);'
procedure OnTerminated(Sender: TObject);
- vous pouvez envoyer des données en entrée au processus DOS via la méthode
SendLine(Value : corde ; Eol : Boolean);
Eol indique si le programme doit ajouter un CR/LF en fin de chaîne.

Création du composant et convertion du code par Maxime_collomb@yahoo.fr .
Code d'origine sur Community.borland.com :
http://www.vmlinux.org/jakov/community.borland.com/10387.html
}

interface

uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls, Buttons, DosCommand;

type
TForm1 = class(TForm)
Memo1: TMemo;
BitBtn1: TBitBtn;
BitBtn2: TBitBtn;
Button1: TButton;
procedure BitBtn1Click(Sender: TObject);
procedure DosCommand1NewLine(Sender: TObject; NewLine: String; OutputType: TOutputType);
procedure DosCommand1Terminated(Sender: TObject);
procedure Button1Click(Sender: TObject);
private
{ Déclarations privées }
public
{ Déclarations publiques }
end;

var
Form1: TForm1;

implementation

{$R *.DFM}

procedure TForm1.BitBtn1Click(Sender: TObject);
const Ajout_CRLF:Boolean=True;

Var MaCommande :String;

begin
// Exécute une nouvelle instance de l'interpréteur de commandes
// Command.exe pour W98
DosCommand1.CommandLine :='Cmd.exe';

// Redirige la sortie du programme console vers un composant d'affichage TMemo ou autre
// Dans cet exemple on utilise l'evénement OnNewLine
//DosCommand1.OutputLines := Memo1.Lines;

//Lance le programme console
DosCommand1.Execute;

// équivalent à la touche entrée
DosCommand1.SendLine('', Ajout_CRLF);

// Instruction pour le programme console
MaCommande :='Ping 213.09.25.36';

// Insére et exécute l'instruction contenue dans la chaîne
DosCommand1.SendLine(MaCommande, Ajout_CRLF);
end;

procedure TForm1.DosCommand1NewLine(Sender: TObject; NewLine: String;
OutputType: TOutputType);
begin
Case OutputType of
otEntireLine: Memo1.Lines.Add(NewLine);
otBeginningOfLine :Memo1.Lines.Add('** Nouvelle ligne reçue **');
end;
end;

procedure TForm1.DosCommand1Terminated(Sender: TObject);
// La version amélioré permet de recevoir le code de sortie du process.
begin
Memo1.Lines.Add('** Processus terminé **');
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
// on termine proprement l'instance de l'interpréteur de commandes
DosCommand1.SendLine('Exit', True);
end;

Manque de chance lors de la compilation il y a plein d'erreur chez moi je précise, qui font que la compilation est pas possible. Entre autre le use Doscommand est pas reconnu. Donc là j'ai besoin de votre avis. Autre question serait possible de transformer cette source n'ont pas en mode console mais sur une FORM?????

Je vais faire 2 petits reproches à cette source mais bon. Il aurait été vraiment bien qu'il y ai un EDIT avec un bouton ENTRER. Dans l'EDIT on tape sa commande et elle est transmise au dos plutot que de définir une seule commande possible. Evidemment la perfection serait de transmettre le texte du DOS dans un mémo et de taper dans ce mémo nos propres instructions à la suite du retour du DOS. A chaque fois que l'on appuye sur la toucher ENTREE le texte est assimilé au message et envoyer au DOS. Ainsi on aboutirait à un véritable simulateur. Et la bingo Lolo il a le prix Nobel. Autre reproche une rediction en sortie des messages DOS comme dans l'invite. Mais bon sinon je félicite l'auteur à condition que la source puisse engendrer un executable

11 réponses

vaughan Messages postés 198 Date d'inscription mardi 6 août 2002 Statut Membre Dernière intervention 29 octobre 2008
26 août 2005 à 10:26
Tu as besoin dans une form d'effectuer des commandes Dos comme l'invite DOS !!!

Il te suffirait pas dans un TMemo de tester quant l'utilisateur tap sur entrer et d'envoyer un process synchrone cmd.exe [ligne de commande] !!!

vaughan
0
Utilisateur anonyme
26 août 2005 à 11:19
En fait je cherches à faire cela : tu tapes par exemples C:\dir dans la form. Tu valides par entrer et tu vois la réponse MSDOS donc tout les fichiers de la racine apparaitre dans le DOS (et évidemment tu dois pas voir une invite MSDOS apparaitre sur l'écran). Ce n'est pas trop d'envoyer la commande qui me pose problème mais de masquer le DOS et de récuperer sur la FORM le résultat DOS de la commande.
0
vaughan Messages postés 198 Date d'inscription mardi 6 août 2002 Statut Membre Dernière intervention 29 octobre 2008
26 août 2005 à 11:45
Voici en première approche :

Créer un memo pour saisie et retour commande.
Dès que l'utilisateur tape [Enter] tu récuppères la ligne de commande.
Tu lance ton process synchrone en "Hide" avec résultat en sortie fichier,
cmd /k [Ta commande] > [Ton_Fichier.tmp] & Exit
ensuite tu lis le fichier [Ton_Fichier.tmp] pour l'afficher dans ton TMemo

C'est pas terrible de passer par un fichier ... mais le dos c'est basic et il me semble pas possible d'avoir un retour autre qu'une sortie fichier ... a voir !!!

vaughan
0
Utilisateur anonyme
26 août 2005 à 21:21
Ecoute il semble que Laurent-Dardenne a reussit à le faire mais j'arrive pas à compiler son programme.

J'avais une alternative mais mes connaissances en delphi ne sont pas suffisantes pour le mettre en source. Tu as une FORM deux boutons DOS et ARRETTER et un Mémo. Tu appuyes sur DOS : la tu as une fenetre MSDOS qui s'ouvre mais la taille de l'invite MSDOS correspond à celle du Mémo (je ne sais pas si on peut controler la taille de la fenetre MSDOS et je ne sais pas comment on fait en plus). Tu imposes la position de ta fenetre DOS de façon à ce qu'elle masque ton Mémo. Ensuite tu lies les coordonnées de la fenetre DOS avec celle de la FORM : ainsi si tu déplaces la FORM tu déplaces aussi le DOS (la form est donc toujours masqué).Quand tu cliques sur ARRETTER tu fermes ta fenetre MSDOS.

Alors c'est vrai c'est un effet purement visuel mais c'est une alternative théoriquement possible (en effet c'est un "trucage").

Ta solution est interressante mais il faut que ton fichier conduise à un écran (ton fichier ouvert dans le mémo) noir . Graphiquement il ya trop de parametres à prendre. Mais l'idée est bonne (je la met au frais car il y a surement moyen de creuser aussi de ce coté là)
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
vaughan Messages postés 198 Date d'inscription mardi 6 août 2002 Statut Membre Dernière intervention 29 octobre 2008
29 août 2005 à 10:34
Moi je serai passé par un fichier tout de même ... mais chaqu'un ces choix !!! et faire du LoadToFile sur le TString Lines ...

Voici en code les instruction nécessaire pour le pilotage de ta fenêtre Ms-DOS
Par contre je n'ai pas fait dans le jolie ... a toi de placer ta fenêtre correctement

unit UDos;


interface


uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;


type
TForm1 = class(TForm)
btGo: TButton;
btStop: TButton;
mmCmd: TMemo;
procedure btGoClick(Sender: TObject);
procedure btStopClick(Sender: TObject);
private
{ Déclarations privées }
public
{ Déclarations publiques }
end;


var
Form1: TForm1;


implementation


Uses
ExtActns;


{$R *.dfm}


procedure TForm1.btGoClick(Sender: TObject);
Var
vDos : TFileRun;
vHwndDos : HWND;
begin
// Ouverture de l'invite DOs
vDos := TFileRun.Create(self);
Try
vDos.FileName := 'cmd.exe';
vDos.Execute;
Sleep(1000);
// déplace et rédimensionne la fenêtre
vHwndDos := FindWindow(nil, 'C:\WINDOWS\System32\cmd.exe');
if vHwndDos <> 0 then
Begin
MoveWindow(vHwndDos,mmCmd.Top+Form1.Top,mmCmd.Left+Form1.Left,mmCmd.Width,mmCmd.Height,True);
End;
Finally
vDos.Free;
End;
end;


procedure TForm1.btStopClick(Sender: TObject);
Var
vHwndDos : HWND;
begin
vHwndDos := FindWindow(nil, 'C:\WINDOWS\System32\cmd.exe');


if vHwndDos <> 0 then
PostMessage(vHwndDos, WM_CLOSE, 0, 0);


end;



end.

vaughan
0
Utilisateur anonyme
29 août 2005 à 13:38
Merci

Grace à toi les choses ont avancés.
J'ai deux petits problemens. La fenetre MSDOS a une taille qui ne coincide pas avec celle du Mémo et elle se place n'importe ou. Le bouton ARRETTER ne ferme pas ma fenetre MSDOS.

Merci pour tout
0
Utilisateur anonyme
29 août 2005 à 13:42
J'ai du changer mon code car cmd.exe mon pc connait pas j'utilise command.com

unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;

type
TForm1 = class(TForm)
mmCmd: TMemo;
Button1: TButton;
Button2: TButton;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure mmCmdChange(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

Uses
ExtActns;

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
Var
vDos : TFileRun;
vHwndDos : HWND;
begin
// Ouverture de l'invite DOs
vDos := TFileRun.Create(self);
Try
vDos.FileName := 'command.com';
vDos.Execute;
Sleep(1000);
// déplace et rédimensionne la fenêtre
vHwndDos := FindWindow(nil, 'C:\WINDOWS\System32\command.com');
if vHwndDos <> 0 then
Begin
MoveWindow(vHwndDos,mmCmd.Top+Form1.Top,mmCmd.Left+Form1.Left,mmCmd.Width,mmCmd.Height,True);
End;
Finally
vDos.Free;
End;
end;


procedure TForm1.Button2Click(Sender: TObject);
Var
vHwndDos : HWND;
begin
vHwndDos := FindWindow(nil, 'C:\WINDOWS\System32\command.com');

if vHwndDos <> 0 then
PostMessage(vHwndDos, WM_CLOSE, 0, 0);

end;


procedure TForm1.mmCmdChange(Sender: TObject);
begin

end;

end.
0
vaughan Messages postés 198 Date d'inscription mardi 6 août 2002 Statut Membre Dernière intervention 29 octobre 2008
29 août 2005 à 13:48
Le faite de faire un PostMessage(vHwndDos, WM_CLOSE, 0, 0); ne fonctionna pas !!!
Essaies avec WM_DESTROY !!! Bizard

Tu as quelle version de windows ?

Je vais un peu plancher sur mon code pour trouver le bon rapport entre la fenêtre dos et le memo ...

vaughan
0
vaughan Messages postés 198 Date d'inscription mardi 6 août 2002 Statut Membre Dernière intervention 29 octobre 2008
29 août 2005 à 13:52
Je viens d'avoir la réponse à ma question ... tu as W98 ?

vaughan
0
Utilisateur anonyme
29 août 2005 à 21:17
Oui j'ai windows98
0
rick hunteur Messages postés 5 Date d'inscription lundi 26 février 2007 Statut Membre Dernière intervention 28 juillet 2010
12 janv. 2009 à 18:49
Bonjour

Je déterre le post car j'ai un Problème avec l'événement OnNewLine de TDosCommand.
J'arrive à traiter le string NewLine pour ne prendre que ce que je veux et j'arrive à l'afficher dans un Mémo. Mais impossible "d'exporter" le résultat dans un string.
Donc je peux afficher ce que j'ai extrait de NewLine dans un mémo mais je peux pas le mettre dans un string.

Quel est le problème ?

Merci
0
Rejoignez-nous