Delphi Klassen Vererbung -> unerklärliche Fehlermeldung

koffi

Lt. Junior Grade
Registriert
Jan. 2007
Beiträge
493
Hallo Leute!

Hoffentlich schaut sich jemand mein Problem an, obwohl es etwas schwer zu überblicken ist..
es handelt sich aber um einen syntaxfehler. wenn du dich mit klassen auskennst, dann denke ich findest du meinen fehler schnell. schau einfach erstmal auf die fehlermeldungen ganz unten.
Aufgabe ist es einen Zähler zu programmieren, welcher sich nach jedem klick auf einen button um 1 erhöt und der nach 59 wieder auf 0 zurückspringt. Die Zählerklasse (tCounter) ist in der Lage verschiedene einzelne operationen durchzuführen, wie zum beispiel tick (den zähler um 1 erhöhen). durch vererbung soll nun eine weitere "unterklasse" von tcounter erstellt werden, die regelt dass der zähler dann auch auf 0 zurückspringt, wenn er 60 erreicht hat. ich hab das ganze mal aufgebaut, es kommt jedoch eine fehlermeldung die ich mir nicht erklären kann.

zuerst die GUI Klasse

Code:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, mtCounter, StdCtrls;

type
  TForm1 = class(TForm)
    setzenBTN: TButton;
    zaehlenBTN: TButton;
    resetBTN: TButton;
    Label1: TLabel;
    Edit1: TEdit;
    procedure resetBTNClick(Sender: TObject);
    procedure zaehlenBTNClick(Sender: TObject);
    procedure write;
    procedure setzenBTNClick(Sender: TObject);
    procedure FormCreate(Sender: TObject);
  private
    Zaehler : tCounter;
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

//------------------------------------------------------writer---//
procedure TForm1.write;
begin
    label1.caption := inttostr(zaehler.getcount);
end;

//------------------------------------------------------FormCreate---//
procedure TForm1.FormCreate(Sender: TObject);
begin
      zaehler := tcounter.create;
end;

//------------------------------------------------------setzen---//
procedure TForm1.setzenBTNClick(Sender: TObject);
var eingabe:integer;
begin
      eingabe := strtoint(edit1.Text);
      zaehler.setcount(eingabe);
      write;
end;

//------------------------------------------------------zaehlen---//
procedure TForm1.zaehlenBTNClick(Sender: TObject);
begin
    zaehler.tick;
    write;
end;

//------------------------------------------------------reset---//
procedure TForm1.resetBTNClick(Sender: TObject);
begin
    zaehler.clear;
    write;
end;

end.

Hier die erste Klasse TCounter

Code:
UNIT mTCounter;

interface

//--------------------  ggf Uses-Liste anpassen !  --------------------
uses mTModCounter;

//--------------------  ggf Uses-Liste einfügen !  --------------------
//uses ....;

type
  TCounter = class

  private //Attribute
    count : integer;

  public //Methoden
    constructor create; virtual;
    procedure clear; virtual;
    procedure setCount (n: integer); virtual;
    procedure tick; virtual;
    function getCount : integer; virtual;

   end;

implementation

//+---------------------------------------------------------------------
//|         TCounter: Methodendefinition 
//+---------------------------------------------------------------------

//-------- create (public) ---------------------------------------------
constructor TCounter.create;
begin
  count:= 0;
end;

//-------- clear (public) ----------------------------------------------
procedure TCounter.clear;
begin
  count:= 0;
end;

//-------- setCount (public) -------------------------------------------
procedure TCounter.setCount (n: integer);
begin
  count:= n; 
end;

//-------- tick (public) -----------------------------------------------
procedure TCounter.tick;
begin
  Inc(count);
end;

//-------- getCount (public) -------------------------------------------
function TCounter.getCount : integer;
begin
  GetCount:= count;
end;

end.

und hier die unterklasse von tcounter, "tModCounter"

Code:
UNIT mTModCounter;

interface

//--------------------  ggf Uses-Liste anpassen !  --------------------
[COLOR="Blue"]//uses mTCounter; << wenn ich das hier nicht auskommentiere erscheinen die
//Fehlermeldungen nicht, nur folgender Fehler: 
//[Fataler Fehler] mtCounter.pas(6): F2047 Zirkuläre Unit-Referenz auf 'mTCounter'[/COLOR]

type
[COLOR="Red"][B]  TModCounter = class(TCounter)[/B][/COLOR]

  private //Attribute
    max : integer;

  public //Methoden
    procedure init (n: integer); virtual;
    procedure setCount (n: integer); override;
    procedure tick; override;

   end;

implementation

//+---------------------------------------------------------------------
//|         TModCounter: Methodendefinition 
//+---------------------------------------------------------------------

//-------- init (public) -----------------------------------------------
procedure TModCounter.init (n: integer);
begin
   max:= n; 
end;

//-------- setCount (public) -------------------------------------------
procedure TModCounter.setCount (n: integer);
begin
   inherited SetCount(n);
  if GetCount >= max then Clear;
end;

//-------- tick (public) -----------------------------------------------
procedure TModCounter.tick;
begin
  inherited tick;
  if GetCount >= max then Clear;
end;

end.


am rote markierten bereich wird beim compilieren die fehlermeldung angezeigt, welche lautet:

[Fehler] mTModCounter.pas(9): E2003 Undefinierter Bezeichner: 'TCounter'

außerdem spuckt er in der fehlerkonsole noch aus

[Fehler] mTModCounter.pas(16): E2137 Methode 'setCount' nicht in Basisklasse gefunden
[Fehler] mTModCounter.pas(17): E2137 Methode 'tick' nicht in Basisklasse gefunden
[Fehler] mTModCounter.pas(36): E2003 Undefinierter Bezeichner: 'SetCount'
[Fehler] mTModCounter.pas(37): E2003 Undefinierter Bezeichner: 'GetCount'
[Fehler] mTModCounter.pas(37): E2003 Undefinierter Bezeichner: 'Clear'
[Fehler] mTModCounter.pas(43): E2003 Undefinierter Bezeichner: 'tick'
[Fehler] mTModCounter.pas(44): E2003 Undefinierter Bezeichner: 'GetCount'
[Fehler] mTModCounter.pas(44): E2003 Undefinierter Bezeichner: 'Clear'
 
Ok, dank Dir bin ich auf die Lösung gekommen. Ich musste aus TCounter nicht nur das uses ding rausnehmen, sondern auch in tfrom1 bei uses statt tcounter tmodcounter reinschreiben. jetzt wird mir auch erst richtig klar wie das mit der vererbung läuft..
kurz dargestellt: tfrom1 -uses-> tmodcounter -uses-> tcounter

tausend Dank Cobinja!
 
Naja, mit Vererbung im objektorientierten Sinne hat das nichts zu tun. Du kannst die Klassen TCounter und TModCounter auch in ein- und dieselbe Unit schreiben.
 
Zurück
Oben