AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Object-Pascal / Delphi-Language Delphi Alter Proggramierer - neuer Schnick-Schnack: Klassen :-((
Thema durchsuchen
Ansicht
Themen-Optionen

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

Ein Thema von Uwe.F. · begonnen am 6. Jun 2007 · letzter Beitrag vom 7. Jun 2007
Antwort Antwort
Seite 1 von 2  1 2      
Uwe.F.

Registriert seit: 19. Apr 2005
56 Beiträge
 
Delphi 7 Enterprise
 
#1

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

  Alt 6. Jun 2007, 21:18
Hallo Zusammen,

als alter Programmierer kämpfe ich mal wieder mit den neumodischen mehr oder weniger sinnvollem Schnick-Schnack
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 ..."

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 Irgend jemand eine Idee?

Beste Grüße,
Uwe
Uwe
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.858 Beiträge
 
Delphi 11 Alexandria
 
#2

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

  Alt 6. Jun 2007, 21:20
HalfBandFilter := THBF.create(10, false);
Markus Kinzler
  Mit Zitat antworten Zitat
Apollonius

Registriert seit: 16. Apr 2007
2.325 Beiträge
 
Turbo Delphi für Win32
 
#3

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

  Alt 6. Jun 2007, 21:21
Außerdem im Konstruktor immer ganz am Anfang inherited create; aufrufen.
Wer erweist der Welt einen Dienst und findet ein gutes Synonym für "Pointer"?
"An interface pointer is a pointer to a pointer. This pointer points to an array of pointers, each of which points to an interface function."
  Mit Zitat antworten Zitat
Benutzerbild von Phoenix
Phoenix
(Moderator)

Registriert seit: 25. Jun 2002
Ort: Hausach
7.639 Beiträge
 
#4

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

  Alt 6. Jun 2007, 21:23
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
Sebastian Gingter
Phoenix - 不死鳥, Microsoft MVP, Rettungshundeführer
Über mich: Sebastian Gingter @ Thinktecture Mein Blog: https://gingter.org
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.858 Beiträge
 
Delphi 11 Alexandria
 
#5

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

  Alt 6. Jun 2007, 21:27
Zitat:
Ausnahmen: Klassenmethoden, aber die lassen wir für den Moment mal links liegen
Auch Konstruktoren sind eigentlich Klassenmethoden
Markus Kinzler
  Mit Zitat antworten Zitat
Apollonius

Registriert seit: 16. Apr 2007
2.325 Beiträge
 
Turbo Delphi für Win32
 
#6

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

  Alt 6. Jun 2007, 21:35
Zitat von mkinzler:
Zitat:
Ausnahmen: Klassenmethoden, aber die lassen wir für den Moment mal links liegen
Auch Konstruktoren sind eigentlich Klassenmethoden
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.
Wer erweist der Welt einen Dienst und findet ein gutes Synonym für "Pointer"?
"An interface pointer is a pointer to a pointer. This pointer points to an array of pointers, each of which points to an interface function."
  Mit Zitat antworten Zitat
Uwe.F.

Registriert seit: 19. Apr 2005
56 Beiträge
 
Delphi 7 Enterprise
 
#7

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

  Alt 6. Jun 2007, 22:07
Ihr seid genial !! Nach zwei Minuten die Lösung:

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

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

Aber das
Zitat:
Auch Konstruktoren sind eigentlich Klassenmethoden
lasse ich lieber links liegen

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.
Uwe
  Mit Zitat antworten Zitat
Benutzerbild von Jelly
Jelly

Registriert seit: 11. Apr 2003
Ort: Moestroff (Luxemburg)
3.741 Beiträge
 
Delphi 2007 Professional
 
#8

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

  Alt 6. Jun 2007, 22:13
Zitat von Uwe.F.:
Aber das
Zitat:
Auch Konstruktoren sind eigentlich Klassenmethoden
lasse ich lieber links liegen
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
THBF.Tuwas ; geht demnach nur, wenn Tuwas eine Klassenmethode ist.

Und wenn du diese Zeile mal mit
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.
  Mit Zitat antworten Zitat
Assertor

Registriert seit: 4. Feb 2006
Ort: Hamburg
1.296 Beiträge
 
Turbo C++
 
#9

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

  Alt 6. Jun 2007, 23:47
Hallo Uwe!

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!

Viel Spaß weiterhin mit Delphi!

Gruß winkel79
Frederik
  Mit Zitat antworten Zitat
jbg

Registriert seit: 12. Jun 2002
3.483 Beiträge
 
Delphi 10.1 Berlin Professional
 
#10

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

  Alt 7. Jun 2007, 00:38
Zitat von winkel79:
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.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:29 Uhr.
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