![]() |
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. |
AW: Leeres Eingabefeld mit Standardwert füllen
![]() |
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. 😕 |
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 |
AW: Leeres Eingabefeld mit Standardwert füllen
Zitat:
|
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.
|
AW: Leeres Eingabefeld mit Standardwert füllen
Moin...:P
Zitat:
|
AW: Leeres Eingabefeld mit Standardwert füllen
Noch nie gemacht – eine prima Gelegenheit, damit anzufangen:
Zitat:
Zitat:
|
AW: Leeres Eingabefeld mit Standardwert füllen
Zitat:
|
AW: Leeres Eingabefeld mit Standardwert füllen
Genau, wozu das Rad neu erfinden?
|
AW: Leeres Eingabefeld mit Standardwert füllen
Zitat:
![]() Dann geht das wohl auch mit älteren Delphi-Versionen. |
AW: Leeres Eingabefeld mit Standardwert füllen
Auf jeden Fall wird dieser TextHint über das OS realisiert:
Delphi-Quellcode:
Aber die Funktion ist nicht so, wie vom TE gefordert:
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; Zitat:
Zitat:
|
AW: Leeres Eingabefeld mit Standardwert füllen
Zitat:
Also fast das gewünschte für 0 Quellcodezeilen oder genau das gewünschte für x Stunden SW-Entwicklung |
AW: Leeres Eingabefeld mit Standardwert füllen
Ich vermute ganz einfach, dass die Property weder dem TE noch den ersten Antwortenden bekannt war.
|
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 |
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. |
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: |
AW: Leeres Eingabefeld mit Standardwert füllen
Euch allen ein schönes Fest.:thumb:
|
AW: Leeres Eingabefeld mit Standardwert füllen
Zitat:
|
AW: Leeres Eingabefeld mit Standardwert füllen
@Bernhard Geyer:Stimmt. Danke nochmal an Sir Rufo. :)
|
AW: Leeres Eingabefeld mit Standardwert füllen
Zitat:
(Man muss nur wissen, wonach man suchen muss ![]() |
AW: Leeres Eingabefeld mit Standardwert füllen
8-)
Zitat:
[OT] Die Property allerdings ...Hint zu nennen ist irgendwie dämlich. :roll: Da soll man beim drüberstolpern drauf kommen. [/OT] Zitat:
|
AW: Leeres Eingabefeld mit Standardwert füllen
Zitat:
Delphi-Quellcode:
gibt. Und durch die alphabetische Sortierung kommt
Text
Delphi-Quellcode:
direkt darunter ... so dass man es nicht übersehen kann, wenn man an der
TextHint
Delphi-Quellcode:
Eigenschaft herumfummelt :stupid:
Text
|
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 |
AW: Leeres Eingabefeld mit Standardwert füllen
Zitat:
Was vergessen: Delphi 7 kennt Texthint definitiv noch nicht; eben nachgeprüft. |
AW: Leeres Eingabefeld mit Standardwert füllen
Zitat:
Delphi-Quellcode:
SendTextMessage(Handle, EM_SETCUEBANNER, WPARAM(1), Value);
|
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. |
AW: Leeres Eingabefeld mit Standardwert füllen
Zitat:
Also auch hier muss man
Delphi-Quellcode:
etwas überarbeiten, sieht dann aber wesentlich übersichtlicher aus (
TEdit
Delphi-Quellcode:
überschreiben - ist gottlob
TCustomEdit.DoSetTextHint
Delphi-Quellcode:
und
protected
Delphi-Quellcode:
).
virtual
|
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. |
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: |
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] |
AW: Leeres Eingabefeld mit Standardwert füllen
Zitat:
Zitat:
Delphi-Quellcode:
hat gar keine Paint-Methode.
TEdit
Darum braucht man ja auch extra diesen
Delphi-Quellcode:
auf dem man dann malen kann und ab dann kann man eben malen was und wann man möchte ...
TControlCanvas
Man bekommt also mehr Freiheitsgrade |
AW: Leeres Eingabefeld mit Standardwert füllen
Zitat:
Deswegen habe ich es ja auch als OT geflaged... |
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:
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.
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; ... 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