2012-03-30 8 views
7

Auf einigen Formularen habe ich dbEdits, die manchmal nicht breit genug sind, um den gesamten Text anzuzeigen, den ihre Felder enthalten können. Für sie habe ich den folgenden Code:Kann festgestellt werden, ob der Text in einem dbEdit länger ist als sichtbar?

procedure Tgm12edLots.dbeLotNameMouseEnter(Sender: TObject); 
begin 
    with dbeLotName do begin 
    ShowHint := True; 
    Hint := Text; 
    end; 
end; 

Ich möchte den Hinweis vermeiden, zeigt, wenn der gesamte Text sichtbar ist, aber ich weiß nicht, wie für diesen Zustand zu testen.

Danke für irgendwelche Tipps/Vorschläge!

Antwort

5

Ich denke, das sollte funktionieren ...

function CanShowAllText(Edit: TDBEdit):Boolean; 
var 
    TextWidth:Integer; 
    VisibleWidth: Integer; 
    Bitmap: TBitmap; 
const 
//This could be worked out but without delphi I can't remember all that goes into it. 
    BordersAndMarginsWidthEtc = 4; 
begin 
    Bitmap := TBitmap.Create; 
    try 
     Bitmap.Canvas.Font.Assign(Edit.Font); 
     TextWidth := Bitmap.Canvas.TextWidth(Edit.Text); 
     VisibleWidth := Edit.Width - BordersAndMarginsWidthEtc; 
     Result := TextWidth < VisibleWidth; 
    finally 
     Bitmap.Free; 
    end; 
end; 
+0

funktioniert wie ein Charme! DANKE @JamesB – skippix

6

Hier ist eine schnelle Version (ohne TBitmap Overhead), die berücksichtigt die Edit Kontrolle des Margins (d EM_SETMARGINS).

Verwenden Sie IsEditTextOverflow unten, um festzustellen, ob der Text den sichtbaren Bereich überläuft.

type 
    TCustomEditAccess = class(TCustomEdit); 

function EditTextWidth(Edit: TCustomEdit): Integer; 
var 
    DC: HDC; 
    Size: TSize; 
    SaveFont: HFont; 
begin 
    DC := GetDC(0); 
    SaveFont := SelectObject(DC, TCustomEditAccess(Edit).Font.Handle); 
    GetTextExtentPoint32(DC, PChar(Edit.Text), Length(Edit.Text), Size); 
    SelectObject(DC, SaveFont); 
    ReleaseDC(0, DC); 
    Result := Size.cx; 
end; 

function EditVisibleWidth(Edit: TCustomEdit): Integer; 
var 
    R: TRect; 
begin 
    SendMessage(Edit.Handle, EM_GETRECT, 0, LPARAM(@R)); 
    Result := R.Right - R.Left; 
end; 

function IsEditTextOverflow(Edit: TCustomEdit): Boolean; 
begin 
    Result := EditTextWidth(Edit) > EditVisibleWidth(Edit); 
end; 
Verwandte Themen