09 January 2016

Capture Console Pada Memo Dengan Function Pada Delphi

Setelah kemarin saya coba memposting tentang cara capture console dengan menggunakan procedure sekarang saya akan coba memposting tentang cara capture console dengan function.Tujuannya sama yaitu supaya hasil pada console ditampilkan pada komponen memo yang ada di delphi.
Baiklah tidak perlu lagi saya jelaskan kegunaanya tetapi kalau bila perlu apa kegunaanya yang lebih detail bisa dicari referensi nya melalui mesin pencari GOOGLE.Sekarang saya akan langsung ke cara pembuatannya.

Langkah Pembuatan

Pertama biasa kita buka aplikasi delphinya setelah itu pada Form yang baru saya coba tambahkan komponen:
  1. Memo.
  2. Edit.
  3. Button.

Saya buat tampilannya seperti gambar di bawah ini.
Tata letak komponen pada delphi
Tata Letak Komponen Pada Form

Setelah saya posisikan komponen dan sedikit pengaturan pada object inspector saya setting lanjut ke bagian halaman kode edit dimana saya akan coba memasukan sebuah function nya agar supaya komponen memo bisa menampilkan apa yang ditampilkan pada console windows  yang saya perintahkan.
berikut ini adalah kode functionnya
function GetDosOutput(CommandLine: string; Work: string = 'C:\'): string;
var
  SA: TSecurityAttributes;
  SI: TStartupInfo;
  PI: TProcessInformation;
  StdOutPipeRead, StdOutPipeWrite: THandle;
  WasOK: Boolean;
  Buffer: array[0..255] of AnsiChar;
  BytesRead: Cardinal;
  WorkDir: string;
  Handle: Boolean;
begin
  Result := '';
  with SA do begin
    nLength := SizeOf(SA);
    bInheritHandle := True;
    lpSecurityDescriptor := nil;
  end;
  CreatePipe(StdOutPipeRead, StdOutPipeWrite, @SA, 0);
  try
    with SI do
    begin
      FillChar(SI, SizeOf(SI), 0);
      cb := SizeOf(SI);
      dwFlags := STARTF_USESHOWWINDOW or STARTF_USESTDHANDLES;
      wShowWindow := SW_HIDE;
      hStdInput := GetStdHandle(STD_INPUT_HANDLE);
      hStdOutput := StdOutPipeWrite;
      hStdError := StdOutPipeWrite;
    end;
    WorkDir := Work;
    Handle := CreateProcess(nil, PChar('cmd.exe /C ' + CommandLine),
                            nil, nil, True, 0, nil,
                            PChar(WorkDir), SI, PI);
    CloseHandle(StdOutPipeWrite);
    if Handle then
      try
        repeat
          WasOK := ReadFile(StdOutPipeRead, Buffer, 255, BytesRead, nil);
          if BytesRead > 0 then
          begin
            Buffer[BytesRead] := #0;
            Result := Result + Buffer;
          end;
        until not WasOK or (BytesRead = 0);
        WaitForSingleObject(PI.hProcess, INFINITE);
      finally
        CloseHandle(PI.hThread);
        CloseHandle(PI.hProcess);
      end;
  finally
    CloseHandle(StdOutPipeRead);
  end;
end;

Dan kode tersebut saya coba tempatkan di bawah implementation
Penempatan function pada kode editor delphi
Penempatan Function

Setelah itu kita kembali ke Form dan coba klik 2X pada Button untuk membuat suatu eventnya dan berikut ini adalah event atau procedure untuk button tersebut
procedure TForm1.Button1Click(Sender: TObject);
begin
  Memo1.Text := GetDosOutput(Edit1.Text);
end;

Dimana tujuannya adalah pada saat kita klik button tersebut dan tentunya pada edit komponen telah saya tulis suatu perintah maka akan ditampilkan pada memo.

Test Run

Setelah saya tulis procedure untuk button coba saya run atau tekan tombol F9 pada keybourd,kemudian pada edit komponen saya coba masukan perintah route print dan kemudian tekan tombol Button dan munculah pada memo sesuai dengan perintah di edit komponen tadi.
Test run dengan function pada delphi
Test Run

Demikianlah cara capture console dengan menggunakan function,semoga postingan ini bisa bermanfa'at dan bisa teman-teman kembangkan lagi begitu juga capture console dengan menggunakan procedure.

Salam Blogger and Happy Coding.

No comments:

Post a Comment