![]() |
Zeitproblem
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. |
AW: Zeitproblem
Wieso nimmst Du nicht TDateTime statt TTime, dann hast Du das Datum dabei?
|
AW: Zeitproblem
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? |
AW: Zeitproblem
Zitat:
(größere Reisen, über 24 Stunden, lassen sich, mit Letzterem, natürlich nicht berechnen) Zitat:
Was ein bissl schwer wird, daß diese ja auf der anderen Seite auch mit drinsteht. |
AW: Zeitproblem
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 ^^ |
AW: Zeitproblem
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
Delphi-Quellcode:
.
Ankunft = Abfahrt + Fahrzeit + Verspätung
|
AW: Zeitproblem
Zitat:
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.? |
AW: Zeitproblem
Zitat:
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. |
AW: Zeitproblem
Zitat:
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 :stupid: Edit: um den Beitrag unter mir aufzuklären: ![]() |
AW: Zeitproblem
Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 00:02 Uhr. |
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 by Thomas Breitkreuz