![]() |
Fehler bei SafeArry Destroy - Wer kann helfen...
Hallo Zusammen...
Folgene Routinen liefert leider immer einen Fehler "EVariantBadVarTypeError" Wer hat eine Idee?
Delphi-Quellcode:
Sowohl Lösung a als auch b...
procedure TMainform.SpeedButton14Click(Sender: TObject);
var ValOut : OLEVariant; Val : PSafeArray; sBuffer: WideString; T : TVarType; i, iMin, iMax: integer; begin Combobox1.Items.Clear; TVariantArg(ValOUT).VT := VT_BYREF or VT_ARRAY; TVariantArg(ValOUT).ppArray := nil; TargetCommando(2233,EmptyParam,ValOut); // IDM_GETBLOCKFMTS Val := PSafeArray(TVariantArg(ValOUT).ppArray); // Die Anzahl der Elemente im Array bestimmen ActiveX.SafeArrayGetLBound(Val, 1, iMin); ActiveX.SafeArrayGetUBound(Val, 1, iMax); // Die einzelnen Strings auslesen for i := iMin to iMax do begin ActiveX.SafeArrayGetElement(Val, i, sBuffer); Combobox1.Items.Add(SBuffer); end; // Vorsicht, Leak... a-> ActiveX.SafeArrayDestroyData(Val); // EVariantBadVarTypeError b-> ActiveX.SafeArrayDestroy(Val); // EVariantBadVarTypeError end; Danke im voraus Frank :coder: PS.: Die Anleitung zu diesem Kommando gibt es ![]() |
Re: Fehler bei SafeArry Destroy - Wer kann helfen...
Halo nochmal...
Das Problem stellt sich noch besser/schlechter da...
Delphi-Quellcode:
:wiejetzt:
procedure TMainform.SpeedButton14Click(Sender: TObject);
var ValOut : OLEVariant; Val : PSafeArray; sBuffer: WideString; T : TVarType; i, iMin, iMax: integer; begin Combobox1.Items.Clear; TVariantArg(ValOUT).VT := VT_BYREF or VT_ARRAY; TVariantArg(ValOUT).ppArray := nil; TargetCommando(2233,EmptyParam,ValOut); // IDM_GETBLOCKFMTS Val := PSafeArray(TVariantArg(ValOUT).ppArray); // Die Anzahl der Elemente im Array bestimmen ActiveX.SafeArrayGetLBound(Val, 1, iMin); ActiveX.SafeArrayGetUBound(Val, 1, iMax); // Die einzelnen Strings auslesen for i := iMin to iMax do begin ActiveX.SafeArrayGetElement(Val, i, sBuffer); Combobox1.Items.Add(SBuffer); end; Caption := 'Cool'; // <- Auch hier gibt es den gleichen Fehler... // Vorsicht, Leak... //a-> ActiveX.SafeArrayDestroyData(Val); // EVariantBadVarTypeError //b-> ActiveX.SafeArrayDestroy(Val); // EVariantBadVarTypeError end; jetzt verstehe ich gar nix mehr.... Hat den keiner eine Idee? Frank :coder: |
Re: Fehler bei SafeArry Destroy - Wer kann helfen...
Hi Mavaric,
du hast dich in ein Problem verrannt, bei dem du SafeArrays und TVarType munter durcheinander mischelst. Du musst zurück an den Anfang und erst mal erklären, was du überhaupt erreichen möchtest. Warum lässt du dich z.B. auf einen "Krieg" mit SafeArrays ein, obwohl man damit bei Automatisierung nicht im Berührung kommen muss. Man kann Parameter über ein OleVariant-Array übergeben oder entgegennehmen. |
Re: Fehler bei SafeArry Destroy - Wer kann helfen...
Zitat:
Danke für die Antwort, leider habe ich NIX verstanden... Kannst Du vieleicht in Pascal antworten? Danke... Frank :coder: |
Re: Fehler bei SafeArry Destroy - Wer kann helfen...
Kann mir den keiner sagen wo der Fehler liegt?
Frank :coder: |
Re: Fehler bei SafeArry Destroy - Wer kann helfen...
Ungetestet:
Delphi-Quellcode:
procedure TMainform.SpeedButton14Click(Sender: TObject);
var ValOut : OLEVariant; i: integer; begin Combobox1.Items.Clear; TargetCommando(2233,EmptyParam,ValOut); // IDM_GETBLOCKFMTS // Die einzelnen Strings auslesen for i := VarArrayLowBound(ValOut,1) to VarArrayHighBound(ValOut,1) do begin Combobox1.Items.Add(ValOut[i]); end; |
Re: Fehler bei SafeArry Destroy - Wer kann helfen...
Gleiche Fehlermeldung.
Außerdem fehlt der Dispose/Free und in der Anleitung steht extra drin, dass man sich darum selber kümmern muss. Frank :coder: |
Re: Fehler bei SafeArry Destroy - Wer kann helfen...
Zitat:
Aber man sollte die Variant-Variable erst mal analysieren:
Delphi-Quellcode:
Und hier die Hilfsfunktionen:
TargetCommando(2233,EmptyParam,ValOut); // IDM_GETBLOCKFMTS
ShowMessage(VarVarTypeAsString(ValOut)); // Variant Datentyp anzeigen
Delphi-Quellcode:
Wenn es sich bei dem Variant um ein Array handelt, wird das Ergebnis "array of ..." sein.
function VarTypeAsString(const vt: Integer): string;
begin case vt and varTypeMask of varEmpty: Result := 'Empty'; varNull: Result := 'Null'; varSmallint: Result := 'SmallInt'; varInteger: Result := 'Integer'; varSingle: Result := 'Single'; varDouble: Result := 'Double'; varCurrency: Result := 'Currency'; varDate: Result := 'Date'; varOleStr: Result := 'OleStr'; varDispatch: Result := 'Dispatch'; varError: Result := 'Error'; varBoolean: Result := 'Boolean'; varVariant: Result := 'Variant'; varUnknown: Result := 'Unknown'; varString: Result := 'String'; varAny: Result := 'Any'; varByte: Result := 'Byte'; // folgende Konstanten sind in Unit ActiveX deklariert VT_UI4: Result := 'LongWord'; VT_PTR: Result := 'Pointer'; VT_DECIMAL: Result := 'Decimal (16Byte)'; VT_VOID: Result := 'void'; VT_SAFEARRAY: Result := 'safe-array'; VT_USERDEFINED: Result := 'UserDef'; VT_LPSTR: Result := 'PChar'; VT_FILETIME: Result := 'Filetime'; VT_BLOB: Result := 'Blob'; VT_STREAM: Result := 'Stream'; VT_STORAGE: Result := 'Storage'; VT_STREAMED_OBJECT: Result := 'Streamed Obj'; VT_STORED_OBJECT: Result := 'Stored Obj'; VT_BLOB_OBJECT: Result := 'Blob Obj'; VT_CF: Result := 'Clipboard Format'; VT_CLSID: Result := 'Class ID'; else Result := Format('0x%.8x',[vt]); end; if (vt and varArray) <> 0 then Result := 'array of ' + Result; if (vt and varByRef) <> 0 then Result := '*'+Result; end; function VarVarTypeAsString(const v: Variant): string; begin Result := VarTypeAsString(VarType(v)); end; Wenn es ein Array ist, dann wird man jedes einzelne Element unter die Lupe nehmen. Mindestens eines dieser Elemente hat einen VarType, der von Delphi nicht unterstützt wird. |
Re: Fehler bei SafeArry Destroy - Wer kann helfen...
Ich erhalte als Antwort: Array of Empty...
Aber wenn ich die Combobox mit meiner Routine auslese, erhalte ich die "richtigen" Strings!!!! Frank :wiejetzt: |
Re: Fehler bei SafeArry Destroy - Wer kann helfen...
Zitat:
Delphi-Quellcode:
for i := VarArrayLowBound(ValOut,1) to VarArrayHighBound(ValOut,1) do
s := s + Format('[%d]=%s'#13#10, [i,VarVarTypeAsString(ValOut[i]]); ShowMessage(s); |
Alle Zeitangaben in WEZ +1. Es ist jetzt 17:24 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