tags:

views:

278

answers:

2

Hi,

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;
A: 

I'm not sure if this can be done, but if by "before the app starts" you mean "before the main form is displayed", you could always put your canvas-related code in the main form's OnCreate event. You'll have a valid canvas by that point.

Mason Wheeler
yes... Bitmap is the simplest solution... sorry, Mason, to bother you... I wanted to measure width inside TOrdinarium without using Form Canvas.... I didnt see what was obvious... Thanx anyway
lyborko
+9  A: 

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;
Andreas Rejbrand
Although I am not sure if it addesses your problem, I must admit. Generally, however, creating off-screen bitmaps can help you.
Andreas Rejbrand
Bitmap... what the hell simple solution... shame on me... Thanks
lyborko
The only thing to remember with this is to correctly initialise the font property of the bitmap canvas (in the absence of an initialised font on some visual component to "borrow" from), otherwise the text extent reported will be pretty meaningless.
Deltics