![]() |
Re: Type-Problem
Zitat:
Die Setter/Getter Methode .SetParam() und .GetParam() sind deshalb virtuell weil der Entwickler die Möglichkeit hat ZWEI verschiedene Implementierungswege einzuschlagen. 1.) direkte Auswertung in den Getter/Setter Methoden der übergebenen Parameter. Das ist das was du in deiner .SetParam() Methode mit Label1.Caption := Data; gemacht hast. Du wertest den Parameter Index/Name garnicht selektiv aus. 2.) automatische Auswertung über Properties die über TypInfo und Variants erfolgt. DU hast also in deine Methode .GetParam() die Methode 2. gewählt ohne jedoch eine Property "Test" zu deklarieren. Im Setter .SetParam() wählst du Methode 1. und damit mischt du zwei grunverschiedene Implementierungswege. Die übrigens nur ein Vorschlag meinerseits waren. Gruß Hagen |
Re: Type-Problem
Zitat:
Zitat:
|
Re: Type-Problem
Die Delphi5-Hilfe enthält an dieser Stelle offenbar einen (Übersetzungs?)Fehler.
Zitat:
Zitat:
|
Re: Type-Problem
Ok, dann ist alles klar. Das mit dem überladen ist ja auch vollkommen nachvollziehbar. Ok, danke, dann wäre das geklärt. Nun ja, die Änderungen habe ich an dem Projekt nun schon gemacht, aber bei nächsten Projekten kann ich dann wieder virtuelle Getter/Setter nutzen (die ja, wie gesagt, einwandfrei funktioniert hatten - daher war ich damals recht erstaunt dies zu lesen).
|
Re: Type-Problem
Hallo Hagen,
danke für deine Antwort. Zitat:
Hier mal meine beiden Funktionen:
Delphi-Quellcode:
{Lade übergebene Variable}
function TModulForm.GetParam(const Name: String): Variant; begin Result := TypInfo.GetVariantProp(Self, Name); end; {Setze zu übergebende Variable} procedure TModulForm.SetParam(const Name: String;const Data: Variant); begin TypInfo.SetVariantProp(Self, Name, Data); end; Zitat:
Nun funktioniert das soweit mit Zahlen und Boolschen Properties. Aber bei Strings gibt mir Delphi beim Beenden des Programmes eine Zugriffsverletzung aus. 1. In der MainForm (Anker-Unit) rufe ich nach dem erstellen des Formulars des Moduls diesen Code auf: modul1.SetParam('VarString', 'Stringübergabe'); 2. Im Modul ist das ganze so deklariert:
Delphi-Quellcode:
Ich sehe dort keinen Fehler und trotzdem kommt eine EAccessViolation in module rtl100.bpl
TModulForm1 = class(TModulForm)
protected function GetParam(const Name: String): Variant; override; procedure SetParam(const Name: String;const Data: Variant); override; private //Deklarierung der Parameter für GetParam und SetParam FVarString : String; published //Deklarierung der Parameter für GetParam und SetParam property VarString : String read FVarString write FVarString; end; {...} function TModulForm1.GetParam(const Name: String): Variant; begin Result := inherited GetParam(Name); end; procedure TModulForm1.SetParam(const Name: String;const Data: Variant); begin // da wir das schon in der Basisklasse getan haben also einfach inherited SetParam(Name, Data); end; {...} //Aufruf erfolgt per Button in ein Label bfAusgabe.Caption := GetParam('VarString'); Kommt aber nur, sofern ich SetParam ausgeführt habe! Wenn ich nur GetParam ausführe und das Programm beende, kommt keine Fehlermeldung. Desweiteren bin ich noch am tüfteln, wie ich z.B. per Button im Modul die Caption des Moduls ändere. Man könnte Caption := 'Neuer Modultitel'; schreiben, aber wie kann ich das über den Modulnamen + Caption machen (in Form von Modulname.Caption) ? Vielen Dank für die Hilfe gruß Timelesk |
Re: Type-Problem
;) das meinte ich mit "traue niemals Leuten die nicht vom Fach sind". EIn Übersetzer versteht garnicht was er da übersetzt und der verantwortliche "Programmierer" hat garnicht die Zeit alles ins kleinste Detail zu überprüfen.
Deshalb zählen im Grunde die Dokumentationen in Form eines Sourcecodes, und es ist meine erste "Amtshandlung", wenn ich eine neue Delphi version bekomme, deren RTL Source zu lesen. Deshalb weis ich definitiv das Unit TypInfo.pas von allen Delphiversionen der Zugriff auf Property per RTTI virtuelle Methoden unterstützen. Überladene Methoden (overload) können bei Property nicht gehen, warum auch. Das würde bedeuten das das nur Sinn macht wenn man auch überladene Properties deklararien könnte. Das macht höchstens Sinn bei indizierten Array[] Properties. da nur bei deren Getter/Setter ein Parameter zur eindeutigen Indentifizierung des overloads vorhanden ist. Bekannntlich kann Delphi ja keine Overloads auf Funktionen in deren Parametersignatur nur der Resulttype unterschiedlich ist. Das würde auf normale Getter/Setter Methoden dann zutreffen. Wenn ichs mir aber recht überlege, dann wären überladene indizierbare Properties garnichtmal so schlecht. Sowas ginge dann
Delphi-Quellcode:
Hm, andererseits nimmt man dann halt einen Variant als Index.
type
THashTable = class private function GetItem(const Index: String): THashItem; virtual; overload; function GetItem(const Index: Int64): THashItem; virtual; overload; ... public property Item[const Index: String]: THashItem read GetItem write SetItem; overload; property Item[const Index: Int64]: THashItem read GetItem write SetItem; overload; end; Gruß Hagen |
Re: Type-Problem
Gut, denn
Zitat:
Vermutung meinerseits wäre es: a.) .SetParam('VarString', xyz); achte mal darauf das der Name der Property exakt ist. Das sollte eigentlich egal sein ob man Groß/Klein schreibt aber man weis ja nie was Borland so alles in den Units verändert mit den Versionen. b.) FormVariable.SetParam(); achte darauf das FormVariable auch ein gültiges TForm enthält c.) Unit Variants eventuell "schei.e" ? So oft arbeite ich nicht mit Varianten, aber ichw eis das je nach Delphiversionen es so einige Probleme geben sollte. Ich vermeide sie deshalb. Aber in Bezug auf mein Beispeil wäre sie die flexibelste Alternative. Ehrlicherweise muß ich zugeben das mein Beispiel aus den Erfahrungen eines parellelen Entwicktungsprozesses meines eigenen Modulsystemes entstand. Gruß Hagen |
Re: Type-Problem
Hallo Hagen,
vielen Dank für die schneller Antwort. Ich habe nun einfach mal in der TypInfo nach Variant gesucht und herausgefunden, dass die Funktionen GetPropValue und SetPropValue ebenfalls mit Varianten arbeiten und siehe da: Es funktioniert mit Strings! Zitat:
Und genau das ist ja mein Problem: im Hauptformular (in der auch die abgeleitete Klasse steht) wird ja das Package geladen und die Form über CreateModuleForm erstellt:
Delphi-Quellcode:
Jetzt kann ich von der Hauptform aus modul1.WindowState := wsMaximized schreiben und das klappt auch ganz schön :)
var modul1: TModulForm;
begin {...} modul1 := CreateModuleForm('TModulForm1'); end; Aber im Modul selbst, wie kann ich dort das Formular ansprechen? modul1 ist dort ja nicht registriert und wenn ich einfach ne Variable registrier ModulForm1 : TModulForm1, dann ist das ja nicht die Variable, welche auf mein Modul-Formular zeigt und ändert dementsprechend auch nichts ab. Aber genau das möchte ich erreichen, dass ich im Modul selbst das Formular des Moduls ansprechen kann. Ich hoffe, das war jetzt verständlich ;) Vielen Dank gruß Timelesk |
Re: Type-Problem
Im Modul selber greifst du OOP konform zu, dh. immer über Self. Niemals über die globale Variable ModulForm1: TModulForm1, da diese ja garnicht mehr benutzt wird und zudem ist der Zugriff, egal ob Modulbasiert oder in normalen Delphi Anwendung, über diese Variable generell kontraproduktiv. Wenn man sowas denoch benötigt muß man sich eben bessere Wege einfallen lassen als Programierer. Denn benutzt man diese Variable dann verhindert man damit das multiple Erzeugen von mehreren Formularen der gleichen Instanz.
Gruß Hagen |
Alle Zeitangaben in WEZ +1. Es ist jetzt 06:19 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