Announcement

Collapse
No announcement yet.

Array of Record

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Array of Record

    Hallo!

    Ist es möglich ein Array von Records als out-Parameter an die aufrufende Anwendung zurückzugeben ?
    Bodo

  • #2
    Hallo,

    ja, das geht, wobei es sogar prinzipiell 3 unterschiedliche Techniken dafür gibt:

    a) Ein im Arbeitsspeicher initialisiertes Recordset-Objekt (ADO) wird als In-Memory-Datenbanktabelle mit Daten gefüllt und an den Aufrufer übergeben. In diesem Fall kümmert sich MDAC auf beiden Seiten um die notwendigen Anpassungen.

    b) Die eigenen Records werden als SafeArray verpackt und als OleVariant-Parameter an den Aufrufer übergeben. In diesem Fall kümmert sich der Typbibliotheks-Marshaler von Windows auf beiden Seiten um die notwendigen Anpassungen.

    c) Die eigenen Records werden dem Typbibliotheks-Marshaler von Windows über eine eigene IRecordInfo-Implementierung bekannt gemacht

    Comment


    • #3
      Danke für den Hinweis.
      Könntest Du mir für Technik b einen Tipp geben ?
      Habe es schon probiert, aber ohne Erfolg

      Danke
      Bod

      Comment


      • #4
        Hallo Herr Kosch!

        komme leider da nicht wirklich weiter. Für ein kleines minimal Beispiel, wäre ich wirklich sehr dankbar.

        Viele Grüße
        Bod

        Comment


        • #5
          Hallo,

          das folgende Beispiel demonstriert diese Technik:
          <pre>
          <b>uses</b> ActiveX;
          <br>
          <b>procedure</b> SafeArrayRecordCollection(<b>var</b> vData: Variant);
          <b>const</b>
          cCOUNT = 5;
          <b>var</b>
          i : Integer;
          v : Variant;
          <b>begin</b>
          vData := VarArrayCreate([0, cCOUNT - 1], varVariant);
          <b>for</b> i := 0 <b>to</b> cCOUNT - 1 <b>do</b>
          <b>begin</b>
          <font color="#003399"><i>// Record aus einem String- und Integer-Wert simulieren</i></font>
          v := Format(<font color="#9933CC">'Recordeintrag%d'</font>, [i]);
          vData[i] := VarArrayOf([v, i * 10]);
          <b>end</b>;
          <b>end</b>;
          <br>
          <b>procedure</b> TForm1.Button1Click(Sender: TObject);
          <b>var</b>
          vData : Variant;
          pSA : PSafeArray;
          iLBound : Integer;
          iUBound : Integer;
          i : Integer;
          vString : Variant;
          <b>begin</b>
          SafeArrayRecordCollection(vData);
          pSA := PSafeArray(TVarData(vData).VArray);
          SafeArrayGetLBound(pSA, 1, iLBound);
          SafeArrayGetUBound(pSA, 1, iUBound);
          <b>for</b> i := iLBound <b>to</b> iUBound <b>do</b>
          <b>begin</b>
          SafeArrayGetElement(pSA, i, vString);
          ListBox1.Items.Add(vString[0]);
          ListBox1.Items.Add(vString[1]);
          <b>end</b>;
          <b>end</b>;
          </pre&gt

          Comment


          • #6
            Dank für den Tipp. Hat mir sehr geholfen.

            MfG
            Bod

            Comment

            Working...
            X