Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Ist das schon Klasse? (https://www.delphipraxis.net/102771-ist-das-schon-klasse.html)

Gonzo2 4. Nov 2007 15:19


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:
procedure TForm1.Button1Click(Sender: TObject);
begin
  Test.Hallo(Sender);
end;
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

Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
begin
  Test := TTestClass.Create;
  Test.Hallo(Sender);
  Test.Free;
end;
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?

Neutral General 4. Nov 2007 15:23

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

mkinzler 4. Nov 2007 15:25

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.

Gonzo2 4. Nov 2007 16:47

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.

Phoenix 4. Nov 2007 17:16

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.

sirius 4. Nov 2007 18:07

Re: Ist das schon Klasse?
 
Zitat:

Zitat von Gonzo2
Test.Create; //Nur Aufruf des constructors ohne Speicherreservierung.

...

Test := TTestClass.Create; //Aufruf des Constructors und Speicherreservierung

Link

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.

dominikkv 4. Nov 2007 18:29

Re: Ist das schon Klasse?
 
Heißen die Variablen in Klassen nicht Felder?

mkinzler 4. Nov 2007 18:34

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.

idontwantaname 4. Nov 2007 19:00

Re: Ist das schon Klasse?
 
Ich verweise hier mal auf:
http://www.dsdt.info/grundlagen/sprache/oo.php

Gonzo2 5. Nov 2007 16:37

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:
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;
Weitere Test haben gezeigt, daß erst das hier nicht funktioniert:

Delphi-Quellcode:
type
  TTestClass2 = class(TObject)
  public
    FString: String;
    procedure Hallo(Sender: TObject);
  end;

var
  Test2: TTestClass2;
Delphi-Quellcode:
procedure TTestClass2.Hallo(Sender: TObject);
begin
  FString := 'Hallo Welt';

  ShowMessage(FString);
end;
Das auch nicht

Delphi-Quellcode:
procedure TForm1.Button4Click(Sender: TObject);
begin
  Test2.FString := 'Hallo Welt';
  Test2.Hallo(Sender);
end;
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?


Alle Zeitangaben in WEZ +1. Es ist jetzt 06:25 Uhr.
Seite 1 von 2  1 2      

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