Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Leeres Eingabefeld mit Standardwert füllen (https://www.delphipraxis.net/187701-leeres-eingabefeld-mit-standardwert-fuellen.html)

Jean312 24. Dez 2015 05:30

Leeres Eingabefeld mit Standardwert füllen
 
Ein Hallo an die DP-Gemeinde,
ich möchte Eingabefelder mit einem Standardwert füllen, wenn diese leer sind (z.B. Straßenname für das Eingabefeld "Straße"). Sobald das erste Zeichen in diesem Eingabefeld geschrieben wurde, soll dieser Standardwert verschwinden und wenn es leer ist wieder erscheinen.

Habe es mit Canvas.Textout versucht, dies löst aber eine Exception aus. Ich habe es im onCreate des Forms und im onChange des Eingabefeldes benutzt.
Hat jemand eine Idee, warum die Exception ausgelöst wird oder wie ich das realisieren kann?

Vielen Dank im Voraus.

Perlsau 24. Dez 2015 06:25

AW: Leeres Eingabefeld mit Standardwert füllen
 
  1. Default-String in einer Variablen im Private-Abschnitt als Konstante festlegen: EditText_Nachname = 'hier Nachname eingeben';
  2. Beim Programmstart Default-String zuweisen: Edit_Nachname.Text := EditText_Nachname;
  3. In der Ereignisbehandlung OnEnter prüfen, ob der Text in Edit_Nachname dem Default-String entspricht.
  4. Wenn ja, dann Edit_Nachname.Clear; ausführen, ansonsten den Text belassen.
  5. In der Ereignisbehandlung OnExit prüfen, ob Edit_Nachname.Text leer ist.
  6. Wenn ja, dann Default-String zuweisen: Edit_Nachname.Text := EditText_Nachname;
So würde zumindest ich das machen. Soll der Default-String erst verschwinden, wenn der Anwender Text eingibt, dann eben in OnKeyPress die Prüfung in Punkt 3 durchführen. OnKeyPress wird ausgelöst, bevor das gedrückte Zeichen ins Editfeld geschrieben wird. Daher kannst du in OnKeyPress prüfen, ob der String im Editfeld dem Defaultstring entspricht und diesen dann löschen, bevor das Zeichen geschrieben wird.

Jean312 24. Dez 2015 06:48

AW: Leeres Eingabefeld mit Standardwert füllen
 
Vielen Dank für die rasche Antwort.
Diese Methode hatte ich so ähnlich schon eingebunden.
Habe aber sehr viele Objekte dieser Art. Ich dachte mir, dass es eben mit dieser Art Textout auf ein ungefülltes Eingabefeld schneller geht.
Dann werde ich es eben wohl doch mit dem guten alten Stringvergleich machen müssen. 😕

frankyboy1974 24. Dez 2015 07:20

AW: Leeres Eingabefeld mit Standardwert füllen
 
hallo,

es gibt doch die Eigenschaft 'texthint' eines Tedit. Ich weiss nicht ab wann es diese Eigenschaft gibt, aber ich benutze diese schon seit Jahren.

mfg

Perlsau 24. Dez 2015 07:25

AW: Leeres Eingabefeld mit Standardwert füllen
 
Zitat:

Zitat von Jean312 (Beitrag 1325177)
Habe aber sehr viele Objekte dieser Art. Ich dachte mir, dass es eben mit dieser Art Textout auf ein ungefülltes Eingabefeld schneller geht.

In diesem Fall würde es sich aus meiner Sicht lohnen, eine eigene Komponente von TEdit abzuleiten und diese Funktionalität dort bereitzustellen. Du brauchst dann ein weiteres Property (published, so daß es im OI bearbeitet werden kann), in das der Default-String eingegeben wird. Die entsprechenden Überprüfungen kannst du dann ebenfalls gleich im Komponenten-Code erledigen.

Jean312 24. Dez 2015 08:56

AW: Leeres Eingabefeld mit Standardwert füllen
 
Habe mir das auch schon überlegt, aber eben noch nie gemacht. Muss mal sehen, ob ich hier Einträge finden kann, wie man soetwas umsetzt. Danke für eure Tipps.

haentschman 24. Dez 2015 09:05

AW: Leeres Eingabefeld mit Standardwert füllen
 
Moin...:P
Zitat:

In diesem Fall würde es sich aus meiner Sicht lohnen, eine eigene Komponente von TEdit abzuleiten
...wenn man nicht unbedingt was dabei lernen will kann man auch was fertiges nehmen. Das TJvEdit von den Jedis hat eine Property EmptyValue... :thumb: Sobald das Edit den Focus verliert und leer ist wird der EmptyValue hineingeschrieben. Beim Betreten wird der EmptyValue geleert um gleich schreiben zu können.

Perlsau 24. Dez 2015 09:13

AW: Leeres Eingabefeld mit Standardwert füllen
 
Noch nie gemacht – eine prima Gelegenheit, damit anzufangen:
Zitat:

Zitat von haentschman (Beitrag 1325183)
Moin...:P

Auch dir :cheers:

Zitat:

Zitat von haentschman (Beitrag 1325183)
Zitat:

In diesem Fall würde es sich aus meiner Sicht lohnen, eine eigene Komponente von TEdit abzuleiten
...wenn man nicht unbedingt was dabei lernen will kann man auch was fertiges nehmen. Das TJvEdit von den Jedis hat eine Property EmptyValue... :thumb: Sobald das Edit den Focus verliert und leer ist wird der EmptyValue hineingeschrieben. Beim Betreten wird das Edit geleert um gleich schreiben zu können.

War aber nicht ganz das, was der TE wollte: "Sobald das erste Zeichen in diesem Eingabefeld geschrieben wurde, soll dieser Standardwert verschwinden ..."

Uwe Raabe 24. Dez 2015 09:55

AW: Leeres Eingabefeld mit Standardwert füllen
 
Zitat:

Zitat von frankyboy1974 (Beitrag 1325178)
es gibt doch die Eigenschaft 'texthint' eines Tedit. Ich weiss nicht ab wann es diese Eigenschaft gibt, aber ich benutze diese schon seit Jahren.

Das ist genau die richtige Lösung. Die Funktionalität gibt es wohl schon seit Windows Vista, aber die erste Delphi-Version, die das Property anbietet, kann ich gerade auch nicht benennen. Bei XE2 ist es zumindest schon dabei.

DeddyH 24. Dez 2015 09:56

AW: Leeres Eingabefeld mit Standardwert füllen
 
Genau, wozu das Rad neu erfinden?

Uwe Raabe 24. Dez 2015 10:06

AW: Leeres Eingabefeld mit Standardwert füllen
 
Zitat:

Zitat von DeddyH (Beitrag 1325186)
Genau, wozu das Rad neu erfinden?

Nun, wenn man das denn unbedingt als Lerneffekt ausnutzen will und nicht gerade Windows XP oder darunter als Zielplattform braucht oder auf Laufzeit-Themes verzichten muss/möchte, dann sollte man doch besser diese TextHint-Funktionalität auf OS-Ebene implementieren. (siehe EM_SETCUEBANNER)

Dann geht das wohl auch mit älteren Delphi-Versionen.

Sir Rufo 24. Dez 2015 10:07

AW: Leeres Eingabefeld mit Standardwert füllen
 
Auf jeden Fall wird dieser TextHint über das OS realisiert:
Delphi-Quellcode:
procedure TCustomEdit.DoSetTextHint(const Value: string);
begin
  if CheckWin32Version(5, 1) and StyleServices.Enabled and HandleAllocated then
    SendTextMessage(Handle, EM_SETCUEBANNER, WPARAM(0), Value);
end;
Aber die Funktion ist nicht so, wie vom TE gefordert:
Zitat:

Zitat von Jean312 (Beitrag 1325173)
Sobald das erste Zeichen in diesem Eingabefeld geschrieben wurde, soll dieser Standardwert verschwinden und wenn es leer ist wieder erscheinen.

Windows versteckt den TextHint sobald das Edit-Feld den Fokus erhält

Zitat:

Zitat von Uwe Raabe (Beitrag 1325188)
Dann geht das wohl auch mit älteren Delphi-Versionen.

Logisch, hat ja auch mit Delphi nichts zu tun, sondern mit der Windows-Version ;)

Bernhard Geyer 24. Dez 2015 10:16

AW: Leeres Eingabefeld mit Standardwert füllen
 
Zitat:

Zitat von Sir Rufo (Beitrag 1325189)
Aber die Funktion ist nicht so, wie vom TE gefordert:
Zitat:

Zitat von Jean312 (Beitrag 1325173)
Sobald das erste Zeichen in diesem Eingabefeld geschrieben wurde, soll dieser Standardwert verschwinden und wenn es leer ist wieder erscheinen.

Windows versteckt den TextHint sobald das Edit-Feld den Fokus erhält

Da sollte sich der TE fragen ob es nicht reicht.
Also fast das gewünschte für 0 Quellcodezeilen oder genau das gewünschte für x Stunden SW-Entwicklung

DeddyH 24. Dez 2015 10:19

AW: Leeres Eingabefeld mit Standardwert füllen
 
Ich vermute ganz einfach, dass die Property weder dem TE noch den ersten Antwortenden bekannt war.

frankyboy1974 24. Dez 2015 10:20

AW: Leeres Eingabefeld mit Standardwert füllen
 
hallo,

also wenn es wirklich erforderlich ist, das der Hint bis zur ersten Zeicheingabe stehen bleibt, würde ich dem Edit-Feld einfach den Standardwert zuweisen und im onEnter ggf. selectall aufrufen.

Kann es gerade nicht testen, müsste aber funktionieren.

mfg

Sir Rufo 24. Dez 2015 10:25

AW: Leeres Eingabefeld mit Standardwert füllen
 
Nun ja, es braucht da keine Stunden an Entwicklungszeit
Delphi-Quellcode:
unit Unit1;

interface

uses
  System.Classes,
  Winapi.Windows, Winapi.Messages,
  Vcl.Controls, Vcl.StdCtrls, Vcl.Graphics;

type
  TEdit = class( Vcl.StdCtrls.TEdit )
  private
    FCanvas   : TCanvas;
    FMyTextHint: string;
    procedure WMPaint( var Message: TWMPaint ); message WM_PAINT;
    procedure SetMyTextHint( const Value: string );
  protected
    procedure WndProc( var Message: TMessage ); override;
    procedure Paint; virtual;
    procedure PaintWindow( DC: HDC ); override;
    property Canvas: TCanvas read FCanvas;
  public
    constructor Create( AOwner: TComponent ); override;
    destructor Destroy; override;

    property MyTextHint: string read FMyTextHint write SetMyTextHint;
  end;

implementation

{ TEdit }

constructor TEdit.Create( AOwner: TComponent );
begin
  inherited Create( AOwner );
  FCanvas                          := TControlCanvas.Create;
  TControlCanvas( FCanvas ).Control := Self;
end;

destructor TEdit.Destroy;
begin
  FCanvas.Free;
  inherited;
end;

procedure TEdit.Paint;
var
  R: TRect;
begin
  R := ClientRect;
  Inc( R.Left, 1 );
  Inc( R.Top, 1 );
  Canvas.Brush.Assign( Self.Brush );
  Canvas.Font.Assign( Self.Font );

  Canvas.Font.Color := clGray;
  DrawText( Canvas.Handle, PChar( FMyTextHint ), -1, R, DT_LEFT or DT_NOPREFIX or DT_WORDBREAK or DrawTextBiDiModeFlagsReadingOnly );
end;

procedure TEdit.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 TEdit.SetMyTextHint( const Value: string );
begin
  if FMyTextHint <> Value
  then
    begin
      FMyTextHint := Value;
      Invalidate;
    end;
end;

procedure TEdit.WMPaint( var Message: TWMPaint );
begin
  if Text = ''
  then
    begin
      ControlState := ControlState + [ csCustomPaint ];
      inherited;
      ControlState := ControlState - [ csCustomPaint ];
    end
  else
    inherited;
end;

procedure TEdit.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; // case
end;

end.

Jean312 24. Dez 2015 10:34

AW: Leeres Eingabefeld mit Standardwert füllen
 
Hallo,

danke euch allen.
Die Sache mit dem "TextHint" kannte ich nicht. Habe es in den Eigenschaften nicht gefunden. Aber wie ich gerade gelesen habe, kommt es vom OS. Ich werde es ausprobieren.
@Sir Rufo: Danke für das Beispiel

@Bernhard Geyer: War von mir anscheinend wohl blöd formuliert. Es reicht wirklich, dass der Hint kommt, wenn das Feld leer ist und sobald es gefüllt wird oder ist, dass er verschwindet.

@Perlsau: Vielen Dank für die Linksammlung. :thumb:
Ich muss mich eh mit dieser Sache mal beschäftigen. Brauche noch andere Sachen, die dann mit einer "eigenen Komponente" umgesetzt werden können. Lernen schadet nicht, kostet nur Zeit.:oops:

Jean312 24. Dez 2015 10:35

AW: Leeres Eingabefeld mit Standardwert füllen
 
Euch allen ein schönes Fest.:thumb:

Bernhard Geyer 24. Dez 2015 10:36

AW: Leeres Eingabefeld mit Standardwert füllen
 
Zitat:

Zitat von Sir Rufo (Beitrag 1325194)
Nun ja, es braucht da keine Stunden an Entwicklungszeit

Er hat glück das er diese x Stunden (x: Float) von dir kostenlos zur Verfügung gestellt wurde. :stupid:

Jean312 24. Dez 2015 10:42

AW: Leeres Eingabefeld mit Standardwert füllen
 
@Bernhard Geyer:Stimmt. Danke nochmal an Sir Rufo. :)

Sir Rufo 24. Dez 2015 10:42

AW: Leeres Eingabefeld mit Standardwert füllen
 
Zitat:

Zitat von Bernhard Geyer (Beitrag 1325197)
Zitat:

Zitat von Sir Rufo (Beitrag 1325194)
Nun ja, es braucht da keine Stunden an Entwicklungszeit

Er hat glück das er diese x Stunden (x: Float) von dir kostenlos zur Verfügung gestellt wurde. :stupid:

Um ehrlich zu sein, war x = 0,167 :stupid:

(Man muss nur wissen, wonach man suchen muss http://stackoverflow.com/questions/9...t-control-text)

haentschman 24. Dez 2015 10:42

AW: Leeres Eingabefeld mit Standardwert füllen
 
8-)
Zitat:

Ich vermute ganz einfach, dass die Property weder dem TE noch den ersten Antwortenden bekannt war.
...allerdings. Solange man die Handbremse am Auto nicht braucht, weiß man auch nicht wo sie ist... :stupid:
[OT]
Die Property allerdings ...Hint zu nennen ist irgendwie dämlich. :roll: Da soll man beim drüberstolpern drauf kommen.
[/OT]

Zitat:

Man muss nur wissen, wonach man suchen muss
Mein Lehrmeister hatte mal gesagt: Man muß nicht alles wissen, man muß wissen wo es steht. :P Ein weiser Mann...

Sir Rufo 24. Dez 2015 10:44

AW: Leeres Eingabefeld mit Standardwert füllen
 
Zitat:

Zitat von haentschman (Beitrag 1325201)
8-)
Zitat:

Ich vermute ganz einfach, dass die Property weder dem TE noch den ersten Antwortenden bekannt war.
...allerdings. Solange man die Handbremse am Auto nicht braucht, weiß man auch nicht wo sie ist... :stupid:
[OT]
Die Property allerdings ...Hint zu nennen ist irgendwie dämlich. :roll: Da soll man beim drüberstolpern drauf kommen.
[/OT]

Die Namensgebung kommt wohl daher, dass es eine Eigenschaft
Delphi-Quellcode:
Text
gibt. Und durch die alphabetische Sortierung kommt
Delphi-Quellcode:
TextHint
direkt darunter ... so dass man es nicht übersehen kann, wenn man an der
Delphi-Quellcode:
Text
Eigenschaft herumfummelt :stupid:

haentschman 24. Dez 2015 10:47

AW: Leeres Eingabefeld mit Standardwert füllen
 
Ja sicher...:P Nur ein Hint schwebt für mich über dem Edit in quietsch gelb und nicht als leerer Text drin. Ich würde die Property nicht näher anschauen weil ich davon ausginge das das meinem Zweck nicht entspricht.

PS: Wenn ich jede Property nachlesen würde käme ich nicht mehr zum arbeiten... :P

Perlsau 24. Dez 2015 10:54

AW: Leeres Eingabefeld mit Standardwert füllen
 
Zitat:

Zitat von DeddyH (Beitrag 1325192)
Ich vermute ganz einfach, dass die Property weder dem TE noch den ersten Antwortenden bekannt war.

Deine Vermutung trifft zumindest bei mir voll ins Schwarze ... eine derartige Funktionalität habe ich noch nie benötigt. Bei mir stehen gewöhnlich Labels über den Editfeldern, Buttons werden gelegentlich via Hint erklärt. Texthint bzw. die Anforderung des TE scheint mir eher wie eine Spielerei oder Schmuck: nicht wirklich notwendig, macht sich aber optisch ganz nett ...

Was vergessen: Delphi 7 kennt Texthint definitiv noch nicht; eben nachgeprüft.

Uwe Raabe 24. Dez 2015 11:01

AW: Leeres Eingabefeld mit Standardwert füllen
 
Zitat:

Zitat von Sir Rufo (Beitrag 1325189)
Windows versteckt den TextHint sobald das Edit-Feld den Fokus erhält

Nicht, wenn man WPARAM = 1 übergibt:

Delphi-Quellcode:
SendTextMessage(Handle, EM_SETCUEBANNER, WPARAM(1), Value);

geskill 24. Dez 2015 11:06

AW: Leeres Eingabefeld mit Standardwert füllen
 
Wenn man keinen Platz für die Labels hat, kann man dies gut gebrauchen, oder eben als Hilfestellung für die Eingabe (Label = Name; Edit.TextHint = Your family name ...). Ist ab D2009 dabei.

Der TextHint wird in gräulicher Schrift abgehoben dargestellt, bei der OnEnter/OnExit Lösung wäre dies die gleiche Farbe.

Sir Rufo 24. Dez 2015 11:13

AW: Leeres Eingabefeld mit Standardwert füllen
 
Zitat:

Zitat von Uwe Raabe (Beitrag 1325205)
Zitat:

Zitat von Sir Rufo (Beitrag 1325189)
Windows versteckt den TextHint sobald das Edit-Feld den Fokus erhält

Nicht, wenn man WPARAM = 1 übergibt:

Delphi-Quellcode:
SendTextMessage(Handle, EM_SETCUEBANNER, WPARAM(1), Value);

Jupp, ist aber natürlich nicht - von Haus aus - einstellbar.
Also auch hier muss man
Delphi-Quellcode:
TEdit
etwas überarbeiten, sieht dann aber wesentlich übersichtlicher aus (
Delphi-Quellcode:
TCustomEdit.DoSetTextHint
überschreiben - ist gottlob
Delphi-Quellcode:
protected
und
Delphi-Quellcode:
virtual
).

scrat1979 26. Dez 2015 20:16

AW: Leeres Eingabefeld mit Standardwert füllen
 
@SirRufo:

Warum überschreibst du in deinem Beispiel eigentlich die Paint-Methode? Ich hatte mir mal eine solche Komponente gebastelt und einfach die Properties Text und Color je nach Status (Text vorhanden oder nicht...) gesetzt. Sah zwar nicht so verdammt professionell aus wie bei dir aber hat auch funktioniert :)

Mich interessiert es deshalb weil ich ja auch was dabei lernen möchte. Wo liegen bei deinem Beispiel die Vorteile?

Frohe Weihnachten zusammen und Grüße an die gesamte DP!!! Macht weiter so.

Jean312 28. Dez 2015 14:36

AW: Leeres Eingabefeld mit Standardwert füllen
 
Kurze Rückmeldung:
Besten Dank an Sir Rufo. Funktioniert fantastisch. Habe noch zwei weitere Sachen mit eingebunden. Jetzt passts perfekt.

Super Sache! :thumb:

Mavarik 28. Dez 2015 16:02

AW: Leeres Eingabefeld mit Standardwert füllen
 
[OT]
oder ich nehme einfach das "richtige" FMX.TEdit das hat die Property TextPrompt schon dabei... :stupid:
[/OT]

Sir Rufo 28. Dez 2015 16:10

AW: Leeres Eingabefeld mit Standardwert füllen
 
Zitat:

Zitat von Mavarik (Beitrag 1325430)
[OT]
oder ich nehme einfach das "richtige" FMX.TEdit das hat die Property TextPrompt schon dabei... :stupid:
[/OT]

Ist aber ein wenig aufwändig so ein FMX Control in eine VCL Anwendung zu bringen :stupid:

Zitat:

Zitat von scrat1979 (Beitrag 1325324)
@SirRufo:

Warum überschreibst du in deinem Beispiel eigentlich die Paint-Methode? Ich hatte mir mal eine solche Komponente gebastelt und einfach die Properties Text und Color je nach Status (Text vorhanden oder nicht...) gesetzt. Sah zwar nicht so verdammt professionell aus wie bei dir aber hat auch funktioniert :)

Ich überschreibe die Methode gar nicht, sondern ich baue dort eine Paint-Methode ein. Ein
Delphi-Quellcode:
TEdit
hat gar keine Paint-Methode.

Darum braucht man ja auch extra diesen
Delphi-Quellcode:
TControlCanvas
auf dem man dann malen kann und ab dann kann man eben malen was und wann man möchte ...

Man bekommt also mehr Freiheitsgrade

Mavarik 28. Dez 2015 16:20

AW: Leeres Eingabefeld mit Standardwert füllen
 
Zitat:

Zitat von Sir Rufo (Beitrag 1325434)
Zitat:

Zitat von Mavarik (Beitrag 1325430)
[OT]
oder ich nehme einfach das "richtige" FMX.TEdit das hat die Property TextPrompt schon dabei... :stupid:
[/OT]

Ist aber ein wenig aufwändig so ein FMX Control in eine VCL Anwendung zu bringen :stupid:

Der TE hat nix von VCL geschrieben... Das haben nur alle erstmal angenommen... :glaskugel:

Deswegen habe ich es ja auch als OT geflaged...

Jean312 19. Jan 2016 05:55

AW: Leeres Eingabefeld mit Standardwert füllen
 
Hallo nochmal,

muss doch noch einmal was in diesem Thread anfragen.

Das Setzen eines Defaultwertes, wenn das Eingabefeld leer ist, funktioniert wunderbar. Nun wollte ich das auch auf eine abgeleitete Combobox anwenden.

Das funktioniert fast. Die Komponente wird während der Laufzeit erzeugt, aber der gesetzte Defaultwert wird nicht angezeigt. Wenn ich dann aber mit der Maus über die Komponente gehe, dann wird der Defaultwert angezeigt.
Woran kann das liegen?


Code:
unit uComboBoxExt;

{$mode objfpc}{$H+}

interface

uses
  Classes, Windows, Messages, Controls, StdCtrls,Graphics;

type
  { TComboBoxExt }

  TComboBoxExt = Class(TComboBox)
  private
    FCTextHint:string;
    FRequired:boolean;
    procedure WMPaint(var Message: TWMPaint); message WM_Paint;
    procedure SetCTextHint(const Value:string);
  protected
    procedure WndProc(var Message:TMessage); override;
  public
    constructor Create(AOwner:TComponent);override;
    destructor Destroy; override;
    property CTextHint:string read FCTextHint write SetCTextHint;
    property Required:boolean read FRequired write FRequired Default False;
    procedure PaintRedFrame;
  end;

implementation

{ TComboBoxExt } 

...

procedure TComboBoxExt.WndProc(var Message: TMessage);
var
  R:TREct;
begin
  inherited WndProc(Message);
  if (Message.Msg = WM_PAINT) and (Text='') then begin
    Canvas.Font := Font;
    Canvas.Font.Color := clGray;
    R:= ClientRect;
    R.Left:=R.Left+5;
    R.Top:=R.Top+2;
    Canvas.TextRect(R,R.Left,R.Top,FCTextHint);
    Canvas.TextOut(R.Left,R.Top,FCTextHint);
  end;

  if (FRequired=True) and (Text='') then PaintRedFrame;

  with message do
    case Msg of
      WM_LButtonUp, WM_LButtonDown,
      WM_KeyDown, WM_KeyUp, WM_SetFocus, WM_KillFocus,
      CM_TextChanged:
        begin
          invalidate;
        end;
    end;
end;

...
Der rote Rahmen wird aber sofort gezeichnet, wenn das Feld leer ist. Aber halt die Textausgabe funktioniert nicht so richtig. Sie reagiert erst nur nach einem MouseMove, wobei der Defaultwert erst angezeigt wird, wenn die Maus die Komponente wieder verlassen hat. Wenn die Maus auf der Komponente ist, wird der Defaultwert auch nicht angezeigt.
Das soll aber nicht sein. Die Anzeige des Defaultwertes darf erst verschwinden, wenn Text<>'' ist.
Was mache ich falsch?


Alle Zeitangaben in WEZ +1. Es ist jetzt 03:12 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