2012-03-30 15 views
7

W niektórych formularzach mam dbEdits, które czasami nie są wystarczająco szerokie, aby pokazać cały tekst, jaki mogą zawierać ich pola. Dla nich mam następujący kod:Czy można ustalić, czy tekst w dbEdit jest dłuższy niż to, co jest widoczne?

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

Chciałbym uniknąć wskazówkę pokazując jeśli cały tekst jest widoczny, ale nie mam jak sprawdzić w tym stanie.

Dzięki za wszelkie wskazówki/sugestie!

Odpowiedz

5

myślę, że to powinno działać ...

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

działa jak urok! DZIĘKI @JamesB – skippix

6

Oto szybka wersja (bez TBitmap napowietrznych), który uwzględnia marginesie Edit kontrolki (tj EM_SETMARGINS).

Użyj poniższej tabeli, aby określić, czy tekst przepełnia widoczny obszar.

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; 
Powiązane problemy