Italian Impostare Focus su un form da codice

Fulvio75

Well-Known Member
Licensed User
Altra domanda su un Multiform... ho 2 form contenuti in un form padre, il form A senza focus e il Form B con il focus, quando chiudo il form B come faccio a passare il focus al form A senza cliccarci sopra?
 

micro

Well-Known Member
Licensed User
Longtime User
Salve ragazzi non so se parliamo di B4J o B4A
io uso solo B4J e se è quello potresti fare
B4X:
Form.RootPane.RequestFocus
'si presume che sia già in Show
'e per ulteriore sicurezza
Form.AlwaysOnTop=True
'e subito dopo per evitare che ti possa dar fastidio averla
'sempre in primo piano, togli la prioprità precedente
Form.AlwaysOnTop=False
penso che questo dovrebbe bastare, però dopo aver dato il focus alla Form ritengo sia
meglio passare il focus ad uno dei controlli del form stesso e cioè al primo che dovresti
usare
 

Star-Dust

Expert
Licensed User
Longtime User
I modi per portare in primo piano in form sono sue che io conosco.

1. Chiudi e riapri il form Close/Show. Come diceva LucaMs, ma prima devi fare.il close

2. Con la libreria jna metti in primopiano (Foreground) la finestra
 

Star-Dust

Expert
Licensed User
Longtime User
Salve ragazzi non so se parliamo di B4J o B4A
io uso solo B4J e se è quello potresti fare
B4X:
Form.RootPane.RequestFocus
'si presume che sia già in Show
'e per ulteriore sicurezza
Form.AlwaysOnTop=True
'e subito dopo per evitare che ti possa dar fastidio averla
'sempre in primo piano, togli la prioprità precedente
Form.AlwaysOnTop=False
penso che questo dovrebbe bastare, però dopo aver dato il focus alla Form ritengo sia
meglio passare il focus ad uno dei controlli del form stesso e cioè al primo che dovresti
usare
AlwaysOnTop la mette e fissa la finestra in primo piano su tutto, se clicca altra finestra il primopiano rimane sempre li. Non so se è quello che cerca

Form.RootPane.RequestFocus semplicemente sposta il ficus interno da una vista del pannello al pannello, non mi pare dia il primopiano alla finestra
 

Fulvio75

Well-Known Member
Licensed User
AlwaysOnTop la mette e fissa la finestra in primo piano su tutto, se clicca altra finestra il primopiano rimane sempre li. Non so se è quello che cerca

Form.RootPane.RequestFocus semplicemente sposta il ficus interno da una vista del pannello al pannello, non mi pare dia il primopiano alla finestra
Esatto anche show... Praticamente il titolo del form b4j non si 'illumina', vorrei farlo illuminare
 

Fulvio75

Well-Known Member
Licensed User
I modi per portare in primo piano in form sono sue che io conosco.

1. Chiudi e riapri il form Close/Show. Come diceva LucaMs, ma prima devi fare.il close
Domanda... ma se chiudo il form con close non devo poi reinizializzarlo come classe come ho fatto con la prima apertura?
Si riapre ancora con Show, non dovrebbe più esistere in teoria

per aprirlo uso questo ovviamente nella classe Formchedevoaprire = classe

classe:
B4X:
Public Sub Initialize(OwnerForm As Form,frmOpenMode As Int,CallerForm As Form,DisableCallerForm As Boolean)

    '***DA UTILIZZARE PER OGNI FORM***
    OpenMode = frmOpenMode
    OwnerFrm = OwnerForm
    CallerFrm = CallerForm
    DisableCaller = DisableCallerForm

    'disabilito il form chiamante
    If DisableCallerForm = True Then CallerFrm.RootPane.Enabled = False
    
    Frm.Initialize("Frm",600,700)
    'centra il form
    Frm.WindowLeft = (Main.MainForm.Width/2)-(Frm.Width/2)
    Frm.WindowTop = (Main.MainForm.Height/2)-(Frm.Height/2)
    Frm.RootPane.LoadLayout("layStdPIDsViewer")
    Frm.Title = "PIDs Standard"
    Frm.AlwaysOnTop = True
    Frm.Resizable = False
    Frm.SetFormStyle(Functions.FormStyle.Utility)
    Frm.SetOwner(OwnerForm)
    Frm.Show

    CallSubDelayed(Me,"Initialize_Page")
    
End Sub
 

Star-Dust

Expert
Licensed User
Longtime User
Domanda... ma se chiudo il form con close non devo poi reinizializzarlo come classe come ho fatto con la prima apertura?
No.

Close è il contrario di Show e non annulla initialize
 

Star-Dust

Expert
Licensed User
Longtime User
per riaprire il form uso sempre inizialize, quindi è sbagliato?
Lo devo usare solo una volta? e quando?
Inizialize con dice la parola inizliallizza la classe l, e va usato solo una volta all'inizio

Show fa aprire e apparire il form, Close lo chiude.
 

Fulvio75

Well-Known Member
Licensed User
"Le ultime parole famose" 😁
Esatto, qui di ora i form sarebbero i root?
Ho la classe form
B4xpage.show(classeform)
E nella classe del form per fare riferimento tipo a form.enable=true devo fare root.enable=true?
 

LucaMs

Expert
Licensed User
Longtime User
Esatto, qui di ora i form sarebbero i root?
In un certo senso. Sarebbe più "giusto" considerare form le B4XPage, ma come contenitore di view sì, è il pane(l) Root.

Ho la classe form
B4xpage.show(classeform)
E nella classe del form per fare riferimento tipo a form.enable=true devo fare root.enable=true?
Non devi scrivere più codice relativo direttamente ai form (se non in casi particolari).
Devi sostituire ogni tuo form con una classe B4XPage (e appunto caricare i layout nei Root di ognuna)
 

Fulvio75

Well-Known Member
Licensed User
Ecco c'è l'incu... lo sapevo.....🤣🤣🤣
Prima di b4Xpages.add(classe) devo inizializzare la classe e li passo dei parametri classe.initialize(par1,2,3..)
Ora... Quando faccio b4Xpages.add(classe) la classe che aggiungo contiene i parametri passati e se richiamo lo stesso form da un altro avrò gli stessi parametri perché b4Xpages.add(classe) è il contenitore.
Uso ogni volta valori diversi per i parametri quindi dovrei rendere public i parametri nella classe e anziché passarli da initialize dovrei fare classe.param1,2,3 ecc. b4Xpages.show(nomeclasse)
Giusto?
 

LucaMs

Expert
Licensed User
Longtime User
Ecco c'è l'incu... lo sapevo.....🤣🤣🤣
Prima di b4Xpages.add(classe) devo inizializzare la classe e li passo dei parametri classe.initialize(par1,2,3..)
Ora... Quando faccio b4Xpages.add(classe) la classe che aggiungo contiene i parametri passati e se richiamo lo stesso form da un altro avrò gli stessi parametri perché b4Xpages.add(classe) è il contenitore.
Uso ogni volta valori diversi per i parametri quindi dovrei rendere public i parametri nella classe e anziché passarli da initialize dovrei fare classe.param1,2,3 ecc. b4Xpages.show(nomeclasse)
Giusto?
Qualunque classe, che sia una B4XPage o meno, andrebbe inizializzata (più precisamente: un'istanza di una classe, ovvero un oggetto, ovvero una variabile-oggetto) solo una volta, in genere. Quindi la sua routine pubblica Initialize andrebbe chiamata una sola volta; nessuno ti impedisce, però di farlo più volte.
E' chiaro che nel contenitore B4XPages quella pagina, con quella chiave, sarà sempre una sola. Potresti anche avere due o più variabili-oggetto basate sulla stessa classe, inizializzate una sola vota ed aggiunte alle B4XPages con chiavi diverse.

Infine, puoi sempre creare una Sub pubblica tipo: "Reinizializza" cui passare i parametri che vuoi.

Dipende da quale sia lo scopo.
 
Top