AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Object-Pascal / Delphi-Language Delphi Self nicht definiert (Static Class Method)
Thema durchsuchen
Ansicht
Themen-Optionen

Self nicht definiert (Static Class Method)

Ein Thema von himitsu · begonnen am 17. Apr 2009 · letzter Beitrag vom 17. Apr 2009
Antwort Antwort
Benutzerbild von himitsu
himitsu

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

Self nicht definiert (Static Class Method)

  Alt 17. Apr 2009, 14:26
Sooo, ich hab nun lange gesucht und ich dachte schon ich spinne, denn bei Tests in neuen Anwendungen war es vorhanden

Am Ende konnte ich es dann doch noch auf das STATIC eingrenzen.
Bei allen Static-Class-Methoden ist Self nicht mehr vorhanden

Nur wie greif ich jetzt darauf zu?

Grund ist, daß ich den Klassentyp an eine Funktion übergeben wollte und das ohne den Typennamen direkt anzugeben, wegen der Fehlerresistenz (falls die Klasse mal umbenannt wird) und falls die Klasse mal abgeleitet wurde und die Ursprungsklasse ein Abkömling ist.

Außerdem kann ich andere Klassen-Prozeduren auch als über nichtqualifizierten Bezeichner direkt ansprechen, wonach doch etwas wie Self vorhanden sein muß?

Testcode:
Delphi-Quellcode:
type
  TMyClass = class
  private
    class procedure abc;
    class procedure xyz; static;
  end;

class procedure TMyClass.abc;
begin
  eineFunktion(Self); // kein Fehler, also Self existiert
end;

class procedure TMyClass.xyz;
begin
  abc; // kann auch ohne Pfad aufgerufen werden
  eineFunktion(Self); // [DCC Fehler] ...: E2003 Undeklarierter Bezeichner: 'Self'
  eineFunktion(TMyClass); // würde gehn, aber will ich nicht so machen
end;
[add]
ach ja, wer jetzt auf die Idee kommt mir vorzuschlagen das STATIC wegzulassen:
das geht nicht, da ich die entsprechende Klassenprozedur in meinem Projekt als Setter für eine Klassen-Property benötige und Delphi da nur Static-Prozeduren zuläßt.
$2B or not $2B
  Mit Zitat antworten Zitat
Benutzerbild von sirius
sirius

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

Re: Self nicht definiert (Static Class Method)

  Alt 17. Apr 2009, 14:38
Ich dachte bisher self existiert nirgends in einer class procedure
Du übergibst ja auch keinen Objektzeiger. Das ist ja der Sinn der Sache. Wo soll er also herkommen?

Edit nach kurzem Test:
Self zeigt ja bei einer Klassenmethode auf die Klasse (ist also nicht vom Typ TObject sondern von TClass).
Dieser Beitrag ist für Jugendliche unter 18 Jahren nicht geeignet.
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

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

Re: Self nicht definiert (Static Class Method)

  Alt 17. Apr 2009, 14:40
Self referenziert die aktuelle Instanz, die bei static ja nicht existiert.
Markus Kinzler
  Mit Zitat antworten Zitat
Benutzerbild von nicodex
nicodex

Registriert seit: 2. Jan 2008
Ort: Darmstadt
286 Beiträge
 
Delphi 2007 Professional
 
#4

Re: Self nicht definiert (Static Class Method)

  Alt 17. Apr 2009, 14:48
Zitat von sirius:
Ich dachte bisher self existiert nirgends in einer class procedure
Self referenziert dann die Klasse.
Delphi-Quellcode:
type
  TFoo = class
  public
    class function Bar(): string;
  end;

class function TFoo.Bar(): string;
begin
  Result := Self.ClassName;
end;
edit: zu spät
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

Re: Self nicht definiert (Static Class Method)

  Alt 17. Apr 2009, 14:57
Zitat von nicodex:
Self referenziert dann die Klasse.
Ja genau,

aber wie kann ich dann "schön" darauf zugreifen, ohne dan Klassennamen nun "Hartzucoden"?

Denn sowas geht na nun nicht
Delphi-Quellcode:
type
  TFoo = class
  strict private
    class var FValue: string;
  public
    class function Bar(): string; static;
  end;

class function TFoo.Bar(): string;
begin
  Result := Self.ClassName;
end;
$2B or not $2B
  Mit Zitat antworten Zitat
Benutzerbild von nicodex
nicodex

Registriert seit: 2. Jan 2008
Ort: Darmstadt
286 Beiträge
 
Delphi 2007 Professional
 
#6

Re: Self nicht definiert (Static Class Method)

  Alt 17. Apr 2009, 15:11
Zitat von himitsu:
aber wie kann ich dann "schön" darauf zugreifen, ohne dan Klassennamen nun "Hartzucoden"?
Ohne Self, da der Scope ohnehin die Klasse ist.
Delphi-Quellcode:
class function TFoo.Bar(): string; {static;}
begin
  Result := {TFoo.}ClassName;
end;
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

Re: Self nicht definiert (Static Class Method)

  Alt 17. Apr 2009, 15:27
ich möchte aber "Self" an eine Prozedur übergeben und wenn ich da "Nichts" eintrage, meckert Delphi rum
$2B or not $2B
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

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

Re: Self nicht definiert (Static Class Method)

  Alt 17. Apr 2009, 15:32
Und was soll diese mit der dann anstellen?
Markus Kinzler
  Mit Zitat antworten Zitat
Benutzerbild von Bernhard Geyer
Bernhard Geyer

Registriert seit: 13. Aug 2002
17.201 Beiträge
 
Delphi 10.4 Sydney
 
#9

Re: Self nicht definiert (Static Class Method)

  Alt 17. Apr 2009, 15:36
Zitat von himitsu:
ich möchte aber "Self" an eine Prozedur übergeben und wenn ich da "Nichts" eintrage, meckert Delphi rum
Brauchst/Willst du evtl Metaklassen?

Delphi-Quellcode:
type
  TMyClassClass = class of TMyClass;


function MyFunc(Var: TMyClassClass);


MyFunc(TMyClass)
Windows Vista - Eine neue Erfahrung in Fehlern.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

Re: Self nicht definiert (Static Class Method)

  Alt 17. Apr 2009, 15:43
Ich wollte praktisch endlich mal die Excetions in meinen XML-Klassen aufräumen
und im Prinzip wird aus der übergebenen Klasse bzw. dem Objekt nur Klassennamen (.ClassName) ausgelesen.

Delphi-Quellcode:
Type EXMLException = Class(Exception)
    Constructor CreateEx(FunctionsClass: TClass; ...
    Constructor CreateEx(FunctionsObject: TObject; ...
  End;

Class Procedure TXMLFile.SetDefaultValueQuotation(Const Value: TWideString);
  Begin
    If (Value <> '"') and (Value <> '''') and (Value <> '') Then
      Raise EXMLException.CreateEx(Self, 'DefaultValueQuotation', @SInvalidValue);
    __DefaultValueQuotation := Value;
  End;
Ja OK, ich könnte natürlich direkt den Namen übergeben, aber dann müßt ich überall
Raise EXMLException.CreateEx(Self.ClassName, ... hinschreiben ... mir gefällt aber die kürzere Variante besser, wo dann nur innerhalb des Konstruktors dieses ausgelesen würde


[add]
@Bernhard Geyer:
neee, nicht bei der Definition, sondern bei den Parametern
Delphi-Quellcode:
Raise EXMLException.CreateEx(Self, ...
// wenn ich sozusagen das Self. weglasse, dann kame sowas raus
Raise EXMLException.CreateEx(, ...
$2B or not $2B
  Mit Zitat antworten Zitat
Antwort Antwort


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 14: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