ふらっとC♯, C#(初心者用) Part12

このエントリーをはてなブックマークに追加
952デフォルトの名無しさん:2007/02/06(火) 12:47:14
foreach(Control c in Controls)
{
if (c == sender) continue;
c.BackColor = Color.White;
}
((Control)sendor).BackColor = Color.LightCyan;



or

lastbtn.Backcolor = Color.White;
lastbtn = (Control)sender;
lastbtn.Backcolor = Color.LightCyan;
953デフォルトの名無しさん:2007/02/06(火) 12:50:17
>>949
質問とソースが微妙に一致してないぞ。
質問からは押したボタンの色が変わって欲しいように想像するが、
ソースはテキストボックスにセットされてる文字列からボタンを決めて、
そのボタンはシアン系、それ以外は白って感じだが。

何がしたいのかハッキリしてくれ
954デフォルトの名無しさん:2007/02/06(火) 13:31:32
>>948
PanelもControlですよ
955デフォルトの名無しさん:2007/02/06(火) 13:36:23
>>950
>今環境がないので調べられんがMSDNに必ず元のに代入しろとか書いてなかったか?>Text
>Nameと変な風に連動してた気がするからなんか独自にやっているのかもしれん。

そうだったんですか、どのプロパティも同じとはいかないのかもしれませんね。
これがBackColorで同様のことをやったときは、baseの方は透明にしておいても
独自変数の値がちゃんと出てきてたので、Textでも同じかと思ったのでした・・・

>>951
>現状でデザイナで操作できなくなるような変更はやめたほうがいいかもね。

もともとPanelにはTextプロパティがなかったので追加で実装する必要が出たのですが、
今改めてみてみると、ヘルプによるとControlクラスにも、実際には Public にも
Protected にも Text プロパティはリストに載っていないです、??

それで、別の、VBのプロジェクトと組み合わせたソリューション内でやってみると、
この Textプロパティに関する Control と Panel の区別はちゃんと出てきて、
Controlクラスから派生した方は base.Text への代入はOK、Panel クラスから
派生した方は base.Text への代入でビルドエラーが出て来ていました。

C#だけで単独でやっているとこの差が現われず、VBとの混用でやっている方では
これが出るということは、両者の設定に関係しているのでしょうか・・・?



956デフォルトの名無しさん:2007/02/06(火) 13:41:37
>>954
そうなのですが、>>954のような状況でした。

このことから、この Panel と Control の違いは、Text プロパティが
プロパティ・ウインドウに現われるかどうかの違いと一致していましたので
Panel ではたぶん Textプロパティを殺しているのではないかと思ったのですが
そうではないのでしょうか・・・。
957949:2007/02/06(火) 14:05:25
>>952
具体的な回答ありがとうございます。
まだ始めたばかりなので逆引き大全を片手に今眺めてます…orz

>>953
質問の仕損ないで申し訳ないです。
今はボタンを押したときにtextBox1に[A01]等のデータが入るようにしてます。
958デフォルトの名無しさん:2007/02/06(火) 14:11:05
>>955
>今改めてみてみると、ヘルプによるとControlクラスにも、実際には Public にも
>Protected にも Text プロパティはリストに載っていないです、??

この Control は System.Windows.Forms のではない別の Control でした、
System.Windows.Forms.Control では Text も BackColor もやはり存在してました。

Panel の方ももう一度みてみようと思いましたら、今度は Help で 「見つかりません」
になって探せなくなってしまった・・・、まずこっちから直さないと。。。。

959デフォルトの名無しさん:2007/02/06(火) 16:53:26
>>958
PanelにもTextはあるがこのクラスでは使用しないことになっている。
プロパティグリッドに表示されないのは非表示になってるから。

[Category("Appearance"), Description("hogehohe"), Browsable(true)] 
public override string Text {
  get { return base.Text; }
  set { base.Text = value; }}
960デフォルトの名無しさん:2007/02/06(火) 19:19:34
MSDNしらないの?
961デフォルトの名無しさん:2007/02/06(火) 19:20:24
MSDN引いたらすぐに分かるようなこと質問してるってことは知らないんだろ
962デフォルトの名無しさん:2007/02/06(火) 19:24:33
すいません 質問させて下さい。

private const int WM_CLOSE = 0x0010;

protected override void WndProc(ref Message message) {
  base.WndProc(ref message);
  switch(message.Msg) {
      case WM_CLOSE:
        MesssageBox.Show("test");
        break;
      default: break;
  }
}

と書いたのですが、フォームを閉じてもWM_CLOSEを受け取れません。
終了処理などをさせたい場合、どうしたら良いのでしょうか!!!
お願いします。。。
963デフォルトの名無しさん:2007/02/06(火) 19:25:43
何故そんな回りくどいことをするの?
964デフォルトの名無しさん:2007/02/06(火) 19:26:47
他にやり方わからないから >>963
965デフォルトの名無しさん:2007/02/06(火) 19:27:03
OnClosed,OnClosingをオーバーライド。

なんだってそんな低級な方法をとるよ
966デフォルトの名無しさん:2007/02/06(火) 19:27:37
普通にClosingとかClosedとかイベントあるだろ。
967デフォルトの名無しさん:2007/02/06(火) 19:30:21
ありがとう >>965
他にもウィンドウプロシージャーで受け取りたいメッセージが多くある<
なんだってそんな低級な方法をとるよ

ウィンドウプロシージャーをオーバーライドしてイジくるのは低級だったのか・・・
⊂二二二( ^ω^)二⊃
968デフォルトの名無しさん:2007/02/06(火) 19:31:01
プロパティウインドウで終了関連のイベントのところダブルクリックするだけなんだがなあ?

C++から来たの?
969デフォルトの名無しさん:2007/02/06(火) 19:32:55
>>967

変な例えかもしれないが。

アセンブラでウィンドウズプログラム作るのは低級。
970デフォルトの名無しさん:2007/02/06(火) 19:34:27
C++ & win32APIから来ました。が、元はAssemble出身です。
971デフォルトの名無しさん:2007/02/06(火) 19:34:48
>>962
やむにやまれぬ事情もあるのかも知れんな(笑

WndProcを使うとして、base.WndProcを先に呼んでるからじゃない?
972デフォルトの名無しさん:2007/02/06(火) 19:36:09
.NET Framework のソースってどこからみれるの?


えーと質問です。
class hoge {}
class hogelist : List<hoge> {
 public String Value { get() { return ""; } }
}

private readonly hogelist hogelist = new hogelist();

public form1(.......) // こんすとらくた
{
 InitializeComponent();
 textBox1.DataBinding.Add("Text", terolist, "Value");
}

というコードを書いて、外部のフォームからこのフォームを表示させようとすると

form1->Show(); // ここで例外。

ArgumentExceptionはハンドルされませんでした。
DataSource のプロパティまたは列Valueにバインドできません。
パラメータ名:dataMember

と言われて、データバインディングに失敗します。
Show() のところから、ステップ実行すると IEnumerable.GetEnumerator() が呼ばれて
いて、これは素直に通過するのだけど通過した後の外部コードの中で例外が発生します。

どうすればデータバインディングできるのでしょうか?
973デフォルトの名無しさん:2007/02/06(火) 19:37:56
スレッドについての質問です
どこか思いこみがあるようですので間違いを指摘していただけると有り難いです。

Formを作成し、自分で新規にスレッドを作成していない状態で
(つまり自分はシングルスレッドのつもり)
aというメソッドに処理が入り、抜け出す前にbというメソッドに入っているようです。
シングルスレッドの状態でこのようなことはありえるのでしょうか?

尚、a、bともにリストビューのItem選択によるイベント起動がもとになっている物と
思われます。
974デフォルトの名無しさん:2007/02/06(火) 19:38:03
>form1->Show()
ネタですね…
975デフォルトの名無しさん:2007/02/06(火) 19:38:32
ありがとう >>971

base.WndProc(ref message); を、switch文の後に回しても解決出来ました。
976デフォルトの名無しさん:2007/02/06(火) 19:39:54
低級だな。
977デフォルトの名無しさん:2007/02/06(火) 19:40:15
978デフォルトの名無しさん:2007/02/06(火) 19:44:37
>>973
どうせDoEventsしてるとか言うオチだろ。
979デフォルトの名無しさん:2007/02/06(火) 19:49:36
>>972
msdnのサンプルソースとよくみくらべてみて。


ttp://msdn2.microsoft.com/ja-jp/library/system.windows.forms.control.databindings(VS.80).aspx
980デフォルトの名無しさん:2007/02/06(火) 19:50:03
>>978
>どうせDoEventsしてるとか言うオチだろ。
していません。
一応検索してみましたが、つかってません。

ちなみに、しょうがないので、lockもしてみましたがうまくいきません。
AutoResetEventとかでしたら、同一スレッド間でも排他制御ができるのでしょうか?
981デフォルトの名無しさん:2007/02/06(火) 19:53:29
>>980
「同一スレッド間でも排他制御」って具体的にはどういうことだ?
同一スレッド「間」???
982デフォルトの名無しさん:2007/02/06(火) 19:54:49
>>979
ちげーよ

多分ネタだよ。
>hogelist

>terolist
983デフォルトの名無しさん:2007/02/06(火) 19:56:41
>>972
コードが適当すぎてワラタ
984デフォルトの名無しさん:2007/02/06(火) 19:58:00
>>973
aがbを呼んでるというオチ?
985デフォルトの名無しさん:2007/02/06(火) 19:59:09
>尚、a、bともにリストビューのItem選択によるイベント起動がもとになっている物と
>思われます。
ここらを詳しく書かないとダメ

void a()
{
b();
}
って書いてないよなw
986デフォルトの名無しさん:2007/02/06(火) 20:00:00
>>981
>「同一スレッド間でも排他制御」って具体的にはどういうことだ?
レスした後自分でも書いてて変だと思った。
まあ、>>973の状況でわけわかんなくなっていると思ってください

一応プロセスはThread.CurrentThread.GetHashCode()で同一かどうか見てるつもりです。
(これも変?)

>>984
>aがbを呼んでるというオチ?
a,bとも単にdllの関数を呼ぶためのラッパーですのであり得ません
987デフォルトの名無しさん:2007/02/06(火) 20:03:09
なぜaの動作中にbが動作しているとわかった?

dll内で呼んでるとか。
988デフォルトの名無しさん:2007/02/06(火) 20:04:22
次スレ余路!
989973:2007/02/06(火) 20:06:13
念のためにa,bの関数の例を出します。
UnLha.dllの関数を呼び出すだけです。
(lockとか例外処理とかどうしようもなくてつけてます)
基本”S”と”E”が交互に表示されるはずですが、”S”が続くケースがあり、その後”E”が続くことが
あるため、メソッドの途中でメソッドが呼ばれている物と判断しています。

public static int UnlhaLck(IntPtr hwnd, string szCmdLine, StringBuilder SzOutput, int dwSize)
{
int ret;
lock (obj)
{
System.Diagnostics.Debug.WriteLine("S1" + Thread.CurrentThread.GetHashCode().ToString());
try
{
ret = Unlha(hwnd, szCmdLine, SzOutput, dwSize);
}
catch (Exception ex)
{
System.Diagnostics.Debug.WriteLine(ex.Message);
ret = -1;
}
System.Diagnostics.Debug.WriteLine("E1");
}
return ret;
}
990958:2007/02/06(火) 20:08:53
>>959
ありがとうございます、オンラインヘルプでみましたら、やはり Panel では
Text プロパティは 「無効になっています」 とのことでした・・・。

それでも、やはり Set{}側で その無効な Text プロパティに代入さえして
おけば InitializeComponent() に書き込まれるらしいことが確認できました。
つまり、Control ベースでも、Panelベースでも同様にできそうでした。

ソリューションに、これらのコントロールも内部のプロジェクトとして入れ込んで
いたのですが、これら部品のコントロールをビルドしたら、一旦 VS2005 自体を
終了し、また再度起動してソリューションをオープンし直してからやってみたところ、
VBとの混用側でも InitializeComponent() に記録されるようになりました。

InitializeComponent() に Text プロパティが保存されなかった問題の原因は、
どうも、これら部品クラスのビルド後の取り込みが行なわれていなかったためかと
思われ(「ソリューションのビルド」で行なってもできませんでした・・・)、
VB との混用で行なう場合は面倒でも VS2005 を再起動する必要があるの
かもしれません・・・。

おかげさまでとりあえず InitializeComponent() に取り込むことができました、
ありがとうございました。
991デフォルトの名無しさん:2007/02/06(火) 20:09:29
必要なのはココじゃない。
ネタ?
992デフォルトの名無しさん:2007/02/06(火) 20:11:50
>>989
スタックトレースはしてみたのか?
993デフォルトの名無しさん:2007/02/06(火) 20:12:19
>>961
MSDNはオンラインで知っていますが、それ以前に、どうして Panel のメンバーぐらいの
参照が オフライン側のほうでできなくなってしまったのか不思議でした。
994デフォルトの名無しさん:2007/02/06(火) 20:13:19
どっちにしても Textって名前は使わないほうがいいんじゃないかな。
995デフォルトの名無しさん:2007/02/06(火) 20:14:55
>>993
探し方がまずいんじゃねーの
996デフォルトの名無しさん:2007/02/06(火) 20:16:19
>>994
Text は特別なのですか、やはり同一名称は new キーワードでも
問題あるのでしょうか・・・・・?
997デフォルトの名無しさん:2007/02/06(火) 20:17:51
>>995
前には見たことはあったのですが、今日はそのページの参照リンクから叩いたのですが
飛んで行かず、「みつかりません」が出てきたのでした。
998デフォルトの名無しさん:2007/02/06(火) 20:18:06
>>992
残念ながら見方が分かりません。

さしあたって、>973の質問のシングルスレッドの状態では、a,bが同時に実行されることは
ないと思って良さそうですね(あたりまえでしょうけど)。

どうもありがとうございました。もうちょっとがんばってみます。
999デフォルトの名無しさん:2007/02/06(火) 20:19:18
new にせざるを得なかったのは、virtual にしたかったからでした。
virtual にすると、 override か書けないとのことでした。
どうもでした。またよろしくです。
1000デフォルトの名無しさん:2007/02/06(火) 20:19:59
>>1000ならC#が世界を変える
10011001
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。