software - delphi technologies chihuahua
¿Cómo obtener TextWidth de cadena(sin lienzo)? (2)
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;
Me gustaría obtener el ancho del texto de una cadena antes de que se inicie una aplicación. Todo funciona bien hasta que presente el lienzo de Application.MainForm. El problema es que cuando intento crear dinámicamente TOrdinarium en el evento OnCreate de la aplicación. formulario principal, se produce el error "El lienzo no permite el dibujo". (Application.MainForm es nulo ....). Intenté varias formas de crear Canvas dinámicamente (una de ellas está escrita a continuación), pero no puede medir el tamaño del texto sin estar adjunta al control principal.
¿Hay alguna manera de hacer que funcione de alguna manera?
Gracias
Intenté esto:
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;
No estoy seguro de si se puede hacer esto, pero si "antes de que se inicie la aplicación" quiere decir "antes de que se muestre el formulario principal", siempre puede colocar el código relacionado con el lienzo en el evento OnCreate del formulario principal. Tendrás un lienzo válido para ese punto.