Ich habe hier ein sehr komisches Verhalten von Delphi bezüglich Variants bei der Verwendung des Adobe SVG-Viewers.
Ich habe mir das SVGActiveX 3.0 Typbibliothek importiert (mit Wrapper) und habe mit ein Control auf das Formular gelegt. Da nicht alle eigentlich verfügbaren Funktionen des Controls über die Typbibliothek bereitgestellt werden, muß man in vielen Bereichen über die späte Bindung arbeiten.
Folgendes Beispiel soll das Problem verdeutlichen:
<pre>
var
Doc: OleVariant;
root: OleVariant;
scale: Variant;
begin
Doc := SVGCtl.getSVGDocument; // SVGCtl ist meine Komponente auf dem Formular
root := Doc.rootElement;
scale := root.currentScale; // Bisherige Einstellung auslesen
root.currentScale := '0.5'; // Funktioniert
root.currentScale := scale; // Exception: Typmismatch???
root.currentScale := VarAsType(scale, varSingle); // Funktioniert (Cast auf richtigen Typ)
scale := VarAsType(scale, varSingle);
root.currentScale := scale; // Funktioniert immer noch nicht, obwohl explizit mit VarAsType in richtigen Typ konvertiert wird
end;
</pre>
Wieso ist der übergebene Wert unterschiedlich (falsch) wenn er über eine lokale Variable dem Objekt zugewiesen wird (hier scale), aber richtig wenn er über die Funktion VarAsType zugewiesen wird? Ähnliches gilt auch für alle anderen über die späte Bindung erreichbaren Funktionen.
Ist dies ein Delphi-Problem oder hat hier Adobe eine "komische" Implementierung durchgeführt? Wenn jemand diese mit einer anderen Delphi-Version nachvollziehen könnte (bzw. mit C++/VB).
Ich habe mir das SVGActiveX 3.0 Typbibliothek importiert (mit Wrapper) und habe mit ein Control auf das Formular gelegt. Da nicht alle eigentlich verfügbaren Funktionen des Controls über die Typbibliothek bereitgestellt werden, muß man in vielen Bereichen über die späte Bindung arbeiten.
Folgendes Beispiel soll das Problem verdeutlichen:
<pre>
var
Doc: OleVariant;
root: OleVariant;
scale: Variant;
begin
Doc := SVGCtl.getSVGDocument; // SVGCtl ist meine Komponente auf dem Formular
root := Doc.rootElement;
scale := root.currentScale; // Bisherige Einstellung auslesen
root.currentScale := '0.5'; // Funktioniert
root.currentScale := scale; // Exception: Typmismatch???
root.currentScale := VarAsType(scale, varSingle); // Funktioniert (Cast auf richtigen Typ)
scale := VarAsType(scale, varSingle);
root.currentScale := scale; // Funktioniert immer noch nicht, obwohl explizit mit VarAsType in richtigen Typ konvertiert wird
end;
</pre>
Wieso ist der übergebene Wert unterschiedlich (falsch) wenn er über eine lokale Variable dem Objekt zugewiesen wird (hier scale), aber richtig wenn er über die Funktion VarAsType zugewiesen wird? Ähnliches gilt auch für alle anderen über die späte Bindung erreichbaren Funktionen.
Ist dies ein Delphi-Problem oder hat hier Adobe eine "komische" Implementierung durchgeführt? Wenn jemand diese mit einer anderen Delphi-Version nachvollziehen könnte (bzw. mit C++/VB).