Writer Editor Fenster aktiv lassen bei Dialogaufruf
Moderator: Moderatoren
-
- ****
- Beiträge: 115
- Registriert: Di, 10.01.2012 10:51
- Kontaktdaten:
Re: Writer Editor Fenster aktiv lassen bei Dialogaufruf
Hallo rocky_b
Das was du willst, ist mit einem vorgefertigten Dialog leider nicht möglich.
Wenn du den Dialog allerdings zur Laufzeit erzeugst, ist es möglich.
Am einfachsten wäre es, wenn du ein Dokument mit deinem Dialog, und den Makros hoch lädst. (Vertrauliche Daten vorher entfernen!)
Dann kann ich dir den Dialog nachbauen, so dass er zur Laufzeit erzeugt wird, und das gewünschte Verhalten hat.
Gruß Frieder
Das was du willst, ist mit einem vorgefertigten Dialog leider nicht möglich.
Wenn du den Dialog allerdings zur Laufzeit erzeugst, ist es möglich.
Am einfachsten wäre es, wenn du ein Dokument mit deinem Dialog, und den Makros hoch lädst. (Vertrauliche Daten vorher entfernen!)
Dann kann ich dir den Dialog nachbauen, so dass er zur Laufzeit erzeugt wird, und das gewünschte Verhalten hat.
Gruß Frieder
Re: Writer Editor Fenster aktiv lassen bei Dialogaufruf
Hallo Frieder,
das hört sich sehr interessant an.
Ich habe bisher vergeblich versucht, meinem Dialog in der Extension MMove (siehe unten) dieses Verhalten beizubringen.
Da wird auch ein Dialog zur Laufzeit erzeugt.
Vielleicht kannst Du mir da einen Tip geben?
Beste Grüße von Rik
das hört sich sehr interessant an.
Ich habe bisher vergeblich versucht, meinem Dialog in der Extension MMove (siehe unten) dieses Verhalten beizubringen.
Da wird auch ein Dialog zur Laufzeit erzeugt.
Vielleicht kannst Du mir da einen Tip geben?
Beste Grüße von Rik
Zuletzt geändert von F3K Total am Mi, 16.05.2012 23:25, insgesamt 1-mal geändert.
- miniKasse MMove 1.0.6 Base Videotutorial
- Windows 10: AOO, LO Linux Mint: AOO, LO
Re: Writer Editor Fenster aktiv lassen bei Dialogaufruf
Hallo
folglich sollte es mit True klappen ?
mri ( odlgModel ) zeigt eine Eigenschaft .DesktopAsParent → FalseIch habe bis vergeblich versucht, meinem Dialog in der Extension MMove (siehe unten) dieses Verhalten beizubringen.
folglich sollte es mit True klappen ?
- ...
With odlgModel
...
.setPropertyValue("DesktopAsParent", True )
End With
...
LO7.4.7.2 debian 12(bookworm) auf Raspberry4b 8GB (64bit)
LO7.6.2.1 flatpak debian 12(bookworm) auf Raspberry4b 8GB (64bit)
LO7.6.2.1 flatpak debian 12(bookworm) auf Raspberry4b 8GB (64bit)
Re: Writer Editor Fenster aktiv lassen bei Dialogaufruf
Servus
Verstehe ich gerade etwas fundamental falsch oder geht es um das schlichte setVisible vs execute bei Dialogen?
Wenn es tatsächlich darum gehen sollte, dann bietet das Forum reichlich Futter für non-modale Dialoge.
Verstehe ich gerade etwas fundamental falsch oder geht es um das schlichte setVisible vs execute bei Dialogen?
Wenn es tatsächlich darum gehen sollte, dann bietet das Forum reichlich Futter für non-modale Dialoge.
Re: Writer Editor Fenster aktiv lassen bei Dialogaufruf
Hallo
Es geht darum gleichzeitig zum bedienbaren Dialog im geöffneten Dok selbst editieren zu können - geht das im Falle http://extensions.openoffice.org/de/project/MMove mit .setVisible(1) alleine ?
Karo
Es geht darum gleichzeitig zum bedienbaren Dialog im geöffneten Dok selbst editieren zu können - geht das im Falle http://extensions.openoffice.org/de/project/MMove mit .setVisible(1) alleine ?
Karo
LO7.4.7.2 debian 12(bookworm) auf Raspberry4b 8GB (64bit)
LO7.6.2.1 flatpak debian 12(bookworm) auf Raspberry4b 8GB (64bit)
LO7.6.2.1 flatpak debian 12(bookworm) auf Raspberry4b 8GB (64bit)
-
- ****
- Beiträge: 115
- Registriert: Di, 10.01.2012 10:51
- Kontaktdaten:
Re: Writer Editor Fenster aktiv lassen bei Dialogaufruf
Hallo
Ich habe mir die Extension gerade heruntergeladen, und den Code überflogen.
ich weiß zwar noch nicht, wie man die Extension benutzen kann, aber ich denke ich weiß,
wie man den Code ändern muss, um das gewünschte Ergebnis zu erhalten.
Es müssen 3 sachen geändert werden, damit es geht:
1. "odlg.execute" muss durch "odlg.setVisible(True)" ersetzt werden.
2. es muss eine Subroutine geschrieben werden, die den Dialog wieder schließt.
hierbei muss "odlg.endexecute" durch
"" ersetzt werden.
dieses Sub muss über einen Listener mit dem dem Klicken auf das schließen-Kreutz, oder einem extra schließen-Button verknüpft werden.
(solange ein Dialog nicht mit .execute aufgerufen wir, bleibt das Kreutz zum schließen ohne Funktion.
ich weiß nicht, ob man auf das Kreutz einen Listener setzen kann. Falls nicht, muss man einen weiteren Button einfügen.)
3. "private odlg as object" muss durch "global odlg as object" ersetzt werden,
da nur globale Variablen auch nach dem beenden einer Routine noch erhalten bleiben.
(andernfalls kann der Dialog nicht mehr geschlossen werden.)
Ich werde es mir morgen genauer ansehen.
Gruß Frieder
Ich habe mir die Extension gerade heruntergeladen, und den Code überflogen.
ich weiß zwar noch nicht, wie man die Extension benutzen kann, aber ich denke ich weiß,
wie man den Code ändern muss, um das gewünschte Ergebnis zu erhalten.
Es müssen 3 sachen geändert werden, damit es geht:
1. "odlg.execute" muss durch "odlg.setVisible(True)" ersetzt werden.
2. es muss eine Subroutine geschrieben werden, die den Dialog wieder schließt.
hierbei muss "odlg.endexecute" durch
"
Code: Alles auswählen
odlg.setVisible(False) ' Dialog wird unsichtbar
odlg.dispose() ' dialog wird aus dem speicher entfernt.
dieses Sub muss über einen Listener mit dem dem Klicken auf das schließen-Kreutz, oder einem extra schließen-Button verknüpft werden.
(solange ein Dialog nicht mit .execute aufgerufen wir, bleibt das Kreutz zum schließen ohne Funktion.
ich weiß nicht, ob man auf das Kreutz einen Listener setzen kann. Falls nicht, muss man einen weiteren Button einfügen.)
3. "private odlg as object" muss durch "global odlg as object" ersetzt werden,
da nur globale Variablen auch nach dem beenden einer Routine noch erhalten bleiben.
(andernfalls kann der Dialog nicht mehr geschlossen werden.)
Ich werde es mir morgen genauer ansehen.
Gruß Frieder
Re: Writer Editor Fenster aktiv lassen bei Dialogaufruf
Hallo Karolus,
Leider verschwindet der Dialog beim Wechsel der Geometrie in den Hintergrund.
Bin noch nicht drauf gekommen, wie das zu verhindern ist, und für Tipps dankbar.
Hallo Frieder,
Setvisible hatte ich bereits versucht, damit war der Dialog zwar sichtbar, aber nicht bedienbar, wie Karolus schon geschrieben hat:
Beste Grüße von Rik
vielen Dank für den Tip, ich denke das ist der richtige Weg. So kann man die aktuelle Selektion während des Dialoges wechseln.Karolus hat geschrieben:folglich sollte es mit True klappen ?
Leider verschwindet der Dialog beim Wechsel der Geometrie in den Hintergrund.
Bin noch nicht drauf gekommen, wie das zu verhindern ist, und für Tipps dankbar.
Hallo Frieder,
Setvisible hatte ich bereits versucht, damit war der Dialog zwar sichtbar, aber nicht bedienbar, wie Karolus schon geschrieben hat:
Karolus hat geschrieben:Es geht darum gleichzeitig zum bedienbaren Dialog im geöffneten Dok selbst editieren zu können ...
Beste Grüße von Rik
- miniKasse MMove 1.0.6 Base Videotutorial
- Windows 10: AOO, LO Linux Mint: AOO, LO
Re: Writer Editor Fenster aktiv lassen bei Dialogaufruf
Servus
Ok, also doch richtig verstanden - zu dem Thema gibt es einige Threads hier und auch in den internationalen Foren - ich bin gerade selbst zu faul dazu, meine eigenen Antworten rauszusuchen - nonmodal, modal, dialog, irgendsowas als Suchbegriff.Karolus hat geschrieben:Es geht darum gleichzeitig zum bedienbaren Dialog im geöffneten Dok selbst editieren zu können
Re: Writer Editor Fenster aktiv lassen bei Dialogaufruf
OK,
ich wollte schon schreiben es geht nicht ... aber dann, mit globalen Variablen und dem "com.sun.star.awt.XTopWindowListener" habe ich es hinbekommen.
Danke!
Werde wohl demnächst MMove 1.0.6 hochladen, mit der Möglichkeit, die Auswahl während des Dialoges zu wechseln.
Eine Frage bleibt noch:
Wie detektiere ich, das die Auswahl geändert wurde?
Der "com.sun.star.view.XSelectionChangeListener" reagiert auf jede Änderung in der Ansicht, auch wenn ich die Auswahl gar nicht ändere, sondern nur verschiebe. Hat da noch jemand eine Idee?
Beste Grüsse von Rik
ich wollte schon schreiben es geht nicht ... aber dann, mit globalen Variablen und dem "com.sun.star.awt.XTopWindowListener" habe ich es hinbekommen.
Danke!
Werde wohl demnächst MMove 1.0.6 hochladen, mit der Möglichkeit, die Auswahl während des Dialoges zu wechseln.
Eine Frage bleibt noch:
Wie detektiere ich, das die Auswahl geändert wurde?
Der "com.sun.star.view.XSelectionChangeListener" reagiert auf jede Änderung in der Ansicht, auch wenn ich die Auswahl gar nicht ändere, sondern nur verschiebe. Hat da noch jemand eine Idee?
Beste Grüsse von Rik
- miniKasse MMove 1.0.6 Base Videotutorial
- Windows 10: AOO, LO Linux Mint: AOO, LO
-
- ****
- Beiträge: 115
- Registriert: Di, 10.01.2012 10:51
- Kontaktdaten:
Re: Writer Editor Fenster aktiv lassen bei Dialogaufruf
Hallo Ric
ich habe dir den Code jetzt einmahl angepest.(bin nicht eher dazu gekommen.)
aber inzwischen scheinst du ja selber auf eine Lösung gekommen zu sein.
Da du deine Lösung geheim hältst, möchte ich meine vorstellen:
1. alle variablen, die du in verschiedenen Subs verwndest müssen als Globa deklariert werden:
(Vielleicht habe ich ein par zu viel umgestellt)
2. Damit es zu keinen Komplikationen führt, wenn man einen Dialog geöffnet hat, und einen weiteren öffnet, wird der alte zuerst geschlossen.:
3. Einen XTopWindowListener hinzugefügt, um den dialog auch wieder schlißen zu können:
4. "odlg.execute" in "odlg.setVisible(True)" umgewandelt.
Und hier die komplette Lösung:
Grüße Frieder
ich habe dir den Code jetzt einmahl angepest.(bin nicht eher dazu gekommen.)
aber inzwischen scheinst du ja selber auf eine Lösung gekommen zu sein.
Da du deine Lösung geheim hältst, möchte ich meine vorstellen:
1. alle variablen, die du in verschiedenen Subs verwndest müssen als Globa deklariert werden:
Code: Alles auswählen
Global oNumSX as object
Global oNumSY as object
Global oNumX as object
Global oNumY as object
Global oNumStep as object
Global X as double
Global Y as double
Global odlg as object
Global l as double
global dstep as double
global bThenth as boolean
(Vielleicht habe ich ein par zu viel umgestellt)
2. Damit es zu keinen Komplikationen führt, wenn man einen Dialog geöffnet hat, und einen weiteren öffnet, wird der alte zuerst geschlossen.:
Code: Alles auswählen
If not isNull (odlg) then
if odlg.isVisible() Then
odlg.setVisible(False)
odlg.dispose
end if
end if
Code: Alles auswählen
...
Dim oWindowsListener as Object
oWindowsListener = CreateUnoListener( "Win_", "com.sun.star.awt.XTopWindowListener" )
odlg.addTopWindowListener(oWindowsListener)
..
'Diese Routinen werden von dem XTopWindowListener benötigt
Sub Win_windowClosing( oEvent ) 'Dialog schließen
odlg.setVisible(False)
odlg.dispose
End Sub
Sub Win_disposing( )
End Sub
Sub Win_windowOpened ( oEvent )
End sub
Sub Win_windowClosed ( oEvent )
End sub
Sub Win_windowMinimized ( oEvent )
End sub
Sub Win_windowNormalized ( oEvent )
End sub
Sub Win_windowActivated ( oEvent )
End sub
Sub Win_windowDeactivated ( oEvent )
End sub
Und hier die komplette Lösung:
Code: Alles auswählen
REM ***** BASIC *****
Global oNumSX as object
Global oNumSY as object
Global oNumX as object
Global oNumY as object
Global oNumStep as object
Global X as double
Global Y as double
Global odlg as object
Global l as double
global dstep as double
global bThenth as boolean
Sub S_Create_Dialog_MiniMove
Dim oWindow As Object
Dim oMod As Object
Dim i As Integer
if dstep = 0 then dstep = 1
If not isNull (odlg) then
if odlg.isVisible() Then
odlg.setVisible(False)
odlg.dispose
end if
end if
osel = stardesktop.currentcomponent.currentselection
if ismissing(osel) or not osel.supportsService("com.sun.star.drawing.ShapeCollection") then
if not osel.supportsService("com.sun.star.text.BaseFrame") then
msgbox ("Please select"+chr(13)+"→ shape"+chr(13)+"→ picture"+chr(13)+"→ frame"+chr(13)+"→ floating frame"+chr(13)+"→ control",64,"MMove")
exit sub
endif
endif
if osel.supportsService("com.sun.star.drawing.ShapeCollection") then
opos = osel(0).Position
oSize = osel(0).Size
SX=oSize.Width
SY=oSize.Height
X=opos.X
Y=opos.Y
X= runden(X/100)
Y= runden(Y/100)
SX= runden(SX/100)
SY= runden(SY/100)
opos.X = X*100
opos.Y = Y*100
oSize.Width = SX*100
oSize.Height = SY*100
'set position on 1mm grid
osel(0).Position = opos
else
X = osel.HoriOrientPosition
Y = osel.VertOrientPosition
oSize = osel.Size
SX=oSize.Width
SY=oSize.Height
X= runden(X/100)
Y= runden(Y/100)
SX= runden(SX/100)
SY= runden(SY/100)
osel.HoriOrientPosition = X*100
osel.VertOrientPosition = Y*100
oSize.Width = SX*100
oSize.Height = SY*100
endif
REM ***** Initialisierung der Eigenschaften des Dialogs
odlgModel = CreateUnoService("com.sun.star.awt.UnoControlDialogModel")
With odlgModel
.setPropertyValue("PositionX", 320)
.setPropertyValue("PositionY", 111 )
.setPropertyValue("FontName", Font)
.setPropertyValue("Width", 82)
.setPropertyValue("Height", 76)
.setPropertyValue("Title", "MiniMove")
.setPropertyValue("Name", "DLGMove")
'.setPropertyValue("DesktopAsParent", True )
End With
odlg = CreateUnoService("com.sun.star.awt.UnoControlDialog")
REM ********** Textlabel erzeugen
oMod = odlgModel.createInstance("com.sun.star.awt.UnoControlFixedTextModel")
With oMod
.setPropertyValue("Label", "X")
.setPropertyValue("Name", "lblSX")
.setPropertyValue("PositionX", 2)
.setPropertyValue("PositionY", 11)
.setPropertyValue("Height",11)
.setPropertyValue("Width", 6)
End With
odlgModel.insertByName("lblSX", oMod)
REM ********** Textlabel erzeugen
oMod = odlgModel.createInstance("com.sun.star.awt.UnoControlFixedTextModel")
With oMod
.setPropertyValue("Label", "Y")
.setPropertyValue("Name", "lblSY")
.setPropertyValue("PositionX", 76)
.setPropertyValue("PositionY", 11)
.setPropertyValue("Height",11)
.setPropertyValue("Width", 6)
End With
odlgModel.insertByName("lblSY", oMod)
REM ********** Textlabel erzeugen
oMod = odlgModel.createInstance("com.sun.star.awt.UnoControlFixedTextModel")
With oMod
.setPropertyValue("Label", "X")
.setPropertyValue("Name", "lblX")
.setPropertyValue("PositionX", 2)
.setPropertyValue("PositionY", 57)
.setPropertyValue("Height",11)
.setPropertyValue("Width", 6)
End With
odlgModel.insertByName("lblX", oMod)
REM ********** Textlabel erzeugen
oMod = odlgModel.createInstance("com.sun.star.awt.UnoControlFixedTextModel")
With oMod
.setPropertyValue("Label", "Y")
.setPropertyValue("Name", "lblY")
.setPropertyValue("PositionX", 76)
.setPropertyValue("PositionY", 57)
.setPropertyValue("Height",11)
.setPropertyValue("Width", 6)
End With
odlgModel.insertByName("lblY", oMod)
REM ********** Textlabel erzeugen
oMod = odlgModel.createInstance("com.sun.star.awt.UnoControlFixedTextModel")
With oMod
.setPropertyValue("Label", "Size")
.setPropertyValue("Name", "lblSize")
.setPropertyValue("PositionX", 8)
.setPropertyValue("PositionY", 4)
.setPropertyValue("Height",8)
.setPropertyValue("Width",20)
.setPropertyValue("FontHeight",7)
End With
odlgModel.insertByName("lblSize", oMod)
REM ********** Textlabel erzeugen
oMod = odlgModel.createInstance("com.sun.star.awt.UnoControlFixedTextModel")
With oMod
.setPropertyValue("Label", "[mm]")
.setPropertyValue("Name", "lblSmm")
.setPropertyValue("PositionX", 54)
.setPropertyValue("PositionY", 4)
.setPropertyValue("Height",8)
.setPropertyValue("Width", 50)
.setPropertyValue("FontHeight",6)
End With
odlgModel.insertByName("lblSmm", oMod)
REM ********** Textlabel erzeugen
oMod = odlgModel.createInstance("com.sun.star.awt.UnoControlFixedTextModel")
With oMod
.setPropertyValue("Label", "Step")
.setPropertyValue("Name", "lblStep")
.setPropertyValue("PositionX", 31)
.setPropertyValue("PositionY", 24)
.setPropertyValue("Height",8)
.setPropertyValue("Width", 23)
.setPropertyValue("FontHeight",7)
End With
odlgModel.insertByName("lblStep", oMod)
REM ********** Textlabel erzeugen
oMod = odlgModel.createInstance("com.sun.star.awt.UnoControlFixedTextModel")
With oMod
.setPropertyValue("Label", "Position")
.setPropertyValue("Name", "lblPosition")
.setPropertyValue("PositionX", 8)
.setPropertyValue("PositionY", 50)
.setPropertyValue("Height",8)
.setPropertyValue("Width", 23)
.setPropertyValue("FontHeight",7)
End With
odlgModel.insertByName("lblPosition", oMod)
REM ********** Textlabel erzeugen
oMod = odlgModel.createInstance("com.sun.star.awt.UnoControlFixedTextModel")
With oMod
.setPropertyValue("Label", "[mm]")
.setPropertyValue("Name", "lblPmm")
.setPropertyValue("PositionX", 54)
.setPropertyValue("PositionY", 50)
.setPropertyValue("Height",8)
.setPropertyValue("Width", 50)
.setPropertyValue("FontHeight",6)
End With
odlgModel.insertByName("lblPmm", oMod)
REM ********** Textlabel erzeugen
oMod = odlgModel.createInstance("com.sun.star.awt.UnoControlFixedTextModel")
With oMod
.setPropertyValue("Label", "made by rikhustede.de")
.setPropertyValue("Name", "lblmadeby")
.setPropertyValue("PositionX", 34)
.setPropertyValue("PositionY", 70)
.setPropertyValue("Height",8)
.setPropertyValue("Width", 50)
.setPropertyValue("FontHeight",6)
End With
odlgModel.insertByName("lblmadeby", oMod)
REM ********** Optionsbuttons erzeugen
dim s_buttons(3,4) as variant
s_buttons(0,1)="↑"
s_buttons(0,2)="→"
s_buttons(0,3)="↓"
s_buttons(0,4)="←"
s_buttons(1,1)=31
s_buttons(1,2)=54
s_buttons(1,3)=31
s_buttons(1,4)=8
s_buttons(2,1)=4
s_buttons(2,2)=27
s_buttons(2,3)=50
s_buttons(2,4)=27
s_buttons(3,1)="Y - 100"
s_buttons(3,2)="X + 100"
s_buttons(3,3)="Y + 100"
s_buttons(3,4)="X - 100"
for i=1 to 4
oMod = odlgModel.createInstance("com.sun.star.awt.UnoControlButtonModel")
With oMod
.setPropertyValue("Label", s_buttons(0,i))
.setPropertyValue("Name", "cmd"+i)
.setPropertyValue("PositionX", s_buttons(1,i))
.setPropertyValue("PositionY", s_buttons(2,i))
.setPropertyValue("Height", 20)
.setPropertyValue("Width", 20)
.setPropertyValue("Tag", s_buttons(3,i))
.setPropertyValue("FontHeight",18)
.setPropertyValue("FocusOnClick",false)
.setPropertyValue("Tabstop",false)
End With
odlgModel.insertByName("cmd"+i, oMod)
next i
REM **********numerisches Feld erzeugen
oMod = odlgModel.createInstance("com.sun.star.awt.UnoControlNumericFieldModel")
With oMod
.setPropertyValue("Name", "NumSX")
.setPropertyValue("PositionX", 8)
.setPropertyValue("PositionY", 10)
.setPropertyValue("Height", 10)
.setPropertyValue("Width", 20)
.setPropertyValue("Value", SX)
End With
odlgModel.insertByName("NumSX", oMod)
REM **********numerisches Feld erzeugen
oMod = odlgModel.createInstance("com.sun.star.awt.UnoControlNumericFieldModel")
With oMod
.setPropertyValue("Name", "NumSY")
.setPropertyValue("PositionX", 54)
.setPropertyValue("PositionY", 10)
.setPropertyValue("Height", 10)
.setPropertyValue("Width", 20)
.setPropertyValue("Value", SY)
End With
odlgModel.insertByName("NumSY", oMod)
REM **********numerisches Feld erzeugen
oMod = odlgModel.createInstance("com.sun.star.awt.UnoControlNumericFieldModel")
With oMod
.setPropertyValue("Name", "NumX")
.setPropertyValue("PositionX", 8)
.setPropertyValue("PositionY", 56)
.setPropertyValue("Height", 10)
.setPropertyValue("Width", 20)
.setPropertyValue("Value", X)
End With
odlgModel.insertByName("NumX", oMod)
REM **********numerisches Feld erzeugen
oMod = odlgModel.createInstance("com.sun.star.awt.UnoControlNumericFieldModel")
With oMod
.setPropertyValue("Name", "NumY")
.setPropertyValue("PositionX", 54)
.setPropertyValue("PositionY", 56)
.setPropertyValue("Height", 10)
.setPropertyValue("Width", 20)
.setPropertyValue("Value", Y)
End With
odlgModel.insertByName("NumY", oMod)
REM **********numerisches Drehfeld erzeugen
oMod = odlgModel.createInstance("com.sun.star.awt.UnoControlNumericFieldModel")
With oMod
.setPropertyValue("Name", "NumStep")
.setPropertyValue("PositionX", 31)
.setPropertyValue("PositionY", 30)
.setPropertyValue("Height", 12)
.setPropertyValue("Width", 20)
.setPropertyValue("Value", dstep)
.setPropertyValue("Spin", true)
.setPropertyValue("ValueMax",20)
.setPropertyValue("ValueMin",1)
End With
odlgModel.insertByName("NumStep", oMod)
REM **********Checkbox erzeugen
oMod = odlgModel.createInstance("com.sun.star.awt.UnoControlCheckBoxModel")
With oMod
.setPropertyValue("Name", "ChkStep")
.setPropertyValue("PositionX", 31)
.setPropertyValue("PositionY", 42)
.setPropertyValue("Height", 14)
.setPropertyValue("Width", 20)
.setPropertyValue("Label", "1/10")
.setPropertyValue("FontHeight",7)
End With
if bthenth = false then
oMod.setPropertyValue("State", 0)
else
oMod.setPropertyValue("State", 1)
endif
odlgModel.insertByName("ChkStep", oMod)
odlg.setModel(odlgModel)
oNumSX= odlg.getcontrol("NumSX")
oNumSY = odlg.getcontrol("NumSY")
oNumX = odlg.getcontrol("NumX")
oNumY = odlg.getcontrol("NumY")
oNumStep = odlg.getcontrol("NumStep")
oChkStep = odlg.getcontrol("ChkStep")
oNumSX.DecimalDigits = 1
oNumSY.DecimalDigits = 1
oNumX.DecimalDigits = 1
oNumY.DecimalDigits = 1
Set_digits
REM ********** Listener für den Register erzeugen Button
ocmd_move_Listener = createUnoListener("cmd_move_", "com.sun.star.awt.XActionListener")
for i=1 to 4
oControl = odlg.getControl("cmd"+i)
oControl.addActionListener(ocmd_move_Listener)
next i
o_numS_focus_Listener = createUnoListener("numS_focus_", "com.sun.star.awt.XFocusListener")
oNumSX.addFocusListener(o_numS_focus_Listener)
oNumSY.addFocusListener(o_numS_focus_Listener)
o_num_focus_Listener = createUnoListener("num_focus_", "com.sun.star.awt.XFocusListener")
oNumX.addFocusListener(o_num_focus_Listener)
oNumY.addFocusListener(o_num_focus_Listener)
o_numS_key_Listener = createUnoListener("numS_key_", "com.sun.star.awt.XKeyListener")
oNumSX.addKeyListener(o_numS_key_Listener)
oNumSY.addKeyListener(o_numS_key_Listener)
o_num_key_Listener = createUnoListener("num_key_", "com.sun.star.awt.XKeyListener")
oNumX.addKeyListener(o_num_key_Listener)
oNumY.addKeyListener(o_num_key_Listener)
o_ChkStep_item_Listener = createUnoListener("chk_item_", "com.sun.star.awt.XItemListener")
oChkStep.addItemListener(o_ChkStep_item_Listener)
o_NumStep_text_Listener = createUnoListener("numstep_text_", "com.sun.star.awt.XTextListener")
oNumStep.addTextListener(o_NumStep_text_Listener)
REM ********** Mittels des Modells den Dialog anzeigen
oWindow = CreateUnoService("com.sun.star.awt.Toolkit")
odlg.createPeer(oWindow, null)
Dim oWindowsListener as Object
oWindowsListener = CreateUnoListener( "Win_", "com.sun.star.awt.XTopWindowListener" )
odlg.addTopWindowListener(oWindowsListener)
odlg.setVisible(True)'execute=true
End Sub
Sub S_Create_Dialog_MicroMove
Dim oWindow As Object
Dim oMod As Object
Dim i As Integer
if dstep = 0 then dstep = 1
If not isNull (odlg) then
if odlg.isVisible() Then
odlg.setVisible(False)
odlg.dispose
end if
end if
osel = stardesktop.currentcomponent.currentselection
if ismissing(osel) or not osel.supportsService("com.sun.star.drawing.ShapeCollection") then
if not osel.supportsService("com.sun.star.text.BaseFrame") then
msgbox ("Please select"+chr(13)+"→ shape"+chr(13)+"→ picture"+chr(13)+"→ frame"+chr(13)+"→ floating frame"+chr(13)+"→ control",64,"MMove")
exit sub
endif
endif
if osel.supportsService("com.sun.star.drawing.ShapeCollection") then
opos = osel(0).Position
oSize = osel(0).Size
SX=oSize.Width
SY=oSize.Height
X=opos.X
Y=opos.Y
X= runden(X/100)
Y= runden(Y/100)
SX= runden(SX/100)
SY= runden(SY/100)
opos.X = X*100
opos.Y = Y*100
oSize.Width = SX*100
oSize.Height = SY*100
'set position on 1mm grid
osel(0).Position = opos
else
X = osel.HoriOrientPosition
Y = osel.VertOrientPosition
oSize = osel.Size
SX=oSize.Width
SY=oSize.Height
X= runden(X/100)
Y= runden(Y/100)
SX= runden(SX/100)
SY= runden(SY/100)
osel.HoriOrientPosition = X*100
osel.VertOrientPosition = Y*100
oSize.Width = SX*100
oSize.Height = SY*100
endif
REM ***** Initialisierung der Eigenschaften des Dialogs
odlgModel = CreateUnoService("com.sun.star.awt.UnoControlDialogModel")
With odlgModel
.setPropertyValue("PositionX", 320)
.setPropertyValue("PositionY", 111 )
.setPropertyValue("FontName", Font)
.setPropertyValue("Width", 58)
.setPropertyValue("Height", 57)
.setPropertyValue("Title", "MicroMove")
.setPropertyValue("Name", "DLGMove")
.setPropertyValue("FontHeight",7)
'.setPropertyValue("DesktopAsParent", True )
End With
odlg = CreateUnoService("com.sun.star.awt.UnoControlDialog")
REM ********** Textlabel erzeugen
oMod = odlgModel.createInstance("com.sun.star.awt.UnoControlFixedTextModel")
With oMod
.setPropertyValue("Label", "X")
.setPropertyValue("Name", "lblSX")
.setPropertyValue("PositionX", 1)
.setPropertyValue("PositionY", 7)
.setPropertyValue("Height",11)
.setPropertyValue("Width", 6)
.setPropertyValue("FontHeight",6)
End With
odlgModel.insertByName("lblSX", oMod)
REM ********** Textlabel erzeugen
oMod = odlgModel.createInstance("com.sun.star.awt.UnoControlFixedTextModel")
With oMod
.setPropertyValue("Label", "Y")
.setPropertyValue("Name", "lblSY")
.setPropertyValue("PositionX", 54)
.setPropertyValue("PositionY", 7)
.setPropertyValue("Height",11)
.setPropertyValue("Width", 6)
.setPropertyValue("FontHeight",6)
End With
odlgModel.insertByName("lblSY", oMod)
REM ********** Textlabel erzeugen
oMod = odlgModel.createInstance("com.sun.star.awt.UnoControlFixedTextModel")
With oMod
.setPropertyValue("Label", "X")
.setPropertyValue("Name", "lblX")
.setPropertyValue("PositionX", 1)
.setPropertyValue("PositionY", 40)
.setPropertyValue("Height",11)
.setPropertyValue("Width", 6)
.setPropertyValue("FontHeight",6)
End With
odlgModel.insertByName("lblX", oMod)
REM ********** Textlabel erzeugen
oMod = odlgModel.createInstance("com.sun.star.awt.UnoControlFixedTextModel")
With oMod
.setPropertyValue("Label", "Y")
.setPropertyValue("Name", "lblY")
.setPropertyValue("PositionX", 54)
.setPropertyValue("PositionY", 40)
.setPropertyValue("Height",11)
.setPropertyValue("Width", 6)
.setPropertyValue("FontHeight",6)
End With
odlgModel.insertByName("lblY", oMod)
REM ********** Textlabel erzeugen
oMod = odlgModel.createInstance("com.sun.star.awt.UnoControlFixedTextModel")
With oMod
.setPropertyValue("Label", "Size")
.setPropertyValue("Name", "lblSize")
.setPropertyValue("PositionX", 6)
.setPropertyValue("PositionY", 0)
.setPropertyValue("Height",8)
.setPropertyValue("Width", 20)
.setPropertyValue("FontHeight",6)
End With
odlgModel.insertByName("lblSize", oMod)
REM ********** Textlabel erzeugen
oMod = odlgModel.createInstance("com.sun.star.awt.UnoControlFixedTextModel")
With oMod
.setPropertyValue("Label", "[mm]")
.setPropertyValue("Name", "lblSmm")
.setPropertyValue("PositionX", 42)
.setPropertyValue("PositionY", 0)
.setPropertyValue("Height",8)
.setPropertyValue("Width", 50)
.setPropertyValue("FontHeight",6)
End With
odlgModel.insertByName("lblSmm", oMod)
REM ********** Textlabel erzeugen
oMod = odlgModel.createInstance("com.sun.star.awt.UnoControlFixedTextModel")
With oMod
.setPropertyValue("Label", "Step")
.setPropertyValue("Name", "lblStep")
.setPropertyValue("PositionX", 19)
.setPropertyValue("PositionY", 15)
.setPropertyValue("Height",8)
.setPropertyValue("Width", 23)
.setPropertyValue("FontHeight",6)
End With
odlgModel.insertByName("lblStep", oMod)
REM ********** Textlabel erzeugen
oMod = odlgModel.createInstance("com.sun.star.awt.UnoControlFixedTextModel")
With oMod
.setPropertyValue("Label", "Position")
.setPropertyValue("Name", "lblPosition")
.setPropertyValue("PositionX", 6)
.setPropertyValue("PositionY", 33)
.setPropertyValue("Height",8)
.setPropertyValue("Width", 15)
.setPropertyValue("FontHeight",6)
End With
odlgModel.insertByName("lblPosition", oMod)
REM ********** Textlabel erzeugen
oMod = odlgModel.createInstance("com.sun.star.awt.UnoControlFixedTextModel")
With oMod
.setPropertyValue("Label", "[mm]")
.setPropertyValue("Name", "lblPmm")
.setPropertyValue("PositionX", 42)
.setPropertyValue("PositionY", 33)
.setPropertyValue("Height",8)
.setPropertyValue("Width", 50)
.setPropertyValue("FontHeight",6)
End With
odlgModel.insertByName("lblPmm", oMod)
REM ********** Textlabel erzeugen
oMod = odlgModel.createInstance("com.sun.star.awt.UnoControlFixedTextModel")
With oMod
.setPropertyValue("Label", "made by rikhustede.de")
.setPropertyValue("Name", "lblmadeby")
.setPropertyValue("PositionX", 12)
.setPropertyValue("PositionY", 50)
.setPropertyValue("Height",8)
.setPropertyValue("Width", 50)
.setPropertyValue("FontHeight",6)
End With
odlgModel.insertByName("lblmadeby", oMod)
REM ********** Optionsbuttons erzeugen
dim s_buttons(3,4) as variant
s_buttons(0,1)="↑"
s_buttons(0,2)="→"
s_buttons(0,3)="↓"
s_buttons(0,4)="←"
s_buttons(1,1)=23
s_buttons(1,2)=40
s_buttons(1,3)=23
s_buttons(1,4)=6
s_buttons(2,1)=5
s_buttons(2,2)=22
s_buttons(2,3)=38
s_buttons(2,4)=22
s_buttons(3,1)="Y - 100"
s_buttons(3,2)="X + 100"
s_buttons(3,3)="Y + 100"
s_buttons(3,4)="X - 100"
for i=1 to 4
oMod = odlgModel.createInstance("com.sun.star.awt.UnoControlButtonModel")
With oMod
.setPropertyValue("Label", s_buttons(0,i))
.setPropertyValue("Name", "cmd"+i)
.setPropertyValue("PositionX", s_buttons(1,i))
.setPropertyValue("PositionY", s_buttons(2,i))
.setPropertyValue("Height", 12)
.setPropertyValue("Width", 12)
.setPropertyValue("Tag", s_buttons(3,i))
.setPropertyValue("FontHeight",14)
.setPropertyValue("FocusOnClick",false)
.setPropertyValue("Tabstop",false)
End With
odlgModel.insertByName("cmd"+i, oMod)
next i
REM **********numerisches Feld erzeugen
oMod = odlgModel.createInstance("com.sun.star.awt.UnoControlNumericFieldModel")
With oMod
.setPropertyValue("Name", "NumSX")
.setPropertyValue("PositionX", 6)
.setPropertyValue("PositionY", 6)
.setPropertyValue("Height", 10)
.setPropertyValue("Width", 15)
.setPropertyValue("Value", SX)
End With
odlgModel.insertByName("NumSX", oMod)
REM **********numerisches Feld erzeugen
oMod = odlgModel.createInstance("com.sun.star.awt.UnoControlNumericFieldModel")
With oMod
.setPropertyValue("Name", "NumSY")
.setPropertyValue("PositionX", 38)
.setPropertyValue("PositionY", 6)
.setPropertyValue("Height", 10)
.setPropertyValue("Width", 15)
.setPropertyValue("Value", SY)
End With
odlgModel.insertByName("NumSY", oMod)
REM **********numerisches Feld erzeugen
oMod = odlgModel.createInstance("com.sun.star.awt.UnoControlNumericFieldModel")
With oMod
.setPropertyValue("Name", "NumX")
.setPropertyValue("PositionX", 6)
.setPropertyValue("PositionY", 39)
.setPropertyValue("Height", 10)
.setPropertyValue("Width", 15)
.setPropertyValue("Value", X)
End With
odlgModel.insertByName("NumX", oMod)
REM **********numerisches Feld erzeugen
oMod = odlgModel.createInstance("com.sun.star.awt.UnoControlNumericFieldModel")
With oMod
.setPropertyValue("Name", "NumY")
.setPropertyValue("PositionX", 38)
.setPropertyValue("PositionY", 39)
.setPropertyValue("Height", 10)
.setPropertyValue("Width", 15)
.setPropertyValue("Value", Y)
End With
odlgModel.insertByName("NumY", oMod)
REM **********numerisches Drehfeld erzeugen
oMod = odlgModel.createInstance("com.sun.star.awt.UnoControlNumericFieldModel")
With oMod
.setPropertyValue("Name", "NumStep")
.setPropertyValue("PositionX", 19)
.setPropertyValue("PositionY", 21)
.setPropertyValue("Height", 10)
.setPropertyValue("Width", 21)
.setPropertyValue("Value", dStep)
.setPropertyValue("Spin", true)
.setPropertyValue("ValueMax",9)
.setPropertyValue("ValueMin",1)
End With
odlgModel.insertByName("NumStep", oMod)
REM **********Checkbox erzeugen
oMod = odlgModel.createInstance("com.sun.star.awt.UnoControlCheckBoxModel")
With oMod
.setPropertyValue("Name", "ChkStep")
.setPropertyValue("PositionX", 22)
.setPropertyValue("PositionY", 31)
.setPropertyValue("Height", 12)
.setPropertyValue("Width", 20)
.setPropertyValue("Label", "1/10")
.setPropertyValue("FontHeight",6)
End With
if bthenth = false then
oMod.setPropertyValue("State", 0)
else
oMod.setPropertyValue("State", 1)
endif
odlgModel.insertByName("ChkStep", oMod)
odlg.setModel(odlgModel)
oNumSX= odlg.getcontrol("NumSX")
oNumSY = odlg.getcontrol("NumSY")
oNumX = odlg.getcontrol("NumX")
oNumY = odlg.getcontrol("NumY")
oNumStep=odlg.getcontrol("NumStep")
oChkStep = odlg.getcontrol("ChkStep")
oNumSX.DecimalDigits = 1
oNumSY.DecimalDigits = 1
oNumX.DecimalDigits = 1
oNumY.DecimalDigits = 1
Set_digits
REM ********** Listener für den Register erzeugen Button
ocmd_move_Listener = createUnoListener("cmd_move_", "com.sun.star.awt.XActionListener")
for i=1 to 4
oControl = odlg.getControl("cmd"+i)
oControl.addActionListener(ocmd_move_Listener)
next i
o_numS_focus_Listener = createUnoListener("numS_focus_", "com.sun.star.awt.XFocusListener")
oNumSX.addFocusListener(o_numS_focus_Listener)
oNumSY.addFocusListener(o_numS_focus_Listener)
o_num_focus_Listener = createUnoListener("num_focus_", "com.sun.star.awt.XFocusListener")
oNumX.addFocusListener(o_num_focus_Listener)
oNumY.addFocusListener(o_num_focus_Listener)
o_numS_key_Listener = createUnoListener("numS_key_", "com.sun.star.awt.XKeyListener")
oNumSX.addKeyListener(o_numS_key_Listener)
oNumSY.addKeyListener(o_numS_key_Listener)
o_num_key_Listener = createUnoListener("num_key_", "com.sun.star.awt.XKeyListener")
oNumX.addKeyListener(o_num_key_Listener)
oNumY.addKeyListener(o_num_key_Listener)
o_ChkStep_item_Listener = createUnoListener("chk_item_", "com.sun.star.awt.XItemListener")
oChkStep.addItemListener(o_ChkStep_item_Listener)
o_NumStep_text_Listener = createUnoListener("numstep_text_", "com.sun.star.awt.XTextListener")
oNumStep.addTextListener(o_NumStep_text_Listener)
REM ********** Mittels des Modells den Dialog anzeigen
oWindow = CreateUnoService("com.sun.star.awt.Toolkit")
odlg.createPeer(oWindow, null)
Dim oWindowsListener as Object
oWindowsListener = CreateUnoListener( "Win_", "com.sun.star.awt.XTopWindowListener" )
odlg.addTopWindowListener(oWindowsListener)
odlg.setVisible(True)'execute=true
End Sub
sub moveshape(oEv)
dim sTag as string
'dim a()
dstep = odlg.getcontrol("NumStep").value
l= 100 * dstep
osel = Thiscomponent.currentselection
a = split(oEv.Source.Model.Tag," ")
if a(0) = "X" then
if a(1) = "-" then
dx = -l
else
dx = l
endif
dy = 0
else
dx = 0
if a(1) = "-" then
dy = -l
else
dy = l
endif
endif
if osel.supportsService("com.sun.star.drawing.ShapeCollection") then
opos = osel(0).Position
X = opos.X+dx
y = opos.Y+dy
opos.X = X
opos.Y = Y
osel(0).Position = opos
oNumX.Text=runden(X/100)
oNumY.Text=runden(Y/100)
else
X = osel.HoriOrientPosition+dx
Y = osel.VertOrientPosition+dy
osel.HoriOrientPosition = X
osel.VertOrientPosition = Y
oNumX.Text=runden(X/100)
oNumY.Text=runden(Y/100)
endif
set_document_modified
end sub
Sub Set_step
oChkStep = odlg.getcontrol("ChkStep")
if oChkStep.state = 0 then
bThenth = false
set_digits
else
bThenth = true
set_digits
endif
sStep = replace(odlg.getcontrol("NumStep").Text,",",".")
dstep = sStep
odlg.getcontrol("NumStep").value = dstep
end sub
sub Set_digits
if bThenth = false then
with oNumStep
.DecimalDigits = 0
.SpinSize = 1
.model.ValueMax = 20
.model.ValueMin = 1
end with
else
with oNumStep
.DecimalDigits = 1
.SpinSize = 0.1
.model.ValueMax = 9.9
.model.ValueMin = 0.1
end with
endif
end Sub
Sub Set_Position
On Error Goto ErrorHandler
dim doX as Integer
dim doY as Integer
osel = Thiscomponent.currentselection
if osel.supportsService("com.sun.star.drawing.ShapeCollection") then
opos = osel(0).Position
doX = oNumX.Text
doX = doX*100
doY = oNumY.Text
doY = doY*100
opos.X = doX
opos.Y = doY
osel(0).Position = opos
else
doX = oNumX.Text
doX = doX*100
doY = oNumY.Text
doY = doY*100
osel.HoriOrientPosition = doX
osel.VertOrientPosition = doY
endif
ErrorHandler:
set_document_modified
end sub
Sub Set_Size
On Error Goto ErrorHandler
dim SoX as Integer
dim SoY as Integer
osel = Thiscomponent.currentselection
if osel.supportsService("com.sun.star.drawing.ShapeCollection") then
oSize = osel(0).Size
SoX = oNumSX.Text
SoX = SoX*100
SoY = oNumSY.Text
SoY = SoY*100
oSize.Width = SoX
oSize.Height = SoY
osel(0).Size = oSize
else
oSize = osel.Size
SoX = oNumSX.Text
SoX = SoX*100
SoY = oNumSY.Text
SoY = SoY*100
oSize.Width = SoX
oSize.Height = SoY
osel.Size = oSize
endif
ErrorHandler:
set_document_modified
end sub
sub set_document_modified
thiscomponent.modified = true
end sub
Function runden(dblZahl as double, optional iStellen as integer) as double
' Funktion rundet eine Zahl (dblZahl) auf die angegebene Anzahl von Stellen (iStellen)
' Angabe der Stellenanzahl optional (Standard=0)
dim dblTmp as double, lngTmp as Long
iStellen = 1
dblTmp = dblZahl * 10^iStellen
lngTmp = CLng(dblTmp)
dblTmp = CDbl(lngTmp) / 10^iStellen
runden = dblTmp
end Function
REM ***** Die Aktion des Listeners für die Buttons
Sub cmd_move_actionPerformed(oEv)
moveshape(oEv)
end sub
Sub cmd_move_disposing(oEv)
End Sub
REM ***** Listeners für die NumericFields
Sub numS_focus_focusLost(oEv)
Set_Size
end sub
Sub numS_focus_focusGained(oEv)
end sub
Sub numS_focus_disposing(oEv)
End Sub
sub numS_key_keyPressed(oEv)
End Sub
sub numS_key_keyReleased(oEv)
If (oEv.KeyCode = 1280) Then Set_Size
End Sub
Sub numS_key_disposing(oEv)
End Sub
Sub num_focus_focusLost(oEv)
Set_Position
end sub
Sub num_focus_focusGained(oEv)
end sub
Sub num_focus_disposing(oEv)
End Sub
sub num_key_keyPressed(oEv)
End Sub
sub num_key_keyReleased(oEv)
If (oEv.KeyCode = 1280) Then Set_Position
End Sub
Sub num_key_disposing(oEv)
End Sub
Sub chk_item_itemStateChanged (oEv)
Set_step
end sub
Sub chk_item_disposing(oEv)
end sub
sub numstep_text_textChanged
Set_step
end sub
sub numstep_text_disposing(oEv)
end sub
'Diese Routinen werden von dem XTopWindowListener benötigt
Sub Win_windowClosing( oEvent ) 'Dialog schließen
odlg.setVisible(False)
odlg.dispose
End Sub
Sub Win_disposing( )
End Sub
Sub Win_windowOpened ( oEvent )
End sub
Sub Win_windowClosed ( oEvent )
End sub
Sub Win_windowMinimized ( oEvent )
End sub
Sub Win_windowNormalized ( oEvent )
End sub
Sub Win_windowActivated ( oEvent )
End sub
Sub Win_windowDeactivated ( oEvent )
End sub
-
- ****
- Beiträge: 115
- Registriert: Di, 10.01.2012 10:51
- Kontaktdaten:
Re: Writer Editor Fenster aktiv lassen bei Dialogaufruf
Hallo Ric
zu deiner frage mit dem Listener:
das Einfachst, und Effektivste ist, wenn du einfach jedesmal bevor eine Verschiebung oder Änderung durch ein Makro gemacht wird abfragst, ob es sich um ein Grafikobjekt handelt.
Verbesserungsvorschläge zu deinem Code:
1. du solltest zur besseren Lesbarkeit Einrückungen verwenden:
z.b.:
Verbesserungsvorschlag für das Tool:
Um die Funktionalität zu verbessern, wäre es doch sinnvoll, wenn man die Größe der Grafiken auch über Buttons verändern könnte.
ich empfinde es nicht unbedingt als sehr komfortabel, dies über die Textfelder zu machen.
dazu könnte man über "steps" eine zweite Ebene in den Dialog einbauen, zu der über ein Optionsfeld gewechselt werden kann.
Dort sollte dann auch die Option "Seitenverhältnis beibehalten" zur Verfügung stehen.
Gruß Frieder
zu deiner frage mit dem Listener:
Ich würde das nicht über einen Listener kontrollieren, da dass zu viele Resources vernichtet, und zu aufwendig ist.Eine Frage bleibt noch:
Wie detektiere ich, das die Auswahl geändert wurde?
Der "com.sun.star.view.XSelectionChangeListener" reagiert auf jede Änderung in der Ansicht, auch wenn ich die Auswahl gar nicht ändere, sondern nur verschiebe. Hat da noch jemand eine Idee?
das Einfachst, und Effektivste ist, wenn du einfach jedesmal bevor eine Verschiebung oder Änderung durch ein Makro gemacht wird abfragst, ob es sich um ein Grafikobjekt handelt.
Verbesserungsvorschläge zu deinem Code:
1. du solltest zur besseren Lesbarkeit Einrückungen verwenden:
z.b.:
Code: Alles auswählen
if isNull(object) then
if not bVar then
for i=0 to 100
sVar(i)= "Name" & i
oObject= was auch immer
with oObject
.Name="hallo"
.Size=5
end with
next
end if
end if
Um die Funktionalität zu verbessern, wäre es doch sinnvoll, wenn man die Größe der Grafiken auch über Buttons verändern könnte.
ich empfinde es nicht unbedingt als sehr komfortabel, dies über die Textfelder zu machen.
dazu könnte man über "steps" eine zweite Ebene in den Dialog einbauen, zu der über ein Optionsfeld gewechselt werden kann.
Dort sollte dann auch die Option "Seitenverhältnis beibehalten" zur Verfügung stehen.
Gruß Frieder
Re: Writer Editor Fenster aktiv lassen bei Dialogaufruf
Hallo Frieder,
vielen Dank für den Code!
Es ist in der Tat so, dass wir die gleiche Lösung haben!
Das o.a. Problem bleibt leider noch, ich bin der Lösung nahe, aber noch nicht fertig:
Wenn ich die Auswahl ändere, sollen die aktuellen Positions- und Größeninformationen der neuen Auswahl in den Dialog übernommen werden.
Man möchte doch gerne wissen wo sich das Object befindet und wie groß es ist, bevor man es verschiebt.
Ich habe jetzt erstmal folgenden Code um die Änderung der Auswahl zu detektieren erzeugt:
und die neue Sub (muß noch aufgeräumt werden):
Aber das funktioniert leider noch nicht richtig. Es ergeben sich unterschiedliche Lageinformationen, je nachdem ob ich im Writer oder in Calc arbeite.
Für Tipps bin ich dankbar.
Beste Grüße Rik
vielen Dank für den Code!
Es ist in der Tat so, dass wir die gleiche Lösung haben!
Habe und hatte ich nicht vor, da ich die Extension bald hochlade, dachte ich, es wäre noch nicht nötig den Code schon zu posten.Frieder D. hat geschrieben:Da du deine Lösung geheim hältst, möchte ich meine vorstellen:
Das o.a. Problem bleibt leider noch, ich bin der Lösung nahe, aber noch nicht fertig:
Wenn ich die Auswahl ändere, sollen die aktuellen Positions- und Größeninformationen der neuen Auswahl in den Dialog übernommen werden.
Ja, das stimmt, aber wie bekomme ich die aktuellen Positions- und Größeninformationen der neuen Auswahl dann in den Dialog?Frieder D. hat geschrieben:Das Einfachste, und Effektivste ist, wenn du einfach jedesmal bevor eine Verschiebung oder Änderung durch ein Makro gemacht wird abfragst, ob es sich um ein Grafikobjekt handelt.
Man möchte doch gerne wissen wo sich das Object befindet und wie groß es ist, bevor man es verschiebt.
Ich habe jetzt erstmal folgenden Code um die Änderung der Auswahl zu detektieren erzeugt:
Code: Alles auswählen
Sub S_Create_Dialog_MiniMove
Dim oWindow As Object
Dim oMod As Object
Dim i As Integer
if dstep = 0 then dstep = 1
odoc = stardesktop.currentcomponent
ocontroller = odoc.currentcontroller
oSelectionChangeListener = createUnoListener("sel_", "com.sun.star.view.XSelectionChangeListener")
ocontroller.addSelectionChangeListener(oSelectionChangeListener)
.
.
.
end sub
sub sel_selectionChanged(ev)
osel = ev.source.Selection
if ismissing(osel) or not osel.supportsService("com.sun.star.drawing.ShapeCollection") then exit sub
S_set_pos_Size(osel)
end sub
Code: Alles auswählen
sub S_set_pos_size (osel)
if ismissing(osel) or not osel.supportsService("com.sun.star.drawing.ShapeCollection") then
if not osel.supportsService("com.sun.star.text.BaseFrame") then
msgbox ("Please select"+chr(13)+"→ shape"+chr(13)+"→ picture"+chr(13)+"→ frame"+chr(13)+"→ floating frame"+chr(13)+"→ control",64,"MMove")
exit sub
endif
endif
if osel.supportsService("com.sun.star.drawing.ShapeCollection") then
opos = osel(0).Position
oSize = osel(0).Size
SX=oSize.Width
SY=oSize.Height
X=opos.X
Y=opos.Y
X= runden(X/100)
Y= runden(Y/100)
SX= runden(SX/100)
SY= runden(SY/100)
opos.X = X*100
opos.Y = Y*100
oSize.Width = SX*100
oSize.Height = SY*100
'set position on 1mm grid
'osel(0).Position = opos
oNumSX.Text=SX
oNumSY.Text=SY
oNumX.Text=X
oNumY.Text=Y
else
X = osel.HoriOrientPosition
Y = osel.VertOrientPosition
oSize = osel.Size
SX=oSize.Width
SY=oSize.Height
X= runden(X/100)
Y= runden(Y/100)
SX= runden(SX/100)
SY= runden(SY/100)
oNumSX.Text=SX
oNumSY.Text=SY
oNumX.Text=X
oNumY.Text=Y
endif
end sub
Für Tipps bin ich dankbar.
Beste Grüße Rik
- miniKasse MMove 1.0.6 Base Videotutorial
- Windows 10: AOO, LO Linux Mint: AOO, LO
-
- ****
- Beiträge: 115
- Registriert: Di, 10.01.2012 10:51
- Kontaktdaten:
Re: Writer Editor Fenster aktiv lassen bei Dialogaufruf
Hallo Rik
Ich habe es auch einmahl mit einem focus listener probiert, aber das Ergebnis ist nicht überzeugend.
versuche ich nun z.B. verschiedene Objekte in einem Dokument anzuklicken, so gelingt das nicht immer.
Außerdem liegt bei deinem Code so einiges im Argen.
Du solltest dir angewöhnen Variablen auch zu deklarieren.
meine Erfahrung hat gezeigt, je mehr Listener man in einem Makro unterbringt, desto instabiler wird es.
um dein Tool stabiler und besser zu machen, würde ich noch einmahl ganz von vorne anfangen.
Hier der Code:
Gruß Frieder
Ich habe es auch einmahl mit einem focus listener probiert, aber das Ergebnis ist nicht überzeugend.
versuche ich nun z.B. verschiedene Objekte in einem Dokument anzuklicken, so gelingt das nicht immer.
Außerdem liegt bei deinem Code so einiges im Argen.
Du solltest dir angewöhnen Variablen auch zu deklarieren.
meine Erfahrung hat gezeigt, je mehr Listener man in einem Makro unterbringt, desto instabiler wird es.
um dein Tool stabiler und besser zu machen, würde ich noch einmahl ganz von vorne anfangen.
Hier der Code:
Code: Alles auswählen
REM ***** BASIC *****
Global oNumSX as object
Global oNumSY as object
Global oNumX as object
Global oNumY as object
Global oNumStep as object
Global X as double
Global Y as double
Global SX as double
Global SY as double
Global odlg as object
Global l as double
global dstep as double
global bThenth as boolean
Global oPreviousSel as object
Global oSelectionChangeListener
Global ocontroller
Sub S_Create_Dialog_MiniMove
Dim oWindow As Object
Dim oMod As Object
Dim i As Integer
if dstep = 0 then dstep = 1
If not isNull (odlg) then
if odlg.isVisible() Then
odlg.setVisible(False)
odlg.dispose
end if
end if
'oSelectionChangeListener entfernen
if Not ( isEmpty (oSelectionChangeListener) or IsNull(oSelectionChangeListener)) then
ocontroller.removeSelectionChangeListener(oSelectionChangeListener)
oSelectionChangeListener=Null
end if
'Göße und position des objekts bestimmen(Globale Variablen füllen),
' und überprüfen, ob es ein Grafikobject ist.
if not get_size_and_pos () then
msgbox ("Please select"+chr(13)+"→ shape"+chr(13)+"→ picture"+chr(13)+"→ frame"+chr(13)+"→ floating frame"+chr(13)+"→ control",64,"MMove")
exit sub
End if
REM ***** Initialisierung der Eigenschaften des Dialogs
odlgModel = CreateUnoService("com.sun.star.awt.UnoControlDialogModel")
With odlgModel
.setPropertyValue("PositionX", 320)
.setPropertyValue("PositionY", 111 )
.setPropertyValue("FontName", Font)
.setPropertyValue("Width", 82)
.setPropertyValue("Height", 76)
.setPropertyValue("Title", "MiniMove")
.setPropertyValue("Name", "DLGMove")
'.setPropertyValue("DesktopAsParent", True )
End With
odlg = CreateUnoService("com.sun.star.awt.UnoControlDialog")
REM ********** Textlabel erzeugen
oMod = odlgModel.createInstance("com.sun.star.awt.UnoControlFixedTextModel")
With oMod
.setPropertyValue("Label", "X")
.setPropertyValue("Name", "lblSX")
.setPropertyValue("PositionX", 2)
.setPropertyValue("PositionY", 11)
.setPropertyValue("Height",11)
.setPropertyValue("Width", 6)
End With
odlgModel.insertByName("lblSX", oMod)
REM ********** Textlabel erzeugen
oMod = odlgModel.createInstance("com.sun.star.awt.UnoControlFixedTextModel")
With oMod
.setPropertyValue("Label", "Y")
.setPropertyValue("Name", "lblSY")
.setPropertyValue("PositionX", 76)
.setPropertyValue("PositionY", 11)
.setPropertyValue("Height",11)
.setPropertyValue("Width", 6)
End With
odlgModel.insertByName("lblSY", oMod)
REM ********** Textlabel erzeugen
oMod = odlgModel.createInstance("com.sun.star.awt.UnoControlFixedTextModel")
With oMod
.setPropertyValue("Label", "X")
.setPropertyValue("Name", "lblX")
.setPropertyValue("PositionX", 2)
.setPropertyValue("PositionY", 57)
.setPropertyValue("Height",11)
.setPropertyValue("Width", 6)
End With
odlgModel.insertByName("lblX", oMod)
REM ********** Textlabel erzeugen
oMod = odlgModel.createInstance("com.sun.star.awt.UnoControlFixedTextModel")
With oMod
.setPropertyValue("Label", "Y")
.setPropertyValue("Name", "lblY")
.setPropertyValue("PositionX", 76)
.setPropertyValue("PositionY", 57)
.setPropertyValue("Height",11)
.setPropertyValue("Width", 6)
End With
odlgModel.insertByName("lblY", oMod)
REM ********** Textlabel erzeugen
oMod = odlgModel.createInstance("com.sun.star.awt.UnoControlFixedTextModel")
With oMod
.setPropertyValue("Label", "Size")
.setPropertyValue("Name", "lblSize")
.setPropertyValue("PositionX", 8)
.setPropertyValue("PositionY", 4)
.setPropertyValue("Height",8)
.setPropertyValue("Width",20)
.setPropertyValue("FontHeight",7)
End With
odlgModel.insertByName("lblSize", oMod)
REM ********** Textlabel erzeugen
oMod = odlgModel.createInstance("com.sun.star.awt.UnoControlFixedTextModel")
With oMod
.setPropertyValue("Label", "[mm]")
.setPropertyValue("Name", "lblSmm")
.setPropertyValue("PositionX", 54)
.setPropertyValue("PositionY", 4)
.setPropertyValue("Height",8)
.setPropertyValue("Width", 50)
.setPropertyValue("FontHeight",6)
End With
odlgModel.insertByName("lblSmm", oMod)
REM ********** Textlabel erzeugen
oMod = odlgModel.createInstance("com.sun.star.awt.UnoControlFixedTextModel")
With oMod
.setPropertyValue("Label", "Step")
.setPropertyValue("Name", "lblStep")
.setPropertyValue("PositionX", 31)
.setPropertyValue("PositionY", 24)
.setPropertyValue("Height",8)
.setPropertyValue("Width", 23)
.setPropertyValue("FontHeight",7)
End With
odlgModel.insertByName("lblStep", oMod)
REM ********** Textlabel erzeugen
oMod = odlgModel.createInstance("com.sun.star.awt.UnoControlFixedTextModel")
With oMod
.setPropertyValue("Label", "Position")
.setPropertyValue("Name", "lblPosition")
.setPropertyValue("PositionX", 8)
.setPropertyValue("PositionY", 50)
.setPropertyValue("Height",8)
.setPropertyValue("Width", 23)
.setPropertyValue("FontHeight",7)
End With
odlgModel.insertByName("lblPosition", oMod)
REM ********** Textlabel erzeugen
oMod = odlgModel.createInstance("com.sun.star.awt.UnoControlFixedTextModel")
With oMod
.setPropertyValue("Label", "[mm]")
.setPropertyValue("Name", "lblPmm")
.setPropertyValue("PositionX", 54)
.setPropertyValue("PositionY", 50)
.setPropertyValue("Height",8)
.setPropertyValue("Width", 50)
.setPropertyValue("FontHeight",6)
End With
odlgModel.insertByName("lblPmm", oMod)
REM ********** Textlabel erzeugen
oMod = odlgModel.createInstance("com.sun.star.awt.UnoControlFixedTextModel")
With oMod
.setPropertyValue("Label", "made by rikhustede.de")
.setPropertyValue("Name", "lblmadeby")
.setPropertyValue("PositionX", 34)
.setPropertyValue("PositionY", 70)
.setPropertyValue("Height",8)
.setPropertyValue("Width", 50)
.setPropertyValue("FontHeight",6)
End With
odlgModel.insertByName("lblmadeby", oMod)
REM ********** Optionsbuttons erzeugen
dim s_buttons(3,4) as variant
s_buttons(0,1)="↑"
s_buttons(0,2)="→"
s_buttons(0,3)="↓"
s_buttons(0,4)="←"
s_buttons(1,1)=31
s_buttons(1,2)=54
s_buttons(1,3)=31
s_buttons(1,4)=8
s_buttons(2,1)=4
s_buttons(2,2)=27
s_buttons(2,3)=50
s_buttons(2,4)=27
s_buttons(3,1)="Y - 100"
s_buttons(3,2)="X + 100"
s_buttons(3,3)="Y + 100"
s_buttons(3,4)="X - 100"
for i=1 to 4
oMod = odlgModel.createInstance("com.sun.star.awt.UnoControlButtonModel")
With oMod
.setPropertyValue("Label", s_buttons(0,i))
.setPropertyValue("Name", "cmd"+i)
.setPropertyValue("PositionX", s_buttons(1,i))
.setPropertyValue("PositionY", s_buttons(2,i))
.setPropertyValue("Height", 20)
.setPropertyValue("Width", 20)
.setPropertyValue("Tag", s_buttons(3,i))
.setPropertyValue("FontHeight",18)
.setPropertyValue("FocusOnClick",false)
.setPropertyValue("Tabstop",false)
End With
odlgModel.insertByName("cmd"+i, oMod)
next i
REM **********numerisches Feld erzeugen
oMod = odlgModel.createInstance("com.sun.star.awt.UnoControlNumericFieldModel")
With oMod
.setPropertyValue("Name", "NumSX")
.setPropertyValue("PositionX", 8)
.setPropertyValue("PositionY", 10)
.setPropertyValue("Height", 10)
.setPropertyValue("Width", 20)
.setPropertyValue("Value", SX)
End With
odlgModel.insertByName("NumSX", oMod)
REM **********numerisches Feld erzeugen
oMod = odlgModel.createInstance("com.sun.star.awt.UnoControlNumericFieldModel")
With oMod
.setPropertyValue("Name", "NumSY")
.setPropertyValue("PositionX", 54)
.setPropertyValue("PositionY", 10)
.setPropertyValue("Height", 10)
.setPropertyValue("Width", 20)
.setPropertyValue("Value", SY)
End With
odlgModel.insertByName("NumSY", oMod)
REM **********numerisches Feld erzeugen
oMod = odlgModel.createInstance("com.sun.star.awt.UnoControlNumericFieldModel")
With oMod
.setPropertyValue("Name", "NumX")
.setPropertyValue("PositionX", 8)
.setPropertyValue("PositionY", 56)
.setPropertyValue("Height", 10)
.setPropertyValue("Width", 20)
.setPropertyValue("Value", X)
End With
odlgModel.insertByName("NumX", oMod)
REM **********numerisches Feld erzeugen
oMod = odlgModel.createInstance("com.sun.star.awt.UnoControlNumericFieldModel")
With oMod
.setPropertyValue("Name", "NumY")
.setPropertyValue("PositionX", 54)
.setPropertyValue("PositionY", 56)
.setPropertyValue("Height", 10)
.setPropertyValue("Width", 20)
.setPropertyValue("Value", Y)
End With
odlgModel.insertByName("NumY", oMod)
REM **********numerisches Drehfeld erzeugen
oMod = odlgModel.createInstance("com.sun.star.awt.UnoControlNumericFieldModel")
With oMod
.setPropertyValue("Name", "NumStep")
.setPropertyValue("PositionX", 31)
.setPropertyValue("PositionY", 30)
.setPropertyValue("Height", 12)
.setPropertyValue("Width", 20)
.setPropertyValue("Value", dstep)
.setPropertyValue("Spin", true)
.setPropertyValue("ValueMax",20)
.setPropertyValue("ValueMin",1)
End With
odlgModel.insertByName("NumStep", oMod)
REM **********Checkbox erzeugen
oMod = odlgModel.createInstance("com.sun.star.awt.UnoControlCheckBoxModel")
With oMod
.setPropertyValue("Name", "ChkStep")
.setPropertyValue("PositionX", 31)
.setPropertyValue("PositionY", 42)
.setPropertyValue("Height", 14)
.setPropertyValue("Width", 20)
.setPropertyValue("Label", "1/10")
.setPropertyValue("FontHeight",7)
End With
if bthenth = false then
oMod.setPropertyValue("State", 0)
else
oMod.setPropertyValue("State", 1)
endif
odlgModel.insertByName("ChkStep", oMod)
odlg.setModel(odlgModel)
oNumSX= odlg.getcontrol("NumSX")
oNumSY = odlg.getcontrol("NumSY")
oNumX = odlg.getcontrol("NumX")
oNumY = odlg.getcontrol("NumY")
oNumStep = odlg.getcontrol("NumStep")
oChkStep = odlg.getcontrol("ChkStep")
oNumSX.DecimalDigits = 1
oNumSY.DecimalDigits = 1
oNumX.DecimalDigits = 1
oNumY.DecimalDigits = 1
Set_digits
REM ********** Listener für den Register erzeugen Button
ocmd_move_Listener = createUnoListener("cmd_move_", "com.sun.star.awt.XActionListener")
for i=1 to 4
oControl = odlg.getControl("cmd"+i)
oControl.addActionListener(ocmd_move_Listener)
next i
o_numS_focus_Listener = createUnoListener("numS_focus_", "com.sun.star.awt.XFocusListener")
oNumSX.addFocusListener(o_numS_focus_Listener)
oNumSY.addFocusListener(o_numS_focus_Listener)
o_num_focus_Listener = createUnoListener("num_focus_", "com.sun.star.awt.XFocusListener")
oNumX.addFocusListener(o_num_focus_Listener)
oNumY.addFocusListener(o_num_focus_Listener)
o_numS_key_Listener = createUnoListener("numS_key_", "com.sun.star.awt.XKeyListener")
oNumSX.addKeyListener(o_numS_key_Listener)
oNumSY.addKeyListener(o_numS_key_Listener)
o_num_key_Listener = createUnoListener("num_key_", "com.sun.star.awt.XKeyListener")
oNumX.addKeyListener(o_num_key_Listener)
oNumY.addKeyListener(o_num_key_Listener)
o_ChkStep_item_Listener = createUnoListener("chk_item_", "com.sun.star.awt.XItemListener")
oChkStep.addItemListener(o_ChkStep_item_Listener)
o_NumStep_text_Listener = createUnoListener("numstep_text_", "com.sun.star.awt.XTextListener")
oNumStep.addTextListener(o_NumStep_text_Listener)
REM ********** Mittels des Modells den Dialog anzeigen
oWindow = CreateUnoService("com.sun.star.awt.Toolkit")
odlg.createPeer(oWindow, null)
Dim oWindowsListener as Object
oWindowsListener = CreateUnoListener( "Win_", "com.sun.star.awt.XTopWindowListener" )
odlg.addTopWindowListener(oWindowsListener)
odlg.setVisible(True)
odoc = stardesktop.currentcomponent
ocontroller = odoc.currentcontroller
oSelectionChangeListener = createUnoListener("sel_", "com.sun.star.view.XSelectionChangeListener")
ocontroller.addSelectionChangeListener(oSelectionChangeListener)
End Sub
Sub S_Create_Dialog_MicroMove
Dim oWindow As Object
Dim oMod As Object
Dim i As Integer
if dstep = 0 then dstep = 1
If not isNull (odlg) then
if odlg.isVisible() Then
odlg.setVisible(False)
odlg.dispose
end if
end if
'oSelectionChangeListener entfernen
if Not ( isEmpty (oSelectionChangeListener) or IsNull(oSelectionChangeListener)) then
ocontroller.removeSelectionChangeListener(oSelectionChangeListener)
oSelectionChangeListener=Null
end if
'Göße und position des objekts bestimmen(Globale Variablen füllen),
' und überprüfen, ob es ein Grafikobject ist.
if not get_size_and_pos () then
msgbox ("Please select"+chr(13)+"→ shape"+chr(13)+"→ picture"+chr(13)+"→ frame"+chr(13)+"→ floating frame"+chr(13)+"→ control",64,"MMove")
exit sub
End if
REM ***** Initialisierung der Eigenschaften des Dialogs
odlgModel = CreateUnoService("com.sun.star.awt.UnoControlDialogModel")
With odlgModel
.setPropertyValue("PositionX", 320)
.setPropertyValue("PositionY", 111 )
.setPropertyValue("FontName", Font)
.setPropertyValue("Width", 58)
.setPropertyValue("Height", 57)
.setPropertyValue("Title", "MicroMove")
.setPropertyValue("Name", "DLGMove")
.setPropertyValue("FontHeight",7)
'.setPropertyValue("DesktopAsParent", True )
End With
odlg = CreateUnoService("com.sun.star.awt.UnoControlDialog")
REM ********** Textlabel erzeugen
oMod = odlgModel.createInstance("com.sun.star.awt.UnoControlFixedTextModel")
With oMod
.setPropertyValue("Label", "X")
.setPropertyValue("Name", "lblSX")
.setPropertyValue("PositionX", 1)
.setPropertyValue("PositionY", 7)
.setPropertyValue("Height",11)
.setPropertyValue("Width", 6)
.setPropertyValue("FontHeight",6)
End With
odlgModel.insertByName("lblSX", oMod)
REM ********** Textlabel erzeugen
oMod = odlgModel.createInstance("com.sun.star.awt.UnoControlFixedTextModel")
With oMod
.setPropertyValue("Label", "Y")
.setPropertyValue("Name", "lblSY")
.setPropertyValue("PositionX", 54)
.setPropertyValue("PositionY", 7)
.setPropertyValue("Height",11)
.setPropertyValue("Width", 6)
.setPropertyValue("FontHeight",6)
End With
odlgModel.insertByName("lblSY", oMod)
REM ********** Textlabel erzeugen
oMod = odlgModel.createInstance("com.sun.star.awt.UnoControlFixedTextModel")
With oMod
.setPropertyValue("Label", "X")
.setPropertyValue("Name", "lblX")
.setPropertyValue("PositionX", 1)
.setPropertyValue("PositionY", 40)
.setPropertyValue("Height",11)
.setPropertyValue("Width", 6)
.setPropertyValue("FontHeight",6)
End With
odlgModel.insertByName("lblX", oMod)
REM ********** Textlabel erzeugen
oMod = odlgModel.createInstance("com.sun.star.awt.UnoControlFixedTextModel")
With oMod
.setPropertyValue("Label", "Y")
.setPropertyValue("Name", "lblY")
.setPropertyValue("PositionX", 54)
.setPropertyValue("PositionY", 40)
.setPropertyValue("Height",11)
.setPropertyValue("Width", 6)
.setPropertyValue("FontHeight",6)
End With
odlgModel.insertByName("lblY", oMod)
REM ********** Textlabel erzeugen
oMod = odlgModel.createInstance("com.sun.star.awt.UnoControlFixedTextModel")
With oMod
.setPropertyValue("Label", "Size")
.setPropertyValue("Name", "lblSize")
.setPropertyValue("PositionX", 6)
.setPropertyValue("PositionY", 0)
.setPropertyValue("Height",8)
.setPropertyValue("Width", 20)
.setPropertyValue("FontHeight",6)
End With
odlgModel.insertByName("lblSize", oMod)
REM ********** Textlabel erzeugen
oMod = odlgModel.createInstance("com.sun.star.awt.UnoControlFixedTextModel")
With oMod
.setPropertyValue("Label", "[mm]")
.setPropertyValue("Name", "lblSmm")
.setPropertyValue("PositionX", 42)
.setPropertyValue("PositionY", 0)
.setPropertyValue("Height",8)
.setPropertyValue("Width", 50)
.setPropertyValue("FontHeight",6)
End With
odlgModel.insertByName("lblSmm", oMod)
REM ********** Textlabel erzeugen
oMod = odlgModel.createInstance("com.sun.star.awt.UnoControlFixedTextModel")
With oMod
.setPropertyValue("Label", "Step")
.setPropertyValue("Name", "lblStep")
.setPropertyValue("PositionX", 19)
.setPropertyValue("PositionY", 15)
.setPropertyValue("Height",8)
.setPropertyValue("Width", 23)
.setPropertyValue("FontHeight",6)
End With
odlgModel.insertByName("lblStep", oMod)
REM ********** Textlabel erzeugen
oMod = odlgModel.createInstance("com.sun.star.awt.UnoControlFixedTextModel")
With oMod
.setPropertyValue("Label", "Position")
.setPropertyValue("Name", "lblPosition")
.setPropertyValue("PositionX", 6)
.setPropertyValue("PositionY", 33)
.setPropertyValue("Height",8)
.setPropertyValue("Width", 15)
.setPropertyValue("FontHeight",6)
End With
odlgModel.insertByName("lblPosition", oMod)
REM ********** Textlabel erzeugen
oMod = odlgModel.createInstance("com.sun.star.awt.UnoControlFixedTextModel")
With oMod
.setPropertyValue("Label", "[mm]")
.setPropertyValue("Name", "lblPmm")
.setPropertyValue("PositionX", 42)
.setPropertyValue("PositionY", 33)
.setPropertyValue("Height",8)
.setPropertyValue("Width", 50)
.setPropertyValue("FontHeight",6)
End With
odlgModel.insertByName("lblPmm", oMod)
REM ********** Textlabel erzeugen
oMod = odlgModel.createInstance("com.sun.star.awt.UnoControlFixedTextModel")
With oMod
.setPropertyValue("Label", "made by rikhustede.de")
.setPropertyValue("Name", "lblmadeby")
.setPropertyValue("PositionX", 12)
.setPropertyValue("PositionY", 50)
.setPropertyValue("Height",8)
.setPropertyValue("Width", 50)
.setPropertyValue("FontHeight",6)
End With
odlgModel.insertByName("lblmadeby", oMod)
REM ********** Optionsbuttons erzeugen
dim s_buttons(3,4) as variant
s_buttons(0,1)="↑"
s_buttons(0,2)="→"
s_buttons(0,3)="↓"
s_buttons(0,4)="←"
s_buttons(1,1)=23
s_buttons(1,2)=40
s_buttons(1,3)=23
s_buttons(1,4)=6
s_buttons(2,1)=5
s_buttons(2,2)=22
s_buttons(2,3)=38
s_buttons(2,4)=22
s_buttons(3,1)="Y - 100"
s_buttons(3,2)="X + 100"
s_buttons(3,3)="Y + 100"
s_buttons(3,4)="X - 100"
for i=1 to 4
oMod = odlgModel.createInstance("com.sun.star.awt.UnoControlButtonModel")
With oMod
.setPropertyValue("Label", s_buttons(0,i))
.setPropertyValue("Name", "cmd"+i)
.setPropertyValue("PositionX", s_buttons(1,i))
.setPropertyValue("PositionY", s_buttons(2,i))
.setPropertyValue("Height", 12)
.setPropertyValue("Width", 12)
.setPropertyValue("Tag", s_buttons(3,i))
.setPropertyValue("FontHeight",14)
.setPropertyValue("FocusOnClick",false)
.setPropertyValue("Tabstop",false)
End With
odlgModel.insertByName("cmd"+i, oMod)
next i
REM **********numerisches Feld erzeugen
oMod = odlgModel.createInstance("com.sun.star.awt.UnoControlNumericFieldModel")
With oMod
.setPropertyValue("Name", "NumSX")
.setPropertyValue("PositionX", 6)
.setPropertyValue("PositionY", 6)
.setPropertyValue("Height", 10)
.setPropertyValue("Width", 15)
.setPropertyValue("Value", SX)
End With
odlgModel.insertByName("NumSX", oMod)
REM **********numerisches Feld erzeugen
oMod = odlgModel.createInstance("com.sun.star.awt.UnoControlNumericFieldModel")
With oMod
.setPropertyValue("Name", "NumSY")
.setPropertyValue("PositionX", 38)
.setPropertyValue("PositionY", 6)
.setPropertyValue("Height", 10)
.setPropertyValue("Width", 15)
.setPropertyValue("Value", SY)
End With
odlgModel.insertByName("NumSY", oMod)
REM **********numerisches Feld erzeugen
oMod = odlgModel.createInstance("com.sun.star.awt.UnoControlNumericFieldModel")
With oMod
.setPropertyValue("Name", "NumX")
.setPropertyValue("PositionX", 6)
.setPropertyValue("PositionY", 39)
.setPropertyValue("Height", 10)
.setPropertyValue("Width", 15)
.setPropertyValue("Value", X)
End With
odlgModel.insertByName("NumX", oMod)
REM **********numerisches Feld erzeugen
oMod = odlgModel.createInstance("com.sun.star.awt.UnoControlNumericFieldModel")
With oMod
.setPropertyValue("Name", "NumY")
.setPropertyValue("PositionX", 38)
.setPropertyValue("PositionY", 39)
.setPropertyValue("Height", 10)
.setPropertyValue("Width", 15)
.setPropertyValue("Value", Y)
End With
odlgModel.insertByName("NumY", oMod)
REM **********numerisches Drehfeld erzeugen
oMod = odlgModel.createInstance("com.sun.star.awt.UnoControlNumericFieldModel")
With oMod
.setPropertyValue("Name", "NumStep")
.setPropertyValue("PositionX", 19)
.setPropertyValue("PositionY", 21)
.setPropertyValue("Height", 10)
.setPropertyValue("Width", 21)
.setPropertyValue("Value", dStep)
.setPropertyValue("Spin", true)
.setPropertyValue("ValueMax",9)
.setPropertyValue("ValueMin",1)
End With
odlgModel.insertByName("NumStep", oMod)
REM **********Checkbox erzeugen
oMod = odlgModel.createInstance("com.sun.star.awt.UnoControlCheckBoxModel")
With oMod
.setPropertyValue("Name", "ChkStep")
.setPropertyValue("PositionX", 22)
.setPropertyValue("PositionY", 31)
.setPropertyValue("Height", 12)
.setPropertyValue("Width", 20)
.setPropertyValue("Label", "1/10")
.setPropertyValue("FontHeight",6)
End With
if bthenth = false then
oMod.setPropertyValue("State", 0)
else
oMod.setPropertyValue("State", 1)
endif
odlgModel.insertByName("ChkStep", oMod)
odlg.setModel(odlgModel)
oNumSX= odlg.getcontrol("NumSX")
oNumSY = odlg.getcontrol("NumSY")
oNumX = odlg.getcontrol("NumX")
oNumY = odlg.getcontrol("NumY")
oNumStep=odlg.getcontrol("NumStep")
oChkStep = odlg.getcontrol("ChkStep")
oNumSX.DecimalDigits = 1
oNumSY.DecimalDigits = 1
oNumX.DecimalDigits = 1
oNumY.DecimalDigits = 1
Set_digits
REM ********** Listener für den Register erzeugen Button
ocmd_move_Listener = createUnoListener("cmd_move_", "com.sun.star.awt.XActionListener")
for i=1 to 4
oControl = odlg.getControl("cmd"+i)
oControl.addActionListener(ocmd_move_Listener)
next i
o_numS_focus_Listener = createUnoListener("numS_focus_", "com.sun.star.awt.XFocusListener")
oNumSX.addFocusListener(o_numS_focus_Listener)
oNumSY.addFocusListener(o_numS_focus_Listener)
o_num_focus_Listener = createUnoListener("num_focus_", "com.sun.star.awt.XFocusListener")
oNumX.addFocusListener(o_num_focus_Listener)
oNumY.addFocusListener(o_num_focus_Listener)
o_numS_key_Listener = createUnoListener("numS_key_", "com.sun.star.awt.XKeyListener")
oNumSX.addKeyListener(o_numS_key_Listener)
oNumSY.addKeyListener(o_numS_key_Listener)
o_num_key_Listener = createUnoListener("num_key_", "com.sun.star.awt.XKeyListener")
oNumX.addKeyListener(o_num_key_Listener)
oNumY.addKeyListener(o_num_key_Listener)
o_ChkStep_item_Listener = createUnoListener("chk_item_", "com.sun.star.awt.XItemListener")
oChkStep.addItemListener(o_ChkStep_item_Listener)
o_NumStep_text_Listener = createUnoListener("numstep_text_", "com.sun.star.awt.XTextListener")
oNumStep.addTextListener(o_NumStep_text_Listener)
REM ********** Mittels des Modells den Dialog anzeigen
oWindow = CreateUnoService("com.sun.star.awt.Toolkit")
odlg.createPeer(oWindow, null)
Dim oWindowsListener as Object
oWindowsListener = CreateUnoListener( "Win_", "com.sun.star.awt.XTopWindowListener" )
odlg.addTopWindowListener(oWindowsListener)
odlg.setVisible(True)'execute=true
oSelectionChangeListener = createUnoListener("sel_", "com.sun.star.view.XSelectionChangeListener")
ocontroller.addSelectionChangeListener(oSelectionChangeListener)
End Sub
sub moveshape(oEv)
dim sTag as string
'dim a()
dstep = odlg.getcontrol("NumStep").value
l= 100 * dstep
osel = Thiscomponent.currentselection
a = split(oEv.Source.Model.Tag," ")
if a(0) = "X" then
if a(1) = "-" then
dx = -l
else
dx = l
endif
dy = 0
else
dx = 0
if a(1) = "-" then
dy = -l
else
dy = l
endif
endif
if osel.supportsService("com.sun.star.drawing.ShapeCollection") then
opos = osel(0).Position
X = opos.X+dx
y = opos.Y+dy
opos.X = X
opos.Y = Y
osel(0).Position = opos
oNumX.Text=runden(X/100)
oNumY.Text=runden(Y/100)
else
X = osel.HoriOrientPosition+dx
Y = osel.VertOrientPosition+dy
osel.HoriOrientPosition = X
osel.VertOrientPosition = Y
oNumX.Text=runden(X/100)
oNumY.Text=runden(Y/100)
endif
thiscomponent.modified = true
end sub
Sub Set_step
oChkStep = odlg.getcontrol("ChkStep")
if oChkStep.state = 0 then
bThenth = false
set_digits
else
bThenth = true
set_digits
endif
sStep = replace(odlg.getcontrol("NumStep").Text,",",".")
dstep = sStep
odlg.getcontrol("NumStep").value = dstep
end sub
sub Set_digits
if bThenth = false then
with oNumStep
.DecimalDigits = 0
.SpinSize = 1
.model.ValueMax = 20
.model.ValueMin = 1
end with
else
with oNumStep
.DecimalDigits = 1
.SpinSize = 0.1
.model.ValueMax = 9.9
.model.ValueMin = 0.1
end with
endif
end Sub
Sub Set_Position
On Error Goto ErrorHandler
dim doX as Integer
dim doY as Integer
osel = Thiscomponent.currentselection
if osel.supportsService("com.sun.star.drawing.ShapeCollection") then
opos = osel(0).Position
doX = oNumX.Text
doX = doX*100
doY = oNumY.Text
doY = doY*100
opos.X = doX
opos.Y = doY
osel(0).Position = opos
else
doX = oNumX.Text
doX = doX*100
doY = oNumY.Text
doY = doY*100
osel.HoriOrientPosition = doX
osel.VertOrientPosition = doY
endif
ErrorHandler:
thiscomponent.modified = true
end sub
Sub Set_Size
On Error Goto ErrorHandler
dim SoX as Integer
dim SoY as Integer
osel = Thiscomponent.currentselection
if osel.supportsService("com.sun.star.drawing.ShapeCollection") then
oSize = osel(0).Size
SoX = oNumSX.Text
SoX = SoX*100
SoY = oNumSY.Text
SoY = SoY*100
oSize.Width = SoX
oSize.Height = SoY
osel(0).Size = oSize
else
oSize = osel.Size
SoX = oNumSX.Text
SoX = SoX*100
SoY = oNumSY.Text
SoY = SoY*100
oSize.Width = SoX
oSize.Height = SoY
osel.Size = oSize
endif
ErrorHandler:
thiscomponent.modified = true
end sub
Function runden(dblZahl as double, optional iStellen as integer) as double
' Funktion rundet eine Zahl (dblZahl) auf die angegebene Anzahl von Stellen (iStellen)
' Angabe der Stellenanzahl optional (Standard=0)
dim dblTmp as double, lngTmp as Long
iStellen = 1
dblTmp = dblZahl * 10^iStellen
lngTmp = CLng(dblTmp)
dblTmp = CDbl(lngTmp) / 10^iStellen
runden = dblTmp
end Function
REM ***** Die Aktion des Listeners für die Buttons
Sub cmd_move_actionPerformed(oEv)
moveshape(oEv)
end sub
Sub cmd_move_disposing(oEv)
End Sub
REM ***** Listeners für die NumericFields
Sub numS_focus_focusLost(oEv)
Set_Size
end sub
Sub numS_focus_focusGained(oEv)
end sub
Sub numS_focus_disposing(oEv)
End Sub
sub numS_key_keyPressed(oEv)
End Sub
sub numS_key_keyReleased(oEv)
If (oEv.KeyCode = 1280) Then Set_Size
End Sub
Sub numS_key_disposing(oEv)
End Sub
'-------------------------------------------------
Sub num_focus_focusLost(oEv)
Set_Position
end sub
Sub num_focus_focusGained(oEv)
end sub
Sub num_focus_disposing(oEv)
End Sub
sub num_key_keyPressed(oEv)
End Sub
sub num_key_keyReleased(oEv)
If (oEv.KeyCode = 1280) Then Set_Position
End Sub
Sub num_key_disposing(oEv)
End Sub
Sub chk_item_itemStateChanged (oEv)
Set_step
end sub
Sub chk_item_disposing(oEv)
end sub
sub numstep_text_textChanged
Set_step
end sub
sub numstep_text_disposing(oEv)
end sub
'Diese Routinen werden von dem XTopWindowListener benötigt
Sub Win_windowClosing( oEvent ) 'Dialog schließen
odlg.setVisible(False)
odlg.dispose
if Not ( isEmpty (oSelectionChangeListener) or IsNull(oSelectionChangeListener)) then
ocontroller.removeSelectionChangeListener(oSelectionChangeListener)
oSelectionChangeListener=Null
end if
End Sub
Sub Win_disposing( )
End Sub
Sub Win_windowOpened ( oEvent )
End sub
Sub Win_windowClosed ( oEvent )
End sub
Sub Win_windowMinimized ( oEvent )
End sub
Sub Win_windowNormalized ( oEvent )
End sub
Sub Win_windowActivated ( oEvent )
End sub
Sub Win_windowDeactivated ( oEvent )
End sub
'--------------------------------------
Function get_size_and_pos () as boolean
Dim osel as object
Dim opos as object
Dim oSize as object
osel = stardesktop.currentcomponent.currentselection
oPreviousSel=osel
if ismissing(osel) or not osel.supportsService("com.sun.star.drawing.ShapeCollection") then
if not osel.supportsService("com.sun.star.text.BaseFrame") then
get_size_and_pos=False
exit function
endif
endif
on Error goto errorhandler
if osel.supportsService("com.sun.star.drawing.ShapeCollection") then
opos = osel(0).Position
oSize = osel(0).Size
SX=oSize.Width
SY=oSize.Height
X=opos.X
Y=opos.Y
X= runden(X/100)
Y= runden(Y/100)
SX= runden(SX/100)
SY= runden(SY/100)
opos.X = X*100
opos.Y = Y*100
oSize.Width = SX*100
oSize.Height = SY*100
'set position on 1mm grid
osel(0).Position = opos
else
X = osel.HoriOrientPosition
Y = osel.VertOrientPosition
oSize = osel.Size
SX=oSize.Width
SY=oSize.Height
X= runden(X/100)
Y= runden(Y/100)
SX= runden(SX/100)
SY= runden(SY/100)
osel.HoriOrientPosition = X*100
osel.VertOrientPosition = Y*100
oSize.Width = SX*100
oSize.Height = SY*100
endif
get_size_and_pos=True
Exit Function
errorhandler:
get_size_and_pos=False
end function
function Set_Numeric_Filds () as Boolean
if get_size_and_pos () Then
oNumSX.Text= SX
oNumSY.Text= SY
oNumX.Text= X
oNumY.Text= Y
Set_Numeric_Filds = True
else
Set_Numeric_Filds = False
end if
end function
sub sel_selectionChanged(ev)
osel = ev.source.Selection
if ismissing(osel) or not osel.supportsService("com.sun.star.drawing.ShapeCollection") then exit sub
Set_Numeric_Filds ()
end sub
Sub sel_disposing( )
End Sub
Re: Writer Editor Fenster aktiv lassen bei Dialogaufruf
Hallo Frieder,
nochmal vielen Dank für deine Arbeit.
Hier ein paar Anmerkungen zu Deinen Anmerkungen:
So nun möchte ich mich wieder auf das Problem konzentrieren:
Wie schaffe ich es, dass die Änderung der Auswahl fehlerfrei bemerkt wird?
Ich habe festgestellt, das der "com.sun.star.view.XSelectionChangeListener" ungewöhlich reagiert.
Und zwar unterschiedlich.
Im Writer:
Wenn ich die Selektion mit der Maus von Shape 1 (Quellobjekt) nach Shape 2 (Zielobjekt) ändere, feuert er 3x.
1.) die Event.Source ist das Quellobject
2.) die Event.Source ist das Zielobject
3.) die Event.Source ist nochmal das Zielobject
Was ist da falsch?
In Calc:
Wenn ich die Selektion mit der Maus von Shape 1 (Quellobjekt) nach Shape 2 (Zielobjekt) ändere, feuert er 1x, wie es sein soll
1.) die Event.Source ist das Zielobject
In Calc funktioniert der Dialog einwandfrei, im Writer zeigt er oben angesproches Fehlverhalten:
Die Positioninformationen sind falsch.
Ich denke es hängt mit dem XSelectionChangeListener zusammen.
Beste Grüße von Rik
nochmal vielen Dank für deine Arbeit.
Hier ein paar Anmerkungen zu Deinen Anmerkungen:
Tja, da bin ich manchmal noch zu schlampig.Frieder D. hat geschrieben:1. du solltest zur besseren Lesbarkeit Einrückungen verwenden
Gute Ideen, allein, erstmal sollte die jetzige Version fehlerfrei laufen.Frieder D. hat geschrieben:Um die Funktionalität zu verbessern, wäre es doch sinnvoll, wenn man die Größe der Grafiken auch über Buttons verändern könnte.
ich empfinde es nicht unbedingt als sehr komfortabel, dies über die Textfelder zu machen.
dazu könnte man über "steps" eine zweite Ebene in den Dialog einbauen, zu der über ein Optionsfeld gewechselt werden kann.
Dort sollte dann auch die Option "Seitenverhältnis beibehalten" zur Verfügung stehen.
Bis ich mit dem non-modalen Dialog angefangern habe, gabs keine Beschwerden.Frieder D. hat geschrieben:Außerdem liegt bei deinem Code so einiges im Argen.
Du solltest dir angewöhnen Variablen auch zu deklarieren.
meine Erfahrung hat gezeigt, je mehr Listener man in einem Makro unterbringt, desto instabiler wird es.
um dein Tool stabiler und besser zu machen, würde ich noch einmahl ganz von vorne anfangen.
So nun möchte ich mich wieder auf das Problem konzentrieren:
Wie schaffe ich es, dass die Änderung der Auswahl fehlerfrei bemerkt wird?
Ich habe festgestellt, das der "com.sun.star.view.XSelectionChangeListener" ungewöhlich reagiert.
Und zwar unterschiedlich.
Im Writer:
Wenn ich die Selektion mit der Maus von Shape 1 (Quellobjekt) nach Shape 2 (Zielobjekt) ändere, feuert er 3x.
1.) die Event.Source ist das Quellobject
2.) die Event.Source ist das Zielobject
3.) die Event.Source ist nochmal das Zielobject
Was ist da falsch?
In Calc:
Wenn ich die Selektion mit der Maus von Shape 1 (Quellobjekt) nach Shape 2 (Zielobjekt) ändere, feuert er 1x, wie es sein soll
1.) die Event.Source ist das Zielobject
In Calc funktioniert der Dialog einwandfrei, im Writer zeigt er oben angesproches Fehlverhalten:
Die Positioninformationen sind falsch.
Ich denke es hängt mit dem XSelectionChangeListener zusammen.
Beste Grüße von Rik
- miniKasse MMove 1.0.6 Base Videotutorial
- Windows 10: AOO, LO Linux Mint: AOO, LO
Re: Writer Editor Fenster aktiv lassen bei Dialogaufruf
Hallo Frieder D.
die Version 1.0.6 von MMove steht jetzt online. Das Problem mit dem "XSelectionChangeListener" habe ich umgangen:
Mit einem MouseClickHandler. Als Grundlage habe ich Deinen Code von gestern verwendet, die von Dir eingeführten functions und Fehler-Tools sind also dabei.
Danke und Gruß Rik
die Version 1.0.6 von MMove steht jetzt online. Das Problem mit dem "XSelectionChangeListener" habe ich umgangen:
Mit einem MouseClickHandler. Als Grundlage habe ich Deinen Code von gestern verwendet, die von Dir eingeführten functions und Fehler-Tools sind also dabei.
Danke und Gruß Rik
- miniKasse MMove 1.0.6 Base Videotutorial
- Windows 10: AOO, LO Linux Mint: AOO, LO