Thema: Delphi Zeitproblem

Einzelnen Beitrag anzeigen

Marcel2906

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

Zeitproblem

  Alt 24. Aug 2011, 08: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