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
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
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
Tylko że komponent WebBrowser nie ma funkcji KeyPress. Jakby była ta funkcja to bym się nie pytał na forum :)
ale ty nie robisz tego do webbrowser tylko do buttona ktory ma potwierdzac formularz
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ć:
Jak to zrobić ? :>
eheheh to chyba nie sprawa komponentu tylko kwestia kodu tej strony
IMO. Pobierz uchwyt do przycisku submit i "naciśnij go".
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 ?
Nie, vecco by chciał zrobić coś co jest niemożliwe. Każdy silnik renderujący ma własne kontrolki...
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 ?
Do uses dodaj ActiveX.
BTW. Ja bym skorzystał z EmbeddedWb (http://www.bsalsa.com/)
Pomocne:
http://forums.devshed.com/delphi-programming-90/using-twebbrowser-to-enter-text-and-click-button-515924.html
http://www.mail-archive.com/[email protected]/msg13315.html
http://groups.google.pl/groups?q=webbrowser+enter+delphi&hl=pl&lr=&client=firefox-a&rls=org.mozilla:pl:official&um=1&ie=UTF-8&sa=N&tab=wg
Wszystko ładnie d o tego momentu: MessageHandler. To komponent czy do uses mam coś wpisać ? :|
Przerzuć się na EmbeddedWB. Ma znacznie większe możliwości. A, w tym kodzie nie ma nic takiego jak MessageHandler.
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:
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.
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ć?
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 ;)
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.
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ę)
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
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 ;-(
wrzuć na http://pastebin.4programmers.net wszystko, co właśnie przerobiłeś. (Nie cały kod).
Po utworzeniu zakładki wiesza sie program?
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 ;)
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 ;)