Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Probleme bei der Darstellung der Zeit (https://www.delphipraxis.net/94359-probleme-bei-der-darstellung-der-zeit.html)

MrReg 20. Jun 2007 13:44


Probleme bei der Darstellung der Zeit
 
Hallo Leute,

ich habe folgendes Problem: Ich versuche gerade ein Programm zu schreiben mit dem ich z.B. die Arbeitszeiten pro Woche, etc. errechnen kann. Die Woche besteht aus 6 Tagen (MO-SA). Zu jedem Tag gibt es 2 Editfelder. In das erste kommt die Anfangszeit rein, in das zweite die Zeit, wann man fertig war. Daraus errechne ich die Differenz, was dann der Arbeitszeit an einem tag entspricht.
Dies wird für alle 6 Tage gemacht. Am ende werden die Arbeitszeiten zusammengerechnet und in einem Label ausgegeben. Soweit klappt das ja auch schon ganz gut. Wenn ich aber z.B. 6-mal 6 Stunden habe, dann steht in dem label "12:00:00", weil Delphi nach 24 Std. wieder bei 0 anfängt.
Dies möchte ich aber gerne ändern. In Excel ist es möglich die Gesamtzeit in Stunden genau so anzeigen "36:00:00" zu lassen. Was muss ich jetzt tun, damit in meinem Label auch die Zeit folgendermaßen angezeigt wird: "36:00:00"???
Ich habe jetzt wirklich keine Ahnung mehr wie ich das hinkriege und hoffe, dass Ihr eine Idee habt.

Gruß
:???:

SirThornberry 20. Jun 2007 13:48

Re: Probleme bei der Darstellung der Zeit
 
du hast die addierten Zeiten doch sicher in einer Variable. Entweder sind sie in der Variablen schon falsch oder du gibst sie einfach falsch aus. Ohne Quelltext wissen wir nicht was von beiden der Fall ist.

MrReg 20. Jun 2007 13:53

Re: Probleme bei der Darstellung der Zeit
 
Danke für die schnelle Antwort.

Also klar habe ich die in eine Variable geschrieben. Die Werte sind auch alle korrekt. Werde gleich mal den Quelltext hochladen, aber sowiet habe ich keinen Fehler gefunden außer, dass Delphi nich tdie vollen 36 Std. anzeigt.

SirThornberry 20. Jun 2007 13:58

Re: Probleme bei der Darstellung der Zeit
 
naja, rechnest du im Moment mit TDateTimeWerten? TDateTime ist eben für Datumswerte und Zeitwerte ausgelegt. Die Zeit wird hinter dem Komma gespeichert und die Tage sind der Teil vor dem Komma.

MrReg 20. Jun 2007 14:00

Re: Probleme bei der Darstellung der Zeit
 
So, hier ist der Quelltext:

Delphi-Quellcode:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ExtCtrls, mTSubtrahieren, mTAddieren, mTMultiplizieren,
  mTDividieren;

type
  TForm1 = class(TForm)
    Label1: TLabel;
    Label2: TLabel;
    Label3: TLabel;
    Label5: TLabel;
    Namensfeld: TEdit;
         .....       //Es wären sonst zu viele :-)
    procedure Button1Click(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;
implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var
  a,b,c,d,e,f : TTime;
begin
  a:=StrToTime(Edit3.Text+Label32.Caption+Edit4.Text)-StrToTime(Edit1.Text+Label31.Caption+Edit2.Text);
  b:=StrToTime(Edit7.Text+Label42.Caption+Edit8.Text)-StrToTime(Edit5.Text+Label41.Caption+Edit6.Text);
  c:=StrToTime(Edit11.Text+Label52.Caption+Edit12.Text)-StrToTime(Edit9.Text+Label51.Caption+Edit10.Text);
  d:=StrToTime(Edit15.Text+Label62.Caption+Edit16.Text)-StrToTime(Edit13.Text+Label61.Caption+Edit14.Text);
  e:=StrToTime(Edit19.Text+Label72.Caption+Edit20.Text)-StrToTime(Edit17.Text+Label71.Caption+Edit18.Text);
  f:=StrToTime(Edit23.Text+Label82.Caption+Edit24.Text)-StrToTime(Edit21.Text+Label81.Caption+Edit22.Text);
  Label21.Caption:=TimeToStr(a+b+c+d+e+f);
end;

end.
Dabei muss ich noch erwähnen, dass jew. das erste Editfeld die Std, das Label den ":" und das zweite Editfeld die Minuten in jeder Klammer darstellen.

[edit=SirThornberry]erneut Code-Tags durch Delphi-Tags ersetzt - künftig bitte Delphi-tags anstelle von Code-Tags verwenden wenn es um Delphiquelltext geht. Mfg, SirThornberry[/edit]

SirThornberry 20. Jun 2007 14:09

Re: Probleme bei der Darstellung der Zeit
 
genau das ist dein Fehler.
du verwendest ein TTime was das gleiche ist wie ein TDate und auch das gleiche wie ein TDateTime (was wiederum ein Double ist).

Der Typ ist also dazu gedacht Datum + Uhrzeit zu speichern. Dabei ist die Uhrzeit der Teil hinter dem Komma und die Tage der Teil vor dem Komma. 12 Stunden des Tages sind also 0,5.

wenn du jetzt 3 mal 12 Stunden hast wären das 3 mal 0,5 was 1,5 ergibt.

TimeToStr wandelt dir aber eben nur den Nachkommateil in eine Uhrzeit um. es wird also nur die ",5" beachtet was wieder 12 Uhr wäre. Du musst also zusätzlich den Teil vor dem Komma berücksichtigen.
Und du musst dir klar machen das es hier um Uhrzeiten + Datum geht und nicht um Stundenwerte.

wenn vor dem komma eine 0 steht ist das 30.12.1899
Wenn du nun 48 Stunden dazu addierst ist es immer noch 0 uhr aber eben 2 Tage später. Also der 01.01.1900

hoika 20. Jun 2007 14:14

Re: Probleme bei der Darstellung der Zeit
 
Hallo,

1. lass die Finger von TDateTime
ist ein Float ud damit gibt es Rundungsprobleme beim Addieren

2. wenn du es trotzdem nehmen willst (owe)

DateOf(TDateTime) -> Anzahl der Tage
Frac(TDateTime) -> Stunden (als TDateTime)

Anzahl der Tage mit 24 multipliziert ergibt die Stunden > 24 h

Ich hatte mit damals mal direkt ne Funktion geschrieben,
die obige beide Funktionen verknüpft.

TimeToStrEx ...


Heiko

MrReg 20. Jun 2007 14:21

Re: Probleme bei der Darstellung der Zeit
 
Hallo hoika,

Wie würdest du die Werte denn dann errechnen und zusammenfassen. Könntest du mal einen Quelltext mit deiner Funktion posten, dann kann ich das auch besser nachvollziehen.

Gibt es auch noch andere vielleicht auch noch einfacher Methoden um dies zu erledigen?

marabu 20. Jun 2007 14:26

Re: Probleme bei der Darstellung der Zeit
 
Hallo,

es ist nichts verwerfliches am Datentyp TDateTime, man muss nur mit ihm umgehen können. Auch ist der ganzzahlige Anteil von TDateTime nicht ein Datum, sondern wird von bestimmten Routinen so interpretiert. TDateTime kann Zeitpunkte, aber auch Zeitspannen bezeichnen.

Delphi-Quellcode:
uses
  SysUtils, // TimeSeparator
  DateUtils; // HourOf, MinuteOf, SecondOf

function HoursToStr(timespan: TDateTime): string;
var
  hours, mins, secs: Word;
begin
  hours := HourOf(timespan) + 24 * Trunc(timespan);
  mins := MinuteOf(timespan);
  secs := SecondOf(timespan);
  Result := Format('%d%s%.2d%s%.2d', [hours, TimeSeparator, mins, TimeSeparator, secs]);
end;
Freundliche Grüße

Maja Jessica 20. Jun 2007 14:32

Re: Probleme bei der Darstellung der Zeit
 
Hi,

kann mich dem nur anschliessen, bei TimeToStr etc gibt es ein paar Stolperfallen.

Zur Veranschaulichung kann man mal probieren:
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var t,t1:ttime;
    std : double;
begin
  t := StrToTime('12:00');
  t1 := StrToTime('18:15');
  std := t1 - t;
  label1.caption := FloatToStr(std * 24);
end;
Lustig wird es, wenn du Zeiten berechnen musst wie z.B. von 22:00 bis 05:00, also über Mitternacht. ;-)

Nur so nebenbei,
Delphi-Quellcode:
f:=StrToTime(Edit23.Text+Label82.Caption+Edit24.Text)
geht weniger umständlich mit
Delphi-Quellcode:
f:=StrToTime(Edit23.Text+':'+Edit24.Text)
oder die Eingabe gleich in einem Edit und nur im richtigen Format hh:mm zulassen.

MJ


Alle Zeitangaben in WEZ +1. Es ist jetzt 05:26 Uhr.
Seite 1 von 2  1 2      

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