0

私はどこでも助けを求めてきました。これまでのところ、私が必要とする助けは見つかりませんでした。

皆さんが私を案内または助けてくれることを願っています =)

私は Form1 を持っています、form1 に私は Form1.h に 2 番目のフォーム ファイルを含めました: Form2.h だから今私はボタンが押されたときに実行される作成しました:

| | Form1.h | Form2^ frmProSog = gcnew Form2(); frmProSog->ShowDialog();

Form2 が開いているので、それを使用してデータグリッド内の文字列を検索します。結果を選択したら、Form1 にある別のデータグリッドにデータを追加する Form1 の関数を呼び出したい Form2 のボタンをクリックします。

Form1.h を Form2 にインクルードしようとしましたが、エラーが発生しました: 指定された引数リストで呼び出すことはできません 引数の型は: (System::Object ^)

誰かが私を助けてくれることを願っています。この質問を思い起こさせますが、運がないスタックオーバーフローに関する次の提案の多くを試しました。

4

1 に答える 1

0

(David Yawのコメントは正しいです。OPにはより明確な指示が必要になる可能性があるという理由で、以下を書きます。この回答は、CLI/C++またはWinFormsに特に固有のものではなく、通常のC++手法を指摘しているだけです。)

あなたの説明から、ボタンを押すイベント関数の本体はそれぞれのヘッダー ファイルにある必要があるように思えます。さらに、これ#include "Form1.h"は Form2.h にあり、その逆も同様です。これにより、循環依存と関連する問題が発生します。

簡単な修正方法は、代わりに Form1.cpp および Form2.cpp ソース ファイルにイベント処理メソッドを実装することです。フォーム デザイナーが空のメソッドを作成すると...

public ref class Form 1 : System::Windows::Forms::Form
{

     private: System::Void button1_Click(System::Object^  sender, System::EventArgs^  e) 
     {

     }
}

... 次に、ヘッダーから実装を削除します。

public ref class Form 1 : System::Windows::Forms::Form
{

     private: System::Void button1_Click(System::Object^  sender, System::EventArgs^  e) ;
}

cpp ファイルにコピー/貼り付けし、ハンドラー本体を追加します。

System::Void Form1::button1_Click(System::Object^  sender, System::EventArgs^  e) {
    Form2^ frmProSog = gcnew Form2(); 
    frmProSog->ShowDialog();
}

.h からそれぞれを削除し、#include代わりに .cpp に入れます。

( のメンバがある場合はForm1Form1.hでForm2^前方宣言)Form2

上記は、質問に基づいて、Form2 の Form1 または Form1 の Form2 の視覚的表現 (つまり、フォーム デザイナー) がないため、機能します。この場合、*.h で前方宣言し、ソース ファイル内の循環依存クラスのみを "使用" (メンバーへのアクセスなど) する限り、フォーム/コントロール間で好きなだけ循環依存関係を持つことができます。Form1.h 内の Form2 へのハンドル (^) は、Form2^メンバー関数やメソッド シグネチャなどの前方宣言を使用して喜んで受け取ることができます。

于 2013-08-20T11:19:55.003 に答える