2010-03-30 17 views
15

我想在應用程序啓動之前獲取字符串的文本寬度。一切正常,直到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; 

回答

27

這工作:

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; 
+0

雖然我不知道它是否能夠解決您的問題,但我必須承認。但是,通常情況下,創建離屏位圖可以幫助您。 – 2010-03-30 19:51:00

+0

位圖...什麼是簡單的解決方案......對我感到羞恥......謝謝 – lyborko 2010-03-30 19:54:20

+2

唯一要記住的是,要正確初始化位圖畫布的字體屬性(在某些視覺上沒有初始化字體的情況下組件「借用」),否則報告的文本範圍將是非常沒有意義的。 – Deltics 2010-03-30 20:02:05

0

我不知道這是可以做到的,但如果以「應用程序啓動之前,」你的意思是「被顯示在主窗體之前」 ,你總是可以將你的畫布相關代碼放在主窗體的OnCreate事件中。在這點上你將擁有一個有效的畫布。

+0

是...位圖是最簡單的解決方案...對不起,梅森,打擾你......我想衡量內部TOrdinarium寬度不使用表格畫布....我沒有看到什麼是顯而易見的... Thanx無論如何 – lyborko 2010-03-30 19:56:06

相關問題