Delphi-PRAXiS
Seite 1 von 3  1 23      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Klassen-Funktion benutzen, ohne die Klasse zu erstellen (https://www.delphipraxis.net/156049-klassen-funktion-benutzen-ohne-die-klasse-zu-erstellen.html)

x000x 18. Nov 2010 08:41

Delphi-Version: 5

Klassen-Funktion benutzen, ohne die Klasse zu erstellen
 
Moin moin,

ich habe folgende Dummy Klasse und wundere mich gerade, warum das funktioniert. Ich hätte gerne gewusst warum so etwas funktioniert.
Beim debuggen ist FTest = nil und trotzdem gibt es keine Zugriffsverletzung und die Klassenfunktion wird ausgeführt.

Das dieses wohl nicht wirklich Sinn macht ist mir schon klar, mir geht es einzig nur darum, warum das funktioniert?!
Könnte mir das bitte jemand erklären?

Delphi-Quellcode:
unit Unit1;

interface

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

type
   TDummyClass = class
   public
      procedure Test(var paStrString : String);
   end;

type
  TForm1 = class(TForm)
    btn: TButton;
    procedure btnClick(Sender: TObject);
  private
    { Private-Deklarationen }
    FTest: TDummyClass;
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;


implementation

{$R *.DFM}

procedure TForm1.btnClick(Sender: TObject);
var
   str: String;
begin
   str := 'Test';
   FTest.Test(str);
   ShowMessage(str);
end;

{ TDummyClass }

procedure TDummyClass.Test(var paStrString: String);
begin
   paStrString := paStrString + 'JA';
end;

end.

mkinzler 18. Nov 2010 08:44

AW: Klassen-Funktion benutzen, ohne die Klasse zu erstellen
 
Klasenmethoden funktionieren unabhängig von Instanzen. allerdings handelt es sich in deinem Fall um eine normale Methode

guinnes 18. Nov 2010 08:45

AW: Klassen-Funktion benutzen, ohne die Klasse zu erstellen
 
Du greifst auf keine Felder der Klasse zu, darum gehts. Dazu ist die Methode nicht virtuel.

x000x 18. Nov 2010 09:03

AW: Klassen-Funktion benutzen, ohne die Klasse zu erstellen
 
Zitat:

Zitat von mkinzler (Beitrag 1062270)
Klasenmethoden funktionieren unabhängig von Instanzen. allerdings handelt es sich in deinem Fall um eine normale Methode

Ja, das ist mir bekannt - dann hätte ich class davor schreiben müssen und der Aufruf wäre dann TDummyClass.Test. Das steht dort aber nicht und trotzdem funktionierts.

Werden denn beim Erstellen einer Instanz mit
Delphi-Quellcode:
FTest:= TDummyClass.Create;
nur die Felder initialisiert? Vermutlich ja, dann macht das auch Sinn das es funktioniert.
Sobald ich dann aber auf Felder der Klasse zugreife, dann knallts.

Ok, ich denke ich verstehe... Vielen Dank

guinnes 18. Nov 2010 09:05

AW: Klassen-Funktion benutzen, ohne die Klasse zu erstellen
 
Zitat:

Zitat von x000x (Beitrag 1062275)
Werden denn beim Erstellen einer Instanz mit
Delphi-Quellcode:
FTest:= TDummyClass.Create;
nur die Felder initialisiert?

Es wird auch die Adresse der VMT in die Instanz kopiert. Darum geht ein Zugriff auf eine Virtuelle Methode ohne Create auch schief

x000x 18. Nov 2010 09:15

AW: Klassen-Funktion benutzen, ohne die Klasse zu erstellen
 
Zitat:

Zitat von guinnes (Beitrag 1062276)
Es wird auch die Adresse der VMT in die Instanz kopiert. Darum geht ein Zugriff auf eine Virtuelle Methode ohne Create auch schief

Ok, danke

himitsu 18. Nov 2010 10:31

AW: Klassen-Funktion benutzen, ohne die Klasse zu erstellen
 
Zitat:

Zitat von guinnes (Beitrag 1062276)
Es wird auch die Adresse der VMT in die Instanz kopiert. Darum geht ein Zugriff auf eine Virtuelle Methode ohne Create auch schief

Es wird auch der Speicher für die Klasse erstellt, worin die Felder liegen.

PS: Das Ganze ist ein klassisches Beispiel, für eine Klassenmethode, welche man ohne Instanz nutzen kann.
Delphi-Quellcode:
TDummyClass = class
public
  class procedure Test(var paStrString: String);
end;


TDummyClass.Test(xxx);
Also, wie vielleicht aus den Beiträgen ersichtlich war, ist dein Code rein zufällig gelaufen ... besser wäre eine Klassenmethode gewesen.

x000x 18. Nov 2010 10:52

AW: Klassen-Funktion benutzen, ohne die Klasse zu erstellen
 
Zitat:

Zitat von himitsu (Beitrag 1062288)
Also, wie vielleicht aus den Beiträgen ersichtlich war, ist dein Code rein zufällig gelaufen ... besser wäre eine Klassenmethode gewesen.

Warum zufällig? Zufällig heisst doch, dass es mal funktioniert und mal nicht?! Das Beispiel funktioniert immer (solange halt in der klassenmethode keine Felder der Klasse benutzt werden)

Ein Kollege hat mich darauf angesprochen und ich war der Meinung, dass es nicht funktionieren kann - da ja keine Instanz erzeugt wurde. Und ich wurde eines besseren belehrt.
Das Code-Beispiel aus dem ersten Post ist meiner Meinung nach nicht zu verwenden, da es z.b. bei Programmpflege durch mehrere Programmierer zu Fehlern kommen wird.

Eigentlich dürfte so etwas
Delphi-Quellcode:
FTest.Test(str);
ohne erzeugen einer Instanz von Haus aus gar nicht funktionieren - denn wie bereits geschrieben bekommt man das gleiche Verhalten
durch Klassenmethoden erreicht und ist damit auf der sicheren Seite was die Pflege von Programmen angeht.

Medium 18. Nov 2010 11:12

AW: Klassen-Funktion benutzen, ohne die Klasse zu erstellen
 
Es dürfte laut Paradigma nicht gehen. Es geht dennoch, weil nichtvirtuelle Methoden stets nur in der Klassendeklaration stehen, und auch Instanzen immer nur auf diese verweisen - sie werden nicht pro Instanz immer wieder kopiert. Die Theorie verbietet hier etwas, was technisch kein Problem wäre, jedoch zu welchen führen kann. Dass dies vom Compiler nicht bemeckert wird, sollte daher als Bug angesehen werden.

mleyen 18. Nov 2010 11:17

AW: Klassen-Funktion benutzen, ohne die Klasse zu erstellen
 
Zitat:

Zitat von Medium (Beitrag 1062301)
Dass dies vom Compiler nicht bemeckert wird, sollte daher als Bug angesehen werden.

Du meinst vom Debugger, nicht? Der Compiler weiß ja nicht obs da instanziert ist.


Alle Zeitangaben in WEZ +1. Es ist jetzt 08:42 Uhr.
Seite 1 von 3  1 23      

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