2012-04-22 6 views
4

私はobjcプログラムを持っており、私はobjC++で書かれたウィジェット(つまりhttps://launchpad.net/scintilla-cocoa)を使いたいと思っています。これについてどうすればいいですか?基本的には、新しいウィンドウコントローラーオブジェクトをこのobjC++ライブラリーとインターフェースして、シンチラのテキストエディターウィジェットを定義します。単純に新しい 'objcクラス'を作成し、そこからライブラリにアクセスすると、C++ classというキーワードに関連する一連のエラーが生成されます。すべてのコンパイルファイアウォールの背後にObjC++ソースは、ヘッダに含まれていないので - 事前objC++ライブラリと私のobjcプログラムをどのようにインターフェースできますか?

答えて

3

私はScintillaのを使用しての(うまくいけばやりがい:-))トラブルにあなたを置く一人ですので、ここで私は。


我々はppScintillaEditorという名前ScintillaViewサブクラスを作成しましょう。 ファイルが.mm拡張子を持つべきである(例えばppScintillaEditor.mm)コードは大体このようなものだ

...

今インターフェース

#import "Scintilla/ScintillaView.h" 

@interface ppScintillaEditor : ScintillaView 
{ 
    // your iVars 
} 

// your properties/methods/whatever 

実装部分については、 (Scintilla-cocoaに付属の例のように、私はTestプロジェクトを意味します)


追記:もちろん、あなたはかなりあなたが必要なものに基づいて、サブクラス、カテゴリまたは上に何ScintillaViewクラスを作成することができます - 私を、例えば、単にするために、別々のカテゴリーを作成していいくつかのより高度なScintillaの操作については、そこにはありますが、もう少しココアに優しいものにするためには研磨が必要な場合があるので、ここに行きます。私はあなたのコメントに私の他の動画レスポンスに示してきたように)


、少なくとも最後のではなく...

に解決"bunch of errors related to the C++ class keyword and so on"、すべてあなたがしなければならないです:プロジェクトのビルド設定に

  • ゴー
  • アップルLL の下でVMコンパイラ3.0 - 前処理
  • オプションプリプロセッサマクロ
  • デバッグリリースの両方に追加します。

    SCI_NAMESPACE SCI_LEXER 
    

をそして、それはこれだけです。 :-)


ヒント:上記のよう...ので、それが取るすべては、プリプロセッサ、残りを通知することである上記は、CおよびC以外の要素間の衝突を避けるために、Scintillaのによって定義されますケアしています....

1

にあなたが実装し、追加アイバーズをし、実装した後、インターフェイスにアプリのニーズを持っているにObjCクラスを作成します

感謝。あなたの実装は必要な変換を提供します。

これはすでに行っているようですが、あなたのラッパーのヘッダーからscintillaヘッダーを削除します。これはラッパーの実装にのみ表示されます。

更新

一つの可能​​なアプローチを説明するために:

MONScintillaWrapper.h

// no c++/scintilla sources should be included in this header 
#import <Foundation/Foundation.h> 

@interface MONScintillaWrapper : NSObject 

- (void)setBackgroundColor:(NSColor *)pColor;  

@end 

MONScintillaWrapper.mm

の#import「MONScintillaWrapper .hの」

@implementation MONScintillaWrapper 
{ 
    scintilla::t_thing scintillaThing; 
} 

- (void)setBackgroundColor:(NSColor *)pColor 
{ 
...convert pColor to a scintilla color and pass that to scintillaThing... 
} 

@end 
+0

申し訳ありませんが、私はこれに従うためにまだ少し緑色です。私の実装は '.mm'ファイルか' .m'ファイルですか?現在のところ '.m'ファイルだけですが、これを動作させるには' .mm'に名前を変更する必要がありますか? – horseyguy

+0

はい - このラッパーオブジェクトの '.mm'です。あなたのivars(scintillaオブジェクト)をここに宣言してください: '@implementation MONScintillaWrapper {scintilla :: t_thingy scintillaThingy; } '。この方法では、あなたのプログラムの残りの部分は、シンチラ・イヴァールやC++のソースを見る必要はありません。このアプローチを具体的に説明するために、 – justin

+0

を展開しました。 – justin

関連する問題