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

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

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

DLLから呼び出し元のコントロールを更新する方法

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

■83436 / inTopicNo.1)  DLLから呼び出し元のコントロールを更新する方法
  
□投稿者/ 村田 邦夫 (1回)-(2017/03/23(Thu) 16:34:58)

分類:[VB.NET/VB2005 以降] 

初めて質問させていただきます。
【開発環境】
●Windows7 Pro SP1
●VB.Net2015 14.0.25420.1
●FrameWork 4.6.01055

【質問内容】

親となるExeから、フォームを持つDLLを動的にロード後、
(DLLのフォームは親Exeにドッキングされるようなイメージです)
親となるExeのフォームに配置してあるプログレスバーを
DLL側より直接参照し進捗させる方法をご教授いただきたいのですが。
何卒、宜しくお願いいたします。

引用返信 編集キー/
■83437 / inTopicNo.2)  Re[1]: DLLから呼び出し元のコントロールを更新する方法
□投稿者/ なちゃ (197回)-(2017/03/23(Thu) 16:46:44)
直接参照して直接操作するというのはあまりおすすめしませんが、普通にdll側でプロパティとかにして、Formから渡してやるというふうにはできないですか?
引用返信 編集キー/
■83463 / inTopicNo.3)  Re[2]: DLLから呼び出し元のコントロールを更新する方法
□投稿者/ 村田 邦夫 (2回)-(2017/03/24(Fri) 13:42:30)
No83437 (なちゃ さん) に返信
> 直接参照して直接操作するというのはあまりおすすめしませんが、普通にdll側でプロパティとかにして、Formから渡してやるというふうにはできないですか?

さっそくの返信、誠にありがとうございます。
今回質問させていただいた件に関しては、確かに返信内容の通りと思います。
現在弊社において、ある物件のシステム開発を行っており、
今回のプログレスバー進捗の質問に関しては、一例として質問させていただきました。
今後、システム開発中に同様な仕様が発生する場面が考えられますので、
ぜひ、DLL側から親Exeのフォームに配置したコントロール(今回の場合はプログレスバー)を
直接操作する方法を、再度ご教授のほどお願いいたします。


引用返信 編集キー/
■83465 / inTopicNo.4)  Re[3]: DLLから呼び出し元のコントロールを更新する方法
□投稿者/ なちゃ (199回)-(2017/03/24(Fri) 14:00:26)
dll側からは何が見えて、親フォームとdll側のフォームの関係がどうなっているか、その当たりを明確にできるでしょうか?
今一つどういう関係になっているのかわかりません。
また、プログレス以外にもいろいろあるかもしれないということですが、例えばコントロールの名前はわかっている前提とか、いろいろ条件があるはずです。

ただどちらにしても、親のコントロールを直接いじるのはやっぱりおすすめはできないです。
まあやむを得ないこととかもありますけどね。

引用返信 編集キー/
■83469 / inTopicNo.5)  Re[1]: DLLから呼び出し元のコントロールを更新する方法
□投稿者/ 魔界の仮面弁士 (1214回)-(2017/03/24(Fri) 14:56:48)
No83436 (村田 邦夫 さん) に返信
> (DLLのフォームは親Exeにドッキングされるようなイメージです)

「ドッキング」というのが良く分からなかったです。

Show メソッドの引数もしくは Owner プロパティで
親子関係を割り当ててある状態でしょうか。
(親フォームを閉じると子フォームも閉じられる状態)

それとも、どちらが親フォームということもなく、
並列で並べて表示されている状態のことでしょうか。
(どちらのフォームも個別に閉じることができる)

あるいは、TopLevel = False にしたフォームを
親フォーム.Controls.Add() で配置している状態でしょうか。



> 親となるExeのフォームに配置してあるプログレスバーを
> DLL側より直接参照し進捗させる方法をご教授いただきたいのですが。

(案1)「プログレスバーを操作するための Interface」を
 親フォームに Implements し、そのメソッドが呼ばれたときに
 親自身のプログレスバーが操作されるようにしておく。
 子フォームは、その Interface のメソッドを呼び出すことで
 親 EXE のプログレスバーを操作する。

(案2)「プログレスバーを管理する Singleton Class」を用意し、
 子フォームは、そのクラスに対して進捗変更を報告するようにし、
 親フォームは、そのクラスの変更通知イベントに応じて
 自身のプログレスバーを操作するように実装する。
引用返信 編集キー/
■83470 / inTopicNo.6)  Re[4]: DLLから呼び出し元のコントロールを更新する方法
□投稿者/ ぷよぷよ (1回)-(2017/03/24(Fri) 15:00:07)
プログレスバーを含むフォームのクラスがDLLにあるのであれば
DLL内で処理が完結すると思いますが、
そうではないんですよね?

DLL…処理担当
EXE…UI担当
であれば、DLL側で進捗イベントを発行し、
これをEXE側で受け取ってプログレスバーに反映する、というのが
望ましいのではないでしょうか?

DLLからEXE側を参照できるような設計はおかしいです。
引用返信 編集キー/
■83471 / inTopicNo.7)  Re[4]: DLLから呼び出し元のコントロールを更新する方法
□投稿者/ 村田 邦夫 (3回)-(2017/03/24(Fri) 15:18:11)
No83465 (なちゃ さん) に返信
> dll側からは何が見えて、親フォームとdll側のフォームの関係がどうなっているか、その当たりを明確にできるでしょうか?
> 今一つどういう関係になっているのかわかりません。
> また、プログレス以外にもいろいろあるかもしれないということですが、例えばコントロールの名前はわかっている前提とか、いろいろ条件があるはずです。
>
> ただどちらにしても、親のコントロールを直接いじるのはやっぱりおすすめはできないです。
> まあやむを得ないこととかもありますけどね。
>

  操作員が、親Exeの画面より複数の処理条件を選択し、
  条件の組み合わせにより、DLLの起動順が
    @ABC.DLL → XYZ.DLL → DEF.DLLの順で起動  
AXYZ.DLL → ABC.DLL → DEF.DLLの順で起動
  など、DLLの起動順序を変える処理を考えております。
その際、各DLLの進捗状況を、親Exeのフォームに配置した
  プログレスバー1個で表現したいと考えてております。
  又、DLLの仕様変更等が発生した場合も考慮し、DLLの呼び出し
  方法は動的ロードで考えており、親Exeのフォームに配置した
  プログレスバーのコントロール名は固定で考えております。
  他に親Exeのフォームに配置したラベル、テキストボックス等も
  コントロール名は固定とし、DLL側より直接更新できればと
  思っております。
  ※DLL側より、プログレスバーの進捗を操作することで
   プログレスバーの背景色の進み具合がスムーズ(滑らか)に
動くと思っております。

何卒、何卒宜しくお願い申し上げます。
   










引用返信 編集キー/
■83473 / inTopicNo.8)  Re[5]: DLLから呼び出し元のコントロールを更新する方法
□投稿者/ Jitta (279回)-(2017/03/24(Fri) 15:46:52)
No83471 (村田 邦夫 さん) に返信

普通は、DLLからイベントを通知し、
親でイベントを処理をします。
イベントを親へ伝搬させる仕組みが必要ですが、
面倒なのは、まぁ、それくらいでは?
自分の面倒は自分で見る、がオブジェクト志向の基本です。
引用返信 編集キー/
■83477 / inTopicNo.9)  Re[2]: DLLから呼び出し元のコントロールを更新する方法
□投稿者/ なちゃ (201回)-(2017/03/24(Fri) 16:42:18)
同じくドッキングというのがイメージわかなくて、何か特殊な方法が必要になるのかとも思いましたが、話聞いた感じだと、普通にイベントなり進捗報告用インターフェースなりで、フォームに通知するのが自然だと思います。
インターフェースを処理側に渡すのが難しければ、実行コンテキスト的なやり方で自動で受け渡す方法もなくはないです。
あるいは上でも出てますがシングルトンなどでも良いです。
引用返信 編集キー/
■83528 / inTopicNo.10)  Re[3]: DLLから呼び出し元のコントロールを更新する方法
□投稿者/ 村田 邦夫 (4回)-(2017/03/27(Mon) 09:59:03)
No83477 (なちゃ さん) に返信
> 同じくドッキングというのがイメージわかなくて、何か特殊な方法が必要になるのかとも思いましたが、話聞いた感じだと、普通にイベントなり進捗報告用インターフェースなりで、フォームに通知するのが自然だと思います。
> インターフェースを処理側に渡すのが難しければ、実行コンテキスト的なやり方で自動で受け渡す方法もなくはないです。
> あるいは上でも出てますがシングルトンなどでも良いです。
解決済み
引用返信 編集キー/

このトピックをツリーで一括表示


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

このトピックに書きこむ