C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[2]: 他のプロジェクトからメインプロジェクトのパネルを非表示にする


(過去ログ 172 を表示中)

[トピック内 4 記事 (1 - 4 表示)]  << 0 >>

■99046 / inTopicNo.1)  他のプロジェクトからメインプロジェクトのパネルを非表示にする
  
□投稿者/ エイ (23回)-(2022/02/03(Thu) 20:02:01)

分類:[.NET 全般] 

他のプロジェクトからメインプロジェクトのパネルを非表示にしたいのですが教えてください。
プロジェクト[Main.exe]=参照にTest.dll追加
プロジェクト[Test.dll]=参照にMain.exe追加してあります。
'メインプロジェクトのパネルを初期
Form_Load
Panel1.hide
end sub

'PanelにTest.dllのフォームを表示させる。
Private Sub openChildForm(childForm As Form)

        If currentForm IsNot Nothing Then currentForm.Close()
        currentForm = childForm
        childForm.TopLevel = False
        childForm.FormBorderStyle = FormBorderStyle.None
        childForm.Dock = DockStyle.Bottom
        Panel1.Controls.Add(childForm)
        Panel1.Tag = childForm
        childForm.BringToFront()
        childForm.Show()
    End Sub
'Button1をクリック
Panel1.show()
openChildForm(New Test.Form1())
end sub

Test.dllのフォームがパネル1に表示されます。
次のコードでの以下の通り↓
'Test.dllプロジェクト側のForm1コード
Form1_Load
Textbox1.hide
end sub

Button1.Click

        TextBox1.Show()

    End Sub

Private Sub TextBox1_TextChanged(sender As Object, e As EventArgs) Handles TextBox1.TextChanged
        TextBox1.Show()

        If Me.TextBox1.TextLength = 4 Then
            If TextBox1.Text = "0000" Then
                Me.Close()
        'メインプロジェクトのパネルを非表示させたい
            Else
        MessageBox.Show("IDが間違っています。", "確認")
        TextBox1.Clear()
        End If
        End if

    End Sub

引用返信 編集キー/
■99047 / inTopicNo.2)  Re[1]: 他のプロジェクトからメインプロジェクトのパネルを非表示にする
□投稿者/ エイ (24回)-(2022/02/03(Thu) 20:13:09)
長くなるので別投稿からですいません。

非共有メンバーを参照するなどのエラーになります。
メインプロジェクトにdim 変数 as New Form2と記載すれば分かるんですが。
Test.dllのフォームでテキストボックスにメインプロジェクトのパネルを非表示にすることは出来ないのでしょうか?

メインプロジェクトで
Public Sub 名前
Panel1.Hide()
End Sub


Sub 名前
Panel1.Hide()
End Sub
など(試しに)
結果はTest.dllのフォーム
Test.Form1.名前が表示されません。

別のプロジェクトでは不可能?なのでしょうか?

メインプロジェクトのパネルを非表示にしたい場合、別のプロジェクト無しで作るしか無いんでしょうか?

教えてください。

VB.Net
Net Frameworck 4.7.2です。


引用返信 編集キー/
■99048 / inTopicNo.3)  Re[1]: 他のプロジェクトからメインプロジェクトのパネルを非表示にする
□投稿者/ 魔界の仮面弁士 (3288回)-(2022/02/03(Thu) 21:56:58)
No99046 (エイ さん) に返信
> 他のプロジェクトからメインプロジェクトのパネルを非表示にしたいのですが教えてください。

親が子の Panel を操作するような状況ではなく、
子が親の Panel を操作するという状況なのですね。


> プロジェクト[Main.exe]=参照にTest.dll追加
> プロジェクト[Test.dll]=参照にMain.exe追加してあります。
相互参照ですか…? 密結合になりすぎるので避けるべきですし、
そもそも循環参照になるので、プロジェクト参照時に拒否されませんか?

こういう場合、通常は Main が Test を参照するだけで良いはずです。
もしも両者で共通して使いたいクラスなどがある場合には、
さらに別の DLL を用意して、それを Main と Test から参照するようにします。


> 'メインプロジェクトのパネルを非表示させたい

===================
(案1) Test.dll 側に自作イベントを用意する手法

「テキストが変更された時には TextChanged イベント」
「フォームのサイズが変更されたら Resize/ResizeBegin/ResizeEnd イベント」が通知されますよね。


今回のケースなら、DLL 側が「パネルを表示したい時に、自作イベントを RaiseEvents する」ようにして、
Main.exe はそのイベントを受け取って、自身の Panel1.Visible を変化させます。

この場合、DLL 側は、親の画面構成を一切知る必要がありません。
親が自分で自分の Panel の表示を切り替えるだけです。DLL はそのタイミングをお知らせするだけ。



===================
(案2) コントロールの親子関係を利用する方法

提示されたコードの意味を理解しきれていないので確認しておきたいのですが、
Sub openChildForm というのは、Main.exe 側に書かれたコードでしょうか。

そして引数に渡している childForm とは、DLL 側で定義されているフォームであり、
Main.exe が持つ Panel1 に、子コントロールとしてDLL 側のフォームを載せる…と。

もしそうであれば、DLL 側のフォームでは、
 Me.Parent.Visible = False
のようにして、自身の親となっている Panel を隠すことができます。


非表示にしたい「メインプロジェクトのパネル」というのが、
別の Panel なのであれば、その Panel のインスタンスを DLL に渡しておきましょう。


===================
(案3) 共通のインターフェイスを定義する方法

たとえば Test.DLL 側に
 Public Interface IExample
  Property PanelVisible As Boolean
 End Interface
のようなインターフェイスを用意しておきます。

DLL を参照した Main.exe 側では、それを Form1 に実装しておきます。
 Public Class Form1
  Implements IExample
  Public Property PanelVisible As Boolean Implements IExample.PanelVisible
   Get
    Return Me.Panel1.Visible
   End Get
   Set(value As Boolean)
    Me.Panel1.Visible = value
   End Set
  End Property
 End Class


そして DLL 側には、IExample 型の変数を用意しておき、
Main 側から、このインスタンスを受け取るようにします。

あとは DLL 側で、その変数を通じて
  foo.PanelVisible = False
のように呼び出せば、Main.exe 側の実装がよびだされて、
  Me.Panel1.Visible = False
が呼ばれたのと同じ動作になります。
引用返信 編集キー/
■99056 / inTopicNo.4)  Re[2]: 他のプロジェクトからメインプロジェクトのパネルを非表示にする
□投稿者/ エイ (25回)-(2022/02/04(Fri) 14:43:36)
2022/02/04(Fri) 19:33:23 編集(投稿者)
2022/02/04(Fri) 15:01:38 編集(投稿者)

No99048 (魔界の仮面弁士 さん) に返信
魔界の仮面弁士さん回答ありがとうございます。

>子が親の Panel を操作するという状況なのですね。
そうです。

>相互参照ですか…? 密結合になりすぎるので避けるべきですし、
>そもそも循環参照になるので、プロジェクト参照時に拒否されませんか?

はい、確かにリビルドした時、ファイルが無いというエラーが出ました。

>提示されたコードの意味を理解しきれていないので確認しておきたいのですが、
>Sub openChildForm というのは、Main.exe 側に書かれたコードでしょうか。

>>Private Sub openChildForm(childForm As Form)'Main.exeのコードです。
省略(最初の投稿)します。
>>'Button1をクリック間違えました。
End Sub
>コードの意味を理解しきれていない
すいませんでした。

Button1_Click
Panel1.show()'メインプロジェクトフォームのパネルが表示です。
openChildForm(New Test.Form1())'Test.dllのフォームをパネル1に表示されます。

そのプログラム実行したい例で例えると

Main.exe→Button1→Panel1表示とTest.dllフォームが開く(Panel1に載せる)
Test.dllフォームのButton1→テキストボックス1とLabelが表示
Textbox1(Test.dllForm)に0000と入力後→新しいフォームが開く&Main.exeのPanel1を非表示になる。

>(案1) Test.dll 側に自作イベントを用意する手法
>(案2) コントロールの親子関係を利用する方法
>(案3) 共通のインターフェイスを定義する方法

Textbox1(Test.dllForm)に0000と入力後にMain.exeのPanel1を非表示にその案1〜3の指示通り
案3のコードを追加した所

>あとは DLL 側で、その変数を通じて
>  foo.PanelVisible = False
>のように呼び出せば、Main.exe 側の実装がよびだされて、
>  Me.Panel1.Visible = False
>が呼ばれたのと同じ動作になります。

Interface を調べてみます。




解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -