![]() |
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:
Der Aufruf:
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 ... ...
Delphi-Quellcode:
Scheinbar wird für die Variable gar kein Platz reserviert :gruebel: Irgend jemand eine Idee?
var HBF : THalfBandFilter;
begin HalfBandFilter.create(10, false); ... Beste Grüße, Uwe |
Re: Alter Proggramierer - neuer Schnick-Schnack: Klassen :-(
Delphi-Quellcode:
HalfBandFilter := THBF.create(10, false);
|
Re: Alter Proggramierer - neuer Schnick-Schnack: Klassen :-(
Außerdem im Konstruktor immer ganz am Anfang inherited create; aufrufen.
|
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: |
Re: Alter Proggramierer - neuer Schnick-Schnack: Klassen :-(
Zitat:
|
Re: Alter Proggramierer - neuer Schnick-Schnack: Klassen :-(
Zitat:
Zitat:
|
Re: Alter Proggramierer - neuer Schnick-Schnack: Klassen :-(
Ihr seid genial !! Nach zwei Minuten die Lösung:
Zitat:
Zitat:
Aber das Zitat:
Tausend Dank! Beste Grüße, Uwe Edit: Wo muss ich "inherited create;" aufrufen???? In der Routine
Delphi-Quellcode:
ist nix von inherhited drin.
constructor THBF.create(order:integer;Steep:boolean);
begin fOrder:=order; ... do something... ... end; |
Re: Alter Proggramierer - neuer Schnick-Schnack: Klassen :-(
Zitat:
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:
geht demnach nur, wenn Tuwas eine Klassenmethode ist.
THBF.Tuwas ;
Und wenn du diese Zeile mal mit
Delphi-Quellcode:
vergleichst, stellst du fest dass Create durchaus als Klassenfunktion angesehen werden kann, die dir eine Instanz der Klasse als Ergebnis zurückgibt.
hbf := THBF.create(10, false);
:zwinker: |
Re: Alter Proggramierer - neuer Schnick-Schnack: Klassen :-(
Hallo Uwe!
Zitat:
Zum Beispiel für eine Klasse, die von TCustomControl ableitet:
Delphi-Quellcode:
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".
type TMeineKlasse = class(TCustomControl)
... public constructor Create(AOwner: TComponent); override; ... end; Das stünde dann hier:
Delphi-Quellcode:
Wobei man auch "inherited;" oder manchmal "inherited Create;" nutzt. Je nach Ursprungklasse.
constructor TMeineKlasse.Create(AOwner: TComponent);
begin inherited Create(AOwner); [i]MeineAnpassungen hier;[/i] end; 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 |
Re: Alter Proggramierer - neuer Schnick-Schnack: Klassen :-(
Zitat:
Ü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 19:40 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-2025 by Thomas Breitkreuz