AGB  ·  Datenschutz  ·  Impressum  







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

Array of Pointer of Record

Ein Thema von Marcel2906 · begonnen am 24. Aug 2011 · letzter Beitrag vom 24. Aug 2011
Antwort Antwort
Marcel2906

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

Array of Pointer of Record

  Alt 24. Aug 2011, 10:59
Entschuldigung dass ich mal wieder mit einem langen Code nerve Nun soll ich meinen Code so umschreiben, dass ich ein Array of Pointer of Record habe. Die ersten Schritte habe ich gemacht, doch nun weiß ich nicht genau wie es weiter geht. Hoffe ihr habt einpaar Denkanstöße für mich.

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;

   PBusEintrag = ^TBusEintrag;

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 PBusEintrag;
    procedure Delete;
    procedure Output(LängeListe:integer);
    procedure Sort;
    end;

Var
Form1 : TForm;

implementation

{$R *.dfm}

procedure TForm1.Delete;
   var
      MakierteStelle,i: integer;
      rec : TBusEintrag;
      rec_p : PBusEintrag;
   begin
      rec_p := Nil; // Init mit nichts
      new (rec_p); // Init eines Speicherbereches der Größe TRec,
                // und rec_P <> Nil und zeit eáuf eine Adresse

      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;
      Dispose(rec_p);
      rec_p := Nil;
   end;

procedure TForm1.Output(LängeListe:integer);
   const
      MAX_TABS = 4;
      Tab = #9;
   var
      Tabulators: array[0..MAX_TABS] of Integer;
      StelleEintrag: integer;
      rec : TBusEintrag;
      rec_p : PBusEintrag;
   begin
      rec_p := Nil; // Init mit nichts
      new (rec_p); // Init eines Speicherbereches der Größe TRec,
                // und rec_P <> Nil und zeit eáuf eine Adresse

      //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;
         Dispose(rec_p);
         rec_p := Nil;
   end;

procedure TForm1.Sort;
   var
      Eintrag,PositionImArray: integer;
      AnkunftPlusVerspätung: TTime;
      rec : TBusEintrag;
      rec_p : PBusEintrag;
   begin
      rec_p := Nil; // Init mit nichts
      new (rec_p); // Init eines Speicherbereches der Größe TRec,
                // und rec_P <> Nil und zeit eáuf eine Adresse

      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);
      Dispose(rec_p);
      rec_p := Nil;
   end;

procedure TForm1.alleLinienClick(Sender: TObject);
   var
   rec : TBusEintrag;
   rec_p : PBusEintrag;

   begin
      rec_p := Nil; // Init mit nichts
      new (rec_p); // Init eines Speicherbereches der Größe TRec,
                // und rec_P <> Nil und zeit eáuf eine Adresse
      //ganze Liste in ListBox eintragen
      Output(length(Liste));
      Dispose(rec_p);
      rec_p := Nil;
   end;

procedure TForm1.bearbeitenClick(Sender: TObject);
   var
      i:integer;
      MakierteStelle: integer;
      rec : TBusEintrag;
      rec_p : PBusEintrag;
   begin
      rec_p := Nil; // Init mit nichts
      new (rec_p); // Init eines Speicherbereches der Größe TRec,
                // und rec_P <> Nil und zeit eáuf eine Adresse
      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;
      Dispose(rec_p);
      rec_p := Nil;
   end;

procedure TForm1.BeendenClick(Sender: TObject);
   var
   rec : TBusEintrag;
   rec_p : PBusEintrag;
   begin
      rec_p := Nil; // Init mit nichts
      new (rec_p); // Init eines Speicherbereches der Größe TRec,
                // und rec_P <> Nil und zeit eáuf eine Adresse
      close;
      Dispose(rec_p);
      rec_p := Nil;
   end;

procedure TForm1.löschenClick(Sender: TObject);
   var
   rec : TBusEintrag;
   rec_p : PBusEintrag;
   begin
      rec_p := Nil; // Init mit nichts
      new (rec_p); // Init eines Speicherbereches der Größe TRec,
                // und rec_P <> Nil und zeit eáuf eine Adresse
      Delete;
      Output(10);
      Dispose(rec_p);
      rec_p := Nil;
   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.

Geändert von Marcel2906 (24. Aug 2011 um 11:10 Uhr) Grund: TBusEintrag und PBusEintrag geändert
  Mit Zitat antworten Zitat
Benutzerbild von s.h.a.r.k
s.h.a.r.k

Registriert seit: 26. Mai 2004
3.159 Beiträge
 
#2

AW: Array of Pointer of Record

  Alt 24. Aug 2011, 11:03
Delphi-Quellcode:
type
  TRecord = record
    Blub : string;
    Bla : Integer;
  end;
  
  // Typisierter Zeiger
  PRecord = ^TRecord;
  
  // Array von typisierten Zeigern
  TRecordArray = array of PRecord;
  // Oder, was mir besser gefällt:
  TRecordArray = TArray<PRecord>;
Schau dir zudem mal die Konventionen hier an:
  • Normaler Typ: TName -> T für Type
  • Typisierter Zeiger: PName -> P für Pointer
Warum postet du eigentlich den ganzen Code?
»Remember, the future maintainer is the person you should be writing code for, not the compiler.« (Nick Hodges)
  Mit Zitat antworten Zitat
Marcel2906

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

AW: Array of Pointer of Record

  Alt 24. Aug 2011, 11:08
Delphi-Quellcode:
type
  TRecord = record
    Blub : string;
    Bla : Integer;
  end;
  
  // Typisierter Zeiger
  PRecord = ^TRecord;
  
  // Array von typisierten Zeigern
  TRecordArray = array of PRecord;
  // Oder, was mir besser gefällt:
  TRecordArray = TArray<PRecord>;
Schau dir zudem mal die Konventionen hier an:
  • Normaler Typ: TName -> T für Type
  • Typisierter Zeiger: PName -> P für Pointer
Warum postet du eigentlich den ganzen Code?
Weil ich meinen Code verändern muss, ich weiß nur nicht wo und was
  Mit Zitat antworten Zitat
Bjoerk

Registriert seit: 28. Feb 2011
Ort: Mannheim
1.384 Beiträge
 
Delphi 10.4 Sydney
 
#4

AW: Array of Pointer of Record

  Alt 24. Aug 2011, 11:28
Darfst/Kannst Du TList benutzen ?
  Mit Zitat antworten Zitat
Marcel2906

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

AW: Array of Pointer of Record

  Alt 24. Aug 2011, 11:37
Darfst/Kannst Du TList benutzen ?
Darf: wüsste nicht warum nicht
Kann: Macht das einen großen Unterschied? weil ich meinen vorhandenen Code ja nur umschreiben soll. wäre ja ein relative großer Aufwand, oder nicht?

bin für jeden tipp hilfreich, hab absolut keine Ahnung wie ich das machen soll und mein Ausbilder meint nur, ist doch alles klar
  Mit Zitat antworten Zitat
Antwort Antwort


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 03:29 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