XPManifestの不具合の解消方法について

解決


たか  2009-08-01 01:42:15  No: 35311

インターフェースをXP風にする為のXPManifestを使った場合、様々な不具合がでると思いますが自分が今困っているのはEdit系に入力済の日本語を再変換する場合の不具合とDateTimePickerのChekedの不認識(Vistaでアプリを起動した場合)です。
これらの不具合の解消方法についてご教授いただけませんか。


monaa  2009-08-01 22:39:53  No: 35312

バージョン!バージョン!


たか  2009-08-01 22:53:26  No: 35313

すいません。使用環境は
  Torbo Delphi 2006(XP SP3)
  Torbo Delphi 2006(Vista)
です。
  宜しくお願いします。


たか  2009-08-03 20:34:31  No: 35314

たかです。
もう少し詳しく状況を説明します。
作業環境は
  Torbo Delphi 2006 (XP Home Edition Ver2002 SP3)
をメインとして作業しています。Vistaにも同じDelphiを入れていますが確認用で通常は使用しません。

不具合1、2ともFormにTXPManifestを配置しています。

《不具合1》
  Edit系コンポーネント(TEdit,TComboBox(StyleをcsDropDown)など)をFormに置いています。
コンパイルして実行ファイルを作ります。
それをそのままXPの環境で実行します。例えばEdit1に日本語で文言を入力し、確定します。
更にもう一度入力している日本語の文言を選択してハイライト状態にします。
そこでキーボードの〔変換〕を押すと通常であれば2次候補などが表示されますが、
TXPManifestを配置しているとこの再変換がおかしな変換になってしまいます。部分変換も同じです。

《不具合2》
  同じくDelphiをXPで作業している状態でTDateTimePicker1をフォームに配置します。
勿論、TXPManifestも置いています。
TDateTimePicker1のプロパティでShowChekboxをtrueとしてCheckboxを表示させます。
そして動作確認の為、すぐ横にButton1を配置して簡単なコードを書きます。

procedure TForm1.Button1Click(Sender: TObject);
begin
  if DateTimePicker1.Checked then
    Showmessage('true')
  else
    ShowMessage('false');  
end;

これでコンパイルして実行ファイルを作ります。
これをXPで動作確認すると全く問題なく正常に'true'、 'false'を返します。
しかし、同じ実行ファイルをVistaにコピーしてVistaで実行します。
すると、XPでは正常に動作していたTdateTimePicker.Chekedが認識出来ず、
常に'true'を返してきます。

以上が自分が今困っているTXPManifestの不具合です。
このTXPManifestは使わない方がいいんでしょうか。


monaa  2009-08-03 22:13:23  No: 35315

不具合1についてですが、
D2009 on vistaで正常動作確認しました。
想像ですが、以前のバージョンのWinControlは
UNICODEベースではありません、xpスタイルを適用すると、
文字列長がUNICODEベースに変わるので、VCLがその現象を吸収しきれてないのでしょう、お金に物言わせていいのであれば最新版をお使いください。
その際は一度トライアル版で動作確認お願いします。
それかUNICODEコントロールTNTを使ってもいけるかもです。
不具合2については
使ったことないので、わかりません。
調べる時間はいまとれません。


ぽむぽむ  2009-08-04 02:19:41  No: 35316

チェックを外したときに届くメッセージの仕様が変わったっぽいね。
下記コードの PNMDateTimeChange(aMessage.NMHdr)^.ST が、
XPまでは0だったのが、Vistaから0以外が入ってきています。

単なるオン/オフであれば、以下で動くけど、TDateTimePickerを
使い込んだことないから、どうなるかわからないです。

type
  TDateTimePicker=class(ComCtrls.TDateTimePicker)
  private
    procedure CNNotify(var aMessage: TWMNotify); message CN_NOTIFY;
  end;

type
  TForm1 = class(TForm)

(略)

uses
  Commctrl;

procedure TDateTimePicker.CNNotify(var aMessage: TWMNotify);
begin
  if aMessage.NMHdr^.code = DTN_DATETIMECHANGE then begin
    if PNMDateTimeChange(aMessage.NMHdr)^.dwFlags = GDT_NONE then begin
      Checked := False;
    end;
  end;
  inherited;
end;


たか  2009-08-04 05:33:26  No: 35317

monaaさん、ありがとうございます。
  自分でも'Unicode'の事を少し調べてみました。グローバル化に向けて様々な問題があるようですね。
  そんな Unicode の変化まではこのXPManifestは関知しない、という事なんでしょうか。
  いずれにしても自分の今の環境(Torbo Delphi 2006)ではこの問題は解決する事は出来ないと思いました。
  Windows 7 が発売されそうな昨今、旧来のクラシックスタイルのインターフェースも考えものですが、Windows自体変化し過ぎで大変です。


たか  2009-08-04 06:03:18  No: 35318

ぽむぽむさん、貴重な時間を割いて頂き、ありがとうございます。
ぽむぽむさんのスキルは高度で私には全部を理解出来ませんが、やはりVistaではその戻り値に変化があるんですね。やはりこのXPManifestは所謂、格好だけで各コンポーネントが受ける影響までは考慮されていないんですね。
  そもそも自分が今使っている Torbo Delphi 2006 自体がクラシックスタイルなんです。
  Newインターフェースで作るのであれば 2009 を使うべきなんですね。

色々ありがとうございました。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加