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

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

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

Re[5]: notifyicon多重表示回避


(過去ログ 40 を表示中)

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

■20829 / inTopicNo.1)  notifyicon多重表示回避
  
□投稿者/ れれれ (66回)-(2008/06/17(Tue) 15:16:43)

分類:[C#] 

お世話になっていますれれれです。

早速質問なんですが

notifyiconの多重表示を防ぐ方法を探しています。
現在は
mainclass内にnotifyiconコンポーネントを貼り付けてメインフォームが表示されるとnotifyiconが表示されるようにしています。
ところがsubclass内にてmainclassのインスタンスを作成するたびにnotifyiconが表示されます。

mainclass.Designer.csファイルにnotifyiconのプロパティやイベントについての設定が書かれているためです。


subclass内

mainclassインスタンス作成

mainclassでpublic変数宣言やInitializeComponent();を実行//多重表示発生

となっています。

どうすれば回避できるでしょうか?
引用返信 編集キー/
■20832 / inTopicNo.2)  Re[1]: notifyicon多重表示回避
□投稿者/ Jitta on the way (116回)-(2008/06/17(Tue) 21:55:07)
No20829 (れれれ さん) に返信

メインが沢山出来るということが、変だと思います。一つしか作らないようにすればいいのでは?
あるいは、何故沢山作るのでしょう?
引用返信 編集キー/
■20844 / inTopicNo.3)  Re[2]: notifyicon多重表示回避
□投稿者/ れれれ (68回)-(2008/06/18(Wed) 11:04:05)
No20832 (Jitta on the way さん) に返信
> ■No20829 (れれれ さん) に返信
>
> メインが沢山出来るということが、変だと思います。一つしか作らないようにすればいいのでは?
> あるいは、何故沢山作るのでしょう?

mainclassにシリアルポートコンポーネントをpublicで宣言していてsubclassがsubclassフォームを開いてシリアル通信を行うたびにmainclassのインスタンスが作られてしまうのです。
mainclass, subclassともにpublic partial classとしています。(もとからですが)

public partial class Mainclass : Form
{
・・・
Subclass sub = new Subclass();
・・・
sub.show();
}

public partial class Subclass : Form
{
・・・・
private void button1_Click(object sender, EventArgs e) //シリアル通信をおこなう
{
Mainclass main = new Mainclass(); // notifyicon多重表示
・・・
}
}

Mainclass main = new Mainclass();をprivate以外のところで実行すると無限ループに入ったので上記のようにしました。
引用返信 編集キー/
■20845 / inTopicNo.4)  Re[3]: notifyicon多重表示回避
□投稿者/ επιστημη (1102回)-(2008/06/18(Wed) 11:12:15)
επιστημη さんの Web サイト
> private void button1_Click(object sender, EventArgs e) //シリアル通信をおこなう
> {
> Mainclass main = new Mainclass(); // notifyicon多重表示
> ・・・
> }

ボタンが押されるたんびに Mainclass が生成されてますが、これが"正しい使い方"なのですか?
どこかで最初に一個だけ作っておいて、使いまわしてはいかんのでしょうか。

引用返信 編集キー/
■20853 / inTopicNo.5)  Re[4]: notifyicon多重表示回避
□投稿者/ れれれ (69回)-(2008/06/18(Wed) 12:50:20)
No20845 (επιστημη さん) に返信
>> private void button1_Click(object sender, EventArgs e) //シリアル通信をおこなう
>> {
>> Mainclass main = new Mainclass(); // notifyicon多重表示
>> ・・・
>> }
>
> ボタンが押されるたんびに Mainclass が生成されてますが、これが"正しい使い方"なのですか?
> どこかで最初に一個だけ作っておいて、使いまわしてはいかんのでしょうか。
>
  private void button1_Click(object sender, EventArgs e) //シリアル通信をおこなう
  {
    Mainclass main = new Mainclass(); // notifyicon多重表示
    ・・・
  main.Dispose(); 
  }
としたらnotifyiconが多重表示されなくなりました(表示されてすぐ消える。)
解決済み
引用返信 編集キー/
■20856 / inTopicNo.6)  Re[5]: notifyicon多重表示回避
□投稿者/ シャノン (482回)-(2008/06/18(Wed) 13:00:08)
No20853 (れれれ さん) に返信
>>ボタンが押されるたんびに Mainclass が生成されてますが、これが"正しい使い方"なのですか?
>>どこかで最初に一個だけ作っておいて、使いまわしてはいかんのでしょうか。
>>
>   private void button1_Click(object sender, EventArgs e) //シリアル通信をおこなう
>   {
>     Mainclass main = new Mainclass(); // notifyicon多重表示
>     ・・・
>   main.Dispose(); 
>   }
> としたらnotifyiconが多重表示されなくなりました(表示されてすぐ消える。)

それでいいんか。
本当にそれでいいんか。
引用返信 編集キー/
■20860 / inTopicNo.7)  Re[6]: notifyicon多重表示回避
□投稿者/ れれれ (70回)-(2008/06/18(Wed) 15:40:53)
No20856 (シャノン さん) に返信
> ■No20853 (れれれ さん) に返信
> >>ボタンが押されるたんびに Mainclass が生成されてますが、これが"正しい使い方"なのですか?
> >>どこかで最初に一個だけ作っておいて、使いまわしてはいかんのでしょうか。
> >>
まず「使いまわす」というのがよくわかりません。

privateメソッド内の変数はその中でしか使えませんからシリアル通信するごとに(privateメソッドを実行するごとに)インスタンスを作らないといけないと考えています。
publicだと、MainclassでSubclassのpublicインスタンスを作って、SubclassでMainclassのpublicインスタンスを作ると無限ループに入り例外になります。

http://www.atmarkit.co.jp/fdotnet/csharp_abc2/csabc2_003/cs2_003_01.html#cs0302
を参考に考えています。

ひょっとしてnamespaceに作るなんて出来るのでしょうか?(シリアルポートコンポーネントはMainclassで宣言したのでできないと思います)
引用返信 編集キー/
■20861 / inTopicNo.8)  Re[3]: notifyicon多重表示回避
□投稿者/ よねKEN (156回)-(2008/06/18(Wed) 16:36:20)
2008/06/18(Wed) 16:37:38 編集(投稿者)

例えば、以下のようにするのではダメでしょうか?

> public partial class Mainclass : Form
> {
> ・・・
> Subclass sub = new Subclass();
> ・・・
sub.Owner = this;

> sub.show();
> }
>
> public partial class Subclass : Form
> {
> ・・・・
> private void button1_Click(object sender, EventArgs e) //シリアル通信をおこなう
> {
× Mainclass main = new Mainclass(); // notifyicon多重表示
○ Mainclass main = (Mainclass)this.Owner;
> ・・・
> }
> }

もしダメだとしたら何がダメでしょうか?
なぜSubclassでMainclassをnewしているのでしょう?
#なぜMainclassをnewするの?という疑問点は既にJittaさんをはじめとして
#指摘されていますが、再度繰り返します。

> (シリアルポートコンポーネントはMainclassで宣言したので...(略)

Mainclassに配置したシリアルポートコンポーネントというのを使用したいがためであれば、
そのシリアルポートコンポーネントをSubclassに配置すればいいように思えるのですが。

引用返信 編集キー/
■20863 / inTopicNo.9)  Re[4]: notifyicon多重表示回避
□投稿者/ bad14mg (13回)-(2008/06/18(Wed) 17:00:05)
No20861 (よねKEN さん) に返信
> 2008/06/18(Wed) 16:37:38 編集(投稿者)
> 
> 例えば、以下のようにするのではダメでしょうか?
> 〜〜〜略
> もしダメだとしたら何がダメでしょうか?
> なぜSubclassでMainclassをnewしているのでしょう?
> #なぜMainclassをnewするの?という疑問点は既にJittaさんをはじめとして
> #指摘されていますが、再度繰り返します。

sub.show()しているMainclassのオブジェクトと
subclassのボタン押下時に生成しているMainclassのオブジェクトは
同一のもだと思われているように感じます。
もしくは、クラスをVBでいうところのモジュールと勘違い?

>>(シリアルポートコンポーネントはMainclassで宣言したので...(略)
> 
> Mainclassに配置したシリアルポートコンポーネントというのを使用したいがためであれば、
> そのシリアルポートコンポーネントをSubclassに配置すればいいように思えるのですが。
> 
私もこのほうがすっきりすると思います。

引用返信 編集キー/
■20890 / inTopicNo.10)  Re[4]: notifyicon多重表示回避
□投稿者/ れれれ (71回)-(2008/06/19(Thu) 12:31:57)
2008/06/19(Thu) 12:34:40 編集(投稿者)

No20861 (よねKEN さん) に返信


> もしダメだとしたら何がダメでしょうか?
提示してくださったコードでも動きましたし、処理が速くなったのでこちらでもいいと思います。

> なぜSubclassでMainclassをnewしているのでしょう?
クラス間で一つのコンポーネントを操作する場合(?)の方法としてインスタンスを作成する、しか知らないからです。 
Ownerというプロパティを教えてくれてありがとうございます

> Mainclassに配置したシリアルポートコンポーネントというのを使用したいがためであれば、
> そのシリアルポートコンポーネントをSubclassに配置すればいいように思えるのですが。

Mainclassでもシリアル通信を使うので出来れば一つのシリアルポートコンポーネントを使いまわしたいのです。
引用返信 編集キー/
■20923 / inTopicNo.11)  Re[5]: notifyicon多重表示回避
□投稿者/ Jitta (488回)-(2008/06/19(Thu) 22:45:07)
Jitta さんの Web サイト
No20890 (れれれ さん) に返信
> 2008/06/19(Thu) 12:34:40 編集(投稿者)
>
>>なぜSubclassでMainclassをnewしているのでしょう?
> クラス間で一つのコンポーネントを操作する場合(?)の方法としてインスタンスを作成する、しか知らないからです。 
> Ownerというプロパティを教えてくれてありがとうございます

 まぁ、Tag プロパティでも、いけるんだけどね。

 Mainclass というのは、Form から派生しているとおり、Form なんですね。
で、インスタンスとクラスの違いというのは、オブジェクト指向で、必ずといってもいいほどつまずくところなのですが、
NotifyIcon がたくさん表示されてしまったように、「インスタンス」というのは「実体」です。
「クラス」は、実体にたいして「設計図」といえるでしょう。
new という演算子を使っていますが、英単語の「new」って、どういう意味ですか?「新しい」ですよね。
では、「new Mainclass()」とは、何をしているのでしょう?
設計図から、新しい実体を作っているのです。
ここで新しい実体を作っているので、NotifyIcon が多数表示されてしまいます。

 「使い回し」というのは、プログラムが作られたときに、
あなたがコード化しなくても、どこかで「new Mainclass()」が実行されているわけです。
実行されていないと、フォームが表示されるはずがありませんからね。
この、勝手に作られているフォームを使いましょう、ということです。

が、、、

>>Mainclassに配置したシリアルポートコンポーネントというのを使用したいがためであれば、
>>そのシリアルポートコンポーネントをSubclassに配置すればいいように思えるのですが。
>
> Mainclassでもシリアル通信を使うので出来れば一つのシリアルポートコンポーネントを使いまわしたいのです。

ということなら、Mainclass からシリアルポートを操作する処理を引っぺがしましょう。
そうすると、Subclass が Mainclass を知る必要がなくなります。



 っていうか。
 このスレッドを見ながら思ったのですが、普通は「これをしたい」と考え、「したい」事からコード化しますね。
オブジェクト指向ってば、それをいったん置いておいて、「したいことをさせるべきなのはなんなのか」を考えなきゃいけないんですね。
難しいわけだ。
引用返信 編集キー/


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

このトピックに書きこむ

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

管理者用

- Child Tree -