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

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

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

Re[11]: C++/CLI 外部からForm1のボタンのプロパティ操作


(過去ログ 108 を表示中)

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

■64199 / inTopicNo.1)  C++/CLI 外部からForm1のボタンのプロパティ操作
  
□投稿者/ abcYear (4回)-(2012/11/13(Tue) 13:33:39)
abcYear さんの Web サイト

分類:[C++/CLI] 

Visual Stadio2010にてC++/CLIでForm1に色々なコントロールを作成しています。

例えば、Form1にボタンやツールバーなどを作成したとして、
それが、Form1クラスの中で操作するのは簡単ですが、
外部の自作関数から操作をしたい場合の処理(ここでは、ボタンの色を変更する、ツールバーにチェックをつける)はどのようにしたらよろしいのでしょうか?

全く同じ質問がリンク先にありましたが
対応することが出来ませんでした。・・というか理解できませんでした。

申し訳ございませんが、
わかりやすく教えていただけないでしょうか?
よろしくお願いいたします。
引用返信 編集キー/
■64200 / inTopicNo.2)  Re[1]: C++/CLI 外部からForm1のボタンのプロパティ操作
□投稿者/ abcYear (5回)-(2012/11/13(Tue) 13:35:53)
abcYear さんの Web サイト
申し訳ございません。
リンクを貼り付け忘れましたので再送させていただきます。

http://okwave.jp/qa/q6528808.html
引用返信 編集キー/
■64201 / inTopicNo.3)  Re[2]: C++/CLI 外部からForm1のボタンのプロパティ操作
□投稿者/ howling (72回)-(2012/11/13(Tue) 14:17:08)
abcYear さん

うーん、基礎的なところからですが…
クラスのインスタンスを生成して、そこにアクセスする、というのはわかりますか?
もしそれが理解できるなら、それを行えばいいわけです。

Form1はおそらくデザイナで作られているでしょうから、
Runメソッドの引数として自動で生成され実行されていると思います。

つまり、生成自体は既に行われているので、
この勝手に生成されたForm1を、
外部の…自作関数に渡せば動かせるはずですよ。

もっとも、その自作関数とForm1を作成しているソースまたはDllが同じプロジェクト内に無く、
かつヘッダなども読み取っていない場合は、
もうちょっとめんどくさいことになりますが…。
引用返信 編集キー/
■64203 / inTopicNo.4)  Re[3]: C++/CLI 外部からForm1のボタンのプロパティ操作
□投稿者/ 774RR (21回)-(2012/11/13(Tue) 14:59:12)
要するに this の特定が必要、って話なだけなわけだが。

たぶんに「俺の Form1 」は1個しかないのに自明ぢゃん、というあたりが納得いかないのだろう。
このへん説明するにはマルチプルインスタンスの概念が理解できていないと困難。

・「俺の Form1 」も、実は複数個作ることができる
・通常、デザイナというか C++/CLI のライブラリ中の起動処理ルーチンが
 「俺の Form1 」を1つ作ってくれている
というあたりが納得できるなら、既にコメントのあるとおり Form1 を渡せるようにするだけ。

引用返信 編集キー/
■64204 / inTopicNo.5)  Re[4]: C++/CLI 外部からForm1のボタンのプロパティ操作
□投稿者/ abcYear (7回)-(2012/11/13(Tue) 15:21:03)
abcYear さんの Web サイト
お二方ともご連絡有難うございます。

う〜ん・・
多分私自身基礎を理解していないのでしょうね?
>>クラスのインスタンスを生成して、そこにアクセスする
>>外部の…自作関数に渡せば動かせるはずですよ

なんとなく意味はわかりますが、どのようにするのか
まだ勉強不足のようです。一度インターネットでも調べてみます。

全てを教えろって言ってるわけではないですが
作成するに当たり、何かヒントやアドバイス等あればまた教えてください。

申し訳ないですがよろしくお願いいい足します。
引用返信 編集キー/
■64205 / inTopicNo.6)  Re[5]: C++/CLI 外部からForm1のボタンのプロパティ操作
□投稿者/ howling (73回)-(2012/11/13(Tue) 15:28:18)
abcYearさん

ちょうど774RRさんのマルチプルインスタンス、でピンと来ました。
実は私、じゃんぬねっとさん信者(公式ファンクラブは無いので勝手に命名)なのですが(ぉぃ)、じゃんぬさんが最初に教えたいのがソレらしいのです。

で、以前のじゃんぬさんの発言から一部を持ってきました(ごそごそ

---------------------------------------------------------------------------------------------------------------------------------------------

>オブジェクト指向は体験・体感を通して身につくことが多いように思えるので、机上で適当に勉強したことがあるのであれば、実際にいろいろ組んでみた方が早いかもしれません。

>サイトであれば 「疑りぶかいあなたのためのオブジェクト指向再入門」 がおすすめです。 少し学んだ経験がある人 (挫折したことがある人) 向けですが、いかがでしょうか。
>http://kmaebashi.com/programmer/object/index.html

>おすすめする理由は、基本かつ肝である 「マルチプル インスタンス」 を真っ先に説明している点です。

>こちらのサイトにも書かれているとおりで、未だにオブジェクト指向の概念説明において 「カプセル化」 の説明を 「データの隠ぺい」 でしか説明できていなかったり、そもそも構造化言語からある 「モジュール」 でも表現できる要素を、あたかもオブジェクト指向特有の機能かのように説明し 「オブジェクト指向って最高!!」 と叫んでいるようなサイトが (書籍も?) あったりするので、先に読んでおくことをお勧めします。

>構造化言語からある云々と書きましたが、構造化言語が適切に理解していない人はオブジェクト指向言語を理解するのは難しい... というか無理なのではないかと考えます。 言うなら 「算数ができていないのだから、数学なんてさらに無理」 という関係にあると考えます (ちょっと大げさかも?)。

>裏を返せば、構造化言語において 「部品」 という正しい位置づけでコーディングできる人なら、オブジェクト指向は 「抽象」 と 「マルチプル インスタンス」 の概念を抑えるだけであとは楽勝とも言えます。 もしそれができていないのであれば、まず構造化言語を勉強してステップ アップした方が早道な気がします (あくまで私の持論ですが)。

---------------------------------------------------------------------------------------------------------------------------------------------

で、私もコレを見に行ったのですが、
私自身、しっかり理解できていないなぁ…というのが正直なところです。
おう!なんでも任せとけ!とか全く言えない状態なので、一緒に勉強していきましょう。

ちなみにこっちはgdgdになってますが、同じくじゃんぬさんのブログで、だいぶ盛り上がったところです。
http://blogs.wankuma.com/jeanne/archive/2007/03/13/66462.aspx

難しいかもしれませんが、理解していかないといけないところですから…!
引用返信 編集キー/
■64206 / inTopicNo.7)  Re[6]: C++/CLI 外部からForm1のボタンのプロパティ操作
□投稿者/ オショウ (35回)-(2012/11/13(Tue) 16:05:58)
コントロールを作っているということは、自分の親がFormなわけだから
親のインスタンスを取得すればよいという話。

thisとは、若干異なりますが、フォームとコントロールの親子関係が
理解できないならば、やりたいこともできない。

勉強しないとダメですネ!

以上。
引用返信 編集キー/
■64207 / inTopicNo.8)  Re[6]: C++/CLI 外部からForm1のボタンのプロパティ操作
□投稿者/ 774RR (22回)-(2012/11/13(Tue) 16:39:52)
この辺 VB では「既定のインスタンス」という奴があって賛否両論なわけだが・・・
俺は VB 使わない人なのでどうでもいいけど、心情的には否定派。

public ref class Form1 : public System::Windows::Forms::Form と書いちゃった以上
C++/CLI の提供するフレームワークに則って記述するしかなくて、
・この「俺 Form1」は型であってインスタンスではない
・「俺 Form1」のインスタンスは複数個作ることができる
・作ることができる、と、作られる、というのは大きく違う(普通は1個しか作られない)
・その1個を作っているのは Application::Run(gcnew Form1());
・フォーム外から「ほにゃららする」には、ほにゃらら対象である「どのフォームインスタンスか」が必要
・対象フォームインスタンスを、さてどうやって特定しよう?
ってあたりは理解せざるを得ない。

で:
Windows というか CLI というか、「オブジェクト指向」の考え的には
・外部関数からほにゃららする(=フォームと無関係な何かが勝手にフォームに指令する)
ってのはそもそも設計方針としてありえなくて、

・フォームを所有する何かがフォームにほにゃらら指令するとか
・フォーム自体が自分自身に対してほにゃららするとか
・フォームに含まれる子コントロールが、親に対してほにゃらら指令するとか
というのが設計方針として正しい、ということになる。

関係のある何かが指令を出す=事前に「対象」は既知である、ってところかな。
だから「フォームを特定する」っていうコードは解説するまでも無いわけで、
探してもよくわからないのはある意味当たり前なのかもしれない。
引用返信 編集キー/
■64209 / inTopicNo.9)  Re[7]: C++/CLI 外部からForm1のボタンのプロパティ操作
□投稿者/ επιστημη (19回)-(2012/11/13(Tue) 18:28:10)
επιστημη さんの Web サイト
2012/11/13(Tue) 18:50:10 編集(投稿者)
やってみた。

namespace CppFormApp {

  using namespace System;
  ...

  ref class Calc {
  public:
    static void plus(int x, int y);
  };

  /// <summary>
  /// Form1 の概要
  /// </summary>
  public ref class Form1 : public System::Windows::Forms::Form
  {
    ...
    private: System::Windows::Forms::Button^  button1;
    public: System::Windows::Forms::TextBox^  textBox1; // textBox1をpublicにしとく
    ...
    private: System::Void button1_Click(System::Object^  sender, System::EventArgs^  e) {
      Calc::plus(1,2); // 1+2 をけーさんしろ
    }
  };

  void Calc::plus(int x, int y) {
    // Applicationが管理するFormから"Form1"を探しだし、そいつのtextBox1 にコタエを書く。
    ((CppFormApp::Form1^)Application::OpenForms[L"Form1"])->textBox1->Text = (x+y).ToString();
  }
}

引用返信 編集キー/
■64216 / inTopicNo.10)  Re[8]: C++/CLI 外部からForm1のボタンのプロパティ操作
□投稿者/ abcYear (8回)-(2012/11/13(Tue) 22:41:36)
皆様本当にご連絡ありがとうございます。
またご指摘もあり、まだまだ勉強不足であることがわかりました。

私のほうで、form1のクラスをインスタンスするため
Form1^ fm = gcnew Form1();
としましたが、デバッグでエラーが発生しました。
外部のソースファイルに #include "Form1.h"も追記しているのになぜ??という疑問に直面しました。

インターネットでは上記のように書かれていましたが私の書き方がおかしいのでしょうか?


howling 様。一度、リンク先のほうに目を向けて勉強してみます。
私のためにサイトの紹介をしていただきすごく助かります。

774RR様やオショウ様の意味もなんとなく理解できるレベルですが、
実際にプログラムを作成してみると、実際に理解していないのだと自分でも認識しています。


επιστημη様
すいません。高度すぎてついていけないです。
これは外部のソースとして記載しているものなのでしょうか?

Form1クラスのインスタンスの書き方が上記のもの??
私がサイトでみたものと全然違いますのでこんがらがってきました。。
引用返信 編集キー/
■64217 / inTopicNo.11)  Re[9]: C++/CLI 外部からForm1のボタンのプロパティ操作
□投稿者/ επιστημη (21回)-(2012/11/14(Wed) 04:30:16)
επιστημη さんの Web サイト
> すいません。高度すぎてついていけないです。
> これは外部のソースとして記載しているものなのでしょうか?

「外部のソース」てのは如何なる意味かしら?
コンパイル単位を分割するってことなら、
追加分(ref class Calc)を別ファイル(Calc.h,Calc.cpp)に書けばいい。

> Form1クラスのインスタンスの書き方が上記のもの??
> 私がサイトでみたものと全然違いますのでこんがらがってきました。。

やり方はひとつじゃないってことかと。
Applicationは使ってるFormを全部知ってるので、それを教えてもらいました。

引用返信 編集キー/
■64218 / inTopicNo.12)  Re[10]: C++/CLI 外部からForm1のボタンのプロパティ操作
□投稿者/ επιστημη (22回)-(2012/11/14(Wed) 05:36:08)
επιστημη さんの Web サイト
別解:

ref class Form1 : ... {
    public: void setText(String^ str) {
      textBox1->Text = str;
    }

    public: static Form1^ target;

    private: System::Void button1_Click(System::Object^  sender, System::EventArgs^  e) {
      target = this;
      Calc::plus(1,2);
    }
};

void Calc::plus(int x, int y) {
  Form1::target->setText((x+y).ToString());
}

引用返信 編集キー/
■64219 / inTopicNo.13)  Re[11]: C++/CLI 外部からForm1のボタンのプロパティ操作
□投稿者/ 774RR (23回)-(2012/11/14(Wed) 07:01:24)
Application::Run(gcnew Form1()); で「システムが標準で作ったフォーム」
=通常の手段で表示されてるフォーム、が既にインスタンス化されている。

これとは別に、自分で Form1^ fm=gcnew Form1(); するということは
既にあるフォームとは「そっくりだが別」のフォームをインスタンス化するってことだ。

それはつまり
http://blogs.wankuma.com/jeanne/archive/2007/03/13/66462.aspx
で話題になっているとおり、
int i; という変数が既にあるときに
int j; という変数を別に作った
という状況に等しい。

j に操作を加えても (++j; とか) i に影響が無いのと同じく、
fm に操作を加えても、標準のフォームには影響が無い。
たぶんそれはやりたいことではない。
引用返信 編集キー/
■64222 / inTopicNo.14)  Re[9]: C++/CLI 外部からForm1のボタンのプロパティ操作
□投稿者/ shu (94回)-(2012/11/14(Wed) 07:46:09)
No64216 (abcYear さん) に返信

> 外部のソースファイルに #include "Form1.h"も追記しているのになぜ??という疑問に直面しました。
こういう話で迷うようならC++/CLIではなくC#を使えばよいのにと思いますが、何か理由があるのでしょうか?
インスタンス作って公開されているメソッドを呼ぶということに変わりはありませんが。
引用返信 編集キー/
■64225 / inTopicNo.15)  Re[10]: C++/CLI 外部からForm1のボタンのプロパティ操作
□投稿者/ howling (77回)-(2012/11/14(Wed) 11:11:05)
abcYear さん

私なんかが言えることではないのですが、
やはりC++を使うにあたって、基礎的な知識が欠けているように思えます。

ただ単にヘッダにクラスの宣言を書いて、ソースにクラスの実装を書いてある物を利用して、
そのクラスのインスタンスを作ったり、作ったインスタンスを渡す…というだけの話なのですが、
これがわからないとなってくると、勉強して下さいとしか言えない状況です。
(このレベルで教えて欲しいという話になってくると、学校でも行ってくれとなってしまいますので…)



//個人的には、先日お伝えしたサイト情報も良いのかもしれませんが、
//本をいくつか読んでみることをオススメします。

//ことC++に関しては、
//これがわかりやすい、という本はわかりやすいようにある程度嘘(事実を隠ぺいしていることも含む)を含み、
//これだとわからない、という本は嘘をできるだけ無くした状態で、根本まで理解している方に対する物が多いかなと。
//前者にあたる本として、「ゲームプログラマーになる前に」という書籍があるのですが、
//比較的楽しく勉強できる本ではないかと思っています。一応オススメしておきます。
引用返信 編集キー/
■64233 / inTopicNo.16)  Re[11]: C++/CLI 外部からForm1のボタンのプロパティ操作
□投稿者/ abcYear (9回)-(2012/11/14(Wed) 17:41:24)
abcYear さんの Web サイト
皆様、本当に色々と気を使ってくださり有難うございます。
基礎が出来ていないのだと改めて気づかされました。

改めて基礎を勉強していきます。
今回の問題は解決に至っておりませんが、
これ以上皆様の時間を割いてしまうこと、どれだけ回答いただいても私が理解できないことから
このトピックは閉じさせていただきます。

本当に皆様後親切に有難うございました。
解決済み
引用返信 編集キー/


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

このトピックに書きこむ

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

管理者用

- Child Tree -