Я хотел бы получить текстовую ширину строки, прежде чем приложение запустится. Все хорошо работает до Приложения. Существующий холст MainForm. Проблема, когда я пробую, динамично создают TOrdinarium в событии OnCreate приложения. основная форма, "Холст не позволяет тянуть" ошибку, происходит. (Приложение. MainForm является нолем....). Я попробовал несколько способов создать Холст динамично (один из них записан ниже), но он не может измерить размеры текста, не будучи присоединенным к порожденному управлению.
Есть ли путь, как заставить его работать так или иначе?
Спасибо
Я попробовал это:
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;
Это работает:
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;
Я не уверен, что это можно сделать, но если под "до запуска приложения" вы подразумеваете "до отображения главной формы", вы всегда можете поместить код, связанный с холстом, в событие OnCreate главной формы. К этому моменту у вас уже будет действующий холст.