AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein Leeres Eingabefeld mit Standardwert füllen

Leeres Eingabefeld mit Standardwert füllen

Ein Thema von Jean312 · begonnen am 24. Dez 2015 · letzter Beitrag vom 19. Jan 2016
Antwort Antwort
Seite 2 von 4     12 34   
Benutzerbild von Uwe Raabe
Uwe Raabe

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

AW: Leeres Eingabefeld mit Standardwert füllen

  Alt 24. Dez 2015, 09:06
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.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#12

AW: Leeres Eingabefeld mit Standardwert füllen

  Alt 24. Dez 2015, 09:07
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:
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

Dann geht das wohl auch mit älteren Delphi-Versionen.
Logisch, hat ja auch mit Delphi nichts zu tun, sondern mit der Windows-Version
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
Benutzerbild von Bernhard Geyer
Bernhard Geyer

Registriert seit: 13. Aug 2002
17.169 Beiträge
 
Delphi 10.4 Sydney
 
#13

AW: Leeres Eingabefeld mit Standardwert füllen

  Alt 24. Dez 2015, 09:16
Aber die Funktion ist nicht so, wie vom TE gefordert:
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
Windows Vista - Eine neue Erfahrung in Fehlern.
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.537 Beiträge
 
Delphi 11 Alexandria
 
#14

AW: Leeres Eingabefeld mit Standardwert füllen

  Alt 24. Dez 2015, 09:19
Ich vermute ganz einfach, dass die Property weder dem TE noch den ersten Antwortenden bekannt war.
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Benutzerbild von frankyboy1974
frankyboy1974

Registriert seit: 7. Apr 2015
Ort: SH
169 Beiträge
 
Delphi XE7 Professional
 
#15

AW: Leeres Eingabefeld mit Standardwert füllen

  Alt 24. Dez 2015, 09:20
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
Java ist auch eine Insel.
Ist Delphi von Oracle?
In meiner Buchstabensuppen fehlt das C++!
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#16

AW: Leeres Eingabefeld mit Standardwert füllen

  Alt 24. Dez 2015, 09:25
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.
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
Jean312

Registriert seit: 1. Dez 2013
55 Beiträge
 
#17

AW: Leeres Eingabefeld mit Standardwert füllen

  Alt 24. Dez 2015, 09:34
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.
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.
  Mit Zitat antworten Zitat
Jean312

Registriert seit: 1. Dez 2013
55 Beiträge
 
#18

AW: Leeres Eingabefeld mit Standardwert füllen

  Alt 24. Dez 2015, 09:35
Euch allen ein schönes Fest.
  Mit Zitat antworten Zitat
Benutzerbild von Bernhard Geyer
Bernhard Geyer

Registriert seit: 13. Aug 2002
17.169 Beiträge
 
Delphi 10.4 Sydney
 
#19

AW: Leeres Eingabefeld mit Standardwert füllen

  Alt 24. Dez 2015, 09:36
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.
Windows Vista - Eine neue Erfahrung in Fehlern.
  Mit Zitat antworten Zitat
Jean312

Registriert seit: 1. Dez 2013
55 Beiträge
 
#20

AW: Leeres Eingabefeld mit Standardwert füllen

  Alt 24. Dez 2015, 09:42
@Bernhard Geyer:Stimmt. Danke nochmal an Sir Rufo.
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

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 13:39 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz