4

Hintプロパティ自体を変更せずに、実行時にコンポーネント内でヒント テキストを一時的に変更しようとしています。

をキャッチしようとしましCM_SHOWHINTたが、このイベントは形成されるだけで、コンポーネント自体は形成されないようです。

プロパティからテキストを取得するため、CustomHint の挿入も実際には機能しませんHint

私のコンポーネントはの子孫ですTCustomPanel

これが私がやろうとしていることです:

procedure TImageBtn.WndProc(var Message: TMessage);
begin
  if (Message.Msg = CM_HINTSHOW) then
    PHintInfo(Message.LParam)^.HintStr := 'CustomHint';
end;

インターネットのどこかでこのコードを見つけましたが、残念ながら機能しません。

4

2 に答える 2

11

CM_HINTSHOW本当に必要なものです。簡単な例を次に示します。

type
  TButton = class(Vcl.StdCtrls.TButton)
  protected
    procedure CMHintShow(var Message: TCMHintShow); message CM_HINTSHOW;
  end;

  TMyForm = class(TForm)
    Button1: TButton;
  end;

....

procedure TButton.CMHintShow(var Message: TCMHintShow);
begin
  inherited;
  if Message.HintInfo.HintControl=Self then
    Message.HintInfo.HintStr := 'my custom hint';
end;

問題のコードは呼び出しinheritedに失敗しているため、おそらく失敗します。または、クラス宣言overrideで on ディレクティブが省略されている可能性がありWndProcます。とにかく、この回答での方法の方がきれいです。

于 2012-10-11T11:31:31.653 に答える
6

OnShowHint イベントを使用できます

HintInfo パラメータがあります: http://docwiki.embarcadero.com/Libraries/XE3/en/Vcl.Forms.THintInfo

このパラメーターを使用すると、ヒント コントロール、ヒント テキスト、およびそのすべてのコンテキストを照会し、必要に応じてそれらをオーバーライドできます。

ヒントを変更するコンポーネントをフィルタリングする場合は、たとえば、次のような ITemporaryHint インターフェイスを宣言できます。

type 
  ITemporaryHint = interface 
  ['{1234xxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx}']
    function NeedCustomHint: Boolean;
    function HintText: string;
  end;

次に、コンポーネントがそのインターフェイスを実装しているかどうかを後で一般的に確認できます

procedure TForm1.DoShowHint(var HintStr: string; var CanShow: Boolean;
  var HintInfo: THintInfo);
var
  ih: ITemporaryHint;
begin
  if Supports(HintInfo.HintControl, {GUID for ITemporaryHint}, ih) then
    if ih.NeedCustomHint then
      HintInfo.HintStr := ih.HintText;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  Application.ShowHint := True;
  Application.OnShowHint := DoShowHint;
end;  
于 2012-10-11T11:45:03.420 に答える