반응형

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. 



반응형

'delphi' 카테고리의 다른 글

Delphi GetMem() //malloc  (0) 2011.03.14
delpih mutex - delphi 중복실행 방지  (0) 2011.03.10
Delphi - SysUnits  (0) 2010.12.14

+ Recent posts