Delphi-PRAXiS
Seite 2 von 4     12 34      

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)

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. :)


Alle Zeitangaben in WEZ +1. Es ist jetzt 03:19 Uhr.
Seite 2 von 4     12 34      

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