Italian B4J - Rilevare spostamento MainForm

marco.canta

Active Member
Licensed User
Longtime User
Ciao, una domanda forse banale ... poter rilevare se viene spostata nello schermo la MainForm del programma ... cosi da memorizzare la nuova posizione e alla riapertura riposizionarla.
Leggere la posizione e memorizzarla non è un problema, ma non riesco a trovare l evento che identifichi che è stata spostata.

Grazieeee Marco
 

LucaMs

Expert
Licensed User
Longtime User
Ciao, una domanda forse banale
Purtoppo, non è banale.

Non conoscendo la risposta ho dato un'occhiata in questo (classico) modo:

upload_2018-6-1_16-41-9.png


Ovvero "richiedendo" gli eventi disponibili per l'oggetto Form.

Come vedi, non ce n'è uno adatto allo scopo.

Potrebbe esserci qualcosa, anzi, quasi certamente c'è, nel "meraviglioso mondo javafx"; vediamo se altri lo conoscano già, io lo cercherò tra un po'.
 

marco.canta

Active Member
Licensed User
Longtime User
Grazie .... prendendo spunto dai vostri suggerimenti oggi faccio qualche prova. Spero di trovare la strada ...
se riuscirò posterò la com’è fatto
 

marco.canta

Active Member
Licensed User
Longtime User
... stavo pensando ... potrei salvare i valori Left e Top quando chiudo il programma, sia che sia con la x che ci comando chiusura.

potrebbe essere un idea .... il tasto X di chiusura se non sbaglio è intercettabile
 

marco.canta

Active Member
Licensed User
Longtime User
Al momento ho risolto cosi ....

B4X:
Sub MainForm_CloseRequest (EventData As Event)

    Log(MainForm.WindowLeft)
    Log(MainForm.WindowTop)
    
    ' a questo prunto letti in nuovi valori LEFT E TOP li salvo in un SQLite e alla prossimo Riavvio  li rileggo e setto.   

End Sub
 

Star-Dust

Expert
Licensed User
Longtime User
Quando una vista viene trascinata solitamente è sollevato l'evento MouseDragged, nel caso del FormMain questo non accadde. Ma la cosa si può gestire con uno degli altri eventi sollevati dal mouse, visto ché per spostare la finestra bisogna muovere il mouse, come ad esempio MouseMoved.

Ma puoi scegliente qualunque altro Evento Mouse ritieni più adatto.

B4X:
Sub Process_Globals
    Private fx As JFX
    Private MainForm As Form
    Dim MainLeft, MainTop As Int
End Sub

Sub AppStart (Form1 As Form, Args() As String)
    MainForm = Form1
    'MainForm.RootPane.LoadLayout("Layout1") 'Load the layout file.
    MainForm.Show
    MainLeft=MainForm.WindowLeft
    MainTop=MainForm.WindowTop
End Sub

'Return true to allow the default exceptions handler to handle the uncaught exception.
Sub Application_Error (Error As Exception, StackTrace As String) As Boolean
    Return True
End Sub

Sub MainForm_MouseMoved (EventData As MouseEvent)
    If MainForm.WindowLeft<>MainLeft Or MainForm.WindowTop<>MainTop Then
        Log(MainForm.WindowLeft)
        Log(MainForm.WindowTop)
        MainLeft=MainForm.WindowLeft
        MainTop=MainForm.WindowTop
    End If
End Sub

Questi sono gli altri eventi disponibili:
upload_2018-6-2_11-46-40.png
 
Last edited:

LucaMs

Expert
Licensed User
Longtime User
Ciao, una domanda forse banale ... poter rilevare se viene spostata nello schermo la MainForm del programma ... cosi da memorizzare la nuova posizione e alla riapertura riposizionarla.
Qui le cose sono due: o avevo troppo sonno e non ho letto l'ultima parte della tua frase (quella riguardante il memorizzare la posizione del form in modo da poterla ripristinare al prossimo avvio) oppure l'hai aggiunta dopo (propendo per la prima ipotesi :p).

Avevo capito che a te servisse intercettare il movimento del form, istante per istante, da parte dell'utente.

Per il tuo scopo, invece, la cosa è molto semplice:

B4X:
Sub Process_Globals
   Private fx As JFX
   Private MainForm As Form
 
   ' Da usare per qualunque preferenza utente.
   Private mapPref As Map
End Sub

B4X:
Sub AppStart (Form1 As Form, Args() As String)
   MainForm = Form1
   'MainForm.RootPane.LoadLayout("Layout1") 'Load the layout file.
 
   mapPref.Initialize
   If File.Exists(File.DirApp, "Pref.map") Then
       mapPref = File.ReadMap(File.DirApp, "Pref.map")
   End If
   MainForm.WindowLeft = mapPref.GetDefault("MainLeft", 200)
   MainForm.WindowTop = mapPref.GetDefault("MainTop", 200)
   MainForm.WindowWidth = mapPref.GetDefault("MainWidth", 600)
   MainForm.WindowHeight = mapPref.GetDefault("MainHeight", 400)
   MainForm.Show
End Sub

B4X:
Sub MainForm_Closed
   mapPref.Put("MainLeft", MainForm.WindowLeft)
   mapPref.Put("MainTop", MainForm.WindowTop)
   mapPref.Put("MainWidth", MainForm.WindowWidth)
   mapPref.Put("MainHeight", MainForm.WindowHeight)
   File.WriteMap(File.DirApp, "Pref.map", mapPref)
End Sub


[Nota: sarebbe meglio usare delle costanti, sia per il nome del file, "Pref.map" sia, soprattutto, per le chiavi, che qui sono soltanto le coordinate e le dimensioni del MainForm (le varie: "MainLeft", "MainTop", ...) ma potrai aggiungerci tutte le preferenze dell'utente]
 
Last edited:
Top