Einzelnen Beitrag anzeigen

Furtbichler
(Gast)

n/a Beiträge
 
#6

AW: Vorstellung des Codes zur übersichtlichen Anzeige von Zeiten

  Alt 26. Mär 2012, 07:00
Der Code von thomasschaf ist zwar allgemeingültig und erweiterbar, aber viel zu komplex, um die einfache Aufgabe (Darstellung von Millisekunden als Tage, Stunden, Minuten etc.) zu lösen. Die Bezeichner sind kryptisch und dienen dazu, den Sinn der Funktion zu verschleiern: Ich verstehe ihn einfach nicht (auf Anhieb).

Himitsu's Code ist schön kompakt und leicht verständlich.

Zum Code von thomasschaf:
Wenn ich Strings mit einem Trenner konkateniere, mache ich es so:
Delphi-Quellcode:
Const
  myDelimiter = ', ';

...
MyConcat := '';
For i:=0 to items.Count - 1 do
  MyConcat := MyConcat+items[i] + myDelimiter;

If MyConcat<>'then
  setLength(MyConcat, Length (MyConcat) - Length(myDelimiter));
Die lezte Zeile entspricht deinem 'HintenEntfernen' und ist deutlich kürzer. Ich empfinde bei Code, der erst blind etwas anhängt, um es dann wieder abzuschnippeln, leichtes Unbehagen. Eine Alternative wäre
Delphi-Quellcode:
MyConcat := '';
For i:=0 to items.Count - 1 do
  if MyConcat = 'then
    MyConcate := items[i]
  else
    MyConcat := myDelimiter + MyConcat+items[i];
Zur eigentlichen Funktion:
Die Darstellung der Zeit gefälltt mir nicht (@himitsu: Fühle dich nicht angesprochen).

Ich verwende solche formatierten Anzeigen gerne als Countdown, und da sieht es ziemlich blöd aus, wenn die Anzeige in der Länge differiert, nur weil eine Komponente (h,m,s) zufällig mal 0 ist: Ich würde die Komponenten nicht optional angeben, sondern in abhängigkeit von der Größenordnung immer: Liegt der Wert im Bereich von z.B. Minuten, will ich Minuten, Sekunden und Millisekunden anzeigen, also z.B. "1 min, 0 sec, 0 ms".

Da ich von Millisekunden ausgehe, will ich auch auf Millisekunden genau anzeigen. Das läßt sich allerdings leicht ändern.

Ich würde die Funktion dann so schreiben (ich rechne nicht in TDatetime um, obwohl das bestimmt sinniger wäre):

Delphi-Quellcode:
Function MilliSecondsToString (aMilliSecs : Cardinal) : String;

  Function AddingTimePortionLeavesZero (aFormat : String; aDivisor : Cardinal) : boolean;
  begin
    Result := Result+Format(aFormat, [aMilliSecs mod 1000]);
    aMilliSecs := aMilliSecs div Divisor;
    Result := (aMilliSecs=0);
  End;

Begin
  if aMilliSecs<1000 then begin
    Result := IntToStr(aMilliSecs);
    exit;
  end;
  Result := '';
  If AddingTimePortionLeavesZero('%.3d' , 1000) then exit;
  If AddingTimePortionLeavesZero('%.2d,', 60) then exit;
  If AddingTimePortionLeavesZero('%.2d:', 60) then exit;
  If AddingTimePortionLeavesZero('%.2d' , 24) then exit;
  if AddingTimePortionLeavesZero('%d d,', 1) then exit;
End;
Bei Zeiten im Millisekundenbereich werden nur die Millisekunden angegeben, bei Zeiten im Sekundenbereich immer Sekunden,Millisekunden usw. Nur bei den Millisekunden sind es derzeit noch konstant drei Stellen

Geändert von Furtbichler (26. Mär 2012 um 07:17 Uhr)
  Mit Zitat antworten Zitat