![]() |
Klassenmethoden in Delphi
Mannomann, manche Sprachkonzepte fallen mir immer noch schwer.
Wie definieren ich eine Klassenmethode, die eine Instanz der Klasse erzeugt, darauf arbeitet, eine Rückgabe erzeugt und das Objekt wieder freigibt? Ich habe bisher:
Delphi-Quellcode:
Wenn ich nun z.B. von der Hauptform aus mit
MyClass = class(TObject)
constructor Create; override; destructor Destroy; override; class procedure GetValues(var val1: string; var val2: string); end; class procedure MyClass.GetValues(var val1: string; var val2: string); var obj: MyClass; begin obj := MyClass.Create; val1 := obj.ClassName; val2 := 'irgendwas'; obj.free; end;
Delphi-Quellcode:
darauf zugreifen will, bekomme ich immer einen EVariantError (Ungültige Varianten-Typumwandlung).
MyClass.GetValues(s1, s2);
Kann mir jemand sagen, was ich da falsch gemacht habe? EDIT: Natürlich sind contructor und destructor korrekt implementiert, wenn ich das was ich aus der Klassenmethode heraus machen will direkt auf dem Objekt mache tut da auch. /EDIT |
Re: Klassenmethoden in Delphi
Moin Phoenix!
Dein Beispiel kannst Du so niemals compiliert haben. Das override hinter dem Constructor muss weg => Dann läuft die Kiste einwandfrei. Den Bock hast Du sicher an anderer Stelle geschossen, die Du den Augen der Allgemeinheit vorenthalten hast. :cyclops: Gruss OLLI |
Re: Klassenmethoden in Delphi
Hallo Phoenix,
vielleicht noch ein Tipp?
Delphi-Quellcode:
Der Vorteil: Sollte die Methode AMethodFromInstance eine virtuelle Methode sein und der Aufruf der Klassenmethode GetValues nicht an TMyClass sondern an einen Erben gerichtet sein, bei dem die Methode AMethodFromInstance überschrieben worden ist, würde wg der Polymorphie diese Überladene Methode aufrufen werden, weil ein Exemplar der geerbten Klasse erzeugt worden wäre.
class procedure TMyClass.GetValues(out AValue1, AValue2: string);
begin AValue1:= Self.ClassName; with Self.Create do try Result:= AMethodFromInstance; finally Free; end; end; Wäre das Exemplar in GetValues hingegen mit einer Konkreten Klasse erzeugt worden, also zB TMyClass.Create, würde stattdessen immer die dort implementierte Version von AMethodFromInstance aufgerufen werden... |
Re: Klassenmethoden in Delphi
Nein, das Override muss da hin, schliesslich ist meine orginal-Klasse auch nicht von TObject abgeleitet...
Wie ich schon geschriben habe: Constructor und destructor funktionieren einwandfrei, die Methoden die ich in der Klassenmethode brauche auch! Da kann der Fehler also nicht liegen. |
Re: Klassenmethoden in Delphi
Zitat:
mit TObject klappt das prima und die Exception EVariantError deutet auf einen Fehler in einem Abschnitt hin, den Du bisher nicht veröffentlich hast... |
Re: Klassenmethoden in Delphi
Delphi-Quellcode:
Aufruf:
MyClass: TObject;
public class procedure GetValues(var value1: string; var value2: string; const when: TDateTime = 0; const critaria: string = ''); end; class procedure MyClass.GetValues(var value1: string; var value2: string; const when: TDateTime = 0; const critaria: string = ''); begin // do nothing end;
Delphi-Quellcode:
So schaut das bei mir aus (mit dem unterschied, das ich bei do nothing einen etwas grösseren auskommentierten block habe, und die werte ein wenig anders heissen.
uses
UnitMyClass, SysUtils; var val1, val2, crit: string; begin crit := 'Test'; MyClass.GetValues(val1, val2, now, test); // hier gibts den fehler end; Also auch wenn die Methode leer ist, gibt es den EVariantError bereits beim aufruf. |
Re: Klassenmethoden in Delphi
Ist Test vielleicht vom Typ Variant?
|
Re: Klassenmethoden in Delphi
Diese Lösung scheint zu funktionieren
Delphi-Quellcode:
type
TMyClass = class(TObject) public class procedure GetValues(out AValue1, AValue2: string; const AWhen: TDateTime=0; const ACritaria: string=''); end; class procedure TMyClass.GetValues(out AValue1, AValue2: string; const AWhen: TDateTime; const ACritaria: string); begin AValue1:= '42'; AValue2:= 'I always knew there´s something wrong in the universe...'; end; procedure TForm1.Button1Click(Sender: TObject); var myString1: string; myString2: string; myCriteria: string; begin myCriteria:= 'What do you get if you multiply six by nine?'; TMyClass.GetValues(myString1, myString2, Now, myCriteria); Showmessage(myString1+#10#13+myString2); end; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 16:25 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