10

私がやろうとしているのは、プロジェクトに含まれているHTMLページを表示する(編集しない)機能を作成することです。ウェルカムページにはすでにWebブラウザが埋め込まれているため、その候補として適しているようです。

キュリオスなぜ?これが背景情報のある質問です。

4

3 に答える 3

26

これが私があなたのために特別に作った解決策です...

ここに画像の説明を入力してください

ここからソースをダウンロードし、Delphiでパッケージを抽出してロードします(Delphi XEで作成しましたが、どのバージョンでもロードされます!ただし、XEより前のバージョンのプロジェクトオプションでユニット出力パスを変更する必要があります) ...パッケージをインストールします。

[ヘルプ]メニューで、 [ブラウザの作成]を見つけてクリックします。これにより、私のブログに移動するタブが作成されて表示されます(例として)。

ニーズに合わせて簡単に変更できます!ヘルプメニューの項目コードはにありEditWizard.MenuItem.pas、無視してかまいません。クリックすると呼び出しが行われることに注意してください(BorlandIDEServices as IOTAEditorViewServices).ShowEditorView(CreateTab('http://www.simonjstuart.com'));。これにより、実際にブラウザタブインスタンスが作成されます。

ブラウザタブのすべてのコード(フレームレイアウトを含む)はに含まれEditorWizard.Frame.pasているため、ニーズに合わせて簡単に変更できます。

ユニットEditorWizard.Wizard.pasには、カスタムブラウザタブをIDEに登録するために必要な少量のコードが含まれています。

もちろん、ある程度の調整が必要になりますが、これは確かに、あなたがやろうとしていることの非常に受け入れられる基盤として役立つはずです。

楽しみ :)

于 2011-11-30T20:19:46.817 に答える
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;

短所:

  • それはハックです(startpageidexx.bplはAPIを介して公開されておらず、文書化されていません)
  • Delphi XE用にハードコーディングされています(他のバージョンでは別のファイル名が必要です。メソッドのシグネチャも異なる場合があります-たとえば、古いAnsiStringバージョンでは)
  • 編集ウィンドウがない場合は何もしません(少なくとも1つの開いているモジュールが必要です)
  • 常に新しいブラウザビューを開きます

編集:既存の開いているウェルカムページを再利用したり、このハックを古いバージョンのDelphiと互換性を持たせたりすることは可能のようです。以下に、DelphiXEとDelphi2007の2つの選択肢を示します(どちらも機能しているようです)。

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)の場合、まだハードコーディングされています
  • 編集ウィンドウがない場合でも何もしません

他のバージョンとの互換性が必要な場合は、おそらくこれを出発点として使用できます。

于 2011-11-29T11:38:36.613 に答える
3

HTMLをロードできるコンポーネントを含む独自TFormのコンポーネントを表示することをお勧めします。TWebBrowser

于 2011-11-10T01:42:43.743 に答える