Ho fatto varie prove, è ho constatato che l'osservazione di Gianluigi ha centrato il problema.
Praticamente se il testo del Messagge che voglio visualizzare non è sufficentemente lungo a visualizzare
il titolo, aggiungendo per esempio degli spazi la finestra si adatta correttamente; quindi è il contenuto
del messaggio che dimensiona la finestra e non il titolo.
Praticamente in questo modo:
Message.Title = "Titolo messaggio moooolto lungo"
Message.Info("Info ")
Quello che mi lascia perplesso e che per esempio a vuott non succede....sarà protetto da qualcuno??? ???
Volevo scrivere una funzione che potesse formattare correttamente una finestra di messaggio mostrando tutto il titolo nel caso questo sia più lungo del testo.
Avevo pensato di usare la funzione stringa Space$ e Len per calcolare il numero di spazzi da aggiungere al messaggio ma purtroppo non funziona e io non ne capisco il motivo.
A seguire il codice incriminato:
' Gambas class file
' Per ricordarsi il tipo di finestra.
Private Enum Cancella = 1, Errore, Informazione, Domanda, Attenzione
Public Sub _new()
End
Public Sub Form_Open()
End
Public Sub msgTitolo(titolo As String, messaggio As String, tipo As Integer, Optional btn1 As String, Optional btn2 As String, Optional btn3 As String) As Variant
Dim a, b, c As Integer
Message.Title = titolo
a = Len(titolo)
b = Len(messaggio)
If a > b Then
c = (a - b) * 2 ' Questo per via del grassetto del titolo che è praticamente di doppia dimensione rispetto al messaggio
Endif
Select Case tipo
Case 1
If btn1 <> "" And btn2 <> "" And btn3 <> "" Then
Return Message.Delete(messaggio & Space$(c), btn1, btn2, btn3)
Else If btn1 <> "" And btn2 <> "" Then
Return Message.Delete(messaggio & Space$(c), btn1, btn2)
Else If btn1 <> "" Then
Return Message.Delete(messaggio & Space$(c), btn1)
Else
Message.Info("Costruzione errata del messaggio: " & messaggio)
Return 0
Endif
Case 2
If btn1 <> "" And btn2 <> "" And btn3 <> "" Then
Return Message.Error(messaggio & Space$(c), btn1, btn2, btn3)
Else If btn1 <> "" And btn2 <> "" Then
Return Message.Error(messaggio & Space$(c), btn1, btn2)
Else If btn1 <> "" Then
Return Message.Error(messaggio & Space$(c), btn1)
Else
Message.Info("Costruzione errata del messaggio: " & messaggio)
Return 0
Endif
End Select
'' Non ho proseguito perchè inutile
End
Public Sub Button1_Click()
Dim t, m As String
Dim i As Integer
t = "Sono un titolo veramente ma veramente ma veramente ma veramentema veramente lungo"
m = "Messaggio"
i = msgTitolo(t, m, Cancella, "Si")
Print i
End
:ciao:
Io proporrei una cosa come questa: :-\
Public Sub Form_Open()
Dim titolo As String = "Sono un titolo veramente ma veramente ma veramente ma veramente ma veramente lungo"
Dim testo As String = "Questo è un breve testo."
Dim ti As Short
ti = Me.Font.TextWidth(titolo)
If ti > Me.Font.TextWidth(testo) Then
With Message
.Title = titolo & String$(ti - CInt(ti * 0.9), " ")
.Info(testo)
End With
Endif
End
Finalmente ho capito in parte!
Il mio codice non poteva funzionare in quanto assumeva che la finestra di messaggio si sarebbe allargata agendo sul messaggio stesso se questi fosse stato sufficientemente lungo.
Sono stato indotto all'errore con una prova non sufficientemente scientifica :). O più propriamente banalmente empirica (la scritta del messaggio con cui avevo fatto le prove era senza spazi, cosa che non succede nella realtà). Un normale messaggio viene suddiviso in più righe se supera una certa lunghezza, di conseguenza agire su di lui con degli spazi per allargare la finestra non ha senso.
Rimane per me comunque poco comprensibile del perché occorra forzare il codice con l'aggiunta al titolo di spazi aggiuntivi, se Gambas (o chi per esso) guarda solo al messaggio e lo divide in più righe come è possibile che allungando il titolo esso allarghi la finestra?
Se invece guarda al titolo (come si evince dal codice di vuott) com'è che se io scrivo un titolo lungo lo tronca?
Comunque per quanto detto all'inizio non dovrebbe andare bene misurare il titolo rispetto al messaggio per far intervenire una funzione di “allungo”. Se ho un messaggio lunghissimo esso supererà il titolo lungo e la funzione non interverrà.
Allora ho controllato empiricamente a che punto del messaggio scatta la divisione e sul mio Ubuntu essa interviene a > 410.
Allora ho provato questo codice che però ha un risultato “esuberante”.
Public Sub Form_Open()
Dim titolo As String = "Sono un titolo veramente ma veramente ma veramente ma veramente ma veramente lungo fine titolo"
Dim messaggio As String = "Questo è un messaggio."
Message.Title = mioTitolo(titolo)
'Message.Title = mioTitolo(UCase$(titolo))
Message.Info(messaggio)
End
Public Sub mioTitolo(titolo As String) As String
Dim i, a, b As Integer
i = Me.Font.TextWidth(titolo)
If i <= 410 Then
Return titolo
Else
a = Len(titolo)
b = i / a ' Larghezza media carattere
a = ((i - 410) \ b) ' Dovrei ottenere il numero di spazi necessari
Return titolo & Space$(a)
Endif
End
Se cambio invece Else così:
a = Len(titolo)
a = a * 0.25
Return titolo & Space$(a)
sembrerebbe funzionare
Non riesco proprio a capire la logica. :-\
Mi stavo dimenticando, naturalmente funziona anche col codice di vuott
:ciao: