ページ 11

C++CLIでOpen XML SDK 2.5 for Officeを使う

Posted: 2019年3月13日(水) 12:01
by かずさん
初めて質問致します。
宜しくお願い致します。
 Visual Studio 2017 community C++CLIのマネージにて、Open XML SDK 2.5 for Microsoft Officeの勉強を行っております。
 その中で、C#からC++CLIへ書き換える途中で、どうしても分からない部分が出てきました。

 Open XML SDK 2.5 for Office のクラスを使用して、プログラムによってワープロ ドキュメントに表を追加するコードで、

C#

コード:

    Table table = new Table();

    TableProperties props = new TableProperties(
        new TableBorders(
        new TopBorder
        {
            Val = new EnumValue<BorderValues>(BorderValues.Single),
            Size = 12
        },
        new BottomBorder
        {
          Val = new EnumValue<BorderValues>(BorderValues.Single),
          Size = 12
        },
        new LeftBorder
        {
          Val = new EnumValue<BorderValues>(BorderValues.Single),
          Size = 12
        },
        new RightBorder
        {
          Val = new EnumValue<BorderValues>(BorderValues.Single),
          Size = 12
        },
        new InsideHorizontalBorder
        {
          Val = new EnumValue<BorderValues>(BorderValues.Single),
          Size = 12
        },
        new InsideVerticalBorder
        {
          Val = new EnumValue<BorderValues>(BorderValues.Single),
          Size = 12
    }));

    table.AppendChild<TableProperties>(props);

の Valと Size が、定義されていないとErrorになります。C#では別途Val等について追記しなくても、コンパイラが推測するのか上記は通ります。

当然、参照には当該SDKのdllとWindowsBaseも設定済みで、namespaceも記載済みです。
Val とSizeをどのように書き換えればよいのか、御教授願います。

Re: C++CLIでOpen XML SDK 2.5 for Officeを使う

Posted: 2019年3月13日(水) 22:07
by Math
こういう特殊な質問はMicrosoft のMSDN Forum に聞いた方がいいでしょうね。
https://social.msdn.microsoft.com/forums/ja-jp/home

Re: C++CLIでOpen XML SDK 2.5 for Officeを使う

Posted: 2019年3月14日(木) 11:38
by YuO
C++/CLIには、C#における「オブジェクト初期化子」に相当する物がありません。
このため、プロパティの代入で対応する必要があります。
かずさん さんが書きました:
6年前

コード:

        new TopBorder
        {
            Val = new EnumValue<BorderValues>(BorderValues.Single),
            Size = 12
        },
は、

コード:

        var topBorder = new TopBorder();
        topBorder.Val = new EnumValue<BorderValues>(BorderValues.Single);
        topBorder.Size = 12;
と同じような意味合いになります。
もちろん式から文になるため、TableBordersのnew呼出の中に上記をそのまま書くことはできず、
newを呼ぶ前にインスタンスを作成しておき、new呼出の引数に作成した変数を渡す形になります。

この変換をC#で行った上で、C++/CLIに変換するのがよいかと思います。
オフトピック
C++/CLIでアプリケーションを作成することは、あまりお薦めできません。
C++/CLIは既存C++ライブラリをC#等で使うための接続用に使う物だとされています。

Re: C++CLIでOpen XML SDK 2.5 for Officeを使う

Posted: 2019年3月14日(木) 13:47
by かずさん
早々のご返信ありがとうございました。
おかげさまで、コンパイルを無事に行うことができました。

C#とC++CLIとでは、結構、異なるところがあるんですね。

ご教授、ありがとうございました。

Re: C++CLIでOpen XML SDK 2.5 for Officeを使う

Posted: 2019年3月14日(木) 21:11
by naohiro19
C# の new は C++/CLIは gcnew です。

コード:

String^ text = gcnew String("テキスト");
と書いて文字列の長さを知りたいときは Length というプロパティを使いますが、プロパティ・メソッドへのアクセスは アロー演算子を使います。

コード:

int len = text->Length;
^(ハット) は .NET Framewokのハンドル型をあらわす記号です。

C++/CLI では 従来のネイティブオブジェクトを持つことができますが、
そのネイティブオブジェクトはポインタである必要があります。

Re: C++CLIでOpen XML SDK 2.5 for Officeを使う

Posted: 2019年3月15日(金) 11:22
by かずさん
 みなさまより、多くのご教授、ありがたく思っております。御礼申し上げます。
私は、従来よりCとC++しか知らず、現在はMS C++CLIを使っておりますが、MSのC++離れを受けWeb上でも参考文献が少なく、仕方なく、C#のコードをコンバートするしかなく、この度の質問をさせて頂きました。C++が好きなためC#へ移行せず、頑張っております。言葉が足らずに申し訳ありませんでした。今後とも宜しくお願い致します。

Re: C++CLIでOpen XML SDK 2.5 for Officeを使う

Posted: 2019年3月15日(金) 15:22
by かずさん
報告義務を怠っておりました。

C#

コード:

 new TopBorder
        {
            Val = new EnumValue<BorderValues>(BorderValues.Single),
            Size = 12
        },
のコードに対し、御教授頂いた結果より、

コード:

TopBorder^ topBorder = gcnew TopBorder();
topBorder->Val = gcnew EnumValue<BorderValues>(BorderValues::Single);
topBorder->Size = 12;
とすることにより、コンパイルできました。

ありがとうございました。

Re: C++CLIでOpen XML SDK 2.5 for Officeを使う

Posted: 2019年3月15日(金) 21:38
by Math
[雑談]
私はC++/CLI でゲームを作る本で勉強しましたがそれがシリーズVS2015用までありましたが本に
今はマイクロソフト非推奨になっていると断り書きがついてました。
VS2017初期にはCLR/CLIもありましたが今はひっそりと空のプロジェクト位になりました。
随分前からメンテナンスもされてなくC#の使用がすすめられています。
C#とにているのはじつはCX-Builderです。(こちらは.NETでなく標準C++)
アンダース・ヘルスバーグ がボーランドから移ってDelphiと似たC#を開発したのですね。https://ja.wikipedia.org/wiki/%E3%82%A2 ... C%E3%82%B0
私は業務でC#を使っていましたよ。