AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Ist das schon Klasse?

Ein Thema von Gonzo2 · begonnen am 4. Nov 2007 · letzter Beitrag vom 6. Nov 2007
Antwort Antwort
Seite 1 von 2  1 2      
Gonzo2

Registriert seit: 4. Nov 2007
42 Beiträge
 
#1

Ist das schon Klasse?

  Alt 4. Nov 2007, 16:19
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?
  Mit Zitat antworten Zitat
Benutzerbild von Neutral General
Neutral General

Registriert seit: 16. Jan 2004
Ort: Bendorf
5.219 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#2

Re: Ist das schon Klasse?

  Alt 4. Nov 2007, 16:23
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
Michael
"Programmers talk about software development on weekends, vacations, and over meals not because they lack imagination,
but because their imagination reveals worlds that others cannot see."
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

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

Re: Ist das schon Klasse?

  Alt 4. Nov 2007, 16:25
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.
Markus Kinzler
  Mit Zitat antworten Zitat
Gonzo2

Registriert seit: 4. Nov 2007
42 Beiträge
 
#4

Re: Ist das schon Klasse?

  Alt 4. Nov 2007, 17:47
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.
  Mit Zitat antworten Zitat
Benutzerbild von Phoenix
Phoenix
(Moderator)

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

Re: Ist das schon Klasse?

  Alt 4. Nov 2007, 18:16
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.
Sebastian Gingter
Phoenix - 不死鳥, Microsoft MVP, Rettungshundeführer
Über mich: Sebastian Gingter @ Thinktecture Mein Blog: https://gingter.org
  Mit Zitat antworten Zitat
Benutzerbild von sirius
sirius

Registriert seit: 3. Jan 2007
Ort: Dresden
3.443 Beiträge
 
Delphi 7 Enterprise
 
#6

Re: Ist das schon Klasse?

  Alt 4. Nov 2007, 19:07
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.
Dieser Beitrag ist für Jugendliche unter 18 Jahren nicht geeignet.
  Mit Zitat antworten Zitat
dominikkv

Registriert seit: 30. Sep 2006
Ort: Gundelfingen
1.109 Beiträge
 
Delphi 2007 Professional
 
#7

Re: Ist das schon Klasse?

  Alt 4. Nov 2007, 19:29
Heißen die Variablen in Klassen nicht Felder?
Dominik
Wer anderen eine Grube gräbt, hat ein Gruben-Grab-Gerät!
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

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

Re: Ist das schon Klasse?

  Alt 4. Nov 2007, 19:34
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.
Markus Kinzler
  Mit Zitat antworten Zitat
Benutzerbild von idontwantaname
idontwantaname

Registriert seit: 31. Aug 2004
Ort: Traiskirchen
575 Beiträge
 
Turbo Delphi für Win32
 
#9

Re: Ist das schon Klasse?

  Alt 4. Nov 2007, 20:00
Ich verweise hier mal auf:
http://www.dsdt.info/grundlagen/sprache/oo.php
Oliver Hanappi
Besucht meine neue Homepage: http://oli.hux.de
  Mit Zitat antworten Zitat
Gonzo2

Registriert seit: 4. Nov 2007
42 Beiträge
 
#10

Re: Ist das schon Klasse?

  Alt 5. Nov 2007, 17:37
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?
  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 09:41 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