per basic-Code gebauter Dialog zum Leben erwecken

Programmierung unter AOO/LO (StarBasic, Python, Java, ...)

Moderator: Moderatoren

DITA
***
Beiträge: 91
Registriert: Fr, 16.11.2012 16:23

per basic-Code gebauter Dialog zum Leben erwecken

Beitrag von DITA »

Hallo Leute,

brauche nochmals eure Hilfe. Nachdem R F3Total mich vor geraumer Zeit in die Richtung "geschubst" hat, wo ich hin wollte, komme ich jetzt leider nicht weiter.

Habe mir einen Dialog gebastelt, wie gewünscht nur per basic-Code, mit Schaltflächen, Kombinationsfeldern, Markierfeldern und so weiter
(ihr wisst selber was es da so alles gibt). Ich habe aber leider "nur" auf das optische geachtet.
Was mir jetzt nicht klar ist, wie kann ich meine gebauten makros mit den einzelnen Objekten "vertüddeln"????? Ich meine damit
diese Ereignisse Aktion ausführen, Text modifiziert, Status geändert, bei Fokusverlust, Taster gedrückt usw. und dann das entsprechende makro
da einbinden. Denn irgendwie muss ich den Dialog doch zum "leben" erwecken???

Ich habe die Übersetzung von Andrew Pitonyak gelesen, und Dannenhöfer's Website "gefragt", mri und xray (die nicht wirklich meine Freunde sind)
krieg ich mittlerweile zwar zum laufen, aber wenn man nicht genau weiß was man wie sucht, versteh ich da nur Bahnhof.
Wenn mir das jemand anhand eines Beispiels konkret von Anfang an erklären kann wäre das echt super.
Meine Versuche z.B für die Schaltfläche belaufen sich auf xray o_CMD_OK ergab ein leeres xray, wenn ich das "Model" (xray o_CMD_OK_Model) eingab, erschlug mich xray mit den Einstellungen für Größe, Position, Name usw. Wie gehe ich da dann weiter systematisch vor????

Hänge ne abgespeckte Version mal hier dran, vielleicht habt ihr ja sonst noch Verbesserungsvorschläge.
Calc Dialog nur per Code bauen.ods
(11.1 KiB) 84-mal heruntergeladen

Danke schon mal im Voraus

Gruss Dirk
F3K Total
********
Beiträge: 3704
Registriert: Mo, 28.02.2011 17:49

Re: per basic-Code gebauter Dialog zum Leben erwecken

Beitrag von F3K Total »

Moin,
habe dem OK-Button einen ActionListener zugefügt, klick mal drauf.

Code: Alles auswählen

.
.
.


    o_DLG.setModel(o_DLG_Model)
    
     
    oActionListener = createUnoListener("ActionListener_", "com.sun.star.awt.XActionListener")
    oControl = o_dlg.getControl("o_cmd_OK")
    oControl.addActionListener(oActionListener)
    
    
    oWindow = CreateUnoService("com.sun.star.awt.Toolkit")						'  Mittels des Modells den Dialog anzeigen
    o_DLG.createPeer(oWindow, null)
    o_DLG.getPeer().setProperty ( "NativeWidgetLook" , b_NativeLook )			' das ist die Zeile von oben - für farbige Buttons
    oTopWindowsListener = CreateUnoListener( "Top_Win_", "com.sun.star.awt.XTopWindowListener" )
    o_DLG.addTopWindowListener(oTopWindowsListener)
    o_DLG.setVisible(True)

End Sub


Sub ActionListener_actionPerformed(oEv)
  Hello_World
end sub
   
Sub ActionListener_disposing(oEv)
End Sub

Sub Hello_World
    msgbox "Hallihallo, da bin ich"
end sub
Gruß R
Dateianhänge
Calc Dialog nur per Code bauen.ods
(11.22 KiB) 98-mal heruntergeladen
DITA
***
Beiträge: 91
Registriert: Fr, 16.11.2012 16:23

Re: per basic-Code gebauter Dialog zum Leben erwecken

Beitrag von DITA »

Hallo R F3KTotal,

sorry, hatte im ersten Beitrag das K in Deinem Pseudonym unterschlagen - dass war keine Absicht.

Erst einmal vielen Dank, dass Du mir weiter hilfst, habe aber bestimmt noch die ein oder andere Frage dazu.
Ich möchte aber zuerst noch ein wenig probieren, im Moment ist mir z.B. noch unklar wie / wann / worauf dieser ActionListener reagiert.
Kann ich diesen ActionListener auch mit xray oder mri "untersuchen"???? vermute xray oControl??? (noch nicht getestet)
Möchte ja auch z.B. beim Verlassen eines Kombinationsfeldes etwas ausführen lassen, oder bei einem Markierfeld.

Danke schon mal bis hierher, werde mich bestimmt nochmal diesbezüglich melden

Gruss und danke
Dirk
Hiker
******
Beiträge: 590
Registriert: Mo, 08.09.2014 21:34
Wohnort: Berlin

Re: per basic-Code gebauter Dialog zum Leben erwecken

Beitrag von Hiker »

Einige Erklarungen von Stefan findest Du hier:
viewtopic.php?f=18&t=23862#p102135

Der Listener wird einem Element zugewiesen, hier einem Button. Im Prinzip weist Du den Event-Handler von LO an, eine bestimmte Routine von Dir aufzurufen, wenn der Button "gedrückt" wird. (System stellt fest, dass unter dem Klick etwas liegt, dies stellt sich als Object Button heraus, beim Button ist ein Listener hinterlegt, also soll eine Routine Aufgerufen werden, deren Name sich aus dem übergebenen Prefix mit Unterstrich und dem Ereignis, hier ActionPerformed zusammensetzt. Diese Routine(n) findest Du unterhalb im BASIC-Code.)

Wichtig ist vor allem zu merken, dass "ActionListener_" kein magisches Steuerwort ist, sondern von Dir gesetzt wird. F3K hätte auch "Hallihallo_" verwenden konnen, dann aber auch die BASIC-Sub Hallihallo_actionPerformed implementieren müssen.

Jörn
Libre Office 6.3.1 (Win 10 Pro) / Libre Office 6.0.7 (Win8.1 Pro, Win 7 Pro) / AOO (Win 7)
Mondblatt24
*******
Beiträge: 1129
Registriert: So, 14.05.2017 16:11

Re: per basic-Code gebauter Dialog zum Leben erwecken

Beitrag von Mondblatt24 »

@DITA,
DITA hat geschrieben: Do, 16.06.2022 20:00 sorry, hatte im ersten Beitrag das K in Deinem Pseudonym unterschlagen - dass war keine Absicht.
Es ist ja nicht so, dass Du Deine Beiträge nicht ändern/bearbeiten könntest, wenn Du angemeldet bist.

Screenshot_001 - 2022.png
Screenshot_001 - 2022.png (1.74 KiB) 2007 mal betrachtet


Gruß
Peter
Win 11 (x64) ▪ 24.2.1.2 (x64) ▪ AOO Portable 4.1.15
Wurde die Frage zutreffend beantwortet bitte den Betreff der Eingangsfrage mit [GELÖST] ergänzen. Beschreibung
craig22
****
Beiträge: 135
Registriert: Mi, 19.08.2020 13:47

Re: per basic-Code gebauter Dialog zum Leben erwecken

Beitrag von craig22 »

Hallo Dirk,
Dirk hat geschrieben:mri und xray (die nicht wirklich meine Freunde sind)
Wetten doch!:D

Anfangs habe ich mich auch gefragt was soll ich damit?
Die Frage wurde mir beantwortet, nachdem ich gelernt hatte die Inspection-Tools in Verbindung mit der jeweiligen API (LibreOffice/ OpenOffice) zu nutzen.
Am schwierigsten war dabei nicht das Verständnis für die Tools, sondern wie ich die API zu lesen und umzusetzen hatte.

Was machen mri und xray?
Sie zeigen Dir eine Benutzeroberfläche deren Inhalte aus der API gespeist werden.
Mehr noch, Sie zeigen an, wie z.B. das Struct SIZE oder POS zu „bilden“ und anzuwenden ist.
Auch die Listenener können inspiziert werden.

Beispiel an Ric’s Action-Listner:
Ein Listener muss zuerst registriert werden, es muss quasi ein Bereich im Arbeitsspeicher für den Listener reserviert werden und der Listener braucht einen Namen und einen Zeiger (Objektvariable).
Im Grunde hat Jörn dies bereist beantwortet.
Name: → ActionListener_
Zeiger auf das Listener_Objekt → oActionListener
Zeiger auf das Control_Objekt → oControl

Code: Alles auswählen

oActionListener = createUnoListener("ActionListener_", "com.sun.star.awt.XactionListener")
Nachdem der Listner registriert wurde, kann der Zeiger mittels mri oder xray inspiziert werden:

Code: Alles auswählen

xray oActionListener
Mit Klick auf Methoden im xray-Fenster, werden Dir die Methoden angeziegt, welche Du in Deinem Code als Sub-Routine verwenden kannst.
Beispiel anhand des Action-Listner.
Namen der Methoden:

Code: Alles auswählen

acquire
actionPerformed
disposing
queryInterface
Hier gibt es nur zwei Methoden die für Deinen Code erforderlich sind:
  • actionPerformed
    Ist die Methode, welche das Ereignis (Event) abfängt und bei Klick auf den Button eíne Aktion ausführt.
  • disposing
    Ist UNBEDINGT erforderlich, damit der Listener bei Beendigung des Programms aus dem Arbeitsspeicher entfernt wird, bzw. der reservierte Bereich des Speichers wieder freigegeben wird.
Hier eine sehr übersichtliche Seite aus der LibreOffice-API mit diversen Listenern.
Die einzelnen Felder des Diagramms dieser Seite sind weiterführende Links.

Ein Mouse-Listener.
Registrieren des Listeneners:

Code: Alles auswählen

oMouseListener=createUnoListener("MouseListener_","com.sun.star.awt.XmouseListener")

Methoden des Listners auslesen:

Code: Alles auswählen

xray oMouseListener
Namen der Methoden:

Code: Alles auswählen

acquire
disposing
mouseEntered
mouseExited
mousePressed
mouseReleased
queryInterface
release
Hier findest Du ein Beispielokument zum Mouse-Listener im engliscehn Forum:
Mouse-Listner

Mouse-Events:
https://api.libreoffice.org/docs/idl/re ... Event.html

Welcher Button wurde gedrückt?
https://api.libreoffice.org/docs/idl/re ... utton.html

Damit nun eine Reaktion auf ein Mausereignis erfolgt, bedarf es wiederum einer Sub-Routine.

Code: Alles auswählen

Sub MouseListener_mouseEntered
print "Mouse has entered!"
End Sub
MouseListener_ = Der Name , welcher dem Listener zugeordnet wurde:
oMouseListener=createUnoListener("MouseListener_","com.sun.star.awt.XmouseListener")

Dann folgt die Methode:
mouseEntered

Zusammengestzt sieht dies so aus:

Code: Alles auswählen

Sub MouseListener_mouseEntered
Jetzt fehlt noch die eigentliche Aktion, welche beim auslösen des Events erfolgen soll:

Code: Alles auswählen

print "Mouse has entered!"
mri und xray sind genial..., oder? 8)

Nachtrag:
Man kann auch das Event selbst mittels xray/mri auslesen
In Ric's Beispiel → xray oEv einfügen:

Code: Alles auswählen

Sub ActionListener_actionPerformed(oEv)
xray oEv
  Hello_World
end sub
Beim Mouse-Listener würde man als xray-Anwort die Anzahl der Mausklicks auslesen können,
welche Taste (Key-Konstante) gedrückt wurde,usw.

Code: Alles auswählen

Sub MouseListener_mousePressed(oEv)
xray oEv
print "Mouse has mousePressed!"
End Sub
Gruß

Craig
_____________________________________________________
WIN 10 Pro 64-Bit • LO 7.1.5.2 (x64) • AOO 4.1.8
DITA
***
Beiträge: 91
Registriert: Fr, 16.11.2012 16:23

Re: per basic-Code gebauter Dialog zum Leben erwecken

Beitrag von DITA »

Hallo Peter,

vielen Dank für Deinen Hinweis, jedoch finde ich es persönlich unhöflich, wenn man jemanden anspricht (dann noch falsch), dieser kompetent antwortet, und man dann erst den Fehler bemerkt - da kann ich mich für meinen Fehler der Nettikette halber kurz mit einem Satz entschuldigen.

Gruss Dirk
DITA
***
Beiträge: 91
Registriert: Fr, 16.11.2012 16:23

Re: per basic-Code gebauter Dialog zum Leben erwecken

Beitrag von DITA »

Hallo Jörn (Hiker),

Vielen Dank auch Dir - wenn man (ich) erst einmal den Weg aufgezeigt bekommt, und man sieht das man einen ActionListener braucht - und diesen dann noch "richtig" einbauen muss, ist man schon einen großen Schritt weiter.

Da ich absichtlich ja nur einen abgespeckten Dialog eingestellt hatte, um über den "vorgegebenen" Weg meine anderen Steuerelemente "selbst" zum Leben zu erwecken, ist Dank Deines Beitrages auch weiter fortgeschritten. Im Moment ist mir zwar noch einiges unklar, z.B. wie ich ein Beschriftungsfeld "entere" oder anklicke und somit ein anderes Makro starte, bzw. ein Textfeldinhalt auslese.

Für Deine Tipps (Link und Erklärung mit merke) möchte ich mich nochmals bedanken, werde versuchen das im weiteren Verlauf zu berücksichtigen.

Gruss Dirk
DITA
***
Beiträge: 91
Registriert: Fr, 16.11.2012 16:23

Re: per basic-Code gebauter Dialog zum Leben erwecken

Beitrag von DITA »

Hallo craig,

.... da hast Du die Wette wohl gewonnen

Wow, in Deiner Antwort steckt verdammt viel ...... Erklärung drin, da muss ich mich erst mal Stück für Stück durch arbeiten.

Vielen Dank erstmal für die Erläuterungen für xray, da ich das so Schritt für Schritt nachvollziehen kann und dann später wohl auch für andere Elemente ähnlich umsetzen kann.

Auch Deine Erklärungen und Links sind einfach super, denke da nur an den MouseListener, den ich ja auf jeden Fall brauche und jetzt sogar mit Möglichkeit das Drumherum mit xray zu untersuchen.

Vielen Dank für die xray- Einführung und die ausführliche Erklärung der Listener. (Brauche wahrscheinlich noch ne ganze Weile bis man (ich) es wirklich verstanden (kapiert)hat.)

Gruss und Danke
Dirk
Antworten