- ベストアンサー
フォーム間のデータの移動
少し分かりにくいかとは思いますが、以下のような動きのするプロジェクトを作成したいと思っています。 ListView1とButton1が配置されているフォームAのButton1をクリックするとListView2が配置されているフォームBが表示され、フォームBのListView2をクリックすると、ListView2のクリックした列のキャプションのデータが、フォームAのListView1のフォーカスのある行に書きこまれる、というようなプロジェクトを作成したいと思っています。 どのようにプログラムを作っていったら良いでしょうか? ご助力よろしくお願い致します。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
C/C++とWin32SDKで作っているのならメッセージを使うのが最も良いと思う。 RegisterWindowsMessage Win32API(2つのEXEの場合)やWM_USER 定数(1つのEXE内の2フォームの場合)をキーワードに探してみよう。 MFCで作っている場合でも、うまく使えば有効だと思うよ。
その他の回答 (2)
>そこで、まず、フォームAのデータの取得が出来るかどうかを試すため、AnsiString asData = FormA->ListBox1->Items->Strings[FormA->ListBox1->ItemIndex]; というようなソースを記述してみたのですが、ここでエラーが出てしまいました…。 原因は2つ考えられます。 1.ListBox1に文字列が一つも保存されていない。 2.ListBox1の文字列が選択された状態になっていない。 1の場合はListBox1に文字列を登録してください。 2の場合はListBox1中の文字列を選択した状態で試してください。 いずれにしても、ListBox1->ItemIndexが-1になってる(有効な文字列が選択されてない)からだと思われます。
どこまで出来ているのかを書いた方がよいと思います。 フォームBを開くところで躓いているのと、ListView1に書くところだけがわからないのとでは、アドバイスの内容が違います。 ちなみに、ヒントとしてListViewではなくListBoxの例を挙げます。 ListViewはListBoxより複雑なので、下記で行っていることが理解できなければ、ちょっと時間がかかりそうです。 1.FormAでUnitA.hをインクルードする。 FormBでUnitB.hをインクルードする。 2.Button1のクリックイベントでFormBを開く。 void __fastcall TFormA::Button1Click(TObject *Sender) { FormB->ShowModal(); } 3.ListBox2のクリックイベントでListBox1の内容を書き換えてFormBを閉じる。 void __fastcall TFormB::ListBox2Click(TObject *Sender) { FormA->ListBox1->Items->Strings[FormA->ListBox1->ItemIndex] = ListBox2->Items->Strings[ListBox2->ItemIndex]; Close(); }
お礼
回答有難うございます。 フォームBを開く事はできたのですが、フォームAにデータを送ることが出来ずにいました。 ヒントを参考にさせていただいて、ソースを書いてみたところ、コンパイルはとおるのですが、実行時にフォームBのListをクリックするとエラーが出てしまいました。 そこで、まず、フォームAのデータの取得が出来るかどうかを試すため、AnsiString asData = FormA->ListBox1->Items->Strings[FormA->ListBox1->ItemIndex]; というようなソースを記述してみたのですが、ここでエラーが出てしまいました…。 もし、よろしければ、引き続きアドバイスを宜しくお願いします。
お礼
アドバイス有難うございます。 メッセージを使う…考えもしませんでした^^; 探してみますね
補足
すみません、開発環境はBCB6です