Abfrage, ob Dialog geöffnet ist

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

Moderator: Moderatoren

erikafuchs
******
Beiträge: 690
Registriert: Di, 13.02.2007 17:38
Wohnort: Büttelborn

Abfrage, ob Dialog geöffnet ist

Beitrag von erikafuchs »

Wenn ich zwei Dialoge benutze, wie kann ich abfragen, ob einer geöffnet ist? Den ersten starte ich mit

Code: Alles auswählen

oDialog.execute()
, nachdem ich ihn z.B. mit

Code: Alles auswählen

oDialog=createUnoDialog(DialogLibraries.Rechentrainer.RechnenDialog)
definiert habe. Eine Abfrage "oDialog.ist sichtbar" würde ja, wenn es ihn gäbe, eine Fehlermeldung anzeigen, da es oDiaolg im Zweifelsfall nicht gäbe.
Ist diese Frage so verständlich?
Toxitom
********
Beiträge: 3768
Registriert: Di, 12.08.2003 18:07
Wohnort: Wiesbaden
Kontaktdaten:

Re: Abfrage, ob Dialog geöffnet ist

Beitrag von Toxitom »

Hey Pit,

Ein Fenster liesse sich theoretisch über den StarDesktop identifizieren - also auch, ob es offen ist.

Details erspare ich mir hier - es ist der falsche Weg;)

Mit

Code: Alles auswählen

oDialog.execute()
hälst Du ja Deinen Programm-Ablauf an genau dieser Stelle an - und es geht erst weiter, wenn der Dialog beendet wird.

Wenn Du jetzt parallel weiter Programme starten möchtest.... Ich rate dringend ab davon - Basic ist kein Multitask-fähige Programmiersprache.

Der Weg wäre:

Du startest den oder die Dialoge in einem Programm, setzt diese aber nur .visible . Dadurch bleibt das Programm nicht stehen und läuft weiter. Die Dialoge musst Du nun aber selbst kontrollieren. Sie würden automatisch geschlossen, wenn Dein Makro seine "end" Anweisung erreicht. Um das zu verhindern, erzeugst Du eine Endlosschleife mit einer Variablen. Die wird über Routinen gesetzt, die über Aktionen der Dialoge gesteuert werden. Dann kannst Du das auch realisieren.

Also konkret:

Code: Alles auswählen

dim bFlag as boolean
dim oDlg1 as variat
dim oDlg2 as variant

function DialogeOeffnene
  REN hier die Dialoge erzeugen und voreinstellen
  oDlg1.setVisible(true)
  oDlg2.setVisible(true)
  REM Warteschleife
  do while not bFlag
    wait 100
  loop
  REm
  '...Auswertungen oder ähnliches starten
  
  REM Dialoge beenden
  oDlg1.setVisible(false)
  oDlg2.setVisible(false)

end function

REM Funktion zum Beenden des Dialoges - aufrufen über Button, Eingaben oder ähnliches
sub DlgEnde
  bFlag = true
end sub

(Grundgerüst... nicht getestet)

Das wäre aber der Weg, mehrere Dialoge gleichzeitig am Laufen zu haben;)

VG
Tom
Unterstützer LibreOffice, zertifizierter Trainer und Berater
Bücher: LibreOffice 6- Einstieg und Umstieg
Makros Grundlagen - LibreOffice / OpenOffice Basic
erikafuchs
******
Beiträge: 690
Registriert: Di, 13.02.2007 17:38
Wohnort: Büttelborn

Re: Abfrage, ob Dialog geöffnet ist

Beitrag von erikafuchs »

Lieber Tom,
vielen Dank, das Erste geht schon. Ich hatte das mit ... loop while ... so Ähnlich schon probiert, aber anscheinend nicht richtig. Das geht jetzt.
Den Unterschied zwischen oDialog.execute und .setvisible, kenne ich, Dank Deines Buches auch. Ich zeige das hier mal:
https://www.dropbox.com/s/8ikyj543wkmj8 ... e.jpg?dl=0 (mir gelingt es nicht hier ein Bild einzufügen.)
Der obere Dialog wird mit execute geöffnet, der untere mit setvisible. Nach Eingabe bei "1", klickt man auf "2", der Punkt wird gezählt, dann auf "3", die nächste Aufgabe kommt. Das obere Fenster schließt sich nach 10 Aufgaben. Dadurch, dass es mit execute erzeugt wird, kann man auch nichts auf dem drunterliegenden Tabellenblatt ändern (da muss ich zeitweise den Schutz entfernen). Mein Code hat jetzt wohl mehr als 15000 Zeilen, den möchte ich ungerne ändern.
Nach dem Klick auf Start (oben), erscheint zunächst aber nur das untere Fenster und ich möchte dem ungeübten Nutzer signalisieren, dass er nicht zuerst auf "nächste Aufgabe" klickt, sondern zunächst links einen Aufgabentyp wählen muss - was den oberen Dialog öffnet. Dazu müsste ich halt wissen, ob dieser schon geöffnet ist.
Pit
erikafuchs
******
Beiträge: 690
Registriert: Di, 13.02.2007 17:38
Wohnort: Büttelborn

Re: Abfrage, ob Dialog geöffnet ist

Beitrag von erikafuchs »

Lieber Tom,
vielen Dank, das Erste geht schon. Ich hatte das mit ... loop while ... so Ähnlich schon probiert, aber anscheinend nicht richtig. Das geht jetzt.
Den Unterschied zwischen oDialog.execute und .setvisible, kenne ich, Dank Deines Buches auch. Ich zeige das hier mal:
https://www.dropbox.com/s/8ikyj543wkmj8 ... e.jpg?dl=0 (mir gelingt es nicht hier ein Bild einzufügen.)
Der obere Dialog wird mit execute geöffnet, der untere mit setvisible. Nach Eingabe bei "1", klickt man auf "2", der Punkt wird gezählt, dann auf "3", die nächste Aufgabe kommt. Das obere Fenster schließt sich nach 10 Aufgaben. Dadurch, dass es mit execute erzeugt wird, kann man auch nichts auf dem drunterliegenden Tabellenblatt ändern (da muss ich zeitweise den Schutz entfernen). Mein Code hat jetzt wohl mehr als 15000 Zeilen, den möchte ich ungerne ändern.
https://www.dropbox.com/s/z5pp552sb0s8v ... g.jpg?dl=0
Nach dem Klick auf Start (oben), erscheint zunächst aber nur das untere Fenster und ich möchte dem ungeübten Nutzer signalisieren, dass er nicht zuerst auf "nächste Aufgabe" klickt, sondern zunächst links einen Aufgabentyp wählen muss - was den oberen Dialog öffnet. Dazu müsste ich halt wissen, ob dieser schon geöffnet ist.
Pit
Toxitom
********
Beiträge: 3768
Registriert: Di, 12.08.2003 18:07
Wohnort: Wiesbaden
Kontaktdaten:

Re: Abfrage, ob Dialog geöffnet ist

Beitrag von Toxitom »

Hey Pit,
...Dazu müsste ich halt wissen, ob dieser schon geöffnet ist...
Na, in der Konstellation: Setz doch einfach ein globales Flag (dim außerhalb der Prozedur) und frag das ab - fertig.

Code: Alles auswählen

...
bDlgOffen = true
oDlg1.execute()
bDlgOffen = false
....
Flag wird gesetzt in der Zeile vor Execute -> signalisiert also, der Dialog existiert und ist sichtbar.
Wird er beendet geht das Makro in der nächsten Zeile weiter --> flag wird wieder auf false gesetzt.

Und dann etwas Feinarbeit im zweiten Dialog: wenn Dlg1 nicht offen (also Flag nicht gesetzt), ist der Button "nächste Aufgabe" nicht enable...also ausgegraut :))

VG
Tom
Unterstützer LibreOffice, zertifizierter Trainer und Berater
Bücher: LibreOffice 6- Einstieg und Umstieg
Makros Grundlagen - LibreOffice / OpenOffice Basic
erikafuchs
******
Beiträge: 690
Registriert: Di, 13.02.2007 17:38
Wohnort: Büttelborn

Re: Abfrage, ob Dialog geöffnet ist

Beitrag von erikafuchs »

Ja, klar!
Danke
erikafuchs
******
Beiträge: 690
Registriert: Di, 13.02.2007 17:38
Wohnort: Büttelborn

Re: Abfrage, ob Dialog geöffnet ist

Beitrag von erikafuchs »

Das funktioniert, ich bin aber nicht sicher, ob das ganz sauber läuft:
Ich habe jetzt also einen Dialog, der mit execute() geöffnet wird. Hier stehen die Aufgaben, der Inhalt wird immer geändert wenn eine Aufgabe gelöst wurde und nach 10 Aufgaben geschlossen.
Der zweite Dialog wird mit setvisble geöffnet - das steht, wie beschrieben in einer Schleife. Hier stehen die 2 ausgelosten Kandidaten. Nach Lösen einer Aufgabe wird ein neues Kandidatenpaar ausgelost und angezeigt. Durch Knopfdruck wird durch Ändern der Flag geschlossen, er kann aber eigentlich auch stehenbleiben für die nächste Aufgabengruppe. Das mit dem Schließen klappt immer nur recht zögerlich, manchmal garnicht und auf einem Computer in der Schule (mit LibreOffice) hängt sich nach Öffnen dieses Dialogs nach dem Programmstart das Mkaro auf und rödelt sehr lange - irgendwas stimmt da nicht. Toxitom sagt oben dass diese Makros nicht multitasfähig sind, vielleicht passiert da zu viel auf einmal.
Antworten