Faire une fenêtre DOS dans une form sous Delphi

Utilisateur anonyme - 6 août 2005 à 05:29
 Utilisateur anonyme - 7 août 2005 à 10:44
Salut à tous

J'ai besoin d'aide pour une petite application que je programme sous Delphi. Voilà imaginer une form qui contient deux boutons "DOS" et "ARRETER" ainsi qu'un rectangle noir. Je voudrais faire apparaitre une fenêtre DOS utilisable dans ce rectangle et évidemment revenir au rectangle noir quand on appuye sur "ARRETER". Trois remarques la fenêtre DOS doit être soudée à la Form même quand on déplace la Form. Il faudrait que je puisse faire cela plusieus fois (4 rectangle noir pouvant donner de façon autonome et même simultané 4 applications DOS soudées). Pour fini quand je dis utilisable c'est que l'on peut écrire dans cette fenêtre dos des commandes comme "FORMAT C:"quand elle est dans la forme.


Merci beaucoup pour vos suggestions et merci d'être pédagogue dans vos explications je suis un Bleu en programmation

9 réponses

DRJEROME
Messages postés
436
Date d'inscription
jeudi 9 janvier 2003
Statut
Membre
Dernière intervention
5 février 2015

6 août 2005 à 11:40
un exemple avec la commande "dir" (mais tu mets ce que tu veux), j'ai pas essayé "format"...je pense que ça devrait marcher, mais j'ai pas voulu prendre le risque...

J'ai mis le memo en noir avec une font blanche pour avoir un "look "ms-dos

pour dire "oui", je crois qu'on peut rajouter /Y (par exmple) dans le texte de RunDosInMemo (regarde sur internet les commndes MS-Dos)



<HR>



procedure RunDosInMemo(DosApp:String;AMemo:TMemo);
const
ReadBuffer = 2400;
var
Security : TSecurityAttributes;
ReadPipe,WritePipe : THandle;
start : TStartUpInfo;
ProcessInfo : TProcessInformation;
Buffer : Pchar;
BytesRead : DWord;
Apprunning : DWord;
begin
With Security do begin
nlength := SizeOf(TSecurityAttributes);
binherithandle := true;
lpsecuritydescriptor := nil;
end;
if Createpipe (ReadPipe, WritePipe,
@Security, 0) then begin
Buffer := AllocMem(ReadBuffer + 1);
FillChar(Start,Sizeof(Start),#0);
start.cb := SizeOf(start);
start.hStdOutput := WritePipe;
start.hStdInput := ReadPipe;
start.dwFlags := STARTF_USESTDHANDLES +
STARTF_USESHOWWINDOW;
start.wShowWindow := SW_HIDE;


if CreateProcess(nil,
PChar(DosApp),
@Security,
@Security,
true,
NORMAL_PRIORITY_CLASS,
nil,
nil,
start,
ProcessInfo)
then
begin
repeat
Apprunning := WaitForSingleObject
(ProcessInfo.hProcess,100);
Application.ProcessMessages;
until (Apprunning <> WAIT_TIMEOUT);
Repeat
BytesRead := 0;
ReadFile(ReadPipe,Buffer[0],
ReadBuffer,BytesRead,nil);
Buffer[BytesRead]:= #0;
OemToAnsi(Buffer,Buffer);
AMemo.Text := AMemo.text + String(Buffer);
until (BytesRead < ReadBuffer);
end;
FreeMem(Buffer);
CloseHandle(ProcessInfo.hProcess);
CloseHandle(ProcessInfo.hThread);
CloseHandle(ReadPipe);
CloseHandle(WritePipe);
end;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
Memo1.Clear;
Memo1.Color:=clblack;
Memo1.Font.Color:=clwhite;
RunDosInMemo('cmd /C DIR *.*',Memo1);
end;



<HR>



voilà à toi de voir si ça conviendrait...ou alors tu modifies...


N'oubliez pas de cliquer sur Réponse acceptée si c'est OK

DrJerome
0
DRJEROME
Messages postés
436
Date d'inscription
jeudi 9 janvier 2003
Statut
Membre
Dernière intervention
5 février 2015

6 août 2005 à 12:50
concernant le code que je t'ai donné (le 1° au-dessus) : tu peux essayer d'autres conmandes... "cls" ça efface l'écran Dos etc... tu peux essayer d'ouvrir des dossiers ouvrables dans Dos (en mettant en plus les commandes) et les visualiser dans un Memo càd récupérer le texte Dos...

il y a ça aussi si ça peut t'aider, je viens de l'écrire (penser à mettre shellapi) :

<HR>
procedure TForm1.Button1Click(Sender: TObject);
var
pc:array [0..max_path-1] of char;
h:HWND;
FileMSDos:PChar;
unite:string;
begin
h:=0;
GetWindowsDirectory(pc,max_path-1);
unite:=copy(StrPas(pc),1,3);//ça donne "C:" par exemple
FileMSDos:=PChar(StrPas(pc)+'\System32\cmd.exe');
Shellexecute(handle,'open',FileMSDos,'',PChar(unite),SW_HIDE);
while h=0 do h:=findwindow('ConsoleWindowClass',FileMSDos);
Windows.SetParent(h,form1.handle);//tu peux mettre sur un panel càd panel1.handle par exemple
SetWindowPos(h,HWND_TOP,0,0,0,0,SWP_NOSIZE or SWP_SHOWWINDOW);
end;


<HR>

Il doit y avoir d'autres solutions...

N'oubliez pas de cliquer sur Réponse acceptée si c'est OK

DrJerome
0
Utilisateur anonyme
6 août 2005 à 15:35
Merci pour ta réponse mais je pense que je suis pas assez précis

Voila imagine que tu as une Form si tu appuye sur DOS tu peux au niveau du bouton "DOS" fermer ta form et ouvrir une invite MS-DOS pour travailler directement dessus (par exemple lancer toutes les commandes que tu veux pour faire du "FTP"). Bah moi je veux faire la même chose c'est à dire ouvrir une commande MS-DOS que je peux utiliser directement tout en pouvant continuer a travailler sur ma form (appuyer sur des boutons par exemples). De plus cette fenêtre MSDOS doit apparaitre dans une partie déja définit (par une image toute noire) de la FORM. Si je déplace la FORM avec la souris par exemple ou si je diminue la taille de la FORM (apres compilation et execution biensur) la fenêtre MSDOS doit rester toujours liée au même endroit sur la FORM.


Ah oui j'ai rien compris à ta première réponse quand à la deuxième Delphi n'a pas reconnu "Var" ???????

Merci

Je t'envoye un imprime écran si tu veux
0
DRJEROME
Messages postés
436
Date d'inscription
jeudi 9 janvier 2003
Statut
Membre
Dernière intervention
5 février 2015

6 août 2005 à 15:56
essaie quand même la 2° solution, c'est bizarre que "var" ne soit pas reconnu

DrJerome
0

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

Posez votre question
Utilisateur anonyme
6 août 2005 à 18:31
désolé c'est de ma faute je t'explique il y a un beugue sur la page quand j'écris le message un message masque une partie de la fenêtre

Bon je vais être plus clair par un dessin

Exemple :

...................... ....................
. . . .
. ......... . . ......... .
. . . . . .C:\ . . apres C:\ ecrire toutes
. . . . . . . . les commandes que l'on
. . . . . . . . veut C:\dir
. ......... . . ......... . c:\del *.*
. . . . c:\format c:
. . . . ect ect
. . . .
. . . .
...................... ....................

Il manque les boutons DOS et ARRETER mais imaginez qu'ils sont sous le petit rectangle noir (fenêtre noir) dans le grand rectangle (la FORM). Quand on clique sur DOS on obtient l'image de gauche et on peut travailler directement sur le DOS. Evidemment si on appuye sur ARRETER on revient au schéma de gauche.
0
Utilisateur anonyme
7 août 2005 à 00:03
J'ai testé la seconde option : cela ne fait rien mon exeuctable ce bloc complètement. La form ne peut même plus être déplacée. Je donne la source si vous comprennez l'erreur.


unit Test1;

interface

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

type
TForm1 = class(TForm)
Panel1: TPanel;
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;
var
pc:array [0..max_path-1] of char;
h:HWND;
FileMSDos:PChar;
unite:string;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
h:=0;
GetWindowsDirectory(pc,max_path-1);
unite:=copy(StrPas(pc),1,3);//ça donne "C:" par exemple
FileMSDos:=PChar(StrPas(pc)+'\System32\cmd.exe');
Shellexecute(handle,'open',FileMSDos,'',PChar(unite),SW_HIDE);
while h=0 do h:=findwindow('ConsoleWindowClass',FileMSDos);
Windows.SetParent(h,Panel1.handle);//tu peux mettre sur un panel càd panel1.handle par exemple
SetWindowPos(h,HWND_TOP,0,200,0,300,SWP_NOSIZE);//si change les valeurs cela ne fait rien
end;

end.


Bon je débute en delphi mais peut être une idée après il faut la transcrire en language (et cela je peche)

Si je clique sur le bouton DOS :
Ouvrir une invite MSDOS
Dimensionner cette invite à la même taille du panel
La faire réagir au niveau des déplacement de la même facon que le ferait le panel initial.

Si je clique sur le bouton STOP (il y a en a pas dans la source) fermer la fenêtre MSDOS et remettre le panel avec les mêmes configurations de position sur l'écran

Si vous avez une idée de source merci d'avance
0
DRJEROME
Messages postés
436
Date d'inscription
jeudi 9 janvier 2003
Statut
Membre
Dernière intervention
5 février 2015

7 août 2005 à 04:32
décidément...que des bugs.

Ceci par exemple ne bloque pas chez moi :

<HR>
SetWindowPos(h,HWND_TOP,0,0,panel1.width,panel1.height,SWP_SHOWWINDOW);


<HR>

DrJerome
0
Utilisateur anonyme
7 août 2005 à 10:36
Je teste et je te dis

Merci man (j'ai mon ménage à faire et après je pars en vacances) alors je vais travailler cela en revenant.
0
Utilisateur anonyme
7 août 2005 à 10:44
Marche pas sur mon panel il y a toujours marqué "Panel 1" noir sur fond gris.
0