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

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

Любопытно, почему? Вот вопрос с дополнительной информацией.

Ответы [ 3 ]

26 голосов
/ 01 декабря 2011

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

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.

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

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

8 голосов
/ 29 ноября 2011

На случай, если вы захотите использовать такой взлом:

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, '@Urlmodule@OpenNewURLModule$qqrx20System@UnicodeStringp22Editorform@TEditWindow');
  if @OpenNewURLModule <> nil then
    OpenNewURLModule(URL, EditWindow.Form);
end;

Минусы:

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

РЕДАКТИРОВАТЬ : представляется возможным повторно использовать существующую открытую страницу приветствия, а также сделать этот хак совместимым со старыми версиями 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 = '@Urlmodule@OpenNewURLModule$qqrx20System@UnicodeStringp22Editorform@TEditWindow';
{$ENDIF}
{$IFDEF VER185} // Delphi 2007
const
  SStartPageIDE = 'startpageide100.bpl';
  SOpenNewURLModule = '@Urlmodule@OpenNewURLModule$qqrx17System@AnsiStringp22Editorform@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)
  • все равно ничего не делает, если нет окна редактирования

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

3 голосов
/ 10 ноября 2011

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

...