Italian B4J - Rilevare spostamento MainForm

Discussion in 'Italian Forum' started by marco.canta, Jun 1, 2018.

Similar threads

B4J Tutorial [B4X] Resumable Subs - Sleep / Wait For
B4J Tutorial SQL Tutorial
B4J Tutorial Unhandled exceptions
B4J Tutorial Pagination Container
B4J Tutorial Modal dialogs
  1. marco.canta

    marco.canta Active Member Licensed 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
     
  2. LucaMs

    LucaMs Expert Licensed User

    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 likes this.
  3. LucaMs

    LucaMs Expert Licensed User

  4. LordZenzo

    LordZenzo Well-Known Member Licensed User

    a naso
    potresti creare una resumable che controlla ogni tot millisecondi la posizione della mainForm
     
    marco.canta likes this.
  5. marco.canta

    marco.canta Active Member Licensed User

    Grazie .... prendendo spunto dai vostri suggerimenti oggi faccio qualche prova. Spero di trovare la strada ...
    se riuscirò posterò la com’è fatto
     
  6. marco.canta

    marco.canta Active Member Licensed 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
     
  7. marco.canta

    marco.canta Active Member Licensed User

    Al momento ho risolto cosi ....

    Code:
    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
     
  8. Star-Dust

    Star-Dust Expert Licensed 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.

    Code:
    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 StringAs 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: Jun 2, 2018
    giannimaione likes this.
  9. LucaMs

    LucaMs Expert Licensed User

    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:

    Code:
    Sub Process_Globals
       
    Private fx As JFX
       
    Private MainForm As Form
     
       
    ' Da usare per qualunque preferenza utente.
       Private mapPref As Map
    End Sub
    Code:
    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
    Code:
    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: Jun 2, 2018
Loading...
  1. This site uses cookies to help personalise content, tailor your experience and to keep you logged in if you register.
    By continuing to use this site, you are consenting to our use of cookies.
    Dismiss Notice