Как я могу получить страницу приветствия в браузере, чтобы перейти к некоторому URI из макета мастера OTA?

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

Почему? Вот question с фоновой информацией.

Ответ 1

Если вы хотите использовать взломать вот так:

type
  TOpenNewURLModule = procedure(const URL: string; EditorForm: TCustomForm);

procedure OpenURL(const URL: string);
var
  EditWindow: INTAEditWindow;
  Lib: HMODULE;
  OpenNewURLModule: TOpenNewURLModule;
begin
  EditWindow := (BorlandIDEServices as INTAEditorServices).TopEditWindow;
  if not Assigned(EditWindow) or not Assigned(EditWindow.Form) then
    Exit;

  Lib := GetModuleHandle('startpageide150.bpl');
  if Lib = 0 then
    Exit;
  OpenNewURLModule := GetProcAddress(Lib, '@[email protected][email protected]@TEditWindow');
  if @OpenNewURLModule <> nil then
    OpenNewURLModule(URL, EditWindow.Form);
end;

Минусы:

  • это хак (startpageidexx.bpl не отображается через API или не документирован)
  • он жестко закодирован для Delphi XE (вам нужно другое имя файла для других версий, также может быть и сигнатура метода, например, в старых версиях AnsiString)
  • он ничего не делает, если нет окна редактирования (должен быть хотя бы один открытый модуль)
  • он всегда открывает новое представление браузера

EDIT. Кажется, что можно повторно использовать существующую открытую страницу приветствия, а также сделать этот хак совместимым со старыми версиями Delphi. Ниже показаны две альтернативы: Delphi XE и Delphi 2007 (оба, похоже, работают):

type
  IURLModule = interface(IOTAModuleData)
  ['{9D215B02-6073-45DC-B007-1A2DBCE2D693}']
    function GetURL: string;
    procedure SetURL(const URL: string);
    property URL: string read GetURL write SetURL;
  end;
  TOpenNewURLModule = procedure(const URL: string; EditorForm: TCustomForm);

function FindURLModule: IURLModule;
var
  I: Integer;
begin
  Result := nil;
  with BorlandIDEServices as IOTAModuleServices do
    for I := 0 to ModuleCount - 1 do
      if Supports(Modules[I], IURLModule, Result) then
        Break;
end;

procedure OpenURL(const URL: string; ReuseExistingView: Boolean = True);
{$IFDEF VER220} // Delphi XE
const
  SStartPageIDE = 'startpageide150.bpl';
  SOpenNewURLModule = '@[email protected][email protected]@TEditWindow';
{$ENDIF}
{$IFDEF VER185} // Delphi 2007
const
  SStartPageIDE = 'startpageide100.bpl';
  SOpenNewURLModule = '@[email protected][email protected]@TEditWindow';
{$ENDIF}
var
  Module: IURLModule;
  EditWindow: INTAEditWindow;
  Lib: HMODULE;
  OpenNewURLModule: TOpenNewURLModule;
begin
  EditWindow := nil;
  Module := nil;
  if ReuseExistingView then
    Module := FindURLModule;
  if Assigned(Module) then
  begin
    Module.URL := URL;
    (Module as IOTAModule).Show;
  end
  else
  begin
{$IFDEF VER220}
    EditWindow := (BorlandIDEServices as INTAEditorServices).TopEditWindow;
{$ENDIF}
{$IFDEF VER185}
  if Assigned((BorlandIDEServices as IOTAEditorServices).TopView) then
    EditWindow := (BorlandIDEServices as IOTAEditorServices).TopView.GetEditWindow;
{$ENDIF}
    if not Assigned(EditWindow) or not Assigned(EditWindow.Form) then
      Exit;
    Lib := GetModuleHandle(SStartPageIDE);
    if Lib = 0 then
      Exit;

    OpenNewURLModule := GetProcAddress(Lib, SOpenNewURLModule);
    if @OpenNewURLModule <> nil then
      OpenNewURLModule(URL, EditWindow.Form);
  end;
end;

Остальные минусы:

  • это все еще хак
  • он по-прежнему жестко закодирован, для Delphi XE (Unicode) и Delphi 2007 (ANSI)
  • он ничего не делает, если нет окна редактирования

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

Ответ 2

Вот решение, которое я сделал специально для вас...

enter image description here

Загрузите источник из здесь, извлеките и загрузите пакет в Delphi (я сделал его в Delphi XE, но он будет загружаться в любом версия! Вам нужно будет изменить путь вывода модуля в параметрах проекта на версиях до XE, хотя)... установите пакет.

В меню "Справка" найдите Создать браузер и щелкните по нему. Затем это создаст и отобразит вкладку, которая перемещается в мой блог (для примера).

Вы можете легко изменить это в соответствии с вашими потребностями! Код элемента меню справки находится в EditWizard.MenuItem.pas и может быть проигнорирован! Просто отметьте, что он делает вызов при нажатии на (BorlandIDEServices as IOTAEditorViewServices).ShowEditorView(CreateTab('http://www.simonjstuart.com'));, что фактически создает экземпляр вкладки браузера!

Весь код вкладки "Браузер" (включая макет фрейма) содержится в EditorWizard.Frame.pas, что делает его очень легко модифицировать в соответствии с вашими потребностями!

Единица EditorWizard.Wizard.pas содержит небольшой код, необходимый для регистрации вкладки пользовательского браузера в среде IDE.

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

Наслаждайтесь:)

Ответ 3

Вам лучше показать свой собственный TForm с помощью компонента TWebBrowser, на который вы можете загрузить HTML.