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