如何从OTA包向导中获取欢迎页面浏览器导航到某些URI?

OnT*_*Fly 10 delphi ota toolsapi

我要做的是创建一种查看(不编辑)项目中包含的HTML页面的功能.欢迎页面已经嵌入了Web浏览器,因此它似乎是一个很好的候选者.

Curios为什么?这是一个背景信息的问题.

LaK*_*ven 26

这是我专门为您制定的解决方案......

在此输入图像描述

这里下载源代码,在Delphi中提取并加载包(我在Delphi XE中创建,但它将在任何版本中加载!你需要在XE之前版本的Project Options中更改单元输出路径) ...安装包.

在"帮助"菜单中,找到" 创建浏览器"并单击它.然后,这将创建并显示导航到我的博客的选项卡(出于示例的目的).

您可以轻松修改它以满足您的需求!帮助菜单项代码位于EditWizard.MenuItem.pas,可以忽略不计!请注意,单击时它正在进行调用(BorlandIDEServices as IOTAEditorViewServices).ShowEditorView(CreateTab('http://www.simonjstuart.com'));,这实际上是创建浏览器选项卡实例的!

浏览器选项卡的所有代码(包括其框架布局)都包含在内EditorWizard.Frame.pas,这使得它很容易修改以满足您的需求!

该单元EditorWizard.Wizard.pas包含将自定义浏览器选项卡注册到IDE所需的少量代码.

当然,您需要进行一些调整,但这肯定会成为您尝试做的事情的一个非常可接受的基础.

请享用 :)

  • 撇开:你的问题(以及我的工作产生了这个解决方案)给了​​我一个好主意!我将制作一个免费(可再发行)插件,以提供一个编辑器选项卡式Chromium浏览器,其他插件可以轻松调用以显示他们需要的任何内容(原始HTML,网页,文档站点等). (2认同)

Ond*_*lle 8

如果你愿意使用这样的黑客:

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;
Run Code Online (Sandbox Code Playgroud)

缺点:

  • 这是一个hack(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;
Run Code Online (Sandbox Code Playgroud)

剩下的缺点:

  • 它仍然是一个黑客
  • 对于Delphi XE(Unicode)和Delphi 2007(ANSI),它仍然是硬编码的
  • 如果没有编辑窗口,它仍然无效

如果您需要兼容其他版本,也许您可​​以将此作为开始.

  • 我不记得细节了,但我开始用`(IOTAModule as TObject).ClassName`,然后`GetProcAddress(lib,'@ unitname @ classname @')`来获取类引用,然后从那里你可以得到RTTI遍历祖先,获取已实现接口的列表(GUID也存储在RTTI中).当然还有依赖查看器和`tdump startide150.bpl`. (2认同)