Как получить TextWidth строки (без холста)?

Я хочу получить ширину текста строки перед запуском приложения. Все работает нормально до тех пор, пока не появится холст Application.MainForm. Проблема в том, что когда я пытаюсь динамически создавать TOrdinarium в событии OnCreate приложения. основная форма, ошибка "Холст не позволяет рисовать". (Application.MainForm - ноль....). Я попробовал несколько способов создания Canvas динамически (один из них написан ниже), но он не может измерять размеры текста без привязки к родительскому элементу управления.

Есть ли способ сделать так, чтобы он работал?

Thanx

Я пробовал это:

  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;

Ответы

Ответ 1

Это работает:

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;

Ответ 2

Я не уверен, что это можно сделать, но если "перед запуском приложения" вы имеете в виду "до отображения основной формы", вы всегда можете поместить свой связанный с холстом код в основную форму OnCreate. У вас будет действующий холст к этому моменту.