• ベストアンサー

他フォームのクリックイベント取得

VS2005を使ってちょこちょこプログラムの勉強をしています。 現在、同一ソリューション内のフォームの間のイベントを実装出来なくて困っています。 やりたい事は Form1から、Form2を起動し、Form2のボタンをクリックした時に、 Form1でForm2のクリックイベントを取得したいのです。 自分なりに調べてみましたが、該当するようなところが中々見つかりませんでした。 わかる方いましたら、ご教示お願いします。 足らない情報等ありましたら、ご指摘ください。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.3

すでに回答が出ていますが「Form2に手を加えない(あるいは加えることが出来ない場合の)」方法を。 ※Form2のボタン(Button1)がFriend(またはPublic)で生成されていることが前提です。 方法1:Form1側でForm2のButton1をWithEvent宣言した変数に格納する [ Form1内 ] Private WithEvents btnForm2 As Windows.Forms.Button Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click Dim frmNew As New Form2 btnForm2 = frmNew.Button1 frmNew.Show() End Sub Private Sub btnForm2_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles btnForm2.Click Windows.Forms.MessageBox.Show("クリック♪") End Sub Private Sub btnForm2_Disposed(ByVal sender As Object, ByVal e As System.EventArgs) Handles btnForm2.Disposed ' 後始末 btnForm2 = Nothing End Sub ただし、この方法では、ボタンを1つしか制御できません。Form2を複数生成する場合は、イベントハンドラを使う方法があります。 方法2:イベントハンドラを手動で追加・削除する [ Form1内 ] Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click Dim frmNew As New Form2 '* インテリセンスではButton1が出てきませんが、手書きすれば大丈夫です。 AddHandler frmNew.Button1.Click, AddressOf Form2_Button1_Click AddHandler frmNew.Button1.Disposed, AddressOf Form2_Button1_Disposed frmNew.Show() End Sub Private Sub Form2_Button1_Click(ByVal sender As Object, ByVal e As System.EventArgs) Windows.Forms.MessageBox.Show("クリック♪") End Sub Private Sub Form2_Button1_Disposed(ByVal sender As Object, ByVal e As System.EventArgs) ' 後始末 Dim btnSender As Windows.Forms.Button = CType(sender, Windows.Forms.Button) RemoveHandler btnSender.Click, AddressOf Form2_Button1_Click RemoveHandler btnSender.Disposed, AddressOf Form2_Button1_Disposed End Sub

kouyo_1
質問者

お礼

こういったイベント作成もできるのですね・・・。 とても勉強になりました。 ご回答ありがとうございました。

その他の回答 (2)

  • gcqd75ce
  • ベストアンサー率8% (6/67)
回答No.2

フォームをたくさん使う必要があるのかどうか、よく検討したほうがいいですよ。 1枚のフォームで十分な場合が多そうですけど。

kouyo_1
質問者

お礼

ご意見を参考に、もう一度フォームの必要性を考えましたが、 どうしても必要でした。 ご回答ありがとうございました。

  • uruz
  • ベストアンサー率49% (417/840)
回答No.1

Form1内にPublicで宣言したプロシージャを 用意しておき、Form2のクリックイベント でそのプロシージャを呼び出せばいいのでは

kouyo_1
質問者

お礼

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

関連するQ&A

  • サブフォームのイベントを取得するには?

    同じソリューションにフォームA、フォームBがあり、フォームBは フォームAから起動されます。 フォームBがクローズした時、フォームAのメソッドを走らせたい のですが、その手段がわからず困っています。 別のフォームのイベントを取得する方法をご存知でしたら、 ご教授ください。 宜しくお願いします。

  • フォームのZOrder?

    VB2008でWindwosフォームからボタンを押して、 別のWindowsフォームを開き、そのフォームをクリックすると閉じて、元のフォームに行くプログラムで、 別のフォームを開いた後に、何か別のアプリを全面に持ってきて、同じようにフォームをクリックして、元のフォームが全面にでるかと思えば、別のアプリの下に隠れていました。 Form1.show() ボタンClickイベント     Form2.show() 別のアプリを前に Form2 フォームClickイベント Form1.Show()   <----- 読んでいるのに Me.close() <----- ここがいけない? From1が全面に来ず、別のアプリが上になる。 何か方法がまずいのでしょうか?

  • クリックイベントなのに、2回クリックしないとフォー

    クリックイベントなのに、2回クリックしないとフォームが閉じないです。 フォームに閉じると言うコマンドボタンがあり、クリックイベントで Private Sub cmd_閉じる_Click() DoCmd.Close acForm, Me.Name End Sub としてるのですが、なぜか1回ボタンを押しただけではフォームが閉じません。 2回目押した時にフォームがとじます。 ダブルクリックでも閉じます。 Private Sub cmd_閉じる_Click() 'DoCmd.Close acForm, Form_Fフォーム.Name End Sub のように、フォーム名を指定すると1回のクリックで閉じます。 しかしMe.Nameだと2回目じゃないと閉じない理由がわかりません。 Fフォームは他フォームから DoCmd.OpenForm Form_Fフォーム.Name, acNormal で開いたから2回クリックしないと閉じないのでしょうか?

  • 他のフォームのイベントを起動させる方法

    アクセスです。 Fログイン_サブフォーム と言う名前のフォームがあり、 そのフォームの中には、 cmd_ログインする と言うコマンドボタンがあります。 cmd_ログインするのクリックイベントでは フォームモジュールのcmd_ログインする_Clickに記載されたたくさんのコードがあります。 新たにフォーム1を作り、コマンドボタンを押下すると、 Fログイン_サブフォームのcmd_ログインする_Clickを実行させるにはどうすればいいでしょうか? フォーム1のフォームモジュールの Private Sub コマンドボタン_Click() で、 Call Fログイン_サブフォーム!cmd_ログインする_Click としましたが、 VBAを実行する前に、コンパイルエラーになります。 Fログイン_サブフォーム!cmd_ログインする_Click としてもダメです。 フォームから同じプロジェクト内の他のフォームのイベントを起動させる方法を教えてください。 よろしくお願いします。

  • フォームの値を取得できません、その他

    初心者です。フォームに日付が入ったとき、イベント処理でCGIプログラムを実行し、結果をインラインフレーム内にホットテキストとして表示したいのですが、 まず、イベントに自信がありません。フォームの値が取得できず、それ以降の処理もできていません。詳しくご教示いただけないでしょうか。 <FORM name="dateFORM" action="dateFORM.cgi" target="heute_artikel"><INPUT type="text" name="day" onfocus="dateFORM.cgi"><INPUT type="text" name="month"></FORM> としておいて、日付を増減するボタンを押すたびに、下のfunction setDatumIntoForm()を呼んで、数字をこのフォームに入れ、その数字をフォーム側がonfocus イベント処理で取得して、dateFORM.cgiを呼び、以下のような処理をさせたいのです。 function setDatumIntoForm(gkibakday, globalmonth) ////フォームに月日をいれる { document.dateFORM.day.value= globalday; document.dateFORM.year.value= globalmonth; } ** 以下はイベントで呼び出される dateFORM.cgi です ************************* #!/usr/local/bin/perl require 'cgi-lib.pl'; ##フォーム(dateFORM)の数字を取得したい。 &ReadParse(*dateFORM);  $day = $dateFORM{'day'}; $mon = $dateFORM{'month'}; ##これができません opendir(DIR, "kalender"); while ($file = readdir(DIR)) closedir(DIR); $todaystr=$mon'.'$day; #次に検索する/表示する for (@file) { $FLname = $_; $find = index $FLname, $todaystr; # 検索 if ($find =1) { <a href=$FLname>todaysKalenderFiles; #関連づけして、インラインフレームtodaysKalenderFilesにタイトルだけを表示したい。 } } exit;

    • ベストアンサー
    • Perl
  • ラベルのクリックイベントについて

    現在、MDIParent1フォームに、MDI子フォーム(Form1)を表示させています。 MDIParent1フォーム,MDI子フォーム(Form1)には、それぞれlabel1が配置されています。 やりたい事 MDIParent1フォーム上のlabel1をクリックしたとき MDI子フォーム(Form1)上のlabel1のリックイベント を発生させたい よろしくお願いします

  • C#でFormのタイトルバーにボタンを追加したい

    お世話になります。 VS2008でC#のWindosフォームを使ったプログラムを開発しているのですが、 Formのタイトルバーにボタンを追加する方法を教えていただきたいです。 また、そのボタンをクリックされた場合のイベントの拾い方も教えていただけると大変助かります。 よろしくお願いします。

  • VC++.netで、フォーム上のある部分をクリックしたらイベントが発生

    VC++.netで、フォーム上のある部分をクリックしたらイベントが発生する プログラムを作りたいのですが、どうもうまく製作できません。 ボタンをつかえば出来るのですが、ボタンは配置したくありません。 フォーム上にイラストを配置する為。 開発環境は、VC++のExpressEditionです。MFCは使えません。 初心者なのですが、よろしくお願いします。

  • マウスクリック時のフォームについて

    VS2005で勉強中の初心者です。 今実験的につくっているアプリがあるのですが わからないところがあるので質問させて下さい。 今仮にフォーム1とフォーム2があるとして フォーム2はプロパティでTopMostをTrueにしてあるとします。 ここで例えば、フォーム1のコントロールを操作し その後フォーム2のボタン1を押す操作をしたいような場合 フォーム2のボタンを押下しようとクリックしても 最初の1度目ではフォーム2がアクティブな状態になるだけで ボタンを押す行動が実行されません。 フォーム2からフォーム1へ移る場合も同じ状態になります。 どちらのフォームがアクティブな状態だとしても 操作をすぐに受け入れるように作りたいと思って マウスイベントによってフォームの状態を変更するようなものを 書こうと思ったのですが それは遠回りな方法で、本当はフォームのプロパティ等で簡単に 設定できるものなのかもしれないと考え、質問させていただきました。 つたない説明で申し訳ありませんが よろしくお願いいたします。

  • Windowsフォームを思通りにデバッグできない

    こんにちは。Visual Studio 2012を勉強しようとしていますが、さっそくつまずきました。 言語はC#で、Windowsフォームを作成しました。 WindowsフォームでForm1というフォームを作成。 F5のデバッグの開始で正しく実行されました。 次にソリューションエクスプローラーから追加で、Windowsフォームを追加しました。このフォームの名前をForm2にしました。 これでF5のデバッグの開始をクリックしたら、Form1が起動してきました・・・ Form2でデバッグの開始を行いたいのですが、どのように実行すればよいでしょうか?