Konvertieren von tagVARIANT nach AnsiString ???



  • Hi hab folgendes Problem ...

    Ich will eine Excel Tabelle in ein StringGrid einlesen.
    Beim zugreifen auf ein Element der Tabelle erhalte ich
    aber eine Variable von Typ tagVARIANT. Alles suchen war
    bisher vergebens ... wie konvertier ich das nach AnsiString?

    tagVARIANT test;
    test = Worksheet -> Cells -> get_Item(OleVariant(0), OleVariant(0));
    

    Bitte bitte helf mir !!! ??? !!! 😕



  • String str = (char*)test.pbVal;
    


  • Also irgendwie funktioniert das immer noch nicht.
    Auch in der FAQ habt ihr nirgends nen Beispiel fürs einlesen von ExcelTabellen oder ??

    Wenn ich str mit ShowMessage ausgebe steht da gar nix drin ... und wenn ich das in das StrinGrid schreibe nur müll ...

    was mach ich falsch ???



  • Gibts irgend ne andere möglichkeit Excel tabellen einzulesen?? Habt Ihr ne Idee ?



  • Verpeilt, vielleicht so:

    String s = test.bstrVal;
    

    ??



  • über das vt-Mitglied von tagVARIANT soll man übrigens ermitteln können, welchen Typ der Inhalt tatsächlich hat. Allerdings habe ich keine Ahnung, wie, und wie man dann Nutzen daraus zieht. 🙂



  • Jansen schrieb:

    über das vt-Mitglied von tagVARIANT soll man übrigens ermitteln können, welchen Typ der Inhalt tatsächlich hat.

    Sieht so aus, als würde der Aufzählungstyp VARENUM (wtypes.h) dafür genutzt.

    Jansen schrieb:

    Allerdings habe ich keine Ahnung, wie, und wie man dann Nutzen daraus zieht.

    Wenn ich das richtig sehe, ist tagVARIANT (bzw. VARIANT) nur ein struct mit einem Haufen von Elementen, die Daten in verschiedenen Typen speichern können, aber eben nicht müssen. Es währe also hilfreich zu wissen, welches der Elemente mit Daten belegt ist.

    VARIANT z;
    z.intVal = 1;
    z.vt = VT_INT;
    
    //und später irgendwo anders:
    switch (z.vt)
    {
        case (VT_INT):
        {
            int i = z.intVal;
        };break;
    }
    

    Aber das ist natürlich alles nur reine Spekulation ...:-)



  • Das (mit dem switch) wäre natürlich äusserst unpraktisch.
    Deshalb spekuliere ich mal so: üblicherweise hat man ja eine Vorstellung bzw. Erwartung, welchen Typ die entsprechende Funktion zurückgibt. Sollte vt vielleicht nur für einen sanity check gedacht sein?

    (z.vt == VT_INT) ? i = z.intVal : error();
    


  • Hallo,

    ich habe mich auch schon ein wenig mit den Variant-Typen beschäftigt (bzw.
    beschäftigen müssen). Nach meinen Erfahrungen hat dschenksy mit seinen Vermutungen
    recht. In der Win32-Hilfe findet man übrigens zum Thema VARIANT so einiges.

    Jansen schrieb:

    Das (mit dem switch) wäre natürlich äusserst unpraktisch.

    Hab ich aber auch so gemacht. Wem eine bessere Lösung einfällt, soll sie doch bitte
    mal hier rein posten. Ich wäre daran auch interessiert.

    Jansen schrieb:

    Deshalb spekuliere ich mal so: üblicherweise hat man ja eine Vorstellung bzw. Erwartung, welchen Typ die entsprechende Funktion zurückgibt. Sollte vt vielleicht nur für einen sanity check gedacht sein?

    Also in meinem Fall (auch irgend so ein OLE-Zeug) kann der Typ tatsächlich variieren.
    Es können bool, int, char* und sonstige Typen möglich sein.
    Noch schöner als das Lesen finde ich übrigens das Schreiben. 😉

    Hier mal ein bißchen Code, den ich (in leicht abgewandelter Form) verwende:

    AnsiString getVariantAsString(TVariant* variant)
    {
       AnsiString result = "";
       switch (variant->vt)
       {
          case VT_BSTR:
             result = variant->bstrVal;
             break;
          case VT_I4:
             result = IntToStr(variant->lVal);
             break;
          case VT_I2:
             result = IntToStr(variant->iVal);
             break;
          case VT_UI1:
             result = IntToStr(variant->bVal);
             break;
          case VT_R4:
             result = FloatToStr(variant->fltVal);
             break;
          case VT_R8:
             result = FloatToStr(variant->dblVal);
             break;
          case VT_BOOL:
             result = variant->boolVal ? "true" : "false";
             break;
          default:
             result = "";
       }
       return result;
    }
    

    Ich hoffe das hilft weiter...

    Gruß,

    Alexander



  • Alexander Kempf schrieb:

    Jansen schrieb:

    Das (mit dem switch) wäre natürlich äusserst unpraktisch.

    Hab ich aber auch so gemacht. Wem eine bessere Lösung einfällt, soll sie doch bitte mal hier rein posten.

    Anzumerken währe noch, daß es offenbar keinen vernünftigen Konstruktor für VARIANT gibt, was bedeutet, daß obwohl ein Typ angegeben ist, trotzdem Müll in der entsprechenden Variablen stehen kann, der eventuell AV's produziert - speziell bei den Zeiger-Typen.
    Also das sieht irgendwie alles ein wenig räudig aus. 🙄


Anmelden zum Antworten