AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Netzwerke Delphi Fehler bei SafeArry Destroy - Wer kann helfen...
Thema durchsuchen
Ansicht
Themen-Optionen

Fehler bei SafeArry Destroy - Wer kann helfen...

Ein Thema von Mavarik · begonnen am 12. Apr 2006 · letzter Beitrag vom 19. Apr 2006
Antwort Antwort
Seite 1 von 2  1 2      
Benutzerbild von Mavarik
Mavarik

Registriert seit: 9. Feb 2006
Ort: Stolberg (Rhld)
4.144 Beiträge
 
Delphi 10.3 Rio
 
#1

Fehler bei SafeArry Destroy - Wer kann helfen...

  Alt 12. Apr 2006, 17:20
Hallo Zusammen...

Folgene Routinen liefert leider immer einen Fehler
"EVariantBadVarTypeError"

Wer hat eine Idee?

Delphi-Quellcode:
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;
Sowohl Lösung a als auch b...

Danke im voraus

Frank

PS.: Die Anleitung zu diesem Kommando gibt es hier (msdn)
  Mit Zitat antworten Zitat
Benutzerbild von Mavarik
Mavarik

Registriert seit: 9. Feb 2006
Ort: Stolberg (Rhld)
4.144 Beiträge
 
Delphi 10.3 Rio
 
#2

Re: Fehler bei SafeArry Destroy - Wer kann helfen...

  Alt 13. Apr 2006, 09:51
Halo nochmal...

Das Problem stellt sich noch besser/schlechter da...

Delphi-Quellcode:
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
  Mit Zitat antworten Zitat
shmia

Registriert seit: 2. Mär 2004
5.508 Beiträge
 
Delphi 5 Professional
 
#3

Re: Fehler bei SafeArry Destroy - Wer kann helfen...

  Alt 13. Apr 2006, 10:12
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.
Andreas
  Mit Zitat antworten Zitat
Benutzerbild von Mavarik
Mavarik

Registriert seit: 9. Feb 2006
Ort: Stolberg (Rhld)
4.144 Beiträge
 
Delphi 10.3 Rio
 
#4

Re: Fehler bei SafeArry Destroy - Wer kann helfen...

  Alt 13. Apr 2006, 10:34
Zitat von shmia:
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.


Danke für die Antwort, leider habe ich NIX verstanden...

Kannst Du vieleicht in Pascal antworten? Danke...

Frank
  Mit Zitat antworten Zitat
Benutzerbild von Mavarik
Mavarik

Registriert seit: 9. Feb 2006
Ort: Stolberg (Rhld)
4.144 Beiträge
 
Delphi 10.3 Rio
 
#5

Re: Fehler bei SafeArry Destroy - Wer kann helfen...

  Alt 18. Apr 2006, 10:29
Kann mir den keiner sagen wo der Fehler liegt?

Frank
  Mit Zitat antworten Zitat
shmia

Registriert seit: 2. Mär 2004
5.508 Beiträge
 
Delphi 5 Professional
 
#6

Re: Fehler bei SafeArry Destroy - Wer kann helfen...

  Alt 18. Apr 2006, 10:53
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;
Andreas
  Mit Zitat antworten Zitat
Benutzerbild von Mavarik
Mavarik

Registriert seit: 9. Feb 2006
Ort: Stolberg (Rhld)
4.144 Beiträge
 
Delphi 10.3 Rio
 
#7

Re: Fehler bei SafeArry Destroy - Wer kann helfen...

  Alt 18. Apr 2006, 11:13
Gleiche Fehlermeldung.

Außerdem fehlt der Dispose/Free und in der Anleitung steht extra drin, dass man sich darum selber kümmern muss.

Frank
  Mit Zitat antworten Zitat
shmia

Registriert seit: 2. Mär 2004
5.508 Beiträge
 
Delphi 5 Professional
 
#8

Re: Fehler bei SafeArry Destroy - Wer kann helfen...

  Alt 18. Apr 2006, 11:43
Zitat von Mavarik:
Außerdem fehlt der Dispose/Free und in der Anleitung steht extra drin, dass man sich darum selber kümmern muss.
Das mag für C++ gelten. Bei Delphi werden Variants aber finalisiert.
Aber man sollte die Variant-Variable erst mal analysieren:
Delphi-Quellcode:
  TargetCommando(2233,EmptyParam,ValOut); // IDM_GETBLOCKFMTS
ShowMessage(VarVarTypeAsString(ValOut)); // Variant Datentyp anzeigen
Und hier die Hilfsfunktionen:
Delphi-Quellcode:
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 sich bei dem Variant um ein Array handelt, wird das Ergebnis "array of ..." sein.
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.
Andreas
  Mit Zitat antworten Zitat
Benutzerbild von Mavarik
Mavarik

Registriert seit: 9. Feb 2006
Ort: Stolberg (Rhld)
4.144 Beiträge
 
Delphi 10.3 Rio
 
#9

Re: Fehler bei SafeArry Destroy - Wer kann helfen...

  Alt 18. Apr 2006, 20:52
Ich erhalte als Antwort: Array of Empty...

Aber wenn ich die Combobox mit meiner Routine auslese, erhalte ich die "richtigen" Strings!!!!

Frank
  Mit Zitat antworten Zitat
shmia

Registriert seit: 2. Mär 2004
5.508 Beiträge
 
Delphi 5 Professional
 
#10

Re: Fehler bei SafeArry Destroy - Wer kann helfen...

  Alt 19. Apr 2006, 09:51
Zitat von Mavarik:
Ich erhalte als Antwort: Array of Empty...
Wie lauten den die Datentypen der einzelnen Elemente ?
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);
Andreas
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


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 14:43 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