Announcement

Collapse
No announcement yet.

Uebergabe von Felder in PSafearray an ActiveX Komponente

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

  • Uebergabe von Felder in PSafearray an ActiveX Komponente

    Ausgangspunkt Ist ein ActiveX aus VB 6, was so aufgerufen wird<br>
    Dim dll1 As UGR<br>
    Set dll1 = New UGR<br>
    Call dll1.UGR(2, L(), Z1, Z2, Gamma(), C(), Etalb, Lvktype, Labase,Laside, Laend, Ugi())<br>
    <br>
    Beschreibung der Parameter:<br>
    <br>
    Eingabe:<br>
    L(1 To Z1, 1 To Z2) As Single:<br>
    Gamma(1 To Z1) As Long:<br>
    C(1 To Z2) As Long:<br>
    Ausgabe:<br>
    Ugi(1 To 10, 1 To 19) As Single:<br>
    <br>
    Beim Import im Delphi erhalte ich als Typ für diese Parameter Psafearray<br>
    <br>
    procedure UGR(var Index: Smallint; var L: PSafeArray; var Z1: Integer; var Z2: Integer; <br>
    var Gamma: PSafeArray; var Phi: PSafeArray; var Etalb: Integer; <br>
    var Lvktype: Integer; var Labase: Single; var Laside: Single; var Laend: Single; <br>
    var Ugi: PSafeArray); safecall;<br>
    <br>
    Bei mir <br>
    Gamma=> g_winkel : array[0..37] of real;<br>
    L => lvk : array[0..37,0..37] of real;<br>
    <br>
    Die felder müssen nicht vollständig gefüllt sein. Sondern bis Z1,Z2.<br>
    <br>
    Wie bekomme ich meine Daten übergeben? bzw. wo gibts was zu Psafearray<br>
    <br>

  • #2
    Hallo,

    in meinem Buch <i>COM/DCOM/COM+ mit Delphi</i> befassen sich die Seite 328 bis 358 mit den Variant-Arrays. Davon gehe ich auf den Seiten 346 bis 355 auf die Besonderheiten von PSafeArray ein (Delphi liefert nur einen Variant mit einem Zeiger auf ein SafeArray zurück).

    Das eigene Programm kann über <b>VarArrayCreate</b> ein SafeArray vom benötigten Typ erzeugen, die Daten dort eintragen und das ganze dann über PSafeArray(TVarData(aArray).VArray)) an die Interface-Methode übergeben. Dabei ist <i>aArray</i> eine lokale Variable vom Typ Variant

    Comment


    • #3
      Erstmal vielen Dank für die 1. Antwort, die Übergabe an die Komponente scheint zu klappen, aber wie kann ich die Rückgabe
      auswerten. Eine Rückwandlung in Typ Variant bekomme ich nicht hin oder welcher weg ist zu wähle

      Comment


      • #4
        Hallo,

        das folgende Beispiel stammt aus dem o.g. Buch:
        <pre>
        procedure TForm1.Button1Click(Sender: TObject);
        var
        i : Integer;
        aArray : Variant;
        sTxt : String;
        begin
        aArray := VarArrayCreate([0, 8], varOleStr);
        for i := 0 to 8 do begin
        sTxt := 'Eintrag ' + IntToStr(i+1);
        aArray[i] := sTxt;
        end;
        // Beide Aufrufe führen zum gleichen Ergebnis
        ShowArrayItems(PSafeArray(TVarData(aArray).VArray) );
        ListBox1.Items.Add('---------------');
        ShowVariantArrayItems(aArray);
        end;

        procedure TForm1.ShowArrayItems(pValues: PSafeArray);
        var
        i : Integer;
        swValue : WideString;
        begin
        for i := 0 to 8 do begin
        SafeArrayGetElement(pValues, i, swValue);
        ListBox1.Items.Add(swValue);
        end;
        end;

        procedure TForm1.ShowVariantArrayItems(aValues: Variant);
        var
        i : Integer;
        begin
        for i := 0 to 8 do
        ListBox1.Items.Add(aValues[i]);
        end;
        </pre&gt

        Comment

        Working...
        X