Delphi2007Update3には2つバグがある。
2007/12/19追記
December 2007 Updateでこれらの問題は解決された。
Controls.pasの7318行目がDelphi7と違うのが原因か?
//Delphi2007Update3--
Result := Parent.Perform(Msg, WParam, LParam);
Exit;
//Delphi7--
Result := Parent.Perform(Msg, WParam, LParam);
if Result <> 0 then
Exit;
Delphi7と同じに書き換えると標準のコンテキストメニューが表示される。
WindowsVistaでのみ起こる。再現方法は以下の通り。
回避策は2つ。カンタンなのはImagesプロパティを使わないこと。もう一つは、VCLソースを書き換えること。ソースの書き換え方は以下の通り。
//-----Menus.pas 1150行目
DrawThemeTextEx(ThemeServices.Theme[teMenu], ACanvas.Handle,
MENU_POPUPITEM, MenuStates[MenuItem.Enabled],
PWideChar(WideString(Text)), Length(Text), Flags, @Rect, Options);
//DrawThemeTextExは同名のWindowsAPIのラッパーである。
//したがって、第6パラメータは文字数を渡さなければならないが、
//実際にはバイト数を渡している。
//対策は、文字数を渡すように変更する。
//Length(Text) ---> Length(WideString(Text))
DrawThemeTextEx(ThemeServices.Theme[teMenu], ACanvas.Handle, MENU_POPUPITEM,
MenuStates[MenuItem.Enabled],
PWideChar(WideString(Text)), Length(WideString(Text)),
Flags, @Rect, Options);
VCLソースでは他にも同じ関数を呼び出している箇所があり、 できれば同じように変更しておくほうが安全。
//----StdCtrls.pas 1511行目
DrawThemeTextEx(ThemeServices.Theme[teEdit], DC, Part, State,
PWideChar(WideString(Text)), TextLen, TextFlags,
@TextRect, Options);
//TextLenはTextのバイト数なので、TextLenを渡してはいけない。
//変更後:
DrawThemeTextEx(ThemeServices.Theme[teEdit], DC, Part, State,
PWideChar(WideString(Text)), Length(WideString(Text)), TextFlags,
@TextRect, Options);
//-----Buttons.pas 778行目
DrawThemeTextEx(ThemeServices.Theme[teButton], DC, Part, State,
PWideChar(WideString(Text)), TextLen, TextFlags, @TextRect, Options);
//TextLenはTextのバイト数なので、TextLenを渡してはいけない。
//変更後:
DrawThemeTextEx(ThemeServices.Theme[teButton], DC, Part, State,
PWideChar(WideString(Text)), Length(WideString(Text)), TextFlags,
@TextRect, Options);
これらのバグは既にQCに登録済み。
TMemo、TEditで標準のコンテキストメニューが出ない
http://qc.borland.com/wc/qcmain.aspx?d=42752
http://qc.borland.com/wc/qcmain.aspx?d=52099
メニューのCaptionに日本語を使うと文字化けする
http://qc.codegear.com/wc/qcmain.aspx?d=52328