2009-09-23 11 views
5

ho questo codice Delphi per impostare la cue text di un controllo sulla mia forma:CueText equivalenti per un 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; 

voglio la same effect su un TMemo, ma il documento MSDN dice:

Non è possibile impostare un banner cue su un controllo di modifica multilinea o su un controllo di modifica ricco .

C'è un modo standard per avere un effetto di cuetext su un TMemo, o devo armeggiare con gli eventi OnEnter/OnExit e lanciare il mio?

risposta

7

È possibile hackerare il controllo TMemo versione

TMemo Con TextHint Linea

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; 

Per impostare la proprietà TextHint

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

TMemo Con TextHint MultiLine Versione

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'); 

Ciao.

+0

Questo funziona bene - peccato è necessario fare tutto questo, ma grazie mille per il codice. – JosephStyons

+0

Il 'TextHint' non sembra riapparire una volta che il testo è stato inserito nel' TRichEdit' ed eliminato. Era previsto? –