Schließenbutten im Dialogfeld

Antwort erstellen


BBCode ist eingeschaltet
[img] ist ausgeschaltet
[url] ist eingeschaltet
Smileys sind ausgeschaltet

Die letzten Beiträge des Themas
   

Ansicht erweitern Die letzten Beiträge des Themas: Schließenbutten im Dialogfeld

Re: Schließenbutten im Dialogfeld

von istdochtoll » Mi, 21.09.2011 12:07

Hi,
die Überlegung war, einem Objekt mehrere Listener anzuhängen (wie so auch immer).
Hab aber inzwischen gesehen, das ich bei dem Beispiel das mich auf diesen Gedanken gebracht hat nicht ordentlich geschaut haben 8)

MfG

Re: Schließenbutten im Dialogfeld

von DPunch » Di, 20.09.2011 20:47

Aloha
istdochtoll hat geschrieben:kleine Rückfrage, es könnte aber ein Array mit Listener an „addTopWindowListener“ übergeben werden?
Ob es technisch möglich ist (ohne Fehlermeldung) kann ich Dir aus dem Kopf zwar nicht sagen, aber es widerspricht sowohl der API als auch der Logik.
Warum solltest Du ein Array aus Listenern übergeben wollen, wenn einer schon alle Events abräumt? Wofür wäre das Array gut?

Re: Schließenbutten im Dialogfeld

von istdochtoll » Di, 20.09.2011 14:44

Hallo DPunch,

kleine Rückfrage, es könnte aber ein Array mit Listener an „addTopWindowListener“ übergeben werden?
Ich bin zwar selbst nicht mehr frisch, aber frisch auf dem OpenOffice-Gebiet.
MfG

Re: Schließenbutten im Dialogfeld

von DPunch » Mo, 19.09.2011 13:44

Aloha
istdochtoll hat geschrieben:Was den Laufzeitfehler angeht, ist es wohl nötig sämtliche Methoden von "XTopWindowListener"
Das ist korrekt.
istdochtoll hat geschrieben:"addTopWindowListener(.." erwartet wohl ein Array mit Listner.
Das ist nicht korrekt.

Re: Schließenbutten im Dialogfeld

von istdochtoll » Sa, 17.09.2011 19:14

Hallo,
ich hatte ähnliche Probleme, dafür war dieser thread schon mal sehr Hilfreich, Danke!
Was den Laufzeitfehler angeht, ist es wohl nötig sämtliche Methoden von "XTopWindowListener" zu instanzieren, dann sollte es gehen!
Ich hab jetzt nicht alles gelesen, was hier steht, darum vielleicht hier etwas was schon beantwortet wurde.
Er "addTopWindowListener(.." erwartet wohl ein Array mit Listner.
Übrigens hat mir auch bei der Lösung die Extension " http://extensions.services.openoffice.o ... 0templates geholfen.
Manchmal muss man bei dieser Website (mit den Extensions) den Aufruf wiederholen (hat mich zuerst ein wenig verwirrt), aber irgendwann wirds angezeigt.
Gruß

Re: Schließenbutten im Dialogfeld

von Stephan » So, 16.01.2011 21:17

Den Laufzeitfehler in Deinem Code kannst Du im Übrigen umgehen, indem Du den Listener erst nach dem sichtbar Machen hinzufügst.
Prima.


Gesamtlösung wäre damit dann:

Code: Alles auswählen

Option explicit
Global _MyDialog as Object
Global Marker as boolean
Global winlist As Object

Sub Main
Dim oDlgModel as object
if not Marker Then
   DialogLibraries.loadLibrary("Standard")
   _MyDialog = CreateUNODialog(DialogLibraries.Standard.Dialog1)   
   oDlgModel = createUnoService("com.sun.star.awt.UnoControlDialogModel")
   
   _MyDialog.setModel(oDlgModel)
   _MyDialog.Visible = True
   
    winlist = CreateUnoListener("jms_", "com.sun.star.awt.XTopWindowListener")
   _MyDialog.addTopWindowListener(winlist)
   
   Marker = True
endif
End Sub


sub jms_windowClosing()
_MyDialog.removeTopWindowListener(winlist)
_MyDialog.setVisible(false)
End Sub

sub jms_windowActivated()
'dummy
End Sub

sub jms_windowDeactivated()
'dummy
End Sub


Gruß
Stephan

Re: Schließenbutten im Dialogfeld

von DPunch » So, 16.01.2011 21:08

Stephan hat geschrieben:Doch, das funktioniert problemlos mittels Listener, den entsprechenden Code hatte ich bereits hier im Thread gepostet, siehe 4. Codeblock im post:
posting.php?mode=reply&f=18&t=46344#pr167132
Da habe ich mich falsch ausgedrückt.
Per zusätzlichem Listener geht das freilich, ich hatte lediglich erklären wollen, warum ein nur angezeigter Dialog nicht ohne quasi-Workaround geschlossen werden kann.

Den Laufzeitfehler in Deinem Code kannst Du im Übrigen umgehen, indem Du den Listener erst nach dem sichtbar Machen hinzufügst.

Re: Schließenbutten im Dialogfeld

von Stephan » So, 16.01.2011 20:40

Das schliessen eines Dialogs, der nur angezeigt, aber nicht ausgeführt wird (wie es bei Dir der Fall ist), über des "x" in der rechten oberen Ecke kann nicht funktionieren, soweit ich weiss.
Doch, das funktioniert problemlos mittels Listener, den entsprechenden Code hatte ich bereits hier im Thread gepostet, siehe 4. Codeblock im post:
posting.php?mode=reply&f=18&t=46344#pr167132

Einzig ist es natürlich unbequem den kompletten Dialog (inklusiv Steuerelementen) zur Laufzeit per Code erzeugen zu müssen, weil ja der andere Aufruf des Dialog nicht ohne Laufzeitfehler funktioniert, wobei ich mir nicht im KLaren bin ob das meine Unfähigkeit ist oder ein Fehler in OOo.


Gruß
Stephan

Re: Schließenbutten im Dialogfeld

von DPunch » So, 16.01.2011 20:26

Aloha

Das schliessen eines Dialogs, der nur angezeigt, aber nicht ausgeführt wird (wie es bei Dir der Fall ist), über des "x" in der rechten oberen Ecke kann nicht funktionieren, soweit ich weiss.
Intern wird dadurch lediglich ein .endExecute aufgerufen. Der Dialog wird aber nicht ausgeführt. Daher passiert auch nichts.

Im Endeffekt hast Du also nur zwei Möglichkeiten:
a) Du setzt einen modalen Dialog ein, startest ihn per .execute und kannst während der Ausführung nicht auf das aufrufende Dokument zugreifen

b) Du setzt einen nichtmodalen Dialog ein, aber musst mit dem "Schönheitsfehler" leben

Re: Schließenbutten im Dialogfeld

von Stephan » So, 16.01.2011 20:07

Aber das Dialogfenster soll ja nicht Selbstzweck sein, sondern dort sollen ein TextFields und mindestens zwei CommandButtons ´drin erscheinen. Ich habe schon gesehen, dass diese bei CreateUNODialog(DialogLibraries.Standard.Dialog1) als Controls erscheinen. Diese controls habe ich versucht, in createUnoService( "com.sun.star.awt.UnoControlDialog" ) einzusetzen. Aber wie erwartet, funktioniert dies mit keiner Methode, ob nun getcontrol, setcontrol oder addcontrol.

?
verstehe ich leider nicht was das meint, auch da ich garnicht weiß wie der Code aussieht mit dem Du das versucht hast. Du müßterst einfach diesen Code posten.
Aber das Dialogfenster soll ja nicht Selbstzweck sein, sondern dort sollen ein TextFields und mindestens zwei CommandButtons ´drin erscheinen.
Dann verstehe ich aber nicht warum Du etwas völlig Anderes schreibst und den Umstand das es Dir um Steuerelemente geht nicht mit einer Silbe erwähnst.
Nö, automatisch klar ist das niemanden, denn mir war ja bisher nicht einmal klar das Du Dich überhaupt auf mein zweites Beispiel bezogst.
Ich bräuchte also ein Beispiel, wie man in das mit createUnoService( "com.sun.star.awt.UnoControlDialog" ) erzeugte Object die Buttons und das Textfeld einfügt.
z.B. siehe:
http://www.oooforum.org/forum/viewtopic.phtml?p=11765

dort wird ein Dialog mit Steuerelementen mittels Code erstellt



Gruß
Stephan

Re: Schließenbutten im Dialogfeld

von Stephan » So, 16.01.2011 18:17

Mein Problem ist jetzt, dass ich nicht weiß, wie ich den Dialog1, der in der gleichen Bibliothek ("Standard") wie der Code liegt, in das Dialogfenster hineinbekomme. Ich bekomme immer nur ein leeres Dialogfenster mit dem Button "x".
Ich habe keine Ahnung was das heißen soll.

(Ein Dialog ist ein Dialog und ich verstehe nicht wie man den in ein Dialogfenster rein bekommen soll denn das Dialogfenster ist ja der Dialog selbst.)
Setzte ich stattdessen _myDialog auf CreateUNODialog(DialogLibraries.Standard.Dialog1), dann funktioniert zwar der "x"-Button wie gewünscht, auch mein Dialog funktioniert, aber ich bekomme zuvor einen Basic-Error, dass eine Methode oder Funktion $ARG1 nicht gefunden worden wäre.
Und GANZ GENAUSO geht es mir auch UND GENAU DAS hatte ich auch bereits geschrieben:

Bei mir erzeugt das spontan jedoch einen Laufzeitfehler, um anschließend zu funktionieren, warum das so ist habe ich derzeitig keine Ahnung.


Gruß
Stephan

Re: Schließenbutten im Dialogfeld

von Stephan » So, 16.01.2011 16:23

Ob die 3 CodeZeilen nötig sind, weiß ich nicht.
verstehe ich nicht was das heißen soll, da Du natürlich der Einzige bist der entscheiden kann was DEin Code notwendigerweise können muß. Ich kann das jedenfalls weder wissen noch entscheiden.

Technisch, gibt es jedoch zwei Möglichkeiten der Dialoganzeige, die ich ja bereits nannte, nämlich mittels:

Code: Alles auswählen

_MyDialog.Visible = True
oder mittels:

Code: Alles auswählen

_MyDialog.Execute
und ERsteres ergibt einen nichtmodalen Dialog (also es ist möglich bei aktiven Dialog auch noch ins Dokument zu klicken und Änderungen vorzunehmen) und Zweiteres ergibt einen Modalen Dialog.

Welchen Dialog Du brauchst ist hingen EINZIG DEINE Entscheidug , aber icvh wiederhole mich.


Gruß
Stephan

Re: Schließenbutten im Dialogfeld

von Stephan » So, 16.01.2011 13:25

Code: Alles auswählen

   oDlgModel = createUnoService("com.sun.star.awt.UnoControlDialogModel")
   _MyDialog.setModel(oDlgModel)
   _MyDialog.Visible = True
Dieser Code-Teil ist sehr interessant, habe ich soo noch nicht gesehen, aber kommen wir zum Wesentlichen:

Ist denn ein nicht-modaler Dialog nötig?

Reicht nicht ein 'normaler' Dialogstart mittels:

Code: Alles auswählen

_MyDialog.Execute

Falls das nicht reicht ist die Lösung das [x] zum Funktionieren zu bewegen kompliziert und aufwendig.

Das [x] müßte über einen Window-Listener kontrolliuert weerden, was prinzipiell so ginge:

Code: Alles auswählen

Option explicit
Global _MyDialog as Object
Global Marker as boolean
Global winlist As Object

Sub Main
Dim oDlgModel as object
if not Marker Then
   DialogLibraries.loadLibrary("Standard")
   _MyDialog = CreateUNODialog(DialogLibraries.Standard.Dialog1)   
   oDlgModel = createUnoService("com.sun.star.awt.UnoControlDialogModel")
   
   winlist = CreateUnoListener("jms_", "com.sun.star.awt.XTopWindowListener")
   _MyDialog.addTopWindowListener(winlist)
   
   _MyDialog.setModel(oDlgModel)
   _MyDialog.Visible = True
   Marker = True
endif
End Sub


sub jms_windowClosing()
_MyDialog.removeTopWindowListener(winlist)
_MyDialog.setVisible(false)
End Sub

sub jms_windowActivated()
'dummy
End Sub

sub jms_windowDeactivated()
'dummy
End Sub
Bei mir erzeugt das spontan jedoch einen Laufzeitfehler, um anschließend zu funktionieren, warum das so ist habe ich derzeitig keine Ahnung.

Das Ganze macht aber beispielsweise keine Schwierigkeiten wenn der Dialog zur Laufzeit erstellt wird:

Code: Alles auswählen

Option explicit
Global _MyDialog as Object
Global Marker as boolean
Global winlist As Object

Sub dialog_erstellen()
Dim oDlgModel as object
oDlgModel = createUnoService( "com.sun.star.awt.UnoControlDialogModel" ) 
With oDlgModel
.setPropertyValue("Width", 213)
.setPropertyValue("Height", 40)
End With
_MyDialog = createUnoService( "com.sun.star.awt.UnoControlDialog" )

winlist = CreateUnoListener("jms_", "com.sun.star.awt.XTopWindowListener")
_MyDialog.addTopWindowListener(winlist)

_MyDialog.setModel(oDlgModel)

_MyDialog.setVisible(true)

End Sub


sub jms_windowClosing()
_MyDialog.removeTopWindowListener(winlist)
_MyDialog.setVisible(false)
End Sub

sub jms_windowActivated()
'dummy
End Sub

sub jms_windowDeactivated()
'dummy
End Sub

Gruß
Stephan

Re: Schließenbutten im Dialogfeld

von Stephan » So, 16.01.2011 11:31

Er reagiert zwar in der Anzeige auf anklicken. Allerdings bewirkt dieses Anklicken rein gar nichts :(
mutmaßlich ist im Eigenschaftendialog des Dialogs die Eigenschaft "Aktiviert" auf Nein gesetzt.

Ansonsten müßtest Du wohl eine Beispieldatei zur Verfügung stellen, und/oder den Code posten der den Dialog aufruft, denn einen offensichtlichen Grund sehe ich nicht)
noch eine Merkwürdigkeit ist mir aufgefallen. In der Eigenschaftentabelle füe den Dialog gibt es ganz unten eine Zeile "Mit Titelleiste". Wird diese Eigenschaft auf "Ja" gesezt, so wird die Titelleiste in der Layoutdarstellung sichtbar, auf "Nein" ist sie unsichtbar. Soweit so gut. Allerdings ist es für die Darstellung in der Anwendung völlig schnuppe, wie dieser Wert gesetzt ist. Dort erscheint diese Leiste immer. Einzig ein evtl. vergebener Titel wird nicht angezeigt.
ich vermute diese Eigenschaft ist einfach noch nicht implementiert

(Du kannst das gerne auch Programmfehler nennen, denn mir liegt hier nicht daran Fehler zu verteidigen, der Hintergrund ist nur das wenn Du langfristig die Entwicklung von OOo beobachtest das Du immer wieder Details siehst, die in der Oberfläche bereits erreichbar sind aber noch keine Funktion haben und der Grund ist dann meist das man dabei ist sie zu implementieren, die Entwicklungsressourcen aber bisher núr gereicht haben die Bedienelmente zu implementieren und noch nicht die eigentliche Funktion - aus Sicht des Nutzers ist das natürlich verwirrend, häufig ist das aber genau der Grund des Ganzen)



Gruß
Stephan

Nach oben