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 VCL MaskEdit mit Datum (https://www.delphipraxis.net/212696-vcl-maskedit-mit-datum.html)

ConnorMcLeod 16. Mär 2023 16:36

VCL MaskEdit mit Datum
 
Hallo Schwarm mit Wissen!
Die SuFu hat mir leider nicht weitergeholfen, somit die Frage: wie kommt es, daß das Datum so verunstaltet wird?
Delphi-Quellcode:
function MaskEditTest: string;
var
  LedtTest: TMaskEdit;
begin
  Result := EmptyStr;
  LedtTest := TMaskEdit.Create(nil);
  try
    LedtTest.Text := DateToStr(Date);      // '16.03.2023'
    LedtTest.EditMask := '!99/99/9999;1;_';
    Result := LedtTest.Text;               // '160.....2023'
  finally
    FreeAndNil(LedtTest);
  end;
end;
Haben wir hier tatsächlich einen Bug in MaskDoFormatText? Ich habe einen Verdacht, möchte aber (noch) nicht die Antworten beeinflussen.

ghubi01 16. Mär 2023 21:17

AW: VCL MaskEdit mit Datum
 
Versuch mal:
Delphi-Quellcode:
    LedtTest.EditMask := '!09909909999;1;';

ConnorMcLeod 16. Mär 2023 22:00

AW: VCL MaskEdit mit Datum
 
Danke, besser, aber nicht perfekt.
[+]: es ist lesbar und ein (halbwegs) gültiges Datum
[-]: das Ergebnis ist: ' 16.03.2023' - also mit führendem Blank.

himitsu 16. Mär 2023 22:00

AW: VCL MaskEdit mit Datum
 
Zitat:

Zitat von ConnorMcLeod (Beitrag 1519969)
[-]: das Ergebnis ist: ' 16.03.2023' - also mit führendem Blank.

die erste 0 ist etwas zuviel :zwinker:
vermutlich wollte es eher so werden !0900909999;1;


PS:
Delphi-Quellcode:
    LedtTest.EditMask := '!99/99/9999;1;_';
    LedtTest.Text := DateToStr(Date); // '16.03.2023'
    Result := LedtTest.Text; // '16.03.2023'
:angle:

ConnorMcLeod 16. Mär 2023 22:07

AW: VCL MaskEdit mit Datum
 
@himitsu: ja, so paßt es, aber ist das nicht widersinnig? Der Schrägstrich sollte lt. Doku als Platzhalter für das Datumstrennzeichen stehen.
d.h. kaum macht man's richtig, erzeugt das einen Fehler. Hm.

himitsu 16. Mär 2023 22:29

AW: VCL MaskEdit mit Datum
 
Nja, richtig macht man es mit einem TDateEdit. :zwinker:

Delphi-Quellcode:
    LedtTest.Text := DateToStr(Date); // '16.03.2023' Text und EditText sind hier identisch, da noch keine Maske
    LedtTest.EditMask := '!99/99/9999;1;_';
    Result := LedtTest.Text; // '160.....2023'
    Result := LedtTest.EditText; // '16.0.3..2023'
Erst Text und dann Maske macht ein TCustomMaskEdit.ReformatText
und dort kommt der irgendwo durcheinander, weil sich Zeichen verschieben. (Steuerzeichen reinschieben)
Also erst enodieren, merken, umformatieren und wieder neu dekodieren.

Erst Mask und dann Text macht nur noch
AddEditFormat/MaskDoFormatText oder PadInputLiterals und anschließend Validate,
also bloß dekodieren+validieren




Und ich verstehe nie, warum jemand EmptyStr benutzt?
Ich finde das unnötig groß und schwerer zu lesen.
Außerdem ist dieses räudige Mistding eine typisierte Konstante (somit eigentlich eine schreibgeschützte Variable) und keine "echte" Konstante,
also
Delphi-Quellcode:
_UStrLAsg(var Dest: UnicodeString; const Source: UnicodeString)
anstatt
Delphi-Quellcode:
_UStrClr(var S);
.

Und wenn durch irgendwass diese "Variable" verändert wird, dann hat man einen geilen Spaß.
z.B. DevExpressGrids nutzen es und dann steht plötzlich in allen "leeren" NULL-DB-Columns "etwas" drin. :stupid:

Noch mehr Spaß hat man nur noch mit anderen Strings. (ShortString, AnsiString, UTF8String uvm.)
Delphi-Quellcode:
_LStrFromUStr(var Dest: _AnsiStr; const Source: UnicodeString; CodePage: Word);

Delphi-Quellcode:
_UStrToString(Dest: _PShortStr; const Source: UnicodeString; MaxLen: Integer);

oder noch Schlimmeres

ConnorMcLeod 17. Mär 2023 08:02

AW: VCL MaskEdit mit Datum
 
Zitat:

Zitat von himitsu (Beitrag 1519973)
Nja, richtig macht man es mit einem TDateEdit. :zwinker:

Leider waren die TMS anderer Meinung. Es geht um TPlannerMaskDatePicker.

Zitat:

Zitat von himitsu (Beitrag 1519973)
Und ich verstehe nie, warum jemand EmptyStr benutzt?

Das ist OT und esoterisch und würde ich auch nicht trefflich diskutieren wollen ;)


Alle Zeitangaben in WEZ +1. Es ist jetzt 23:15 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-2025 by Thomas Breitkreuz