AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

CustomEdit: TextHint immer sichtbar machen?

Ein Thema von Strict · begonnen am 19. Mai 2020 · letzter Beitrag vom 20. Mai 2020
Antwort Antwort
Strict

Registriert seit: 24. Mär 2020
47 Beiträge
 
#1

AW: CustomEdit: TextHint immer sichtbar machen?

  Alt 19. Mai 2020, 17:31
Es gibt keinen Fehler, der angezeigt wird.

Ich habe hier was gefunden https://stackoverflow.com/questions/...t-control-text und es ein wenig angepasst. Schön ist anders aber ers funktioniert.

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.
Angehängte Grafiken
Dateityp: png 2020-05-19 18_53_43.png (388 Bytes, 19x aufgerufen)

Geändert von Strict (20. Mai 2020 um 15:29 Uhr)
  Mit Zitat antworten Zitat
Strict

Registriert seit: 24. Mär 2020
47 Beiträge
 
#2

AW: CustomEdit: TextHint immer sichtbar machen?

  Alt 20. Mai 2020, 14:02
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?
Angehängte Grafiken
Dateityp: jpg 1.jpg (2,3 KB, 12x aufgerufen)
Dateityp: jpg 2.jpg (2,6 KB, 12x aufgerufen)
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe
Online

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.663 Beiträge
 
Delphi 12 Athens
 
#3

AW: CustomEdit: TextHint immer sichtbar machen?

  Alt 20. Mai 2020, 14:39
Der TextHint sollte doch nur dann sichtbar sein, wenn der Text leer ist - unabhängig davon, ob das Control den Focus hat oder nicht.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.386 Beiträge
 
Delphi 12 Athens
 
#4

AW: CustomEdit: TextHint immer sichtbar machen?

  Alt 20. Mai 2020, 14:42
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
Ein Therapeut entspricht 1024 Gigapeut.
  Mit Zitat antworten Zitat
Strict

Registriert seit: 24. Mär 2020
47 Beiträge
 
#5

AW: CustomEdit: TextHint immer sichtbar machen?

  Alt 20. Mai 2020, 15:23
Zitat:
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
Nicht ganz. Der Hint soll immer sichtbar sein. Bei Eingabe von 123 soll ein Hint 123456 angezeigt werden.

Eine aktualiserte Version habe ich oben stehen.
Das hier scheint das zu machen was ich suche
Delphi-Quellcode:
     // Hint erst ab dem i'ten Zeichen zeichnen. I ist die Länge der Nutzereingabe
     // Beim i'ten Zeichen, das Rect.Left um 1 Pixel nach Links ausweiten. Damit gibt es keine abgeschnittenen Zeichen mehr
     if I = Length(Text) then
      Inc(R.Left, 1) //
     else if I > Length(Text) then
      begin
       NewColor := clGray;
       DrawEx(TextHint[I]);
      end;
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.386 Beiträge
 
Delphi 12 Athens
 
#6

AW: CustomEdit: TextHint immer sichtbar machen?

  Alt 20. Mai 2020, 15:24
Du willst also eigentlich nicht den TextHint, sondern die AutoComplete-Funktion des Edits haben.

Das ist dann aber bissl was anderes.



Das AutoComplete für Pfade, so wie im Explorer, oben im Edit, das ging mit einer Codezeile zu aktivieren.
Und MRU-Edits (mit eigenen Wortlisten) gibt es als Fremdkomponenten oder siehe https://docs.microsoft.com/en-us/pre...884(v%3Dvs.85)
Ein Therapeut entspricht 1024 Gigapeut.

Geändert von himitsu (20. Mai 2020 um 15:30 Uhr)
  Mit Zitat antworten Zitat
Strict

Registriert seit: 24. Mär 2020
47 Beiträge
 
#7

AW: CustomEdit: TextHint immer sichtbar machen?

  Alt 20. Mai 2020, 15:30
An Autocomplete habe ich auch schon gedacht aber ich finde diese Funktion zu aggressiv.
Deswegen meine Umsetzuzng/Idee mit dem Hint als Hinweis.
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe
Online

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.663 Beiträge
 
Delphi 12 Athens
 
#8

AW: CustomEdit: TextHint immer sichtbar machen?

  Alt 20. Mai 2020, 16:04
Der Hint soll immer sichtbar sein. Bei Eingabe von 123 soll ein Hint 123456 angezeigt werden.
Das ist aber ganz weit weg vom Standard.

Hast du mal versucht, erst den modifizierten Hint in Grau und danach den Text in normal zu zeichnen?
Delphi-Quellcode:
tempHint := StuffString(TextHint, 1, Length(Text), Text); // ersetzt die ersten Zeichen in TextHint durch Text
<Zeichne tempHint in grau>
<Zeichne Text in schwarz darüber>
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Strict

Registriert seit: 24. Mär 2020
47 Beiträge
 
#9

AW: CustomEdit: TextHint immer sichtbar machen?

  Alt 20. Mai 2020, 16:47
Ich zeichne aktuell erst den Hint, dann den Text. Aber etwas anders.
Hint Beispiel 123456
Text Beispiel 123

Ich zeichne erst den Hint (_ = Leerzeichen, R.Left wird hochgezählt)
___456

Danach zeichne ich Text
123

und habe pixelgenau
123456
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 16:04 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-2025 by Thomas Breitkreuz