Delphi-PRAXiS
Seite 2 von 5     12 34     Letzte »    

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   cmd fenster (https://www.delphipraxis.net/110450-cmd-fenster.html)

technik05 18. Mär 2008 09:52

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

Die Muhkuh 18. Mär 2008 09:55

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.

technik05 18. Mär 2008 10:00

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 :!:

SirThornberry 18. Mär 2008 10:12

Re: cmd fenster
 
hier ist ein beispiel wie das geht:
http://www.delphipraxis.net/viewtopi...=598121#598121

technik05 18. Mär 2008 10:26

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.

DeddyH 18. Mär 2008 10:32

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.

technik05 18. Mär 2008 10:38

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

technik05 18. Mär 2008 10:40

Re: cmd fenster
 
der fehler:

Fehler] Unit1.pas(222): Undefinierter Bezeichner: 'ShellExecute

habe ich gerade selber behoben

Fussball-Robby 18. Mär 2008 10:41

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

technik05 18. Mär 2008 10:45

Re: cmd fenster
 
es geht danke :)


Alle Zeitangaben in WEZ +1. Es ist jetzt 20:30 Uhr.
Seite 2 von 5     12 34     Letzte »    

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