2015-12-06 5 views
6

Ich möchte einen Dateinamen verkürzen, einen TEdit zu passen, so etwas wieWie kann ich ein TEdit-Canvas in Delphi erhalten?

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

Leider ist dieses nicht kompilieren, weil ein TEdit eine direkt Canvas Eigenschaft verfügt. Die Zeichenfläche wird für ihre Schriftmetriken benötigt. Wie kann ich auf eine Leinwand von TEdit zugreifen?

(MinimizeName in Vcl.FileCtrl erklärt.)

Antwort

7

könnten Sie TControlCanvas verwenden. Sie sollten auch die Schriftart des Steuerelements berücksichtigen.

zB:

var 
    Canvas: TControlCanvas; 

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

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

OK, ich habe es gefunden. Für diejenigen, die interessiert sind:

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

Sie müssen 'ReleaseDC' auch aufrufen, wenn Sie es nicht mehr verwenden. Sie sollten auch in Betracht ziehen, dies beim Start zu erstellen und es beim Herunterfahren freizugeben. Und noch wichtiger: Sie sollten nur malen, wenn Windows Sie über die Meldung "WM_PAINT" dazu auffordert, oder Windows wird einfach wieder über das, was Sie gemalt haben, malen. –

+0

Siehe die Dokumentation für 'WM_PAINT': https://msdn.microsoft.com/en-us/library/windows/desktop/dd145213(v=vs.85).aspx –

+1

@Jerry Gute Punkt über die ReleaseDC, obwohl Ich stimme nicht überein, das Handle beim Start zu bekommen: Sie sollten Speicher nicht länger als erforderlich zuweisen. Außerdem brauche ich den WM_PAINT nicht; Ich brauche nur die Leinwand für die Font-Metriken, wie ich in meinem OP gesagt habe. Ich gebe den Dateinamen der Texteigenschaft des TEdits zu, und dann kümmert sich die VCL um das Malen. –

0

Da die Leinwand nur die Metrik erhalten verwendet wird, wenn Sie davon ausgehen, dass die TEdit Metrik das gleiche wie die Form Metrik ist, genügt es, die Form Leinwand in der MinimizeName zu verwenden Anruf. Dies ist einfacher und gültig, es sei denn, es gibt einen Grund, warum die Metrik sich unterscheiden würde.

Verwandte Themen