2009-09-23 76 views
5

我有这样的德尔福代码设置我的窗体上的控制cue textCueText相当于一个TMemo

procedure TfrmMain.SetCueText(edt: TWinControl; cueText: string); 
const 
    ECM_FIRST = $1500; 
    EM_SETCUEBANNER = ECM_FIRST + 1; 
begin 
    SendMessage(edt.Handle,EM_SETCUEBANNER,0, 
    LParam(PWideChar(WideString(cueText)))); 
end; 

我想在一个TMemo的same effect,但MSDN文档说:

您不能在 多行编辑控件或富编辑控件上设置提示横幅。

是否有一个标准的方式来在TMemo上有一个cuetext效果,还是我不得不摆弄OnEnter/OnExit事件并自己动手?

回答

7

你能砍的TMemo控件

TMemo随着TextHint单行版本

type 
    TMemo = class(StdCtrls.TMemo) 
    private 
    FTextHint: string; 
    FTextHintFont: TFont; 
    protected 
    FCanvas : TCanvas; 
    procedure WMPaint(var Message: TWMPaint); message WM_PAINT; 
    public 
    constructor Create(AOwner : TComponent); override; 
    destructor Destroy; override; 
    published 
    property TextHint: string read FTextHint write FTextHint; 
    property TextHintFont: TFont read FTextHintFont write FTextHintFont; 
    end; 

    TForm1 = class(TForm) 
    Memo1: TMemo; 
    private 
    public 
    end; 


constructor TMemo.Create(AOwner: TComponent); 
begin 
    inherited; 
    FCanvas    := TControlCanvas.Create; 
    FTextHintFont   := TFont.Create; 
    FTextHintFont.Color := clGrayText; 
    TControlCanvas(FCanvas).Control := Self; 
end; 

destructor TMemo.Destroy; 
begin 
    FreeAndNil(FTextHintFont); 
    FreeAndNil(FCanvas); 
    inherited; 
end; 

procedure TMemo.WMPaint(var Message: TWMPaint); 
begin 
    inherited; 
    if (Text = '') and (not Focused) then 
    begin 
    FCanvas.Font := FTextHintFont; 
    FCanvas.TextOut(1, 1, FTextHint); //Note : is not multiline 
    end; 
end; 

要设置TextHint属性

Memo1.TextHint:='Enter your comments here'; 

TMemo随着TextHint多行版本

type 
    TMemo = class(StdCtrls.TMemo) 
    private 
    FTextHint: TStrings; 
    FTextHintFont: TFont; 
    protected 
    FCanvas : TCanvas; 
    procedure WMPaint(var Message: TWMPaint); message WM_PAINT; 
    public 
    constructor Create(AOwner : TComponent); override; 
    destructor Destroy; override; 
    published 
    property TextHint: TStrings read FTextHint write FTextHint; 
    property TextHintFont: TFont read FTextHintFont write FTextHintFont; 
    end; 


constructor TMemo.Create(AOwner: TComponent); 
begin 
    inherited; 
    FTextHint    := TStringList.Create; 
    FCanvas    := TControlCanvas.Create; 
    FTextHintFont   := TFont.Create; 
    FTextHintFont.Color := clGrayText; 
    TControlCanvas(FCanvas).Control := Self; 
end; 

destructor TMemo.Destroy; 
begin 
    FreeAndNil(FTextHintFont); 
    FreeAndNil(FCanvas); 
    FTextHint.Clear; 
    FreeAndNil(FTextHint); 
inherited; 
end; 

procedure TMemo.WMPaint(var Message: TWMPaint); 
Var 
i   : integer; 
TextHeight : Integer; 
begin 
    inherited; 
    if (Text = '') and (not Focused) then 
    begin 
    FCanvas.Font := FTextHintFont; 
    TextHeight:=FCanvas.TextHeight('MLZ'); //Dummy Text to determine Height 
    for i := 0 to FTextHint.Count - 1 do 
    FCanvas.TextOut(1, 1+(i*TextHeight), FTextHint[i]); 
    end; 
end; 

Memo1.TextHint.Add('Enter your comments here Line 1'); 
Memo1.TextHint.Add('Enter your comments here Line 2'); 
Memo1.TextHint.Add('Enter your comments here Line 3'); 

再见。

+0

这很好 - 太糟糕了,有必要做所有这些,但非常感谢代码。 – JosephStyons 2009-09-24 15:59:23

+0

一旦将文本输入到“TRichEdit”中并删除,'TextHint'似乎就不会再出现。这是预期的吗? – 2017-03-21 19:54:08