17 Juni 2009

Hal yang Aneh pada CreateParams dan WS_EX_APP_WINDOWS (Lanjutan)

Beberapa langkah ditempuh untuk menyelesaikan masalah seperti yang dijelaskan pada posting sebelumnya. Seletah beberapa lama mencari penyelesaian atas masalah ini akhirnya dapat terselesaikan juga.
Langkah pertama adalah menambahkan kode pada method CreateParams pada form utama seperti pada form lain (sebelumnya form utama tidak melakukan override method CreateParams).
procedure TForm1.CreateParams(var Params: TCreateParams);
begin
  inherited CreateParams(Params);
  Params.ExStyle := Params.ExStyle or WS_EX_APPWINDOW;
  Params.WndParent := GetDesktopWindow;
end;

Dengan cara diatas memberikan efek yang tidak diinginkan. Saat aplikasi dijalankan pertama kali terdapat dua button pada taskbar, padahal hanya ada form utama yang ditampilkan. Pada kenyataannya memang Delphi membuat satu form lagi yang di sembunyikan tiap kita menjalankan aplikasi yang dibuat menggunakan Delphi, yang secara default tidak menampilkan button pada taskbar. Tapi dengan kode diatas berpengaruh pada behaviour program. Tidak itu saja, masalah timbul lagi karena form utama tidak bisa di minimize. Berarti kita harus menyelesaikan dua masalah, menghilangkan button yang tidak diinginkan pada taskbar dan membuat form utama bisa di minimize.
Masalah pertama bisa diselesaikan dengan kode dibawah ini.
ShowWindow(Application.Handle, SW_HIDE);

Dengan kode diatas saat aplikasi pertama kali dijalankan hanya ada satu button pada taskbar, yang merupakan button untuk form utama.
Untuk menyelesaikan masalah kedua kita memerlukan satu trik khusus yang melibatkan windows message, WM_SYSCOMMAND. Windows message ini dihasilkan saat kita melakukan minimize, maximize atau menutup form. Untuk itu pertama kita harus menambahkan deklarasi procedure yang menangkap windows message yang dimaksud.
procedure WMSysCommand(var aMsg: TWMSysCommand); message WM_SYSCOMMAND;

Procedure diatas bisa di deklarasikan sebagai private atau public method. Nama procedure dan nama parameter tidak harus seperti diatas, bebas tapi memiliki signature seperti diatas. Kemudian pada bagian implementasi, tambahkan kode berikut.
if (aMsg.CmdType and $FFF0 = SC_MINIMIZE) then
  Self.WindowState := wsMinimized
else
  inherited;

Setelah semua hal diatas dilakukan, selesai sudah, bisa dicoba dan sepertinya sesuai seperti yang diharapkan, setidaknya bagiku.

Tidak ada komentar:

Posting Komentar