Tidak ada jalan lain selain menggunakan Thread.

ProcessMessages dan Timer, keduanya berjalan di atas mainthread. Padahal
Query juga dijalankan di atas mainthread.
Jadi jelas sekali, bahwa saat query di-execute, tidak ada event yang akan
terjadi sebelum query tsb selesai.

TThread memang agak *menakutkan* pada mulanya. Tapi begitu kita sudah mulai
mencoba, ternyata tidak se-menakutkan semula...walaupun ternyata
debuggingnya memang rumit :-)

Untuk kasus ini, saya rasa, eksekusi dari Query lah yang harus ditaruh di
dalam thread.
Kira2 spt ini :

uses Activex;

TMyThread = class(TThread)
private
  SQL : string;
public
  constructor Create(SQL:string);
  procedure Execute;
end;

procedure TMyThread.Create;
begin
  inherited Create(True);
  FreeOnTerminate := true;

  Self.SQL := SQL;
  resume;
end;

procedure TMyThread.execute
begin
  // Coinitialize diperlukan oleh setiap thread selain mainthread yang akan
mengakses ke ADO
  CoInitialize(nil);
  try
    // Initialize ADOConnection dan ADOQuery,
    //kecuali bila ADOConnection dan ADOQuery diambil
    //dari Query milik Form ataupun global variable
.....
    ADOQuery.SQL.text := SQL;
    ADOQuery.ExecSQL;
  finally
    CoUninitialize;
  end;
end;

Lalu untuk menjalankan Thread tsb :

Var
  A : TMyThread;
begin
  A := TMyThread.create('Delete * from MyTable');
end;

Jangan biarkan ada code di dalam Thread yang akan mengakses ke VCL, karena
VCL tidak ThreadSafe. Bila memang ada bagian dari thread yang perlu
mengakses ke VCL, maka taruh statement yang mengakses ke VCL tsb dalam
sebuah method yang didefinisikan di TMyThread. Kemudian panggil dengan
synchronize, Contoh :

TMyThread = class(TThread)
private
  SQL : string;
  procedure TampilPesan;
public
  constructor Create(SQL:string);
  procedure Execute;
end;

procedure TMyThread.TampilPesan;
begin
   Form1.label1.caption := 'Sudah selesai';
end;

procedure TMyThread.execute
begin
  // Coinitialize diperlukan oleh setiap thread selain mainthread yang akan
mengakses ke ADO
  CoInitialize(nil);
  try
    // Initialize ADOConnection dan ADOQuery,
    //kecuali bila ADOConnection dan ADOQuery diambil
    //dari Query milik Form ataupun global variable
.....
    ADOQuery.SQL.text := SQL;
    ADOQuery.ExecSQL;
    Synchronize(TampilPesan);
  finally
    CoUninitialize;
  end;
end;

Hal2 ini sebenarnya sudah coba dirangkum di dalam FAQ di Delphindo :
http://www.delphindo.org/faq/faq_lain2.php#refresh_progressbar

Hanya saja di situ belum ada contoh, harap sabar nanti akan diupdate dengan
contoh yang disumbangkan oleh salah satu sesepuh di milis ini.

salam

Jonathan L.




William IT wrote:
> Masih ingat posting rekan kita yang menanyakan bagaimana menampilkan
> proses
> lamanya suatu Query?
>
> Saya coba akali dengan membuat form Tunggu dan menambahkan komponen
> Timer
> untuk mengambil Jam (Time) sekarang.
> Masalahnya ternyata Timer tidak mau mengupdate Tampilan Jam tsb
> meskipun
> sudah saya beri Applicacation.ProcessMessage di dalam timer itu
> sendiri,
> contoh:
>
> procedure TfrmMenu_Utama.Timer1Timer(Sender: TObject);
> begin
>   txtWaktu.Caption:= TimeToStr(Now);
>   Application.ProcessMessages;
> end;
>
> Idenya sbb:
>     frmTunggu.Show; Application.ProcessMessages;
>     AdoConn.Execute('EXEC SP_COBA');
>     frmTunggu.Hide; Application.ProcessMessages;
>
> Ternyata Timer pada frmTunggu gakk jalan. Anyone help?


------------------------ Yahoo! Groups Sponsor ---------------------~-->
Free shipping on all inkjet cartridge & refill kit orders to US & Canada. Low prices 
up to 80% off. We have your brand: HP, Epson, Lexmark & more.
http://www.c1tracking.com/l.asp?cid=5510
http://us.click.yahoo.com/GHXcIA/n.WGAA/ySSFAA/i7folB/TM
---------------------------------------------------------------------~->

Berlangganan: [EMAIL PROTECTED]
Stop Berlangganan: [EMAIL PROTECTED]
Keluhan Milis(Unbouncing,spam,dll): [EMAIL PROTECTED] 

Your use of Yahoo! Groups is subject to http://docs.yahoo.com/info/terms/ 


Kirim email ke