![]() |
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. |
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:
Wenn AnzahlPatienten=5 dann
SetLength(Feld, AnzahlPatienten-1);
for i := 0 to AnzahlPatienten do Feld[i] := TPerson.Create; - 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: |
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. |
AW: Delphi Schulprogramm Hilfe
Willkommen in der DP. :thumb:
|
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. |
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:
:stupid:
AnzahlPatienten := 1;
SetLength(Feld, AnzahlPatienten - 1); |
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.
|
AW: Delphi Schulprogramm Hilfe
Gibt es irgendwelche Neuigkeiten?
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 09:28 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 by Thomas Breitkreuz