ベストアンサー C#コンストラクタが2回動く 2013/01/22 21:56 C#でユーザーコントロールを作成しますが、そのコントロールをフォームに配置時と実行時二回コンストラクタが動くのですが、これを実行時のみ一回にできませんか。お願いします。 みんなの回答 (2) 専門家の回答 質問者が選んだベストアンサー ベストアンサー mtaka2 ベストアンサー率73% (867/1179) 2013/01/23 00:20 回答No.2 そういうものです。 ユーザーコントロールのインスタンスは、実行時だけでなく、デザイン時(配置時)にも、フォーム上に生成されます。 (そうしないと、独自なユーザーコントロールの見た目を、デザイン画面(配置先のフォーム上)に反映させることができません) どちらのモードで実行しているかは「DesignMode」で判別できますので、 実行時だけ処理したい(配置時に処理したくない)ものについては、コンストラクタ中などで、 --- if (!DesignMode) { // デザイン時に実行したくない処理 } --- のようなコードを書くしかないでしょう。 http://msdn.microsoft.com/ja-jp/library/system.componentmodel.component.designmode%28v=vs.110%29.aspx 質問者 お礼 2013/01/23 23:19 そういう仕組みだったのですね、解決しました。ありがとうございます。 広告を見て全文表示する ログインすると、全ての回答が全文表示されます。 通報する ありがとう 0 その他の回答 (1) axuaxua ベストアンサー率36% (82/223) 2013/01/22 22:02 回答No.1 C#はいじった事がないですが、クラスの継承や明示的にコンストラクタを呼び出してないか確認してください。 応急処置としてはstaticな変数で実行したか記憶させ、実行していたら処理をスキップさせれば良いと思います。 質問者 お礼 2013/01/23 23:08 ありがとうございます。 広告を見て全文表示する ログインすると、全ての回答が全文表示されます。 通報する ありがとう 0 カテゴリ [技術者向] コンピュータープログラミング・開発C・C++・C# 関連するQ&A VB2008でユーザーコントロールのイベントについて VB2008でユーザーコントロールのイベントについて 作成したユーザーコントロールを(1)フォームに配置した時のみ実行される (2)フォームを実行した時のみ実行される それぞれ処理を分けたいのですが、適切なイベントが見つかりません。 何か区分けのできる方法はあるのでしょうか? 何方か教えていただけませんか コンストラクタについて プログラム初心者です classを使うときに使うコンストラクタについて教えてください なぜ自動で実行できるのか不思議です 質問1 このコンストラクタの使い道を教えてください。 質問2 PHPはC言語で作られているのですよね?コンストラクタを自動で実行しているC言語の処理はどうなっているのですか? 質問3 classと関数の違いがわかりません。ネットで調べると「classだと変数を保持できる」とでますが関数だと保持できないのでしょうか? よろしくお願いします コンストラクタについて VCの勉強をしています。 ちょっとショッキングなことを聞いてしまいました。 クラスのインスタンスを作成した場合、 コンストラクタは継承もとのコンストラクタもよばれる?? これって本当ですか!! MFCだとクラスの階層はだいぶ深いです。 例えば基本のCviewなんかはCObject>CCmdTarget>CWnd>Cviewの順に継承されています。 MFCでは更にCViewを継承したCTestViewなんてクラスがコードの主役です。 それでCTestViewのインスタンスを作成した場合、 コンストラクタはCTestViewのコンストラクタだけ実行すると思いますが、 ショッキングな内容ではCViewのコンストラクタも実行されてます。 これって本当にそうなるのでしょうか。 もし、そうならコンストラクタはてっぺんのCObjectから順に実行されますか。 それとも1つ上の継承先だけですか。 また、何でこんな仕組みにする必要があるのですか? 更にいえばCObjectにはSerializeという関数があります。 これをCTestView.serializeとした場合、 CObjectから順々にSerializeが呼び出されているのでしょうか? そんなことあるわけないよと、あまりにもバカバカしいのですが、 知人がそうだと言い張るのでよろしくお願いします。 ネットワークエンジニアとは?技術職の未来を考える OKWAVE コラム C#継承について 初心者です。クラスでテキストボックスを継承し、コンストラクタで値を設定していますが、 下記のコードをフォームに配置しても、テキストがabcにならないのですが、一回実行するとなります。なぜでしょうか。 できれば配置時にはすでにabcになってほしいのですが、お願いします。 public class Class1 : TextBox { public Class1() { this.Text = "abc"; } } コンストラクタの使い方? 僕はまだJavaを勉強し始めて1ヶ月ぐらいの初心者なんですけども、現段階では基本的な文法を勉強し終えた(かなと思っている)ので、Swingのほうに早速とりかかりました。その際にすごく疑問に思ったことがあるので、皆さんにお尋ねします。 public class A ......main..... class B extends Frame{ public B(String stitle){ super(stitle); } } super(stitle)のところでFrameクラスのコンストラクタが呼び出されていますよね。そこでFrameクラスのコンストラクタの定義を見てみると、僕が今まで学んできたような定義がなされていないんですけども。僕が今まで学んできたものというのは、 class Car { private int num; private double gas; public Car() { System.out.println(車を作成しました。) } } class C { ....main... { Car car1=new Car(); } } この場合の実行結果というのは、 「車を作成しました。」という文章が表示されはづですけど、これって言うのはSystem.out.println(車を作成しました。)のようにきちんと定義しているからですよね。それに対してFrameクラスのコンストラクタの定義には説明はあるものの、実行処理するための定義がされていないような気がするんですけども・・・。まだ僕はオブジェクト指向というものを理解できていないから、このようなわけのわからない質問をしている(と思う)のですが、よろしければどなたか分かりやすく教えてください。 コンストラクタ? FireFox2のエラーコンソールで以下のようなユーザ定義クラスを作成しています。 期待する動作は、documentに、 12 と出力されることです。 が、FireFoxのエラーコンソールには、 エラー: NewClass is not a constructor ソースファイル: file:///C:82%AF%E3%83%88%E3%83%83%E3%83%97/docs/temp.html 行: 20 と表示されています。おそらく、NewClass の コンストラクタの書き方が誤っているのではないかと思いますが、webで調べても正しいコンストラクタの書き方 というのが見つけ切れませんでした。期待動作を満たす為にはどのようにかけばよいでしょうか? <script type="text/javascript"> function NewClass(){ /*ここが誤っている?*/ // } NewClass = { ClassValue1:1, ClassValue2:2, ClassFunc:function() {alert('わん');} } ClassTest = new NewClass(); document.write( ClassTest.ClassValue1 ); document.write( ClassTest.ClassValue2 ); </script> メニューバーのイベントが2回実行される CommandBarControlでメニューバーを作成し、イベントを実行していますが、何故か2回実行されてしまいます。 具体的には、 Set myMenu = Application.CommandBars("Worksheet Menu Bar"). _ Controls.Add(Type:=msoControlPopup, before:=11) With myMenu .Caption = "User's MenuBar(xx)" With .Controls.Add .Caption = "フォームを開く" .OnAction = "OpenForm(2)" End With 上記で「フォームを開く」メニューバーを作成して、これを選択すると、UserForm1.Show というロジックが書かれているSubプロシジャーが実行されます。 これにより、フォームが開くのですが、どうもこのプロシジャーが2回実行されており、フォームが2つ開いているのです。 しかし、原因がわかりません。 対策としては、 1.2回実行される原因を調べる。 2.UserForm1が既に開いていたら開かないようにロジックを変更す る。 1は皆無ですし、2はUserForm1が既に開いているかをチェックするロジックが分かりません。 どなたか教えて下さい。 よろしくお願いします m(_ _)m C# コンストラクタ オーバーロード 今C#を勉強しているのですが、よくコンストラクタがわかりません。初期化をする、というのは理解できるのですが、オーバーロードの際、 int get; string get2; Person(int a ) { get=a; get2="ああ" } Person(int b,string a) { get=b; get2=a } show() { Console.WriteLine("{0}{1}"get,get2); } メインメソッド Person p1 = new Person( 1); Person p2 = new Person(2,"あ"); p1.show(); p2.show(); こうすると出力結果が 1ああ 2あ になるはずですが、(わかりずらいですが、)自分の中ではnew演算子が呼ばれたときにが呼ばれて、変数に値が入ります。そして次のnew演算子でが呼ばれて値が上書きされるので2あ 2あ になると思うのですが。それともp1.show();の時点でもう一回コンストラクタが呼ばれているのでしょうか。要は上書きされるのか、showの時にコンストラクタが呼ばれ、その値で出力されるのか、です。 コンストラクタ public ref class Himoku_Data : public System::ComponentModel::Component { //フィールド private: array<System::String ^>^ Data; public: Himoku_Data(void) { // //TODO: ここにコンストラクタコードを追加します // this->Data = {"a","b","c","d",}; InitializeComponent(); } error C2059: 構文エラー : '{' h(26) : error C2143: 構文エラー : ';' が '{' の前にありません。 h(26) : error C2059: 構文エラー : '}' コンストラクタ作成でthis-Dataの行にエラーが出てしまいます。 原因がよくわからないのでおしえてください。 カスタムコントロール(ユーザーコントロール)について こんにちわ。 例えば、Visual Basic.NETにて、 カスタムコントロール1、カスタムコントロール2・・・etcと、幾つかのカスタムコントロールを作成しておいて、 プログラムの実行時に、フォーム上に配置されたボタン1をクリックすると、フォームにカスタムコントロール1が継承されて配置される、 と言った内容のプログラムを作成したいと考えています。 とはいえ、そのようなことが実際に可能なのかどうかもわかりませんし、そもそもカスタムコントロールの作成方法も理解していません。 そこで、カスタムコントロールの作成からその利用に至るまでを易しく解説してくれているような書籍等がございましたら、教えていただけないでしょうか? よろしくお願いいたします。 コンストラクタの呼び出し コンストラクタは、インスタンスを作成した時に 呼び出されると思うのですが、その後に再度初期化 したくなったなどの場合に外部から呼び出せないの でしょうか? なぜかシンボルを呼び出せませんと出てしまいます。 何故なのでしょう?? コンストラクタ・デストラクタ プログラミング言語はC++ C++を触り始めたばかりの素人です。 コンストラクタとデストラクタについて質問です。 下記に参考にしているウェブページから簡潔にしてコードを書いてみました。 コンストラクタ、デストラクタの中はそれぞれに、○○が呼び出されましたと書いてあるだけでよく分からなかったので別のウェブページを見たら コンストラクタは Sample::Sample(){ n=0; } みたいな例があったのですが、このように変数に予め何かの値を代入しておくという事で合ってますか? デストラクタは理解できていません。 下記の例では、どのような処理を書けばいいのでしょうか? #include<iostream> using namespace std; class Sample { private: int n; public: void Show(); Sample(); ~Sample(); }; void Sample::Show() { cout << n << endl; } Sample::Sample() { // n=0; std::cout << "コンストラクタが呼び出されました" << std::endl; } Sample::~Sample() { // どんな処理? std::cout << "デストラクタが呼び出されました" << endl; } main() { Sample sample; sample.Show(); return 0; } 実行結果 コンストラクタが呼び出されました 1 ←コンストラクタ関数内の//を削除で0になることは確認 デストラクタが呼び出されました AIは使う人の年齢や市場にも影響する?人工知能の可能性 OKWAVE コラム コンストラクタとデリゲートの意味を教えてください。 コンストラクタは、起動時に自動生成される処理のことをいいますか? 1度だけ実行されるクラスをコンストラクタと言っているのですか??? デリゲートは、クラスからメソッドを呼び出すことをデリゲートといいますか? クラスから処理を別に渡すとそれはデリゲートですか??? 用語/newを伴わないコンストラクタの呼出=関数? コンストラクタを勉強しているのですが、「用語」「意味」が分からないので、教えてください ■質問1 ・いついかなる時でも、「コンストラクタ関数」=「コンストラクタ」=「関数」=「メソッド」なのでしょうか? ・例えば、「newをつけずに、コンストラクタを関数として呼ぶ」場合も、「コンストラクタを実行する」と言うのでしょうか? ■質問2 … 「new」付与による相違 ・「new」付与しないと、「コンストラクタ」内で「this」が指し示す対象が異なる(グローバルオブジェクトになってしまう)のだと思うのですが、それ以外に何か相違点はあるのでしょうか? ・「new」付与しないとオブジェクトが正しく生成されないので、不具合が生じる可能性がある? ■質問3 ・「new」を付けずに、オブジェクトを関数として実行するのは、例えばどういう使い方をするときなのでしょうか? C# ユーザーコントロール作成 C#で以下のようなユーザーコントロールを作成しています。 ・labelA、LabelBを2つ配置しただけのユーザーコントロール(UserA)を作成。 これをFormから動的に生成したいと考えています。 具体的には以下のようなコードを書きました。 UserA wUsr = new UserA(); wUsr.Location = new Point(1,1); this.Controls.Add(wUsr); この結果、ラベルはForm上に生成されなかったのですが、コードに間違いが あるのでしょうか?。 お分かりになるかたがいらっしゃればお教え頂ければと思います。 以上です。 VC6 OCXでデザイン時と実行時の判断 こんにちは、honiyonです。 VC6でOCXの作成にチャレンジしています。 コンストラクタに初期化処理を書いたのですが、フォームデザインでそのOCXを貼り付けた際にもコンストラクタが動いてエラーとなってしまいます。 そこで、実行時のみ初期化処理を実行させたいと思うのですが、デザイン時、実行時の判断の仕方が分かりません。 宜しくお願いします(.. ユーザコントロールのイベント取得について(C#) 環境:Visual Studio 2005 C# Windows Application フォームに自作のユーザコントロールを貼り付けてそのイベントを取得する勉強をしているものです。 フォームでのユーザコントロールイベントを取得して処理をする方法が分かりません。 状況 ユーザコントロールにはテキストボックスを追加しています。 また、フォームにそのユーザコントロールを追加しています。 確認したいことは、ユーザコントロールのテキストボックスになにか値を入力したタイミングでチェンジイベントをフォーム側で察知し、処理をするというものです。 どなたか、要点だけでもいいので教えていただけないでしょうか? 宜しくお願いいたします。 C#で実行可能なdllの作成方法 現在、C#でアプリケーションを作成していますが、exe形式ではなくdll形式で実行可能な モジュールを作成したいです。 しかし、単に[STAThread]のMain関数を作ったり、staticコンストラクタを作成しただけでは 起動できません。 どうしたら実行可能なdllを作成できるのでしょうか。 最終的にやりたいことは、C++のCreateRemoteThread()からこのdllを起動することです。 どうぞよろしくお願いします。 C#のカスタムコンポーネント 初めて投稿します。 C#でカスタムコンポーネント(ユーザコントロール、Windowsフォームコントロールライブラリと呼ばれる?)を作りたいと考えています。 実際に作りたいのは、ツールボックス内のダイアログカテゴリー内にあるような、ダイアログのコントロールを作りたいです。このダイアログ関係のコントロールは、コンテナ上にドロップすると、コンテナ上にオブジェクトが配置されるのではなく、エリアの下にコントロール名が表示されますが、このようなダイアログコントロールを作りたいと思っています。 イメージが伝わるか分かりませんが、通常ユーザコントロールを生成すると、以下のようにスケルトンが作られますが、 public partial class UserControl1 : UserControl これを public partial class UserControl1 : Form のようにして、Formクラスのコントロールを作りたいのですが、作り方がわからず困っています。 いろいろ調べたのですが、この手のダイアログコントロール?に関する情報が見当たらないので、もしご存知の方がいらっしゃったら、書籍でも、URLでも良いので情報ください。 よろしくお願いします。 【PHP】コンストラクタ―について コンストラクタ―について検索して調べると概ね以下のように説明されています。 ---------------------------------- コンストラクタ インスタンス生成時にオブジェクトを初期化したい場合にコンストラクタメソッドを使用できます。 コンストラクタメソッドは以下のように引数を指定する事もでき、インスタンス生成時に__construct()が自動的に実行されます。 ---------------------------------- イマイチ判然としません。 「newによってインスタンスを作成される時に自動的に呼び出されるもの」と自分では解釈していました。 例えば以下のような場合 public function __construct($text) { $this->text = $text; } 【$text】の値をnewされることによって自動的に「保持」されるということなのでしょうか? 実際に表示させるときは【$posts[0]->show();】(show()メソッド)で表示させるわけですよね? その上には【private $text;】でプロパティがあります。 ごく基本的な質問かと思いますが、【public function __construct($text)】 コンストラクタ―を作成する理由がよくわかりません。 初学者でも分かりやすいように解説していただけないでしょうか? 宜しくお願い致します。 <記述サンプル> ------------------------------- <?php class Post { private $text; public function __construct($text) { $this->text = $text; } public function show() { printf('%s' . PHP_EOL, $this->text); } } class SponsoredPost extends Post { private $sponsor; public function __construct($text, $sponsor) { parent::__construct($text); $this->sponsor = $sponsor; } public function showSponsor() { printf('%s', $this->sponsor); } } $posts = []; $posts[0] = new Post('hello'); $posts[1] = new Post('hello again'); $posts[2] = new SponsoredPost('hello hello', 'Yahoo'); $posts[0]->show(); $posts[1]->show(); $posts[2]->show(); $posts[2]->showSponsor(); 注目のQ&A 「You」や「I」が入った曲といえば? Part2 結婚について考えていない大学生の彼氏について 関東の方に聞きたいです 大阪万博について 駅の清涼飲料水自販機 不倫の慰謝料の請求について 新型コロナウイルスがもたらした功績について教えて 旧姓を使う理由。 回復メディアの保存方法 好きな人を諦める方法 小諸市(長野県)在住でスキーやスノボをする方の用具 カテゴリ [技術者向] コンピューター プログラミング・開発 Microsoft ASPC・C++・C#CGIJavaJavaScriptPerlPHPVisual BasicHTMLXMLCSSFlashAJAXRubySwiftPythonパフォーマンス・チューニングオープンソース開発SEOスマートフォンアプリ開発その他(プログラミング・開発) カテゴリ一覧を見る OKWAVE コラム 突然のトラブル?プリンター・メール・LINE編 携帯料金を賢く見直す!格安SIMと端末選びのポイントは? 友達って必要?友情って何だろう 大震災時の現実とは?私たちができる備え 「結婚相談所は恥ずかしい」は時代遅れ!負け組の誤解と出会いの掴み方 あなたにピッタリな商品が見つかる! OKWAVE セレクト コスメ化粧品 化粧水・クレンジングなど 健康食品・サプリ コンブチャなど バス用品 入浴剤・アミノ酸シャンプーなど スマホアプリ マッチングアプリなど ヘアケア 白髪染めヘアカラーなど インターネット回線 プロバイダ、光回線など
お礼
そういう仕組みだったのですね、解決しました。ありがとうございます。