[Delphi] Problem mit Klassen

DeaDWalker

Newbie
Registriert
Juni 2004
Beiträge
6
So zu allererst solltet ihr wissen das ich delphi zurzeit nur in der Schule lerne mir aber zum üben ein paar Projekte vorgenommen hab! :D
Auf diversen Internetseiten hab ich mir ein wenig Wissen über Klassen etc. angeeignet, allerdings bin ich jetzt auf ein Problem gestosen was ich einfach net hinbekomme!
Ich post jetzt erstmal die Unit:
Code:
unit Unit1;

interface

uses

  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ToolWin, ComCtrls, Menus, ExtCtrls;

type
  TForm1 = class(TForm)
    GroupBox2: TGroupBox;
    MainMenu1: TMainMenu;
    Datei1: TMenuItem;
    ListeSpeichern1: TMenuItem;
    ListeLaden1: TMenuItem;
    NeueListe1: TMenuItem;
    Beenden1: TMenuItem;
    Panel1: TPanel;
    Panel2: TPanel;
    Panel3: TPanel;
    Panel4: TPanel;
    Panel5: TPanel;
    Panel6: TPanel;
    Panel7: TPanel;
    Panel8: TPanel;
    Splitter1: TSplitter;
    Splitter2: TSplitter;
    lp1: TLabel;
    lp2: TLabel;
    lp3: TLabel;
    lp4: TLabel;
    lp5: TLabel;
    lp6: TLabel;
    lp7: TLabel;
    lp8: TLabel;
    Splitter5: TSplitter;
    GroupBox1: TGroupBox;
    Label2: TLabel;
    Label3: TLabel;
    Label4: TLabel;
    Edit1: TEdit;
    Edit2: TEdit;
    Edit3: TEdit;
    Edit4: TEdit;
    Splitter3: TSplitter;
    Splitter4: TSplitter;
    Panel14: TPanel;
    Panel15: TPanel;
    Panel16: TPanel;
    Panel17: TPanel;
    Panel18: TPanel;
    Panel19: TPanel;
    Panel20: TPanel;
    Panel21: TPanel;
    lp11: TLabel;
    lp12: TLabel;
    lp13: TLabel;
    lp14: TLabel;
    lp15: TLabel;
    lp16: TLabel;
    lp17: TLabel;
    lp18: TLabel;
    Panel9: TPanel;
    Panel22: TPanel;
    Panel23: TPanel;
    Panel24: TPanel;
    Panel25: TPanel;
    Panel26: TPanel;
    Panel27: TPanel;
    Panel28: TPanel;
    Panel29: TPanel;
    Panel30: TPanel;
    Panel31: TPanel;
    Panel32: TPanel;
    Panel33: TPanel;
    Panel34: TPanel;
    Splitter6: TSplitter;
    lp21: TLabel;
    lp22: TLabel;
    lp23: TLabel;
    lp24: TLabel;
    lp25: TLabel;
    lp26: TLabel;
    lp27: TLabel;
    lp28: TLabel;
    lp9: TLabel;
    lp10: TLabel;
    lp19: TLabel;
    lp20: TLabel;
    lp29: TLabel;
    lp30: TLabel;
    Bearbeiten1: TMenuItem;
    Produktentfernen1: TMenuItem;
    ProduktDatenndern1: TMenuItem;
    Memo1: TMemo;
    GroupBox3: TGroupBox;
    Label1: TLabel;
    Label5: TLabel;
    Edit5: TEdit;
    Button1: TButton;
    Edit6: TEdit;
    Label6: TLabel;
    procedure Button1Click(Sender: TObject);
    procedure onCreate(Sender: TObject);
  private

  public
    { Public declarations }
  end;

  type
   TProdukt = class      //erstellen der Klasse Produkt
    FProId:string;
    FProPreisa:real;       //Händlerpreis
    FProPreisend:real;      //Verkaufspreis
    FProAukstart:string;    //Auktionsstart
    FProAukend:string;      //Auktionsende
    FProListNum:integer;     //Hier soll die Nummer eingelesen werden in
    procedure Liste_anzeigen(Sender: TObject); //der das Produkt in einer Liste aus Labels stehen soll

    end;

var
  Form1: TForm1;
  Pro: array[1..30] of TProdukt;   // 30 Listenplätze frei, also werden 30 leere Produkte definiert
   nu: integer;
implementation

{$R *.dfm}

procedure TForm1.onCreate(Sender: TObject);
   begin
   for nu:=1 to 30 do begin
   Pro[nu]:=TProdukt.Create;  //Hab irgendwo mal was von constructor zum initialisieren
   Pro[nu].FProId:='';         // gehört, weiß aber net wirklich was ich damit mache
   Pro[nu].FProListNum:=0;
   Pro[nu].FProPreisa:=0;
   Pro[nu].FProPreisend:=0;
   Pro[nu].FProAukstart:='';
   Pro[nu].FProAukend:='';
   end;
   end;

procedure TProdukt.Liste_anzeigen;
 begin
    for nu:=1 to 30 do begin
form1.lp1.caption:=Pro[nu].FProId;
form1.lp2.Caption:=Pro[nu].FProId;       //Weiß nicht wie ich das hier vereinfachen kann:
form1.lp3.Caption:=Pro[nu].FProId;      //Hatte mal versucht das lp1 -lp 30 einfach durch
form1.lp4.Caption:=Pro[nu].FProId;        //[nu] zu ersetzen.
form1.lp5.Caption:=Pro[nu].FProId;
form1.lp6.Caption:=Pro[nu].FProId;
form1.lp7.Caption:=Pro[nu].FProId;
form1.lp8.Caption:=Pro[nu].FProId;
form1.lp9.Caption:=Pro[nu].FProId;
form1.lp10.Caption:=Pro[nu].FProId;
form1.lp11.caption:=Pro[nu].FProId;
form1.lp12.Caption:=Pro[nu].FProId;
form1.lp13.Caption:=Pro[nu].FProId;
form1.lp14.Caption:=Pro[nu].FProId;
form1.lp15.Caption:=Pro[nu].FProId;
form1.lp16.Caption:=Pro[nu].FProId;
form1.lp17.Caption:=Pro[nu].FProId;
form1.lp18.Caption:=Pro[nu].FProId;
form1.lp19.Caption:=Pro[nu].FProId;
form1.lp20.Caption:=Pro[nu].FProId;
form1.lp21.caption:=Pro[nu].FProId;
form1.lp22.Caption:=Pro[nu].FProId;
form1.lp23.Caption:=Pro[nu].FProId;
form1.lp24.Caption:=Pro[nu].FProId;
form1.lp25.Caption:=Pro[nu].FProId;
form1.lp26.Caption:=Pro[nu].FProId;
form1.lp27.Caption:=Pro[nu].FProId;
form1.lp28.Caption:=Pro[nu].FProId;
form1.lp29.Caption:=Pro[nu].FProId;
form1.lp30.Caption:=Pro[nu].FProId;

end;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
 nu:=strtoint(edit6.text);
 Pro[nu].FProID:=edit1.text;                      //Aufnahme der Daten aus Edit Fenstern
 Pro[nu].FProListNum:=strtoint(edit6.text);
 Pro[nu].FProPreisa:=strtofloat(edit2.text);
 Pro[nu].FProPreisend:=strtofloat(edit5.text);
 Pro[nu].FProAukstart:=edit3.text;
 Pro[nu].FProAukend:=edit4.Text;
 TProdukt.Liste_anzeigen                        //Hier zeigt der Compiler mir immer  nen Fehler ?!

  end;
end.


Ich denke das es an der Funktion Liste_anzeigen liegt hab da auch schon allemöglichen Varianten durchprobiert (bzw. die falschen)!
Ein paar antworten wären nett!

THX
 
Zuletzt bearbeitet von einem Moderator: (Code Tags machen das Ganze übersichtlicher :))
Servus,

herzlich willkommen im Forum!
Hier mal nen kleines Bsp zum Constructor.

Code:
// Klasse „Fahrzeug“
Private
 Radzahl : integer;
 Beschleunigung : integer;
Constructor create;
 Begin;
  Radzahl := 0;
  Beschleunigung := 0;
 End;

// Klasse Fahrrad 
Constructor create;	
Begin;
Radzahl := 2;
Beschleuniguung := 4;
end;

// Klasse Auto 
Constructor create;	
Begin;
Radzahl := 4;
Beschleuniguung := 90;
end;
 
Zuletzt bearbeitet:
Ja wo man den Hinsetzt wusst ich schon :) !
Nur was bewirkt der jetzt genau? :rolleyes:
 
Probier mal den Konstruktor so zu schreiben:

lp : array[1..30] of TLabel;

procedure TProdukt.Liste_anzeigen(Sender: TObject);
begin
for nu:=1 to 30 do begin
form1.lp[nu].caption:=Pro[nu].FProId;
end;


Und um ihn aufzurufen musst du das so machen:

TProdukt.Liste_anzeigen(sender);
 
Danke erstmal! ;)
Nun hab ich aber logischerweise ein anderes Problem:
Wenn ich meine Labels als array definiere, sind sie ja nicht von Anfang an vorhanden und müssen erst mir TLabel.Create erstellt werden....
Nur wie leg ich dann fest, wo sie dann in meiner Form erstellt werden?
Weil ich kann sie ja nun nicht mehr vorher per Hand einfügen! ODer? :heul:
was wiederum bedeutet das ich dafür ne Formel schreiben muss.......
Möchte wissen ob die Überlegung korrekt ist? :D THX
 
Das musst du dann in der Form.OnCreate() procedure ausprogrammieren.

Wenn du sie alle untereinader ausgeben willst ist das ganz einfach du must nur:

for i := 1 to 30 do
form1.lp[nu].setbounds(x,y,x1,y1);


Für x,y,x1,y1 musst du dann die Echpunkte eingeben, weis aber nicht mehr ob x1,y1 auch Kordinaten sind oder die Länge und Breite des Labels.
Mit der Laufvar. i musst du dann für jedes Label die jeweilie Position berechnen abhänig von x udn y.
 
Ah thx!
Werd ich gleich ausprobieren....
In der .onCreate() procedure hat ichs schon stehen, nur ich wusst die Funktion halt nich! :)
 
Hmmm was hier offensichtlich vergessen wurde, ist sowas hier:

Code:
procedure TForm1.xxxxxxxxxx;
var
  Produkt: TProdukt;
begin
  ...
  Produkt := TProdukt.Create; // konkretes Objekt der Klasse TProdukt erzeugen und in der Variable Produkt speichern
  try
    Produkt.Liste_Anzeigen;
  finally
    Produkt.Free; // am Schluss das erzeugte Objekt wieder freigeben, sonst gibts ein Speicherleck
  end;
  ...
end;


Den try..finally-Block benutzt man, damit das Objekt auf im Fehlerfall immer freigegeben wird.
 
Nein das hab ich schon weiter oben definiert!

Aus dem Quelltext weiter oben:

Pro: array[1..30] of TProdukt; // 30 Listenplätze frei, also werden 30 leere Produkte definiert
 
Ups okay übersehen. Trotzdem darfst Du sowas hier nicht schreiben:

Code:
 TProdukt.Liste_anzeigen;  //Hier zeigt der Compiler mir immer  nen Fehler ?!

sondern

Code:
  Pro[nu].Liste_anzeigen;

Denn TProdukt ist die Klasse, Pro[nu] ist aber das konkrete Objekt. Und eine Methode gehört immer zu einem Objekt, und nicht zu einer Klasse. (Nur bei Klassenmethoden ist das anders :) )
 
Zurück
Oben