Newsgroup: it.comp.lang.delphi
Titolo: Canvas.TextWidth e risultati strani

Delphi 2010, windows 10.
 
Salve,
   vorrei dimensionare il panel di una StatusBar in funzione della 
dimensione del testo che vado a scriverci sopra ma ottengo un numero 
inferiore allo spazio effettivo che mi occorre.
 
Provo a verificare la dimensione che mi restituisce la funzione e noto che:
 
StatusBar1.Canvas.TextWidth('Doc. da Inviare SDI: ') = 101
StatusBar1.Canvas.TextWidth('77') = 12
ma
StatusBar1.Canvas.TextWidth('Doc. da Inviare SDI: ' + '77') = 107
 
La somma dovrebbe essere (101 + 12) 113 ma delphi restituisce 107.
 
Come è possibile?
Ma soprattutto come risolvere?
 
Grazie.

 
Scusate, ho scritto una boiata, sbagliavo il codice: il risultato è 
corretto: 113 però se imposto a 113 la lunghezza del panel della 
StatusBar con la riga di codice:
 
StatusBar1.Panels[2].Width := 113;
 
il testo non ci entra e viene troncato perché mancano circa 8 pixel.
 
Sapete perché?
 
Grazie.

Ciao..

Hai provato a considerare i bordi del pannello ?
Quando tu vai ad impostare 113 come width tu imposti tutto il pannello 
largo 113..... Ma per farci stare tutta la scritta a te interessa che 
l'interno del pannello sia 113.
Quindi oltre che la lunghezza della label in pixel somma l'ingombro dei 
bordi (destro e sinistro) piu' 5 pixel per non vedere la scritta 
"appiccicata" ai bordi ...
 
Poi dimmi come va ...
 
Ciao
Daniele
 

Canvas.TextWidth è un metodo, non una property:
 
 
Use TextWidth to determine the length a string will occupy in the image. 
---------------------------^^^^^^^^^^^^^--------------
 
Tentare una assegnazione come fai tu qua sotto:
 
StatusBar1.Canvas.TextWidth('Doc. da Inviare SDI: ' + '77') = 107 
 
genera un errore in compilazione.
 
A parte ciò, perchè forzare la larghezza ad un valore calcolato da te invece di usare il valore corretto calcolato tramite opportune chiamate al sistema operativo???
 
 
Quindi:
 
x := StatusBar1.Canvas.TextWidth('Doc. da Inviare SDI: ' + '77');
 
 
StatusBar1.Panels[0].Width := x;

 
 
Restituisce un valore più piccolo del necessario :(
 
Grazie.

 
Funziona ma, dove leggo il valore del bordo del panel?
 
Tra le altre cose ho notato che se l'allineamento è taLeftJustify la 
scritta viene troncata se, invece, l'allineamento è taRightJustify la 
scritta sborda al panel precedente.
 
Grazie.

Ciao,

In allegato il link di un semplice test (in delphi 10 ... il piu' datato 
che ho ..) dove puoi digitare il testo che desideri nell'edit e, quando 
clicchi sul bottone un pannello si adatta alla lunghezza della caption 
(che contiene il testo digitato), l'altro pannello (contenuto nel 
groupbox) si adatta alla larghezza della caption della label e, 
nell'ultimo pannello, e' il testo che hai digitato che si adatta alla 
largezza del pannello.
Il tutto funziona bene e si decvono considerare i margini di tutti i 
controlli che li hanno (pannelli e gropubox). Non mi ricordo bene dove 
l'ho letto ma questi bordi si considerano di 2 pixel; Quindi nel caso 
del pannello 2 + 2 = 4 pixel in piu' rispetto alla valore restituito da 
TextWidth, nel caso del groupbox sono 4 x gropubox + 4 del pannello = 8.
Spero possa andare bene anche sul tuo sistema .... (con delphi 11 va 
bene.... non ricordo da quale versione hanno introdotto la clientwidth).
E' un esempio, il tutto piu' che migliorabile ...
 
Ciao
Daniele
 
https://we.tl/t-tXhPc2MTpA
 

 
https://we.tl/t-tXhPc2MTpA
 
 
Nell'esempio si aggiunge una costante alla TextWidth come avevo già 
fatto io.
Pensavo, invece, che ci fosse una property che contenesse il bordo :(
 
Grazie.
 
Ciao.

Ciao,

Sono andato a rovistare in giro per i miei archivi e ho trovato quello 
che mancava nell'esempio.
Prendi con le pinze quello che segue ... perche' negli hanni con i 
sistemi operativi diversi qualcosa potrebbe essere cambiato.
 
Per sapere quanti pixel occupano i bordi dei controlli disegnati (e non 
solo perche' restituisce una serie di dati sostanziosa) devi usare la 
finzione GetSystemMetrics con l'argomento richiesto.
Con questo questo chiediamo la largezza dei bordi Sm_CxSizeFrame.
 
Quindi la larghezza del bordo diventa
 
GetSystemMetrics(Sm_CxSizeFrame) div 2;
 
L'esempio modificato con questa variabie lo trovi qui ...
 
https://we.tl/t-gI9Lvkh60u
 
 
Con delphi 10 - 11.0 su win 10 pro funziona bene ...
 
Come sempre questo e' un punto di partenza ...
 
Ciao
Daniele
 
PS: Questo *NON* e' la property BORDER che trovi nel pannello ma e' 
l'esterno del pannello disegnato sullo schermo dove la scritta 
(allineata a sinistra) si appoggia.