2010-03-30 5 views
15

Me gustaría obtener el ancho del texto de una cadena antes de que comience la aplicación. Todo funciona bien hasta que aparezca el lienzo Application.MainForm. El problema es que cuando intento crear dinámicamente TOrdinarium en el evento OnCreate de la aplicación. forma principal, se produce el error "El lienzo no permite dibujar". (Application.MainForm es nulo ...). Intenté varias formas de crear Canvas de forma dinámica (una de ellas está escrita debajo), pero no puede medir el tamaño del texto sin estar conectado al control parentelado.¿Cómo obtener TextWidth de cadena (sin Canvas)?

¿Hay alguna manera de hacerlo funcionar de alguna manera?

Gracias

yo probamos este:

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; 

Respuesta

27

Esto funciona:

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

Aunque no estoy seguro de si cumple su problema, debo admitirlo. En general, sin embargo, crear bitmaps fuera de la pantalla puede ayudarte. –

+0

Mapa de bits ... qué diablos solución simple ... lástima de mí ... Gracias – lyborko

+2

Lo único que debe recordar con esto es inicializar correctamente la propiedad de la fuente del lienzo de mapa de bits (en ausencia de una fuente inicializada en algunos visual componente para "tomar prestado"), de lo contrario, la extensión del texto informada carecerá de sentido. – Deltics

0

no estoy seguro de si esto se puede hacer, pero si por "antes de que comience la aplicación" quiere decir "antes de que se muestre el formulario principal" , siempre podría poner su código relacionado con el lienzo en el evento OnCreate del formulario principal. Tendrás un lienzo válido en ese punto.

+0

sí ... mapa de bits es la solución más simple ... lo siento, Mason, que te moleste ... Yo quería medir el ancho interior TOrdinarium sin utilizar el Formulario lienzo .... No vi lo que era obvio ... Gracias de todos modos – lyborko

Cuestiones relacionadas