Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Alter Proggramierer - neuer Schnick-Schnack: Klassen :-(( (https://www.delphipraxis.net/93497-alter-proggramierer-neuer-schnick-schnack-klassen.html)

Uwe.F. 6. Jun 2007 20:18


Alter Proggramierer - neuer Schnick-Schnack: Klassen :-((
 
Hallo Zusammen,

als alter Programmierer kämpfe ich mal wieder mit den neumodischen mehr oder weniger sinnvollem Schnick-Schnack :wall:
Nachdem ich den "Objekten" ja noch eine gewisse Sinnhaftigkeit abgewinnen kann, scheitere ich nun an den "Klassen".

Der Fall: eine Unit mit Klassen eingebunden, Funktion aufgerufen und sofort kommt die Fehlermeldung:
"Im Projekt ist eine Exception der Klasse EAccessViolation aufgetreten. Meldung: Zugriffsverletzung ..." :evil:

Die Unit:

Delphi-Quellcode:
unit Polyphase;

interface

uses utils;

type
  THBF=class
  private
    fOrder:integer;
    OldOut:single;
  public
    constructor create(order:integer;Steep:boolean);
    function process(input:single):single;
  end;

implementation

constructor THBF.create(order:integer;Steep:boolean);
begin
  fOrder:=order; <- hier tritt der Fehler auf
  ...
  ...
Der Aufruf:
Delphi-Quellcode:
var HBF : THalfBandFilter;
begin
  HalfBandFilter.create(10, false);
  ...
Scheinbar wird für die Variable gar kein Platz reserviert :gruebel: Irgend jemand eine Idee?

Beste Grüße,
Uwe

mkinzler 6. Jun 2007 20:20

Re: Alter Proggramierer - neuer Schnick-Schnack: Klassen :-(
 
Delphi-Quellcode:
HalfBandFilter := THBF.create(10, false);

Apollonius 6. Jun 2007 20:21

Re: Alter Proggramierer - neuer Schnick-Schnack: Klassen :-(
 
Außerdem im Konstruktor immer ganz am Anfang inherited create; aufrufen.

Phoenix 6. Jun 2007 20:23

Re: Alter Proggramierer - neuer Schnick-Schnack: Klassen :-(
 
Ganz grob:

Eine Klasse ist nur der 'Bauplan' für ein Objekt. Die Klasse beinhaltet den Code gibt durch ihre Definition vor, wie ein Objekt dass aus ihr erzeugt wird im Speicher aussieht.

Arbeiten kann man nur mit Objekten (Ausnahmen: Klassenmethoden, aber die lassen wir für den Moment mal links liegen).

Das heisst immer:
1.) Variable vom Typ der Klasse
var
myObject: MyClass

2.) Über die Klasse das Objekt erzeugen:
myObject := MyClass.Create();

3.) Mit dem Objekt arbeiten:
myObject.DoSomething();


Edit: Man hab ich da viele Tippfehler drin gehabt :shock:

mkinzler 6. Jun 2007 20:27

Re: Alter Proggramierer - neuer Schnick-Schnack: Klassen :-(
 
Zitat:

Ausnahmen: Klassenmethoden, aber die lassen wir für den Moment mal links liegen
Auch Konstruktoren sind eigentlich Klassenmethoden

Apollonius 6. Jun 2007 20:35

Re: Alter Proggramierer - neuer Schnick-Schnack: Klassen :-(
 
Zitat:

Zitat von mkinzler
Zitat:

Ausnahmen: Klassenmethoden, aber die lassen wir für den Moment mal links liegen
Auch Konstruktoren sind eigentlich Klassenmethoden

Zitat:

Zitat von Delphi-Hilfe
Wenn Sie einen Konstruktor mit einer Objektreferenz (anstatt mit einer Klassenreferenz) aufrufen, wird kein Objekt erstellt. Stattdessen werden wie bei einer normalen Routine die angegebenen Anweisungen mit dem Objekt ausgeführt, und es wird eine Referenz auf das Objekt zurückgegeben.

Das heißt, ein Konstruktor kann auch als gewöhnliche Methode fungieren - allerdings habe ich das noch nie gebraucht.

Uwe.F. 6. Jun 2007 21:07

Re: Alter Proggramierer - neuer Schnick-Schnack: Klassen :-(
 
Ihr seid genial !! Nach zwei Minuten die Lösung:

Zitat:

Zitat von mkinzler
Delphi-Quellcode:
HalfBandFilter := THBF.create(10, false);

und - funktioniert :thumb:

Zitat:

Zitat von Phoenix
Eine Klasse ist nur der 'Bauplan' für ein Objekt ...

Ich hatte immer dunkel in Erinnerung, dass eine Klasse am ehesten mit einem "Exemplar" vergleichbar ist. Nun ja, wenn ich ein Objekt anhand des Bauplans "Klasse" erstelle, habe ich ein Exemplar dieser Klasse ... verstehe sogar ich :stupid:

Aber das
Zitat:

Auch Konstruktoren sind eigentlich Klassenmethoden
lasse ich lieber links liegen :mrgreen:

Tausend Dank!

Beste Grüße,
Uwe

Edit: Wo muss ich "inherited create;" aufrufen???? In der Routine
Delphi-Quellcode:
constructor THBF.create(order:integer;Steep:boolean);
begin
  fOrder:=order;
  ...
  do something...
  ...
end;
ist nix von inherhited drin.

Jelly 6. Jun 2007 21:13

Re: Alter Proggramierer - neuer Schnick-Schnack: Klassen :-(
 
Zitat:

Zitat von Uwe.F.
Aber das
Zitat:

Auch Konstruktoren sind eigentlich Klassenmethoden
lasse ich lieber links liegen :mrgreen:

Nö, so schwer ist das nicht.
Du hast doch bereits verstanden, dass wenn du Methoden aus Klassen aufrufen willst, du zuerst eine Instanz, also ein Objekt davon, erzeugen musst. Methoden oder Funktionen direkt aus der Klasser heraus aufzurufen sind Klassenmethoden, und gelten eben nicht nur für dessen Instanzen sondern ganz allgemein für die Klasse.

Also ein Aufruf wie
Delphi-Quellcode:
THBF.Tuwas ;
geht demnach nur, wenn Tuwas eine Klassenmethode ist.

Und wenn du diese Zeile mal mit
Delphi-Quellcode:
hbf := THBF.create(10, false);
vergleichst, stellst du fest dass Create durchaus als Klassenfunktion angesehen werden kann, die dir eine Instanz der Klasse als Ergebnis zurückgibt.
:zwinker:

Assertor 6. Jun 2007 22:47

Re: Alter Proggramierer - neuer Schnick-Schnack: Klassen :-(
 
Hallo Uwe!

Zitat:

Zitat von Uwe.F.
Wo muss ich "inherited create;" aufrufen????

In Deiner Klasse ist es nicht nötig. Wenn man Klassen ableitet und ein Create mit "override;" überschreibt wird dies in der Regel notwendig.

Zum Beispiel für eine Klasse, die von TCustomControl ableitet:

Delphi-Quellcode:
type TMeineKlasse = class(TCustomControl)
  ...
  public
     constructor Create(AOwner: TComponent); override;
  ...
end;
Das "override" sagt hier, daß es Create ja schon in der Basisklasse gibt. Also möchte ich auch in meinem Create in meiner Klasse, daß alles, was im TCustomControl.Create gemacht wird auch bei mir gemacht wird. Deswegen das "inherited".

Das stünde dann hier:
Delphi-Quellcode:
constructor TMeineKlasse.Create(AOwner: TComponent);
begin
  inherited Create(AOwner);
  [i]MeineAnpassungen hier;[/i]
end;
Wobei man auch "inherited;" oder manchmal "inherited Create;" nutzt. Je nach Ursprungklasse.

Ich bin selber auch erst seit Ende letzten Jahres in Delphi dabei und mußte mich ganz schön "reinwurschteln".

Zusätzlich möchte ich einmal sagen, daß ich es ganz beeindruckend finde, von einem "alten Programmierer" zu lesen, der sich so fit in der Programmierung hält. Respekt! :thumb:

Viel Spaß weiterhin mit Delphi!

Gruß winkel79

jbg 6. Jun 2007 23:38

Re: Alter Proggramierer - neuer Schnick-Schnack: Klassen :-(
 
Zitat:

Zitat von winkel79
Zitat:

Zitat von Uwe.F.
Wo muss ich "inherited create;" aufrufen????

In Deiner Klasse ist es nicht nötig. Wenn man Klassen ableitet und ein Create mit "override;" überschreibt wird dies in der Regel notwendig.

Das würde ja bedeuten, dass es "in der Regel" nicht notwendig ist bei Klassen die von TObjectList/TList erben den "inherited Create" Konstruktor aufzurufen. Da wünsche ich dir aber viel Spaß wenn du das erste Element in die Liste einfügen willst, die wegen des fehlenden "inherited Create" gar nicht richtig erzeugt wurde.

Übrigens unter .NET muss der "inherited Create" Konstruktor immer aufgerufen werden. Ein fehlen unterbindet der Compiler bereits beim Kompilieren.


Alle Zeitangaben in WEZ +1. Es ist jetzt 13:18 Uhr.
Seite 1 von 2  1 2      

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