[Solved] Popup Form

Creating and using forms
Post Reply
gkick
Posts: 324
Joined: Wed Aug 07, 2019 5:24 pm
Location: Chile

[Solved] Popup Form

Post by gkick »

Hi,

Is there a way to either limit the size of a form aka the size of a dialog or could a dialog be used as a form without all that macro stuff ? And is there a way to position the form at a specific location aka xml coordinates ?
I have some forms with lots of listboxes and if an additional entry is required in the underlying reference table, I do not want to open a full sized form on top.
Thanks
Last edited by Hagar Delest on Thu Aug 15, 2019 10:46 am, edited 1 time in total.
Reason: tagged solved
Libre Office 6.4.6 on Windows 10 HSQL 2.51 backend
UnklDonald418
Volunteer
Posts: 1544
Joined: Wed Jun 24, 2015 12:56 am
Location: Colorado, USA

Re: Popup Form

Post by UnklDonald418 »

Dialogs are not data aware and they can only be opened with a macro.
Open a form document in the Edit/Design mode and adjust the size to your liking. Save and exit. The next time you open that form document it will open at the same size you saved it.
When Base opens a form document it calculates what it considers to be the optimal position (centered) and positions it there, you have no control over that.
The only recourse is a macro to reposition it. Here is one I use.

Code: Select all

REM  *****  BASIC  *****
REM  run this macro from Tools>Customize>Events>Open Document

Sub MoveForm 

Dim iFlag as integer
Dim Xpos as integer, Ypos as integer
Dim FormWid as integer, FormHt as integer
Dim Formname as string
Dim oDoc as object

oDoc = ThisComponent
Formname = Split(oDoc.Title," : ")(1)
select case Formname
case "FormName1"
     Xpos = 40
     Ypos = 300
case "FormName2"
    Xpos = 440
    Ypos = 137
case "FormName3"
    Xpos = 320
    Ypos = 390
case else
    Xpos = 0
    Ypos = 0
end select

iFlag = com.sun.star.awt.PosSize.POS   ' 3

FormWid = 0  'no change
FormHt = 0   'no change
if xpos > 0 then
 oDoc.CurrentController.Frame.ContainerWindow.setPosSize(Xpos,Ypos,FormWid,FormHt,iFlag) 
endif

End Sub
Below is an associated macro. Position your form document where you want it to appear and Run this macro to display the Position values needed for the MoveForm macro.

Code: Select all

REM  *****  BASIC  *****

Sub ShowScreenPosition
Dim iFlag as integer
Dim Xpos as Long, Ypos as Long
Dim FormWid as Long, FormHt as Long
Dim vRect As New com.sun.star.awt.Rectangle
 
 vRect = ThisComponent.CurrentController.Frame.ContainerWindow.getPosSize()

Xpos = vRect.X
Ypos = vRect.Y
FormWid = vRect.Width
FormHt = vRect.Height
Print "X= " + Xpos + "   Y= " + Ypos + "   Width= " + FormWid + "   Height= " + FormHt

End Sub
It also displays the size values, but the MoveForm macro would need a few modifications to use those values.
If your problem has been solved, please edit this topic's initial post and add "[Solved]" to the beginning of the subject line
Apache OpenOffice 4.1.14 & LibreOffice 7.6.2.1 (x86_64) - Windows 10 Professional- Windows 11
gkick
Posts: 324
Joined: Wed Aug 07, 2019 5:24 pm
Location: Chile

Re: Popup Form

Post by gkick »

Thank you for the prompt reply, much appreciated :D
Now is there a way to strip the form of the menubar?
Libre Office 6.4.6 on Windows 10 HSQL 2.51 backend
User avatar
Villeroy
Volunteer
Posts: 31269
Joined: Mon Oct 08, 2007 1:35 am
Location: Germany

Re: [Solved] Popup Form

Post by Villeroy »

I like this useful pair of macros and tried to improve it by making it more generic without hard code values and names.

Save the code in some global library under "My Macros".
Open the form document (or any other Writer, Calc, Impress, Draw document) for editing and drag the window to the wanted position/size.
Call macro Save_ScreenPositionSize. It stores the position/size values in the custom properties (see menu:File>Properties>Custom...)
 Edit: Call menu:Tools>Customize... and assign event "View Created" "Open Document" to "Set_ScreenPositionSize". 
Save and close the document.
Reopen the document.
If the macro fails to do its job, I found out that some delay helps. Open the document for editing and set custom property "Window_Wait_ms" to 1000 milliseconds.
For some reason, Base always centers a form window on screen. I did not find out how to overcome this. Does not happen with the right event which seems to be "Open Document" as advised by UnklDonald418

Code: Select all

REM  *****  BASIC  *****
Option Explicit
Sub Save_ScreenPositionSize()
Dim vRect As New com.sun.star.awt.Rectangle
Dim oUDP, oInfo
Dim unoLong As Variant
	unoLong = CreateUnoValue( "long", 0)
	vRect = ThisComponent.CurrentController.Frame.ContainerWindow.getPosSize()
	oUDP = ThisComponent.DocumentProperties.UserDefinedProperties
	oInfo = oUDP.PropertySetInfo
	if not oInfo.hasPropertyByName("Window_X") then oUDP.addProperty("Window_X", 128, unoLong)
	if not oInfo.hasPropertyByName("Window_Y") then oUDP.addProperty("Window_Y", 128, unoLong)
	if not oInfo.hasPropertyByName("Window_Width") then oUDP.addProperty("Window_Width", 128, unoLong)
	if not oInfo.hasPropertyByName("Window_Height") then oUDP.addProperty("Window_Height", 128, unoLong)
	if not oInfo.hasPropertyByName("Window_Wait_ms") then oUDP.addProperty("Window_Wait_ms", 128, unoLong)
	oUDP.Window_X = vRect.X
	oUDP.Window_Y = vRect.Y
	oUDP.Window_Width = vRect.Width
	oUDP.Window_Height = vRect.Height
End Sub

Sub Set_ScreenPositionSize()
Dim oUDP, oInfo, oFrame, oWin
Dim iMilliSeconds As Integer
Dim iFlag as integer
Dim Xpos as integer, Ypos as integer
Dim FormWid as integer, FormHt as integer
	'oFrame = StarDesktop.ActiveFrame
	oWin = ThisComponent.CurrentController.Frame.ContainerWindow
	oUDP = ThisComponent.DocumentProperties.UserDefinedProperties
	oInfo = oUDP.PropertySetInfo
	if oInfo.hasPropertyByName("Window_X") then iFlag = iFlag +1 : Xpos = oUDP.Window_X
	if oInfo.hasPropertyByName("Window_Y") then iFlag = iFlag +2 : Ypos = oUDP.Window_Y
	if oInfo.hasPropertyByName("Window_Width") then iFlag = iFlag +4 : FormWid = oUDP.Window_Width
	if oInfo.hasPropertyByName("Window_Height") then iFlag = iFlag +8 : FormHt = oUDP.Window_Height
	if oInfo.hasPropertyByName("Window_Wait_ms") then iMilliSeconds = oUDP.Window_Wait_ms
	wait iMilliSeconds
	oWin.setPosSize(Xpos,Ypos,FormWid,FormHt,iFlag) 
End Sub
Please, edit this topic's initial post and add "[Solved]" to the subject line if your problem has been solved.
Ubuntu 18.04 with LibreOffice 6.0, latest OpenOffice and LibreOffice
gkick
Posts: 324
Joined: Wed Aug 07, 2019 5:24 pm
Location: Chile

Re: [Solved] Popup Form

Post by gkick »

Thank you
Libre Office 6.4.6 on Windows 10 HSQL 2.51 backend
Post Reply