Mit Eigene erstellte Objekte in Memo Ausgeben ?

Für allgemeine Fragen zur Programmierung, welche nicht! direkt mit Lazarus zu tun haben.
Antworten
helpge1
Beiträge: 6
Registriert: Fr 12. Jul 2013, 10:11
OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z)
CPU-Target: xxBit

Mit Eigene erstellte Objekte in Memo Ausgeben ?

Beitrag von helpge1 »

Hallo lazarusforum.de user,

ich habe ein folgendes problem !!!
Ich will mit mein eigenen erzeugten TKreisHelfer Objekt die Flaeche in Memo1 und Umfang in Memo2 ausgeben.
Es läuft bis "Button 4" ohne Fehler.
Button 5 Soll es Füllen und Button 6 Ausgeben.
Könnt ihr mir dabei helfen.. ? :D


Code: Alles auswählen

unit Unit1;
 
{$mode objfpc}{$H+}
 
interface
 
uses
  Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, StdCtrls, contnrs;
 
type
 
  { TForm1 }
 
  TForm1 = class(TForm)
    Button1: TButton;
    Button2: TButton;
    Button3: TButton;
    Button4: TButton;
    Button5: TButton;
    Button6: TButton;
    Button7: TButton;
    Label1: TLabel;
    Label2: TLabel;
    Memo1: TMemo;
    Memo2: TMemo;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure Button3Click(Sender: TObject);
    procedure Button4Click(Sender: TObject);
    procedure Button5Click(Sender: TObject);
    procedure Button6Click(Sender: TObject);
    procedure Button7Click(Sender: TObject);
    procedure FormClose(Sender: TObject; var CloseAction: TCloseAction);
    procedure FormShow(Sender: TObject);
  private
    { private declarations }
  public
    { public declarations }
  end;
 
 
  { TGeometrieHelfer }
 
  TGeometrieHelfer = class
  private
    fBreite: double;
    fLaenge: double;
    fRadius: double;
    fDurchmesser: double;
    fPi: double;
  protected
    function GetFlaeche: double; virtual; abstract;
    function GetUmfang: double; virtual; abstract;
  public
    constructor Create;
    destructor Destroy; override;
 
  end;
 
  { TRechteckHelfer }
 
  TRechteckHelfer = class(TGeometrieHelfer)
  private
    protected
      public
        constructor Create(ABreite, ALaenge: double);
        destructor Destroy; override;
        function GetFlaeche: double; override;
        function GetUmfang: double; override;
 
  end;
 
  { TKreisHelfer }
 
  TKreisHelfer = class(TGeometrieHelfer)
    private
      protected
        public
        constructor Create(ADurchmesser,ARadius: double); overload;
        constructor Create; overload;
        destructor Destroy; override;
        function GetFlaeche: double; override;
        function GetUmfang: double; override;
 
  end;
 
  { TGeometrieliste }
 
  TGeometrieliste = class(TObjectlist)
    private
      protected
        public
          constructor Create;
          destructor Destroy; override;
 
  end;
 
var
  Form1: TForm1;
  GeometrieHelfer: TGeometrieHelfer;
  RechteckHelfer: TRechteckHelfer;
  KreisHelfer: TKreisHelfer;
  Geometrieliste: TGeometrieliste;
 
implementation
 
{ TGeometrieliste }
 
constructor TGeometrieliste.Create;
begin
  inherited create(true);
end;
 
destructor TGeometrieliste.Destroy;
begin
  inherited Destroy;
end;
 
{ TKreisHelfer }
 
constructor TKreisHelfer.Create(ADurchmesser,ARadius: double);
begin
  inherited Create;
  fDurchmesser := ADurchmesser;
  fRadius := ARadius;
end;
 
constructor TKreisHelfer.Create;
begin
  fRadius := random(100);
  fDurchmesser := 0;
end;
 
destructor TKreisHelfer.Destroy;
begin
  inherited Destroy;
end;
 
function TKreisHelfer.GetFlaeche: double;
begin
  Result := fPi * fDurchmesser * fDurchmesser / 4;
end;
 
function TKreisHelfer.GetUmfang: double;
begin
  Result := 2 * fPi * fRadius;
end;
 
{ TRechteckHelfer }
 
constructor TRechteckHelfer.Create(ABreite, ALaenge: double);
begin
  inherited Create;
  fBreite := ABreite;
  fLaenge := ALaenge;
end;
 
destructor TRechteckHelfer.Destroy;
begin
  inherited Destroy;
end;
 
function TRechteckHelfer.GetFlaeche: double;
begin
  Result := fBreite * fLaenge;
end;
 
function TRechteckHelfer.GetUmfang: double;
begin
  Result := 2 * fBreite + 2 * fLaenge;
end;
 
{ TGeometrieHelfer }
 
constructor TGeometrieHelfer.Create;
begin
  fBreite := 0.0;
  fLaenge := 0.0;
  fRadius := 0.0;
  fDurchmesser := 0.0;
  fPi := 3.14;
end;
 
destructor TGeometrieHelfer.Destroy;
begin
  inherited Destroy;
end;
 
{$R *.lfm}
 
{ TForm1 }
 
procedure TForm1.FormShow(Sender: TObject);
begin
  Memo1.Lines.Clear;
  Memo2.Lines.Clear;
  Geometriehelfer := TGeometrieHelfer.Create;
  Geometrieliste := TGeometrieliste.Create;
end;
 
procedure TForm1.Button1Click(Sender: TObject);
var
  i: integer;
begin
  Memo1.Lines.Clear;
  Memo2.Lines.Clear;
 
  i := 0;
 
  For i := 1 to 10 do begin
    if (( i mod 2 ) <> 0 ) then begin
      Memo1.Lines.Add(IntToStr(i));
 
      end else begin
        Memo2.Lines.Add(IntToStr(i));
 
      end;
    end;
  end;
 
procedure TForm1.Button2Click(Sender: TObject);
var
  i: integer;
begin
  Memo1.Lines.Clear;
  Memo2.Lines.Clear;
 
  i := 0;
 
  Repeat
    i := i + 1;
    if (( i mod 2 ) <> 0 ) then begin
      Memo1.Lines.Add(IntToStr(i));
 
      end else begin
        Memo2.Lines.Add(IntToStr(i));
 
        end;
      until i >= 10;
end;
 
procedure TForm1.Button3Click(Sender: TObject);
var
  Breite, Laenge: double;
  i: integer;
begin
  Memo1.Lines.Clear;
  Memo2.Lines.Clear;
 
  For i := 1 to 10 do begin
    Breite := i;
    Laenge := i;
    RechteckHelfer := TRechteckHelfer.Create(Breite, Laenge);
  try
    Memo1.Lines.Add(Format('Flaeche: %2f' , [RechteckHelfer.GetFlaeche]));
    Memo2.Lines.Add(Format('Umfang: %2f' , [RechteckHelfer.GetUmfang]));
  finally
    FreeAndNil(RechteckHelfer);
    end;
  end;
  end;
 
procedure TForm1.Button4Click(Sender: TObject);
var
  i: integer;
  Radius: double;
  Durchmesser: double;
begin
  Memo1.Lines.Clear;
  Memo2.Lines.Clear;
 
  For i := 1 to 10 do begin
    Radius := i;
    Durchmesser := i;
    KreisHelfer := TKreisHelfer.Create(Radius, Durchmesser);
  try
    Memo1.Lines.Add(Format('Flaeche: %2f' , [KreisHelfer.GetFlaeche]));
    Memo2.Lines.Add(Format('Umfang: %2f' , [KreisHelfer.GetUmfang]));
  finally
    FreeAndNil(KreisHelfer);
  end;
 
  end;
 
end;
 
procedure TForm1.Button5Click(Sender: TObject);
var
  i: integer;
  kh: TKreisHelfer;
begin
  Geometrieliste.Clear;
  i := 0;
 
  For i := 1 to 100 do begin
    kh := TKreisHelfer.Create;
    Geometrieliste.Add(kh);
  end;
end;
 
 
procedure TForm1.Button6Click(Sender: TObject);
var
  i: integer;
  kh: TKreisHelfer;
begin
    Memo1.Lines.Clear;
    Memo2.Lines.Clear;
    i := 0;
 
  For i := 1 to Geometrieliste.Count do begin
    kh := TKreisHelfer(Geometrieliste.Items[i]);
 
    Memo1.Lines.Add(Format('Flaeche: %d' , [Geometrieliste.Count]));
    Memo2.Lines.Add(Format('Umfang: %d' , [Geometrieliste.Count]));
  end;
end;
 
procedure TForm1.Button7Click(Sender: TObject);
begin
  close;
end;
 
procedure TForm1.FormClose(Sender: TObject; var CloseAction: TCloseAction);
begin
  FreeAndNil(Geometrieliste);
 
  end;
end.



Gruß,

helpge1

Michl
Beiträge: 2505
Registriert: Di 19. Jun 2012, 12:54

Re: Mit Eigene erstellte Objekte in Memo Ausgeben ?

Beitrag von Michl »

Folgendes ist mir aufgefallen:

Du musst noch im Create von deinem Kreishelfer den Durchmesser und Radius angeben, sind sonst immer 0!

Code: Alles auswählen

procedure TForm1.Button5Click(Sender: TObject);
var
  i: integer;
  kh: TKreisHelfer;
begin
  Geometrieliste.Clear;
  i := 0;
 
  For i := 1 to 100 do begin
    kh := TKreisHelfer.Create(i*2,i)//Hier muss noch Durchmesser und Radius mit angeben werden z.B. i -> Radius, Durchmesser damit i * 2
    Geometrieliste.Add(kh);
  end;
end;
 


Bei der Ausgabe hast du vor allem das Problem, dass du auf ein Listenelement zugreifst, was nicht existiert:

Code: Alles auswählen

  For i := 1 to Geometrieliste.Count do begin
.Count gibt die Anzahl der Elemente an.

Z.B. hast du 10 Elemente, gibt dir ".Count" 10 zurück. Da aber die Zählung immer mit 0 beginnt und nicht mit 1 muss der Code wie folgt lauten:

Code: Alles auswählen

 procedure TForm1.Button6Click(Sender: TObject);
var
  i: integer;
  kh: TKreisHelfer;
begin
  Memo1.Lines.Clear;
  Memo2.Lines.Clear;
 
  For i := 0 to Geometrieliste.Count-1 do begin                //.Count-1 !!!
    kh := TKreisHelfer(Geometrieliste.Items[i]);
 
    Memo1.Lines.Add(Format('Flaeche: %2f' , [kh.GetFlaeche])); //Habe dir mal die Formatierung geändert
    Memo2.Lines.Add(Format('Umfang: %2f' , [kh.GetUmfang]));   //ebenfalls die Ergebnisse entsprechend Button4
  end;
end;
Zuletzt geändert von Michl am Fr 12. Jul 2013, 13:15, insgesamt 1-mal geändert.

Code: Alles auswählen

type
  TLiveSelection = (lsMoney, lsChilds, lsTime);
  TLive = Array[0..1] of TLiveSelection; 

helpge1
Beiträge: 6
Registriert: Fr 12. Jul 2013, 10:11
OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z)
CPU-Target: xxBit

Re: Mit Eigene erstellte Objekte in Memo Ausgeben ?

Beitrag von helpge1 »

Ahh stimmt danke vielmals :D

Es Funktioniert :lol:

Antworten