Frage zu Basic-Dialog (ist kein Problem)

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

Moderator: Moderatoren

Benutzeravatar
sven-my
*****
Beiträge: 358
Registriert: Fr, 14.12.2007 19:56

Frage zu Basic-Dialog (ist kein Problem)

Beitrag von sven-my »

Hallo Experten,

ich habe mir zur Anzeige verschiedenster Dinge, die gerade in einem Makro bearbeitet werden, einen Dialog zusammen-gezimmert (geklaut):

Code: Alles auswählen

sub main
	oDisplayAccess = CreateUnoService("com.sun.star.awt.DisplayAccess")
	oDisplay = oDisplayAccess.getByIndex(0)
	aRect = oDisplay.WorkArea
	bx = aRect.Width
	by = aRect.Height	'Dokumentfläche = by-70 (s. u.)/ Menue-Leiste zählt nicht zur Dokumentfläche
'msgbox bx & " , " & by
'exit sub
	faktor = 1.8	'aus irgenseinem Grund, auch bei Einfügen von Grafiken in Dokumente per Makro, nötig
	breite = 221	'aus Eigenschaften Dialog
	hoehe = 86	'aus Eigenschaften Dialog
	width = breite * faktor
	height = hoehe * faktor
	ru = 70			'Rand unten : Stausleiste + horizontale Bildlaufleiste
	x = bx/2 -(width/2)
	y = by -height -ru
	LT = "Position ausprobieren"

	Dim StatusDialog as object
	Dialoglibraries.Loadlibrary("Standard")
    StatusDialog= CreateUnoDialog(Dialoglibraries.Standard.Dialog1)

	StatusDialog.setPosSize(x,y,width,height,com.sun.star.awt.PosSize.POSSIZE)
    
    StatusDialog.visible = true
	StatusDialog.getControl("Label1").Text = LT

	for i = 1 to 100	'ohne diese Schleife wird bei mir der Dialog nicht angezeigt
		wait 10			
	next i
msgbox "Position ausprobieren beendet"
end sub
Damit mir andere Sachen, z.B. auf einem Tabellenblatt nicht verdeckt werden, oder z.B. eine Inputbox die Anzeige nicht verdecken, habe ich den Dialog nicht genau mittig haben wollen.

Klappt auch.

Unbequem ist nur, falls ich die Größe des Dialogs (B x H) ändere, muß ich die Eingaben aus den "Eigenschaften" per Hand in das Makro übertragen (Vergesslichkeit !).
Eigentlich müßte es ja möglich sein, diese Angaben vom Makro auslesen zu lassen.

Daher die Frage: wie ?
(Das Weglassen der Angaben [width,height], aber Kommata stehen lassen, in >setPosSize< klappt nicht)

gruß
sven-my

geändert (da hab' ich oben einen Fehler reingebracht):

Code: Alles auswählen

bx = aRect.Width
by = aRect.Height        	    'Bildschimfläche minuns Taskbar
win7 prof / AOO 4.1.2 & AOO 3.4.0 portable
Benutzeravatar
sven-my
*****
Beiträge: 358
Registriert: Fr, 14.12.2007 19:56

Re: Frage zu Basic-Dialog (ist kein Problem)

Beitrag von sven-my »

hier die etwas verbesserte Rechnerei:

Code: Alles auswählen

sub main

oDisplayAccess = CreateUnoService("com.sun.star.awt.DisplayAccess")
oDisplay = oDisplayAccess.getByIndex(0)
aRect = oDisplay.WorkArea
bx = aRect.Width
by = aRect.Height	'Bildschirmfläche ohne Taskleiste

'msgbox bx & " , " & by

'exit sub
	faktor = 1.8
	breite = 221	'aus Eigenschaften Dialog
	hoehe = 86		'aus Eigenschaften Dialog
	width = Cint(breite * faktor)
	height = Cint(hoehe * faktor)
	ro = 142		'Rand oben: Menueleiste + Lineal
	ru = 70			'Rand unten: Stausleiste + horizontale Bildlaufleiste
	rr = 30			'rand rechts
	rl = 30			'Rand links
	mx = bx/2 -(width/2)
	my = by -height -ru
	vxMax = bx - rr - rl - width    ' maximal Verschiebung X
	vyMax = by - ru - ro - hight    ' maximal Verschiebung Y
	vx = 0       'verschieben um n Pixel von X=0 (zwischen 0 und vxMax)
	vy = 0       'verschieben um n Pixel von Y=0 (zwischen 0 und vyMax)

'msgbox vxMax & " | " & vyMax
	x = 0 + rr + vx
	y = 0 + ro + vy
	LT = "Position ausprobieren"
msgbox x & " | " & y
	Dim StatusDialog as object
    Dim StatusAnzeige as object
    Dialoglibraries.Loadlibrary("Standard")
    StatusDialog= CreateUnoDialog(Dialoglibraries.Standard.Dialog1)

'	ps = StatusDialog.PosSize
	
	StatusDialog.setPosSize(x,y,width,height,com.sun.star.awt.PosSize.POSSIZE)
'	StatusDialog.setPosSize(ps.x,ps.y,ps.width,ps.height,com.sun.star.awt.PosSize.POSSIZE)
    
    StatusDialog.visible = true
	StatusDialog.getControl("Label1").Text = LT

for i = 1 to 10
	wait 10
next i


msgbox "Position ausprobieren beendet"

end sub
gruß
sven-my
win7 prof / AOO 4.1.2 & AOO 3.4.0 portable
ejomi
***
Beiträge: 84
Registriert: Mi, 06.09.2006 15:20

Re: Frage zu Basic-Dialog (ist kein Problem)

Beitrag von ejomi »

Hallo sven-my,

Warum kompliziert, wenn's einfach geht? Du brauchst doch nur das Dialogfenster in die Ecke, oben links, zu schieben (egal wie groß es auch immer sein mag) und Du hast freie Bahn in der Bildschirm-Mitte. Irgendwelche wirrigen Berechnungen der Bildschirmgröße usw. sind doch hierbei völlig unnötig!

Hier der Code (damit Du mal wieder was zum "klauen" hast":

Code: Alles auswählen

Sub Main
	Dim oDialogLib, oDialog
	
	' Die Bibliothek, welche den Dialog-Entwurf enthaellt
	' (hier z.B. aus "Standard") bereitstellen:	
	oDialogLib = DialogLibraries.getByName("Standard")
	
	' Das gewuenschte Dialogfenster (hier z.B. mit Namen "Dialog1") bereitstellen:
	oDialog = CreateUnoDialog(oDialogLib.getByName("Dialog1"))
	
	' Das wie oben deklarierte Dialogfenster in die obere, linke Ecke platzieren
	' (die X/Y-Position bezieht sich auf den Abstand zwischen der linken,
	'  oberen Ecke des Calc-Fensters und der des Dialog-Fensters:
	oDialog.Model.PositionX = 30
	oDialog.Model.PositionY = 80
	
	' Dialogfenster modal oeffnen:
	oDialog.Execute()
	
	' ... und fertig ist die Laube!
End Sub

Gruß: ejomi
Benutzeravatar
sven-my
*****
Beiträge: 358
Registriert: Fr, 14.12.2007 19:56

Re: Frage zu Basic-Dialog (ist kein Problem)

Beitrag von sven-my »

Hallo ejomi,

daß ich das Dialogfenster einfach verschieben kann, ist mir auch bekannt gewesen.

Nur oben links verdeckt es mir auch die Daten, die ich sehen will. Ich muß in meinem Fall ganz nach rechts schieben.

Also muß ich rechnen. Wenn ich es mir ganz einfach machen wollte hätte ich meine Zahlen genommen hätte, die ich mit, Deiner Meinung nach unsinnigen Rechnerei, ermittelt habe und hätte sie in

Code: Alles auswählen

StatusDialog.setPosSize(x,y,width,height,com.sun.star.awt.PosSize.POSSIZE)
eingetragen.

Diese Rechnerei will ich ja auch nur während der "Entwicklungsarbeit" anstellen, und dann die konkreten Zahlen eintragen. DAHER schrieb ich von Unbequemlichkeit.
Nachher, im fertigen Dokument wird da nichts mehr gerechnet; dafür sind auch die 'msgbox' drin (um an die Zahlen zu kommen), die dann rausfliegen.

Während ich am Makro stricke, kommt es des öfteren vor, daß ich das Dialogfenster in den Abmessungen ändere, daher die Frage danach, ob man diese Zahlen auslesen kann.

gruß
sven-my
win7 prof / AOO 4.1.2 & AOO 3.4.0 portable
ejomi
***
Beiträge: 84
Registriert: Mi, 06.09.2006 15:20

Re: Frage zu Basic-Dialog (ist kein Problem)

Beitrag von ejomi »

Hallo sven-my!
sven-my hat geschrieben:Ich muß in meinem Fall ganz nach rechts schieben.
... dann drück Dich bitte zukünftig mal etwas klarer aus: dass Du den Dialog rechts positionieren möchtest, hattest Du nicht erwähnt!
sven-my hat geschrieben:Also muß ich rechnen.
... ja doch - nun überanstrenge Dich nicht gleich!
sven-my hat geschrieben:Wenn ich es mir ganz einfach machen wollte hätte ich meine Zahlen genommen hätte, die ich mit, Deiner Meinung nach unsinnigen Rechnerei ...
... jawohl, Du kannst es Dir einfach machen und - jawohl - Deine Rechnerei ist nach wie vor unsinnig! (siehe weiter unten: mein Code mit Erläuterungen)

Wozu Bildschirmabmessungen mit Taskleiste und sonstigem Pipapo berechnen? Das einzige was hier interessiert sind die Maße Deines Anwendungsfensters (z.B. Calc) und Deiner Dialogbox - sonst nix. Und da muß man dann ein bißchen rechnen (stöhn): Einfach die Breite des Dialogfensters von der Breite des Anwendungsfensters abziehen und schon hat man die erforliche X-Position - ist das denn so schwierig??
sven-my hat geschrieben:Während ich am Makro stricke, kommt es des öfteren vor, daß ich das Dialogfenster in den Abmessungen ändere, daher die Frage danach, ob man diese Zahlen auslesen kann.
... ja, man kann - siehe nachfolgenden Code.

Code: Alles auswählen

Sub Main

	Dim oFrmFrame, oCntWindow, oDialogLib, oDialog
	Dim WinSize As New com.sun.star.awt.Rectangle
	Dim DlgSize As New com.sun.star.awt.Rectangle
	
	Dim OffsetTop%,	OffsetRgt%

	' Vorgaben:
	' Gewuenschter Versatz des Dialogfensters von oben
	' und von der rechten Ecke des aktiven Fensters:
	OffsetTop = 170
	OffsetRgt = 60
	
	' Den aktiven Frame im Star-Desktop ermitteln:	
	oFrmFrame = StarDesktop.getCurrentFrame()

	' Das im Frame enthaltene Anwendungs-Fenster:
	oCntWindow = oFrmFrame.getContainerWindow()
	
	' Die aktuelle Groesse des Anwendungsfensters
	' als Rectangle-Strukt (in Pixel) einlesen:
	WinSize = oCntWindow.PosSize()

	' Die Bibliothek, welche den Dialog-Entwurf enthaellt
	' (hier z.B. aus "Standard") bereitstellen:	
	oDialogLib = DialogLibraries.getByName("Standard")
	
	' Das gewuenschte Dialogfenster (hier z.B. mit Namen "Dialog1") bereitstellen:
	oDialog = CreateUnoDialog(oDialogLib.getByName("Dialog1"))

	' Um Position und Abmessung des Dialogs zu ermitteln,
	' muss es erst mal sichtbar gestellt werden (= non mondal!):
	oDialog.visible = True
	
	' Die aktuelle Groesse des Dialogs
	' als Rectangle-Strukt (in Pixel) einlesen:
	DlgSize = oDialog.PosSize()

	' Mal alle bisher gesammelten Daten zeigen:
	MsgBox "X: " & CStr(WinSize.X) & ", Y: " & CStr(WinSize.Y) & _
		", W: " & CStr(WinSize.Width) & ", H:" & CStr(WinSize.Height), _
		MB_ICONINFORMATION,	"Größe des Anwendungsfensters (in Pixel):"
		
	MsgBox "X: " & CStr(DlgSize.X) & ", Y: " & CStr(DlgSize.Y) & _
		", W: " & CStr(DlgSize.Width) & ", H:" & CStr(DlgSize.Height), _
		MB_ICONINFORMATION,	"Größe des Dialogs (in Pixel):"

	' - -  M E H R  I S T  W I R K L I C H   N I C H T   N O E T I G  !  - -

	' Der Rest erklaert sich selbst:

	MsgBox "Ab - nach oben, links (mit X/Y-Versatz!) ...", MB_ICONINFORMATION, "Dialog-Position:"
		oDialog.setPosSize(OffsetRgt, OffsetTop, DlgSize.Width, DlgSize.Height, 15)
	
	MsgBox "Ab - nach oben, rechts (mit X/Y-Versatz!) ...", MB_ICONINFORMATION, "Dialog-Position:"
		oDialog.setPosSize((WinSize.Width-DlgSize.Width)-OffsetRgt, OffsetTop, DlgSize.Width, DlgSize.Height, 15)
	
	MsgBox "Ab - nach unten, links ...", MB_ICONINFORMATION, "Dialog-Position:"
		oDialog.setPosSize(0, (WinSize.Height-DlgSize.Height), DlgSize.Width, DlgSize.Height, 15)
	
	MsgBox "Ab - nach unten, rechts ...", MB_ICONINFORMATION, "Dialog-Position:"
		oDialog.setPosSize((WinSize.Width-DlgSize.Width), (WinSize.Height-DlgSize.Height), DlgSize.Width, DlgSize.Height, 15)

	MsgBox "Wieder zurück, zum Ausgangspunkt ...", MB_ICONINFORMATION, "Dialog-Position:"
		oDialog.setPosSize(DlgSize.X, DlgSize.Y, DlgSize.Width, DlgSize.Height, 15)

	' Zum Schluss den Dialog modal zeigen (muß per Break-Button geschlossen werden):
	oDialog.Execute()

	' ... UND, WO WAR NUN DAS PROBLEM ??

End Sub
Gruß: ejomi
Benutzeravatar
sven-my
*****
Beiträge: 358
Registriert: Fr, 14.12.2007 19:56

Re: Frage zu Basic-Dialog (ist kein Problem)

Beitrag von sven-my »

Hallo ejomi,

ich hatte nicht gefragt, wie man einen Basic-'Ferrari' schreibt, sondern nach einem Basic-'Handkarren' gefragt, der Informationen vom Basic-Dialog zum Basic-Makro transportiert, und den man nach beendeter Arbeit zur Seite stellt.

Wenn jemand nach der Uhrzeit fragt, erwartet er auch keinen, teils an Beleidigung grenzendes, Referat über die Herstellung einer 'A.Lange & Söhne JUBILÄUMS-LANGEMATIK'.

Auch nach längerer Überlegung ist mir immer noch absolut unklar, welche Bedeutung es für eine Antwort auf meine Frage hat, ob ich den Dialog nach rechts, links, oben, oder unten schieben will.

In Deiner Arroganz und Überheblichkeit hast Du dann auch noch meine Erklärung auf Deinen ersten Beitrag völlig ignoriert.

Falls Du nochmal über eine Frage von mir stolpern solltest : spare' Dir die Zeit für eine Antwort für, Deiner Ansicht nach, Sinnvolleres, denn Schulmeisterei muß ich nicht haben.

Falls dieses Forum einen Elitären-Club ist, in dem sich nur Spitzenprogrammierer tummeln dürfen, hätten es mich schon andere Forenmitglieder wissen lassen.


gruß
sven-my

P.S.: Es gibt keine blöden Fragen, sondern nur blöde Antworten.
win7 prof / AOO 4.1.2 & AOO 3.4.0 portable
ejomi
***
Beiträge: 84
Registriert: Mi, 06.09.2006 15:20

Re: Frage zu Basic-Dialog (ist kein Problem)

Beitrag von ejomi »

Hallo sven-my!

Scheinbar liegt hier ein großes Mißverständniss vor, da ich mal wohlwollend davon ausgehe, daß Du hier nicht nur rumstänkern willst (was leider auf den 1. Blick so aussieht).

Dein erster Beitrag enthält die folgende Kernfrage:
sven-my hat geschrieben:Unbequem ist nur, falls ich die Größe des Dialogs (B x H) ändere, muß ich die Eingaben aus den "Eigenschaften" per Hand in das Makro übertragen
Ansonsten findet sich dort (und auch in Deinen folgenden Threads) reichlich unklarer Quellcode mit teilweise auskommentierten Zeilen, die es dem hilfsbereiten Leser nicht gerade leicht machen, zu erkennen was Du eigentlich willst.

Daraufhin habe ich Dir kurz und knapp (aus meiner Sicht der Dinge) einen Tipp gegeben, wie man schnell ein Dialogfenster in die linke Ecke schieben kann.

Deine "nette" Antwort auf meinen Tipp lautete:
sven-my hat geschrieben:... daß ich das Dialogfenster einfach verschieben kann, ist mir auch bekannt gewesen ...
... super motivierend! Nachdem nun klar war, daß Du das Dialogfenster in die rechte Ecke haben möchtest, habe ich dann noch mal einen Code veröffentlicht, der demonstriert, wie man ein Dialogfenster mit nur einigen Handgriffen in alle Himmelsrichtungen verschieben kann. Ich habe den Code sehr übersichtlich gestaltet und ausführlich kommentiert, damit auch jeder Laie etwas daraus lernen kann - schließlich bist Du hier nicht der Einzige, die diese Zeilen liest!

Deine "noch nettere" Antwort daraufhin:
sven-my hat geschrieben:In Deiner Arroganz und Überheblichkeit hast Du dann auch noch meine Erklärung auf Deinen ersten Beitrag völlig ignoriert.
... habe ich nicht - (siehe oben: einkopierte "Kernfrage" von sven-my)! ... und was, bitte, hat das mit Überheblichkeit zu tun, wenn ich hier ein paar gut gemeinte Tipps veröffentliche?

Zum Schluß verlierst Du dann endgültig die Fassung:
sven-my hat geschrieben:Falls dieses Forum einen Elitären-Club ist, in dem sich nur Spitzenprogrammierer tummeln dürfen ...
Oh je! Ich selbst hatte mich ja schon mal an anderer Stelle dieses Forums geoutet und bekannt, daß auch ich gelegentlich mal etwas sarkastisch daher plappere - aber doch niemals böse gemeint. Deine Äußerungen und persönlichen Angriffe hier gehen mir aber definitiv zu weit!

Bekümmerte Grüße:
ejomi
Antworten