![]() |
cmd fenster
hallo,
wie kann ich in meinem projekt, ein cmd fenster einbinden, fest einbinden ? möchte gerne dieses fenster fest im form1 verankern ! beispiel, wird button1 ausgeführt ( eine batchdatei, wird ausgeführt ) geht ja das cmd fenster auf ! dieses möchte ich verhindern und im meinem Form1 ein festes fenster programmieren ! arbeite erst zwei tage mit delphi, wenn möglich ein wenig quelltext anzeigen danke |
Re: cmd fenster
|
Re: cmd fenster
|
Re: cmd fenster
|
Re: cmd fenster
danke klaus,
werde mir das mal anschauen danke |
Re: cmd fenster
ich bin noch zu blöd dafür
so wie mache ich das, möchte das jetzt lernen ! :oops:
Delphi-Quellcode:
wenn ich button1 drücke, wir eine batchdatei ausgeführt !ich möchte dann , das kein cmd fenster auf geht, sondern im panel angezeigt wir. button1 muß ich noch programmieren, dass bekomme ich hin, habe gestern geübt :lol: :lol:
unit Unit1;
interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ExtCtrls; type TForm1 = class(TForm) Panel1: TPanel; Button1: TButton; private { Private-Deklarationen } public { Public-Deklarationen } end; var Form1: TForm1; implementation {$R *.DFM} end. danke [edit=SirThornberry]Delphi-Tags gesetzt - nächstes mal bitte selbst machen - Mfg, SirThornberry[/edit] |
Re: cmd fenster
wenn du gerade erst anfängst schau dir mal die Grundlagentutorials an und arbeite dich anschließend durch die anderen durch:
![]() |
Re: cmd fenster
jens du hast ja recht :oops:
werde ich auch noch machen ! steh etwas unter zeit druck ? deswegen meine blöden fragen dank gruß andre :wink: |
Re: cmd fenster
Lernen und Zeitdruck passen leider selten zusammen :(
|
Re: cmd fenster
Ist das eig. eine Batch-Datei von Dir? Wenn ja, könntest Du die Funktion doch in Delphi nachbilden und den Weg über die CMD vernachlässigen.
|
Re: cmd fenster
da ich viel mit batchdateien mache, möchte ich so ein kleines fenster haben
zur kontrolle ! wollte erstmal bei meinen batchdateien bleiben! ist doch ok oder ? gruß andre |
Re: cmd fenster
Klar ist das ok. ;-)
Ich hätte jetzt nur gedacht, dass Du die Funktionen der Batch-Dateien auch in Delphi nachprogrammieren kannst. Überprüfen kannst ja dort genau so gut. Wenn Dir aber der Weg mit den Batch-Dateien lieber ist, will ich Dich auch nicht davon abhalten. |
Re: cmd fenster
danke,
aber scheint doch nicht so einfach zu sein, so ein blödes fenster zu programmieren oder ? ich muss noch viel üben :!: |
Re: cmd fenster
|
Re: cmd fenster
was bin ich nervig oder :x :x
was ist das für ein fehler ?? [Fataler Fehler] Unit1.pas(6): Datei nicht gefunden: 'Variants.dcu' was muß ich hier ändern ?? unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type TForm1 = class(TForm) MemoOutput: TMemo; Button1: TButton; procedure FormCreate(Sender: TObject); procedure FormClose(Sender: TObject; var Action: TCloseAction); procedure BtnWriteCmdClick(Sender: TObject); procedure EdCmdKeyPress(Sender: TObject; var Key: Char); procedure Button1Click(Sender: TObject); private fInputPipeRead, fInputPipeWrite, fOutputPipeRead, fOutputPipeWrite: Cardinal; fProcess: Cardinal; procedure FClbProc(Sender: TObject; const ABuffer: String; ABufSize: Cardinal); procedure FOpenProcess; procedure FCloseProcess; procedure FWriteToStdIn(const AText: String); { Private declarations } public { Public declarations } end; TPipeClbProc = procedure(Sender: TObject; const ABuffer: String; ABufSize: Cardinal) of Object; TPipeReadThread = class(TThread) private fBuffer: String; fBytesRead: Cardinal; fClbProc: TPipeClbProc; fPipeOutput: Cardinal; procedure FSyncProc; protected procedure Execute; override; constructor Create(AClbProc: TPipeClbProc; APipeOutput: Cardinal); end; var Form1: TForm1; implementation {$R *.dfm} {================================================= =============================} constructor TPipeReadThread.Create(AClbProc: TPipeClbProc; APipeOutput: Cardinal); begin inherited Create(True); fClbProc := AClbProc; fPipeOutput := APipeOutput; SetLength(fBuffer, 5000); FreeOnTerminate := True; Resume; end; {================================================= =============================} procedure TPipeReadThread.Execute; var LBufSize: Cardinal; LRes : Boolean; begin LBufSize := Length(fBuffer); repeat LRes := ReadFile(fPipeOutput, fBuffer[1], LBufSize, fBytesRead, nil); Synchronize(fSyncProc); until not(LRes) or Terminated; end; {================================================= =============================} procedure TPipeReadThread.FSyncProc; begin fClbProc(Self, fBuffer, fBytesRead); end; {================================================= =============================} {================================================= =============================} {================================================= =============================} procedure TForm1.FClbProc(Sender: TObject; const ABuffer: String; ABufSize: Cardinal); var LNew: String; LPos: Integer; begin LNew := copy(ABuffer, 1, ABufSize); LPos := pos(#$C, LNew); if (LPos > 0) then begin MemoOutput.Text := ''; LNew := copy(LNew, LPos + 1, Length(LNew)); end; MemoOutput.Text := MemoOutput.Text + LNew; PostMessage(MemoOutput.Handle, WM_VSCROLL, SB_BOTTOM, 0); end; {================================================= =============================} procedure TForm1.FOpenProcess; var LStartupInfo: TStartupInfo; LProcessInfo: TProcessInformation; LSecurityAttr: TSECURITYATTRIBUTES; LSecurityDesc: TSecurityDescriptor; begin FillChar(LSecurityDesc, SizeOf(LSecurityDesc), 0); InitializeSecurityDescriptor(@LSecurityDesc, SECURITY_DESCRIPTOR_REVISION); SetSecurityDescriptorDacl(@LSecurityDesc, True, nil, False); LSecurityAttr.nLength := SizeOf(LSecurityAttr); LSecurityAttr.lpSecurityDescriptor := @LSecurityDesc; LSecurityAttr.bInheritHandle := True; fProcess := 0; if CreatePipe(fInputPipeRead, fInputPipeWrite, @LSecurityAttr, 0) then //Input-Pipe begin if CreatePipe(fOutputPipeRead, fOutputPipeWrite, @LSecurityAttr, 0) then //Output-Pipe begin FillChar(LStartupInfo, SizeOf(LStartupInfo), 0); FillChar(LProcessInfo, SizeOf(LProcessInfo), 0); LStartupInfo.cb := SizeOf(LStartupInfo); LStartupInfo.hStdOutput := fOutputPipeWrite; LStartupInfo.hStdInput := fInputPipeRead; LStartupInfo.hStdError := fOutputPipeWrite; LStartupInfo.dwFlags := STARTF_USESTDHANDLES or STARTF_USESHOWWINDOW; LStartupInfo.wShowWindow := SW_HIDE; if CreateProcess(nil, 'cmd', @LSecurityAttr, nil, True, 0, nil, nil, LStartupInfo, LProcessInfo) then begin fProcess := LProcessInfo.hProcess; TPipeReadThread.Create(FClbProc, fOutputPipeRead); end else begin CloseHandle(fInputPipeRead); CloseHandle(fInputPipeWrite); CloseHandle(fOutputPipeRead); CloseHandle(fOutputPipeWrite); end; end else begin CloseHandle(fInputPipeRead); CloseHandle(fInputPipeWrite); end; end end; {================================================= =============================} procedure TForm1.FCloseProcess; begin if (fProcess <> 0) then begin CloseHandle(fInputPipeRead); CloseHandle(fInputPipeWrite); CloseHandle(fOutputPipeRead); CloseHandle(fOutputPipeWrite); TerminateProcess(fProcess, 0); fProcess := 0; end; end; {================================================= =============================} procedure TForm1.FWriteToStdIn(const AText: String); var LPos, LWritten: Cardinal; LRes : Boolean; begin LPos := 1; repeat LWritten := 0; LRes := WriteFile(fInputPipeWrite, AText[LPos], Cardinal(Length(AText)) - LPos + 1, LWritten, nil); inc(LPos, LWritten); until not(LRes) or (LPos > Cardinal(Length(AText))); end; {================================================= =============================} procedure TForm1.FormCreate(Sender: TObject); begin fProcess := 0; FOpenProcess; end; {================================================= =============================} procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction); begin FCloseProcess; end; {================================================= =============================} procedure TForm1.BtnWriteCmdClick(Sender: TObject); begin FWriteToStdIn(EdCmd.Text + #13#10); EdCmd.Text := ''; end; {================================================= =============================} procedure TForm1.EdCmdKeyPress(Sender: TObject; var Key: Char); begin if Key = #13 then begin Key := #0; BtnWriteCmdClick(nil); end; end; {================================================= =============================} procedure TForm1.Button1Click(Sender: TObject); procedure TForm1.Button1Click(Sender: TObject); VAR e: INTEGER; begin e := ShellExecute (Handle, NIL, PCHAR('C:\Dokumente und Einstellungen\Administrator\Desktop\Handyalarm\NEF .BAT'), PCHAR(''), NIL, SW_SHOW); IF (e<=32) THEN begin ShowMessage('Fehler: Batch-Datei konnte nicht ausgeführt werden!') end; end. |
Re: cmd fenster
Du hast anscheinend noch ein Delphi < 7 (oder war das 6?). Lösch einfach die Unit "Variants" aus der uses-Klausel heraus.
|
Re: cmd fenster
habe ich gemacht, jetzt habe ich die probleme:
[Fehler] Unit1.pas(199): Undefinierter Bezeichner: 'EdCmd' [Fehler] Unit1.pas(199): Anweisung erforderlich, aber Ausdruck vom Typ 'TCaption' gefunden [Fehler] Unit1.pas(217): ';' erwartet, aber '.' gefunden [Fehler] Unit1.pas(222): Undefinierter Bezeichner: 'ShellExecute' [Fehler] Unit1.pas(244): ';' erwartet, aber '.' gefunden [Fehler] Unit1.pas(246): Deklaration erwartet, aber Dateiende gefunden [Fataler Fehler] Project1.dpr(5): Verwendete Unit 'Unit1.pas' kann nicht compiliert werden arbeite mit delphi 5 |
Re: cmd fenster
der fehler:
Fehler] Unit1.pas(222): Undefinierter Bezeichner: 'ShellExecute habe ich gerade selber behoben |
Re: cmd fenster
Ich habe auch Delphi 5 und musste nur Variants aus der uses-Klausel löschen, damit es ging. Sicher, dass du nichts anderes geändert hast?
Mfg |
Re: cmd fenster
es geht danke :)
|
Re: cmd fenster
scheiße :oops: :oops:
wenn meine batchdatei ausgeführt wird geht immer noch das cmd fenster auf hier schaut mal rein: unit Unit1; interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls,ShellAPI; type TForm1 = class(TForm) MemoOutput: TMemo; Button1: TButton; procedure FormCreate(Sender: TObject); procedure FormClose(Sender: TObject; var Action: TCloseAction); procedure Button1Click(Sender: TObject); private fInputPipeRead, fInputPipeWrite, fOutputPipeRead, fOutputPipeWrite: Cardinal; fProcess: Cardinal; procedure FClbProc(Sender: TObject; const ABuffer: String; ABufSize: Cardinal); procedure FOpenProcess; procedure FCloseProcess; procedure FWriteToStdIn(const AText: String); { Private declarations } public { Public declarations } end; TPipeClbProc = procedure(Sender: TObject; const ABuffer: String; ABufSize: Cardinal) of Object; TPipeReadThread = class(TThread) private fBuffer: String; fBytesRead: Cardinal; fClbProc: TPipeClbProc; fPipeOutput: Cardinal; procedure FSyncProc; protected procedure Execute; override; constructor Create(AClbProc: TPipeClbProc; APipeOutput: Cardinal); end; var Form1: TForm1; implementation {$R *.dfm} {================================================= =============================} constructor TPipeReadThread.Create(AClbProc: TPipeClbProc; APipeOutput: Cardinal); begin inherited Create(True); fClbProc := AClbProc; fPipeOutput := APipeOutput; SetLength(fBuffer, 5000); FreeOnTerminate := True; Resume; end; {================================================= =============================} procedure TPipeReadThread.Execute; var LBufSize: Cardinal; LRes : Boolean; begin LBufSize := Length(fBuffer); repeat LRes := ReadFile(fPipeOutput, fBuffer[1], LBufSize, fBytesRead, nil); Synchronize(fSyncProc); until not(LRes) or Terminated; end; {================================================= =============================} procedure TPipeReadThread.FSyncProc; begin fClbProc(Self, fBuffer, fBytesRead); end; {================================================= =============================} {================================================= =============================} {================================================= =============================} procedure TForm1.FClbProc(Sender: TObject; const ABuffer: String; ABufSize: Cardinal); var LNew: String; LPos: Integer; begin LNew := copy(ABuffer, 1, ABufSize); LPos := pos(#$C, LNew); if (LPos > 0) then begin MemoOutput.Text := ''; LNew := copy(LNew, LPos + 1, Length(LNew)); end; MemoOutput.Text := MemoOutput.Text + LNew; PostMessage(MemoOutput.Handle, WM_VSCROLL, SB_BOTTOM, 0); end; {================================================= =============================} procedure TForm1.FOpenProcess; var LStartupInfo: TStartupInfo; LProcessInfo: TProcessInformation; LSecurityAttr: TSECURITYATTRIBUTES; LSecurityDesc: TSecurityDescriptor; begin FillChar(LSecurityDesc, SizeOf(LSecurityDesc), 0); InitializeSecurityDescriptor(@LSecurityDesc, SECURITY_DESCRIPTOR_REVISION); SetSecurityDescriptorDacl(@LSecurityDesc, True, nil, False); LSecurityAttr.nLength := SizeOf(LSecurityAttr); LSecurityAttr.lpSecurityDescriptor := @LSecurityDesc; LSecurityAttr.bInheritHandle := True; fProcess := 0; if CreatePipe(fInputPipeRead, fInputPipeWrite, @LSecurityAttr, 0) then //Input-Pipe begin if CreatePipe(fOutputPipeRead, fOutputPipeWrite, @LSecurityAttr, 0) then //Output-Pipe begin FillChar(LStartupInfo, SizeOf(LStartupInfo), 0); FillChar(LProcessInfo, SizeOf(LProcessInfo), 0); LStartupInfo.cb := SizeOf(LStartupInfo); LStartupInfo.hStdOutput := fOutputPipeWrite; LStartupInfo.hStdInput := fInputPipeRead; LStartupInfo.hStdError := fOutputPipeWrite; LStartupInfo.dwFlags := STARTF_USESTDHANDLES or STARTF_USESHOWWINDOW; LStartupInfo.wShowWindow := SW_HIDE; if CreateProcess(nil, 'cmd', @LSecurityAttr, nil, True, 0, nil, nil, LStartupInfo, LProcessInfo) then begin fProcess := LProcessInfo.hProcess; TPipeReadThread.Create(FClbProc, fOutputPipeRead); end else begin CloseHandle(fInputPipeRead); CloseHandle(fInputPipeWrite); CloseHandle(fOutputPipeRead); CloseHandle(fOutputPipeWrite); end; end else begin CloseHandle(fInputPipeRead); CloseHandle(fInputPipeWrite); end; end end; {================================================= =============================} procedure TForm1.FCloseProcess; begin if (fProcess <> 0) then begin CloseHandle(fInputPipeRead); CloseHandle(fInputPipeWrite); CloseHandle(fOutputPipeRead); CloseHandle(fOutputPipeWrite); TerminateProcess(fProcess, 0); fProcess := 0; end; end; {================================================= =============================} procedure TForm1.FWriteToStdIn(const AText: String); var LPos, LWritten: Cardinal; LRes : Boolean; begin LPos := 1; repeat LWritten := 0; LRes := WriteFile(fInputPipeWrite, AText[LPos], Cardinal(Length(AText)) - LPos + 1, LWritten, nil); inc(LPos, LWritten); until not(LRes) or (LPos > Cardinal(Length(AText))); end; {================================================= =============================} procedure TForm1.FormCreate(Sender: TObject); begin fProcess := 0; FOpenProcess; end; {================================================= =============================} procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction); begin FCloseProcess; end; {================================================= =============================} {================================================= =============================} procedure TForm1.Button1Click(Sender: TObject); VAR e: INTEGER; begin e := ShellExecute (Handle, NIL, PCHAR('C:\Dokumente und Einstellungen\Administrator\Desktop\Alarm\NEF.BAT' ), PCHAR(''), NIL, SW_SHOW); IF (e<=32) THEN begin ShowMessage('Fehler: Batch-Datei konnte nicht ausgeführt werden!') end end; end. batchdatei zum test ping localhost probiert mal |
Re: cmd fenster
wer kann mir weiter helfen ?
kann auch das ganze programm schicken !! |
Re: cmd fenster
Hi,
Du brauchst nicht innerhalb 30 Minuten zu pushen, dazu keine Delphi-Tags um den Code. |
Re: cmd fenster
Hallo,
lass das mit dem ShellExecute weg und folge dem Beispiel. ![]() Heiko |
Re: cmd fenster
als erstes die Delphi-Tags nachträglich setzen (den Beitrag kannst du mit dem Edit-button nachträglich bearbeiten) und als nächstes uns deine Delphiversion verraten.
|
Re: cmd fenster
was heißt delphi tags ??? ich bin doch ganz neu dabei
versuche seit zwei tagen mit delphi 5 zu arbeiten |
Re: cmd fenster
Delphi-Quellcode:
< Das sind die Delphi-Tags. Wenn Du die um Deinen Code machst, wird der farblich korrekt dargestellt.
<Hier Code hin>
|
Re: cmd fenster
Hallo,
mit Tags ist das Forum hier gemeint, nicht Delphi selber. Markier den Delphi-Code im Edit-Fenster und klciek oben auf Delphi-Code. Ah ja und willkommen bei Delphi ;) Heiko |
Re: cmd fenster bekomme es einfach nicht hin
hallo bekomme es einfach nicht hin:
wenn button 1 eine bachdatei ausführt soll sie in meiner console angezeigt werden und nicht wo anders was mache ich falsch :wall: :wall: schaut euch den quelltext an und ändert in bitte danke unit Unit1; interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ShellAPI; type TForm1 = class(TForm) MemoOutput: TMemo; EdCmd: TEdit; BtnWriteCmd: TButton; Button1: TButton; procedure FormCreate(Sender: TObject); procedure FormClose(Sender: TObject; var Action: TCloseAction); procedure BtnWriteCmdClick(Sender: TObject); procedure EdCmdKeyPress(Sender: TObject; var Key: Char); procedure Button1Click(Sender: TObject); private fInputPipeRead, fInputPipeWrite, fOutputPipeRead, fOutputPipeWrite: Cardinal; fProcess: Cardinal; procedure FClbProc(Sender: TObject; const ABuffer: String; ABufSize: Cardinal); procedure FOpenProcess; procedure FCloseProcess; procedure FWriteToStdIn(const AText: String); { Private declarations } public { Public declarations } end; TPipeClbProc = procedure(Sender: TObject; const ABuffer: String; ABufSize: Cardinal) of Object; TPipeReadThread = class(TThread) private fBuffer: String; fBytesRead: Cardinal; fClbProc: TPipeClbProc; fPipeOutput: Cardinal; procedure FSyncProc; protected procedure Execute; override; constructor Create(AClbProc: TPipeClbProc; APipeOutput: Cardinal); end; var Form1: TForm1; implementation {$R *.dfm} constructor TPipeReadThread.Create(AClbProc: TPipeClbProc; APipeOutput: Cardinal); begin inherited Create(True); fClbProc := AClbProc; fPipeOutput := APipeOutput; SetLength(fBuffer, 5000); FreeOnTerminate := True; Resume; end; procedure TPipeReadThread.Execute; var LBufSize: Cardinal; LRes : Boolean; begin LBufSize := Length(fBuffer); repeat LRes := ReadFile(fPipeOutput, fBuffer[1], LBufSize, fBytesRead, nil); Synchronize(fSyncProc); until not(LRes) or Terminated; end; procedure TPipeReadThread.FSyncProc; begin fClbProc(Self, fBuffer, fBytesRead); end; procedure TForm1.FClbProc(Sender: TObject; const ABuffer: String; ABufSize: Cardinal); var LNew: String; LPos: Integer; begin LNew := copy(ABuffer, 1, ABufSize); LPos := pos(#$C, LNew); if (LPos > 0) then begin MemoOutput.Text := ''; LNew := copy(LNew, LPos + 1, Length(LNew)); end; MemoOutput.Text := MemoOutput.Text + LNew; PostMessage(MemoOutput.Handle, WM_VSCROLL, SB_BOTTOM, 0); end; procedure TForm1.FOpenProcess; var LStartupInfo: TStartupInfo; LProcessInfo: TProcessInformation; LSecurityAttr: TSECURITYATTRIBUTES; LSecurityDesc: TSecurityDescriptor; begin FillChar(LSecurityDesc, SizeOf(LSecurityDesc), 0); InitializeSecurityDescriptor(@LSecurityDesc, SECURITY_DESCRIPTOR_REVISION); SetSecurityDescriptorDacl(@LSecurityDesc, True, nil, False); LSecurityAttr.nLength := SizeOf(LSecurityAttr); LSecurityAttr.lpSecurityDescriptor := @LSecurityDesc; LSecurityAttr.bInheritHandle := True; fProcess := 0; if CreatePipe(fInputPipeRead, fInputPipeWrite, @LSecurityAttr, 0) then //Input-Pipe begin if CreatePipe(fOutputPipeRead, fOutputPipeWrite, @LSecurityAttr, 0) then //Output-Pipe begin FillChar(LStartupInfo, SizeOf(LStartupInfo), 0); FillChar(LProcessInfo, SizeOf(LProcessInfo), 0); LStartupInfo.cb := SizeOf(LStartupInfo); LStartupInfo.hStdOutput := fOutputPipeWrite; LStartupInfo.hStdInput := fInputPipeRead; LStartupInfo.hStdError := fOutputPipeWrite; LStartupInfo.dwFlags := STARTF_USESTDHANDLES or STARTF_USESHOWWINDOW; LStartupInfo.wShowWindow := SW_HIDE; if CreateProcess(nil, 'cmd', @LSecurityAttr, nil, True, 0, nil, nil, LStartupInfo, LProcessInfo) then begin fProcess := LProcessInfo.hProcess; TPipeReadThread.Create(FClbProc, fOutputPipeRead); end else begin CloseHandle(fInputPipeRead); CloseHandle(fInputPipeWrite); CloseHandle(fOutputPipeRead); CloseHandle(fOutputPipeWrite); end; end else begin CloseHandle(fInputPipeRead); CloseHandle(fInputPipeWrite); end; end end; procedure TForm1.FCloseProcess; begin if (fProcess <> 0) then begin CloseHandle(fInputPipeRead); CloseHandle(fInputPipeWrite); CloseHandle(fOutputPipeRead); CloseHandle(fOutputPipeWrite); TerminateProcess(fProcess, 0); fProcess := 0; end; end; procedure TForm1.FWriteToStdIn(const AText: String); var LPos, LWritten: Cardinal; LRes : Boolean; begin LPos := 1; repeat LWritten := 0; LRes := WriteFile(fInputPipeWrite, AText[LPos], Cardinal(Length(AText)) - LPos + 1, LWritten, nil); inc(LPos, LWritten); until not(LRes) or (LPos > Cardinal(Length(AText))); end; procedure TForm1.FormCreate(Sender: TObject); begin fProcess := 0; FOpenProcess; end; procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction); begin FCloseProcess; end; procedure TForm1.BtnWriteCmdClick(Sender: TObject); begin FWriteToStdIn(EdCmd.Text + #13#10); EdCmd.Text := ''; end; procedure TForm1.EdCmdKeyPress(Sender: TObject; var Key: Char); begin if Key = #13 then begin Key := #0; BtnWriteCmdClick(nil); end; end; procedure TForm1.Button1Click(Sender: TObject); VAR e: INTEGER; begin e := ShellExecute (Handle, NIL, PCHAR('C:\Dokumente und Einstellungen\Administrator\Desktop\testus\NEF.BAT '), PCHAR(''), NIL, SW_SHOW); IF (e<=32) THEN begin ShowMessage('Fehler: Batch-Datei konnte nicht ausgeführt werden!') end end; end. [code] |
Re: cmd fenster
Moin, Moin technik05!
In Beitrag #24 wurde doch schon gesagt, vergiss das ShellExecute und verwende das Beispiel aus dsdt. Ich habe das heute auch mal verwendet, das funktioniert! |
Re: cmd fenster
aber bei funktoniert es nicht !!!
|
Re: cmd fenster
Und was funktioniert nicht?
Du schreibst immer nur, geht nicht, wir sollen es ausbaden und Du setzt nicht mal die Delphi-Tags korrekt um Deinen Code... |
Re: cmd fenster
... dann ein gut gemeinter Rat:
Vergiss doch für ein paar Minuten dein eigentliches Programm und beschäftige dich ausschließlich mit der Umsetzung des dsdt-Beispiels: Kopiere die Funktion "GetConsoleOutput" in ein neues Projekt, packe auf das Form einen Button und ein Memo. In das OnClick des Buttons fügst du folgenden Code ein. Der ist gegenüber dem dsdt-Beispiel etwas erweitert, damit z.B. auch Umlaute im Memo korrekt dargestellt werden:
Delphi-Quellcode:
Und wenn hier alles funktioniert, übernimmst du das Ganze in dein eigentliches Projekt!
procedure T~~.Button1Click(Sender:TObject);
var Output, Errors : TStringList; CmdInterpreter, Command : String; function IsWindowsNT:Boolean; begin Result:=(Win32Platform=Ver_Platform_Win32_NT); end; function ConsoleStr2AnsiStr(ConsoleStr:String):String; var Buffer : pChar; begin Result:=ConsoleStr; GetMem(Buffer,length(ConsoleStr)+1); try OEMToCharBuff(pChar(ConsoleStr),Buffer,length(ConsoleStr)); SetString (Result,Buffer,length(ConsoleStr)); finally FreeMem(Buffer,length(ConsoleStr)+1); end; end; begin Memo1.Clear; Command:='dir c:\'; // <<< hier DEINEN BatchAufruf placieren!!!!!! if IsWindowsNT then CmdInterpreter:='cmd' else CmdInterpreter:='command'; Output:=TStringList.Create; try Errors:=TStringList.Create; if GetConsoleOutput(CmdInterpreter+' /c '+Command,Output,Errors) then begin Memo1.Lines.AddStrings(Output); Memo1.Text:=ConsoleStr2AnsiStr(Memo1.Text); end finally Output.Free; Errors.Free; end; end; :hi: Viel Erfolg! |
Re: cmd fenster
[delphi][code][dp][center]
unit Unit1; interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls,ShellAPI, ExtCtrls; type TForm1 = class(TForm) MemoOutput: TMemo; Button1: TButton; Panel1: TPanel; Label1: TLabel; Label2: TLabel; Label3: TLabel; Panel2: TPanel; Panel3: TPanel; Label4: TLabel; Label5: TLabel; Panel4: TPanel; Label6: TLabel; Button2: TButton; Button3: TButton; Button4: TButton; Button5: TButton; Label7: TLabel; Button6: TButton; Button7: TButton; Button8: TButton; Button9: TButton; Button10: TButton; Button11: TButton; Button12: TButton; procedure FormCreate(Sender: TObject); procedure FormClose(Sender: TObject; var Action: TCloseAction); procedure Button1Click(Sender: TObject); procedure Button2Click(Sender: TObject); procedure Button3Click(Sender: TObject); procedure Button4Click(Sender: TObject); procedure Button5Click(Sender: TObject); private fInputPipeRead, fInputPipeWrite, fOutputPipeRead, fOutputPipeWrite: Cardinal; fProcess: Cardinal; procedure FClbProc(Sender: TObject; const ABuffer: String; ABufSize: Cardinal); procedure FOpenProcess; procedure FCloseProcess; { Private declarations } public { Public declarations } end; TPipeClbProc = procedure(Sender: TObject; const ABuffer: String; ABufSize: Cardinal) of Object; TPipeReadThread = class(TThread) private fBuffer: String; fBytesRead: Cardinal; fClbProc: TPipeClbProc; fPipeOutput: Cardinal; procedure FSyncProc; protected procedure Execute; override; constructor Create(AClbProc: TPipeClbProc; APipeOutput: Cardinal); end; var Form1: TForm1; implementation {$R *.dfm} {================================================= =============================} constructor TPipeReadThread.Create(AClbProc: TPipeClbProc; APipeOutput: Cardinal); begin inherited Create(True); fClbProc := AClbProc; fPipeOutput := APipeOutput; SetLength(fBuffer, 5000); FreeOnTerminate := True; Resume; end; {================================================= =============================} procedure TPipeReadThread.Execute; var LBufSize: Cardinal; LRes : Boolean; begin LBufSize := Length(fBuffer); repeat LRes := ReadFile(fPipeOutput, fBuffer[1], LBufSize, fBytesRead, nil); Synchronize(fSyncProc); until not(LRes) or Terminated; end; {================================================= =============================} procedure TPipeReadThread.FSyncProc; begin fClbProc(Self, fBuffer, fBytesRead); end; {================================================= =============================} {================================================= =============================} {================================================= =============================} procedure TForm1.FClbProc(Sender: TObject; const ABuffer: String; ABufSize: Cardinal); var LNew: String; LPos: Integer; begin LNew := copy(ABuffer, 1, ABufSize); LPos := pos(#$C, LNew); if (LPos > 0) then begin MemoOutput.Text := ''; LNew := copy(LNew, LPos + 1, Length(LNew)); end; MemoOutput.Text := MemoOutput.Text + LNew; PostMessage(MemoOutput.Handle, WM_VSCROLL, SB_BOTTOM, 0); end; {================================================= =============================} procedure TForm1.FOpenProcess; var LStartupInfo: TStartupInfo; LProcessInfo: TProcessInformation; LSecurityAttr: TSECURITYATTRIBUTES; LSecurityDesc: TSecurityDescriptor; begin FillChar(LSecurityDesc, SizeOf(LSecurityDesc), 0); InitializeSecurityDescriptor(@LSecurityDesc, SECURITY_DESCRIPTOR_REVISION); SetSecurityDescriptorDacl(@LSecurityDesc, True, nil, False); LSecurityAttr.nLength := SizeOf(LSecurityAttr); LSecurityAttr.lpSecurityDescriptor := @LSecurityDesc; LSecurityAttr.bInheritHandle := True; fProcess := 0; if CreatePipe(fInputPipeRead, fInputPipeWrite, @LSecurityAttr, 0) then //Input-Pipe begin if CreatePipe(fOutputPipeRead, fOutputPipeWrite, @LSecurityAttr, 0) then //Output-Pipe begin FillChar(LStartupInfo, SizeOf(LStartupInfo), 0); FillChar(LProcessInfo, SizeOf(LProcessInfo), 0); LStartupInfo.cb := SizeOf(LStartupInfo); LStartupInfo.hStdOutput := fOutputPipeWrite; LStartupInfo.hStdInput := fInputPipeRead; LStartupInfo.hStdError := fOutputPipeWrite; LStartupInfo.dwFlags := STARTF_USESTDHANDLES or STARTF_USESHOWWINDOW; LStartupInfo.wShowWindow := SW_HIDE; if CreateProcess(nil, 'cmd', @LSecurityAttr, nil, True, 0, nil, nil, LStartupInfo, LProcessInfo) then begin fProcess := LProcessInfo.hProcess; TPipeReadThread.Create(FClbProc, fOutputPipeRead); end else begin CloseHandle(fInputPipeRead); CloseHandle(fInputPipeWrite); CloseHandle(fOutputPipeRead); CloseHandle(fOutputPipeWrite); end; end else begin CloseHandle(fInputPipeRead); CloseHandle(fInputPipeWrite); end; end end; {================================================= =============================} procedure TForm1.FCloseProcess; begin if (fProcess <> 0) then begin CloseHandle(fInputPipeRead); CloseHandle(fInputPipeWrite); CloseHandle(fOutputPipeRead); CloseHandle(fOutputPipeWrite); TerminateProcess(fProcess, 0); fProcess := 0; end; end; {================================================= =============================} {================================================= =============================} procedure TForm1.FormCreate(Sender: TObject); begin fProcess := 0; FOpenProcess; end; {================================================= =============================} procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction); begin FCloseProcess; end; {================================================= =============================} {================================================= =============================} procedure TForm1.Button1Click(Sender: TObject); VAR e: INTEGER; begin e := ShellExecute (Handle, NIL, PCHAR('C:\Dokumente und Einstellungen\Administrator\Desktop\Alarm\NEF.BAT' ), PCHAR(''), NIL, SW_SHOW); IF (e<=32) THEN begin ShowMessage('Fehler: Batch-Datei konnte nicht ausgeführt werden!') end end; procedure TForm1.Button2Click(Sender: TObject); VAR e: INTEGER; begin e := ShellExecute (Handle, NIL, PCHAR('C:\Dokumente und Einstellungen\Administrator\Desktop\Alarm\NEF.BAT' ), PCHAR(''), NIL, SW_SHOW); IF (e<=32) THEN begin ShowMessage('Fehler: Batch-Datei konnte nicht ausgeführt werden!') end end; procedure TForm1.Button3Click(Sender: TObject); VAR e: INTEGER; begin e := ShellExecute (Handle, NIL, PCHAR('C:\Dokumente und Einstellungen\Administrator\Desktop\Alarm\NEF.BAT' ), PCHAR(''), NIL, SW_SHOW); IF (e<=32) THEN begin ShowMessage('Fehler: Batch-Datei konnte nicht ausgeführt werden!') end end; procedure TForm1.Button4Click(Sender: TObject); VAR e: INTEGER; begin e := ShellExecute (Handle, NIL, PCHAR('C:\Dokumente und Einstellungen\Administrator\Desktop\Alarm\NEF.BAT' ), PCHAR(''), NIL, SW_SHOW); IF (e<=32) THEN begin ShowMessage('Fehler: Batch-Datei konnte nicht ausgeführt werden!') end end; procedure TForm1.Button5Click(Sender: TObject); VAR e: INTEGER; begin e := ShellExecute (Handle, NIL, PCHAR('C:\Dokumente und Einstellungen\Administrator\Desktop\Alarm\NEF.BAT' ), PCHAR(''), NIL, SW_SHOW); IF (e<=32) THEN begin ShowMessage('Fehler: Batch-Datei konnte nicht ausgeführt werden!') end end; end. so richtig zeig mir mal ein beispiel bitte |
Re: cmd fenster
Liste der Anhänge anzeigen (Anzahl: 1)
Grrr........
(hier ein Beispiel) |
Re: cmd fenster
Hallo,
und formatier bitte endlich den Code! Ich bekomme Augenkrebs ... Heiko |
Re: cmd fenster
Zitat:
Mfg |
Re: cmd fenster
so habe ich es gemacht ! bestimmt alles falsch oder :oops:
[delphi] unit Unit1; interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type TForm1 = class(TForm) Button1: TButton; Memo1: TMemo; procedure Button1Click(Sender: TObject); procedure Memo1Change(Sender: TObject); private { Private-Deklarationen } public { Public-Deklarationen } end; var Form1: TForm1; implementation {$R *.DFM} function GetConsoleOutput(const Command: String; var Output, Errors: TStringList): Boolean; var StartupInfo: TStartupInfo; ProcessInfo: TProcessInformation; SecurityAttr: TSecurityAttributes; PipeOutputRead: THandle; PipeOutputWrite: THandle; PipeErrorsRead: THandle; PipeErrorsWrite: THandle; Succeed: Boolean; Buffer: array [0..255] of Char; NumberOfBytesRead: DWORD; Stream: TMemoryStream; begin //Initialisierung ProcessInfo FillChar(ProcessInfo, SizeOf(TProcessInformation), 0); //Initialisierung SecurityAttr FillChar(SecurityAttr, SizeOf(TSecurityAttributes), 0); SecurityAttr.nLength := SizeOf(SecurityAttr); SecurityAttr.bInheritHandle := true; SecurityAttr.lpSecurityDescriptor := nil; //Pipes erzeugen CreatePipe(PipeOutputRead, PipeOutputWrite, @SecurityAttr, 0); CreatePipe(PipeErrorsRead, PipeErrorsWrite, @SecurityAttr, 0); //Initialisierung StartupInfo FillChar(StartupInfo, SizeOf(TStartupInfo), 0); StartupInfo.cb:=SizeOf(StartupInfo); StartupInfo.hStdInput := 0; StartupInfo.hStdOutput := PipeOutputWrite; StartupInfo.hStdError := PipeErrorsWrite; StartupInfo.wShowWindow := sw_Hide; StartupInfo.dwFlags := STARTF_USESHOWWINDOW or STARTF_USESTDHANDLES; if CreateProcess(nil, PChar(command), nil, nil, true, CREATE_DEFAULT_ERROR_MODE or CREATE_NEW_CONSOLE or NORMAL_PRIORITY_CLASS, nil, nil, StartupInfo, ProcessInfo) then begin result:=true; //Write-Pipes schließen CloseHandle(PipeOutputWrite); CloseHandle(PipeErrorsWrite); //Ausgabe Read-Pipe auslesen Stream := TMemoryStream.Create; try while true do begin succeed := ReadFile(PipeOutputRead, Buffer, 255, NumberOfBytesRead, nil); if not succeed then break; Stream.Write(Buffer, NumberOfBytesRead); end; Stream.Position := 0; Output.LoadFromStream(Stream); finally Stream.Free; end; CloseHandle(PipeOutputRead); //Fehler Read-Pipe auslesen Stream := TMemoryStream.Create; try while true do begin succeed := ReadFile(PipeErrorsRead, Buffer, 255, NumberOfBytesRead, nil); if not succeed then break; Stream.Write(Buffer, NumberOfBytesRead); end; Stream.Position := 0; Errors.LoadFromStream(Stream); finally Stream.Free; end; CloseHandle(PipeErrorsRead); WaitForSingleObject(ProcessInfo.hProcess, INFINITE); CloseHandle(ProcessInfo.hProcess); end else begin result:=false; CloseHandle(PipeOutputRead); CloseHandle(PipeOutputWrite); CloseHandle(PipeErrorsRead); CloseHandle(PipeErrorsWrite); end; end; procedure TForm1.Button1Click(Sender: TObject); begin var Output, Errors : TStringList; CmdInterpreter, Command : String; function IsWindowsNT:Boolean; begin Result:=(Win32Platform=Ver_Platform_Win32_NT); end; function ConsoleStr2AnsiStr(ConsoleStr:String):String; var Buffer : pChar; begin Result:=ConsoleStr; GetMem(Buffer,length(ConsoleStr)+1); try OEMToCharBuff(pChar(ConsoleStr),Buffer,length(Cons oleStr)); SetString (Result,Buffer,length(ConsoleStr)); finally FreeMem(Buffer,length(ConsoleStr)+1); end; procedure TForm1.Memo1Change(Sender: TObject); begin Memo1.Clear; Command:='dir c:\'; // <<< hier DEINEN BatchAufruf placieren!!!!!! if IsWindowsNT then CmdInterpreter:='cmd' else CmdInterpreter:='command'; Output:=TStringList.Create; try Errors:=TStringList.Create; if GetConsoleOutput(CmdInterpreter+' /c '+Command,Output,Errors) then begin Memo1.Lines.AddStrings(Output); Memo1.Text:=ConsoleStr2AnsiStr(Memo1.Text); end finally Output.Free; Errors.Free; end; end. :wall:[pre][/pre][pre]
Code:
[/pre]
[dp][size=8][center][/size][size=24][cl][/dp]
|
Re: cmd fenster
ich bekomme gleich auch augenkrebs was mache ich falsch
|
Re: cmd fenster
Du musst den Tag mit
Delphi-Quellcode:
schließen.
öffnen und mit
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 14:07 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz