基本的に、この Microsoft ページの編集のように、最初の文字が入力されたときに TEdit の TextHint が消え、フォーカスを受け取ったときに消えないようにしたい: Sign in to your Microsoft account。誰かがこれを達成する方法を教えてもらえますか?
前もって感謝します。
基本的に、この Microsoft ページの編集のように、最初の文字が入力されたときに TEdit の TextHint が消え、フォーカスを受け取ったときに消えないようにしたい: Sign in to your Microsoft account。誰かがこれを達成する方法を教えてもらえますか?
前もって感謝します。
組み込みのTEdit
動作ではこれが許可されていませんが、新しいコントロールを派生させてTEdit
オーバーライドすることはできますDoSetTextHint
。実装は internal メソッドに似ている必要がありますがwParam
、0 ではなく 1 の値を提供します。
これは、インターセプター クラスを使用したソリューションです。
unit EditInterceptor;
uses
Vcl.StdCtrls, System.SysUtils, Winapi.Messages, Windows;
type
TEdit = class(Vcl.StdCtrls.TEdit)
protected
procedure DoSetTextHint(const Value: string); override;
end;
implementation
uses
Vcl.Themes, Winapi.CommCtrl;
procedure TEdit.DoSetTextHint(const Value: string);
begin
if CheckWin32Version(5, 1) and StyleServices.Enabled and HandleAllocated then
SendTextMessage(Handle, EM_SETCUEBANNER, WPARAM(1), Value);
end;
end.
このユニットは、Vcl.StdCtrlsの後のインターフェイス uses 句に必ず配置してください。
Uwe Raabe の回答に基づく手順は次のとおりです (Delphi 2007 の場合は、新しいバージョンの Delphi でも機能するはずです)。
type
TCueBannerHideEnum = (cbhHideOnFocus, cbhHideOnText);
procedure TEdit_SetCueBanner(_ed: TEdit; const _s: WideString; _WhenToHide: TCueBannerHideEnum = cbhHideOnFocus);
const
EM_SETCUEBANNER = $1501;
var
wParam: Integer;
begin
case _WhenToHide of
cbhHideOnText: wParam := 1;
else // cbhHideOnFocus: ;
wParam := 0;
end;
SendMessage(_ed.Handle, EM_SETCUEBANNER, wParam, Integer(PWideChar(_s)));
end;
次のように呼び出します。
constructor TForm1.Create(_Owner: TComponent);
begin
inherited;
TEdit_SetCueBanner(ed_HideOnFocus, 'hide on focus', cbhHideOnFocus);
TEdit_SetCueBanner(ed_HideOnText, 'hide on text', cbhHideOnText);
end;
ただし、Windows のバージョンはチェックされません。Uwe が提供する if ステートメントを追加することをお勧めします。
if CheckWin32Version(5, 1) and StyleServices.Enabled and _ed.HandleAllocated then
ランタイム テーマを無効にしたプロジェクトでテストしたところ、動作しませんでした。