Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi Problem mit TMaskEdit Feld und Datum (https://www.delphipraxis.net/64792-problem-mit-tmaskedit-feld-und-datum.html)

stonimahoni 8. Mär 2006 10:38


Problem mit TMaskEdit Feld und Datum
 
Hi Leute...


ich hoffe ich bin hier in der richtigen Abteilung mit meinem Problem ?!

Folgendes :
Ich habe mehrere TMaskEdit Felder, die ich mit einem Datumsformat belegt habe also

Editmask := !90/90/00;1;_


Sooo...nun das Doofe an der Geschichte :
Wenn man da ein Datum eingibt, ins nächste Feld wechselt und dann merkt, dass das Datum falsch ist und man das Feld wohlmöglich wieder leer haben möchte, kommt der Hinweis :
"Ungültiger Eingabewert. Mit Esc ....(Rückgängigmachen oder so )".

Kann ich diesen Hinweis abfangen? Wenn ja wo ? Und wie kann ich dann statt des Rückgängigmachens (was ein Deutsch) das feld irgendwie wieder leeren ? Weil wenn ich normal ESC drücke dann schreibt der mir wieder das alte Datum rein.

Versteht Ihr mein Problem ?


Vielen Dank für Eure Hilfe.


MFG

Carsten

marabu 8. Mär 2006 11:12

Re: Problem mit TMaskEdit Feld und Datum
 
Hallo Carsten,

du kannst dein MaskEdit-Feld so leeren:

Delphi-Quellcode:
MaskEdit.Text := StringOfChar(' ', 6);
Grüße vom marabu

stonimahoni 8. Mär 2006 15:05

Re: Problem mit TMaskEdit Feld und Datum
 
Hi Marabu...


das ganze bringt mich nur nicht wirklich weiter denke ich :/
Oder anders : wann und wie setzte ich Deinen Code sinnvoll ein ? Weil ich habe halt das Datum drinstehen, und der User geht dann hin und benutzt Backspace und dann will er in ein anderes Feld und dann kommt die Meldung.


Wie kann ich das ganze denn sinnvoll lösen ? Vielleicht sogar ohne vorher diese Exception auszulösen wenn ich das Feld nach dem leeren verlassen möchte ?!


Gibts da ne möglichkeit?


Grüsse

Carsten

marabu 8. Mär 2006 15:50

Re: Problem mit TMaskEdit Feld und Datum
 
Mein Code-Beispiel kannst du verwenden, wann und wo du willst - das ist letztlich eine Frage der Benutzerschnittstelle.

Ich mag MaskEdit-Felder nicht. Die Idee dahinter stammt aus grauer Vorzeit (Terminal-Ära). Deine Benutzer können noch viel mehr Dinge tun, um dein Programm aus dem Tritt zu bringen. Probiere mal die Entf Taste aus.

Warum nimmst du nicht einen DateTimePicker? Oder ein normales Edit?

marabu

pauletta82 28. Jul 2008 09:50

Re: Problem mit TMaskEdit Feld und Datum
 
Hallo,

ich habe das gleiche Problem wie oben beschrieben, also wenn ich auf 'Entfernen' oder 'Backspace' drücke erscheint diese Fehlermeldung. Ich habe bereits verschiedene Sachen ausprobiert und auch mit

medFeld1.Text := StringOfChar(' ', 6);

funktioniert das nicht!

Bitte um Hilfe, danke!

Mfg
pauletta82

p80286 28. Jul 2008 10:33

Re: Problem mit TMaskEdit Feld und Datum
 
Hallo zusammen,

Also ich habe überhaupt kein Problem mit der Verwendung von MaskEdit, So sieht meine Definition aus:
Delphi-Quellcode:
object E_pdt_t_startdat: TMaskEdit
          Left = 16
          Top = 87
          Width = 77
          Height = 24
          EditMask = '!90/90/9900;1;_'
          MaxLength = 10
          TabOrder = 1
          Text = ' . .   '
          OnExit = E_pdt_t_startdatExit
        end
Wenn die angesprochene Meldung kommt, vermute ich mal, daß ein OnChange aktiv wird, und das zieht die validate-Methode hoch (meine ich mich zu erinnern).

@Marabu
Wenn Du mit der Terminal-Ära nicht das 3290-Protokoll meinst, dann Liegst Du leider falsch.Kennzeichnend für den Terminalbetrieb war die zeilenweise Übergabe von Daten (Z.B. unter CP/M und viele frühe DOS-Programme). Die "echte" Feldprüfung war mit dem IBM-Protokoll möglich, da immer der ganze Bildschirminhalt, bzw. die modifizierten Felder ausgetauscht wurden. Das gleiche sollte eigentlich auch für DOS gelten, da der Bildschirm bzw. der für den Bildaufbau notwendige Speicher Teil des Systems war. Aber damals gab es noch viel CP/M-KnowHow und das war auf zeilenweises Arbeiten ausgerichtet. Falls Du noch ein altes TP2.1-Hanbuch ausgraben kannst Readln/Writeln funktionierte auf allen Systemen, aber Gotoxy nur unter DOS oder speziellen Terminalprotokollen. Also Feldprüfung/MaskEdit erst ab DOS (und damals war das eine echte Erleichterung)

Grüße
K-H

pauletta82 28. Jul 2008 11:14

Re: Problem mit TMaskEdit Feld und Datum
 
Hallo,
was bedeutet denn das 'object' in deinem quellcode? muss ich so jedes maskedit-feld vordefinieren?
meine eigenschaften sehen fast genauso aus, hab das wie gesagt nur nicht mit dem object extra im code deklariert, sondern im objektinspektor, mit editmask = !99/99/00;1;_ und dementsprechend maxlength = 8, aber damit kann die fehlermeldung ja eigentlich nichts zu tun haben,

welches change-ereignis kann denn dabei ausgelöst werden? vermute auch sowas, dass da irgendwie im hintergrund irgendwas ausgelöst wird, weiß aber beim besten willen nicht was das ist!

vielleicht noch ein hinweis, weiß nicht ob das evtl. weiterhelfen könnte: nach drücken der entfernen-taste wird zunächst nur das erste leerzeichen markiert, und erst beim verlassen des maskedits erscheint die besagte fehlermeldung, wenn ich die fehlermeldung dann wegklicke, ist das 5.leerzeichen markiert, also direkt nach dem zweiten Punkt (so sieht das textfeld aus wenn es leer ist: ' . . ')



Zitat:

Zitat von p80286
Hallo zusammen,

Also ich habe überhaupt kein Problem mit der Verwendung von MaskEdit, So sieht meine Definition aus:
Delphi-Quellcode:
object E_pdt_t_startdat: TMaskEdit
          Left = 16
          Top = 87
          Width = 77
          Height = 24
          EditMask = '!90/90/9900;1;_'
          MaxLength = 10
          TabOrder = 1
          Text = ' . .   '
          OnExit = E_pdt_t_startdatExit
        end
Wenn die angesprochene Meldung kommt, vermute ich mal, daß ein OnChange aktiv wird, und das zieht die validate-Methode hoch (meine ich mich zu erinnern).

@Marabu
Wenn Du mit der Terminal-Ära nicht das 3290-Protokoll meinst, dann Liegst Du leider falsch.Kennzeichnend für den Terminalbetrieb war die zeilenweise Übergabe von Daten (Z.B. unter CP/M und viele frühe DOS-Programme). Die "echte" Feldprüfung war mit dem IBM-Protokoll möglich, da immer der ganze Bildschirminhalt, bzw. die modifizierten Felder ausgetauscht wurden. Das gleiche sollte eigentlich auch für DOS gelten, da der Bildschirm bzw. der für den Bildaufbau notwendige Speicher Teil des Systems war. Aber damals gab es noch viel CP/M-KnowHow und das war auf zeilenweises Arbeiten ausgerichtet. Falls Du noch ein altes TP2.1-Hanbuch ausgraben kannst Readln/Writeln funktionierte auf allen Systemen, aber Gotoxy nur unter DOS oder speziellen Terminalprotokollen. Also Feldprüfung/MaskEdit erst ab DOS (und damals war das eine echte Erleichterung)

Grüße
K-H


marabu 28. Jul 2008 11:41

Re: Problem mit TMaskEdit Feld und Datum
 
Hallo,

@pauletta: Erstelle bitte eine Beispiel-Form, die dein Problem verdeutlicht und stelle diese (PAS und DFM) als Archiv zur Verfügung.

@K-H: Ich glaube nicht, dass ich mit meiner kurzen Bemerkung überhaupt falsch liegen kann. Eine Erörterung hier wäre aber grob off-topic.

Freundliche Grüße

pauletta82 28. Jul 2008 12:56

Re: Problem mit TMaskEdit Feld und Datum
 
Liste der Anhänge anzeigen (Anzahl: 1)
ok, hier die PAS und DFM...

Zitat:

Zitat von marabu
Hallo,

@pauletta: Erstelle bitte eine Beispiel-Form, die dein Problem verdeutlicht und stelle diese (PAS und DFM) als Archiv zur Verfügung.

@K-H: Ich glaube nicht, dass ich mit meiner kurzen Bemerkung überhaupt falsch liegen kann. Eine Erörterung hier wäre aber grob off-topic.

Freundliche Grüße


p80286 28. Jul 2008 13:08

Re: Problem mit TMaskEdit Feld und Datum
 
Hallo pauletta,

was ich rübergerecht habe war ein Ausschnit aus der .DFM.
Leider habe ich mich vergallopiert, ich hatte bisher noch keine blonde Verkäuferin zur Hand, mein Beispiel funktioniert auch NICHT wie es soll.

Leider habe ich die Aufruf-Details noch nicht ganz raus, aber so ganz wie in TP7 beschrieben funktioniert MaskEdit nicht:
Zitat:

ValidateEdit validiert EditText nach jedem Tastendruck bzw. nach jedem Versuch, das maskierte Eingabefeld zu verlassen. Stimmt EditText nicht mit der Maske überein, ruft ValidateEdit die Methode ValidateError auf, um eine Exception auszulösen, und setzt den Cursor an die erste Position, die sich nicht mit der Maske deckt.
Falls Deine Datumseingabe sich auf einen rel. engen Zeiraum beschränkt, dann nimm den DateTimePicker ansonsten nimm ein normales TEdit und bastel Dir die Formatprüfung selber (wie von Marabu vorgeschlagen).

@Marabu, nichts für ungut, da hatte ich etwas viel Schwung (3290 ist Blödsinn 3270 ist richtiger) ich kenne tolle Umsetzungen von Maskedit, aber das Original von Borland ist es augenscheinlich nicht.


Grüße
K-H

pauletta82 28. Jul 2008 13:24

Re: Problem mit TMaskEdit Feld und Datum
 
hallo,

leider ist der date-time-picker aber nicht von meinen anwendern gewünscht, da dort u.a. immer zwangsläufig ein datum eingestellt sein muss, es muss aber auch die möglichkeit bestehen, dass dieses datumsfeld leer ist bzw. wieder geleert werden kann,
zudem sollte das datum nur anhand von 6 zahlen eingegeben werden (ttmmjj), die "lästige" eingabe des punktes sollte entfallen,
von daher wäre das mask-edit schon optimal, da kann man dann auch das datum wieder löschen und durch die unterstriche anstelle des leer-zeichens ist optisch auch gut erkennbar...
nur zu dumm dass das löschen nicht funktioniert...

ach ja übrigens: da das problem ja auch auf einer ansonsten leeren form auftritt, muss es sich ja um ein grundsätzliches problem handeln, es kann ja dann nicht aufgrund von irgendwelchen eigen geschriebenen funktionen auftreten...




Zitat:

Zitat von p80286
Hallo pauletta,

was ich rübergerecht habe war ein Ausschnit aus der .DFM.
Leider habe ich mich vergallopiert, ich hatte bisher noch keine blonde Verkäuferin zur Hand, mein Beispiel funktioniert auch NICHT wie es soll.

Leider habe ich die Aufruf-Details noch nicht ganz raus, aber so ganz wie in TP7 beschrieben funktioniert MaskEdit nicht:
Zitat:

ValidateEdit validiert EditText nach jedem Tastendruck bzw. nach jedem Versuch, das maskierte Eingabefeld zu verlassen. Stimmt EditText nicht mit der Maske überein, ruft ValidateEdit die Methode ValidateError auf, um eine Exception auszulösen, und setzt den Cursor an die erste Position, die sich nicht mit der Maske deckt.
Falls Deine Datumseingabe sich auf einen rel. engen Zeiraum beschränkt, dann nimm den DateTimePicker ansonsten nimm ein normales TEdit und bastel Dir die Formatprüfung selber (wie von Marabu vorgeschlagen).

@Marabu, nichts für ungut, da hatte ich etwas viel Schwung (3290 ist Blödsinn 3270 ist richtiger) ich kenne tolle Umsetzungen von Maskedit, aber das Original von Borland ist es augenscheinlich nicht.


Grüße
K-H


marabu 28. Jul 2008 15:09

Re: Problem mit TMaskEdit Feld und Datum
 
Hallo Pauletta,

dein Problem löse ich mit einer Ereignisbehandlung für OnKeyDown():

Delphi-Quellcode:
procedure TForm2.DateMaskKeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
  with Sender as TMaskEdit do
    if Key = VK_DELETE then
    begin
      Text := StringOfChar(' ', Length(Text));
      Key := 0;
    end;
end;
Eventuell möchtest du das noch etwas ausfeilen.

Freundliche Grüße

pauletta82 5. Sep 2008 12:38

Re: Problem mit TMaskEdit Feld und Datum
 
hallo marabu,
vielen dank für deine hilfe, das war ein guter tipp, funktioniert auch soweit ganz gut, mit einer ausnahme: wenn ich kein vollständiges datum eingebe (z.b. "15.__.__) und dann die tab-taste drücke bekomme ich wieder denselben fehler, die ereignisse key-up, key-down und key-press scheinen allesamt nicht auf den key=vk_tab zu reagieren. weiß vielleicht jemand woran das liegt bzw. warum das so ist? und welche lösung gibts dafür?

gruß
pauletta82


Zitat:

Zitat von marabu
Hallo Pauletta,

dein Problem löse ich mit einer Ereignisbehandlung für OnKeyDown():

Delphi-Quellcode:
procedure TForm2.DateMaskKeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
  with Sender as TMaskEdit do
    if Key = VK_DELETE then
    begin
      Text := StringOfChar(' ', Length(Text));
      Key := 0;
    end;
end;
Eventuell möchtest du das noch etwas ausfeilen.

Freundliche Grüße



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