Welcome to OStack Knowledge Sharing Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
1.3k views
in Technique[技术] by (71.8m points)

delphi - How to get TextWidth of string (without Canvas)?

I would like to get text width of a string before an application starts. Everything works fine until Application.MainForm canvas present. The problem is, when I try dynamically create TOrdinarium in the OnCreate event of the app. main form, "Canvas does not allow drawing" error occurs. (Application.MainForm is nil....). I tried several ways to create Canvas dynamically (one of them is written below), but it can not measure text sizes without being attached to parented control.

Is there way how to make it work somehow?

Thanx

I tried this:

  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;
See Question&Answers more detail:os

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Answer

0 votes
by (71.8m points)

This works:

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;

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome to OStack Knowledge Sharing Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...