我想在應用程序啓動之前獲取字符串的文本寬度。一切正常,直到Application.MainForm畫布出現。問題是,當我嘗試在應用程序的OnCreate事件中動態創建TOrdinarium時。主窗體,「Canvas不允許繪圖」錯誤發生。 (Application.MainForm是零....)。我嘗試了幾種動態創建Canvas的方法(其中之一寫在下面),但它不能測量文本大小,而不會連接到父控制。如何獲取字符串的TextWidth(沒有畫布)?
是否有辦法讓它工作?
感謝名單
我嘗試這樣做:
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;
雖然我不知道它是否能夠解決您的問題,但我必須承認。但是,通常情況下,創建離屏位圖可以幫助您。 – 2010-03-30 19:51:00
位圖...什麼是簡單的解決方案......對我感到羞恥......謝謝 – lyborko 2010-03-30 19:54:20
唯一要記住的是,要正確初始化位圖畫布的字體屬性(在某些視覺上沒有初始化字體的情況下組件「借用」),否則報告的文本範圍將是非常沒有意義的。 – Deltics 2010-03-30 20:02:05