4

Delphiでは、アプリケーションのメインヘルプファイルはTApplication.HelpFileプロパティを介して割り当てられます。次に、アプリケーションのヘルプシステムへのすべての呼び出しは、このプロパティを(CurrentHelpFileと組み合わせて)使用して、ヘルプ呼び出しのルーティング先となるヘルプファイルを決定します。

TApplication.HelpFileに加えて、各フォームにはTForm.HelpFileプロパティもあります。このプロパティを使用して、特定のフォームから発信されたヘルプ呼び出し用に異なる(個別の)ヘルプファイルを指定できます。

ただし、アプリケーションのメインヘルプウィンドウが既に開いていて、セカンダリヘルプファイルからヘルプを表示するためにヘルプ呼び出しが行われると、両方のヘルプウィンドウがハングします。これで、どちらのヘルプウィンドウにもアクセスできなくなり、どちらも閉じることができなくなります。ヘルプウィンドウを削除する唯一の方法は、アプリケーションを閉じることです。これにより、両方のヘルプウィンドウも自動的に閉じられます。

例:

Application.HelpFile := 'Main Help.chm'; //assign the main help file name
Application.HelpContext(0); //dispays the main help window
Form1.HelpFile := 'Secondary Help.chm'; //assign a different help file
Application.HelpContext(0); //should display a second help window

上記のコードの最後の行は、セカンダリヘルプウィンドウを開き(ただし、コンテンツはありません)、両方のヘルプウィンドウがハングします。

私の質問はこれです:

  1. 2つのHTMLHelpウィンドウを同時に表示することは可能ですか?その場合、従うべき手順は何ですか?

  2. そうでない場合は、アプリケーションのヘルプウィンドウがすでに開いているかどうかを確認し、プログラムで閉じてから別のヘルプウィンドウを表示する方法はありますか?

(私はWindowsVistaのHTMLHelpファイルでDelphi2007を使用しています)

更新:2008-09-18

2つのヘルプファイルを同時に開くと、実際には上記のコードを使用して期待どおりに機能します。問題は、私が使用していた実際のヘルプファイルにあるようです-コードではありません。

同じコードを別のヘルプファイルで試しましたが、正常に機能しました。

不思議なことに、私が使用していた2つのヘルプファイルは、それ自体で正常に機能します。両方を同時に開こうとした場合にのみ、コードから開いた場合にのみ機能します(Windowsエクスプローラーでは両方を開くことができます。同時に問題なく)。

とにかく、問題は間違いなくヘルプファイルにあり、コードにはありません。そのため、元の質問はほとんど無効になっています。

更新2:2008-09-18

やがてヘルプウィンドウがぶら下がっている原因を見つけました。以下に回答を掲載し、今後の参考のために正しい回答として受け入れます。質問のタイトルも変更しました。

おっと...私は自分の答えを受け入れることができないようです...

トップにとどまるように投票してください。

4

4 に答える 4

5

「Help File 1.chm」と「Help File 2.chm」という 2 つのヘルプ ファイルがあり、これらのヘルプ ファイルを Delphi コードから開いているとします。

ヘルプ ファイル 1 を開くには、次のコードが機能します。

procedure TForm1.Button1Click(Sender: TObject);
begin
  Application.HelpFile := 'Help File 1.chm';
  Application.HelpContext(0);
end;

ヘルプ ファイル 2 を開くには、次のコードが機能します。

procedure TForm1.Button1Click(Sender: TObject);
begin
  Application.HelpFile := 'Help File 2.chm';
  Application.HelpContext(0);
end;

ただし、両方のファイルを同時に開くには、次のコードを実行すると、両方のヘルプ ウィンドウがハングします

procedure TForm1.Button1Click(Sender: TObject);
begin
  Application.HelpFile := 'Help File 1.chm';
  Application.HelpContext(0);

  Application.HelpFile := 'Help File 2.chm';
  Application.HelpContext(0);
end;

解決:

この問題は、ヘルプ ファイル名にスペースが含まれているために発生します。

ファイル名からスペースを削除すると、問題が解決します。

次のコードは正常に動作します。

procedure TForm1.Button1Click(Sender: TObject);
begin
  Application.HelpFile := 'HelpFile1.chm';
  Application.HelpContext(0);

  Application.HelpFile := 'HelpFile2.chm';
  Application.HelpContext(0);
end;
于 2008-09-18T06:27:52.320 に答える
1

試してみました。うまくいきます。

于 2008-09-18T00:47:08.440 に答える
1

私はそれをテストしたところ、あなたが試した種類のコードで期待どおりに動作します.
D2007/XP でコンパイルし、XP と Vista の両方で問題なく動作しました。

procedure TForm1.Button1Click(Sender: TObject);
begin
  Application.HelpFile:= 'depends.chm';
  Application.HelpContext(0);
  HelpFile:='GExperts.chm';
  Application.HelpContext(0);
end;

両方のヘルプ ファイルが開いており、正常に動作しています....

Q1: ヘルプ ファイルの有効性を確認しましたか?
Q2: コードはどこに配置しましたか?

于 2008-09-18T00:18:38.663 に答える
0

Inexperienced with help files here, and even moreso with Vista, but I can offer you a possible workaround...

Build a second application whose only job is to open a help file. You can pass the help file name as a command line argument.

You can easily check from your main application whether this help application is running. This will give you full control, as you can decide whether you want to

  • Send a message to close the help application before opening the secondary help
  • Allow more than one instance of the help application to allow different help files to be open at the same time
  • Allow the help to remain open after your application closes, or whether you want to send a message to it to close it

You can also check whether an instance of the help application already has the requested help file open and decide whether you want to allow it to be opened a second time, or simply bring the existing instance to the foreground.

As stated, this is a workaround - if it turns out to be your only option let me know if you need code examples. Otherwise I'll keep this post clean (and save myself time in the short term) and not clutter it with unnecessary source

于 2008-09-17T09:05:36.783 に答える