2010-03-30 16 views
15

Bir uygulama başlamadan önce bir dizenin metin genişliğini almak istiyorum. Her şey, Application.MainForm'un tuvalini sunana kadar iyi çalışıyor. Sorun, uygulamanın OnCreate olayında dinamik olarak TOrdinarium'u oluşturduğumda. ana formu, "Tuval çizim izin vermiyor" hatası oluşur. (Application.MainForm sıfırdır ....). Tuvali dinamik olarak oluşturmanın birkaç yolunu denedim (bunlardan biri aşağıda yazılmıştır), ancak metin boyutlarını ebeveyn kontrolüne eklenmeden ölçemez.Dize TextWidth (Tuvalsiz) nasıl alınır?

Bir şekilde nasıl çalışacağın yolu var mı? Bu yapılabilir eğer

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; 

cevap

27

Bu çalışır:

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

Sorununuzu ekleyip eklemediğinden emin değilim, itiraf etmeliyim. Ancak, genellikle ekran dışı bitmapler oluşturmak size yardımcı olabilir. –

+0

Bitmap ... Ne cehennem çözümü ... bana utanç ver ... Teşekkürler – lyborko

+2

Bunu hatırlamak için tek şey, bitmap tuvalinin font özelliğini doğru bir şekilde başlatmaktır (bazı görsellerde ilklendirilmiş yazı tipinin yokluğunda) "ödünç almak" bileşeni, aksi halde rapor edilen metin kapsamı oldukça anlamsız olacaktır. – Deltics

0

emin değilim ama "uygulaması başlamadan önce" kastın eğer "ana form görüntülenmeden önce": Thanx

Bu çalıştı tuvalinizle ilgili kodu her zaman ana formun OnCreate etkinliğine koyabilirsiniz. Bu noktadan geçerli bir tuvaliniz olacak.

+0

evet ... Bitmap basit çözüm ... üzgünüm, Mason, rahatsız ettiğim için ... Ben Formu Tuval kullanmadan TOrdinarium iç genişliğini ölçmek istemiştim .... Neyin açık olduğunu görmedim ... Thanx zaten – lyborko

İlgili konular