06 January 2016

Cara Capture Console ke Memo secara Realtime

Sekarang akan saya coba membuat postingan masih dalam tutorial delphi bagaimana supaya agar kita bisa mengcapture dari console windows tampil dalam memo.Sebenarnya ada beberapa cara untuk mengcapture console ke memo bisa dengan menggunakan komponen yang dinamakan DosCommand,bisa dengan membuat suatu procedure dan juga bisa dengan cara membuat function.Pada kali ini saya akan mencoba membuatnya dengan suatu procedure,dan mungkin nanti saya akan coba juga dengan menggunakan function dan komponen doscommand.Tentunya cara dari ketiga macam tersebut diatas mempunyai kelebihan dan kekurangan masing-masing.

Langkah Untuk Capture Console Ke Memo

Baiklah saya akan langsung mencobanya,yang pertama kita buka aplikasi delphinya dan saya coba tambahkan komponen pada Form tersebut:
1.Memo.
2.Editbox.
3.Button.
saya buat posisi nya dalam Form dari masing-masing komponen seperti gambar di bawah ini.

Penambahan komponen pada form
Posisi komponen pada Form baru

Kemudian setelah kita letakan posisi komponen pada Form kita ganti untuk caption Button dengan RUN dan setelah itu langsung menuju pada kode editornya kita buat procedurenya untuk capture console terlebih dahulu, dimana procedure nya adalah sebagai berikut:

procedure CaptureConsoleOutput(const ACommand, AParameters: String; AMemo: TMemo);
 const
   CReadBuffer = 2400;
 var
   saSecurity: TSecurityAttributes;
   hRead: THandle;
   hWrite: THandle;
   suiStartup: TStartupInfo;
   piProcess: TProcessInformation;
   pBuffer: array[0..CReadBuffer] of Char;
   dRead: DWord;
   dRunning: DWord;
 begin
   saSecurity.nLength := SizeOf(TSecurityAttributes);
   saSecurity.bInheritHandle := True;
   saSecurity.lpSecurityDescriptor := nil;
   if CreatePipe(hRead, hWrite, @saSecurity, 0) then
   begin
     FillChar(suiStartup, SizeOf(TStartupInfo), #0);
     suiStartup.cb := SizeOf(TStartupInfo);
     suiStartup.hStdInput := hRead;
     suiStartup.hStdOutput := hWrite;
     suiStartup.hStdError := hWrite;
     suiStartup.dwFlags := STARTF_USESTDHANDLES or STARTF_USESHOWWINDOW;  
     suiStartup.wShowWindow := SW_HIDE;
     if CreateProcess(nil, PChar(ACommand + ' ' + AParameters), @saSecurity,
       @saSecurity, True, NORMAL_PRIORITY_CLASS, nil, nil, suiStartup, piProcess)
       then
     begin
       repeat
         dRunning  := WaitForSingleObject(piProcess.hProcess, 100);      
         Application.ProcessMessages();
         repeat
           dRead := 0;
           ReadFile(hRead, pBuffer[0], CReadBuffer, dRead, nil);        
           pBuffer[dRead] := #0;

           OemToAnsi(pBuffer, pBuffer);
           AMemo.Lines.Add(String(pBuffer));
         until (dRead < CReadBuffer);
       until (dRunning <> WAIT_TIMEOUT);
       CloseHandle(piProcess.hProcess);
       CloseHandle(piProcess.hThread);
     end;
     CloseHandle(hRead);
     CloseHandle(hWrite);
   end;
end;

Letakan procedure tersebut dibawah implementation

penempatan procedure capture console pada delphi
Penempatan Procedure pada delphi
Setelah kita buat procedure tersebut diatas kemudian pada Form klik button 2 kali untuk membuat procedure Button,yang mana procedure ini akan mengeksekusi perintah yang ada pada editbox dan hasilnya akan ditampilkan pada Memo,dan untuk procedure nya seperti ini

procedure TForm1.Button1Click(Sender: TObject);
begin
  Memo1.Clear;
  CaptureConsoleOutput(Edit1.Text, Edit2.Text, Form1.Memo1);
end; 

Setelah kita buat procedure nya kita coba run atau tekan F9 dan coba kita test dengan perintah route PRINT

test run capture console dengan delphi
Test Run Capture Console
Demikianlah cara capture console dengan menggunakan procedure, silahkan kembangkan lagi semoga bermanfa'at.Lain waktu saya akan coba dengan  menggunakan  function untuk capture consolenya.

Happy Coding.

No comments:

Post a Comment