Delphi2007Update3のバグ

Delphi2007Update3には2つバグがある。

2007/12/19追記

December 2007 Updateでこれらの問題は解決された。

TMemo、TEditで標準のコンテキストメニューが出ない

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と同じに書き換えると標準のコンテキストメニューが表示される。

メニューのCaptionに日本語を使うと文字化けする

WindowsVistaでのみ起こる。再現方法は以下の通り。

  1. 新規プロジェクトを作成
  2. FormにTMainMenuとTImageListを貼り付け
  3. TImageListに適当なImageを設定
  4. TMainMenuのImagesプロパティにTImageListを設定
  5. TMainMenuで適当なメニューを作成
  6. MenuItemのCaptionに日本語を入力し、ImageIndexを設定。

回避策は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

Tips

ブログ

リンク