2010-12-15 126 views
1

J'ai importé une bibliothèque de classes .Net mise à disposition via COM Interop dans Delphi 2007, et un type de données Decimal a été mis à disposition sous la forme d'un enregistrement condensé tagDEC. Comment remplir ce type d'enregistrement pour pouvoir utiliser la bibliothèque de classes?
TKSComment utiliser tagDEC dans Delphi

Modifier

Ci-dessous mon code C# qui est exposé comme un ActiveX via COM Interop:

[ComVisible(true)] 
    [ClassInterface(ClassInterfaceType.AutoDual)] 
    [ProgId("ClassLibrary.Class1")] 
    public class Class1 
    { 
    [ComVisible(true)] 
    public string Method1(DateTime pDateTime, int pID, decimal pQty) 
    { 
...........  
    } 
    } 

I inscrire la bibliothèque regasm sur le PC avec Delphi, le commande ci-dessous:

C:\WINDOWS\Microsoft.NET\Framework\v4.0.30319\RegAsm.exe .\ClassLibrary.dll /tlb:ClassLibrary.tlb 

En Delphi 2007, via le composant d'importation , J'importer la bibliothèque de types, et obtenir reconverti dans la méthode suivante à la classe proxy:

function Method1(pDateTime: TDateTime; pID: Integer; pQty: TDecimal): WideString; 

Le TDecimal est en fait un packed record de type tagDEC, trouvé dans l'unité ActiveX. Ci-dessous est sa syntaxe:

{ from WTYPES.H } 
    PDecimal = ^TDecimal; 
    {$EXTERNALSYM tagDEC} 
    tagDEC = packed record 
    wReserved: Word; 
    case Integer of 
     0: (scale, sign: Byte; Hi32: Longint; 
     case Integer of 
     0: (Lo32, Mid32: Longint); 
     1: (Lo64: LONGLONG)); 
     1: (signscale: Word); 
    end; 
    TDecimal = tagDEC; 
    {$EXTERNALSYM DECIMAL} 
    DECIMAL = TDecimal; 

Ma question est de savoir comment je remplir ce, donc je peux passer la valeur décimale dans la méthode de classe .Net Library? Y a-t-il une fonction d'aide? Je n'en ai trouvé aucun.
Encore une fois!

+0

Il est quelque peu difficile de répondre à cette question pour le moment. Pourriez-vous s'il vous plaît fournir plus de détails. –

+0

Quelle est la structure de l'enregistrement groupé tagDEC? d'où ça vient ... RTL? – jachguate

+0

Juste édité le poste avec tous les détails, C# et Delphi. Tks tant que – Pascal

Répondre

0

Pourquoi ne pas essayer simplement? Je ne suis pas un .NETty, donc je peux 'tester, mais

par exemple. Définir l'échelle à 10000, hi32 à 5432 et signer à 0. Donc, heureusement, tenter de passer + 5432/10000 = 0,5432, en supposant que le signe est VRAI pour négatif et 0 pour positif (cela peut être l'inverse)

I Je suis un peu préoccupé par votre tête si. Le préfixe hongrois "p" semble indiquer des valeurs de pointeur.

var x : TAGDEC; 
    begin 
    x.scale:=10000; 
    x.hi32:=5432; 
    x.sign:=0; 
    comobject.method1(theDateTime,thePID,x); 
    end; 
+0

la propriété d'échelle est un octet, donc je ne peux pas lui attribuer une valeur aussi élevée. – Pascal

+0

@Pascal Scale est dans la gamme 0-28 et est une puissance de 10 exposant - voir http://msdn.microsoft.com/en-us/library/cc208367.aspx Essai et erreur est lourde de dangers !! –

0

Vous pourriez considérer Decimal comme un type opaque si vous le souhaitez. Pour ce faire, vous devez exporter à partir de votre code C# les aides dont vous avez besoin pour synthétiser les valeurs décimales, puis appeler ce code à partir de Delphi. Ma conjecture est que vous voudriez un double -> aide décimale et peut-être vice versa.

Vous pouvez également modifier l'interface C#/COM pour utiliser des doubles et convertir en décimal du côté C# de la clôture.

+0

Je l'ai fait pour aller de l'avant avec le projet et le livrer. J'ai posté la question pour voir s'il y avait quelqu'un qui a réellement utilisé ce type d'enregistrement tagDEC, donc je pourrais le faire correctement. Après tout, dans le futur, je ne pourrais peut-être pas changer le type de données de la variable pour que je puisse l'utiliser dans Delphi. Tks – Pascal

+0

@Pascal Je pense que si vous pouvez utiliser la connaissance de Decimal de .net, c'est toujours le chemin à parcourir. La meilleure documentation que j'ai trouvé sur le type décimal est à http://msdn.microsoft.com/en-us/library/cc208367.aspx –

+0

Tks pour le lien. C'est beaucoup mieux que celui-ci (http://msdn.microsoft.com/en-us/library/ms221061.aspx) que j'avais. Je vais l'essayer – Pascal

1

Par hasard, j'ai eu le problème en face de cette semaine: je consomme une bibliothèque C# par COM à Delphes, où quelques-unes des méthodes C# renvoient un decimal (un TDecimal ou tagDEC à Delphes), et je me demandais aussi ce à faire avec.

Après la recherche à travers les unités ActiveX, ComObj et OLEServeur je trouve cette fonction:

VarR8FromDec(PDecimal, out double); 

Ce qui a fait l'affaire. J'ai Delphi, ni les sources mentionnées ci-dessus à portée de main ici, mais les chances sont que vous trouverez une méthode dans ces unités qui fera l'inverse.

Pas une réponse claire, mais peut-être que cela vous aide.