状況依存ヘルプを表示するには?(再)

解決


 2003-07-27 21:13:18  No: 4247  IP: [192.*.*.*]

?ボタンをクリックしたときの呼び出しは

Application.HelpFile := ExtractFilePath(ParamStr(0))+'MYFILE・・.HLP';
    Application.HelpJump('トビックのID');

でよいと思っていましたがこれでは表示はされてもポップアップではないので
コントロールにフォーカスを移しても消えてくれません。よろしくご教示お願いします。

編集    削除
にしの  2003-07-29 17:52:39  No: 4248  IP: [192.*.*.*]

ポップアップヒント表示ですね。
探した限りでは、ポップアップヒント表示を直接行う関数などはなさそうです。
THintWindowから派生したヒントクラスを作り、フォーカスがはずれたら消えるようにすればできるかと思います。

簡単に実現するには(MS標準とは少しビジュアルが違いますが)、ボーダーなしのフォームを作成し、ヒントを表示するときにそのフォームを表示しフォーカスをそのフォームに移すようにすればよいかと思います。
このとき、作成したヒント用フォームのOnDeactivateイベントで、自分自身を消すようにすれば、フォーカス移動時に消えます。

編集    削除
にしの  2003-07-29 19:20:00  No: 4249  IP: [192.*.*.*]

やっぱりありました。
    WinHelp(Handle,
      'ヘルプのファイル名',
      HELP_CONTEXTPOPUP,
      コンテキストID
    );
で表示されると思います。

編集    削除
 2003-07-29 22:18:41  No: 4250  IP: [192.*.*.*]

私もWinHelpを見つけて色々やってましたがHandleのところがうまくいきません。
?ボタンと目指すコントロールはOKBottonDlgに有るのですが
'ヘルプのファイル名'の部分もPChar云々とかのエラーが出ています。

編集    削除
にしの  2003-07-29 22:37:50  No: 4251  IP: [192.*.*.*]

Handleの部分は、フォームのハンドルかApplication.Handleでよろしいかと思います。
OKButtonDlgであれば、TFormからの継承ですので、Handleプロパティがあるはずです。
WMHelpを実装しているのはOKBottonDlgですよね?そうであれば、Handleで躓くことはないと思いますが・・・。

PChar云々でるのは、型がStringではいけないからです。
PCharは、Charへのポインタです。
Stringは文字列です。
Stringのままではいけません。PCharでキャストしてやればエラーにならないと思います。

編集    削除
 2003-07-30 00:29:47  No: 4252  IP: [192.*.*.*]

にしのさん  早速のご教示有難う御座いました。解決しました。

みられる方の参考までにコピーしておきます。

procedure TOKBottomDlg.WMHelp(var Message: TWMHelp);

var
ctrl: TControl;
path: string;
hwnd: Integer;//  Or  LongWord  ?
HELPINFO: THelpInfo;

begin
ctrl:= FindControl(Message.HelpInfo^.hItemHandle);
if ctrl <> nil then
begin
    Application.HelpFile := ExtractFilePath(ParamStr(0))+'MYFILERの使        用方法.HLP';
    path:=Application.HelpFile;
    hwnd:=Form1.Handle;
    WinHelp(hwnd,PChar(path),HELP_CONTEXTPOPUP,333);
end;
    //333は  HelpWorkshop  の  Map  で  割り当てた数字です。

編集    削除
 2003-07-30 00:31:27  No: 4253  IP: [192.*.*.*]

有難う御座いました。

編集    削除