Unit1.pas
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
uses
Unit2;
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
begin
// logRun(); //
form2.ShowModal;
end;
end.
Unit2.pas
unit Unit2;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ComCtrls;
type
TForm2 = class(TForm)
Memo1: TMemo;
btn: TButton;
ListBox1: TListBox;
Button1: TButton;
Button2: TButton;
Button3: TButton;
Label1: TLabel;
ProgressBar1: TProgressBar;
Button4: TButton;
SaveDialog1: TSaveDialog;
procedure btnClick(Sender: TObject);
procedure Button1Click(Sender: TObject);
procedure Button3Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure Button4Click(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
private
{ Private declarations }
public
{ Public declarations }
end;
procedure ConsoleOutput(DosApp : string; AMemo : TMemo);
procedure ExecuteFileRead(fileName: string; AList: TListbox );
procedure ExcuteRun(AListbox: TListbox; AMemo: TMemo; AProgBar: TProgressBar; ALable: TLabel);
procedure StepLogFile(s:string);
var
Form2: TForm2;
implementation
{$R *.dfm}
procedure TForm2.btnClick(Sender: TObject);
begin
btn.Enabled := false;
ExecuteFileRead('E:\test\run.bat', Listbox1); // (파일이름, 리스트박스)
//ConsoleOutput('e:\test\zzz.exe', Memo1);
btn.Enabled := true;
end;
procedure TForm2.Button1Click(Sender: TObject);
begin
Listbox1.SelectAll;
end;
procedure TForm2.Button3Click(Sender: TObject);
begin
Listbox1.ClearSelection;
end;
procedure TForm2.Button2Click(Sender: TObject);
begin
Button1.Enabled := false;
Button2.Enabled := false;
Button3.Enabled := false;
ListBox1.Enabled := false;
btn.Enabled := false;
ExcuteRun(Listbox1, Memo1, ProgressBar1, Label1); //(리스트박스, 메모, 상태바, 라벨)
Button1.Enabled := true;
Button2.Enabled := true;
Button3.Enabled := true;
ListBox1.Enabled := true;
btn.Enabled := true;
end;
procedure StepLogFile(s:string);
var
F:TextFile;
fileName:string;
begin
fileName := 'Steplog_' + FormatDateTime('yyyymmdd_hhmmss',Now)+'.log';
AssignFile(F, fileName);
ReWrite(F);
Writeln(F, s);
Writeln(F, '!end ' + FormatDateTime('yyyy/mm/dd hh:mm:ss',Now) + ' ---------------------------');
CloseFile(F);
end;
procedure ExcuteRun(AListbox: TListbox; AMemo: TMemo; AProgBar: TProgressBar; ALable: TLabel);
var
I : integer;
a:TDateTime;
begin
AMemo.Clear;
AMemo.HideSelection := false;
AProgBar.Repaint;
AProgBar.Min := 0;
AProgBar.Max := AListbox.SelCount;
AProgBar.Position := 0;
ALable.Caption := '0/' + IntToStr(AListbox.SelCount);
a:=Now;
AMemo.Lines.Add('!begin ' + FormatDateTime('yyyy/mm/dd hh:mm:ss',Now) + ' -------------------------');
AMemo.Lines.Add('');
for I := 0 to AListbox.Count-1 do
begin
if AListbox.Selected[I] then
begin
AMemo.Lines.Add(IntToStr(I) + ': ' + AListbox.Items.Strings[I]);
ConsoleOutput( AListbox.Items.Strings[I] , AMemo);
if AProgBar.Position < Alistbox.SelCount then
begin
ALable.Caption := IntToStr(AProgBar.Position+1) + '/' + IntToStr(AListbox.SelCount);
AProgBar.Position := AProgBar.Position+1;
end
else
begin
ALable.Caption := IntToStr(AListbox.SelCount) + '/' + IntToStr(AListbox.SelCount);
AProgBar.Position := AListbox.SelCount;
end;
end;
end;
AMemo.Lines.Add('!end ' + FormatDateTime('yyyy/mm/dd hh:mm:ss',Now) +
' (' + FormatDateTime('hh:mm:ss',a-Now) + 'sec)'
+ ' -------------');
end;
procedure ExecuteFileRead(fileName: string; AList: TListbox );
var
F:TextFile;
s:string;
begin
try
AssignFile(F, fileName); // 텍스트파일처리.
Reset(F); // 읽기 모드
while not Eoln(F) do
begin
Readln(F, s); // 파일 내용 읽기.
AList.Items.Add(s); // 리스트박스에 추가.
end;
CloseFile(F);
except
on E:EInOutError do
ShowMessage('파일을 열수 없습니다.');
end;
end;
procedure ConsoleOutput(DosApp : string; AMemo : TMemo);
const
ReadBuffer = 1048576; // 1 MB Buffer
var
Security : TSecurityAttributes;
ReadPipe,WritePipe : THandle;
start : TStartUpInfo;
ProcessInfo : TProcessInformation;
Buffer : PAnsiChar;
TotalBytesRead,
BytesRead : DWORD;
Apprunning,n,
BytesLeftThisMessage,
TotalBytesAvail : integer;
begin
AMemo.HideSelection := false;
with Security do
begin
nlength := SizeOf(TSecurityAttributes);
binherithandle := true;
lpsecuritydescriptor := nil;
end;
if CreatePipe (ReadPipe, WritePipe, @Security, 0) then
begin
// Redirect In- and Output through STARTUPINFO structure
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;
// Create a Console Child Process with redirected input and output
if CreateProcess(nil ,PAnsiChar(DosApp),
@Security,@Security,
true ,CREATE_NO_WINDOW or NORMAL_PRIORITY_CLASS,
nil ,nil,
start ,ProcessInfo) then
begin
n:=0;
TotalBytesRead:=0;
repeat
// Increase counter to prevent an endless loop if the process is dead
Inc(n,1);
// wait for end of child process
Apprunning := WaitForSingleObject(ProcessInfo.hProcess,100);
Application.ProcessMessages;
if not PeekNamedPipe(ReadPipe ,@Buffer[TotalBytesRead],
ReadBuffer ,@BytesRead,
@TotalBytesAvail,@BytesLeftThisMessage) then break
else if BytesRead > 0 then
ReadFile(ReadPipe,Buffer[TotalBytesRead],BytesRead,BytesRead,nil);
TotalBytesRead:=TotalBytesRead+BytesRead;
//Buffer[TotalBytesRead]:= #0;
//OemToChar(Buffer,Buffer);
//AMemo.Text := AMemo.Text+ StrPas(Buffer);
//AMemo.Lines.Add(Buffer);
//AMemo.Text := AMemo.Text + StrPas(Buffer);
until (Apprunning <> WAIT_TIMEOUT) or (n > 150);
Buffer[TotalBytesRead]:= #0;
OemToChar(Buffer,Buffer);
AMemo.Lines.Add(Buffer); // 메모에 추가
StepLogFile(Buffer);
end;
FreeMem(Buffer);
CloseHandle(ProcessInfo.hProcess);
CloseHandle(ProcessInfo.hThread);
CloseHandle(ReadPipe);
CloseHandle(WritePipe);
end;
end;
procedure TForm2.Button4Click(Sender: TObject);
var
FileName:string;
begin
FileName := 'log_' + FormatDateTime('yyyymmdd_hhmm',Now)+'.log';
SaveDialog1.Title := 'Save log File...';
saveDialog1.Filter := '*.log';
saveDialog1.DefaultExt := 'log';
saveDialog1.FilterIndex := 1;
saveDialog1.InitialDir := 'C:\';
saveDialog1.FileName := FileName;
if SaveDialog1.Execute then
begin
Memo1.Lines.SaveToFile(SaveDialog1.FileName);
ShowMessage('저장');
end;
end;
procedure TForm2.FormClose(Sender: TObject; var Action: TCloseAction);
begin
Form2.ModalResult := mrOk;
end;
end.