Autor Beitrag
rd3
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Mi 27.11.13 16:57 
Hallo,

ich hab hier zwei hoffentlich nützliche Klassen gebastelt:
Analog zur Explorer-Suchleiste, wo "Suchen" drin steht, sobald noch nichts eingegeben wurde, habe ich diese Features für ein TEdit (Standard VCL) und ein TcxTextEdit (DevExpress) zur Verfügung gestellt. Teilweise gibt es schon ähnliches als Funktionen im Web aber nicht gekapselt.
-> msdn.microsoft.com/e...39%28v=vs.85%29.aspx

Falls ihr DevExpress-Controls nicht habt, baut ggf Schalter ein oder kommentiert den Teil aus, der nicht läuft.

Falls ihr die Funktionalität für das TEdit benutzen möchtet, so bindet die folgende Unit "Controls.Gui.GhostEdit" nach "StdCtrls".
Für TcxTextEdit muss die Unit "Controls.Gui.GhostEdit" nach "cxTextEdit".

Einen BannerText für das TEdit-Control setzt man, wie folgt (Beispiel-Text):
ausblenden Delphi-Quelltext
1:
edName.BannerText := 'Namen eingeben...';  // edName -> TEdit					


Einen BannerText für das TcxTextEdit-Control setzt man, wie folgt (Beispiel-Text):
ausblenden Delphi-Quelltext
1:
TcxTextEdit.TcxTextEditProperties(edFirstName.ActiveProperties).BannerText := 'Bitte Vornamen eingeben...'//edFirstName -> TcxTextEdit					


So, und hier die komplette Unit, die ihr bloß als Controls.Gui.GhostEdit.pas speichern müsst:
ausblenden volle Höhe Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
77:
78:
79:
80:
81:
82:
83:
84:
85:
86:
87:
88:
89:
90:
91:
92:
93:
94:
95:
96:
97:
98:
99:
100:
101:
102:
103:
104:
105:
106:
107:
108:
109:
110:
111:
112:
113:
114:
115:
116:
117:
118:
119:
120:
121:
122:
123:
124:
125:
126:
127:
128:
129:
130:
131:
132:
133:
134:
135:
136:
137:
138:
139:
140:
141:
142:
143:
144:
145:
146:
147:
148:
149:
150:
151:
152:
153:
154:
155:
156:
157:
158:
159:
160:
161:
162:
163:
164:
165:
166:
167:
168:
169:
170:
171:
172:
173:
174:
175:
176:
177:
178:
179:
180:
181:
182:
183:
184:
185:
186:
187:
188:
189:
190:
191:
192:
193:
194:
195:
196:
197:
198:
//******************************************************************************
//*
//*  Project:       Controls.Gui.GhostEdit
//*  Module:        egal
//*  File:          Controls.Gui.GhostEdit.pas
//*  Version:       1.0
//*  Description:   TEdit -> Banner-/HinweisText bei leerem TEdit, wie Suchleiste im Explorer
//*                 TcxTextEdit -> Banner-/HinweisText bei leerem TcxTextEdit, wie Suchleiste im Explorer
//*  EXAMPLE
//*  Author:        rd3
//*  created:       26.11.2013
//*  changed:       27.11.2013
//*  Environment:   Delphi XE
//*
//******************************************************************************

{
  include Controls.Gui.GhostEdit right after cxTextEdit in uses list...

  Example for TcxTextEdit:
  procedure FormCreate(Sender: TObject);
  begin
    TcxTextEdit.TcxTextEditProperties(cxTextEdit1.ActiveProperties).BannerText := 'Empty...'
  end;

  Then you should NOT(!!!) use:
  s := cxTextEdit.Text
  but:
  !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
  if cxTextEdit.EditValue <> Null then
    s := cxTextEdit.EditValue;
  !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
}


unit Controls.Gui.GhostEdit;

interface

uses
  Windows
, Messages
, SysUtils
, Variants
, Classes
, Graphics
, Controls
, StdCtrls
, cxContainer
, cxEdit
, cxTextEdit
;

type
  // Standard VCL
  TEdit = class(StdCtrls.TEdit)
  private
    FBannerText: String;
    procedure SetBannerText(const Value: String);
  protected
    procedure WMPaint(var Message: TWMPaint); message WM_PAINT;
  public
    property BannerText: String read FBannerText write SetBannerText;
  end;

  // DevExpress
  TcxTextEdit = class(cxTextEdit.TcxTextEdit)
  public
    type
      TcxTextEditProperties = class(cxTextEdit.TcxTextEditProperties)
      private
        FBannerText: string;
        procedure SetBannerText(AValue: string);
      public
        property BannerText: string read FBannerText write SetBannerText;
        class function GetContainerClass: TcxContainerClass; override;
        procedure PrepareDisplayValue(const AEditValue: TcxEditValue;
          var DisplayValue: TcxEditValue; AEditFocused: Boolean); override;
      end;
  public
    procedure AdjustInnerEdit; override;
    class function GetPropertiesClass: TcxCustomEditPropertiesClass; override;
    procedure PrepareEditValue(const ADisplayValue: TcxEditValue;
      out EditValue: TcxEditValue; AEditFocused: Boolean); override;
  end;



implementation

uses
  cxVariants
;

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

function Edit_SetCueBannerText(hEdit: HWND; lpcwText: PWideChar): bool;
begin
  Result := Bool(SendMessage(hEdit,EM_SETCUEBANNER,0,LPARAM(lpcwText)));
end;

procedure TEdit.SetBannerText(const Value: String);
begin
  FBannerText := Value;
  Invalidate;
end;

procedure TEdit.WMPaint(var Message: TWMPaint);
begin
  if not (csDesigning in ComponentState) then
  begin
    if (Text = ''and (trim(FBannerText) <> ''then
    begin
      Edit_SetCueBannerText(Self.Handle,PWideChar(FBannerText));
    end;
  end;
  inherited;
end;

{ TcxTextEdit.TcxTextEditProperties }

class function TcxTextEdit.TcxTextEditProperties.GetContainerClass: TcxContainerClass;
begin
  Result := TcxTextEdit;
end;

procedure TcxTextEdit.TcxTextEditProperties.PrepareDisplayValue(const AEditValue: TcxEditValue;
  var DisplayValue: TcxEditValue; AEditFocused: Boolean);
begin
  if (VarIsSoftNull(AEditValue)) and (BannerText <> ''then
  begin
    if AEditFocused then
      DisplayValue := ''
    else
      if FBannerText <> '' then
      begin
        DisplayValue := FBannerText;
      end
      else
        inherited PrepareDisplayValue(0, DisplayValue, AEditFocused)
   end
   else
     inherited;
end;

procedure TcxTextEdit.TcxTextEditProperties.SetBannerText(AValue: string);
begin
  if FBannerText <> AValue then
  begin
    FBannerText := AValue;
    Changed;
  end;
end;

{ TcxTextEdit }

type
  TControlAccess = class(TControl);

procedure TcxTextEdit.AdjustInnerEdit;
var
  AFont: TFont;
begin
  inherited;
  if TcxTextEditProperties(ActiveProperties).BannerText = '' then Exit;
  with TControlAccess(InnerTextEdit.Control) do
  begin
    InnerEdit.LockBounds(True);
    AFont := TFont.Create;
    try
     if CompareStr(Text, TcxTextEditProperties(ActiveProperties).BannerText) = 0 then
     begin
       AFont.Color := clGray;
       AssignFonts(Font, AFont);
     end;
    finally
      FreeAndNil(AFont);
    end;
    InnerEdit.LockBounds(True);
  end;
end;

class function TcxTextEdit.GetPropertiesClass: TcxCustomEditPropertiesClass;
begin
  Result := TcxTextEditProperties;
end;

procedure TcxTextEdit.PrepareEditValue(const ADisplayValue: TcxEditValue;
  out EditValue: TcxEditValue; AEditFocused: Boolean);
begin
  if CompareStr(ADisplayValue, TcxTextEditProperties(ActiveProperties).BannerText) = 0 then
    EditValue := Null
  else
    inherited;
end;

end.


Gruß
rd3

Für diesen Beitrag haben gedankt: Nersgatt
baumina
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 305
Erhaltene Danke: 61

Win 7
Delphi 10.2 Tokyo Enterprise
BeitragVerfasst: Mi 27.11.13 17:40 
So ganz genau hab ichs mir noch nicht angeschaut, deswegen meine Frage : Verhält sich das anders als TEdit.TextHint?
rd3
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Mi 27.11.13 19:47 
Ähäm, hast recht. Ist das Gleiche. Hab ich noch nie gesehen.
Nersgatt
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 1581
Erhaltene Danke: 279


Delphi 10 Seattle Prof.
BeitragVerfasst: Do 28.11.13 09:28 
Und die DevExpress-Dinger haben dafür alle .Properties.NullString und .Properties.UseNullString :D

Davon abgesehen, trotzdem danke, dass Du Deine Arbeit der Öffentlichkeit zur Verfügung stellen wolltest. :zustimm: (muss auch mal gesagt werden)

_________________
Gruß, Jens
Zuerst ignorieren sie dich, dann lachen sie über dich, dann bekämpfen sie dich und dann gewinnst du. (Mahatma Gandhi)