2010-03-30 9 views
15

Vorrei ottenere la larghezza del testo di una stringa prima dell'avvio di un'applicazione. Tutto funziona bene fino alla presenza di canvas Application.MainForm. Il problema è che quando provo a creare dinamicamente TOrdinarium nell'evento OnCreate dell'applicazione. forma principale, si verifica un errore "Canvas non consente di disegnare". (Application.MainForm è nullo ....). Ho provato diversi modi per creare Canvas in modo dinamico (uno di questi è scritto sotto), ma non può misurare le dimensioni del testo senza essere collegato al controllo genitore.Come ottenere TextWidth della stringa (senza Canvas)?

C'è modo di farlo funzionare in qualche modo?

Thanx

ho provato questo:

TOrdinarium = class (TCustomControl) 
    private 
     function GetVirtualWidth:integer; 
    end; 

constructor TOrdinarium.Create(AOwner:TComponent); 
begin 
inherited; 
Width:=GetVirtualWidth; 
end; 

function TOrdinarium.GetVirtualWidth:integer; 
var ACanvas : TControlCanvas; 
    begin 
    ACanvas := TControlCanvas.Create; 
    TControlCanvas(ACanvas).Control := Application.MainForm; 
    ACanvas.Font.Assign(Font); 

    result:=ACanvas.TextWidth('0'); 

    ACanvas.Free; 
    end; 

risposta

27

Questo funziona:

procedure TForm1.FormCreate(Sender: TObject); 
var 
    c: TBitmap; 
begin 
    c := TBitmap.Create; 
    try 
    c.Canvas.Font.Assign(self.Font); 
    Caption := IntToStr(c.Canvas.TextWidth('My String')); 
    finally 
    c.Free; 
    end; 
end; 
+0

Anche se non sono sicuro che questo aggiunga il tuo problema, devo ammettere. In generale, tuttavia, la creazione di bitmap fuori schermo può essere di aiuto. –

+0

Bitmap ... che diavolo semplice soluzione ... vergogna per me ... Grazie – lyborko

+2

L'unica cosa da ricordare con questo è inizializzare correttamente la proprietà font della tela bitmap (in assenza di un font inizializzato su alcuni visual componente da "prendere in prestito" da), altrimenti l'estensione del testo riportata sarà piuttosto priva di significato. – Deltics

0

io non sono sicuro se questo può essere fatto, ma se da "prima che l'applicazione si avvia" intendi "prima che venga visualizzato il modulo principale" , puoi sempre inserire il codice relativo al canvas nell'evento OnCreate del modulo principale. Avrai una tela valida da quel punto.

+0

sì ... Bitmap è la soluzione più semplice ... mi dispiace, Mason, al fastidio ... ho voluto misurare la larghezza interna TOrdinarium senza utilizzare Modulo di tela di canapa .... Non ho visto che cosa era ovvio ... Grazie comunque – lyborko

Problemi correlati