Inhaltsverzeichnis

12.5 Embedder (gb.qt4)

Die Klasse Embedder (gb.qt4) bietet ein Steuer-Element, über das X11-Fenster einer anderen X11-Anwendung in ein Gambas-Fenster eingebettet werden können. Die Klasse Embedder gilt mit gb.qt5 als veraltet und sollte nicht weiter eingesetzt werden! Hinweise zu den Hintergründen können Sie nachlesen, wenn Sie diesen Links folgen:

http://gambas.8142.n7.nabble.com/Embedder-depricated-in-gb-qt5-td52992.html
http://www.mail-archive.com/gambas-user@lists.sourceforge.net/msg20712.html

Die beeindruckenden Möglichkeiten der Klasse Embedder sollen in einem Projekt im → Abschnitt 12.5.4 gezeigt werden, bei dem Sie aus einem Gambas-Programm heraus ein anderes Programm starten und dessen Fenster in das Gambas-Programm einbetten. Wenn Sie zum Beispiel das Fenster des Editors LibreOffice-Writer einbetten, so können Sie einen Text im eingebetteten Fenster von LibreOffice-Writer schreiben oder bearbeiten, den Text speichern und in das PDF-Format umwandeln.

Das folgende Bild zeigt ein Gambas-Programm mit dem eingebetteten Fenster des Programms 'GnuPlot', dem als Argument eine Skript-Datei mit GnuPlot-Befehlen mitgegeben wurde:

A

Abbildung 12.5.1: Programm 'GnuPlot' – eingebettet in ein Gambas-Programm

12.5.1 Eigenschaften

Von der Klasse Embedder werden nur wesentliche Eigenschaften beschrieben:

EigenschaftDatentypBeschreibung
ClientIntegerGibt die X11-Fensterkennung der einzubettenden (externen) Anwendung zurück.
HandleIntegerLiefert das interne X11-Fenster-Handle des Steuer-Elementes.

Tabelle 12.5.1.1 : Eigenschaften der Klasse Embedder

12.5.2 Methoden

Die Klasse Embedder verfügt u.a. über diese Methoden:

MethodeBeschreibung
Embed ( Client As Integer )Bettet das Fenster einer anderen X11-Anwendung ein. Das Argument 'Client' ist die Kennung des einzubettenden X11-Fensters. Es sollte vorbereitend geklärt sein, dass der Client dem XEmbed-Protokoll (weitgehend) folgt.
Discard ( )Löst das eingebettete Fenster aus dem Embedder.

Tabelle 12.5.2.1 : Ausgewählte Methoden der Klasse Embedder

12.5.3 Ereignisse

Von der Klasse Embedder werden Sie vor allem diese Ereignisse benutzen:

EreignisBeschreibung
Embed ( )Das Ereignis wird ausgelöst, wenn das Client-Fenster (erfolgreich) eingebettet wurde.
Error ( )Das Ereignis wird ausgelöst, wenn das Einbetten des Client-Fensters fehlgeschlagen ist.
Close ( )Das Ereignis wird ausgelöst, wenn die eingebettete Anwendung beendet wird.

Tabelle 12.5.3.1 : Methoden der Klasse Embedder

12.5.4 Projekt

Diese Hinweise sollten Sie beachten:

  1. Zuerst wird die Liste mit allen Top-Level-Fenstern aktualisiert → Zeile 14.
  2. Dann werden nur die X11-IDs der Top-Level-Fenster in einem Integer-Array gespeichert → Zeile 17, deren Fenster-Titel einem vorgegebenen Muster → Zeilen 9 und 16 entsprechen.
  3. Abschließend wird das letzte Element im Integer-Array → Zeile 21 als aktuelles Argument für die Embed(..)-Methode → Zeile 22 eingesetzt.

Hier sehen Sie einen Auszug aus dem Quelltext:

[1][2] Public Sub btnEmbed_Click()  
[3]   Dim sPattern As String
[4]   Dim iX11Id As Integer
[5]   Dim DTWindow As DesktopWindow
[6]   Dim aX11List As New Integer[]
[7][8] ' Version mit vorgegebener URL
[9]   sPattern = "*Firefox*"
[10]   hProcess = Shell "firefox http://www.gambas-buch.de/dw/doku.php" For Read As "hProcess"
[11][12]   Wait fWaitPeriod
[13]   
[14]   Desktop.Windows.Refresh ' Aktualisiert die Liste aller Top-Level-Fenster
[15]   For Each DTWindow In Desktop.Windows
[16]     If DTWindow.VisibleName LIKE sPattern Then
[17]        aX11List.Add(DTWindow.Id)
[18]     Endif    
[19]   Next
[20] 
[21]   Try iX11Id = aX11List[aX11List.Max]
[22]   Try embX11.Embed(iX11Id)
[23]   If Error Then Message.Warning(Error.Text)
[24]   
[25] End ' btnEmbed_Click()  
[26]

In der Zeile 9 wird das Suchmuster definiert, während in der Zeile 10 das Programm gestartet wird, dessen Fenster in das Gambas-Programm eingebettet werden soll. Selbstverständlich können Sie diesem Programm auch geeignete Parameter mitgeben, um beispielsweise im Webbrowser Firefox sofort eine bestimmte Webseite anzuzeigen zulassen. Das funktioniert aber nur dann fehlerfrei, wenn kein weiteres Firefox-Fenster existiert oder in den Einstellungen des Firefox folgendes steht:

B

Abbildung 12.5.4.1: Firefox-Fenster im Gambas-Projekt-Programm

Bei der Erprobung des Projekts können Ihnen diese Hinweise helfen:

C

Abbildung 12.5.4.2: Gambas-Programm-Fenster – eingebettet im Gambas-Projekt-Programm

Hier sehen Sie die Liste der erprobten Programme, deren Fenster erfolgreich in das Gambas-Programm eingebettet werden konnten.

sPattern = "*VLC*"
hProcess = Shell "vlc" For Read As "hProcess"

sPattern = "*Bluefish*"
hProcess = Shell "bluefish" For Read As "hProcess"
  
sPattern = "*Dokument*"
hProcess = Shell "abiword" For Read As "hProcess"

' Allgemeine Version  
sPattern = "*Firefox*"
hProcess = Shell "firefox" For Read As "hProcess"

' Version mit vorgegebener URL
sPattern = "*Firefox*"
hProcess = Shell "firefox http://www.gambas-buch.de/dw/doku.php" For Read As "hProcess"
  
sPattern = "hans@linux: ~"
hProcess = Shell "gnome-terminal" For Read As "hProcess"

sPattern = "*Gambas 3*"
hProcess = Shell "gambas3" For Read As "hProcess"

sPattern = "*Bild-Betrachter*"
hProcess = Shell "gbr3 " & Application.Path &/ "GPE/gpe.gambas" For Read As "hProcess"
  
' Allgemeine Version
sPattern = "*Dokument*"
hProcess = Shell "evince --fullscreen" 

' Version mit vorgegebener PDF-Datei 
sPattern = "*k25.1.13.pdf*"
hProcess = Shell "evince --fullscreen " & Application.Path &/ "Text/k25.1.13.pdf" For Read As "hProcess"
  
' Allgemeine Version
sPattern = "*LibreOffice Writer*"
hProcess = Shell "soffice --writer --nologo"
  
' Version mit vorgegebener ODT-Datei  
sPattern = "*LibreOffice Writer*"
hProcess = Shell "soffice --writer --nologo " & Application.Path &/ "Text/k25.1.13.odt" For Read As "hProcess"
  
sPattern = "*Gnuplot*"  
hProcess = Shell "gnuplot -persist " & Application.Path &/ "GnuPlotScripts/start.plot" For Read As "hProcess"

Bei den Programm-Tests vom Autor Ingo Beckert funktionierte selbst das fehlerfrei – ein Windows-Programm aus einem Gambas-Programm heraus über die Laufzeitumgebung Wine starten:

sPattern = "*Ole*" 
hProcess = Shell "wine oleview" For Read As "hProcess"

Download