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
DRJEROME
Messages postés436Date d'inscriptionjeudi 9 janvier 2003StatutMembreDerniè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
Messages postés436Date d'inscriptionjeudi 9 janvier 2003StatutMembreDerniè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
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" ???????
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.
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.
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