![]() |
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)? |
Re: variantes Array aus Longs?
Zitat:
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:
Viele Grüße Thomasch |
Re: variantes Array aus Longs?
Hallo,
Zitat:
- 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 |
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:
Den Erfolg kannst du sehr leicht prüfen:
function VarTypeIsValidArrayType(const AVarType: TVarType): Boolean;
begin Result := (AVarType in [CMinArrayVarType..CMaxArrayVarType]) and (CVarTypeToElementInfo[AVarType].ValidBase or (AVarType = varInt64)); end;
Delphi-Quellcode:
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.
uses
MyVariants; var va: Variant; i64: Int64; begin va := VarArrayCreate([0, 0], varInt64); va[0] := 1234567890123456789; i64 := va[0]; WriteLn(i64); end; marabu PS: Deine Referenzen auf das Handbuch riechen stark nach VB. Dazu ein bischen was aus der VB.Net Doku: Zitat:
|
Re: variantes Array aus Longs?
Hallo,
danke erstmal für Deine Hife :-D Zitat:
Ich habe momentan eigentlich nur die OnlineHife, ein VB Beispiel und die Deklaration in der TLB. Alles ziemlich wage... Das VB Beispiel:
Code:
Die Deklaration in der, aus guten Gründen nicht genutzten, cao_tlb.pas:
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)
Delphi-Quellcode:
Der Auszug aus der Onlienhilfe steht oben.
function GetLinks(LinkTemplate: OleVariant; ObjectIDs: OleVariant; LinkTypes: SYSINT;
Document: OleVariant): ILinks; safecall; 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 |
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 |
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:
eigentlich tun.
VarArrayCreate([0,0],varinteger);
Irgendwie hab ich jetzt keinerlei Ahnug mehr warum das nich funzt. :wall: :wall: Zitat:
Thomasch |
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 |
Re: variantes Array aus Longs?
Zitat:
Delphi-Quellcode:
Tut nicht, da dann kommt "[Fehler] main.pas(139): Typ ist im Aufruf von Variant Dispatch nicht zulässig"
var
LongArray: packed array[0..5] Of DWORD; begin LongArray[0] := 1234567889; LongArray[1] := 563565; // usw. acadapp.GetLinks('wasweisich', LongArray); end; Zitat:
Viele Grüße Thomasch |
Re: variantes Array aus Longs?
Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:27 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz