![]() |
EnterKey activate ?
Guten Tag
ich habe mehrere Webbrowser in meiner Form und möchte ich die Eingabetaste drauf aktivieren Mit dem Tutorial kann ich EnterKey nur in neinen aktivieren: ![]() |
Re: EnterKey activate ?
Hallo,
Anstatt WebBrowser1 wird dann einfach auf den aktiven Webbrowser verwiesen. Wenn sich die Webbrowser auf verschiedenen TabSheets eines PageControls befinden ist es einfacher. |
Re: EnterKey activate ?
Und wie konnte man den aktiven Webbrowser auslesen?
|
Re: EnterKey activate ?
Befinden sich alle Browser direkt auf der Form oder auf TabSheets?
|
Re: EnterKey activate ?
alle Webbrowsers befinden sich in Tabsheets
Auf Form1 gibt es keinen Webbrowser |
Re: EnterKey activate ?
Zitat:
|
Re: EnterKey activate ?
Ich habe dann folgendes gemacht :
Delphi-Quellcode:
und natürlich habe ich auch die Funktion geändernt :
var
Form1: TForm1; aktivWebBrowser: TWebBrowser; // ... procedure TForm1.PageControl1Change(Sender: TObject); begin if PageControl1.ActivePage=TabSheet1 then begin aktivWebBrowser:= WebBrowser1; end; if PageControl1.ActivePage=TabSheet2 then begin aktivWebBrowser:= WebBrowser2; end; end;
Delphi-Quellcode:
Leider wird EnterKey nur in Webbrowser1 aktiviert
procedure TForm1.MsgHandler(var Msg: TMsg; var Handled: Boolean);
var iOIPAO: IOleInPlaceActiveObject; Dispatch: IDispatch; begin if (aktivWebBrowser = nil) then // also statt Webbrowser1, habe ich aktivWebBrowser verwendet begin Handled := False; Exit; end; ... Nur OnCreate kann ich den gewüschten aktiven Webbrowser zuweisen aber in Event PageControl1Change nicht:
Delphi-Quellcode:
procedure TForm1.FormCreate(Sender: TObject);
beginaktivWebBrowser:= WebBrowser2; // aktivWebBrowser:= WebBrowser1; end; |
Re: EnterKey activate ?
Hallo,
Sollte so funktionieren: // aktiven Browser ermitteln:
Delphi-Quellcode:
Man könnte auch den aktiven Browser im OnChange des PageControls auslesen und in einer Variable (FCurrentWB) speichern.
function TForm1.GetCurrentWB: TWebbrowser;
begin Result := nil; with PageControl do if ActivePage.Controls[0] is TWebbrowser then Result := (TWebbrowser(ActivePage.Controls[0])); end; procedure TForm1.MsgHandler(var Msg: TMsg; var Handled: Boolean); const StdKeys = [VK_BACK, VK_UP, VK_DOWN, VK_LEFT, VK_RIGHT]; var IOIPAO: IOleInPlaceActiveObject; Dispatch: IDispatch; CurrentWB: TWebbrowser; begin CurrentWB := GetCurrentWB; if CurrentWB = nil then begin Handled := False; Exit; end; Handled := (IsDialogMessage(CurrentWB.Handle, Msg) = True); if (Handled) and (not CurrentWB.Busy) then begin if FOleInPlaceActiveObject = nil then begin Dispatch := CurrentWB.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 in StdKeys) then //nothing - do not pass on Backspace, Left, Right, Up, Down arrows else FOleInPlaceActiveObject.TranslateAccelerator(Msg); end; end;
Delphi-Quellcode:
procedure TForm1.PageControl1Change(Sender: TObject);
begin FCurrentWB := GetCurrentWB; end; |
Re: EnterKey activate ?
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo
Deine Funktion aktiviert auch die Eingabetaste nur in einen Webbrowser Hier ist das Projekt als Demo. Vielleicht habe ich was nicht aufgepasst mfg |
Re: EnterKey activate ?
Das hier gefällt mir aber nicht :
Zitat:
|
Re: EnterKey activate ?
Hab's noch etwas abgeändert. Sollte nun funktionieren.
(Alternative: Den EmbeddedWB verwenden)
Delphi-Quellcode:
function TForm1.GetCurrentWB: TWebbrowser;
begin Result := nil; with PageControl1 do if ActivePage.Controls[0] is TWebbrowser then Result := (TWebbrowser(ActivePage.Controls[0])); end; procedure TForm1.MsgHandler(var Msg: TMsg; var Handled: Boolean); const StdKeys = [VK_TAB, VK_RETURN]; { standard keys } ExtKeys = [VK_DELETE, VK_BACK, VK_LEFT, VK_RIGHT]; { extended keys } fExtended = $01000000; { extended key flag } var CurrentWB: TWebbrowser; begin CurrentWB := FCurrentWB; // exit if we don't get back a webbrowser object if not Assigned(CurrentWB) then begin Handled := False; Exit; end; if IsChild(CurrentWB.Handle, Msg.Hwnd) then begin if (Msg.Message = WM_CLOSE) then msg.message := 0 else if ((Msg.Message >= WM_KEYFIRST) and (Msg.Message <= WM_KEYLAST)) and ((Msg.wParam in StdKeys) or (GetKeyState(VK_CONTROL) < 0) or (Msg.wParam in ExtKeys) and ((Msg.lParam and fExtended) = fExtended)) then begin Handled := (CurrentWB.Application as IOleInPlaceActiveObject).TranslateAccelerator(Msg) = S_OK; if not Handled then begin Handled := True; TranslateMessage(Msg); DispatchMessage(Msg); end; end; end; end; procedure TForm1.PageControl1Change(Sender: TObject); begin begin FCurrentWB := GetCurrentWB; end; |
Re: EnterKey activate ?
Vielen Dank Toms. Es hat jetzt geklappt :spin2:
Ich musste auch FCurrentWB := GetCurrentWB; in FormCreate dazu anlegen mfg |
Re: EnterKey activate ?
Zitat:
Delphi-Quellcode:
//..
CurrentWB := FCurrentWB; // exit if we don't get back a webbrowser object if not Assigned(CurrentWB) then begin FCurrentWB := GetCurrentWB; end; if IsChild(CurrentWB.Handle, Msg.Hwnd) then begin //.. |
Re: EnterKey activate ?
Der Code funktioniert wunderbar in meinem Demo
Aber wenn ich versuche den Code in mein Programm zu verwenden, funktioniert es nicht Mein Programm hat auch in Form1 mehrere Tabsheets. Also identisch :| Wo kann das Problem vielleicht liegen ? |
Re: EnterKey activate ?
Zitat:
|
Re: EnterKey activate ?
Hallo
ich habe den Ursacher erwischt Wenn ich eine Label auf Tabsheet, wo auch Webbrowser drauf liegt, lege, dann wird die Enter-Taste in Webbrowser nicht aktiviert. Wenn ich die Label lösche, dann funktioniert's wieder Das Problem ist nur mit Label. Wenn ich einen Edit drauf hinzufüge dann ist kein Problem Warum ?! |
Re: EnterKey activate ?
Zitat:
Das Problem liegt hier:
Delphi-Quellcode:
function TForm1.GetCurrentWB: TWebbrowser;
begin Result := nil; with PageControl1 do if ActivePage.Controls[0] is TWebbrowser then Result := (TWebbrowser(ActivePage.Controls[0])); end; Konkret hier:
Delphi-Quellcode:
Das Umschreiben / Verbessern der Funktion überlasse ich mal dem Fragesteller.
TWebbrowser(ActivePage.Controls[0]));
|
Re: EnterKey activate ?
erlich gesagt, keine Ahnung :oops:
d.h. ich muss den Tabsheet immer als ActivePage machen, wenn auf den Tabsheet andere Objekte dazu liegen ? |
Re: EnterKey activate ?
Zitat:
@Mini-Programmierer: Was macht denn?
Delphi-Quellcode:
Du hast erwähnt, dass du auf dem TabSheet noch einen TLabel platziert hättest.
TWebbrowser(ActivePage.Controls[0]));
Warum funktioniert dann der obige Zugriff nicht mehr? |
Re: EnterKey activate ?
ich habe eine Schleife in der Funktion eingebaut aber hat es trotzdem nicht geklappt :
Delphi-Quellcode:
function TForm1.GetCurrentWB: TWebbrowser;
var i: integer; begin result := nil; for i:= 0 to PageControl1.ActivePage.ControlCount -1 do begin if (PageControl1.ActivePage.Controls[i] is TWebBrowser) then result := (PageControl1.ActivePage.Controls[i] as TWebBrowser) end; end; |
Re: EnterKey activate ?
Liste der Anhänge anzeigen (Anzahl: 1)
Bei mir funktioniert's bestens. Kleines Demo im Anhang.
Edit 14.11.2008: 1-2 Sachen korrigiert. |
Re: EnterKey activate ?
Ich konnte das Projekt nicht compilieren
aber in Demo sehe ich leider keine label ! Bei mir hat auch funktioniert aber wenn ich Label auf Tabsheet anlege, dann funktioniert nicht mehr mfg |
Re: EnterKey activate ?
Zitat:
Zitat:
|
Re: EnterKey activate ?
Ich wollte das Projekt comipiere, dann erscheint eine Fehlermeldung:
ExceptionLog.duc nicht gefunden Sonst vermute ich auch, dass das Problem an andere Sachen in mein Programm liegt Ich wurde alle Webbrowser in eine separate Form anlegen. Und schon das Problem behoben. Zum glück die Webbrowsers müssen nicht unbedingt in die Mainform sein. mfg |
Re: EnterKey activate ?
Zitat:
Entferne einfach die Unit. Dann geht's. |
Re: EnterKey activate ?
Es funktioniert jetzt
In OnCreate muss aber nicht Webbrowser1 sondern der GetCurrentWB
Delphi-Quellcode:
Es gibt aber noch ein Problem: Wenn ich ein neues tabsheet (4. Tabsheet) erstelle ohne drauf einen Wennrowser
procedure TForm1.FormCreate(Sender: TObject);
begin // FCurrentWB := Webbrowser1; FCurrentWB := GetCurrentWB; anzulegen, dann erscheint eine Fehlermeldung. Update Gelöst mit dem Code :
Delphi-Quellcode:
Dann erscheint keine Fehlermeldung, wenn ich das Tabsheet4 aufrufe :firejump:
procedure TForm1.PageControl1Change(Sender: TObject);
begin if (PageControl1.ActivePage=TabSheet1) or (PageControl1.ActivePage=TabSheet2) or (PageControl1.ActivePage=TabSheet3) then begin FCurrentWB := GetCurrentWB; end; end; Noch ein kleines Problem : In Form2 habe ich auch einen Webbrowser und wollte ich genauso drauf die Enter-Taste aktivieren geht aber nicht. Vermutlich ist die Form1 Vielen Dank Toms für Deine Hilfe mfg |
Re: EnterKey activate ?
Hallo, ich nehme an, du verwendest nun den TEmbeddedWB?
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 23:48 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz