Одновременное открытие двух файлов HTMLHelp в Delphi приводит к зависанию обоих окон справки - PullRequest
3 голосов
/ 17 сентября 2008

В 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. Можно ли одновременно отобразить два окна HTMLHelp, и если да, то какую процедуру следует выполнить?

  2. Если нет, есть ли способ узнать, открыто ли уже окно справки приложения, и затем программно закрыть его перед отображением другого окна справки?

(я использую Delphi 2007 с файлами HTMLHelp в Windows Vista)

ОБНОВЛЕНИЕ: 2008-09-18

Открытие двух файлов справки одновременно работает, как и ожидалось, с использованием приведенного выше кода. Кажется, проблема связана с реальными файлами справки, которые я использовал, а не с кодом.

Я пробовал один и тот же код с разными файлами справки, и он работал нормально.

Как ни странно, два файла справки, которые я использовал каждый, прекрасно работают сами по себе - только когда вы пытаетесь открыть оба одновременно, они зависают, и только если вы открываете их из кода (в проводнике Windows я могу открыть оба одновременно без проблем).

В любом случае, проблема определенно связана с файлами справки, а не с кодом, поэтому исходные вопросы теперь в значительной степени недействительны.

ОБНОВЛЕНИЕ 2: 2008-09-18

В конце концов я нашел причину зависания окна справки. Я опубликую ответ ниже и приму его как правильный для дальнейшего использования. Я также изменил название вопросов.

Упс ... Кажется, я не могу принять свой собственный ответ ...

Пожалуйста, проголосуйте, чтобы оно оставалось наверху.

Ответы [ 4 ]

4 голосов
/ 18 сентября 2008

Предполагается, что у вас есть два файла справки, называемые «Файл справки 1.chm» и «Файл справки 2.chm», и вы открываете эти файлы справки из своего кода 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;
1 голос
/ 18 сентября 2008

Я только что проверил это, и работает, как и ожидалось, с кодом, который вы пробовали. Скомпилировано в 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: Где вы разместили свой код?

1 голос
/ 18 сентября 2008

Пробовал. Просто работает.

0 голосов
/ 17 сентября 2008

Неопытный с файлами справки здесь, и даже больше с Vista, но я могу предложить вам возможный обходной путь ...

Создайте второе приложение, единственной задачей которого является открытие файла справки. Вы можете передать имя файла справки в качестве аргумента командной строки.

Вы можете легко проверить из основного приложения, запущено ли это приложение справки. Это даст вам полный контроль, так как вы можете решить, хотите ли вы

  • Отправьте сообщение, чтобы закрыть приложение справки, прежде чем открывать дополнительную справку
  • Разрешить более одного экземпляра приложения справки для одновременного открытия разных файлов справки
  • Оставьте справку открытой после закрытия приложения или если вы хотите отправить ему сообщение, чтобы закрыть его

Вы также можете проверить, уже открыт ли запрошенный файл справки для экземпляра приложения справки, и решить, хотите ли вы разрешить его повторное открытие или просто вывести существующий экземпляр на передний план.

Как уже говорилось, это обходной путь - если он окажется единственным вариантом, дайте мне знать, если вам нужны примеры кода. Иначе я буду держать этот пост в чистоте (и сэкономлю время в краткосрочной перспективе) и не загромождаю его ненужным источником

...