コントロールの配列に関して

[戻る]
渡辺 2014/12/16(火) 16:50:23
お世話になります。

Labelのプロパティ変更に関してですが、Labelが1〜128まであり、事前の計算式より
100ms間隔で算出した値をlabel番号とし、そのlabelのbackcolorを通常controlを
Highlightに変える様にしたく、算出された値以外は、controlのままとし、次に算出した
label番号が変われば、その変わった番号のlabelをHighlightにし、前のは、controlに戻
すようにしたいと思っています。
case分などでも考えましたが、配列を使った方法で解決できる方法はありませんでしょう
か。

渡辺 2014/12/16(火) 16:51:44
環境は、Windwos7 VC++2010 expressになります。

仲澤@失業者 2014/12/17(水) 12:58:13
"Label"とはStaticコントロールのことでしょうか。
ご希望の機能が、
 1.文字列の色、又は背景色を頻繁に変えたい。
 2.その文字列をクリックしてもアクションはしない。
のであれば、単純にTextOut()を使ったほうが
はるかに早いし、コードも単純になると思うのですが。

いずれにしても
 3.Labelクラスはどの様に設計しましたでしょうか。
 4.それを配列にした場合の問題点が想像できません。
なのですが、どうでしょう。

渡辺 2014/12/18(木) 17:13:45
labelは、Staticコントロールになります。
labelは、NumericUpDown(Staticコントロール)の表示番号としてあるだけなんですが、
128個あるのですぐに何処にあるか認識できないため、今どの番号の値が適用されている
かを分かりやすくするため、その時だけLabelのバッグカラーを通常のcontrolからHighli
ghtに変更したいと思っています。

以上よろしくお願いします。

仲澤@失業者 2014/12/19(金) 10:21:09
>labelは、Staticコントロールになります。
了解しました。で、不本意ながら

 3.Labelクラスはどの様に設計しましたでしょうか。
 4.それを配列にした場合の問題点が想像できません

について、もう一度訪ねなければなりませなが、どうでしょう。
単に画面に並べただけではないはずですよね。

一般に、同質のオブジェクトが多数ある場合は、
それらを配列にするのが普通です。
たぶん「3.」の意味するクラスインスタンス(128個)を、
「4.」のクラスで配列内に取り込んで、管理する形になると思いますが、
どのようにお考えでしょう。

渡辺 2014/12/19(金) 11:49:43
仲澤@失業者様

Labelは、128個画面に並べ、個々に表示位置、表示文字を設定しています。
配列にするのが普通と言うこと自体知りませんでした。すみません。
このあたりから教えて頂けますでしょうか。

渡辺 2014/12/19(金) 14:50:47
以下(一部省略)の内容をスマートに記述する方法を知りたいのですが、

intVRsetNo =(A-B);    
this->label22->BackColor = System::Drawing::SystemColors::Control;
this->label23->BackColor = System::Drawing::SystemColors::Control;
this->label29->BackColor = System::Drawing::SystemColors::Control;
this->label30->BackColor = System::Drawing::SystemColors::Control;
this->label31->BackColor = System::Drawing::SystemColors::Control;
    ・
    ・
    ・
    ・
this->label154->BackColor = System::Drawing::SystemColors::Control;
switch( VRsetNo )
{    
case 0 :this->label22->BackColor = System::Drawing::SystemColors::Highlight;
break ;
case 1 :this->label23->BackColor = System::Drawing::SystemColors::Highlight;
break ;
case 2 :this->label29->BackColor = System::Drawing::SystemColors::Highlight;
break ;
case 3 :this->label30->BackColor = System::Drawing::SystemColors::Highlight;
break ;
case 4 :this->label31->BackColor = System::Drawing::SystemColors::Highlight;
break ;
    ・
    ・
    ・
    ・
case 127 :this->label154->BackColor = System::Drawing::SystemColors::Highlight;
break ;
}

紅' 2014/12/23(火) 20:51:55
mfc です?

配列に入れとくんじゃダメなの?
CWnd* controls[] = { this->labe001, ... , this->label28, NULL };
みたいにしてループで回すとか。
for( int i = 0; controls[i] != NULL; ++i ) controls[i]->BackColor( i == [対象の
番号] ? Highlight : [他の色] );
みたいに。

判定方法が最初からの通し番号だけじゃないなら、判定に必要な情報とコントロールのポ
インタを構造体にして配列にすればいいように思うのですけれど。
コントロールの名前付け規則があるなら名前そのものを文字列として作成して、GetDlgIt
em() (だっけ?)を使ってコントロールの実態を取得する方法もあるし。

渡辺 2014/12/25(木) 13:13:32
紅' さん

ありがとうございます。
配列等でスマートにまとめたかったので、
このようなコントロールを配列に入れられるとは思っていなかったので、
教えて頂いた方法を試してみます。

渡辺 2015/01/07(水) 17:13:15
CWnd* controlsの配列をコンパイルすると定義されていない識別子ですとなります。
VC++2010 expressでは、CWndは、使えないのでしょうか。

宜しくお願いします。

tetrapod 2015/01/08(木) 06:34:33
2014/12/19(金) 14:50:47 の発言を見るに、今作っているのは
C++/CLI (manage) による Windows Form App だから
native C++ MFC なコードを C++/CLI Form App 中に記述しても通らないに決まっている。

CWnd* な配列でなくて Form^ な配列を作らなきゃ。

C++/CLI ってのは C++ ぢゃないんだよ。別言語。
Visual C++ は1つのコンパイラで C と C++ と C++/CLI の3言語に対応してるんだ。
C++/CLI Form App ってのはもう新規開発は推奨されていない。
大量のコードを既に書いちゃったなら別だけど C# への方針変更を推奨する。

ITO 2015/01/08(木) 09:54:21
横から失礼します。
MFC使ってたなら、W32SDK使う方法もあると思うけど。
まだ、W32SDKのサイトもあるし、MSDNlibraryも健在なんで(^^;
VC++2010 expressなら、インストール次第で可能ですよね。
まだ、コード途中なら、自分にとって最適なのをえらぶといいよ。

蒼の洞窟 2015/01/08(木) 10:29:15
いきなりWin32 SDKでWindowsアプリを作成するには結構厳しいですね。
(ExpressだとMFCもついてないですし。WTLを入れれたりしたっけ?)


https://support2.microsoft.com/kb/3001686
>>マイクロソフトでは、Visual C++ (C++/CLI) を使用した Windows フォームアプリケー
ションの作成は、推奨しておりません。
>>C++/CLI は、マネージ コード と アンマネージ コードの相互運用を行う目的でのみ使
用してください。

自分もtetrapodさんと同じ意見で、C#で作り直して、どうしてもC++でしか書けない部分
のみをC++/CLIでクラスライブラリを作ったほうがよいですね。

仲澤@失業者 2015/01/08(木) 11:27:09
今後のことを考えるとC#をやっとくのが有利だとは思います。
もし、C++(ネイティブ)を選択するのなら、最近は

「Visual Studio Community 2013」
http://www.microsoft.com/ja-jp/dev/products/community.aspx

という選択肢もありますね。
「でもお高いんでしょう」
「いいえ奥様、ただでMFCが付いてきます。」
「えぇ〜・・・」

Professionalが無料(?)って感じ(ライセンスに制限あり)。

渡辺 2015/01/08(木) 11:32:39
もともとあるアプリからの追加となるため、現状の開発環境で行う必要がありました。
私自身もWindowsアプリは初めてなので、もともとのソースを見ながら行えたので短時間
で進めてこられました。
これからC#となると、かなり厳しい状況です。
現状の開発環境でcontrolの配列は、出来ないのでしょうか。
また、出来る場合は、tetrapodの言うForm^ な配列なのでしょうか。
Form^ な配列は、どの様に作れば良いのでしょうか。

すみませんがよろしくお願い致します。

蒼の洞窟 2015/01/08(木) 11:51:36
フォームデザイナが正しく動くようにするには現状のInitializeComponentは
編集できないのでForm::Loadで配列の作成/初期化をするしかないかな。


ラベル3つの場合

private: System::Windows::Forms::Label^  label1;
private: System::Windows::Forms::Label^  label2;
private: System::Windows::Forms::Label^  label3;

private: array<System::Windows::Forms::Label^>^ labels; // 追加

・・・省略・・・

// 追加
private: System::Void Form1_Load(System::Object^  sender, System::EventArgs^  e)
{
    this->labels = gcnew array<System::Windows::Forms::Label^>(3);
    this->labels[0] = this->label1;
    this->labels[1] = this->label2;
    this->labels[2] = this->label3;
}

蒼の洞窟 2015/01/08(木) 13:15:58
ちなみに

int index = 1;
((Label^)this->Controls[L"label" + index.ToString()])->Text = L"hoge";

というような記述もできます。

渡辺 2015/01/08(木) 18:01:59
[[解決]]
蒼の洞窟さま

ありがとうございました。
無事にControlを配列にて操作することができました。

当分は、現状の開発環境での業務が多いと思いますが、
新規で開発する際は、C#で行えるように勉強した方がよさそうですね。

古いスレッドには追加発言できません。