tbsDropDownなTToolButtonのTMenuItem.Countがゼロを返す


Terry  URL  2016-12-22 09:59:41  No: 48453

いつもお世話になっています、Terry(まも)です
VCL な上に Delphi2009 or Delphi5 でしか確認できていないので恐縮なのですが

TToolButton の Style プロパティを tbsDropDown に設定して
そのターゲットである MenuItem プロパティ先の TMenuItem.Count を取得すると
ゼロを返してきて困っています

以下は再現する最小限構成です
TPopupMenu に3つのサブアイテムを持つメニュー(Item1)を1つ作成
tbsDropDown なボタンを一つ作った TToolBar(MenuItem は Item1 を設定)

  TForm1 = class(TForm)
    PopupMenu1: TPopupMenu;
    Item1: TMenuItem;
    ToolBar1: TToolBar;
    ToolButton1: TToolButton;
    a1: TMenuItem;
    b1: TMenuItem;
    c1: TMenuItem;
    procedure a1Click(Sender: TObject);
    procedure FormClick(Sender: TObject);
☆——————————————————————————————☆
//メニューから呼ぶと
procedure TForm1.a1Click(Sender: TObject);
begin
  ShowMessage(IntToStr(Item1.Count));//ゼロになる(※)
  ShowMessage(Item1.Items[0].Caption);//問題なし
  ShowMessage(IntToStr(TMenuItem(Item1.Items[0]).Parent.Count));//正常(3)
end;

他のイベントから呼ぶと何故か正常値が返ってくる
procedure TForm1.FormClick(Sender: TObject);
begin
  ShowMessage(IntToStr(Item1.Count));//正常(3)
  ShowMessage(Item1.Items[0].Caption);
  ShowMessage(IntToStr(TMenuItem(Item1.Items[0]).Parent.Count));//正常(3)
end;

※ で正常値が返ってこないためとあるコンポーネント(THistoryIni)が正常に動かなくて困っています
ダミーメニューとか使って試行錯誤してみたのですが上手くいきませんでした
VCLのどこか修正してどうにかなるものでしょうか?
(そもそもこれが異常なのかどうかもわからないんですが……)

以上、よろしくお願いいたしますm(_ _)m


  2016-12-22 16:23:53  No: 48454

回避策ですが、履歴を表示するメニュー項目は10個なら10個持ってて、表示、非表示で制御すればどうでしょう。
メニュー数は常に10、あとは、履歴を表示したいだけキャプションを変更するなり表示するなり。


tor  2016-12-22 18:25:48  No: 48455

いささか奇妙ですが、テを見る前に他の適当なプロパティ(ホとか)にアクセスしておくと、それより後はテも正しい値を返すようです。

どうやら、ヤヤツはメニューを表示する際に
一時的なヤミを作ってそちらにメニュー項目を移し替え、
ドロップダウンが閉じられたら元のメニューに戻すということをやっているようです。
なので、ポップアップメニューの項目がクリックされた時点でメニューの項目を見に行くと
一時的に項目が出張してよそに行った状態になっているためーになるのかと。
他のプロパティにアクセスすると復活する理屈はよくわかりませんが。
スススススススススススススススススススススススススススススススススススススススス
ニコ 
トコ イーアカッアイッイイィ木ゥ ーケコウキコウク  書込者ノト:ロ 」 ァ」ハノJ

 ン

訂正、よくよく考え直したら、ホとかにアクセスするのは関係なくて
テを見る前に他のメッセージボックスを表示したのが理由でした。
メッセージボックスを出すことで、ドロップダウンを閉じた際のメッセージが処理されるので、
その後はテが正常に戻ります。

そうするとこれに対する回避策としては……
・試してはいませんが、モから親を辿っていったら正しいテを持っている項目が得られるかも?
・メニュー項目のテ以外の場所で処理を行う(適当なメッセージをミしておいて、それを受け取ったところで処理する)
とかですかね。
スススススススススススススススススススススススススススススススススススススススス
ニコ 
トコ イーアカッアイッイイィ木ゥ アアコイウコエカ  書込者ノト:ロ 」 ァ」ハノJ

 ン

そんなわけで検証ィトキゥ

ヲサヤニアョアティモコヲサヤマゥサ

ヲサヲサモヘィノヤモィィモヲサヲサヤヘノゥョミョテゥゥサヲサッッ正常(ウ)

求めたい項目がクリックされた項目の直接の親とは限らないとか、一般化しようとしたらもう少し工夫が必要だと思いますが。
スススススススススススススススススススススススススススススススススススススススス
ニコ ヤ
トコ イーアカッアイッイイィ木ゥ アケコオクコイー  書込者ノト:ロ 「。」。 ン

あヲサさん、ヲサさんありがとうございます
やはりヤヤツが変な事をしていたせいだったのですね
原因と対策をいただいたので先へ進めそうですィ゜ヲサ゜ゥ


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

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






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