[Delphi] Enter w webbrowser

0

WItam,

Nigdzie nie znalazłem jak zrobić w delphi żeby klawiszem ENTER potwierdzać formularze w WebBrwoser ;) Czyli np. wpisuje hasło i login i ENTER :)

Pozdrawiam i czekam na szybką odpowiedź :) :D

0

bylo juz nie raz omawiane .. musisz wiedziec jaki numer kodu ma enter

nawet na tym na tej stronie w faq masz napisane ... wiec nie mow ze nigdzie nie znalazles bo zapewne nawet nie szukales

0

Tylko że komponent WebBrowser nie ma funkcji KeyPress. Jakby była ta funkcja to bym się nie pytał na forum :)

0

ale ty nie robisz tego do webbrowser tylko do buttona ktory ma potwierdzac formularz

0

my się nie rozumiemy ! mi nie chodzi o adres który wpisuje do edit1. Mi chodzi o to żeby można było takie coś potwierdzić:
user image

Jak to zrobić ? :>

0

eheheh to chyba nie sprawa komponentu tylko kwestia kodu tej strony

0

IMO. Pobierz uchwyt do przycisku submit i "naciśnij go".

0
var
  iOIPAO: IOleInPlaceActiveObject;
  Dispatch: IDispatch;
begin
  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 not (((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 FOleInPlaceActiveObject.TranslateAccelerator (Msg);
  end;
end;

W

W którym miejscu to napisać ? To jest komponent: IOleInPlaceActiveObject ?

vecco a ty jakbyś zrobił ? Też w tak skomplikowany sposób ?

0

Nie, vecco by chciał zrobić coś co jest niemożliwe. Każdy silnik renderujący ma własne kontrolki...

0

Czyli zastosować ten kod:

var
  iOIPAO: IOleInPlaceActiveObject;
  Dispatch: IDispatch;
begin
  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 not (((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 FOleInPlaceActiveObject.TranslateAccelerator (Msg);
  end;
end;

Już w pierwszej linijce mam błąd iOIPAO: IOleInPlaceActiveObject; co to jest ? komponent ? czy co ?

0

Wszystko ładnie d o tego momentu: MessageHandler. To komponent czy do uses mam coś wpisać ? :|

0

Przerzuć się na EmbeddedWB. Ma znacznie większe możliwości. A, w tym kodzie nie ma nic takiego jak MessageHandler.

0

Czyli zrezygnować z WebBrowser ?
Skąd pobrać tego EmbeddedWB ?

Raczej jest to nie możliwe ze zmianą i muszę już dokończyć tą przeglądarkę na WebBrowser :)
Mam kod wspaniałej przeglądarki gdzie jest rozwiązany mój problem z tym ENTER'em. Czy może mi ktoś korzystając z tego kodu wyciągnąć/przerobić dwa działające kody do:

  • tego naciskania ENTER
  • otwierania nowego okna w zakładce (czyli żeby link co miałby otworzyć się w nowym oknie przeglądarki to robi nową zakładę na PageControl i tam otwiera ?

http://pastebin.4programmers.net/3892

0

Ostatnie linijki to są, od początku tej metody do końca. A EmbeddedWB jest oparte na WebBrowserze, więc o to się nie martw. Można to ściągnąć na google.

0

Czyli jak ściągnę ten komponent i zmienie jego nazwę na WebBrowser1 to cały kod będzie mi działał ? Kurczę bo już mam ponad 400 linijek i od nowa pisanie to za bardzo nie wchodzi w grę :)

Jeśli ściągnę ten komponent to rozwiąże mój problem o ENTER ? będzie już tak kod czy będę musiał coś napiasć?

0

Dalej korzystam z WebBrowser'a i jest OK. Rozwiązanie ENTER znalazłem na angielskiej strony (trochę czasu + słownik i zakumałem o co chodzi ) :)

Jest jeszcze jedno ALE. Jak zrobić żeby załóżmy link który normalnie w IE otwierał nowe okno przeglądarki po naciśnięciu linku robiła się nowa zakładka i żeby nie włączało się IE :) Do robienia nowej zakładki użyję kodu:

 Button10.Enabled:=true;
 zakladka[licz]:=TTabSheet.Create(PageControl1);
 zakladka[licz].Caption:='Zakładka'+IntToStr(licz);
 zakladka[licz].PageControl:=PageControl1;
 zakladka[licz].Parent := PageControl1;
 PageControl1.ActivePage :=zakladka[licz];
 web[licz]:=TWebBrowser.Create(zakladka[licz]);
 TWinControl(web[licz]).Parent := zakladka[licz];
 web[licz].Align:=alClient;
 Inc(licz);

Ale jak przechwycić naciśnięcie linku i żeby wykonało mi utworzenie nowej zakładki, otwarcie tam linku i niepozwolenie uruchomienia IE :)

:D Bardzo proszę o pomoc ;)

0

http://www.cryer.co.uk/brian/delphi/twebbrowser/twebbrowser_events.htm

OnNewWindow2

Called when a new window is about to be created.

    procedure YourForm.WebBrowser_OnNewWindow2(
      Sender: TObject;
      var ppDisp: IDispatch;
      var Cancel: WordBool);

Arguments:

    Sender
        The TWebBrowser component for which the event is being generated. Usage: (Sender as TWebBrowser)
    ppDisp
        Optional - can use to provide a new WebBrowser object to use for the new window. If left unchanged then a new Internet Explorer window will be created.
    Cancel
        Set true to cancel the new window, False to allow the new window to open.


PS. Nie testowalem.

0

Cały kod to taki:

procedure TForm1.WebBrowser1NewWindow2(ASender: TObject;
  var ppDisp: IDispatch; var Cancel: WordBool);
var
new_form: THarvesterForm;
begin
  Application.CreateForm(Form1,new_form);
  new_form.WebBrowser.RegisterAsBrowser := true;
  ppDisp := new_form.WebBrowser.Application;
end;

Wyskakuje masa błędów. A nie można zrobić takiej procedury która blokuje otwierania się okienka IE i ten link co ma niby odtworzyć to odsyła do procedury :)
Jakby taki kod wyglądał ? Ja sobie sam wstawię to procedurę i będzie dobrze (tak myślę)

0

OMG. Człowieku.

public
  procedure newWindow(Sender: TObject; var ppDisp: IDispatch; var Cancel: WordBool);
...
procedure TForm1.newWindow(Sender: TObject;
  var ppDisp: IDispatch; var Cancel: WordBool);
begin
 //tutaj tworzenie zakladki z wb
 web.RegisterAsBrowser := true;
 ppDisp := web.Application;
end;

np. w onCreate

(komponentPageControl.ActivePage.Controls[0] as TWebBrowser).OnNewWindow2 := newWindow;

wszystko?

ps. dostosuj sobie kod... wiekszosc juz masz xD

0

Dostosowałem ale nie wiem czy dobrze bo tworzy się zakładka, IE się nie włącza ale także nie włącza się a powinien ten link co miał trafić do IE :) Po prostu tworzy się zakładka (po kliknięciu na jakiś odnośnik) i program się zawiesza ;)

procedure TForm1.WebBrowser1NewWindow2(ASender: TObject;
  var ppDisp: IDispatch; var Cancel: WordBool);
begin
 zakladka[licz]:=TTabSheet.Create(PageControl1);
 zakladka[licz].Caption:='Zakładka'+IntToStr(licz);
 zakladka[licz].PageControl:=PageControl1;
 zakladka[licz].Parent := PageControl1;
 PageControl1.ActivePage :=zakladka[licz];
 web[licz]:=TWebBrowser.Create(zakladka[licz]);
 TWinControl(web[licz]).Parent := zakladka[licz];
 web[licz].Align:=alClient;
 Inc(licz);
 Inc(licz2);


 web[licz].RegisterAsBrowser := true;
 ppDisp := web[licz].Application;
end;

HelP ;-(

0

wrzuć na http://pastebin.4programmers.net wszystko, co właśnie przerobiłeś. (Nie cały kod).

Po utworzeniu zakładki wiesza sie program?

0

Nie do końca. Mam przycisk tworzenia się zakładki dokładnie: "Button5". Gdy nacisnę nic. Jednak gdy w mojej przeglądarce wejdę np. na epulsa i chcę zobaczyć zdjęcie (bo po kliknięciu na wybrane zdjęcie otwiera się) i wtedy program się zawiesza czyli przy procedurze tej NewWindow2. Nie wiem co i jak. Zobacz na poprzednią stronę co dałem taki długi kod ( z jakiejś strony pobrałem przeglądarkę do nauki) i tam jest kod do okna ale za bardzo nie wiem o co w nim chodzi i wyskakują mi błędy :)

Jak możesz to zobacz ten kod ;)

0

Widzę że wrzuciłeś cały kod z tej przeglądarki :)

var
  ts: TTabSheet;
begin
  AddEventLog('OnNewWindow');
  // if the Webbrowser Dokument is not completely loaded, it might be a popup
  if TWebbrowser(Sender).ReadyState <> READYSTATE_COMPLETE then
  begin
    ppDisp := nil;
    Cancel := True;
  end else
  begin
    ts := CreateTabBrowser('', 'New Browser');
    WaitForBrowser(TWebbrowser(ts.Controls[0]));
    ppdisp := (TWebbrowser(ts.Controls[0])).Application;
    WaitForBrowser(TWebbrowser(ts.Controls[0]));
    // To create a new instance of the webbrowser application:
    // NewWindow := TfrmMyBrowser.Create(self);
    // NewWindow.Show;
    // ppDisp := NewWindow.GetCurrentWB.DefaultDispatch;
  end;
end;

Tutaj jest właśnie do tego okna

A tuta jest mój kod do robienia nowej zakładki:

 zakladka[licz]:=TTabSheet.Create(PageControl1);
 zakladka[licz].Caption:='Zakładka'+IntToStr(licz);
 zakladka[licz].PageControl:=PageControl1;
 zakladka[licz].Parent := PageControl1;
 PageControl1.ActivePage :=zakladka[licz];
 web[licz]:=TWebBrowser.Create(zakladka[licz]);
 TWinControl(web[licz]).Parent := zakladka[licz];
 web[licz].Align:=alClient;
 Inc(licz);

Jak połączyć to żeby działało ;)

1 użytkowników online, w tym zalogowanych: 0, gości: 1