AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Object-Pascal / Delphi-Language Delphi Klassen-Funktion benutzen, ohne die Klasse zu erstellen

Klassen-Funktion benutzen, ohne die Klasse zu erstellen

Ein Thema von x000x · begonnen am 18. Nov 2010 · letzter Beitrag vom 19. Nov 2010
Antwort Antwort
Seite 1 von 3  1 23   
Benutzerbild von x000x
x000x

Registriert seit: 21. Jan 2004
Ort: Bei Hamburg
308 Beiträge
 
Delphi XE2 Professional
 
#1

Klassen-Funktion benutzen, ohne die Klasse zu erstellen

  Alt 18. Nov 2010, 09:41
Delphi-Version: 5
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.
Peter
-= Gruss Peter =-
-= alias x000x =-
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

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

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

  Alt 18. Nov 2010, 09:44
Klasenmethoden funktionieren unabhängig von Instanzen. allerdings handelt es sich in deinem Fall um eine normale Methode
Markus Kinzler
  Mit Zitat antworten Zitat
Benutzerbild von guinnes
guinnes

Registriert seit: 28. Feb 2007
Ort: Bottrop
265 Beiträge
 
Delphi 5 Enterprise
 
#3

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

  Alt 18. Nov 2010, 09:45
Du greifst auf keine Felder der Klasse zu, darum gehts. Dazu ist die Methode nicht virtuel.
Glückauf

Geändert von guinnes (18. Nov 2010 um 10:03 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von x000x
x000x

Registriert seit: 21. Jan 2004
Ort: Bei Hamburg
308 Beiträge
 
Delphi XE2 Professional
 
#4

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

  Alt 18. Nov 2010, 10:03
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 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
Peter
-= Gruss Peter =-
-= alias x000x =-
  Mit Zitat antworten Zitat
Benutzerbild von guinnes
guinnes

Registriert seit: 28. Feb 2007
Ort: Bottrop
265 Beiträge
 
Delphi 5 Enterprise
 
#5

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

  Alt 18. Nov 2010, 10:05
Werden denn beim Erstellen einer Instanz mit 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
Glückauf
  Mit Zitat antworten Zitat
Benutzerbild von x000x
x000x

Registriert seit: 21. Jan 2004
Ort: Bei Hamburg
308 Beiträge
 
Delphi XE2 Professional
 
#6

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

  Alt 18. Nov 2010, 10:15
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
Peter
-= Gruss Peter =-
-= alias x000x =-
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.017 Beiträge
 
Delphi 12 Athens
 
#7

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

  Alt 18. Nov 2010, 11:31
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.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Benutzerbild von x000x
x000x

Registriert seit: 21. Jan 2004
Ort: Bei Hamburg
308 Beiträge
 
Delphi XE2 Professional
 
#8

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

  Alt 18. Nov 2010, 11:52
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 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.
Peter
-= Gruss Peter =-
-= alias x000x =-
  Mit Zitat antworten Zitat
Medium

Registriert seit: 23. Jan 2008
3.679 Beiträge
 
Delphi 2007 Enterprise
 
#9

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

  Alt 18. Nov 2010, 12:12
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.
"When one person suffers from a delusion, it is called insanity. When a million people suffer from a delusion, it is called religion." (Richard Dawkins)
  Mit Zitat antworten Zitat
Benutzerbild von mleyen
mleyen

Registriert seit: 10. Aug 2007
609 Beiträge
 
FreePascal / Lazarus
 
#10

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

  Alt 18. Nov 2010, 12:17
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.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 3  1 23   

Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

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 09:15 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