![]() |
Self nicht definiert (Static Class Method)
Sooo, ich hab nun lange gesucht und ich dachte schon ich spinne, denn bei Tests in neuen Anwendungen war es vorhanden :wall:
Am Ende konnte ich es dann doch noch auf das STATIC eingrenzen. Bei allen Static-Class-Methoden ist Self nicht mehr vorhanden :cry: 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:
[add]
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; 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. |
Re: Self nicht definiert (Static Class Method)
Ich dachte bisher self existiert nirgends in einer class procedure :gruebel:
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). |
Re: Self nicht definiert (Static Class Method)
Self referenziert die aktuelle Instanz, die bei static ja nicht existiert.
|
Re: Self nicht definiert (Static Class Method)
Zitat:
Delphi-Quellcode:
edit: zu spät :)
type
TFoo = class public class function Bar(): string; end; class function TFoo.Bar(): string; begin Result := Self.ClassName; end; |
Re: Self nicht definiert (Static Class Method)
Zitat:
aber wie kann ich dann "schön" darauf zugreifen, ohne dan Klassennamen nun "Hartzucoden"? Denn sowas geht na nun nicht :cry:
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; |
Re: Self nicht definiert (Static Class Method)
Zitat:
Delphi-Quellcode:
class function TFoo.Bar(): string; {static;}
begin Result := {TFoo.}ClassName; end; |
Re: Self nicht definiert (Static Class Method)
ich möchte aber "Self" an eine Prozedur übergeben und wenn ich da "Nichts" eintrage, meckert Delphi rum :angel2:
|
Re: Self nicht definiert (Static Class Method)
Und was soll diese mit der dann anstellen?
|
Re: Self nicht definiert (Static Class Method)
Zitat:
Delphi-Quellcode:
type
TMyClassClass = class of TMyClass; function MyFunc(Var: TMyClassClass); MyFunc(TMyClass) |
Re: Self nicht definiert (Static Class Method)
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:
Ja OK, ich könnte natürlich direkt den Namen übergeben, aber dann müßt ich überall
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;
Delphi-Quellcode:
hinschreiben ... mir gefällt aber die kürzere Variante besser, wo dann nur innerhalb des Konstruktors dieses ausgelesen würde :stupid:
Raise EXMLException.CreateEx(Self.ClassName, ...
[add] @Bernhard Geyer: neee, nicht bei der Definition, sondern bei den Parametern :zwinker:
Delphi-Quellcode:
Raise EXMLException.CreateEx(Self, ...
// wenn ich sozusagen das Self. weglasse, dann kame sowas raus Raise EXMLException.CreateEx(, ... |
Alle Zeitangaben in WEZ +1. Es ist jetzt 17:35 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-2025 by Thomas Breitkreuz