2012-03-30 3 views
7

いくつかのフォームでは、フィールドに含まれる可能性のあるテキストをすべて表示するのに十分な幅がないdbEditsがあります。そのために私は次のコードを持っている:dbEditのテキストが表示されているテキストより長いかどうかを確認することはできますか?

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

私はすべてのテキストが表示されている場合を示すヒントを避けるしたいのですが、私はどのようにその条件をテストすることはありません。

ヒント/ご提案ありがとうございます!私は、これは動作するはずだと思う

答えて

5

...

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

は魅力的です!ありがとう@JamesB – skippix

6

ここでは考慮にEditコントロールのマージン(すなわちEM_SETMARGINS)をとる(TBitmapオーバーヘッドなし)高速バージョンです。

下記のIsEditTextOverflowを使用して、テキストが表示領域をオーバーフローするかどうかを判断します。

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; 
関連する問題