位置情報で子どもの居場所をお知らせ

Visual C# 2008を学習中なんですが、とりあえず何か作ってみようと思って、パラパラマンガに挑戦してみました。
Form1にpictureBox1を作り、waitを入れてイメージを書き換えるという単純なものです。
ところが実行しようと思ったら、「静的でないフィールド、メソッド、またはプロパティ’WindowsFormApplication1.Form1.pictureBox1’でオブジェクト参照が必要です」というエラーが出ます。その際のフォーカスは、main()内の
Form1.pictureBox1.image = Image.FromFile("motion1.png");
”Form1.pictureBox1”に当てられています。

何が原因と考えられるでしょうか。
もし情報不足であればご指摘いただくか、あるいはこの目的においてやらなければいけないこと、を大雑把に教えていただくだけでも幸いです。
よろしくお願いします。

このQ&Aに関連する最新のQ&A

C++ 学習」に関するQ&A: C言語の学習について

A 回答 (2件)

main()内に記述されているとのことですので、たぶん、


Form1.pictureBox1.Image=Image.FromFile("motion1.png");
Application.Run(new Form1());
と書いているのではないでしょうか?

連載 改訂版 C#入門 第3章 クラスとインスタンス
http://www.atmarkit.co.jp/fdotnet/csharp_abc2/cs …

ここであるように、オブジェクト指向にはクラスとインスタンスという概念があります。
今のコードでは、Form1クラスを操作しようとしているのでそのようなエラーが出ます。

具体的な解決方法としては、PictureBoxに初期画像を設定する処理をForm1のコンストラクタでやるのがいいと思います。
その際、redfox63さんがおっしゃられるように
this.pictureBox1
と記述することが必要です。(thisは自分自身のインスタンスを指します)

後は、Windowsフォームで一定間隔での処理をするための「Timerコンポーネント」について調べてみたらいいと思います。

タイマにより一定時間間隔で処理を行うには?(Windowsタイマ編)
http://www.atmarkit.co.jp/fdotnet/dotnettips/372 …

MSDNライブラリ Timerクラス
http://msdn.microsoft.com/ja-jp/library/system.w …

参考URL:http://www.atmarkit.co.jp/fdotnet/csharp_abc2/in …
    • good
    • 2
この回答へのお礼

ご回答いただき、ありがとうございました。
ご紹介いただいたサイトも大変勉強になります。

お礼日時:2008/08/19 10:37

デバッグ実行でエラーになるコード特定しその周辺のコードを投稿しましょう



他のフォームから操作するのでなければ
Form1.pictureBox1と記述するより this.pictureBox1といった記述の方がいいように思います
    • good
    • 1
この回答へのお礼

ご回答いただき、ありがとうございました。
無事解決しました。

お礼日時:2008/08/19 10:36

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

QC#にて別クラスの関数を使いたい

C#にて、別クラスの関数を使用する方法を教えてほしいです。

下記のような、構造体を受け取るメソッドを作りました。

*****************************
private struct MyPoint
{
public int x;
public int y;
}

private void proc1(MyPoint pt)
{
MessageBox.Show("座標:" ; pt.x + "," + pt.y + "実行結果");
}

private void button1_Click(object sender ,System.EventArgs e)
{

MyPoint pt;
pt.x = 10;
pt.y = 20;
proc(pt);
}
*****************************

別のフォームのクラスから、proc1を呼び出したいのですが、やり方がわかりません。
どうか、教えてください。

Aベストアンサー

同じ定義をしたとしても別の名前空間に書いた構造体は同一とはみなされません。

呼び出し先クラスでの構造体を private では無く、public で宣言して下さい。

呼び出し元では、

MyClass.MyPoint pt;

のようにして実体を作ります。

QC#で共有変数の定義をするには

C#で共有変数の定義をするには、どうしたらよいでしょうか。具体的には、起動パラメータで、任意の文字列(3~4バイト)を渡して、C#アプリケーションを、起動し、プログラムの任意の場所で、そのパラメータを参照したいと考えています。起動パラメータの受け取りは、できるのですが、そのパラメータを、プログラムのどこからも参照できる領域(ここの定義方法が不明)に格納するには、どうしたらよいでしょうか。(2重起動を許す前提です。実行時に1つの目のプログラムにはパラメータ"XYZ"を渡し、2つ目のプログラムを起動時にはパラメータ"ABCD"を渡し、その値により、プログラムの動作を制御したいと思っています)
Windows-xp visual-studio2008 C#でwindowsアプリケーションを作成しています。

Aベストアンサー

namespace test1
{
  static class Program
  {
    /// <summary>
    /// アプリケーションのメイン エントリ ポイントです。
    /// </summary>
    [STAThread]
    static void Main(string[] args)
    {
      if (args.Length > 0)
      {
        strArg = args[0];
      }
      Application.EnableVisualStyles();
      Application.SetCompatibleTextRenderingDefault(false);
      Application.Run(new Form1());
    }
    // ここに記述
    static public string strArg = null;
  }
}

メインクラスのメンバーとしてスコープが有効な場所に記述します

namespace test1
{
  static class Program
  {
    /// <summary>
    /// アプリケーションのメイン エントリ ポイントです。
    /// </summary>
    [STAThread]
    static void Main(string[] args)
    {
      if (args.Length > 0)
      {
        strArg = args[0];
      }
      Application.EnableVisualStyles();
      Application.SetCompatibleTextRenderingDefault(false);
      Application.Run(n...続きを読む

Qオブジェクト参照がオブジェクト インスタンスに設定されていません  というエラーについて

タイトルの「オブジェクト参照がオブジェクト インスタンスに設定されていません」についてですが、

このエラーは、

null を参照しようとして例外が発生している

エラーだと解釈しているのですが、nullでないのに、このエラーが出る場合はどのように対処すればいいのか教えてください。

下記のような文があるとします。

Dim aaa as String
'aaaは、データベースからデータをとってきています。

If aaa IsNot DBNull.Value Then
DropDownList.SelectedItem.Text = aaa.TrimEnd 'ここでエラー
End If

aaaは、NullではないのでIf文の中に入っていくのですが、DropDownListにデータを入れようとすると、タイトルのようなエラーが発生します。

デバッグでaaaの値を見ても、ちゃんとデータが入っているし、Nullではないのですが、なぜこのようなエラーが出るのかわかりません。

このエラーは他に違う意味があるのでしょうか?

また、他に影響している部分があるのでしょうか?

どなたか教えてください。

よろしくお願いいたします。

タイトルの「オブジェクト参照がオブジェクト インスタンスに設定されていません」についてですが、

このエラーは、

null を参照しようとして例外が発生している

エラーだと解釈しているのですが、nullでないのに、このエラーが出る場合はどのように対処すればいいのか教えてください。

下記のような文があるとします。

Dim aaa as String
'aaaは、データベースからデータをとってきています。

If aaa IsNot DBNull.Value Then
DropDownList.SelectedItem.Text = aaa.TrimEnd 'ここでエ...続きを読む

Aベストアンサー

SelectedIndexは何番目の行かということを示すので、数値でなければ
なりません。Items(i).Text=aaaになるiを見つけて設定します。
FindByTextかFindByValueで検索したListItemを使って、IndexOfで
インデックスを求める方法がスマートでしょうか。

http://msdn.microsoft.com/ja-jp/library/system.web.ui.webcontrols.listitemcollection.findbytext(VS.80).aspx
http://msdn.microsoft.com/ja-jp/library/system.web.ui.webcontrols.listitemcollection.findbyvalue(VS.80).aspx
http://msdn.microsoft.com/ja-jp/library/system.web.ui.webcontrols.listitemcollection.indexof(VS.80).aspx

>表示するデータと値のデータを別々に設定
Text(表示するデータ)とValue(値のデータ)を仕込んだListItemを
Add(場合によってはInsert)メソッドで追加(挿入)します

http://msdn.microsoft.com/ja-jp/library/system.web.ui.webcontrols.listitem(VS.80).aspx
http://msdn.microsoft.com/ja-jp/library/system.web.ui.webcontrols.listitemcollection.add(VS.80).aspx
http://msdn.microsoft.com/ja-jp/library/system.web.ui.webcontrols.listitemcollection.insert(VS.80).aspx

SelectedIndexは何番目の行かということを示すので、数値でなければ
なりません。Items(i).Text=aaaになるiを見つけて設定します。
FindByTextかFindByValueで検索したListItemを使って、IndexOfで
インデックスを求める方法がスマートでしょうか。

http://msdn.microsoft.com/ja-jp/library/system.web.ui.webcontrols.listitemcollection.findbytext(VS.80).aspx
http://msdn.microsoft.com/ja-jp/library/system.web.ui.webcontrols.listitemcollection.findbyvalue(VS.80).aspx
http://msdn.microsoft...続きを読む

Qインスタンス参照でアクセスできない。代わりに型名?

画面上に、
名前を入力するTextBoxがひとつと、
顧客情報を入力するDataGridViewがひとつあり、
そのDataGridViewには、連番、名前、メールアドレスの3列, 20行のデータがあります。

この2つのコントロールから入力されたデータをDBに登録したり、
DBから読み込んだ値を表示しようとしています。
(ほかにもいろいろ処理するのですが。)

データを一時的に保持しておくクラスを作ろうと考え、
わざわざインスタンスを作るまでもないと思ったので、
staic public なメンバを使用して、
以下のようなクラスを作ってみました。

  class Data {
   public class Customer
   {
    static public int no = 0;
    static public string name = "";
    static public string mailAddr = "";
   }

   static public string name = "";
   static public Customer[] customers = new Customer[20];
  }

ところが、たとえば、

  customers[0].no = 1;

のようにしようとすると、

  「インスタンス参照でメンバー 'Data.Customer.no' にアクセスできません。代わりに型名を使用してください。」


となります。
どういう意味でしょう?
また、どうすれば static public の配列を持てるでしょうか?
(そもそもこういうやりかたはしない?)

よろしくお願いします。

画面上に、
名前を入力するTextBoxがひとつと、
顧客情報を入力するDataGridViewがひとつあり、
そのDataGridViewには、連番、名前、メールアドレスの3列, 20行のデータがあります。

この2つのコントロールから入力されたデータをDBに登録したり、
DBから読み込んだ値を表示しようとしています。
(ほかにもいろいろ処理するのですが。)

データを一時的に保持しておくクラスを作ろうと考え、
わざわざインスタンスを作るまでもないと思ったので、
staic public なメンバを使用して、
以下のようなクラスを作っ...続きを読む

Aベストアンサー

   public class Customer
   {
    static public int no = 0;
    static public string name = "";
    static public string mailAddr = "";
   }
と書いたとき、no 等が定義されるのはそのインスタンス(new 等で生成したモノ)ではなくクラスそのものになります。一方、customers 自体はともかくcustomers[0] に入っているモノはインスタンスです。
したがって、そのインスタンスで定義されていない no へのアクセスはできません。

Customer の定義を
   public class Customer
   {
    public int no = 0;
    public string name = "";
    public string mailAddr = "";
   }
と変えましょう。

……でもこの修正をしてもコンパイル時じゃなくって実行時にエラーが出るんじゃないかなぁ?

   public class Customer
   {
    static public int no = 0;
    static public string name = "";
    static public string mailAddr = "";
   }
と書いたとき、no 等が定義されるのはそのインスタンス(new 等で生成したモノ)ではなくクラスそのものになります。一方、customers 自体はともかくcustomers[0] に入っているモノはインスタンスです。
したがって、そのインスタンスで定義されていない no へのアクセスはできません。

Customer の定義を
   public class Customer
 ...続きを読む

QC# ログイン画面からメイン画面への画面遷移について

C# ログイン画面からメイン画面への画面遷移について

C#での画面遷移に関する質問です。
ログイン画面からメイン画面に遷移する場合、どの様な方法で遷移すれば良いのか
迷っています。

現状では以下の方法で遷移していますが、より適切な方法をご存じの場合
ご教示下さい。

(1)Program.csにおいてApplication.Run(new LoginDialog())で
ログイン画面を表示

(2)ログインボタンクリックメソッドでログイン成功時、
メイン画面インスタンスを生成・表示し、ログイン画面を非表示。
(後でログイン画面を再表示することがある為)

---------------------------------------------------------------------
private void LoginButton_Click(object sender, EventArgs e)
{
   /* ログイン処理 */

   //ログイン成功時
   //メイン画面インスタンス生成
   MainForm mainForm = new MainForm();
   //ログイン画面インスタンスを代入
   mainForm.loginForm = this;
   //メイン画面表示
   mainForm.Show();
   //ログイン画面非表示
   this.Visible = false;
}
---------------------------------------------------------------------

また上記の方法だとメイン画面を閉じても、アプリケーションは終了しない為
メイン画面の閉じるボタンを押した場合に以下の処理を行っています。

---------------------------------------------------------------------
private void MainForm_FormClosing(object sender, FormClosingEventArgs e)
{
   //ログイン画面クローズ
   loginForm.Close();
}
---------------------------------------------------------------------

以上、宜しくお願いします。

C# ログイン画面からメイン画面への画面遷移について

C#での画面遷移に関する質問です。
ログイン画面からメイン画面に遷移する場合、どの様な方法で遷移すれば良いのか
迷っています。

現状では以下の方法で遷移していますが、より適切な方法をご存じの場合
ご教示下さい。

(1)Program.csにおいてApplication.Run(new LoginDialog())で
ログイン画面を表示

(2)ログインボタンクリックメソッドでログイン成功時、
メイン画面インスタンスを生成・表示し、ログイン画面を非表示。
(後でログイン画面を再表示す...続きを読む

Aベストアンサー

#2です。
最初にログイン画面のみを表示したいなら
メイン画面のForm_menu_Load(loadイベント処理)
の中で、ログイン画面をモーダル表示し、
NGならメイン画面のcloseのほうがよいかも知れません。

Q別のフォームで記述している関数を実行するには?C#

お世話になります。ド素人な質問ですみません。
C#なのですが例えばForm1で記述した関数(関数って呼ぶのかわかりませんが)をForm2で実行するにはどのようにしたらよいのでしょうか?
ネットで検索してみてもなかなかヒットしないのでこちらでお聞きします。

public partial class Form1 : Form
{
 public Form_OzzCalc()
 {
 InitializeComponent();
 }
 
 private void hoge()
 {
 ~
 }
}

このhoge()という関数を別のフォーム(例えばForm2)で呼び出して使うにはどのようにしたらよいのでしょうか?
privateをpublicに変更してもForm2ではこの関数を記述すると「'hoge'は現在のコンテキスト内に存在しません」と出ます。
何か参考になるサイトでも構いません。よろしくお願いいたします。

Aベストアンサー

この記述方法ですとForm1のインスタンス経由で関数を実行します

Form2側からですと

((Form1)Application.OpenForms["Form1"]).hoge();
といった具合です


下のように Form1クラスにスタティック(静的)関数を作成すれば
public static void foo()
{
}

Form2側からは
Form1.foo();
といった具合で実行できます

MessageBoxのShowがこの静的実装がされています

QC# インスタンスの破棄

C#でインスタンスの破棄を明示的に行いたいのですが、
実際の開発現場では、どのように行っているのでしょうか?

自分で調べると「ガベージコレクタ」が暗黙的に行っているようですが明示的には行わないのが普通なのでしょうか?
もしくは、「Dispose」を使用して明示的に行うのが普通なのでしょうか?

実際に開発されている方からすると簡単な事かもしれませんが教えて頂けると助かります。

以上ですが、よろしくお願いいたします。

Aベストアンサー

結論から言うと、どちらでも良いです。
できれば生成から破棄まで考えて開発できると良いですね。

ガベージコレクションが実行されることで自動開放されますから、
一切.close()や.dispose()を使わなかったとしてもプログラムが
不正終了してしまう事はほとんどありません。

実際の開発では使わなくなったものを使わなくなった時点で
明示的に破棄することが多いです。正確には明示的に破棄するもの、
明示的に破棄しないもの、の2種類に分類しています。

例えばファイルを読み書きするストリーム系のオブジェクトや
データベースとのコネクションなどです。これは開発会社や
開発チーム、案件によって若干違っていて、徹底するところや
適当なところもあります。個人的には徹底したい派ですが。。。

ガベージコレクションが発生するとプログラムの実行動作が
遅くなり、また瞬間的に大きな負担がかかることがあります。
そのため全てをガベージコレクタに任せるのではなく、
明示的に開放できるもの、メモリを大量に消費するものは
その都度、適切に開放していくことで処理効率が良くなります。

プログラミング関連の調べ物で、サンプルソース等を見ることが
あるかと思います。この時サンプルで明示的に開放していたら、
それは明示的に開放したほうが良いもの、と思いましょう。
これだけでもステップアップになりますね。

結論から言うと、どちらでも良いです。
できれば生成から破棄まで考えて開発できると良いですね。

ガベージコレクションが実行されることで自動開放されますから、
一切.close()や.dispose()を使わなかったとしてもプログラムが
不正終了してしまう事はほとんどありません。

実際の開発では使わなくなったものを使わなくなった時点で
明示的に破棄することが多いです。正確には明示的に破棄するもの、
明示的に破棄しないもの、の2種類に分類しています。

例えばファイルを読み書きするストリーム...続きを読む

QDataGridViewで指定したセルの値を取得

こんにちは。

VB2008のDataGridViewで指定したセルの値を取得をする方法がわかりません。
どなたか教えてください。

Aベストアンサー

こんばんは.

 Dim Data As String
 Data = Me.DataGridView(0, 2).Value
 MsgBox(Data)

みたいな感じで取れないですかね???

QC#でほかのファイルにある自作クラスを使用したい場合

最近Javaから移ってきたばかりのC#初心者です。
依然作ったことのあるほかのファイルにある自作クラスを
新しいファイルの自作クラスで使用したい場合、どうすれば
よいのでしょうか。
Form1.cs(8,7): error CS0246: 型または名前空間名 'Calc1' が見つかりませんでした。using ディレクティブまたはアセンブリ参照が不足しています。
Form1.cs(12,19): error CS0246: 型または名前空間名 'Calc' が見つかりませんでした。using ディレクティブまたはアセンブリ参照が不足しています。
上記のようなエラーが発生してしまいます。
なにとぞご助力をお願いいたします。

Aベストアンサー

#2>しかし、やはりうまくいきませんでした。
#1で言われているような、namespace, using 指定と参照設定でうまくいくと思うんですけど・

自作クラスを補足することはできますか?

Q同じソリューション内の別のプロジェクトのメソッド呼び出し

同じソリューション内の別のプロジェクトのメソッド呼び出し

お世話になっております。
Visual Studio でC#で開発をしております。
初心者です。

同じソリューション内にある別のプロジェクトのメソッドを呼び出す方法は
どの様にしたら宜しいのでしょうか。
下記の様に記述しましたら、
「静的でないフィールド、メソッド、またはプロパティ ~省略~ で、
 オブジェクト参照が必要です」と言うエラーが出てしまいます。
何か根本的に間違っているのかも知れません。

何卒、ご教授頂きたく宜しくお願い致します。

        記

呼び出し側
private void button1_Click(object sender, EventArgs e)

  呼び出し先のプロジェクト名.クラス名.メソッド名();
 }


呼び出される側
namespace プロジェクト名

public class クラス名

   メソッド名()
   {
     処理内容
    }
  }
 }

Aベストアンサー

ソリューション エクスプローラにおいて、呼び出し側のプロジェクト ツリーの「参照設定」を右クリックして、「参照の追加」を実行、ダイアログの「プロジェクト」タブにおいて、呼び出される側のプロジェクトを選択してOKを押してください。
Visual C#のインテリセンスが正常に機能し始めれば設定が成功しています。

なお、参照設定の追加により、参照されるアセンブリは参照するプロジェクトの出力フォルダに自動的にコピーされるようになります。
また、被参照アセンブリのプログラム デバッグ データベース ファイル(.pdb)も自動的にコピーされるので、被参照側のソースにブレークポイントを置いて参照側でデバッグを開始すると、きちんとブレークポイントで停止してくれます。


このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング