ひとりごと:アーカイブ

Delphi 2005 と HTMLHelp

wb for XPを地味にバージョンアップしています。意見要望は心に秘めておいて欲しいのに、オープンな時代だからと面と向かって要求を行ってくる人がいらっしゃいまして。面と向かって言われるならいいや、対応しようと。

  • 2007年7月20日 ver 1.2
    • 複数ファイル連続色替え機能追加。
    • ヘルプ追加。
  • 2007年7月21日 ver 1.2.1
    • ヘルプを状況依存対応。
    • 複数ファイルドロップしたとき、wb for XPを最前面へ表示する

連続色替え以外は機能は増えていなかったりします。ヘルプは言われていないけれど私の趣味で。今更な感じがしますが今日はHTMLHelpについてお勉強していました。

Delphi 2005はWinHelpとHTMLHelpの対応が中途半端に混ざっていてどちらもうまく動いていない感じがします。

今回はHTMLHelpを使うために、CallHtmlHelp.pasなんてものを作ってみました。難しいところはrtl(Windows.pas)に最初から作られているようなので、Delphiっぽく使えるように関数をいくつか。

以下、Delphiプログラムのうんちく。

(追記(2007/8/2)かなり簡潔になりました。覚え書き作りました)

(追記(2007/7/23)。下記項目を書いた後にプログラム修正しています。最新版はwb for XPに付けています。また、HtmlHelpに対応したプログラムを作成するならば HelpScribble: The Most Popular Help Authoring Tool Among Delphi & C++Builder Developers にあるプログラムがおすすめです。WinHelpViwerと同じインターフェースを用いてHTMLHelpViewrというクラスを作っています。Delphiの構成ファイルにHTMLHelpViewer.dcuというものを見つけました。フォームのUsesにHTMLHelpViewerと入れるだけで万事解決・・・。悩んだのに。WinHelpViewer同様、ユニットをusesするだけの簡単設定です。そんなわけで下のCallHtmlHelp.pasは消しました)




unit CallHtmlHelp;

interface

uses Windows;

function HtmlHelpShowHelp : HWND;
function HtmlHelpShowTopic(const Topic : String) : HWND;
function HtmlHelpShowContext(const Context: Integer) : HWND;
function HtmlHelpShowContents : HWND;
function HtmlHelpShowIndex : HWND;

implementation

uses Forms;

function HtmlHelpShowHelp : HWND;
begin
   Result:=HtmlHelp(0, PChar(Application.HelpFile), HH_DISPLAY_TOPIC, 0);
end;

function HtmlHelpShowTopic(const Topic : String) : HWND;
begin
   Result:=HtmlHelp(0, PChar(Application.HelpFile+'::'+Topic), HH_DISPLAY_TOPIC, 0);
end;

function HtmlHelpShowContext(const Context: Integer) : HWND;
begin
   Result:=HtmlHelp(0, PChar(Application.HelpFile), HH_HELP_CONTEXT, DWord(Context));
end;

function HtmlHelpShowContents : HWND;
begin
   Result:=HtmlHelp(0, PChar(Application.HelpFile), HH_DISPLAY_TOC, 0);
end;

function HtmlHelpShowIndex : HWND;
begin
   Result:=HtmlHelp(0, PChar(Application.HelpFile), HH_DISPLAY_INDEX, 0);
end;

end.



HtmlHelp関数の第一引数を0にしています。HtmlHelpViewerの動作やメッセージを受け取りたいならばApplication.Handleでも入れておけばよいと思います。Application.Handleを指定すると、Viewerがアクティブになったときに一つ後ろの窓がApplicatin.Handleになります(これはViewerが閉じたときに最前面にくるアプリケーションを選択しているのだと思います)。

第一引数を0にしている場合、HtmlHelpViewerが閉じられたときに前面にくるアプリケーションはOSが選択します。選択・・・というか、一つ後ろの窓を指定していないのだと思います。

さて、これでDelphiのプロジェクトオプションで標準のヘルプファイルを設定して、フォームに上のユニットをusesしておけば、HtmlHelpShowHelpとかHtmlHelpShowContentsとか呼ぶことでとりあえずヘルプのデフォルトページが開きます。トピックにchm内htmlを指定すればそのページが開きますし、コンテキストIDを指定しているヘルプならばコンテキストIDを指定できます。

次。状況依存。つい状況起因効果とか入力してしまうのは元MtG遊び人だったためだろう。

フォームにTApplicationEventsを貼り付けて、OnHint以下略。


function TMainForm.ApplicationEvents1Help(Command: Word; Data: Integer;
  var CallHelp: Boolean): Boolean;
var
  Keyword: String;
begin
  //状況依存ヘルプ
  CallHelp:= False;
  Result := True;

  case Command of
  HELP_CONTEXT://コンテキスト
    HtmlHelpShowContext(Data);
  HELP_CONTEXTPOPUP:             //本来ならポップアップだけれど普通に表示
    HtmlHelpShowContext(Data);
  HELP_SETPOPUP_POS:;            //本来ならポップアップ表示の準備
  HELP_COMMAND://キーワード
    begin
      Keyword := String(PChar(Data));
      HtmlHelpShowTopic(Keyword);
    end;
  else
    HtmlHelpShowTopic('hmIndex.html');
  end;

end;

状況依存ならポップアップも対応しなきゃだろうとは思いつつ対応していません。今回はヘルプファイルでTextPopUpsを作っていないのでー。で、とりあえずアクションリストの各項目にコンテキストを割り当てています。イベント処理内部にキーワードってコメントがありますけれど、検索ではありません。当初、コンテキストを使わずに状況依存を作ろうとしていて、chm内html指定で行きたいなぁとか思って作っていました。コントロールによってはコンテキストしか指定できないようなので、諦めました。おそらく、ポップアップ使用を前提想定しているコントロールはコンテキストしか指定できません。

今回のユニットは、AKlink対応やポップアップ対応とか全く考えていないあたり、大きなアプリケーションには対応しなさそうな未熟な感じです。WinHelpViewer(WinHelpを使うためのユニット)を調べればもっと良いものが作れそうな感じはします。

トラックバック(0)

トラックバックURL: http://arika.stbbs.net/blogmt/mt-tb.cgi/571

コメントする

このブログ記事について

このページは、惟栂舞ありかが2007年7月21日 18:27に書いたブログ記事です。

ひとつ前のブログ記事は「画像の色交換(wb for XP)」です。

次のブログ記事は「HTMLHelpViewerはもっと簡単でした。」です。

最近のコンテンツはインデックスページで見られます。過去に書かれたものはアーカイブのページで見られます。

アーカイブ