Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Hilfe bei TMaskEdit (https://www.delphipraxis.net/155323-hilfe-bei-tmaskedit.html)

Blamaster 18. Okt 2010 23:49

Delphi-Version: 7

Hilfe bei TMaskEdit
 
Hi,

ich benötige etwas Hilfe beim TMaskEdit.

Der User soll die Möglichkeit haben einen Zeitwert in folgendem Format einzugeben:

00:00,000 (S:M:MS)

Meine Maske sieht momentan so aus: 00:00,000;1;0

Ich erhoffte mir daraus Usereingaben verhinder zu können da beim löschen von Zeichen automatisch wieder eine 0 gesetzt wird und so beim späteren umrechnen von String zu Integer keine Fehler auftreten.

Problem ist nur das wenn ich nun einfach lösche zwar überall zu jeder Zeit nullen stehen beim verlassen des Edit feldes allerdings der Fehler "" is not a valid integer value auftritt.

Jemand eine Idee was ich falsch machen ?

Mfg Blamaster

Satty67 19. Okt 2010 06:36

AW: Hilfe bei TMaskEdit
 
Die letzte 0 in Deiner Edit-Maske gibt das dargestellte Zeichen für Leerstellen an. Das wird beim Auslesen des Wertes gegen ein Leerzeichen getauscht. In Deinem Fall kann die Null somit garnicht im übergebenen Wert auftauchen, da jede eingegebene NULL in ein Leerzeichen verwandelt wird.

Nimm eine Maske wie 00:00,000;1;o (kleines o oder halt ein Leerzeichen) und ersetze die Leerstellen vorm Umwandeln mit 0. Also
Delphi-Quellcode:
value := StringReplace(MaskEdit1.Text, ' ', '0', [rfReplaceAll]);
.
Zusätzlich kannst Du einen Leerstring verhindern:
Delphi-Quellcode:
if value = '' then value := '00:00,000';
.
...oder anders ausgedrückt, wenn ich mich bei MaskEdit nicht irre, kann es Dir die Werte nicht 100% in dem von Dir gewünschen Format liefern. Aber vieleicht kennt da jemand einen Weg, Leerzeichen nicht nur als Null anzuzeigen, sondern auch im Wert zu setzen.

Dann noch was allgemeines, falls mit MS Millisekunden gemeint waren. 1000 Millisekunden sind eine Sekunde. Mit Deiner Maske kann ich somit keine Sekunden-Werte darstellen. Also schon bei einer Sekunde muss ich mich zw. 999 Millisekunden oder 1 Minute entscheiden.

Blamaster 19. Okt 2010 12:46

AW: Hilfe bei TMaskEdit
 
Hi,

danke für den Tipp. Dachte das geht mit dem MaskEdit direkt.

War gestern abend etwas müde. Das Fprmat ist nicht S:M:MS sondern M:S:MS.

Mfg Blamaster

Satty67 19. Okt 2010 13:46

AW: Hilfe bei TMaskEdit
 
Was mir nur gerade auffällt, die NULL als Darstellungszeichen für Leerzeichen kannst Du ja lassen. Darf ja ruhig so aussehen, wie es nach StringReplace wird... das mit dem "o" war nur so eine Idee.

Blamaster 19. Okt 2010 15:06

AW: Hilfe bei TMaskEdit
 
Hi,

Problem ist doch noch nicht ganz gelöst.

Für das Problem mit den Leerzeichen habe ich noch eine andere Lösung gefunden. Mit .EditText lässt sich der sichtbare Edittext inklusive der Nullen als Platzhalter auslesen.

Nun gibt es aber noch ein anderes Problem. Wenn ich alle Edit Felder lösche und der Focus nicht mehr auf dem Edit liegt kommt eine Exception "Invalid Input Value" nur wieso ?

Mfg Blamaster

Blamaster 20. Okt 2010 11:30

AW: Hilfe bei TMaskEdit
 
Hmm,

das einfachste ist wohl im OnChange des Edit alle Leerzeichen durch Nullen zu ersetzen.

Delphi-Quellcode:
procedure TForm1.medtChange(Sender: TObject);
var
  i: integer;
  value: string;
begin
  value := medt1.Text;
  for i := 0 to length(value) do
    if value[i] = ' ' then value[i] := '0';
  medt1.Text := value;

  ShowMessage(medt1.Text);
end;
Das ganze funktioniert so leider nicht es werden keine leerzeichen durch 0´en ersetzt. Mit StringReplace tritt das gleiche Problem auf.

Jemand eine Idee was falsch ist ?

Blamaster 20. Okt 2010 12:16

AW: Hilfe bei TMaskEdit
 
Hab die Lösung gerade gefunden. Das Problem ist das wenn als Maske "0" gesetzt ist das Editfeld die Eingabe einer 0 immer als leerzeichen auffasst. Somit hat die obige Funktion nur leerzeichen durch leerzeichen ersetzt.

Abhilfe konnte ich schaffen indem ich das Maskenzeichen auf "_" gesetzt habe und im OnChange dann alle Leerzeichen sofort durch "0" ersetzen lasse. Somit bekommt keiner die "_" zu sehen.

Mfg Yannic


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