![]() |
Ist das schon Klasse?
Ich fange mit Delphi und Klassen erst an und verstehe noch nicht alles. Ist das hier schon eine Klasse?
Delphi-Quellcode:
type
TTestClass = class(TObject) public procedure Hallo(Sender: TObject); end; var Test: TTestClass; procedure TTestClass.Hallo(Sender: TObject); begin ShowMessage('Hallo Welt'); end;
Delphi-Quellcode:
Und was mich vor allem interessiert und ich mir nicht erklären kann, wenn das eine Klasse ist, wieso brauche ich kein Create? Das funktioniert zwar auch
procedure TForm1.Button1Click(Sender: TObject);
begin Test.Hallo(Sender); end;
Delphi-Quellcode:
aber brauchen tue ich es anscheinend nicht. Wenn ich mit einer Bitmap arbeiten will und sie ohne Create nutzen will, dann gibt es eine Fehlermeldung. Wieso kann ich hier eine Klasse sofort nutzen? Wieso kann ich hier Create nutzen, kann es aber auch lassen?
procedure TForm1.Button1Click(Sender: TObject);
begin Test := TTestClass.Create; Test.Hallo(Sender); Test.Free; end; |
Re: Ist das schon Klasse?
Hi,
Also. Ja das ist schon eine Klasse. Jedoch ist der Parameter der procedure Hallo unnötig. Lass ihn einfach weg. Du brauchst in diesem Fall kein Create weil du in TTestClass.Hallo auf keine Variablen/Properties von TTestClass zugreifst. Deswegen geht das ganze gut. Man sollte jedoch trotzdem immer eine Instanz seiner Klasse erstellen und freigeben. Gruß Neutral General |
Re: Ist das schon Klasse?
Ein(e) Klasse(ntyp) beschreibt nur die Eigenschaften, welche die Objekte (Instanzen der Klasse) später besitzen.
Du kannst dir das wie eine Form vorstellen, mit deren Hilfe später die Objekte erzeugt werden. Der Construktor erzeugt dann eine Instanz. Eine Klassenvariable ist nur eine Referenz (Zeiger) der anfänglich kein Objket referenziert. |
Re: Ist das schon Klasse?
Die Antworten beantworten meine Frage nicht ganz. Wäre das der übliche Weg
Test.Create; dann wäre meine Frage beantwortet. Müßte man Create aufrufen um paar Variablen zu vereinbaren, würde das da pben reichen und das wäre der übliche Weg. Aber man macht es so Test := TTestClass.Create; um Speicher für das Objekt zu resiervieren. So lernt man es zumindest. Bei dem zweiten Beispiel wird im Speicher Platz resierviert und Test bekommt die Adresse zugewiesen. Das verstehe ich. Wenn ich aber ohne Create sofort Test.Hallo(Sender); schreibe, dann hat Test noch keine Adresse. Es greift auf irgendwo zu. Es ist also nicht egal. Bei zweiten Beispiel wird Platz im Speicher zugewiesen und Test bekommt die Adresse. Beim ersten Beispiel wird irgendwas aufgerufen. Aber beides braucht man nicht um das dritte Beispiel fehlerfrei auszuführen. |
Re: Ist das schon Klasse?
Das ist relativ einfach erklärt:
Der Speicher für ein konkretes Objekt das aus einer Klasse mittels Create erstellt wird, beinhaltet 'nur' die Variablen dieses Objektes. Der ausführbare Code einer Klasse wird ja nicht für jedes Objekt in den Speicher kopiert, sondern der ausführbare Code existiert nur ein einziges mal. Sobald Du innerhalb des Codes einer Klasse auf Self, oder eine andere Variable zugreifst, erst dann greifst Du auf den Speicherbereich zu, der beim Create erzeugt wird. Greifst Du nicht auf Variablen der Klasse zu, und auch nicht auf 'Self', so benötigt der Code auch nicht den SPeicherbereich des Objektes und läuft fehlerfrei durch. Das ganze nennt sich dann eigentlich Klassen- bzw. auch Statische Methode. Also eine Methode, die man direkt auf der Klasse aufrufen kann, und dazu kein Objekt benötigt. Der Konstruktor Create ist technisch gesehen auch nur so eine solche statische Methode. |
Re: Ist das schon Klasse?
Zitat:
![]() Normalerweise stellt sich deine Frage nicht. eine Klasse hat immer Variablen, ansonsten bräuchte man keine Klasse. Daheraus ist ja erst das Prinzip der OOP entstanden. |
Re: Ist das schon Klasse?
Heißen die Variablen in Klassen nicht Felder?
|
Re: Ist das schon Klasse?
Ruft man einen Konstruktor nicht als klassenmethode sondern direkt im Objekt auf, so ist eine normale Methode. Bei einer Variable, welche nicht auf eine gültiges Objekt zeigt, kann dass dann aber zu Zugriffverletzungen führen.
|
Re: Ist das schon Klasse?
|
Re: Ist das schon Klasse?
Ich glaube nur Phoenix hat so richtig verstanden um was es mir in der Frage ging. Die anderen Antworten gehen mehr in Richtung - was ist Create und was ist der Unterschied wenn ich es so mache oder so.
Mir geht es um die Frage wieso ich kein Create bei meiner Nutzung der Klasse brauche. Das ist das Wichtige an meiner Frage. Ich hab mir vorher schon einiges durchgelesen und weiß wie man es machen sollte. Was ich jetzt nur noch wissen will ist, wieso dies und das trotzdem funktioniert. Wieso funktionieren einige Außnahmen. Das ist mir für das Verständnis wichtig. Sirius schrieb, daß sich die Frage eigentlich garnicht stellt, denn was kann man mit sowas schon anfangen? Also da gibt es genug Möglichkeiten, z.b. dann, wenn man keine Prozedur, sondern nur ein Objekt zuweisen kann, aber eine Prozedur aufrufen will. So wie ich Phoenix verstanden habe wird die Klasse nur einmal mit dem Programm zusammen in den Speicher geladen und mit Create wird ein Speicherbreich reserviert in dem die Daten des Objekts der Klasse gespeichert werden. Und da ich in meinem Beispiel nur eine Prozedur aufrufe und keine Daten nutze, kann ich mit der Klasse direkt arbeiten ohne ein Objekt bzw. einen Speicherbreich anzulegen. Stimmt das soweit? Natürlich gehe ich davon aus, daß mit Variablen nicht die lokalen Variablen der Prozedur gemeint sind, dann das funktioniert auch ohne Create fehlerfrei:
Delphi-Quellcode:
Weitere Test haben gezeigt, daß erst das hier nicht funktioniert:
procedure TTestClass.Hallo(Sender: TObject);
var a, b: Integer; s: String; begin a := Random(10); b := Random(10); s := IntToStr(a+b); ShowMessage('Hallo Welt '+s); end;
Delphi-Quellcode:
type
TTestClass2 = class(TObject) public FString: String; procedure Hallo(Sender: TObject); end; var Test2: TTestClass2;
Delphi-Quellcode:
Das auch nicht
procedure TTestClass2.Hallo(Sender: TObject);
begin FString := 'Hallo Welt'; ShowMessage(FString); end;
Delphi-Quellcode:
Kann man also sagen, daß, der korrekte Weg mit Klassen zu arbeiten der ist ein Objekt über Create anzulegen, aber soweit es nur um die Nutzung eine Prozedur ist, das Ganze auch ohne Create und Free geht?
procedure TForm1.Button4Click(Sender: TObject);
begin Test2.FString := 'Hallo Welt'; Test2.Hallo(Sender); end; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 11:26 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 by Thomas Breitkreuz