如何获取字符串的TextWidth(没有Canvas)?

时间:2010-03-30 19:40:45

标签: delphi

我希望在应用程序启动之前获取字符串的文本宽度。在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;

2 个答案:

答案 0 :(得分:33)

这有效:

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;

答案 1 :(得分:0)

我不确定是否可以这样做,但如果“在应用程序启动之前”表示“在显示主窗体之前”,则可以始终将与画布相关的代码放在主窗体的OnCreate事件中。到那时你将拥有一个有效的画布。