Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Maske für FormatMaskText (https://www.delphipraxis.net/183930-maske-fuer-formatmasktext.html)

ringli 14. Feb 2015 10:50

Delphi-Version: XE4

Maske für FormatMaskText
 
Hallo,

ich möchte Strings in der Form "2015-02-12_14-39-52" in "2015-02-12 - 14:39:52" umformatieren. Dazu würde ich gerne die FormatMaskText-Funktion nutzen. Leider scheitere ich grade am zusammenstellen der Maske. Was ich bisher habe (Testcode):
Delphi-Quellcode:
s1 := '2015-02-12_14-39-52';
s2 := FormatMaskText('CCCC-CC-CC - CC:CC:CC;C;C', s1);
ShowMessage(s2);
Mein Ergebnis sieht dann so aus: "2015-02-12 - : : "
Irgendwas läuft da also noch schief und ich habe grade keine Ahnung was genau. Hat jemand zufällig Erfahrungen beim Erstellen der Masken und kann mir hier grade auf die Sprünge helfen?

Bernhard Geyer 14. Feb 2015 11:13

AW: Maske für FormatMaskText
 
Muss es denn FormatMaskText sein?
Ich würde ein paar Zeilen Schreiben um den properitären String in ein TDateTime zu überführen und dann mit FormatDateTime das dan wieder ausgeben.

ringli 14. Feb 2015 11:17

AW: Maske für FormatMaskText
 
Dachte eigentlich das das der einfachste Weg wäre, aber scheinbar sieht es nicht danach aus. Wie würdest du denn den gegebenen String in ein TDateTimeFormat kriegen?

Bjoerk 14. Feb 2015 11:52

AW: Maske für FormatMaskText
 
FormatMaskText ist ja mega kompliziert? Man kann sich ja zum Beispiel eine eigene function erstellen (uses DateUtils):
Delphi-Quellcode:
function ExtractDate(const Value: string; const Default: TDateTime): TDateTime;
var
  AYear, AMonth, ADay, AHour, AMinute, ASecond: word;
begin
  AYear := StrToIntDef(Copy(Value, 1, 4), 0);
  AMonth := StrToIntDef(Copy(Value, 6, 2), 0);
  ADay := StrToIntDef(Copy(Value, 9, 2), 0);
  AHour := StrToIntDef(Copy(Value, 12, 2), 0);
  AMinute := StrToIntDef(Copy(Value, 15, 2), 0);
  ASecond := StrToIntDef(Copy(Value, 18, 2), 0);
  if IsValidDateTime(AYear, AMonth, ADay, AHour, AMinute, ASecond, 0) then
    Result := EncodeDateTime(AYear, AMonth, ADay, AHour, AMinute, ASecond, 0)
  else
    Result := Default;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  ShowMessage(DateTimeToStr(ExtractDate('2015-02-12_14-39-52', 0)));
end;

ringli 14. Feb 2015 12:10

AW: Maske für FormatMaskText
 
Danke für eure Antworten. :)

Da ich den String nur zur besseren Lesbarkeit umformatiere, habe ich mich jetzt für diese Lösung entschieden:
Delphi-Quellcode:

s := '2015-02-12_14-39-52';
sDate := Copy(s, 1, Pos('_', s) - 1);
sTime := Copy(s, Pos('_', s) + 1, Length(s));
sTime := StringReplace(sTime, '-', ':', [rfReplaceAll, rfIgnoreCase]);

ShowMessage(sDate + ' - ' + sTime);
Bin aber trotzdem noch an einer Lösung via FormatMaskText interessiert falls jemand noch eine Idee hat.

Sir Rufo 14. Feb 2015 12:51

AW: Maske für FormatMaskText
 
Findest du es nicht etwas seltsam, dass das Speichern eines Wertes abhängig von der Bearbeitung im UI ist?

Du hast einen Zeitwert, dann verarbeite/speicher den auch als solchen in einem
Delphi-Quellcode:
TDateTime
.

Für die Bearbeitung erstellt man sich dann einen Konverter, der die Daten für die Bearbeitung so aufbereitet, dass diese nun in der gewünschten Art und Weise bearbeitet werden können und eben auch wieder zurück in das eigentliche Datenformat.

Das Speichern eines solchen Wertes erfolgt dann auf die gleiche Art und Weise (mit einem Konverter).

Auf einmal wird das Handling der unterschiedlichsten Datentypen logisch, eindeutig und einfach.

Uwe Raabe 14. Feb 2015 13:08

AW: Maske für FormatMaskText
 
Zitat:

Zitat von ringli (Beitrag 1289860)
Bin aber trotzdem noch an einer Lösung via FormatMaskText interessiert falls jemand noch eine Idee hat.

Dafür ist FormatMaskText nicht geeignet. In deinem Fall sollen vorhandene Formatierungszeichen ('_', '-') durch andere ersetzt werden ('-', ':'). Das ist aber nicht die Aufgabe von FormatMaskText.

Hier mal ein Beispiel für die richtige Verwendung:

Delphi-Quellcode:
  s1 := '2015-02-12_14-39-52';
  { alle Formatierungszeichen löschen }
  s1 := StringReplace(s1, '-', '', [rfReplaceAll]);
  s1 := StringReplace(s1, '_', '', [rfReplaceAll]);
  {  s1 ist jetzt '20150212143952' }
  s2 := FormatMaskText('0000-00-00 - 00:00:00;0; ', s1);
ergibt
Delphi-Quellcode:
'2015-02-12 - 14:39:52'

ringli 14. Feb 2015 13:54

AW: Maske für FormatMaskText
 
Zitat:

Zitat von Sir Rufo (Beitrag 1289869)
Findest du es nicht etwas seltsam, dass das Speichern eines Wertes abhängig von der Bearbeitung im UI ist?

Also es geht hier um vorhandene Ordnernamen die ich für den Benutzer im UI nur etwas besser lesbar anzeigen möchte. Daher liegt hier kein TDateTime-Wert vor den ich weiterverarbeiten müsste.

Zitat:

Zitat von Uwe Raabe (Beitrag 1289879)
Dafür ist FormatMaskText nicht geeignet.

Danke für den Hinweis Uwe. War mir nicht klar, das FormatMaskText dafür nicht geeignet ist.

Sir Rufo 14. Feb 2015 14:03

AW: Maske für FormatMaskText
 
Zitat:

Zitat von ringli (Beitrag 1289888)
Zitat:

Zitat von Sir Rufo (Beitrag 1289869)
Findest du es nicht etwas seltsam, dass das Speichern eines Wertes abhängig von der Bearbeitung im UI ist?

Also es geht hier um vorhandene Ordnernamen die ich für den Benutzer im UI nur etwas besser lesbar anzeigen möchte. Daher liegt hier kein TDateTime-Wert vor den ich weiterverarbeiten müsste.

Und wenn dort ein Ordner liegt der so
Code:
aaaa-aa-aa_aa-aa-aa
heisst, dann macht es bumm?

Ist es nicht eher so, dass du einen Ordner erwartest, der in seinem Namen einen Zeitpunkt verschlüsselt hat und somit eben doch ein
Delphi-Quellcode:
TDateTime
repräsentiert?

Das meinte ich mit dem Konverter beim Speichern ...

ringli 14. Feb 2015 14:09

AW: Maske für FormatMaskText
 
Nein, wenn ein Ordner nicht ins Schema passt wird im UI "Zeitpunkt unbekannt" angezeigt. Auch damit kann ich weiterarbeiten, da intern der reale Ordnername verwendet wird.

[EDIT]
Aber in einem hast du Recht: Natürlich verwende ich den Ordnernamen um einen Zeitstempel zu speichern und später wieder auszulesen. So kann der Benutzer im Zweifelsfall den Ordner leichter im Dateisystem wiederfinden als bei einem kryptischen Namen wie "1234567890" der absolut nichtssagend ist.


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