2012-03-30 16 views
7

Su alcuni moduli ho dbEdits che a volte non sono abbastanza ampi per mostrare tutto il testo che i loro campi possono contenere. Per loro ho il seguente codice:È possibile determinare se il testo in un dbEdit è più lungo di quello che è visibile?

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

vorrei evitare il suggerimento che mostra se tutto il testo è visibile, ma non come per verificare tale condizione.

Grazie per eventuali suggerimenti/suggerimenti!

risposta

5

Penso che questo dovrebbe funzionare ...

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

funziona come un fascino! GRAZIE @ JamesB – skippix

6

Ecco una versione veloce (senza spese generali TBitmap) che prende in considerazione i margini del controllo Edit (vale a dire EM_SETMARGINS).

Utilizzare IsEditTextOverflow di seguito per determinare se il testo trabocca l'area visibile.

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;