Autor Beitrag
Mike19
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 256

Win XP, Vista, Win 7
Delphi 2005, Turbo Delphi
BeitragVerfasst: Di 15.03.11 11:02 
Hallo Gemeinde,

hab mal wieder eine Frage.

Über 2 Maskedit werden Zeiten im Format hh:mm eingelesen. Wie kann ich nun die Diifferenz der beiden Werte berechnen und in einem Label, oder Maskedit wieder ausgeben.

Ich stehe hier auf dem Schlauch.

Danke
Regan
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 2157
Erhaltene Danke: 72


Java (Eclipse), Python (Sublimetext 3)
BeitragVerfasst: Di 15.03.11 11:03 
Dir könnten hier die Funktionen StrToDate oder StrToDateTime helfen. Mit diesen kannst du dann weiterrechnen.

Für diesen Beitrag haben gedankt: Mike19
ALF
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1085
Erhaltene Danke: 53

WinXP, Win7, Win10
Delphi 7 Enterprise, XE
BeitragVerfasst: Di 15.03.11 11:15 
Glaube StrToTime geht auch. Mit der Funktion MinutesBetween erhälts du die differenz der beiden Zeitwerte.

Alf

_________________
Wenn jeder alles kann oder wüsste und keiner hätt' ne Frage mehr, omg, währe dieses Forum leer!
Mike19 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 256

Win XP, Vista, Win 7
Delphi 2005, Turbo Delphi
BeitragVerfasst: Di 15.03.11 11:21 
Danke, es lag am Formatierungsstring der Ausgabe. Manchmal ist eben Luft im Kopf.
Mike19 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 256

Win XP, Vista, Win 7
Delphi 2005, Turbo Delphi
BeitragVerfasst: Fr 18.03.11 11:57 
Nun die nächste Frage dazu.

Wie kann ich bei Berechnungen mit diesen Timewerten Rundungsfehler ausschliesen.


Beispiel

garz:=StrToTime(Maskedit74.Text)-StrToTime(Maskedit1.Text);

ergibt bei 14:30 - 06:00 =08:29, müsste aber doch 08:30 sein ?
Gerd Kayser
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 632
Erhaltene Danke: 121

Win 7 32-bit
Delphi 2006/XE
BeitragVerfasst: Fr 18.03.11 12:15 
user profile iconMike19 hat folgendes geschrieben Zum zitierten Posting springen:
Wie kann ich bei Berechnungen mit diesen Timewerten Rundungsfehler ausschliesen.
Rechne in Minuten um und arbeite dann damit. Stichworte: DecodeTime und EncodeTime
Pepp3r
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 82



BeitragVerfasst: Fr 18.03.11 15:38 
Schreib eine funktion
ausblenden Delphi-Quelltext
1:
function GetZeitDifferenz(zeit1, zeit2: Time): String					

in der du Stunden/Minuten/Sekunden aus der Uhrzeit parst. Dann kannst du die differenz errechenen, zusammensetzen und ausgeben.

---Moderiert von user profile iconNarses: Beiträge zusammengefasst---

So zum Beispiel:

ausblenden volle Höhe 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:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, Mask;

type
  TForm1 = class(TForm)
    MaskEdit1: TMaskEdit;
    MaskEdit2: TMaskEdit;
    Label1: TLabel;
    procedure FormCreate(Sender: TObject);
    function GetZeitDif(zeit1, zeit2: TTime): String;
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
  MaskEdit1.Text := TimeToStr(Time);
  MaskEdit2.Text := TimeToStr(Time);
  Label1.Caption := GetZeitDif(Time,Time)
end;

function TForm1.GetZeitDif(zeit1, zeit2: TTime): String;
var
  a, b, c: String;
  i: Word;
  arr: Array of Integer;
begin
  a := TimeToStr(zeit1);
  b := TimeToStr(zeit2);

  setLength(arr, 3);

  arr[0] := StrToInt(a[1]+a[2])-StrToInt(b[1]+b[2]);
  arr[1] := StrToInt(a[4]+a[5])-StrToInt(b[4]+b[5]);
  arr[2] := StrToInt(a[7]+a[8])-StrToInt(b[7]+b[8]);

  c := IntToStr(arr[0])+':'+IntToStr(arr[1])+':'+IntToStr(arr[2]);

  //Falls du den Absolutbetrag brauchst:
  //c := IntToStr(Abs(arr[0]))+':'+IntToStr(Abs(arr[1]))+':'+IntToStr(Abs(arr[2]));

  result := c;

end;

end.
Gerd Kayser
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 632
Erhaltene Danke: 121

Win 7 32-bit
Delphi 2006/XE
BeitragVerfasst: Fr 18.03.11 18:44 
user profile iconPepp3r hat folgendes geschrieben Zum zitierten Posting springen:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
  arr[0] := StrToInt(a[1]+a[2])-StrToInt(b[1]+b[2]);
  arr[1] := StrToInt(a[4]+a[5])-StrToInt(b[4]+b[5]);
  arr[2] := StrToInt(a[7]+a[8])-StrToInt(b[7]+b[8]);

  c := IntToStr(arr[0])+':'+IntToStr(arr[1])+':'+IntToStr(arr[2]);
Na, dann rechne mal mit folgenden Werten:
ausblenden Delphi-Quelltext
1:
2:
  a := '01:37:02';
  b := '00:58:19';
Pepp3r
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 82



BeitragVerfasst: Fr 18.03.11 20:13 
Moderiert von user profile iconNarses: Komplett-Zitat des letzten Beitrags entfernt.

ich weiß nicht genau worauf du hinaus willst, aber ich glaube du meinst, dass nicht die richtige zeit-differenz errechnet wird. war auch nich von mit beabsichtigt, der author hat nur nach einer differenz gefragt.
aber auch dieses problem wäre ein leichtes zu lösen.
Gerd Kayser
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 632
Erhaltene Danke: 121

Win 7 32-bit
Delphi 2006/XE
BeitragVerfasst: Fr 18.03.11 20:42 
user profile iconPepp3r hat folgendes geschrieben Zum zitierten Posting springen:
der author hat nur nach einer differenz gefragt.
Die Frage, was user profile iconMike19 mit Differenz gemeint hatte, ist doch eindeutig. Siehe seinen Beitrag von heute 10:57 Uhr.
So würde ich es machen:
ausblenden volle Höhe 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:
24:
25:
26:
27:
28:
29:
30:
31:
32:
procedure TMainform.Button2Click(Sender: TObject);
var
  a        : string;
  b        : string;
  Zeit1    : TTime;
  Zeit2    : TTime;
  Std      : Word;
  Min      : Word;
  Sek      : Word;
  MSek     : Word;
  Sekunden : Integer;
begin
  // Beispielwerte setzen.
  // Bedingungen:
  //   1. Zeit1 >= Zeit2
  //   2. Zeit1 und Zeit2 < 24 Stunden
  a := '01:37:02';
  b := '00:58:19';
  Zeit1 := StrToTime(a);
  Zeit2 := StrToTime(b);

  // Berechnung Zeit1 - Zeit2
  DecodeTime(Zeit1, Std, Min, Sek, MSek);
  Sekunden := (Std * 3600) + (Min * 60) + Sek;
  DecodeTime(Zeit2, Std, Min, Sek, MSek);
  Sekunden := Sekunden - ((Std * 3600) + (Min * 60) + Sek);
  Std := Sekunden div 3600;
  Min := (Sekunden - (Std * 3600)) div 60;
  Sek := Sekunden - (Min * 60);
  Zeit1 := EncodeTime(Std, Min, Sek, 0);
  Edit1.Text := TimeToStr(Zeit1);
end;

Man kann das ganze noch optimieren (z. B. TDatetime verwenden, eine Funktion daraus machen usw.). Das überlasse ich aber Euch.

Für diesen Beitrag haben gedankt: Mike19
Mike19 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 256

Win XP, Vista, Win 7
Delphi 2005, Turbo Delphi
BeitragVerfasst: So 20.03.11 10:33 
Danke Gerd, klappt wunderbar.