Announcement

Collapse
No announcement yet.

Großes Problem mit TWebBrowser

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Großes Problem mit TWebBrowser

    Hallo ich hab ein großes Problem mit dem TWebBrowser
    [hab das schonmal gepostet, aber dieser Beitrag ist mit vielen anderen im Nirvana ]

    ok, mein problem ist das ich mehr oder weniger häufig probleme mit twebbrowser habe. am größten ist das problem mit der RETURN taste. Hab auch schon was eingebaut(siehe unten). Leider funktioniert das ab und an nicht, k.a. wieso.
    Daher meine fragen:
    1. gibt es eine bessere lösung als diese?
    2. gibt es vieleicht andere bessere Komonenten?

    Hier der Code:
    <PRE>
    unit Unit1;

    interface

    uses
    Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
    Dialogs, OleCtrls, SHDocVw_TLB, ActiveX, StdCtrls;

    type
    TForm1 = class(TForm)
    WebBrowser1: TWebBrowser;
    Button1: TButton;
    Button2: TButton;
    procedure FormDestroy(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    private
    { Private declarations }
    FOleInPlaceActiveObject: IOleInPlaceActiveObject;
    procedure MsgHandler(var Msg: TMsg; var Handled: Boolean);
    public
    { Public declarations }
    end;

    var
    Form1: TForm1;

    implementation

    {$R *.dfm}

    procedure TForm1.FormDestroy(Sender: TObject);
    begin
    FOleInPlaceActiveObject := nil;
    end;

    procedure TForm1.FormCreate(Sender: TObject);
    begin
    Application.OnMessage := MsgHandler;
    end;

    procedure TForm1.MsgHandler(var Msg: TMsg; var Handled: Boolean);
    var
    iOIPAO: IOleInPlaceActiveObject;
    Dispatch: IDispatch;
    begin
    { exit if we don't get back a webbrowser object }
    if (WebBrowser1 = nil) then
    begin
    Handled := False;
    Exit;
    end;

    Handled := (IsDialogMessage(WebBrowser1.Handle, Msg) = True);

    if (Handled) and (not WebBrowser1.Busy) then
    begin
    if FOleInPlaceActiveObject = nil then
    begin
    Dispatch := WebBrowser1.Application;
    if Dispatch <> nil then
    begin
    Dispatch.QueryInterface(IOleInPlaceActiveObject, iOIPAO);
    if iOIPAO <> nil then
    FOleInPlaceActiveObject := iOIPAO;
    end;
    end;

    if FOleInPlaceActiveObject <> nil then
    if ((Msg.message = WM_KEYDOWN) or (Msg.message = WM_KEYUP)) and
    ((Msg.wParam = VK_BACK) or (Msg.wParam = VK_LEFT) or (Msg.wParam = VK_RIGHT)) then
    //nothing - do not pass on Backspace, Left or Right arrows
    else
    FOleInPlaceActiveObject.TranslateAccelerator(Msg);
    end;
    end;

    </PRE>

  • #2
    Hallo Marhias,<br>
    das einzige was meinen Code von Deinem unterscheidet ist dies (wir scheinen die gleiche Quelle zu haben)<br>
    <pre>
    initialization
    OleInitialize(Nil);

    finalization
    OleUninitialize;
    </pre&gt

    Comment


    • #3
      Hi Jens,
      den von die geposteten Code hab ich vergessen zu Posten.
      Das "OleInitialize" dient aber imho nur dafür das Copy&Paste zu aktivieren.

      Ich hab mir überlegt das das Problem bei mir auch woandesher kommen könnte. Und zwar habe ich mehrere TWebbrowser Komponenten in meiner anwendung. Daher jetzt meine Frage:
      Muß ich diese Variable:
      FOleInPlaceActiveObject: IOleInPlaceActiveObject; für jeden Browser extra deklarieren, sprich brauch ich bei 3 browser komponenten 3 Variablen

      Comment


      • #4
        Hallo Mathias,<br>ich hab den selber mal irgendwo kopiert (ihn aber nie verstanden bzw. da alles funktioniert war ich zufrieden). Wenn man aber genauer hinschaut, erkennt man das sich FOleInPlaceActiveObject auf eine bestimmte TWebBrowser Instanz bezieht. Daher würde ich es mit drei Variablen versuchen

        Comment


        • #5
          Danke Jens,

          ich werds ma so versuche

          Comment


          • #6
            Hallo,

            ich habe auch das Problem, dass es bei mehreren Instanzen manchmal nicht geht. Zudem werden die Shortcuts meines Toolbars (&Beenden, &Drucken,...) dann auch nicht in die Webformulare eingegeben (also das b und das d,...).

            Das mit den Variablen verstehe ich nicht ganz, da ich in Delphi noch recht neu bin. Kann das mal jemand genauer erklären oder mit Code demonstrieren?

            Danke

            Comment


            • #7
              Hallo,

              ich habe eine Lösung für die Verwendung mehrerer WebBrowser gefunden.

              <PRE>
              procedure TForm1.MsgHandler(var Msg: TMsg; var Handled: Boolean);
              var
              iOIPAO: IOleInPlaceActiveObject;
              Dispatch: IDispatch;
              SelBrowser:TWebBrowser;
              begin
              SelBrowser := NIL;
              iOIPAO := NIL;
              FOleInPlaceActiveObject := NIL;
              case PageControl1.ActivePageindex of
              0: SelBrowser := WebBrowser1;
              1: SelBrowser := WebBrowser2;
              2: SelBrowser := WebBrowser3;
              3: SelBrowser := WebBrowser4;
              4: SelBrowser := WebBrowser5;
              5: SelBrowser := WebBrowser6;
              6: SelBrowser := WebBrowser8;
              7: SelBrowser := WebBrowser7;
              end;
              if (SelBrowser = nil) then
              begin
              Handled := False;
              Exit;
              end;
              Handled := (IsDialogMessage(SelBrowser.Handle, Msg) = True);
              if (Handled) and (not SelBrowser.Busy) then
              begin
              if FOleInPlaceActiveObject = nil then
              begin
              Dispatch := SelBrowser.Application;
              if Dispatch <> nil then
              begin
              Dispatch.QueryInterface(IOleInPlaceActiveObject, iOIPAO);
              if iOIPAO <> nil then
              FOleInPlaceActiveObject := iOIPAO;
              end;
              end;
              if FOleInPlaceActiveObject <> nil then
              if ((Msg.message = WM_KEYDOWN) or (Msg.message = WM_KEYUP)) and
              ((Msg.wParam = VK_BACK) or (Msg.wParam = VK_LEFT) or
              (Msg.wParam = VK_RIGHT) or (Msg.wParam = VK_F1)) then
              //nothing - do not pass on F1, Backspace, Left or Right arrows
              else
              FOleInPlaceActiveObject.TranslateAccelerator(Msg);
              end;
              end;
              </PRE>

              Andrea

              Comment

              Working...
              X