Neu vorgestellt

Erweiterung im WebNavigator

Der WebNavigator ist ein COM-Objekt des Internet Explorers und dient zur Anzeige von Dateien oder HTML-Inhalten sowie registrierten Dokumenttypen. Mit der 5.7.04 wird der WebNavigator erweitert, um der Benutzerinteraktion besser entgegenzukommen.


Ermitteln der Tastatureingaben

Eine der Neuerungen ist die Verfügbarkeit des Events EvtKeyItem. So kann besser auf die Eingaben des Benutzers reagiert werden.

Kommandos senden

Außerdem wurde der Befehl WinWbnExecCommand() eingeführt. Dieser erlaubt es Kommandos an den WebNavigator zu senden.

Folgende Befehle stehen zur Verfügung:

  • _WinWbnCommandSelCopy
    Kopiert den selektierten HTML-Inhalt bzw. den Inhalt des fokussierten Objektes in die Zwischenablage.
  • _WinWbnCommandSelCut
    Schneidet die Selektion (z. B. in einem Eingabefeld) aus und überträgt ihn in die Zwischenablage.
  • _WinWbnCommandSelPaste
    Fügt den Inhalt der Zwischenablage in das fokussierte Objekt ein.
  • _WinWbnCommandSelSelectAll
    Selektiert den gesamten HTML-Inhalt bzw. den Inhalt des fokussierten Objektes.
  • _WinWbnCommandNavHome
    Navigiert zur Startseite, die in den Optionen des Internet Explorer eingestellt ist.
  • _WinWbnCommandNavBack
    Navigiert zur vorherigen Seite.
  • _WinWbnCommandNavForward
    Navigiert zur nächsten Seite.
  • _WinWbnCommandNavSearch
    Navigiert zur Suchseite, die im Internet Explorer eingestellt ist.
  • _WinWbnCommandUpdNormal
    Seite erneut aus dem Cache laden (F5 in anderen Brwosern).
  • _WinWbnCommandUpdNoCache
    Seite neu anfordern (Strg + F5 in anderen Browsern).

In diesem Codeausschnitt werden die Reload-Funktionen eines Internet-Browsers (F5, Strg + F5) durch das Event EvtKeyItem in den WebNavigator eingebunden.

sub EvtKeyItem
(
  aEvt                  : event;    // Ereignis
  aKey                  : int;      // Taste
  aID                   : int;      // Wird nicht ausgewertet
)
: logic;
{
  switch (aKey)
  {
    // Seite aktualisieren (aus Cache)
    case _WinKeyF5 :
      aEvt:Obj->WinWbnExecCommand(_WinWbnCommandUpdNormal);

    // Seite neu laden
    case _WinKeyCtrl | _WinKeyF5 :
      aEvt:Obj->WinWbnExecCommand(_WinWbnCommandUpdNoCache);

    // ...

    default :
      // Andere Tasten an WebNavigator weitergeben
      return(true);
  }

  // Taste nicht an WebNavigator weitergeben
  return(false);
}
Beispiel

Ab der 5.7.04 wird ein Beispiel mit dem Namen MiniWeb zu diesem Artikel in der CodeLibrary zu finden sein.

17 Kommentare

17 Kommentare “Erweiterung im WebNavigator”

  1. @Michael:
    Ja, ich denke Gecko, Chromium sind beide besser als IE <= 9. Möglicherweise liesse sich ja auch eine neue IE-Version (>= 10) fest integrieren. Ich vermute, dass es im Moment so ist, dass jeweils der im System vorhandene IE genutzt wird, so dass man auf älteren Rechnern ein gewisses Risiko hat, auf stark veraltete Browser zu treffen.

    Auf jeden Fall könnte man mit Hilfe der Verbesserungen, die wir hier diskutiert haben, mit dem WebNavigator eine Menge interessanter Sachen machen. Ich würde ihn z.B. gern dazu nutzen, hochdynamische interaktive Formulare anzuzeigen (z.B. für die Erfassung irgendwelcher Auswertungen bzw. Statistiken), die automatisch aus der Datenbank generiert und vom Benutzer angepasst werden können.

  2. @Kilian:
    Ein auf der Gecko-Engine basierender WebBrowser wäre schon eine tolle Sache. Jedenfalls klingen die Links sehr vielversprechend. Wahrscheinlich hätte man dadurch auch eine bessere Kontrolle über die HTML-Elemente und die DOM-Struktur. Dies ist prinzipiell zwar bisher auch schon mit dem WebNavigator zugrunde liegenden COM-Interface (IWebBrowser2) möglich, jedoch ist das Interface schon sehr betagt und etwas umständlich zu handhaben.

  3. @Michael:
    Das wäre eine wünschenswerte Erweiterung.

    Meine Überlegungen gehen dahin, dass man Websockets dazu nutzen könnte, um beliebige Events ohne vorhergehenden Request an den WebNavigator zu schicken. Leider spricht der IE unterhalb von Nr. 10 das entspr. Protokoll nicht. Nutzt man das Chrome Frame-Plugin klappt auch die Kommunikation über Websockets. Fehlt nur noch, dass der WebNavigator da mitspielt, oder?

    Hervorragende Alternativen zum IE insgesamt wären http://code.google.com/p/chromiumembedded/ oder https://developer.mozilla.org/en-US/docs/Gecko/Embedding_Mozilla.

  4. @Kilian:
    Soweit ich sehen kann, muss der WebNavigator geändert werden, damit das Chrome Frame-Plugin funktioniert. Zumindest habe ich einen Ansatz dafür im Internet gefunden. Generell sind Plugins jedoch nicht deaktiviert im WebNavigator (z.B. funktioniert das ieSpell-Plugin).

  5. @Michael:
    Offenbar sind InternetExplorer-Plugins im eingebetteten IE nicht aktiv. Ich habe z.B. Chrome Frame im IE9 installiert, wenn ich jedoch eine Chrome-Frame-fähige Seite mit dem WebNavigator öffne, wird das Plugin nicht aktiv.
    Gibt es eine Möglichkeit, IE-Plugins im Navigator zu aktivieren? Falls nicht wäre das ebenfalls eine willkommene Erweiterung.

  6. @Michael:
    Ja, ich freue mich auch, wenn wir durch unsere Diskussionen im Blog zur Verbesserung des Gesamtsystems beitragen können.

    Was die Tastaturevents angeht, kann ich Ihr Problem nachvollziehen. Ich wundere mich nur, wie Sie das im Falle der anderen Tasten machen, z.B. bei <Enter>. Ich bin davon ausgegangen, dass Sie Tastaturevents an den eingebetteten IE weitergeben (ohne dass Sie die Events mit eigenen Kommandos nachbilden müssen), damit der dann damit macht, was er für richtig hält (also die entspr. Aktion, die er auch sonst beim Druck der jeweiligen Taste ausführen würde).

  7. @Kilian:
    Übrigens finde ich es sehr schön, dass Sie sich so für den Blog-Beitrag interessieren. Sollte sich das EvtMouse realisieren lassen, wäre ja auch wieder eine kleine Verbesserung durch den Blog in CONZEPT 16 ‚eingeflossen‘.

  8. @Kilian:
    Zu 1) Ja das stimmt. Mit der Weitergabe des Tabulators alleine ist es jedoch nicht getan: es müsste ja zusätzlich auch eine Aktion bei WinWbnExecCommand geben, damit auch der Fokus zum nächsten bzw. vorherigen Objekt gesetzt werden kann. Dafür habe ich jedoch keine Lösung gefunden.

    Zu 2) Ich werde überprüfen, ob sich das Ereignis EvtMouse einbauen lässt.

  9. @Michael:
    1) Aber Sie geben doch jetzt bereits z.B. das Event "<Enter> gedrückt" sowie sämtliche Events auf den Buchstabentasten weiter, wieso sollte nicht dasselbe mit jeder beliebigen anderen Taste möglich sein?
    Schön wäre es, wenn man in einem Key-Event selber entscheiden könnte, ob und wenn ja welche Events weitergegeben werden sollen, so ähnlich wie hier im Artikel beschrieben nur eben noch viel umfassender, z.B. indem für die Weitergabe der Events die neue Funktion WinWbnExecCommand() benutzt wird o.ä.

    2) Ja, das ist mir klar, denn um zu wissen, was im eingebetteten Objekt genau passiert ist, müsste man dann ja dessen Events abfangen und damit wären wir dann wieder bei meiner Ausgangsfrage.
    Aber hier würde es vermutlich zunächst einmal genügen, wenn man das ja bereits vorhandene EvtMouse-Event nutzen könnte, um zu unterbinden, dass bestimmte Klick-Events an das im Navigator eingebettete Objekt gesendet werden.

  10. @Kilian:
    Für die Tabulator-Taste habe ich leider im Moment auch keine Lösung. Bezüglich des EvtMouse-Ereignisses können wir jedoch eine Lösungsmöglichkeit prüfen. Jedoch wäre der Einsatz des EvtMouse-Ereignisses ziemlich begrenzt, da z.B. nicht ermittelt werden kann, auf welches Objekt geklickt wurde, etc.

  11. Zwei weitere Sachen, die im Zusammenhang mit dem WebNavigator nützlich wären:

    Man sollte Mouse- und Key-Events abfangen und je nach Wunsch an den eingebetteten IE weiterleiten (oder eben auch nicht) können.

    Beispiel 1: In der Regel möchte man, dass das Drücken der Tabulator-Taste weitergegeben wird, damit man durch die Felder eines angezeigten Formulars schrittweise durchgehen kann, dies geht momentan im WebNavigator nicht.

    Beispiel 2: Ich würde gern das Öffnen des Rechtsklicksmenüs beim eingebetteten IE unterbinden, dies geht aber derzeit nicht. Auch wenn z.B. das EvtMouse-Event abgefangen wird, wird die Eventfunktion bei einem Mausklick nur solange aufgerufen, wie der WebNavigator kein Dokument geladen hat.

  12. @Michael:
    Mir kam gerade noch eine andere Idee, die dem, was ich eigentlich machen wollte, nahe kommt und somit wahrscheinlich auch illustriert, was ich meine:

    Wenn man einen Dialog erstellt, der einen Webnavigator enthält und gleichzeitig auf einem Socket lauscht, kann man über diesen Socket mit dem WebNavigator kommunizieren. Die Requests des Navigators dienen als Events, die im EvtSocket desselben Dialogs abgefangen werden können. Der Webnavigator bekommt als Ressource die Adresse http://localhost:<Port>/usw…. Alle nachfolgenden Dokumente werden über den Socket ausgeliefert, somit lässt sich der Inhalt des Webnavigators dann aus der C16-Umgebung steuern.

    Eine Kommunikation in dieser Art nur ohne Socket, sondern mittels anderer Events (evtl. bieten eingebettete COM-Objekte da ja noch andere Möglichkeiten) hatte ich mir vorgestellt.

  13. @Kilian:
    Für die Interaktion (Navigation durch Webinhalte) gibt es bereits das Ereignis EvtChanged beim WebNavigator. Es wird ausgelöst, wenn eine andere Webseite geladen wurde.

  14. Ich habe die Situation so verstanden, dass der WebNavigator ein eingebettetetes Objekt zur Darstellung irgendwelcher Inhalte ist. Mit C16-Host meine ich die C16-Applikation, die dieses eingebettete Objekt umschliesst. Abfangen würde ich gerne Events, die das eingebetette Objekt sendet, wenn der Benutzer mit ihm interagiert.

    So in der Art 🙂

  15. Finde ich gut, dass der WebNavigator erweitert wird.

    Es wäre schön, wenn eine Möglichkeit geschaffen würde, Events aus dem WebNavigator im C16-Host zu behandeln, weil man dann mit der Kombination C16/WebNavigator interaktive Formulare bauen bzw. solche bereits vorhandenen Formulare auf HTML/Javascript-Basis in C16 wiederverwenden könnte.

    Auch das Einbetten anderer Engines für den WebNavigator (wie z.B. Gecko) wäre sicherlich eine gute Sache.

Kommentar abgeben