AGB  ·  Datenschutz  ·  Impressum  







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

Delphi Schulprogramm Hilfe

Ein Thema von HilfeBeiDelphi · begonnen am 22. Dez 2016 · letzter Beitrag vom 23. Dez 2016
Antwort Antwort
HilfeBeiDelphi

Registriert seit: 22. Dez 2016
1 Beiträge
 
#1

Delphi Schulprogramm Hilfe

  Alt 22. Dez 2016, 17:40
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.
  Mit Zitat antworten Zitat
a.def
(Gast)

n/a Beiträge
 
#2

AW: Delphi Schulprogramm Hilfe

  Alt 22. Dez 2016, 17:43
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?

Geändert von a.def (22. Dez 2016 um 17:46 Uhr)
  Mit Zitat antworten Zitat
Daniel
(Co-Admin)

Registriert seit: 30. Mai 2002
Ort: Hamburg
13.919 Beiträge
 
Delphi 10.4 Sydney
 
#3

AW: Delphi Schulprogramm Hilfe

  Alt 22. Dez 2016, 17:48
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.
Daniel R. Wolf
mit Grüßen aus Hamburg
  Mit Zitat antworten Zitat
a.def
(Gast)

n/a Beiträge
 
#4

AW: Delphi Schulprogramm Hilfe

  Alt 22. Dez 2016, 17:48
Willkommen in der DP.
  Mit Zitat antworten Zitat
Delphi-Laie

Registriert seit: 25. Nov 2005
1.474 Beiträge
 
Delphi 10.1 Berlin Starter
 
#5

AW: Delphi Schulprogramm Hilfe

  Alt 22. Dez 2016, 19:31
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.

Geändert von Delphi-Laie (22. Dez 2016 um 22:46 Uhr)
  Mit Zitat antworten Zitat
a.def
(Gast)

n/a Beiträge
 
#6

AW: Delphi Schulprogramm Hilfe

  Alt 22. Dez 2016, 19:34
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);
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.537 Beiträge
 
Delphi 11 Alexandria
 
#7

AW: Delphi Schulprogramm Hilfe

  Alt 22. Dez 2016, 21:43
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.
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
a.def
(Gast)

n/a Beiträge
 
#8

AW: Delphi Schulprogramm Hilfe

  Alt 23. Dez 2016, 18:56
Gibt es irgendwelche Neuigkeiten?
  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 22:47 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