AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein Record im Array nutzen? - Sinnvollere Wege?
Thema durchsuchen
Ansicht
Themen-Optionen

Record im Array nutzen? - Sinnvollere Wege?

Ein Thema von Asura · begonnen am 10. Jul 2015 · letzter Beitrag vom 20. Jul 2015
Antwort Antwort
Seite 1 von 2  1 2      
Asura

Registriert seit: 10. Jun 2013
87 Beiträge
 
#1

AW: Record im Array nutzen? - Sinnvollere Wege?

  Alt 10. Jul 2015, 23:46
Erstmal vielen Dank für die bis jetzt aufgebrachte Mühe!

Ich muss vorab sagen, ich mach das alles nur als Hobby, bin nebenbei noch Schüler und interessiere mich in den Bereich und würde auch gerne in der Richtung studieren wollen und will mir bereits fürs Studium mal schon ein gewisses Basiswissen schaffen.

Nun wo fange ich erstmal an. Ich habe mir mal den Programmaufbau von Sir Rufo angeschaut. Ich muss sagen, dass ist für mein Anfängerwissen echt zu hoch. Also da fallen mir viele Fragen ein, wobei ich das mal nur auf das allgemeinste begrenze:
  1. Diese Darstellung ist nicht mit TObjects zu vergleichen, oder ist genau das eine Form von den bereits genannten TObjects?
  2. Spricht man von anderen Units dann genau diese einzelne Unterklasse an und die damit verbundenen Prozeduren und Funktionen?
  3. Was hat es mit der Funktion "Equals" auf sich?
  4. Warum muss man TEmployee im Destruktor wieder freigeben?
  5. Was hat es mit diesem {$SCOPEDENUMS ON} auf sich?

Ich muss sagen, dass dieses Codebeispiel, nochmals danke für diese Mühe extra auf mein Fallbeispiel angepasst eine Unit zu verfassen, für mich eine zu Hohe Hausnummer ist, man vergleiche mal meine Version (Um mal auf Deutsch zu sagen "ein Scheiß dagegen" ist.)

Ich habe mich mal desweiteren informiert und muss sagen, dass TObjects sich auf jedenfall besser eignet als meine Method, die wie von euch genannt, zu stark auf die Darstellung ausrichtet ist.

Nun zu Namenloser:
Bezüglich dem Array, ich gebe dir absolut Recht bezüglich dem Dynamischen Array und würde auch hier lieber TObjectlist nutzen. Also an meinem Anwendungsfall, wird pro Wochentag nur ein Termin genutzt. Denn später werde ich mit der Zeit schauen, ob die betroffene Person an dem Wochentag in einem bestimmten Zeitraum verfügbar ist und dabei wird nur dieser Zeitwert für den einen Wochentag genutzt.

Bezüglich 0 und 1 im Array. Ich habe das eig benutzt, damit ich später noch weiß, dass damit von Montag bis Sonntag gemeint ist (7 Tage). Aber die vorgeschlagene Methode ist um einiges besser.
Aber ich muss auch später Urlaubstage einfügen, also ich habe mir einfach gedacht, dass ich diese Tage in eine TStringlist reinschreibe und das Programm einfach die Liste durchgeht und wenn der Tag mit dem Tag der Überprüfung übereinstimmt, wird dieser als nicht verfügbar angezeigt.

Eine schlussendliche Frage habe ich noch: Als Grundproblem soll meine mangelnde Modellierung schuld sein, kann ich dies irgendwo nachlesen bzw. lernen? Eventuell habt ihr dazu passendes Informationsmaterial zur Hand? Würde gerne daran arbeiten wollen.

MfG
Asura
  Mit Zitat antworten Zitat
Namenloser

Registriert seit: 7. Jun 2006
Ort: Karlsruhe
3.724 Beiträge
 
FreePascal / Lazarus
 
#2

AW: Record im Array nutzen? - Sinnvollere Wege?

  Alt 11. Jul 2015, 11:17
Eine schlussendliche Frage habe ich noch: Als Grundproblem soll meine mangelnde Modellierung schuld sein, kann ich dies irgendwo nachlesen bzw. lernen? Eventuell habt ihr dazu passendes Informationsmaterial zur Hand? Würde gerne daran arbeiten wollen.
Hmm, ich kann dir nicht wirklich etwas bestimmtes empfehlen, aber generell Bücher über Objektorientierung. Muss nicht unbedingt ein Buch zum Kaufen sein, habe selber auch nie eins besessen (wobei das Buch „Delphi für Kids“, mit dem ich damals den Einstieg in die Programmierung gefunden habe, schon etwas Objektorientierung mitbehandelte). Im Internet gibt es sehr viel Material dazu. Kann leider wie gesagt kein bestimmtes empfehlen, ist bei mir selber zu lange her. Aber vielleicht hat ja jemand anders einen Tipp.

Wenn du Objektorientierung verinnerlicht hast, schau dir als nächstes Design Patterns an.
  Mit Zitat antworten Zitat
Bjoerk

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

AW: Record im Array nutzen? - Sinnvollere Wege?

  Alt 11. Jul 2015, 11:38
Zur Not kannst du auch erst mal beim Record bleiben, dann mußt du dein Programm nicht komplett neu machen. Records sind aus mehren Gründen allerdings nicht zu empfehlen. Der String[100] kann auch irgendwann mal ein string werden, wenn du satt typisierte Dateien (Annahme) z.B. einen FileStream oder zur Not auch eine MemIniFile verwendest.
Delphi-Quellcode:
  TEmployees = class
  private
    function GetCount: integer;
    procedure SetCount(const Value: integer);
  public
    Items: array of TEmployee;
    property Count: integer read GetCount write SetCount;
    function Add(const Value: TEmployee): integer;
    procedure Delete(const Index: integer);
    procedure Assign(Value: TEmployees);
    procedure Clear;
    procedure LoadFromFile(const FileName: string);
    procedure SaveToFile(const FileName: string);
    destructor Destroy; override;
  end;

{ TEmployees }

destructor TEmployees.Destroy;
begin
  Clear;
  inherited;
end;

function TEmployees.GetCount: integer;
begin
  Result := Length(Items);
end;

procedure TEmployees.SetCount(const Value: integer);
begin
  SetLength(Items, Value);
end;

procedure TEmployees.Clear;
begin
  SetCount(0);
end;

function TEmployees.Add(const Value: TEmployee): integer;
begin
  Result := Count;
  SetCount(Result + 1);
  Items[Result] := Value;
end;

procedure TEmployees.Delete(const Index: integer);
var
  I: integer;
begin
  for I := Index to Count - 2 do
    Items[I] := Items[I + 1];
  SetCount(Count - 1);
end;

procedure TEmployees.Assign(Value: TEmployees);
var
  I: integer;
begin
  SetCount(Value.Count);
  for I := 0 to Count - 1 do
    Items[I] := Value.Items[I];
end;

procedure TEmployees.LoadFromFile(const FileName: string);
begin
end;

procedure TEmployees.SaveToFile(const FileName: string);
begin
end;
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#4

AW: Record im Array nutzen? - Sinnvollere Wege?

  Alt 11. Jul 2015, 12:20
Die Persistenz-Schicht sollte aber nicht im Objekt selber sein.

Das gibt nachher einfach nur Kuddelmuddel, wenn man das Datenformat ändert/ändern muss (Umstieg von Dateien auf eine Datenbank).

Der Anwendung selber sollte es egal sein, wo die Daten abgelegt werden. Es gibt einfach einen Service, dem die Anwendung mitteilt, was mit dem Objekt passieren soll (CRUD). Der Service kümmert sich dann darum, wo diese Daten konkret abgelegt werden.

Der Aufwand ist nicht wirklich mehr als diese Verquickung, aber ungemein flexibel.
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)

Geändert von Sir Rufo (11. Jul 2015 um 12:27 Uhr)
  Mit Zitat antworten Zitat
Asura

Registriert seit: 10. Jun 2013
87 Beiträge
 
#5

AW: Record im Array nutzen? - Sinnvollere Wege?

  Alt 11. Jul 2015, 13:07
Wie könnte ich dann diese Persistenz-Schicht nach außen verlagern?
Und wie stelle ich da diese Informationen so bereit, dass dieser Service egal ist, ob diese in einer Datenbank oder File gespeichert werden?

Also wäre es ratsamer, wenn ich das Programm komplett neu überarbeite und nicht unbedingt nun ein Record nehme? Oder kann ich für meine Dimension des Programmes ruhig beim Record bleiben?
  Mit Zitat antworten Zitat
Namenloser

Registriert seit: 7. Jun 2006
Ort: Karlsruhe
3.724 Beiträge
 
FreePascal / Lazarus
 
#6

AW: Record im Array nutzen? - Sinnvollere Wege?

  Alt 11. Jul 2015, 14:26
@Sir Rufo: Das ist ja alles schön und gut, aber lass doch erst mal die Kirche im Dorf. Es macht keinen Sinn, jemandem, dem noch die Grundlagen der Objektorientierung fehlen, solche Konstrukte hinzuklatschen. Das führt nur zu Verwirrung. Von 0 auf 100 geht nun mal nicht sofort.

@Asura: Beim record lassen – kannst du zwar zur Not, bringt dich aber auch nicht weiter. Ich würde dir eher raten, dich einfach mal mit den Grundlagen objektorientierter Programmierung (Was ist eine Klasse? Was ist ein Objekt? Wann muss ich ein Objekt erzeugen und freigeben? Was ist Kapselung, Vererbung, Polymorphie?) zu befassen. Dann nutze dieses Wissen, um aus dem record eine Klasse und aus dem Array eine ObjectList zu machen. Dabei würde ich es dann auch erst mal belassen. In ein paar Jahren kannst du dich dann mit dem beschäftigen, was Sir Rufo geschrieben hat

Geändert von Namenloser (11. Jul 2015 um 14:29 Uhr)
  Mit Zitat antworten Zitat
Asura

Registriert seit: 10. Jun 2013
87 Beiträge
 
#7

AW: Record im Array nutzen? - Sinnvollere Wege?

  Alt 18. Jul 2015, 19:23
Guten Tag,
und zwar habe ich mich nun an der Klasse und an der Objectlist versucht:
Meine Klasse "Employee" hat die Properties, wie von Sir Rufo bereits vorgeschlagen.
Ich habe dann die Objectliste erstellt "OLEmployees".
Meine vorgehensweise sieht wie folgt aus:
Ich speichere in die Properties die Inhalte der Textfelder. Danach adde ich der Objectliste die Klasse Employee als neues Item dazu.

Die Initialisierungen und das Freigeben lasse ich hiermal weg, die finden in der Haupt-Unit im OnCreate und OnClose Event statt.

Delphi-Quellcode:
procedure TF_AddEditEmployee.btn_AddEditClick(Sender: TObject);
var EmployeeData: TStringlist;

begin

  EmployeeData := TStringlist.Create;

  EmployeeData.Add(edt_CardID.Text);
  EmployeeData.Add(edt_PreName.Text);
  EmployeeData.Add(edt_SurName.Text);
  EmployeeData.Add(DatetoStr(dt_Birthday.Date));
  EmployeeData.Add(edt_WorkStation.Text);
  EmployeeData.Add(edt_Position.Text);


      F_Employees.SelCardID := StrtoInt(edt_CardID.Text);

      try
        AddEmployeeData(F_Main.OLEmployees.Count, EmployeeData);

      except
        Messagebox(Self.Handle, 'Mitarbeiter konnte nicht hinzugefügt werden', 'Fehler',
                   MB_ICONWARNING or MB_OK);
      end;

      close;

  EmployeeData.Free;

end;

Delphi-Quellcode:
// *************************** Mitarbeiterhinzufügen ***************************

procedure AddEmployeeData(Index: Integer; EmployeeData: TStringlist);
begin

  F_Main.Employee.CardID := StrtoInt(EmployeeData[0]);
  F_Main.Employee.Prename := EmployeeData[1];
  F_Main.Employee.Surname := EmployeeData[2];
  F_Main.Employee.Birthday := StrtoDate(EmployeeData[3]);
  F_Main.Employee.Workstation := EmployeeData[4];
  F_Main.Employee.Position := EmployeeData[5];

  F_Main.OLEmployees.Add(F_Main.Employee); // Employee Daten werden als neuer Eintrag gespeichert

end;
Meine Frage ist nun, ist das so richtig und wie kann ich nun wieder aus der Objectliste heraus das richtige Item finden? Ich kann ja schlecht IndexOf benutzen, da ja alle Items das gleiche Object (Employee) haben nur mit anderen Properties.
Zurzeit wäre ja jedes neue Item der Objectlist ein neuer Mitarbeiter mit den Eigenschaften von Employee.
  Mit Zitat antworten Zitat
Benutzerbild von Dalai
Dalai
Online

Registriert seit: 9. Apr 2006
1.684 Beiträge
 
Delphi 5 Professional
 
#8

AW: Record im Array nutzen? - Sinnvollere Wege?

  Alt 18. Jul 2015, 19:44
@Asura: Warum dieser Umweg über die Stringliste?

MfG Dalai
  Mit Zitat antworten Zitat
Benutzerbild von p80286
p80286

Registriert seit: 28. Apr 2008
Ort: Stolberg (Rhl)
6.659 Beiträge
 
FreePascal / Lazarus
 
#9

AW: Record im Array nutzen? - Sinnvollere Wege?

  Alt 19. Jul 2015, 10:22
Meine Frage ist nun, ist das so richtig und wie kann ich nun wieder aus der Objectliste heraus das richtige Item finden?
Na, so wie man es immer macht, nach property sortieren und dann suchen!?

Alternativ kann man auch entsprechende Indizes erstellen und über die dann den Zugriff steuern.

Gruß
K-H
Programme gehorchen nicht Deinen Absichten sondern Deinen Anweisungen
R.E.D retired error detector
  Mit Zitat antworten Zitat
Asura

Registriert seit: 10. Jun 2013
87 Beiträge
 
#10

AW: Record im Array nutzen? - Sinnvollere Wege?

  Alt 19. Jul 2015, 11:16
@Dalai:

Ich dachte mir für jede Property ein Parameter zu nehmen, wo ich den Inhalt eines Editfeldes übermittle ist unschön.
Oder gibt es eine andere Methode?

@p80286:

Muss ich mir dafür eine Funktion schreiben, oder wie kann ich nach der Property suchen?
  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 18:49 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-2025 by Thomas Breitkreuz