我想在应用程序启动之前获取字符串的文本宽度.在Application.MainForm画布出现之前,一切正常.问题是,当我尝试在应用程序的OnCreate事件中动态创建TOrdinarium时.主窗体,"Canvas不允许绘图"错误发生.(Application.MainForm是零......).我尝试了几种动态创建Canvas的方法(其中一种是在下面编写的),但它无法测量文本大小而不附加到父级控件.
是否有办法让它以某种方式工作?
感谢名单
我试过这个:
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;
Run Code Online (Sandbox Code Playgroud)
And*_*and 35
这有效:
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;
Run Code Online (Sandbox Code Playgroud)