AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Zeitproblem

Ein Thema von Marcel2906 · begonnen am 24. Aug 2011 · letzter Beitrag vom 25. Aug 2011
Antwort Antwort
Seite 1 von 2  1 2      
Marcel2906

Registriert seit: 17. Aug 2011
Ort: Warendorf
112 Beiträge
 
Delphi 2010 Professional
 
#1

Zeitproblem

  Alt 24. Aug 2011, 09:03
Guten Morgen,

nun habe ich nach langem Arbeiten mein erstes komplexeres Programm fast fertig.
Nun habe ich leider noch ein Problem. Hab leider keine Idee wie ich es lösen kann.
Ich habe eine Bus anzeige erstellt mit Zeit. Mit dieser zeit rechne ich auch, z.B. Ankunft + Verspätung usw.. Jetzt habe ich das Problem, wenn ein Bus z.B. um 23:30 kommt und erst um 00:30 wieder fährt..dann kann ich nicht mehr rechnen, da eine Rechnung von mir lautet:

Abfahrt = Ankunft + Verspätung + (Verspätung - (Abfahrt - Ankunft))

das Problem liegt bei 'Abfahrt - Ankunft'.
Bei meinem Beispiel wäre es ja 00:30 - 23:30
Aber ich will ja, dass da 01:00 rauskommt und nicht -23:00.

Hoffe einer hat eine Idee, hier mein Code, für evtl. besseres Verstehen:

Code:
unit Busanzeige1;

interface

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

type
  TBusEintrag = record
    Linie: string;
    Ziel: string;
    Ankunft: TTime;
    Abfahrt: TTime;
    Verspätung: TTime;
  end;

type
  TForm1 = class(TForm)
    ListBox1: TListBox;
    TLabel1: TLabel;
    TLabel2: TLabel;
    TLabel3: TLabel;
    TLabel4: TLabel;
    TLabel5: TLabel;
    Hinzufügen: TButton;
    alleLinien: TButton;
    Linie: TEdit;
    Ziel: TEdit;
    Ankunft: TEdit;
    Abfahrt: TEdit;
    Verspätung: TEdit;
    Label1: TLabel;
    Label2: TLabel;
    Label3: TLabel;
    bearbeiten: TButton;
    löschen: TButton;
    zehnAnzeigen: TButton;
    Label4: TLabel;
    Label5: TLabel;
    Label6: TLabel;
    Label7: TLabel;
    Beenden: TBitBtn;
    procedure HinzufügenClick(Sender: TObject);
    procedure BeendenClick(Sender: TObject);
    procedure alleLinienClick(Sender: TObject);
    procedure löschenClick(Sender: TObject);
    procedure zehnAnzeigenClick(Sender: TObject);
    procedure bearbeitenClick(Sender: TObject);

    private
    Liste: array of TBusEintrag;
    procedure Delete;
    procedure Output(LängeListe:integer);
    procedure Sort;
    end;

Var
Form1 : TForm;

implementation

{$R *.dfm}

procedure TForm1.Delete;
   var
      MakierteStelle,i: integer;
   begin
      MakierteStelle:= 0;
      //Makierte Stelle wird gesucht
      for i := 0 to ListBox1.Count - 1 do
         if ListBox1.Selected[i] then begin
            MakierteStelle:=i;
         end;

      //Makierte Stelle komtm an das Ende des Arrays
      while MakierteStelle<high(Liste) do begin
         Liste[MakierteStelle]:=Liste[MakierteStelle+1];
         MakierteStelle:=MakierteStelle+1;
      end;

      //Array wird um 1 verringert
      setLength(Liste,Length(Liste)-1);

      //Makierter Eintrag wird aus ListBox entfernt
      ListBox1.DeleteSelected;
   end;

procedure TForm1.Output(LängeListe:integer);
   const
      MAX_TABS = 4;
      Tab = #9;
   var
      Tabulators: array[0..MAX_TABS] of Integer;
      StelleEintrag: integer;
   begin
      //Tabulatorweiten festlegen
      Tabulators[0] := 72;
      Tabulators[1] := 136;
      Tabulators[2] := 202;
      Tabulators[3] := 1;
      Tabulators[4] := 1;
      ListBox1.TabWidth := 1;

      //Tabulatoren setzen
      SendMessage(ListBox1.Handle, LB_SETTABSTOPS, MAX_TABS, Longint(@Tabulators));

      //ListBox leeren
      ListBox1.clear;

      //Liste ausgeben
      StelleEintrag:=0;
      //Wenn Verspätung größer als Pause zwischen Ankunft und Abfahrt, Abfahrt verändern
      if Liste[StelleEintrag].Abfahrt-Liste[StelleEintrag].Ankunft<Liste[StelleEintrag].Verspätung then begin
         while ((StelleEintrag < length(Liste)) and (StelleEintrag<LängeListe)) do begin
            ListBox1.Items.Strings[StelleEintrag]:=
            ' '+Liste[StelleEintrag].Linie+ Tab +
            Liste[StelleEintrag].Ziel+Tab+
            (TimeToStr(Liste[StelleEintrag].Ankunft+Liste[StelleEintrag].Verspätung+(Liste[StelleEintrag].Verspätung-(Liste[StelleEintrag].Abfahrt-Liste[StelleEintrag].Ankunft))))+' Uhr'+Tab+
            TimeToStr(Liste[StelleEintrag].Verspätung)+Tab+'h';
            StelleEintrag:=StelleEintrag+1;
         end;
      end else
         //Wenn Verspätung kleiner als Pause zwischen Ankunft und Abfahrt, Abfahrt nicht verändern
         while ((StelleEintrag < length(Liste)) and (StelleEintrag<LängeListe)) do begin
            ListBox1.Items.Strings[StelleEintrag]:=
            ' '+Liste[StelleEintrag].Linie+ Tab +
            Liste[StelleEintrag].Ziel+Tab+
            TimeToStr(Liste[StelleEintrag].Abfahrt)+' Uhr'+Tab+
            TimeToStr(Liste[StelleEintrag].Verspätung)+Tab+'h';
            StelleEintrag:=StelleEintrag+1;
         end;
   end;
procedure TForm1.Sort;
   var
      Eintrag,PositionImArray: integer;
      AnkunftPlusVerspätung: TTime;
   begin
      PositionImArray:=0;
      //Wenn Verspätung keine Eingabe hat, setzte Wert 0
      if Verspätung.Text = '' then Verspätung.Text:= '0';

      AnkunftPlusVerspätung:= (StrToTime(Ankunft.Text)+StrToTime(Verspätung.Text));

      //Wenn Array länge 0 hat, Array um 1 verlängern
      if length(Liste)=0 then begin
         SetLength(Liste,1);
      end

      //suche Position für neuen Eintrag
      else begin
         while (AnkunftPlusVerspätung >(Liste[PositionImArray].Ankunft+Liste[PositionImArray].Verspätung)) and (PositionImArray < length(Liste)) do begin
            PositionImArray:=(PositionImArray+1);
         end;

      //Array um 1 erweitern
      SetLength(Liste,length(Liste)+1);
      Eintrag:=(high(Liste));

      //Einträge verschieben
      while (Eintrag>PositionImArray) do begin
         Liste[Eintrag]:=Liste[(Eintrag-1)];
         Eintrag:=(Eintrag-1);
      end;
      end;

      //neuen Eintrag in Array eintragen
      Liste[PositionImArray].Linie:=Linie.Text;;
      Liste[PositionImArray].Ziel:=Ziel.Text;
      Liste[PositionImArray].Ankunft:=StrToTime(Ankunft.Text);
      Liste[PositionImArray].Abfahrt:=StrToTime(Abfahrt.Text);
      Liste[PositionImArray].Verspätung:=StrToTime(Verspätung.Text);
   end;

procedure TForm1.alleLinienClick(Sender: TObject);
   begin
      //ganze Liste in ListBox eintragen
      Output(length(Liste));
   end;

procedure TForm1.bearbeitenClick(Sender: TObject);
   var
      i:integer;
      MakierteStelle: integer;
   begin
      MakierteStelle:= 0;
      //Makierte Stelle wird gesucht
      for i := 0 to listbox1.Count - 1 do
         if listbox1.Selected[i] then begin
         MakierteStelle:=i;
         end;

      //Makierter Eintrag wird in Editfelder eingetragen und gelöscht
      Linie.Text:= Liste[MakierteStelle].Linie;
      Ziel.Text:= Liste[MakierteStelle].Ziel;
      Ankunft.Text:= TimeToStr(Liste[MakierteStelle].Ankunft);
      Abfahrt.Text:= TimeToStr(Liste[MakierteStelle].Abfahrt);
      Verspätung.Text:= TimeToStr(Liste[MakierteStelle].Verspätung);
      Delete;
   end;

procedure TForm1.BeendenClick(Sender: TObject);
   begin
      close;
   end;

procedure TForm1.löschenClick(Sender: TObject);
   begin
      Delete;
      Output(10);
   end;

procedure TForm1.zehnAnzeigenClick(Sender: TObject);
   begin
      Output(10);
   end;

procedure TForm1.HinzufügenClick(Sender: TObject);
   begin
      try
         Sort;
         Output(10);

         //Edit Felder leeren
         Linie.Clear;
         Ziel.Clear;
         Ankunft.Clear;
         Abfahrt.Clear;
         Verspätung.Clear;

         //Falls etwas falsch eingegeben ist, Hinweis zeigen
         except
            showmessage('Bitte alle Felder ausfüllen oder korrekte Uhrzeit eingeben');
         end;
   end;
end.
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.624 Beiträge
 
Delphi 12 Athens
 
#2

AW: Zeitproblem

  Alt 24. Aug 2011, 09:07
Wieso nimmst Du nicht TDateTime statt TTime, dann hast Du das Datum dabei?
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Benutzerbild von jfheins
jfheins

Registriert seit: 10. Jun 2004
Ort: Garching (TUM)
4.579 Beiträge
 
#3

AW: Zeitproblem

  Alt 24. Aug 2011, 09:16
Oder du rechnest die Differenz zuerst aus, und wenn sie <0 ist, adddirst du 24

Wobei mir die Formel relativ sinnlos erscheint. was willst du damit ausrechnen?
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu
Online

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.071 Beiträge
 
Delphi 12 Athens
 
#4

AW: Zeitproblem

  Alt 24. Aug 2011, 09:31
Oder du rechnest die Differenz zuerst aus, und wenn sie <0 ist, adddirst du 24
Jupp, entwedern du mußt das Datum mit angeben oder eben versuchen nachträglich den Wert anzupassen.
(größere Reisen, über 24 Stunden, lassen sich, mit Letzterem, natürlich nicht berechnen)

Wobei mir die Formel relativ sinnlos erscheint. was willst du damit ausrechnen?
Die "nötige" Abfahrtszeit?
Was ein bissl schwer wird, daß diese ja auf der anderen Seite auch mit drinsteht.
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.
  Mit Zitat antworten Zitat
Marcel2906

Registriert seit: 17. Aug 2011
Ort: Warendorf
112 Beiträge
 
Delphi 2010 Professional
 
#5

AW: Zeitproblem

  Alt 24. Aug 2011, 10:02
Danke für die schnellen Antworten.
Ich werde TDateTime benutzen.

Mit der Formel habe ich die Auszugebende Abfahrtszeit berechnet.
Weiß auch nicht mehr genau wie ich darauf gekommen bin, in dem Moment in dem ich sie mir überlegt habe klang sie ganz plausibel ^^

Geändert von Marcel2906 (24. Aug 2011 um 10:19 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu
Online

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.071 Beiträge
 
Delphi 12 Athens
 
#6

AW: Zeitproblem

  Alt 24. Aug 2011, 10:23
Nur TDateTime wird aber nichts Helfen, da praktsich TDateTime und TTime die selben Typen sind (Beide können sowohl mit als auch ohne Datum genutzt werden).

Diese Typen sind für den Programmierer, damit Er weiß, was sich darin befindet. (Delphi interessiert das überhaupt nicht)

Also wirst du auch das Datum dort mit reinspeichern müssen, sonst bringt es nichts.




Und du meinst wohl eher Ankunft = Abfahrt + Fahrzeit + Verspätung .
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.

Geändert von himitsu (24. Aug 2011 um 10:26 Uhr)
  Mit Zitat antworten Zitat
Jumpy
Online

Registriert seit: 9. Dez 2010
Ort: Mönchengladbach
1.736 Beiträge
 
Delphi 6 Enterprise
 
#7

AW: Zeitproblem

  Alt 24. Aug 2011, 10:38
Und du meinst wohl eher Ankunft = Abfahrt + Fahrzeit + Verspätung .
Nee, ich glaube es geht um die aktualisierte Anzeige der Abfahrtszeit an so einer Anzeigetafel am Busbahnhof, wenn ich mich richtig an einen anderen Thread des TEs erinnere.

So eine Logik sollte man mMn nicht versuchen mit einer Formel zu erschlagen, sondern mittels if..then ein paar Fallunterscheidungen vornehmen, in die man Richtlinien einbauen kann.

Beispiel der Bus hat 30 min. Verspätung, hätte aber eh 60 min. Wartezeit an der Haltestelle. Heißt das, der Bus fährt da pünktl. los und die Wartezeit wird verkürzt (das soll ja die Formel bewirken, wenn ich das recht verstehe) oder muss die Wartezeit von 60 min. trotzdem eingehalten werden, da der Fahrer Pause machen muss, z.B.?
Ralph
  Mit Zitat antworten Zitat
Marcel2906

Registriert seit: 17. Aug 2011
Ort: Warendorf
112 Beiträge
 
Delphi 2010 Professional
 
#8

AW: Zeitproblem

  Alt 24. Aug 2011, 10:53
Und du meinst wohl eher Ankunft = Abfahrt + Fahrzeit + Verspätung .
Nee, ich glaube es geht um die aktualisierte Anzeige der Abfahrtszeit an so einer Anzeigetafel am Busbahnhof, wenn ich mich richtig an einen anderen Thread des TEs erinnere.

So eine Logik sollte man mMn nicht versuchen mit einer Formel zu erschlagen, sondern mittels if..then ein paar Fallunterscheidungen vornehmen, in die man Richtlinien einbauen kann.

Beispiel der Bus hat 30 min. Verspätung, hätte aber eh 60 min. Wartezeit an der Haltestelle. Heißt das, der Bus fährt da pünktl. los und die Wartezeit wird verkürzt (das soll ja die Formel bewirken, wenn ich das recht verstehe) oder muss die Wartezeit von 60 min. trotzdem eingehalten werden, da der Fahrer Pause machen muss, z.B.?
Richtig, wenn er 30min Verspätung hat und sowieso 60min pause hat, fährt er trotzdem pünktlich ab.
Ich habe ja eine If-Schleife gemacht. Wenn die Verspätung kleiner ist als die Pause, dann fährt er Pünktlich, wenn nicht, dann rechnet er mit der angegebenen Formel.
  Mit Zitat antworten Zitat
Benutzerbild von jfheins
jfheins

Registriert seit: 10. Jun 2004
Ort: Garching (TUM)
4.579 Beiträge
 
#9

AW: Zeitproblem

  Alt 24. Aug 2011, 11:36
Richtig, wenn er 30min Verspätung hat und sowieso 60min pause hat, fährt er trotzdem pünktlich ab.
Ich habe ja eine If-Schleife gemacht. Wenn die Verspätung kleiner ist als die Pause, dann fährt er Pünktlich, wenn nicht, dann rechnet er mit der angegebenen Formel.
Also wenn der Bus planmäßig um 15:00 ankommen sollte, mit 5 Minuten Aufenthalt und die Verspätung beträgt 20 Minuten:
Abfahrt = Ankunft + Verspätung + (Verspätung - (Abfahrt - Ankunft))
Abfahrt = 15:00 + 20 + 20 - (15:05 - 15:00)
= 15:35

Der Busfahrer legt also eine extra lange Pause ein, um die Verspätung auf 30min zu steigern


Edit: um den Beitrag unter mir aufzuklären: http://www.if-schleife.de/ - die Terminologie ist da eigentlich relativ eindeutig

Geändert von jfheins (24. Aug 2011 um 11:49 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.624 Beiträge
 
Delphi 12 Athens
 
#10

AW: Zeitproblem

  Alt 24. Aug 2011, 11:43
Ich habe ja eine If-Schleife gemacht.
Wetten, dass nicht?
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 14:20 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