Autor Beitrag
jackle32
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 183
Erhaltene Danke: 7

Win7
Delphi XE5 Starter, RAD Studio XE7 Pro
BeitragVerfasst: So 19.01.14 18:14 
Hallo zusammen,

ich versuche gerade, bis jetzt ohne Erfolg, einen String in einen Zeit zu wandeln. Klingt jetzt nicht schwer und StrToTime ist mir bekannt. Problem ist jetzt aber, dass mein String die Form 'nn:ss.zzz' hat, also nur Minuten, Sekunden und Millisekunden.

Wenn ich jetzt zum Beispiel in meinem Edit 01:23.456 stehen hätte sollte das ja in eine TTime Variable rein gehen.
Beim Versuch der Umwandlung mit StrToTime bekomme ich immer eine EConvertError Fehlermeldung. Es gibt ja noch TryStrToTime. Damit bekomme ich keine Fehlermeldung und er wandelt auch nur falsch. Die Minuten im ursprünglichen String werden zu den Stunden in meiner Variablen vom Typ TTime.

Kennt dafür jemand eine Lösung?

Gruß,

Jack

_________________
Es gibt keine dummen Fragen, nur dumme Antworten.
Perlsau
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: So 19.01.14 18:46 
Die Lösung lautet: Füge vor deinen String – von dem du ja weißt, daß er lediglich Minuten, Sekunden und Millisekunden enthält – einfach '00:' ein.
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19322
Erhaltene Danke: 1749

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: So 19.01.14 19:17 
Oder gleich so, dann kann vorne die Stunde stehen, muss aber nicht:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
uses
  System.SysUtils, System.RegularExpressions;

function StrToTimeEx(const AValue: String): TTime;
var
  RegEx: TRegEx;
  Match: TMatch;
begin
  RegEx := TRegEx.Create('(([0-9]{1,2})?:)?([0-9]{1,2}):([0-9]{1,2})[\.,]([0-9]{1,3})');
  Match := RegEx.Match(AValue);
  if Match.Success and (Match.Length = Length(AValue)) then // check for length if the string should only be handled complete
    if Match.Groups[2].Length > 0 then // workaround for problem in TRegEx, Success is true though optional value is missing
      Result := EncodeTime(StrToInt(Match.Groups[2].Value), StrToInt(Match.Groups[3].Value), StrToInt(Match.Groups[4].Value),
        StrToInt(Match.Groups[5].Value))
    else
      Result := EncodeTime(0, StrToInt(Match.Groups[3].Value), StrToInt(Match.Groups[4].Value),
        StrToInt(Match.Groups[5].Value))
  else
    raise EConvertError.Create(Format('"%s" is no valid time!', [AValue]));
end;

// Test:
  ShowMessage(FormatDateTime('hh:nn:ss,zzz', StrToTimeEx('11:22.333')));
Das funktioniert mit oder ohne Stunde und mit einstelligen Werten für Stunde und Minute usw. genauso wie mit zwei bzw. drei Stellen.