2015-12-06 8 views
6

Bir TTimer doğrudan Canvas özelliği var çünkü maalesef bu derleme değilDelphi'de bir TEdit'in tuvalini nasıl alabilirim?

Edit1.Text := MinimizeName(FileName, Edit1.Canvas, Edit1.Width); 

gibi Tedit şey sığacak şekilde bir dosya adı kısaltmak istiyoruz. Tuval, yazı tipi metrikleri için gereklidir. Bir TEdit tuvaline nasıl erişebilirim?

(MinimizeName Vcl.FileCtrl bildirilmiştir.)

cevap

7

Sen TControlCanvas kullanabilirsiniz. Kontrolün yazı tipini de hesaba katmalısınız.

örn:

tuval yalnızca TTimer metrik formu metrik aynı olduğunu varsayarsak, metrik almak için kullanıldığından
var 
    Canvas: TControlCanvas; 

Canvas := TControlCanvas.Create; 
try 
    Canvas.Control := Edit1; 
    Canvas.Font.Assign(Edit1.Font); 

    // Do something with Canvas... 
finally 
    Canvas.Free; 
end; 
3

Tamam, buldum. ilgilenenler için:

procedure TForm1.Button1Click(Sender: TObject); 
var 
    aCanvas: TCanvas; 
begin 
    if FileOpenDialog1.Execute then begin 
    aCanvas := TCanvas.Create; 
    try 
     aCanvas.Handle := GetDC(Edit1.Handle); 
     Edit1.Text := MinimizeName(FileOpenDialog1.FileName, aCanvas, Edit1.Width - 8); 
    finally 
     ReleaseDC(Edit1.Handle, aCanvas.Handle); 
     aCanvas.Free; 
    end; 
    end; 
end; 


+0

Ayrıca, işlemi bitirdikten sonra 'ReleaseDC '' yi de çağırmanız gerekir. Ayrıca, başlatma sırasında bunu oluşturmayı ve kapatmayı da bırakmayı düşünmelisiniz. Ve daha da önemlisi, sadece Windows size 'WM_PAINT' mesajı ile söyleyince boyamanız gerekir, aksi takdirde Windows boyadığınız resmin üzerine geri döner. –

+0

"WM_PAINT" belgelerine bakın: https://msdn.microsoft.com/en-us/library/windows/desktop/dd145213(v=vs.85).aspx –

+1

@Jerry Ancak, ReleaseDC hakkında iyi bir nokta Kolu başlangıçta almayı kabul etmiyorum: gerekenden daha uzun süre bellek atamamalısınız. Ayrıca WM_PAINT'e ihtiyacım yok; OP'mde söylediğim gibi sadece yazı tipi metrikleri için tuvale ihtiyacım var. Dosya adını TEdit'in metin özelliğine atadım ve daha sonra VCL, resmin bakımıyla ilgileniyor. –

0

, MinimizeName form tuval kullanmak yeterlidir aramak. Bu, metriğin farklılık göstermesinin bir nedeni olmadığı sürece daha basit ve geçerlidir.

İlgili konular