Italian B4XTimeTemplate

Vasmar

Member
Licensed User
Buonasera,
sto cercando di far inserire all'utente una scelta di data e orario.
Per B4XDateTemplate nessun problema (almeno fin'ora), ma su B4XTimeTemplate mi dice che è un tipo sconosciuto.
Naturalmente ho selezionato le librerie XUI e XUI Views.
Da cosa può dipendere?
Grazie per i suggerimenti.


B4X:
Sub Class_Globals
    Private Root As B4XView
    Private xui As XUI
 
    Private dialog As B4XDialog
    Private dateTemplate As B4XDateTemplate
    Private timeTemplate As B4XTimeTemplate
    
End Sub
 

LucaMs

Expert
Licensed User
Longtime User
Mai provato ma vedo che esiste B4XTimedTemplate, non B4XTimeTemplate.

Lo vedi subito quando definisci una variabile

B4J_UbKHfk3QCT.gif
 

Vasmar

Member
Licensed User
No, B4XTimedTemplate non è quello che serve, già provato.
Come si fa a far scegliere all'utente una data/ora? Ci sarà pure una funzione del sistema.
O no ? 🤔
 

LucaMs

Expert
Licensed User
Longtime User
[Mio prossimo post: una (maledetta) curiosità]
Premessa: ho ancora il vecchio Windows 7 :( (e devo pure ringraziare il cielo che 'sto portatile, sedicenne, campi ancora :()

Ogni tanto capita che le lettere della tastiera non corrispondano a ciò che scrivo.
Spiegato male: mettiamo che io provi a digitare &, viene "stampato" un carattere diverso.
Capita dopo chissà quale combinazione di tasti che ho premuto.
Si può ripristinare, ma ogni volta dimentico con quale altra combinazione di tasti si faccia.

Lo scrivo perché poi impiego mezz'ora (si fa per dire) per rispondere 😁:mad:, perché lo chiedo a Perplexity.
Ora scrivo qui la soluzione, così la prossima volta che mi capiterà, lo troverò senza interrogare Perplexity!

(Risposta di Perplexity)

In Windows 7, se con “ripristinare i tasti della tastiera” intendi ripristinare lo stato delle finestre ridotte a icona (per esempio dopo aver premuto Win + D o Win + M), la combinazione è:

Windows + Shift + M

Questa scorciatoia ripristina tutte le finestre precedentemente ridotte a icona o nascoste dal desktop.
Se invece ti riferisci a un problema di tasti “bloccati” o impostazioni lingua/lay‑out, di solito si usa:
  • Alt + Shift o Ctrl + Maiusc per cambiare layout tastiera (se si è attivato per sbaglio un layout diverso).
  • Disattivare il “Blocco numerico” o “Tasti filtrati” dal Pannello di controllo → Opzioni di tastiera.
 

LucaMs

Expert
Licensed User
Longtime User
(Io a ChatGPT)
Prova a generare un B4XTimeTemplate, ovvero un template da usare con B4XDialog che consenta all'utente di selezionare un orario. Direi con HH MM SS ma millisecondi opzionale.

Ha iniziato a rispondere dopo un decimo di secondo! Pubblico la classe che ha generato, ma non l'ho provata; non è improbabile che si debba correggere a manina:

B4X:
'Class module
'Nome classe: B4XTimeTemplate

Sub Class_Globals
    
    Private xui As XUI
    
    Public mBase As B4XView
    
    Private pnlMain As B4XView
    
    Private lblTitle As Label
    
    Private cmbHours As B4XComboBox
    Private cmbMinutes As B4XComboBox
    Private cmbSeconds As B4XComboBox
    Private cmbMilliseconds As B4XComboBox
    
    Public IncludeMilliseconds As Boolean = False
    
    Public Hour As Int
    Public Minute As Int
    Public Second As Int
    Public Millisecond As Int
    
End Sub

Public Sub Initialize
    
End Sub

Public Sub GetPanel (Dialog As B4XDialog) As B4XView
    
    If mBase.IsInitialized = False Then
        
        mBase = xui.CreatePanel("")
        mBase.SetLayoutAnimated(0, 0, 0, 420dip, 180dip)
        
        pnlMain = xui.CreatePanel("")
        pnlMain.SetLayoutAnimated(0, 0, 0, mBase.Width, mBase.Height)
        
        mBase.AddView(pnlMain, 0, 0, mBase.Width, mBase.Height)
        
        CreateControls
        
    End If
    
    Return mBase
    
End Sub

Private Sub CreateControls
    
    Dim LeftPos As Int = 10dip
    Dim TopPos As Int = 20dip
    Dim ComboWidth As Int = 80dip
    Dim ComboHeight As Int = 40dip
    Dim SpaceX As Int = 10dip
    
    lblTitle.Initialize("")
    lblTitle.Text = "Seleziona orario"
    lblTitle.TextSize = 18
    
    pnlMain.AddView(lblTitle, LeftPos, 5dip, 300dip, 25dip)
    
    cmbHours.Initialize("cmbHours")
    pnlMain.AddView(cmbHours.mBase, LeftPos, TopPos + 30dip, ComboWidth, ComboHeight)
    
    cmbMinutes.Initialize("cmbMinutes")
    pnlMain.AddView(cmbMinutes.mBase, LeftPos + ComboWidth + SpaceX, TopPos + 30dip, ComboWidth, ComboHeight)
    
    cmbSeconds.Initialize("cmbSeconds")
    pnlMain.AddView(cmbSeconds.mBase, LeftPos + (ComboWidth + SpaceX) * 2, TopPos + 30dip, ComboWidth, ComboHeight)
    
    If IncludeMilliseconds Then
        
        cmbMilliseconds.Initialize("cmbMilliseconds")
        
        pnlMain.AddView( _
            cmbMilliseconds.mBase, _
            LeftPos + (ComboWidth + SpaceX) * 3, _
            TopPos + 30dip, _
            ComboWidth + 20dip, _
            ComboHeight _
        )
        
    End If
    
    FillCombos
    
End Sub

Private Sub FillCombos
    
    Dim i As Int
    
    cmbHours.Clear
    
    For i = 0 To 23
        cmbHours.Add( NumberFormat2(i, 2, 0, 0, False) )
    Next
    
    cmbMinutes.Clear
    
    For i = 0 To 59
        cmbMinutes.Add( NumberFormat2(i, 2, 0, 0, False) )
    Next
    
    cmbSeconds.Clear
    
    For i = 0 To 59
        cmbSeconds.Add( NumberFormat2(i, 2, 0, 0, False) )
    Next
    
    If IncludeMilliseconds Then
        
        cmbMilliseconds.Clear
        
        For i = 0 To 999
            
            cmbMilliseconds.Add( _
                NumberFormat2(i, 3, 0, 0, False) _
            )
            
        Next
        
    End If
    
    cmbHours.SelectedIndex = Hour
    cmbMinutes.SelectedIndex = Minute
    cmbSeconds.SelectedIndex = Second
    
    If IncludeMilliseconds Then
        cmbMilliseconds.SelectedIndex = Millisecond
    End If
    
End Sub

Public Sub Show(Dialog As B4XDialog) As ResumableSub
    
    Wait For ( _
        Dialog.ShowTemplate(Me, "OK", "", "ANNULLA") _
    ) Complete (Result As Int)
    
    If Result = xui.DialogResponse_Positive Then
        
        Hour = cmbHours.SelectedIndex
        Minute = cmbMinutes.SelectedIndex
        Second = cmbSeconds.SelectedIndex
        
        If IncludeMilliseconds Then
            Millisecond = cmbMilliseconds.SelectedIndex
        Else
            Millisecond = 0
        End If
        
    End If
    
    Return Result
    
End Sub

Public Sub GetTimeString As String
    
    Dim S As String
    
    S = _
        NumberFormat2(Hour, 2, 0, 0, False) & ":" & _
        NumberFormat2(Minute, 2, 0, 0, False) & ":" & _
        NumberFormat2(Second, 2, 0, 0, False)
    
    If IncludeMilliseconds Then
        
        S = S & "." & _
            NumberFormat2(Millisecond, 3, 0, 0, False)
            
    End If
    
    Return S
    
End Sub
 

LucaMs

Expert
Licensed User
Longtime User
Ecco, questo dicevo: potresti per favore indicarmene qualcuna (anche una sola va bene)?
Grazie infinite
Il guaio è che non ne ho mai cercate e provate, quindi non saprei consigliartene una "buona".
Prova così:
https://www.b4x.com/android/forum/pages/results/?query=time+picker&prefix=1,2,3,17,24,29
(se ne cerchi una per un "linguaggio" specifico, B4A, B4X, B4J, ovviamente aggiungilo come filtro della ricerca)

Tra non molto BUTTERO' UN OCCHIO sulla classe template generata da ChatGPT, sarebbe utile. Magari la sottoporrò a Copilot, così tra due cervelli artificiali, chissà che non esca qualcosa fatta bene 😁
 

LucaMs

Expert
Licensed User
Longtime User
ma su B4XTimeTemplate mi dice che è un tipo sconosciuto.
Sto preparando un template per B4XDialog che faccia ciò che ti serve (nel frattempo avrai già risolto con qualche picker, suppongo, ma sarà utile per tutti).
Non lo chiamerò, come sarebbe logico, B4XTimeTemplate, visto che esiste un B4XTimedTemplate che fa tutt'altro, ma B4XTimePickerTemplate.

Se avrò tempo, dovrei essere in grado di completarlo oggi stesso.

Allego una gif animata, progetto illogico con sleep solo per mostrare come è (fino ad adesso) in versione Light & Dark.
Anzi, due gif, una per orari 24h, una per 12h (cambia ben poco, giusto la Label AM/PM, clickabile, e ovviamente il risultato)

java_BpapMKAIsy.gif



java_T9AAC00sI4.gif



Volendo, anche con millisecondi
java_KKrteTyUFX.gif
 

LucaMs

Expert
Licensed User
Longtime User
Eh, magari! Sembra che ci sia un bug grafico nelle B4XPlusMinus in B4A - allineamento verticale di testo e "frecce-cursori" mooolto "dinamico" ( = sbagliato)
"Notizia" interessante.

Breve riepilogo.

Volevo fare in modo che, a runtime, si potesse scegliere se visualizzare una B4XPlusMinus per i millisecondi o no, quindi avere pmHours-pmMinutes-pmSeconds e, opzionalmente, pmMillis.

Per farlo, ovviamente a runtime dovevo calcolare la larghezza di ogni B4XPlusMinus in base alla larghezza del pannello che li contiene ed al loro numero.
Come si fa con tutte le custom view, ho usato pmHours.mBase.SetLayoutAnimated(...) (oppure usare GetBase anzichè mBase, se presente).
Con B4J era perfetto. Con B4A, ridimensionare la base non adattava il suo layout interno, ovvero il testo e le due "frecce", non venivano centrate orizzontalmente.

Beh, si può usare un trucco che è un difetto! Si può chiamare il metodo PRIVATO Base_Resize di B4XPlusMinus; questo ridisegna il layout interno.
Perché è un difetto? Appunto perché quello in teoria è un membro privato, ma in B4X riesci ad eseguirlo usando:

B4X:
CallSubDelayed3(pmHours, "Base_Resize", Width, Height)

ll difetto sta nel fatto che se in una mia classe voglio che un membro sia privato, non deve essere accessibile da fuori, in alcun modo, per rispettare l'incapsulamento.

In soldoni: un difetto mi è stato utile.

In realtà la soluzione corretta sarebbe modificare il sorgente di B4XPlusMinus, cambiando la "visibilità" di Base_Resize da Private a Public, ma questo dovrebbe farlo Erel, non io.
 

hatzisn

Expert
Licensed User
Longtime User
C' è anche il B4X time dialog di Alexander Stolte. È molto facile usarlo su cellulari dove non c' è molto spazio e puoi segliere le ore su un "dialing" template.
 
Top