• ベストアンサー

Formロード時に生成するインスタンスを、他のイベント内でも共有したい。

下記手順を踏んで作成したオブジェクトを、タイトルの通り他のイベント内でも共有したいと考えています。 1. Formロード時に、xmlファイルから400項目程度の内容を読み込む。 2. 1.で読み込んだ各内容を、クラスのフィールドに設定します。 このようにLoadイベントで生成したクラスを、他のイベント、例えば、Form画面に設定してあるボタンのクリック時にも使いたいのです。 このようなケースで、どのような方法を採るとよいでしょうか? 【この質問に関係はないかもしれませんが、 言語は、C#を使っています。】

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

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

C#がわかりませんが、参考になるかもしれないアドバイスを1つだけ。 生成したクラスをフォームのprivateで宣言する。 これ以外はモジュールを作成してクラスプロパティを作成するということしか浮かんできません。 見当違いだったらごめんなさい。

yamachan_tomo
質問者

お礼

間違えました。お礼の方ではなく補足の方にかいちゃいました。 ご意見ありがとうございます。

yamachan_tomo
質問者

補足

早速のご回答ありがとうございます。 質問してすぐだったので、びっくりしました(^^ >生成したクラスをフォームのprivateで宣言する。 >これ以外はモジュールを作成してクラスプロパティを作成するという >ことしか浮かんできません。 そうですよね。 その案は、私も考えたのですが Form内で気軽に共有フィールドを作成していいのか迷いました。 何か、手をつけたらいけないようなところに 手をつけてる感じがありました。 そのため、他にいい方法 があれば、そちらを採用したいのですが・・・・ もし、見つからなければこの方法を採用したいと思います。 privateフィールドですし、いいのかな。 マルチスレッドな環境では気をつけなければならない? ってことぐらいなのでしょうか・・・。

その他の回答 (2)

回答No.3

> 開発者がFormのフィールド変数を持つということで、 > デメリットになるというようなことはないのでしょうか。 ある意味愚問かと。 フォーム オブジェクトのフィールドに別のクラスのオブジェクトを配置してフォーム内から共有して利用するのは基本的な事ですよ。 Form-A というオブジェクトの中でしか使わない Object-Hoge は Form-A のメンバとして作成する。 フォームに配置したコントロールのオブジェクト本体はフォームのフィールドに定義されている変数です。これらをフォームの外に作成するような作り方はしません。 もちろん、今回作成しようとしているオブジェクトがこのフォームの外からも読み書きできるようにしたいというならばフォームの外に作成するべきでしょうが。

yamachan_tomo
質問者

お礼

>ある意味愚問かと。 >フォーム オブジェクトのフィールドに別のクラスのオブジェクトを配 >置してフォーム内から共有して利用するのは基本的な事ですよ。 Formの場合は、特別かと思った。 約1ヶ月前までは、Javaしか使ったことがなかったので。 何か、作法みたいなものがあるのかな~って思った。 そっか。Formの扱いに関して、特別な留意点をいっていないとこ 見ると、他のクラス同様の扱いをすればいいってことすね。

回答No.2

そのクラスのオブジェクトを保持する変数をフォームのメンバ変数として宣言すれば無問題。 private で宣言された変数はフォーム内の各所からアクセスできます。

yamachan_tomo
質問者

お礼

貴重なご意見ありがとうございます。 temtecomaiさんもANO1さんと同じ回答ですね。 今回のようなケースでは、普通はFormクラスのフィールド変数 にその値を持つのが普通みたい? ですね。 開発者がFormのフィールド変数を持つということで、 デメリットになるというようなことはないのでしょうか。

関連するQ&A

  • VB.Netのフォームロードイベントについて

    こんにちわ。 いまVB.Net2005Expressで勉強をしている者です。 あるフォームがロードされるときの処理を書こうとすると, 従来のVB6ではFormオブジェクトにLoadイベントがありましたが, VB.Net2005では,最初の状態ではフォームのイベントには 「New」,「Finalize」,「InitializeComponent」の3つしかありません。 もしVB.Net2005でForm_Loadイベントを書きたいときは, 自分で, 「Private Sub Form1_Load(Byval ~」と書かなくてはいけないのでしょうか? 初歩的な質問になるかもしれませんが,教えてください。 よろしくお願いします。

  • インスタンスを共有するには

    1つのインスタンスを他の複数のクラスで共有するには どうすればよいのでしょうか。 私が知っているは、生成時に共有したいインスタンスを渡す という方法です。 他にどのような方法があるのでしょうか。 ご存知の方がいましたらご教授くださいよろしくお願いいたします。

  • Javaプログラミング インスタンス生成時の疑問

    現在Javaを学習中の者です。 一通り入門編を終えたところで、テトリス自作に挑戦している最中です。 // 利用クラスのインスタンス生成 block = new Block(); field = new Field(); gui = new GUI(field); proc = new Proc(gui, field, block); 本体Tetrisクラスのコンストラクタ内でこのような記述をしております。 ここで疑問に感じたのですが、例えばFieldクラスにguiオブジェクトを渡したいとなった場合、どう対処するのでしょうか。 field = new Field(gui); gui = new GUI(field); これではおそらくguiインスタンス生成前にオブジェクトを渡しているためおかしな事になってしまいますよね? 実際にやりたい訳ではなく、「こうしたいときどうすればいいんだろう」と思っただけなのですが、気になったので質問させて頂きました。 模索しながら作成中のため、記述自体に突っ込みどころがあるかもしれません…。

    • ベストアンサー
    • Java
  • クラスのインスタンスの生成

    javaの勉強を始めたばかりの初心者です。 クラスのオブジェクトの生成方法は(1)の方法だけだと思っていたのですが, 本を読んでいると以下の(1)~(3)の3種類の生成の方法がでてきます。 オブジェクトの生成方法について以下の質問にお答えいただきたいです。 【質問1】 (2)のオブジェクトの生成方法は以下のような考え方でしょうか? BufferedReader br = new BufferedReader(); InputStreamRader k = InputStream(); BufferedRader br = new BufferdRader(k); これを省略して・・・ BufferedReader br = new BufferedReader(new InputStreamReader ()); 【質問2】 (3)のオブジェクト生成方法は以下の考え方でしょうか Container ct = new Container(); ct = frame.getContentPane(); これを省略して・・・・ Container ct = frame.getContentPane(); 【質問3】 オブジェクト生成方法はこの3種類の他にもあるのでしょうか 【質問4】 (1)~(3)の方法には使い分け(ルール)があるのでしょうか? 例えば「このクラスの場合この方法」というような -------------------------------------------------------------------- (1)MyClass br = new MyClass();   クラス名 オブジェクト = new コンストラクタ; -------------------------------------------------------------------- (2)BufferedReader br = new BufferedReader(new InputStreamReader ()); -------------------------------------------------------------------- (3)Container ct = frame.getContentPane(); --------------------------------------------------------------------

    • ベストアンサー
    • Java
  • [VB.NET] インスタンス生成とインテリセンス

    VB.NETの勉強をしつつ業務開発をしております。 現在、作成したクラスをインスタンス化した際、インテリセンスが表示されず、困っております。 メソッド内で生成したインスタンスからは、インテリセンスが表示されるのですが、クラス直下で生成したインスタンスでは、インテリセンスが表示されないのです。 Namespace MyName   Public Class Class1     Public Sub test1()       Debug.Print("test1呼び出し")     End Sub   End Class End Namespace Public Class Form1   Dim MyCls = New MyName.Class1 ←○MyNameのインテリセンスでClass1が表示   Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load     MyCls.test1() ←×MyNameのインテリセンスでtest1が表示されない     Dim MyCls2 = New MyName.Class1     MyCls2.test() ←○MyNameのインテリセンスでtest1が表示   End Sub End Class インテリセンスは表示されなくても、エラーにはなりません。自分で打ち込めば動作するのですが、共有利用したいので、インテリセンスの説明は表示させたいのです。 インテリセンスとは?というレベルから勉強している超初心者のため、拙い言葉遣いご容赦ください。お知恵をお借りしたく、宜しくお願いします。

  • Form1_Loadイベントのコードよりプロパティが優先?

    vb2005です。 フォーム1にDataGridView1を設置し、アクセスのテーブルにバインドしています。 デザインのプロパティでは「30」、 コードの Form1_Loadイベントには Me.DataGridView1.RowTemplate.Height = 15 として実行すると、 最初は30の行の高さで表示され、 フィールド部分をクリックして並べ替えると、 15になります。 Form1_Loadイベントに、 MsgBox(Me.DataGridView1.RowTemplate.Height) Me.DataGridView1.RowTemplate.Height = 15 MsgBox(Me.DataGridView1.RowTemplate.Height) としてみたら、 「30」→「15」となりました。 と言うことは、フォーム表示時には15にならなければいけないのに、30の高さで表示されます。 どういうことなのでしょうか? よろしくお願いします。

  • VB6でForm_Load中にイベントを発生させない方法

    VB6でForm_Loadにオプションボタンの選択を変更するとオプションボタンのクリックイベント(選択変更)が動作してしまいます。 Form_Loadの初期表示の設定をしているときは、オプションボタンのイベントを無効にしたいのですがどのようにしたら良いでしょうか? RemoveHandler等の処理があるみたいですが良く分かりません。 良い方法を教えてください。 宜しくお願いします。。

  • VB.net(2005)でFormのLoadイベント処理について質問で

    VB.net(2005)でFormのLoadイベント処理について質問です 設定時刻として9:00とします。 formを起動した時刻が9時前ならまで何もせず。 9時以降になれば処理を開始する。 といったプログラムを作成しようと思います。 サンプル) Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load Dim settingtime As DateTime '現在時刻を設定 Dim nowtime As DateTime = System.DateTime.Now.ToShortTimeString '設定時間を9時 settingtime DateTime = DateTime.Parse("9:00").ToShortTimeString '現在時刻が9時より後のとき If nowtime < setting Then         処理A Else '現在時刻が9時より前のとき         9時まで処理Aをしない(9時になれば処理Aを開始) End If End Sub 上記のようにコーティングしましたが、 呼び出した時が9時以降なら処理Aをして以前ならElseの処理を行い抜けてしまいます。 9時になれば処理をAをしたいのです。 formを呼び出しにTimerのTickイベントで9時になれば処理Aを開始? なにかいい案があればよろしくお願いします。

  • オブジェクト指向について質問

    メインのクラスをインスタンスする際にコンストラクターに書かれている処理が実行されますが、オブジェクトが生成された時のイベントに書くのと、どのような違いがありますか? public partial class Form1 : Form{ public Form1()//コンストラクター {処理1} private void Form1_Load(object sender, EventArgs e)//インスタンス時のイベント {処理2} } また、別クラスの中でnewを使ってインスタンスがされ場合、コンストラクターと上記のイベントは同じように発生しますか? public class Form2{ Form1 = new Form1(); } よろしくおねがいします。

  • オブジェクト生成時のセオリーについて

    オブジェクト指向を採用しているプログラミング言語において、ほとんどの場合、オブジェクト生成時に使用されるコンストラクタは返り値を持てません。 また、コンストラクタにて例外を投げるといったことは推奨されていないケースが多いです。 そんな中で、コンストラクタに何らかの引数を渡してインスタンスを生成するクラスの場合、不十分な引数を渡すことで使用できない状態となるインスタンスが生成されることがあります。 こういったことを踏まえて、渡される引数が適しているものであることを確認する役割というのは使用されるクラス自身が担うのか、クラスを生成する外部の処理(ファクトリー的なクラス・メソッド)が担うのか、どちらが一般的なセオリーなんでしょうか? 無論、不十分なインスタンスが誤って使用されないようにメソッドにエラー処理をかけ、「使用できない状態のオブジェクトである」ことを通知するのは当然なのでしょう。 ただ、最近知り合いから「クラスはできるだけ不変な状態を保つよう設計した方がいい。そのほうが使いやすく、再利用時のバグが減る」という話を聞いて状態を持たないクラスの設計というのを考えこんでしまい、悩んでいます。 わかりにくい質問かもしれませんが、回答よろしくお願いします。

専門家に質問してみよう