16 Juni 2009

Hal yang Aneh pada CreateParams dan WS_EX_APP_WINDOWS

Seperti yang dijelaskan sebelumnya konstanta WS_EX_APPWINDOW yang diset pada method CreateParams pada form akan membuat form tersebut pada suatu aplikasi mempunyai button tersendiri pada taskbar. Hal ini berjalan lancar pada Delphi 7, tapi tidak pada Delphi 2007!
Karena alasan tertentu aku mengembangkan aplikasi pada dua versi Delphi yang berbeda tersebut. Dengan menggunakan Delphi 7 semuanya sesuai dengan rencana, tapi ketika mencoba pada Delphi 2007 tidaklah seperti yang diharapkan. Sebagai informasi pada tiap form yang ada dibuat button tersendiri pada taskbar, jadi pada tiap form akan melakukan override pada method CreateParams yang akan mengaktifkan flag WS_EX_APPWINDOW.
Masalah pertama adalah semua form selain form utama yang selalu berada diatas form utama meski fokus berada pada form utama. Masalahnya ada pada program utama (.dpr) pada kode berikut:
Application.MainFormOnTaskbar := True;

Dengan menghapus bagian kode tersebut, masalah diatas bisa diatasi. Kurang jelas kegunaan kode tersebut, tapi ada sumber yang menyatakan kode tersebut digunakan untuk fitur baru pada Windows Vista yang berhubungan dengan User Interface. Yang jelas hal itu tidak dibahas disini.
Langkah tersebut adalah langkah awal, selanjutnya masih ada beberapa masalah yang lebih menantang lagi. Masalah berikutnya jika ada form lain dan kita klik pada button form utama pada taskbar, fokus tidak juga berganti pada form utama. Solusi masalah ini ada pada parameter WndParent sebagai bagian dari parameter dengan tipe TCreateParams pada method CreateParams.
type
  TCreateParams = record
    Caption: PChar;
    Style: DWORD;
    ExStyle: DWORD;
    X, Y: Integer;
    Width, Height: Integer;
    WndParent: HWnd;
    Param: Pointer;
    WindowClass: TWndClass;
    WinClassName: array[0..63] of Char;
  end;

Pada method CreateParams kita perlu menambahkan kode yang mengisi nilai dari parameter WndParent, pada tiap form selain form utama, seperti yang ditunjukkan kode berikut yang dicetak tebal.
procedure TForm1.CreateParams(var Params: TCreateParams);
begin
  inherited CreateParams(Params);
  Params.ExStyle := Params.ExStyle or WS_EX_APPWINDOW;
  Params.WndParent := GetDesktopWindow;
end;

Dengan kode yang dicetak tebal, berarti form yang bersangkutan mengarahkan parent ke Desktop dibanding sebelumnya ke form utama. Dengan cara ini sepertinya masalah terselesaikan. Tapi setelah beberapa lama timbul masalah lagi yang cukup mengganggu. Tiap kali form selain form utama menjalankan fungsi yang menampilkan window/form modal, seperti ShowMessage() atau MessageDlg(), form utama akan berpindah menjadi form paling atas. Jadi sepertinya fungsi tersebut dipanggil dari form utama.
Bersambung…

Tidak ada komentar:

Posting Komentar