![]() |
CustomEdit: TextHint immer sichtbar machen?
Mir ist eben in den Sinn gekommen, wie schön doch so ein Edit wäre, wo das TextHint immer sichtbar ist.
Wie kann man das realisieren? In meiner eigenen TEdit-Ableitung habe ich DoSetTextHint überschrieben. Das wurde so in einem anderen Forum empfohlen aber funktioniert nicht.
Delphi-Quellcode:
procedure TdEdit.DoSetTextHint(const Value: string);
begin if CheckWin32Version(5, 1) and StyleServices.Enabled and HandleAllocated then SendTextMessage(Handle, EM_SETCUEBANNER, WPARAM(1), Value); // WPARAM(1) statt WPARAM(0) end; |
AW: CustomEdit: TextHint immer sichtbar machen?
Nur zur Sicherheit, dein SendMessage/SendTextMessage wird auch ausgeführt?
Nicht dass das IF vorher schon nein sagt. ![]() wobei ich das aus Delphi-Sicht noch bissl abändern würde, also statt
Delphi-Quellcode:
ein
WPARAM(1)
Delphi-Quellcode:
, bzw.
Ord(True)
Delphi-Quellcode:
.
Ord(EineBooleanVariable)
Welche Delphi-Version hast du? Bei neueren Delphis ist EM_SETCUEBANNER bereits integriert, allerdings mit False Nicht dass ihr euch gegenseitig überschreibt. |
AW: CustomEdit: TextHint immer sichtbar machen?
Ich hatte eben ein Showmessage im If-Block. Wird angezeigt. Ich nutze wie hoffentlich die meisten 10.3u3.
Delphi-Quellcode:
unit dEdit;
interface uses Winapi.Windows, Winapi.Messages, System.UITypes, System.SysUtils, System.Classes, Vcl.StdCtrls, Vcl.Graphics, Vcl.Controls, Dialogs, Vcl.Forms, Vcl.Menus, Winapi.CommCtrl, Vcl.Themes; type TdEdit = class(TEdit) private FTextHintAlwaysVisible: Boolean; {Private-Deklarationen} protected {Protected-Deklarationen} public {Public-Deklarationen} constructor Create(AOwner: TComponent); override; destructor Destroy; override; procedure DoSetTextHint(const Value: string); override; published {Published-Deklarationen} property TextHintAlwaysVisible: Boolean read FTextHintAlwaysVisible write FTextHintAlwaysVisible default True; end; procedure register; implementation constructor TdEdit.Create(AOwner: TComponent); begin inherited Create(AOwner); FTextHintAlwaysVisible := True; // muss noch ausgewertet werden. Kommt alles später. Erstmal muss alles funktionieren. end; destructor TdEdit.Destroy; begin inherited Destroy; end; procedure TdEdit.DoSetTextHint(const Value: string); begin if CheckWin32Version(5, 1) and StyleServices.Enabled and HandleAllocated then SendTextMessage(Handle, EM_SETCUEBANNER, WPARAM(1), Value); end; procedure register; begin RegisterComponents('dEdit', [TdEdit]); end; end. |
AW: CustomEdit: TextHint immer sichtbar machen?
Also eigentlich ist alles richtig: :gruebel:
Du überschreibst schon die Standardfunktion des TEdit, somit gibt es da keine Konflikte. Und falls das interne HWND neu erstellt wird, ist bereits der Refresh im TCustomEdit.CreateWnd enthalten. Dein Code ist auch aktuell und richtig. (von XE bis 10.3.3 gab es dort keine Änderung) Und Windows meint auch ![]() Du darfst natürlich auch gern noch das Result prüfen (siehe "Return value") und bei False (bzw. 0) ein ![]() ![]() Zitat:
Delphi-Quellcode:
neu auslösen, mit dem erwähnten
DoSetTextHint(TextHint);
Delphi-Quellcode:
.
Ord(FTextHintAlwaysVisible)
|
AW: CustomEdit: TextHint immer sichtbar machen?
Genau, das ist nur eine Zeile und echt nix Wildes. Und es funktioniert trotzdem nicht. Das TextHint verschwindet, sobald das Edit den Focus bekommt und der Cursor drin steht.
|
AW: CustomEdit: TextHint immer sichtbar machen?
Siehe mein Nachtrag in #4: Das mit der Fehlerprüfung mal probieren. (Result auswerten)
Und im MSDN steht auch nichts in den remarks. (falls es unter gewissen Umständen nicht ginge) Windows 10? Ich weiß jetzt nicht seit wann die Option "wParam" schon existiert. Ich hatte mal ein DBEdit in den Pfoten, dort wurde der Text selbst gemalt, inkl. dem FieldName im formDesigner und dem TextHint zur Laufzeit, aber das sollte im TEdit nicht so sein. (hab grad kein WM_PAINT>WMPaint und Paint gesehen). |
AW: CustomEdit: TextHint immer sichtbar machen?
Liste der Anhänge anzeigen (Anzahl: 1)
Es gibt keinen Fehler, der angezeigt wird.
Ich habe hier was gefunden ![]()
Delphi-Quellcode:
unit dEdit;
interface uses Winapi.Windows, Winapi.Messages, System.UITypes, System.SysUtils, System.Classes, Vcl.StdCtrls, Vcl.Graphics, Vcl.Controls, Vcl.Forms, Vcl.Menus; type TdEdit = class(TEdit) private FTextHintAlwaysVisible: Boolean; FCanvas: TCanvas; procedure WMPaint(var Message: TWMPaint); message WM_PAINT; public constructor Create(AOwner: TComponent); override; destructor Destroy; override; protected procedure WndProc(var Message: TMessage); override; procedure Paint; virtual; procedure PaintWindow(DC: HDC); override; property Canvas: TCanvas read FCanvas; published property TextHintAlwaysVisible: Boolean read FTextHintAlwaysVisible write FTextHintAlwaysVisible default False; end; procedure register; implementation constructor TdEdit.Create(AOwner: TComponent); begin inherited Create(AOwner); FCanvas := TControlCanvas.Create; TControlCanvas(FCanvas).Control := Self; end; destructor TdEdit.Destroy; begin FCanvas.Free; inherited Destroy; end; procedure TdEdit.Paint; var R: TRect; I: Integer; NewColor: TColor; // NewBackColor: TColor; procedure DrawEx(S: String); begin if ((I - 1) >= SelStart) and ((I - 1) <= (SelStart + (SelLength - 1))) and (SelLength > 0) and (Focused) then begin Canvas.Font.Color := clWhite; Canvas.Brush.Color := NewColor; end else begin Canvas.Font.Color := NewColor; Canvas.Brush.Color := clWhite; end; Canvas.Brush.Style := bsSolid; DrawText(Canvas.Handle, PChar(S), -1, R, DT_LEFT or DT_NOPREFIX or DT_WORDBREAK or DrawTextBiDiModeFlagsReadingOnly); end; begin if Focused then begin Canvas.Brush.Color := clWhite; Canvas.Brush.Style := bsSolid; Canvas.FillRect(ClientRect); end; if FTextHintAlwaysVisible then begin R := ClientRect; Inc(R.Left, 1); if Text = '' then Inc(R.Left, 1); Inc(R.Top, 1); Canvas.Brush.Assign(Brush); Canvas.Font.Assign(Font); for I := 1 to Length(TextHint) do begin if I = Length(Text) then Inc(R.Left, 1) else if I > Length(Text) then begin NewColor := clGray; DrawEx(TextHint[I]); end; Inc(R.Left, Canvas.TextWidth(TextHint[I])); end; end; R := ClientRect; Inc(R.Left, 1); Inc(R.Top, 1); Canvas.Brush.Assign(Brush); Canvas.Font.Assign(Font); for I := 1 to Length(Text) do begin if PasswordChar = #0 then begin NewColor := clWindowText; DrawEx(Text[I]); Inc(R.Left, Canvas.TextWidth(Text[I])); end else begin NewColor := clWindowText; DrawEx(PasswordChar); Inc(R.Left, Canvas.TextWidth(PasswordChar)); end; end; end; procedure TdEdit.PaintWindow(DC: HDC); begin FCanvas.Lock; try FCanvas.Handle := DC; try TControlCanvas(FCanvas).UpdateTextFlags; Paint; finally FCanvas.Handle := 0; end; finally FCanvas.Unlock; end; end; procedure TdEdit.WMPaint(var Message: TWMPaint); begin ControlState := ControlState + [csCustomPaint]; inherited; ControlState := ControlState - [csCustomPaint]; end; procedure TdEdit.WndProc(var Message: TMessage); begin inherited WndProc(Message); with Message do case Msg of CM_MOUSEENTER, CM_MOUSELEAVE, WM_LBUTTONUP, WM_LBUTTONDOWN, WM_KEYDOWN, WM_KEYUP, WM_SETFOCUS, WM_KILLFOCUS, CM_FONTCHANGED, CM_TEXTCHANGED: begin Invalidate; end; end; end; procedure register; begin RegisterComponents('dEdit', [TdEdit]); end; end. |
AW: CustomEdit: TextHint immer sichtbar machen?
Liste der Anhänge anzeigen (Anzahl: 2)
Ein kleines Problem habe ich noch mit dieser vorgehensweise. Guckt euch bitte Screenshot 1 und 2 an.
Bei 1 ist die Eigenschaft Text leer. Bei 2 teilweise leer. Bei 2 sieht man, dass die graue 4 etwas vom L überlagert wird. Wie bekommt man das weg? |
AW: CustomEdit: TextHint immer sichtbar machen?
Der TextHint sollte doch nur dann sichtbar sein, wenn der Text leer ist - unabhängig davon, ob das Control den Focus hat oder nicht.
|
AW: CustomEdit: TextHint immer sichtbar machen?
Nja fast ... standardmäßig ist der Hint nur sichtbar, wenn leer und ohne Fokus. EM_SETCUEBANNER WPARAM=False <<< das macht Delphi
Aber man kann es auch so einstellen, dass er Hint den Fokus nicht beachtet (also nur wenn leer). EM_SETCUEBANNER WPARAM=True <<< und das möche er haben |
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:39 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz