Delphi-PRAXiS
Seite 2 von 2     12   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi variantes Array aus Longs? (https://www.delphipraxis.net/48714-variantes-array-aus-longs.html)

scp 29. Jun 2005 23:25

Re: variantes Array aus Longs?
 
Interessanter wäre der gesamte Abschnitt von GetLink() mit allen Parametern. Es geht nämlich z.B. darum, ob auch ein Paramter NumLinks oder so vorhanden ist, der die Anzahl der Longs enthält.

Desweiteren stellt sich die Frage: Sollen die Daten von AutoCAD kommen oder musst du sie an AutoCAD übergeben (ich vermute ersteres)?

thomasch 29. Jun 2005 23:59

Re: variantes Array aus Longs?
 
Zitat:

Zitat von scp
Interessanter wäre der gesamte Abschnitt von GetLink() mit allen Parametern. Es geht nämlich z.B. darum, ob auch ein Paramter NumLinks oder so vorhanden ist, der die Anzahl der Longs enthält.

Aus der OH:

RetVal = object.GetLinks([LinkTemplate] [, ObjectIDs] [, LinkTypes] [, Document])

Object stellt die allgemeine Verbindung zur DB dar

LinkTemplate
LinkTemplate object, or a string identifying a link template; input-only; optional
If specified, indicates the link template whose links are returned.

ObjectIDs
Variant (array of Longs); input-only; optional
If specified, each long is the object ID of an AutoCAD entity whose links are to be returned.

LinkTypes
Variant; input-only; optional
Specifies the type of links to return.
(letztendlich ein Integer - hat mit den ObjektIDs auch nix zu tun)

Document
Document object; input-only; optional
(Das aktuelle AutoCAD Dokument)

RetVal:
Links collection; The Links collection for the specified link template.

Zitat:

Desweiteren stellt sich die Frage: Sollen die Daten von AutoCAD kommen oder musst du sie an AutoCAD übergeben (ich vermute ersteres)?
Ich übergebe die ObjektIDs ind dieser Funktion an AutoCAD und erhalte ein Auflistung der zu den Objekten gehörenden Links.

Viele Grüße

Thomasch

thomasch 1. Jul 2005 08:21

Re: variantes Array aus Longs?
 
Hallo,
Zitat:

Zitat von marabu
Ich habe mir den Quelltext der Funktion VarArrayCreate() angesehen und komme zu dem Schluss, dass da ein Bug vorliegt. Und zwar scheitert die Prüfung VarTypeIsValidArrayType(varInt64) wegen VarTypeToElementInfo.ValidBase = false. Laut MS PSDK müsste das eigentlich true sein. Vielleicht kann das ja jemand verifizieren?

marabu

Ich habe jetzt mal fogendes Versucht:
- die VarArrayCreate aus der unit Variants kopiert und als myVarArrayCreate in eine neue Unit gepackt.

Dort dann aber die Prüfung rausgenommen.

Wie kann ich testen, ob da auch ein "richtiges" Array raus kommt?

Es scheint zwar zunächst durchzulaufen, jedoch meldet mit die Funktion, der ich das Array dann übergebe mal wieder "Falscher parameter".

Thomasch

marabu 1. Jul 2005 08:52

Re: variantes Array aus Longs?
 
Hallo thomasch,

ich habe den bug in deinem thread gepostet, weil ich dachte, dass es dich betrifft. Wenn du die Prüfung rausgenommen hast, dann wird das gewünschte array mit dem Basistyp varInt64 auch erzeugt. Ich musste allerdings mehrere functions extrahieren, da sie zum Teil nicht im interface deklariert sind. Damit nicht jede Sicherheit flöten geht habe ich nur die Prüfung auf ValidBase abgewandelt:

Delphi-Quellcode:
function VarTypeIsValidArrayType(const AVarType: TVarType): Boolean;
begin
  Result := (AVarType in [CMinArrayVarType..CMaxArrayVarType]) and
            (CVarTypeToElementInfo[AVarType].ValidBase or (AVarType = varInt64));
end;
Den Erfolg kannst du sehr leicht prüfen:

Delphi-Quellcode:
uses
  MyVariants;
var
  va: Variant;
  i64: Int64;
begin
  va := VarArrayCreate([0, 0], varInt64);
  va[0] := 1234567890123456789;
  i64 := va[0];
  WriteLn(i64);
end;
Ob das alles aber wirklich dein Problem ist? Nirgendwo in deinem thread kann ich einen direkten Nachweis lesen, dass ACAD diesen Basistyp unter Long versteht.

marabu

PS: Deine Referenzen auf das Handbuch riechen stark nach VB. Dazu ein bischen was aus der VB.Net Doku:

Zitat:

Caution If you are interfacing with components written in Visual Basic version 6.0, for example Automation or COM objects, keep in mind that Long has a different data width (32 bits) in Visual Basic 6.0. If you are passing a 32-bit argument to such a component, declare it as Integer instead of Long in Visual Basic .NET.

Furthermore, Automation does not support 64-bit integers on certain platforms, including Windows 2000 and Windows 98. You cannot pass a Visual Basic .NET Long argument to an Automation component on such platforms.

thomasch 1. Jul 2005 09:08

Re: variantes Array aus Longs?
 
Hallo,
danke erstmal für Deine Hife :-D
Zitat:

Zitat von marabu
Ob das alles aber wirklich dein Problem ist? Nirgendwo in deinem thread kann ich einen direkten Nachweis lesen, dass ACAD diesen Basistyp unter Long versteht.

marabu

Daran zweifle ich langsam auch :(

Ich habe momentan eigentlich nur die OnlineHife, ein VB Beispiel und die Deklaration in der TLB. Alles ziemlich wage...

Das VB Beispiel:
Code:
  Dim objIds() As Long
  ReDim objIds(0 To entitySet.Count - 1) As Long
  Dim index As Long
  For index = 0 To entitySet.Count - 1
      objIds(index) = entitySet.Item(index).objectId
  Next index
  Set linkSel = dbConnect.GetLinks(objLinkTemplate, objIds, linkTypes)
Die Deklaration in der, aus guten Gründen nicht genutzten, cao_tlb.pas:

Delphi-Quellcode:
    function GetLinks(LinkTemplate: OleVariant; ObjectIDs: OleVariant; LinkTypes: SYSINT;
                      Document: OleVariant): ILinks; safecall;
Der Auszug aus der Onlienhilfe steht oben.

Mittlerweile fehlen mir langsam die Ideen, wo ich noch nach dem Fehler suchen könnte - die ID Selber ist da, und wenn der link nich da sein sollte, erwarte ich eigentlich eine andere Fehlermeldung.

Viele Grüße


Thomasch

marabu 1. Jul 2005 09:13

Re: variantes Array aus Longs?
 
Vielleicht habe ich es übersehen, aber ist es so wie ich vermute - dass ACAD eine VBA Engine einsetzt? Wenn ja, welche Version?

marabu

thomasch 1. Jul 2005 09:15

Re: variantes Array aus Longs?
 
OOOPs
Soory, ich hab das letzte zunächst überlesen wenn long in VB doch ein 32Bit integer ist, sollte
Delphi-Quellcode:
   VarArrayCreate([0,0],varinteger);
eigentlich tun.

Irgendwie hab ich jetzt keinerlei Ahnug mehr warum das nich funzt. :wall: :wall:

Zitat:

Vielleicht habe ich es übersehen, aber ist es so wie ich vermute - dass ACAD eine VBA Engine einsetzt? Wenn ja, welche Version?
Ich vermute mal 6.0, sehe da aber noch genauer nach.


Thomasch

scp 1. Jul 2005 09:19

Re: variantes Array aus Longs?
 
Nochmal: Es handelt sich bei Longs nicht um Int64, diese werden sowohl in C als auch in VB(A) als 32bit Wert definiert.

Wenn du die Longs übergeben sollst, dann dürfte es relativ einfach funktionieren:
Delphi-Quellcode:
var
  LongArray: packed array[0..5] Of DWORD;
begin
  LongArray[0] := 1234567889;
  LongArray[1] := 563565;
  // usw.
  acadapp.GetLinks('wasweisich', LongArray);
end;

Andere Möglichkeit: Warum importierst du nicht einfach die DLL in der "AutoCAD.Application.16" definiert ist in Delphi, über Projekt->Typbibliothek importieren...? dann bekommst du doch die passenden Parameterdeklarationen serviert.

EDIT: Es müssten folgende DLLs sein:
acdbmgd.dll
acmgd.dll
bzw. in der Liste müssten sie in etwa so auftauchen:
Autocad 2005 type library
Autocad/ObjectDBX Common 16.0 type library

thomasch 1. Jul 2005 09:56

Re: variantes Array aus Longs?
 
Zitat:

Zitat von scp
Nochmal: Es handelt sich bei Longs nicht um Int64, diese werden sowohl in C als auch in VB(A) als 32bit Wert definiert.

Danke - das hab ich jetzt begriffen. Ich kam auf den Trichter, da es mit varint nicht funktionierte.

Delphi-Quellcode:
var
  LongArray: packed array[0..5] Of DWORD;
begin
  LongArray[0] := 1234567889;
  LongArray[1] := 563565;
  // usw.
  acadapp.GetLinks('wasweisich', LongArray);
end;
Tut nicht, da dann kommt "[Fehler] main.pas(139): Typ ist im Aufruf von Variant Dispatch nicht zulässig"

Zitat:

Andere Möglichkeit: Warum importierst du nicht einfach die DLL in der "AutoCAD.Application.16" definiert ist in Delphi, über Projekt->Typbibliothek importieren...? dann bekommst du doch die passenden Parameterdeklarationen serviert.

EDIT: Es müssten folgende DLLs sein:
acdbmgd.dll
acmgd.dll
bzw. in der Liste müssten sie in etwa so auftauchen:
Autocad 2005 type library
Autocad/ObjectDBX Common 16.0 type library
Werd mal tun - momentan is delphi dabei grad abgestürzt.

Viele Grüße

Thomasch

scp 1. Jul 2005 14:22

Re: variantes Array aus Longs?
 
Zitat:

Zitat von thomasch
Werd mal tun - momentan is delphi dabei grad abgestürzt.

Ist mir bei der eBay SDK auch schon vorgekommen, bzw. hat er ziemlich lang gerechnet (ca. 10 min.), ist also nichts ungewöhnliches.


Alle Zeitangaben in WEZ +1. Es ist jetzt 18:27 Uhr.
Seite 2 von 2     12   

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