2012-03-30 31 views
7

Trên một số biểu mẫu, tôi có dbEdits đôi khi không đủ rộng để hiển thị tất cả văn bản mà các trường của chúng có thể chứa. Đối với họ, tôi có mã sau:Có thể xác định xem văn bản trong dbEdit có dài hơn nội dung hiển thị không?

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

Tôi muốn tránh gợi ý hiển thị nếu tất cả văn bản hiển thị, nhưng tôi không biết cách kiểm tra điều kiện đó.

Cảm ơn mọi lời khuyên/đề xuất!

Trả lời

5

Tôi nghĩ rằng điều này sẽ làm việc ...

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

hoạt động như một sự quyến rũ! THANKS @ JamesB – skippix

6

Đây là một phiên bản nhanh (mà không có một overhead TBitmap) mà sẽ đưa vào tài khoản Margins các Edit kiểm soát của (ví dụ: EM_SETMARGINS).

Sử dụng IsEditTextOverflow bên dưới để xác định xem Văn bản có làm tràn khu vực hiển thị hay không.

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; 
Các vấn đề liên quan