delphiotatoolsapi

How do I get Welcome Page browser navigate to some URI from within OTA package wizard?


What I'm trying to do is to create an ability to view (not to edit) the HTML pages included into project. The Welcome Page already has embedded web browser, so it appears to be a good candidate for that.

Curios why? Here is a question with background info.


Solution

  • In case you're willing to use a hack like this:

    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;
    

    Cons:


    EDIT: It seems to be possible to reuse an existing open Welcome page, as well as make this hack compatible with older versions of Delphi. The following shows two alternatives, Delphi XE and Delphi 2007 (both seem to be working):

    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;
    

    Remaining cons:

    Perhaps you can use this as a start if you need compatibility for other versions.