Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Canvas.TextWidth e risultati strani

33 views
Skip to first unread message

Luigis

unread,
Sep 23, 2022, 1:00:24 PM9/23/22
to
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.

Luigis

unread,
Sep 23, 2022, 1:20:56 PM9/23/22
to
Il 23/09/2022 19:00, Luigis ha scritto:
> ma
> StatusBar1.Canvas.TextWidth('Doc. da Inviare SDI: ' + '77') = 107
>
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.

Daniele

unread,
Sep 26, 2022, 2:09:49 AM9/26/22
to
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

Alberto Salvati

unread,
Sep 26, 2022, 2:10:41 AM9/26/22
to
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;

Luigis

unread,
Sep 26, 2022, 3:34:35 AM9/26/22
to
Il 26/09/2022 08:10, Alberto Salvati ha scritto:
> Canvas.TextWidth è un metodo, non una property:
>
Avevo scritto "funzione"

>
> 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.

Era solo un esempio per dire che quella chiamata restituisce 107 non era
certo una assegnazione.

>
> 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???
>
Io non voglio calcolare nulla, io mi faccio calcolare dalla TextWidth il
valore da assegnare alla larghezza del Panel ma la scritta non ci entra :(

>
> Quindi:
>
> x := StatusBar1.Canvas.TextWidth('Doc. da Inviare SDI: ' + '77');
>
>
> StatusBar1.Panels[0].Width := x;
>

Restituisce un valore più piccolo del necessario :(

Grazie.

Luigis

unread,
Sep 26, 2022, 3:39:20 AM9/26/22
to
Il 26/09/2022 08:09, Daniele ha scritto:
>
> Hai provato a considerare i bordi del pannello ?

Non mi sembra di aver trovato una property apposita.

> 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 ...
>
Questo lo stavo già facendo, infatti se aggiungo almeno 8 pixel al
valore che mi restituisce il metodo TextWidth la scritta entra nel panel.

> Poi dimmi come va ...
>
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.

Daniele

unread,
Sep 28, 2022, 10:15:09 AM9/28/22
to
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

Luigis

unread,
Sep 29, 2022, 3:04:27 AM9/29/22
to
Il 28/09/2022 16:14, Daniele ha scritto:
> E' un esempio, il tutto piu' che migliorabile ...
>
> 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.

Daniele

unread,
Sep 29, 2022, 10:36:46 AM9/29/22
to
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.

0 new messages