Delphi2007 と TEdit (ついでに TComboBox)

 今回は Delphi2007 の TEdit の話です。「"2007"ってのは "2009"の typo だろ、とっとと直せや!!」 と仰られても typo じゃないんですねぇ...これが。

 Delphi2009 には、  というプロパティが追加されている事をご存知の方も多いでしょう。しかし...これらのプロパティは Delphi2009 の専売特許じゃありません。以下のユニットをあなたのプロジェクトに追加して下さい。EditExt を uses するだけで Delphi2009 で新設されたプロパティを Delphi2007 で使う事ができます。但し、TextHint を利用するためには XP 以降の OS が必要となります。

unit EditExt;

interface

uses
  StdCtrls, Classes, Windows;

type
  TCustomEditExtention =
    class helper for TCustomEdit
    private
      function GetAlignmentValue: TAlignment;
      procedure SetAlignmentValue(InVal: TAlignment);
      function GetNumbersOnlyValue: Boolean;
      procedure SetNumbersOnlyValue(InVal: Boolean);
      function GetTextHintValue: String;
      procedure SetTextHint(InVal: String);
    published
      property Alignment: TAlignment read GetAlignmentValue write SetAlignmentValue;
      property NumbersOnly: Boolean read GetNumbersOnlyValue write SetNumbersOnlyValue;
      property TextHint: String read GetTextHintValue write SetTextHint;
    end;

const
  ECM_FIRST       = $1500;
  EM_SETCUEBANNER = ECM_FIRST + 1;
  EM_GETCUEBANNER = ECM_FIRST + 2;

implementation

function TCustomEditExtention.GetAlignmentValue: TAlignment;
var
  wh, al: Integer;
begin
  wh := GetWindowLong(Self.Handle, GWL_STYLE);
  if (wh and ES_CENTER) = ES_CENTER then
    result := taCenter
  else if (wh and ES_CENTER) = ES_RIGHT then
    result := taRightJustify
  else
    result := taLeftJustify;
end;

procedure TCustomEditExtention.SetAlignmentValue(InVal: TAlignment);
var
  wh, al: Integer;
begin
  case InVal of
    taRightJustify:
      al := ES_RIGHT;
    taCenter:
      al := ES_CENTER;
  else
    al := ES_LEFT;
  end;
  wh := GetWindowLong(Self.Handle, GWL_STYLE);
  SetWindowLong(Self.Handle, GWL_STYLE, (wh and $FFFFFFFCor al);
  Self.Refresh;
end;

function TCustomEditExtention.GetNumbersOnlyValue: Boolean;
var
  wh: Integer;
  al: Integer;
begin
  wh := GetWindowLong(Self.Handle, GWL_STYLE);
  result := ((wh and ES_NUMBER) = ES_NUMBER);
end;

procedure TCustomEditExtention.SetNumbersOnlyValue(InVal: Boolean);
var
  wh: Integer;
  al: Integer;
begin
  if InVal then
    al := ES_NUMBER
  else
    al := 0;
  wh := GetWindowLong(Self.Handle, GWL_STYLE);
  SetWindowLong(Self.Handle, GWL_STYLE, (wh and $FFFFDFFFor al);
  Self.Refresh;
end;

function TCustomEditExtention.GetTextHintValue: String;
const
  Buf_Size = 512;
var
  w: PWideChar;
begin
  result := '';
  w := AllocMem(Buf_Size);
  try
    SendMessage(Self.handle, EM_GETCUEBANNER, WParam(w), LParam(Buf_Size));
    result := WideCharToString(w);
  finally
    FreeMem(w);
  end;
end;

procedure TCustomEditExtention.SetTextHint(InVal: String);
var
  w: WideString;
begin
  w := InVal;
  SendMessage(Self.handle, EM_SETCUEBANNER, 1, LParam(PWideChar(w)));
  Self.Refresh;
end;
end

 TComboBox も同様に、TextHint が追加になっています。但し、TextHint を利用するためには、TComboBox の Style が csDropDownList でないといけません。加えて言うなら、Vista 以降の OS が必要となります。

unit ComboBoxExt;

interface

uses
  StdCtrls, Classes, Windows;

type
  TCustomComboBoxExtention =
    class helper for TCustomComboBox
    private
      function GetTextHintValue: String;
      procedure SetTextHint(InVal: String);
    published
      property TextHint: String read GetTextHintValue write SetTextHint;
    end;

const
  CBM_FIRST       = $1700;
  CB_SETCUEBANNER = CBM_FIRST + 3;
  CB_GETCUEBANNER = CBM_FIRST + 4;

implementation

function TCustomComboBoxExtention.GetTextHintValue: String;
const
  Buf_Size = 512;
var
  w: PWideChar;
begin
  result := '';
  w := AllocMem(Buf_Size);
  try
    SendMessage(Self.handle, CB_GETCUEBANNER, WParam(w), LParam(Buf_Size));
    result := WideCharToString(w);
  finally
    FreeMem(w);
  end;
end;

procedure TCustomComboBoxExtention.SetTextHint(InVal: String);
var
  w: WideString;
begin
  w := InVal;
  SendMessage(Self.handle, CB_SETCUEBANNER, 0, LParam(PWideChar(w)));
  Self.Refresh;
end;
end.

 クラスヘルパーは BDS2006 からの対応 (正式には) なので、BDS2006 でも、XPMan が uses されていれば動作すると思います。


 BACK