![]() |
Re: Ist das schon Klasse?
Du hast aber die anderen beiträge nicht gelesen, sonst wäre dir die Antwort klar. Ruft man Methoden auf die Klasse auf, werden diese als Klassenmethoden ausgeführt, das Funktioniert solange man nicht auf Member der Klasse zugreift. Existiert keine Instanz, existieren diese auch nicht.
|
Re: Ist das schon Klasse?
Zitat:
Zitat:
Zitat:
![]() Wenn Du eine solche Prozedur / Funktion so baust, dass sie ohne die Felder der Klasse auskommt - also den Speicherbereich für die Variablen nicht benötigt - dann solltest Du sie auch als eine Klassenmethode deklarieren. Wenn Du bei Deinem funktionierenden Beispiel also noch das Schlüsselwort class vor die Methode schreibst, dann ist alles in Butter. |
Re: Ist das schon Klasse?
Zitat:
Zitat:
Dann wäre also das hier der richtige Weg?
Delphi-Quellcode:
Das Problem und vor allem der große Unterschied scheint mir zu sein, daß ich es dann nicht über eine Variable machen kann
type
TTestClass3 = class public class procedure Hallo; end; class procedure TTestClass3.Hallo; begin ShowMessage('Beispiel 3'); end;
Delphi-Quellcode:
Funktioniert nicht
var
Test3: TTestClass3;
Delphi-Quellcode:
Funktioniert
procedure TForm1.Button1Click(Sender: TObject);
begin Test3.Hallo; end;
Delphi-Quellcode:
Funktioniert
procedure TForm1.Button1Click(Sender: TObject);
begin TTestClass3.Hallo; end;
Delphi-Quellcode:
Somit habe ich entweder das alte Problem oder nicht 100% das Gleiche, denn entweder nutze ich die Klassenmethode, dann gehe ich nicht über ein Objekt, sondern über die Klasse, so habe ich es zumindest aus den in den Links beschriebenen Kursen verstenden, muß aber die Klasse davorschreiben, oder ich nutze Create. Es ist dann doch ein kleiner Unterschied zu dem ersten Beispiel von mir in dem ich es weder als Klassenmethode deklariert habe, dafür abe ohne Create mit der Variable auf dei Prozedur zugegriffen habe.
procedure TForm1.Button1Click(Sender: TObject);
begin Test3 := TTestClass3.Create; Test3.Hallo; Test3.Free; end; Ich weiß, ich bin eine Klette am A., aber ich würde es gerne 100% und ohne einen Hauch Zweifel verstehen. |
Re: Ist das schon Klasse?
Ich hatte den Vergleich mit einer (Guss-)Form gewählt, um den Vorgang allgemein zu beschreiben. Leider kann man den genauen Unterschied deiner beiden Beispiel nur erklären, wenn man etwas ins Detail geht. Eine (Objekt-)Methode wird immer auf eine Instanz einer Klasse angewendet, eine Klassenmethode auf die Klasse. Ein Konstruktor ist eine Kllassenmethode, da er ja eine Instanz erstellt; dh.h vor dem Aufruf gibt es diese ja noch nicht. In Delphi kann man aber Konstruktoren auch auf Objekte anwende, dann erstellen sie keine Instanzen, sondern setzen nur Eigenschaften.
|
Re: Ist das schon Klasse?
Zitat:
Dir fehlt glaub ich noch ein klein wenig Hintergrundinfo. Also ganz grob:
Delphi-Quellcode:
erstellt einen Bereich im Speicher, der einen Pointer aufnehmen kann. Das Ding hat aber erstmal einen ungültigen Wert.
var
objektvariable: TKlasse;
Delphi-Quellcode:
erstellt zuallererstmal einen Bereich im Speicher für das neue Objekt dieser Klasse - und gibt einen Pointer auf dieses Objekt zurück. Der Code im Konstruktur wird dann ausgeführt, wobei 'Self' auch auf den Objektspeicher zeigt. In diesem Objektspeicher ist allerdings nicht nur ausschliesslich der Platz für die Variablen (Felder) des Objektes reserviert. In diesem Objektspeicher ist auch ein Pointer auf den Codebereich der Klasse hinterlegt. Erst jetzt zeigt die objektvariable auf ein vollständiges gültiges Objekt.
objektvariable := TKlasse.Create();
Das hat folgenden Hintergrund:
Delphi-Quellcode:
Es wird auf eine Objektvariable ein Objekt erzeugt, das gar nicht dieses Objekt ist, sondern davon abgeleitet wurde. Das ganze nennt sich Kovarianz. Das funktioniert, weil TLabel ja alle Eigenschaften von TControl erbt.
var
control: TControl; begin control := TLabel.Create(self); // Label erzeugt, aber auf Control zugewiesen control.Parent := self; if control is TLabel then begin TLabel(control).Caption := 'Wuppdi'; end; end; Weil ja Om objektspeicher auch ein Verweis auf die eigentliche Klasse steckt, funktioniert die Abfrage ob das control ein Label ist und auch der Cast. Aus genau dem Grund kann Dein Beispiel
Delphi-Quellcode:
nicht funktionieren: objektvariable KÖNNTE ja auf eine TKlasse zeigen - oder aber auch auf ein TIrgendwasAbgeleitetVonTKlasse. Da das der computer ja nicht wissen kann müsste er auf jeden Fall erstmal in das Objekt reingucken was hier referenziert wird um dann die richtige Methode auszuführen. Machwas() könnte in einer Ableitung ja auch überschrieben worden sein.
var
objektvariable: TKlasse; begin objektvariable.Machwas(); end; Der Aufruf direkt auf der Klasse muss funktionieren, weil hier ja keine andere Klasse in Frage kommen kann. Wenn Du wie in Deinem letzten Beispiel ein konkretes Objekt erzeugst ist damit auch die entsprechende Klasse festgelegt - und damit auch klar, welcher Code dahintersteckt. |
Re: Ist das schon Klasse?
Zitat:
Sowas liegt immer an ungenauen / schlecht formulierten Fragen :zwinker: Und jeder sieht ja, was die vorhergehenden geschrieben haben und wiederholen es natürlich nicht. Sondern sie versuchen noch in eine andere Richtung zu denken, frei nach: "Was könnte der User gemeint haben?" |
Alle Zeitangaben in WEZ +1. Es ist jetzt 08:22 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