2012-03-30 23 views
7

En algunos formularios tengo dbEdits que a veces no son lo suficientemente anchos como para mostrar todo el texto que pueden contener sus campos. Para ellos tengo el siguiente código:¿Es posible determinar si el texto en un dbEdit es más largo que lo visible?

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

me gustaría evitar la indirecta que muestra si todo el texto es visible, pero no sé cómo probar para esa condición.

¡Gracias por cualquier consejo/sugerencia!

Respuesta

5

Creo que esto debería funcionar ...

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

funciona como un encanto! GRACIAS @JamesB – skippix

6

Aquí es una versión rápida (sin una sobrecarga TBitmap) que tenga en cuenta los márgenes de la Edit de control (es decir EM_SETMARGINS).

Utilice IsEditTextOverflow a continuación para determinar si el texto sobrepasa el área visible.

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; 
Cuestiones relacionadas