2010-12-15 14 views
1

Delphi 2007にCOM Interopで使用できる.Netクラスライブラリをインポートし、Decimalデータ型をtagDECパックレコードとして使用可能にしました。クラスライブラリを使用できるように、このレコードタイプをどのように使用すればよいでしょうか?
TKSDelphiでtagDECを使用する方法

編集

以下

COM相互運用機能を通じてのActiveXとして公開され、私のC#のコードです:

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

で私は、DelphiでPC上のregasmでライブラリを登録コマンド:

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

デルファイ2007では、インポートコンポーネント、私はタイプライブラリをインポートし、それはのは、プロキシクラスで次のメソッドに変換し得る:

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

TDecimalActiveX単位で見つかった、実際にタイプtagDECpacked recordです。

{ 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; 

私の質問は、私はこれを記入する方法であるので、私は、.NETクラスライブラリのメソッドに小数点値を渡すことができます。以下は、それは構文がありますか?ヘルパー機能はありますか?私は何も見つかりませんでした。
Tksもう一度!

+0

現時点では、この質問に答えるのはやや難しいです。いくつかの詳細を提供してください。 –

+0

tagDECで圧縮されたレコードの構造は何ですか?そこから来るのは... RTL? – jachguate

+0

すべての詳細、C#とDelphiで投稿を編集しました。 Tksそんなに – Pascal

答えて

0

あなたは簡単に試してみませんか?私は.NETtyではないので、テストすることができますが、

スケールを10000、hi32〜5432に設定して0にサインしてください。+ 5432/10000 = 0.5432を幸運にも通過しようとすると、符号が負の場合はTRUE、正の場合は0とみなされます(逆の場合もあります)。

あなたのヘッダーに少しかかわっています。 "p"ハンガリー語接頭辞はポインタ値を示すようです。

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

スケールプロパティはByteなので、私はそれをこの高い値に割り当てることはできません。 – Pascal

+0

@Pascal Scaleは0-28の範囲にあり、10指数の累乗です - http://msdn.microsoft.com/en-us/library/cc208367.aspxを参照してください試行錯誤は危険に満ちています!! –

0

ご希望の場合、Decimalを不透明なタイプと見なすことができます。これを行うには、Decimal値を合成してDelphiからそのコードを呼び出す必要があるヘルパーをC#コードから書き出します。私の推測では、Double - > Decimalヘルパーが必要で、逆もまた同様です。

また、フェンスのC#側で倍精度を使用し、Decimalに変換するようにC#/ COMインターフェイスを変更することもできます。偶然

+0

私は実際にプロジェクトに乗ってそれを提供するためにそれを行いました。実際にこのtagDECレコードタイプを使用している人がいるかどうかを確認するために質問を投稿しました。結局、将来、変数のデータ型を変更することができないため、Delphiで使用できるようになります。 Tks – Pascal

+0

@Pascalもしあなたが常に行く方法であるDecimalの.netの知識を利用できると思う。 Decimalタイプで見つけた最良のドキュメントは、http://msdn.microsoft.com/en-us/library/cc208367.aspx –

+0

にあります。これは、これよりもずっと優れています(http://msdn.microsoft.com/en-us/library/ms221061.aspx)。やってみます – Pascal

1

は、私は今週反対の問題を抱えていた:私はC#のメソッドのいくつかは(DelphiでTDecimalまたはtagDEC)をdecimalを返すデルファイ、中にCOM経由のC#ライブラリを消費していて、また何を思っていましたそれに関係する。トリックをした

VarR8FromDec(PDecimal, out double); 

のActiveX、ComObjとOleServerユニットを検索した後、私はこの機能を発見しました。私はDelphiを持っていませんし、前述のソースもここでは便利ですが、その逆を行う方法を見つけることができます。

明確な答えはありませんが、おそらくそれが役に立ちます。

関連する問題