AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Property überschreiben?

Ein Thema von Prototypjack · begonnen am 26. Jan 2008 · letzter Beitrag vom 26. Jan 2008
Antwort Antwort
Prototypjack

Registriert seit: 2. Feb 2003
611 Beiträge
 
Delphi 2009 Professional
 
#1

Property überschreiben?

  Alt 26. Jan 2008, 13:26
Moin,

Ich bastle mir gerade eine Unit für das Arbeiten mit Vista unter dem BDS 2006 und bin gerade dabei die Open und Save-Dialogs anzupassen.
Da das ganze so transparent wie möglich laufen soll, versuche ich durch eine Prozedur, die alle OpenDialogs auf einmal ummünzt, diesen Teil auf Vista anzupassen, aber für den Entwickler sollen sich die Dialoge trotzdem wie ganz normale TOpenDialogs verhalten.

Ich dachte zuerst daran eine Helper-Class zu bauen, aber das scheint nicht wirklich zu funktionieren, dann dachte ich mir, ich könnte vielleicht die DoExecute (das ist die kritische Funktion) zu hooken und zu verändern, aber das scheint ebenfalls nicht zu funktionieren, weil ich keinen Zugriff auf die Properties der Original-Instanz des Dialoges habe (von der gehookten Methode aus).

Also entschied ich mich dafür eine Klasse davon abzuleiten und alle Parameter und Funktionen die ich verändern muss neu zu deklarieren und zu bearbeiten, das funktioniert auch soweit.

Da die abgeleitete Klasse direkt von TOpenDialog abstammt, kann ich später die Original-Instanz des Entwicklers vollkommen unsichtbar austauschen und trotzdem alle Funktionen behalten.

Delphi-Quellcode:
var
  lOpn: TOpenDialogVista;
begin
  lOpn := TOpenDialogVista.Create(Self);
  lOpn.Assign(OpenDialog1);
  OpenDialog1 := lOpn;
  OpenDialog1.Execute;
  ShowMessage(OpenDialog1.FileName);
Alles funktioniert bis hin zum Execute perfekt, der neue Dialog wird angezeigt, obwohl ich augenscheinlich auf eine normale TOpenDialog-Instanz zugreife.

Das Problem entsteht erst bei OpenDialog1.FileName. Denn anders als mit der überschriebenen Methode Execute wird hier die Property nicht überschrieben, sondern, sobald ich das ganze als TOpenDialog gecastet habe, wird die Property der Basis-Instanz angezeigt (die logischerweise leer ist, da Execute durch den Override ja von der neuen Klasse bearbeitet wird). Wenn ich jetzt aber lOpn.FileName schreiben würde, hätte ich den richtigen Filename.

Jetzt die Frage:

Wieso greift er auf das Property der Basisklasse zu (obwohl ich es mit neuen Getter und Setter Routinen ausgestattet habe)? Es ist schon alleine merkwürdig, dass das nicht funktioniert, aber viel mehr ist es einfach ärgerlich, dass mir der Compiler hier nicht die geringste Warnung ausgibt und ich gerade eine geschlagene Stunde suchen musste, warum Filename gleich '' ist.


Kann dieser Ansatz überhaupt funktionieren? Wenn nein, gibt es eine Möglichkeit, wie ich das ganze dennoch möglich transparent realisieren kann (also die Vista-Dialoge unterstützen)?

Denn irgendeinen Ansatz muss es ja geben, schließlich müssen es die CodeGear Programmierer ja auch geschafft haben, denn soweit ich mich erinnern kann ist das release ja Non-Breaking und deshalb dürfte sich zumindest der original TOpenDialog-Source ja nicht von dem vom BDS 2006 unterscheiden, oder?

Danke schonmal & Grüße,
Max
Max
„If you have any great suggestions, feel free to mail me, and I'll probably feel free to ignore you.“ . Linus Torvalds
  Mit Zitat antworten Zitat
Benutzerbild von Bernhard Geyer
Bernhard Geyer

Registriert seit: 13. Aug 2002
17.170 Beiträge
 
Delphi 10.4 Sydney
 
#2

Re: Property überschreiben?

  Alt 26. Jan 2008, 14:06
Zitat von Prototypjack:
..., denn soweit ich mich erinnern kann ist das release ja Non-Breaking und deshalb dürfte sich zumindest der original TOpenDialog-Source ja nicht von dem vom BDS 2006 unterscheiden, oder?
Doch, kann er. Nur die Schnittstellenbeschreibung der BPL-Dateien sollten Kompatible sein. Die Implementierung darf zu 100% unterschiedlich sein.

Ich bin anders gegangen. Hab mir den Beispielcode von TMS in eigene Funktionen gebracht (der orginal-Code ist nicht Win9x-Kompatible), gleich noch eine Unicode-Version erstellt und hab damit für mein Delphi 6 eine Vista-Lösung. Ach ja. Die Vorlage von TMS hat auch ein paar Probleme den Dialog Modal darzustellen. Da mußte ich noch 1-2 Funktonen aus dem Orginal VCL-Sourcecode kopieren (hab momentan den Quellcode nicht da um zu sagen welche es war.
Windows Vista - Eine neue Erfahrung in Fehlern.
  Mit Zitat antworten Zitat
Prototypjack

Registriert seit: 2. Feb 2003
611 Beiträge
 
Delphi 2009 Professional
 
#3

Re: Property überschreiben?

  Alt 26. Jan 2008, 14:34
Zitat von Bernhard Geyer:
Doch, kann er. Nur die Schnittstellenbeschreibung der BPL-Dateien sollten Kompatible sein. Die Implementierung darf zu 100% unterschiedlich sein.
Ok, verdammt, dann hatte ich da etwas falsch verstanden.
Zitat von Bernhard Geyer:
Ich bin anders gegangen. Hab mir den Beispielcode von TMS in eigene Funktionen gebracht (der orginal-Code ist nicht Win9x-Kompatible), gleich noch eine Unicode-Version erstellt und hab damit für mein Delphi 6 eine Vista-Lösung. Ach ja. Die Vorlage von TMS hat auch ein paar Probleme den Dialog Modal darzustellen. Da mußte ich noch 1-2 Funktonen aus dem Orginal VCL-Sourcecode kopieren (hab momentan den Quellcode nicht da um zu sagen welche es war.
Jap, diesen Weg, den TMS geht (ich erinnere mich, dass die das ganze direkt als Funktion realisiert haben, würde ich als Notfall-Alternative gehen.

Aber es muss doch irgendwie möglich sein, das ganze zu verändern ohne das sich für den normalen Entwickler an seinem Code etwas (oder nur wenig) ändert.

Also wenn es wie oben beschrieben nicht möglich ist, bitte ich um Denkansätze

Trotzdem verstehe ich nicht, wieso ich dieses verdammte Property nicht einfach überschreiben kann, hrm.

Danke & Grüße,
Max
Max
„If you have any great suggestions, feel free to mail me, and I'll probably feel free to ignore you.“ . Linus Torvalds
  Mit Zitat antworten Zitat
Benutzerbild von Bernhard Geyer
Bernhard Geyer

Registriert seit: 13. Aug 2002
17.170 Beiträge
 
Delphi 10.4 Sydney
 
#4

Re: Property überschreiben?

  Alt 26. Jan 2008, 14:49
Zitat von Prototypjack:
Trotzdem verstehe ich nicht, wieso ich dieses verdammte Property nicht einfach überschreiben kann, hrm.
Ich würde mal sagen es liegt daran das die Getter/Setter-Methoden nicht virtuell sind. Und wenn du auf die Basisklasse castest aufgrund der fehlenden überschreibbarkeit zwangsweise in der Methodentabelle die Getter-Methode der Basisklasse genommen wird.
Windows Vista - Eine neue Erfahrung in Fehlern.
  Mit Zitat antworten Zitat
Apollonius

Registriert seit: 16. Apr 2007
2.325 Beiträge
 
Turbo Delphi für Win32
 
#5

Re: Property überschreiben?

  Alt 26. Jan 2008, 15:49
GetFileName taucht in der Methodentabelle gar nicht auf, da es nicht virtuell ist, sondern wird vom Compiler direkt umgesetzt. Ich würde empfehlen, GetFileName zu hooken (einen Sprung an die Adresse schreiben). Dann kannst du den Aufruf selbst bearbeiten. Das ist allerdings alles andere als sauber.
Wer erweist der Welt einen Dienst und findet ein gutes Synonym für "Pointer"?
"An interface pointer is a pointer to a pointer. This pointer points to an array of pointers, each of which points to an interface function."
  Mit Zitat antworten Zitat
Prototypjack

Registriert seit: 2. Feb 2003
611 Beiträge
 
Delphi 2009 Professional
 
#6

Re: Property überschreiben?

  Alt 26. Jan 2008, 16:08
Zitat von Apollonius:
GetFileName taucht in der Methodentabelle gar nicht auf, da es nicht virtuell ist, sondern wird vom Compiler direkt umgesetzt. Ich würde empfehlen, GetFileName zu hooken (einen Sprung an die Adresse schreiben). Dann kannst du den Aufruf selbst bearbeiten. Das ist allerdings alles andere als sauber.
Ich fürchte, da hast du recht.

Ich bin mittlerweile zu dem Punkt gelangt, an dem ich beschlossen habe, den Ansatz fallen zu lassen und einfach eine Ableitung eines TOpenDialoges zu implementieren, die sowohl (über die Basisklasse) OldStyle-Dialogs, WinNT Dialogs, als auch (und hier kommt die Ableitung ins Spiel) Vista-Dialogs kann.

Sollte noch jemand eine Lösung für dieses Problem haben, würde ich mich freuen, aber bis dahin bleibt mir und den Entwicklern, die diese Klasse benutzen werden, wohl nichts anderes übrig, als die Dialoge direkt auf der Form zu ersetzen .

Danke & Grüße,
Max
Max
„If you have any great suggestions, feel free to mail me, and I'll probably feel free to ignore you.“ . Linus Torvalds
  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 21:17 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