我想在应用程序启动之前获取字符串的文本宽度.一切正常,直到Application.MainForm画布呈现.问题是,当我尝试在应用程序的OnCreate事件中动态创建TOrdinarium.主窗体“Canvas不允许绘图”出现错误. (Application.MainForm是nil ….).我尝试了几种方式动态创建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;
解决方法
这样做:
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;