Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi EnterKey activate ? (https://www.delphipraxis.net/115761-enterkey-activate.html)

Mini-Programmierer 17. Jun 2008 16:06


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:
Tutorial

toms 17. Jun 2008 16:15

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.

Mini-Programmierer 17. Jun 2008 16:22

Re: EnterKey activate ?
 
Und wie konnte man den aktiven Webbrowser auslesen?

toms 17. Jun 2008 16:27

Re: EnterKey activate ?
 
Befinden sich alle Browser direkt auf der Form oder auf TabSheets?

Mini-Programmierer 17. Jun 2008 16:28

Re: EnterKey activate ?
 
alle Webbrowsers befinden sich in Tabsheets
Auf Form1 gibt es keinen Webbrowser

toms 17. Jun 2008 16:35

Re: EnterKey activate ?
 
Zitat:

Zitat von Mini-Programmierer
alle Webbrowsers befinden sich in Tabsheets
Auf Form1 gibt es keinen Webbrowser

Dann kannst du ja ermitteln, welches TabSheet aktiv ist und dann den Webbrowser auf dem TabSheet ermitteln.

Mini-Programmierer 17. Jun 2008 16:49

Re: EnterKey activate ?
 
Ich habe dann folgendes gemacht :
Delphi-Quellcode:
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;
und natürlich habe ich auch die Funktion geändernt :
Delphi-Quellcode:
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;
...
Leider wird EnterKey nur in Webbrowser1 aktiviert

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;

toms 19. Jun 2008 15:40

Re: EnterKey activate ?
 
Hallo,

Sollte so funktionieren:

// aktiven Browser ermitteln:
Delphi-Quellcode:
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;
Man könnte auch den aktiven Browser im OnChange des PageControls auslesen und in einer Variable (FCurrentWB) speichern.

Delphi-Quellcode:
procedure TForm1.PageControl1Change(Sender: TObject);
begin
  FCurrentWB := GetCurrentWB;
end;

Mini-Programmierer 19. Jun 2008 22:18

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

Hansa 20. Jun 2008 00:38

Re: EnterKey activate ?
 
Das hier gefällt mir aber nicht :

Zitat:

Zitat von toms
Delphi-Quellcode:
procedure TForm1.MsgHandler(var Msg: TMsg; var Handled: Boolean);
const
  StdKeys = [VK_BACK, VK_UP, VK_DOWN, VK_LEFT, VK_RIGHT];
...

Da werden Standardbezeichner benutzt ! Würde ich vermeiden. Weiß der Teufel, was dabei rauskommt. :gruebel:

toms 20. Jun 2008 07:01

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;

Mini-Programmierer 20. Jun 2008 08:31

Re: EnterKey activate ?
 
Vielen Dank Toms. Es hat jetzt geklappt :spin2:
Ich musste auch FCurrentWB := GetCurrentWB; in FormCreate dazu anlegen
mfg

toms 20. Jun 2008 08:46

Re: EnterKey activate ?
 
Zitat:

Zitat von Mini-Programmierer
Vielen Dank Toms. Es hat jetzt geklappt :spin2:
Ich musste auch FCurrentWB := GetCurrentWB; in FormCreate dazu anlegen
mfg

Kannst es auch so schreiben:

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
  //..

Mini-Programmierer 20. Jun 2008 10:41

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 ?

toms 20. Jun 2008 10:43

Re: EnterKey activate ?
 
Zitat:

Zitat von Mini-Programmierer
Wo kann das Problem vielleicht liegen ?

:glaskugel: -- wenn du möchtest kannst du mir den Source schicken?

Mini-Programmierer 20. Jun 2008 15:52

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 ?!

toms 20. Jun 2008 16:37

Re: EnterKey activate ?
 
Zitat:

Zitat von Mini-Programmierer
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 ?!


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:
TWebbrowser(ActivePage.Controls[0]));
Das Umschreiben / Verbessern der Funktion überlasse ich mal dem Fragesteller.

Mini-Programmierer 20. Jun 2008 18:19

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 ?

toms 21. Jun 2008 05:45

Re: EnterKey activate ?
 
Zitat:

Zitat von Mini-Programmierer
erlich gesagt, keine Ahnung :oops:
d.h. ich muss den Tabsheet immer als ActivePage machen, wenn auf den Tabsheet andere Objekte dazu liegen ?


@Mini-Programmierer: Was macht denn?

Delphi-Quellcode:
TWebbrowser(ActivePage.Controls[0]));
Du hast erwähnt, dass du auf dem TabSheet noch einen TLabel platziert hättest.

Warum funktioniert dann der obige Zugriff nicht mehr?

Mini-Programmierer 21. Jun 2008 08:56

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;

toms 21. Jun 2008 20:18

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.

Mini-Programmierer 21. Jun 2008 21:44

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

toms 21. Jun 2008 21:50

Re: EnterKey activate ?
 
Zitat:

Zitat von Mini-Programmierer
Ich konnte das Projekt nicht compilieren

:glaskugel: Fehlermeldung? ...


Zitat:

Zitat von Mini-Programmierer
aber in Demo sehe ich leider keine label !

Im Tabsheet3 hat's einen TLabel

Mini-Programmierer 22. Jun 2008 10:13

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

toms 22. Jun 2008 10:43

Re: EnterKey activate ?
 
Zitat:

Zitat von Mini-Programmierer
Ich wollte das Projekt comipiere, dann erscheint eine Fehlermeldung:
ExceptionLog.duc nicht gefunden


Entferne einfach die Unit. Dann geht's.

Mini-Programmierer 22. Jun 2008 10:57

Re: EnterKey activate ?
 
Es funktioniert jetzt
In OnCreate muss aber nicht Webbrowser1 sondern der GetCurrentWB

Delphi-Quellcode:
procedure TForm1.FormCreate(Sender: TObject);
begin
// FCurrentWB := Webbrowser1;
 FCurrentWB := GetCurrentWB;
Es gibt aber noch ein Problem: Wenn ich ein neues tabsheet (4. Tabsheet) erstelle ohne drauf einen Wennrowser
anzulegen, dann erscheint eine Fehlermeldung.



Update
Gelöst mit dem Code :

Delphi-Quellcode:
procedure TForm1.PageControl1Change(Sender: TObject);
begin
if (PageControl1.ActivePage=TabSheet1) or
    (PageControl1.ActivePage=TabSheet2) or
    (PageControl1.ActivePage=TabSheet3) then
begin
FCurrentWB := GetCurrentWB;
end;
end;
Dann erscheint keine Fehlermeldung, wenn ich das Tabsheet4 aufrufe :firejump:

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

toms 24. Jun 2008 14:18

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