Как получить 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. У вас будет действующий холст к этому моменту.