Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Neuen Beitrag zur Code-Library hinzufügen (https://www.delphipraxis.net/33-neuen-beitrag-zur-code-library-hinzufuegen/)
-   -   Delphi Schulprogramm Hilfe (https://www.delphipraxis.net/191237-delphi-schulprogramm-hilfe.html)

HilfeBeiDelphi 22. Dez 2016 17:40

Delphi Schulprogramm Hilfe
 
Hallo, ich bin nicht so ein Delphikönner und bräuchte Hilfe beim finden von logischen Fehlern in meinem Programm, welches sich noch in den Anfängen befindet, denn seitdem ich mein statisches Array durch ein dynamisches Array ersetzt habe, funktioniert das Datenanzeigen, nach dem Verbergen der Strings in den jeweiligen Editfeldern und das Wiedergeben aller Daten, mit Hilfe einer Memo nicht mehr.

Hier sind meine drei Units:

Delphi-Quellcode:
unit uFenster;
// **********************************************************************


interface
// ======================================================================
uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  StdCtrls, ExtCtrls, Buttons,
  uPerson, uDatensatz;


type
  TFensterFrm = class(TForm)
    GroesseLbl: TLabel;
    GroesseEdt: TEdit;
    GewichtLbl: TLabel;
    GewichtEdt: TEdit;
    BMILbl      : TLabel;
    BmiEdt      : TEdit;
    NameEdt      : TEdit;
    NameLbl  : TLabel;
    SteuerPnl   : TPanel;
    BtnBerechnen: TButton;
    BtnEnde: TButton;
    BtnAbnehmen: TButton;
    BtnZunehmen: TButton;
    BtnDatenVerbergen: TButton;
    BtnDatenAnzeigen: TButton;
    EdtAnzahl: TEdit;
    LblNummer: TLabel;
    BtnDatensatzAnzeigen: TButton;
    MemDatensatz: TMemo;
    EdtAnzahlPatienten: TEdit;
    LblAnzahlPatienten: TLabel;
    BtnPatientenBestaetigen: TButton;

    procedure BtnBerechnenClick (Sender: TObject);
    procedure FormCreate (Sender: TObject);
    procedure BtnEndeClick(Sender: TObject);
    procedure BtnDatenVerbergenClick(Sender: TObject);
    procedure BtnDatenAnzeigenClick(Sender: TObject);
    procedure BtnAbnehmenClick(Sender: TObject);
    procedure BtnZunehmenClick(Sender: TObject);
    procedure BtnDatensatzAnzeigenClick(Sender: TObject);
    procedure BtnPatientenBestaetigenClick(Sender: TObject);

   private
    procedure Init;

   public
     Anzahl : Integer;

  end;

var
  FensterFrm: TFensterFrm;  // --- das aktuelle Exemplar vom Fenster,
                                          //       in dem alles läuft
  AktuellePerson : TPerson; // --- das Objekt PERSON anlegen
  Datensatz : TDatensatz;
implementation
{$R *.DFM}
// ======================================================================


procedure TFensterFrm.FormCreate(Sender: TObject);
begin
   // --- das Objekt PERSON erzeugen
  FensterFrm.Init;
  Datensatz := TDatensatz.Create;
  Datensatz.Init;
  Anzahl := 0;
  MemDatensatz.Clear;
  EdtAnzahl.Text := '1';
end;

procedure TFensterFrm.Init;
begin
  // Alle Felder im Fenster leeren


end;

procedure TFensterFrm.BtnBerechnenClick(Sender: TObject);
begin
  if (EdtAnzahl.Text = '') or (GewichtEdt.Text = '') or (GroesseEdt.Text = '') or (NameEdt.Text = '') or (EdtAnzahlPatienten.Text = '')
    then ShowMessage('Bitte Fehlende Daten eingeben')
      else begin
  Datensatz.CreateArray;
  // Daten einlesen und an PERSON übergeben
  Datensatz.GetPerson(Anzahl).SetName(NameEdt.Text);
  Datensatz.GetPerson(Anzahl).SetGroesse(StrToFloat(GroesseEdt.Text));
  Datensatz.GetPerson(Anzahl).SetGewicht(StrToFloat(GewichtEdt.Text));
 // Datensatz.GetPerson(Anzahl).SetAnzahlPatienten(StrtoInt(EdtAnzahlPatienten.Text));


  // BMI ermitteln und ausgeben

  BMIEdt.Text := FloatToStr(Datensatz.GetPerson(Anzahl).HatBmi);
 end;

end;

procedure TFensterFrm.BtnEndeClick(Sender: TObject);
// ----------------------------------------------------------------------
begin
  Close;
end;

procedure TFensterFrm.BtnDatenVerbergenClick(Sender: TObject);
begin
  GroesseEdt.Text := '';
  GewichtEdt.Text := '';
  NameEdt.Text := '';
  BmiEdt.Text := '';
end;

procedure TFensterFrm.BtnDatenAnzeigenClick(Sender: TObject);
begin
  if (EdtAnzahl.Text = '')
    then ShowMessage('Bitte Fehlende Nummer eingeben')
      else begin
  Anzahl := StrtoInt(EdtAnzahl.Text)-1;
  NameEdt.Text := Datensatz.GetPerson(Anzahl).GetName;
  GroesseEdt.Text := FloatToStr(Datensatz.GetPerson(Anzahl).GetGroesse);
  GewichtEdt.Text := FloatToStr(Datensatz.GetPerson(Anzahl).GetGewicht);
  BmiEdt.Text := FloatToStr(Datensatz.GetPerson(Anzahl).HatBmi);
 end;
end;

procedure TFensterFrm.BtnAbnehmenClick(Sender: TObject);
begin
  if (EdtAnzahl.Text = '') or (GewichtEdt.Text = '') or (GroesseEdt.Text = '') or (NameEdt.Text = '')
    then ShowMessage('Bitte Fehlende Daten eingeben')
      else begin
  Datensatz.GetPerson(Anzahl).Abnehmen;
  BMIEdt.Text := FloatToStr(Datensatz.GetPerson(Anzahl).HatBmi);
  GewichtEdt.Text := FloatToStr(Datensatz.GetPerson(Anzahl).GetGewicht);
 end;
end;

procedure TFensterFrm.BtnZunehmenClick(Sender: TObject);
begin
  if (EdtAnzahl.Text = '') or (GewichtEdt.Text = '') or (GroesseEdt.Text = '') or (NameEdt.Text = '')
    then ShowMessage('Bitte Fehlende Daten eingeben')
      else begin
  Datensatz.GetPerson(Anzahl).Zunehmen;
  BMIEdt.Text := FloatToStr(Datensatz.GetPerson(Anzahl).HatBmi);
  GewichtEdt.Text := FloatToStr(Datensatz.GetPerson(Anzahl).GetGewicht);
 end;
end;


procedure TFensterFrm.BtnDatensatzAnzeigenClick(Sender: TObject);
var
  i : Integer;
begin
  //i := 1;
  MemDatensatz.Clear;
  {repeat}  for i := 0 to AnzahlPatienten-1 do begin
    MemDatensatz.Lines.Add('Name: '+ Datensatz.GetPerson(i).GetName +'  Größe:'+ FloatToStrF(Datensatz.GetPerson(i).GetGroesse,ffFixed,8,2) +'  Gewicht:'+ FloatToStrF(Datensatz.GetPerson(i).GetGewicht,ffFixed,8,2) +'  BMI:'+ FloatToStrF(Datensatz.GetPerson(i).HatBmi,ffFixed,8,2));
    {Inc(i);
  until (Name = '');}
  end;
end;

procedure TFensterFrm.BtnPatientenBestaetigenClick(Sender: TObject);
begin
  AnzahlPatienten := StrtoInt(EdtAnzahlPatienten.Text);
  Datensatz.CreateArray;
end;

end. // ------ UNIT -------

Delphi-Quellcode:
unit uPerson;


interface
(* ==================================================================== *)
type
  TPerson = class(TObject)
    private
      Name      : string;
    Groesse : real;
    Gewicht : real;
//    BMI : real;
   public
    constructor Create;
     procedure Init;
    procedure SetName (n : string);
    function GetName : string;
    procedure SetGroesse (gr : real);
    function GetGroesse : real;
    procedure SetGewicht (gw : real);
    function GetGewicht : real;

    function HatBMI: real;
    procedure Abnehmen;
    procedure Zunehmen;
  {  procedure SetAnzahlPatienten (AP : Integer);
    function GetAnzahlPatienten : Integer; }
  end;

  var
  AnzahlPatienten : Integer;

(* -------------------- B e s c h r e i b u n g -------------------------

Oberklasse    : TObject
Bezugsklassen : -

Methoden
--------
Create
  Auftrag: Person und Adresse erzeugen und Initialisieren
  vorher : -
  nachher: Person ist erzeugt, alle Datenfelder sind leer.

Init
  Auftrag: Person Initialisieren
  vorher : ist erzeugt
  nachher: alle Datenfelder sind leer.

Set...
  Auftrag: Attribut schreiben
  vorher : Person ist vorhanden.
  nachher: Attribut ist gesetzt

Get...
  Anfrage: Attribut aus dem Objekt lesen
  vorher : Person ist vorhanden.
  nachher: -

HatBMI: real;
  Anfrage: nach dem BMI-Wert
  vorher : Person ist init.
  nachher: -

Abnehmen
  Auftrag: Gewicht jeweils um 5 erhöhen
  vorher : ist erzeugt
  nachher: neues Gewicht
       
----------------------------------------------------------------------- *)

implementation
(* ==================================================================== *)

constructor TPerson.Create;
(* -------------------------------------------------------------------- *)
begin
  inherited Create; // zuerst das geerbte Object erzeugen
  Init;
end;

procedure TPerson.Init;
(* ----------------------------------------- *)
begin


end;

procedure TPerson.SetName (n : string);
(* ----------------------------------------- *)
begin
  Name := n;
end;

function TPerson.GetName : string;
(* ----------------------------------------- *)
begin
  Result := Name;
end;

procedure TPerson.SetGroesse (gr : real);
(* ----------------------------------------- *)
begin
  Groesse := gr;
end;

function TPerson.GetGroesse: real;
(* ----------------------------------------- *)
begin
  Result := Groesse;
end;

procedure TPerson.SetGewicht (gw : real);
(* ----------------------------------------- *)
begin
  Gewicht := gw;
end;

function TPerson.GetGewicht: real;
(* ----------------------------------------- *)
begin
  Result := Gewicht;
end;


function TPerson.HatBMI: real;
(* ----------------------------------------- *)
begin
  Result := Gewicht / sqr(Groesse);
end;

procedure TPerson.Abnehmen;
(* ----------------------------------------- *)
begin
  Gewicht := Gewicht - 5;
end;

procedure TPerson.Zunehmen;
(* ----------------------------------------- *)
begin
  Gewicht := Gewicht + 5;
end;

{procedure TPerson.SetAnzahlPatienten(AP : Integer);
begin
  AnzahlPatienten := AP;
end;

function TPerson.GetAnzahlPatienten : Integer;
begin
  Result := AnzahlPatienten;
end;}

END. // ----- UNIT -------

Delphi-Quellcode:
unit uDatensatz;

interface

uses
  uPerson;

type
  TDatensatz = class(TObject)
  private
    Feld : array of TPerson;
  public
    constructor Create;
    procedure init;
    procedure CreateArray;
    function GetPerson (A : Integer) : TPerson;
  end;
implementation

constructor TDatensatz.Create;
(* -------------------------------------------------------------------- *)
begin
  inherited Create;
  init;
end;

procedure TDatensatz.Init;
(* ----------------------------------------- *)
begin


end;

procedure TDatensatz.CreateArray;
var
  i : Integer;
(* -------------------------------------------------------------------- *)
begin
  SetLength(Feld, AnzahlPatienten-1);
  for i := 0 to AnzahlPatienten do
    Feld[i] := TPerson.Create;
end;

function TDatensatz.GetPerson(A : Integer) : TPerson;
begin
  Result := feld[A];
end;

end.

a.def 22. Dez 2016 17:43

AW: Delphi Schulprogramm Hilfe
 
Hausaufgaben werden hier generell nicht für Schüler erledigt.
Statt die komplette Unit zu posten wäre es wesentlich sinnvoller erst einmal die fehlerhafte(n) Stelle(n) zu finden und diese zu Posten.

Aber wenn ich nicht ganz doof bin, dann stimmt hier doch etwas nicht
Delphi-Quellcode:
 SetLength(Feld, AnzahlPatienten-1);
 for i := 0 to AnzahlPatienten do
  Feld[i] := TPerson.Create;
Wenn AnzahlPatienten=5 dann
- setzt du das Array Feld auf Länge AnzahlPatienten-1, also 4
und
- iterierst durch Feld von 0 bis AnzahlPatienten, [0, 1, 2, 3, 4, 5].

Findest du den Fehler selber? :thumb:

Daniel 22. Dez 2016 17:48

AW: Delphi Schulprogramm Hilfe
 
Nun, was er eigentlich sagen wollte:
Willkommen in der DP.
Die obige Aussage zum Thema "Hausaufgabenhilfe" ist im Kern richtig. Wir wünschen uns, dass der Fragesteller doch präziser wird. Das fängt damit an, dass das Ziel beschrieben sowie die bisherige Lösung skizziert wird. Was dann von unserer Seite aus folgen kann ist eine Hilfe zur Selbsthilfe.

a.def 22. Dez 2016 17:48

AW: Delphi Schulprogramm Hilfe
 
Willkommen in der DP. :thumb:

Delphi-Laie 22. Dez 2016 19:31

AW: Delphi Schulprogramm Hilfe
 
Length (egal, ob beim Setzen mit Setlength oder nur beim Auslesen mit length) ist nunmal eins mehr bzw. größer als der größt(möglich)e Index, weil die 0 mitzählt. Das entspricht eigentlich nicht unserer anerzogenen Zähl- und letztlich Denkweise und erfordert deshalb immer und immer wieder ein "mentales Jonglieren", ein Umrechnen. Aber das ist ja in bezug auf das Binär- und Hexadezimalsystem genauso.

Ergänzung: In dieser Hinsicht sind statische Arrays deutlich bequemer: Nicht nur enspricht das deklarierte Maximum dem größt(möglich)en Index, sondern man kann zudem bei der unteren Grenze mit einem anderen Wert als 0 beginnen.

a.def 22. Dez 2016 19:34

AW: Delphi Schulprogramm Hilfe
 
Er hat da etwas mit SetLength und der Schleife durcheinander gebracht.
Es ist nicht das SetLength sondern die Schleife bei welcher -1 geschrieben werden muss.

Denn was würde denn logischerweise das hier ergeben
Delphi-Quellcode:
AnzahlPatienten := 1;
SetLength(Feld, AnzahlPatienten - 1);
:stupid:

DeddyH 22. Dez 2016 21:43

AW: Delphi Schulprogramm Hilfe
 
Ich durchlaufe meine Arrays gewohnheitsmäßig von Low() bis High(), da juckt es mich nicht im Geringsten, ob es sich um ein statisches oder dynamisches Array handelt. Seit ich mir das angewöhnt habe, programmiere ich irgendwie entspannter.

a.def 23. Dez 2016 18:56

AW: Delphi Schulprogramm Hilfe
 
Gibt es irgendwelche Neuigkeiten?


Alle Zeitangaben in WEZ +1. Es ist jetzt 07:26 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