C♯相談室 Part30

このエントリーをはてなブックマークに追加
1名無しぃ♯
(#゚ー゚)つ < C#、.NETの話題はこちらでどうぞ。

過去スレは>>2-5あたり。
2名無しぃ♯:2006/03/04(土) 13:55:32
3名無しぃ♯:2006/03/04(土) 13:56:30
4デフォルトの名無しさん:2006/03/04(土) 13:58:56
Wiki は既に機能してないから外した。反省はしていない。
5デフォルトの名無しさん:2006/03/04(土) 14:06:49
C#でカーソルのある位置のカラーコードを取得するにはどうしたらよいのでしょうか。
例えば、黒い画像の上にカーソルを持っていくと#000000を取得する、のような感じです。

どなたか教えてください。お願いいたします。
6デフォルトの名無しさん:2006/03/04(土) 14:09:42
Win32API の GetPixel かね。
7デフォルトの名無しさん:2006/03/04(土) 14:19:35
.netプログラムって逆コンパイル可能ですか?
8デフォルトの名無しさん:2006/03/04(土) 14:22:11
pictureBoxとかでやるんならBitmap.GetPixel メソッドとかでもokですね
95:2006/03/04(土) 15:14:54
>>6,>>8 さんご回答どうもありがとうございました。
label2.Text = Bitmap.GetPixel(x, y).ToString();
今このようにやっているのですが、
「静的でないフィールド、メソッド、またはプロパティ 'System.Drawing.Bitmap.GetPixel(int, int)' で、オブジェクト参照が必要です。」
というエラーがでて、コンパイルできません。
どのようにやったらよいのでしょうか?
10デフォルトの名無しさん:2006/03/04(土) 15:39:49
ずこー
11デフォルトの名無しさん:2006/03/04(土) 16:18:25
>label2.Text = Bitmap.GetPixel(x, y).ToString();
GetPixelはスタティックなメソッドではないからエラーが出る

例えばprivate PictureBox p;という感じでクラス変数として持ってるなら
p.Image.GetPixel(x, y);こんな感じで使う
ソースがどうなってるかわからんので、こういう感じでしかアドバイスできません
12デフォルトの名無しさん:2006/03/04(土) 16:36:03
やはりふらっとスレを復活させるべきかも知れぬ
13デフォルトの名無しさん:2006/03/04(土) 16:50:57
>>12 立てちゃった。

ふらっとC♯(初心者用) Part7
http://pc8.2ch.net/test/read.cgi/tech/1141458468/l50
145:2006/03/04(土) 18:10:03
詳しい説明ありがとうございました。
まだまだ勉強不足ですね。がんばってきます。
15デフォルトの名無しさん:2006/03/05(日) 16:29:03
usingでのオブジェクトの解放って、みんなどれくらい使ってる?
ガベージコレクションがあるし、そんな気にしなくていいじゃんと、
あんまり使わない派か、ほっとくのも気持ち悪いので、頻繁に
使う派か。
16デフォルトの名無しさん:2006/03/05(日) 16:36:17
使うべきところで使う
17デフォルトの名無しさん:2006/03/05(日) 16:39:02
ガベージコレクションはそのうち暇があったら整理してくれる程度に過ぎない

要らないでかいオブジェクトや貴重なリソースを保持するオブジェクトは
不要になったら明示的に捨てるベッキー
18デフォルトの名無しさん:2006/03/05(日) 16:41:46
そうでもない
19デフォルトの名無しさん:2006/03/05(日) 17:26:42
>>15
ttp://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=28493&forum=7

簡単にいったら状況によって異なるし実装に踏み込まんと分からんのでとりあえず
全部呼べということ。俺もほぼ同じ考え。
つまり頻繁に使う、といったらなんか変だな、使うべきところで使う。
20デフォルトの名無しさん:2006/03/05(日) 17:34:25
usingは()の中に長々と書くことになりかねないから使わん( ゚д゚)、
21デフォルトの名無しさん:2006/03/05(日) 17:36:51
usingかDisposeかの話なら
中が長いときはDisposeで短いときはusingやなー
22デフォルトの名無しさん:2006/03/05(日) 17:39:29
>>20
でもtry-finallyだとスコープを一個外に出さんといけないのがいや。
まぁケースバイケースだけども。
23デフォルトの名無しさん:2006/03/05(日) 21:31:17
画像とか、大きいオブジェクトを扱う時だけかな。むやみやたらには使わない。
メモリを意識しすぎるとmalloc/freeやnew/deleteと何らかわりないと思うよ。usingしてもGCしてもちゃんと解放されることに変わりはないし。
24デフォルトの名無しさん:2006/03/05(日) 22:08:25
>>23
「メモリを意識しすぎる」なんて考えてるから分からんのだよ

例えばGDIリソースならヒープの領域サイズが固定で決まってい
るので、メインメモリ確保量に関係なく、放置してたらデスクトップ
アプリケーションヒープを圧迫する。それはGCが感知することが
出来ない。
一言でいえばコンピュータにある限定されたリソースなんてのは
メモリだけじゃないんだ。あらゆるリソースが限定されていると
いってもいい。GCはそのうち「メインメモリだけ」を扱う。それ以外の
リソースについて管理する手間が減るわけじゃない。

それにFinalizerの実行保証は2.0からだぞ?ついでに言えば
スレッド依存性を持つリソースはFinalizerで開放することは無理
なのでDispose呼んでくれないとリークさせるしかない
25デフォルトの名無しさん:2006/03/05(日) 22:09:26
メソッド内のローカルなクラスが消えるのを見てみようと試したら、
メソッド抜けたら速攻で消していきますね。
つーか本当に消したのかな。デクストラクタでメッセージ出しただけだが。
26デフォルトの名無しさん:2006/03/05(日) 22:23:09
ローカルな変数(に格納されたクラス)は別枠ですぐ解放じゃなかったか
27デフォルトの名無しさん:2006/03/05(日) 23:10:42
GCは悪
28デフォルトの名無しさん:2006/03/06(月) 00:33:42
正直、ファイナライザなんて要らんからデストラクタ返せと思う
C#のあれをデストラクタなんて呼んでると、C++と関わるときに不幸になる
29デフォルトの名無しさん:2006/03/06(月) 00:44:49
C++ と関わると不幸になる

そもそもそれは C++/CLI に言ってやれ
30デフォルトの名無しさん:2006/03/06(月) 01:15:25
世界で最も パワフルかつポピュラーな言語はC++だと思うんだが…
ゲーム機も片っ端からC++だし
ま、それは言語議論スレにでもまかせておくが、正直C++にboost::smart_ptrがある以上C#の魅力はあまりないんだよなぁ
31デフォルトの名無しさん:2006/03/06(月) 01:28:09
スレ違いです
32デフォルトの名無しさん:2006/03/06(月) 06:08:43
携帯電話ゲーもau以外はJavaですよ?
33デフォルトの名無しさん:2006/03/06(月) 09:42:47
リサイズされたときに Paint を呼んで欲しいので、
InitializeComponent(void) の中で
this.SetStyle(ControlStyles.ResizeRedraw, true);
を呼んでいるのですが、この設定ってデザイナでできませんか?
手書きすれば済む話なんですが、できるだけ
デザイナでさくさくやりたいなぁ、と。
3433:2006/03/06(月) 10:39:54
InitializeComponent(void) の中で、ってのはうそです。
「後で」の間違いでした。
35デフォルトの名無しさん:2006/03/06(月) 12:07:06
OnResizeじゃだめなのか?
リサイズされうるものならたぶんあると思うんだが
36デフォルトの名無しさん:2006/03/06(月) 17:34:30
>>33
日本語でおk
37デフォルトの名無しさん:2006/03/06(月) 19:31:02
イベントにGraphicsオブジェクトが入ってるけど
その中にクライアント領域のサイズが入ってないのは不便じゃねぇ?
38デフォルトの名無しさん:2006/03/06(月) 19:42:45
そもそも何のイベントだよ
39デフォルトの名無しさん:2006/03/06(月) 20:46:13
ああ、 PictureBox の Paint イベントなんだけろ
40デフォルトの名無しさん:2006/03/06(月) 20:50:49
あんたがプロパティをろくにチェックしていないのはよくわかった
41デフォルトの名無しさん:2006/03/06(月) 20:59:29
>>40 kwsk おしえてくれ〜
ちなみにクリッピング領域はGraphicsオブジェクトに入ってるんだよな。
42デフォルトの名無しさん:2006/03/06(月) 21:40:09
>>37
senderとPaintEventArgs.ClipRectangleでサイズ関係は全部取れるのにGraphicsオブジェクトになんで必要なの?
あちこちに同じ情報がある必要は無いし、そもそもGDI+に紐付くGraphicにWindowのサイズ関係が無いと不便と言う発想が理解できない
43デフォルトの名無しさん:2006/03/07(火) 00:08:12
消す
・・・消す・・・
消す消す消す消す
速攻で消す

GCまかせだとこんな感じですか
44デフォルトの名無しさん:2006/03/07(火) 00:10:47
意味分からん
45デフォルトの名無しさん:2006/03/07(火) 00:15:02
>>43
そんなに焦ってない

消す・・・そろそろ消そうかなぁ・・・忙しいから後で・・・
暇になってきたから消そう・・・次は・・・
何か気分乗ってきたからまとめて消そう!

こんな感じ
つまり、任せて信頼しきると微妙に裏切られる
46デフォルトの名無しさん:2006/03/07(火) 00:22:32
パフォーマンスが最大になるように注意しながら消してもらえる
47デフォルトの名無しさん:2006/03/07(火) 00:32:51
bool is_disposed = false;
protected virtual void Dispose(bool disposing)
{
if (!is_disposed)
{
if (disposing)
{
}
}
this.is_disposed = true;
}
public void Dispose()
{
Dispose(true);
GC.SuppressFinalize(this);
}
~Class()
{
Dispose(false);
}

雛形ってこんなんですか?
48デフォルトの名無しさん:2006/03/07(火) 00:34:13
>>47
is_disposed は必須じゃないとおも
49デフォルトの名無しさん:2006/03/07(火) 01:54:28
メモリ再配置してくれんのは楽でいいと思うよまじで
50デフォルトの名無しさん:2006/03/07(火) 08:43:29
明示的にGCを起動させた方がいいのは、
比較的大きなオブジェクトを生成し、
それを長いループの最初の1回だけで使用し
あとはメソッドを抜けるまで1回も使用しないような状況のときだな。
例えばだけど。
51デフォルトの名無しさん:2006/03/07(火) 11:05:29
 [Serializable]
 public class Settings
 {
  private ArrayList names;

  public Settings()
  {
   this.names= new ArrayList();
   this.names.Add("name1");
  }

  public ArrayList Names{get{return this.names;} set{this.names = value;}}
 }

Settingクラスに初期値はあるけれども、XMLに保存したものがあれば
それで置き換える、というふうにしたくて上記のように書きました。
しかしこれでXmlSerializer.SerializeとDeserializeをすると、
Namesのアイテム数が
初期値で1個→書き出される→次の起動で初期値1個→読み込み
→初期値が生きていて計2個になる→書き出し の繰り返しで
どんどん増えてしまいます。
Deserialize時にArrayList namesを自動でクリアしたいんですが、
どうすればいいでしょうか。
52デフォルトの名無しさん:2006/03/07(火) 14:09:58
Hashtable の方が良くね?
53デフォルトの名無しさん:2006/03/07(火) 15:30:03
ミノタブとの併用者なんですけど、経過報告ダメですか?
5453:2006/03/07(火) 15:30:44
すんません誤爆りますた(´・ω・`)
55デフォルトの名無しさん:2006/03/07(火) 19:35:49
ListView でマウスドラッグでアイテムの並びを変える方法。
56デフォルトの名無しさん:2006/03/07(火) 19:54:14
を今から公開してくれるのか?
57デフォルトの名無しさん:2006/03/07(火) 20:11:37
>>53
お互い頑張ろうorz
58デフォルトの名無しさん:2006/03/07(火) 21:01:18
ツリービューにチェックボックスを出して、下階層のチェックがオンオフ
混合のとき、親ノードのチェックをグレーにするにはどうしたらよいですか?
Windows Formで1.1です。
59デフォルトの名無しさん:2006/03/07(火) 21:44:36
そもそも TreeView 自体 CheckState をサポートしてない。
.NET 2.0 ならオーナードローもできるが。
60デフォルトの名無しさん:2006/03/07(火) 22:09:51
HashtableだとXmlSerializerはそのままでは使えないのが面倒ですね。

1.コンストラクタに初期化値をロードするロジックを書かないでロード後に空だった場合にのみ初期化値を書き込む
2.ArrayListを使わないでStringの配列にする。
のどちらかかな
61デフォルトの名無しさん:2006/03/08(水) 10:41:15
>>52
>>60
やっぱり初期値を突っ込むかどうかの判断をどこかでするのが単純ですかね・・・
ファイルの有無で判断しようかとも思ってます。あえて0件にカスタマイズ
されているかもしれないんで。
62デフォルトの名無しさん:2006/03/08(水) 16:33:58
doc = (HTMLDocument)axWebBrowser.Document;

IHTMLElementCollection cAtags = doc.getElementsByTagName("a");
IEnumerator ee = cAtags.GetEnumerator();
while(ee.MoveNext())
{
★1
HTMLAnchorElementClass aATag = (HTMLAnchorElementClass)ee.Current;
★2
if (aATag.innerText == "リンク")
{
  ・
  ・
  ・

axWebBrowserに表示したウェブページから、アンカー部分を全て抽出して、
if文で絞込みをするというものを作りたく、以上のようなプログラムを書きました。
★1の位置でbreakするとエラーが出ないのですが、★2の位置でbreakするとエラーが出ます。
つまり★1と★2の間の部分に問題があるのだと思うのですが、分かる方いるでしょうか。
エラーは、
TargetInvocationExceptionはハンドルされませんでした。
というものです。
6362:2006/03/08(水) 17:14:26
HTMLAnchorElementClass aATag = (HTMLAnchorElementClass)ee.Current;

Object aATag = ee.Current;
に変えたところ正常に動作しました。
なぜHTMLAnchorElementClassが使えないのでしょうか。
すみません、分かる方いたらよろしくお願いします。
64デフォルトの名無しさん:2006/03/08(水) 17:21:17
HTMLAnchorElement ならどう?
65デフォルトの名無しさん:2006/03/08(水) 17:57:19
>>63
変数 aATag に格納されているオブジェクトの型を見ればいーんじゃないの
66デフォルトの名無しさん:2006/03/08(水) 18:01:46
>>62
もしかしてこういう事?
・★1の地点にブレークポイントを置いてブレークして、その後F5で続行すると例外は起きない
・★2の地点にブレークポイントを置くと、その前で例外が起きてそこまで到達しない

だとすると、WebBrowserのロードが完了していないうちにパースしようとして例外が発生してるんだと思うよ
読み込みは非同期処理だから、コードは DocumentCompleted イベントを使うとか readyState を見るとか読み込みに対して責任を負わなければならない
67デフォルトの名無しさん:2006/03/08(水) 18:06:25
>>63

これ参考にしたでしょ

Visual C# .NET による MSDNAA おもしろプログラミング : 第 3 回 VC# で MSHTML テクノロジ
http://www.microsoft.com/japan/msdn/academic/Articles/fun/03/

Aタグの解析箇所をNavigate直後にもってきたんとちゃう?
readyStateが考慮されていないコードだから単に移動しただけじゃダメだよ
68デフォルトの名無しさん:2006/03/08(水) 18:59:33
はい、MSDNAAのおもしろプログラミングのページを参考にしました。
HTMLAnchorElementに変えたところ動作しました!
いろいろとありがとうございました。
69デフォルトの名無しさん:2006/03/09(木) 14:31:42
ASP.NET で JavaScript のgetElementById 相当するメソッドってありますk?
教えてエロイ人
70デフォルトの名無しさん:2006/03/09(木) 14:33:48
FindControl か?
7169:2006/03/09(木) 14:41:36
>>70
探し方が悪かった様でこんなところを見つけて解決しそうです。
http://jeanne.wankuma.com/tips/form/findcontrol.html
72デフォルトの名無しさん:2006/03/09(木) 14:57:26
>>71
DOMを相手にするならControlは広すぎ
FindControlしてHTMLGenericControl型の変数に入れるのが良いかと
事前に型が特定できるならHTMLGenericControl型の変数ではなくその型に入れるのが良いかと
7362:2006/03/10(金) 00:58:22
axWebBrowserに表示したウェブページのテーブルの解析をしようとしているのですが、
HTMLパースの良い方法がわかりません。

doc = (HTMLDocument)axWebBrowser.Document;

IHTMLElementCollection allTable = doc.getElementsByTagName("table");
IEnumerator ee = allTable.GetEnumerator();

while (ee.MoveNext())
{
IHTMLElement elem = (IHTMLElement)ee.Current;
df.writeline(elem.innerText); //df = DebugForm
}

現在はこのようにして、ウェブページのすべてのテーブル要素を抜き出すところまで行ったのですが、
tableの入れ子になっている場合は、おかしな表現になってしまいます。
例えば<table><tr><td>AAA<table><tr><td>BBB</td></tr></table></td></tr></table>だと
AAA
BBB
BBB
と表示されます。このようにテーブルの入れ子になっている場合に要素内容が重複してしまいます。
7462:2006/03/10(金) 00:59:23
そうではなくて、HTMLをパースしてツリー状にしたいと思っています。
そこで調べたところ、

HTMLDocumentクラス
http://msdn2.microsoft.com/ja-jp/library/system.windows.forms.htmldocument(VS.80).aspx
HTMLElementクラス
http://msdn2.microsoft.com/ja-jp/library/system.windows.forms.htmlelement.aspx
HTMLElement.Childrenプロパティ
http://msdn2.microsoft.com/ja-jp/library/system.windows.forms.htmlelement.children(VS.80).aspx

これらのページによれば、HTMLDocument.GetElementsByTagName("タグ")からHtmlElementCollectionを得られ、
また各要素の子要素や親もChildrenやParentなどから得られるかもしれないと考えたんですが、だめでした。

・HTMLElementCollection ec = HTMLDocument.GetElementsByTagName("タグ")とするとビルドエラー
IHTMLElementCollectionにすると可能

・elem.innerText , elem.parentElement は可能だが、
elem.children , elem.getAttribute , elem.title などは不可。


また、こちらのパースも試したのですが、ビルドエラーになってしまいました。
http://japan.internet.com/developer/20051115/25.html

何が間違っているのでしょうか?
75デフォルトの名無しさん:2006/03/10(金) 01:06:27
>>73
> tableの入れ子になっている場合は、おかしな表現になってしまいます。
> 例えば<table><tr><td>AAA<table><tr><td>BBB</td></tr></table></td></tr></table>だと
> AAA
> BBB
> BBB
> と表示されます。このようにテーブルの入れ子になっている場合に要素内容が重複してしまいます。

innerText なら当然そうなるに決まってる。HTML DOMを勉強しろ。

> そうではなくて、HTMLをパースしてツリー状にしたいと思っています。

DOM そのものが要素によるツリー構造になってるわけだが、それをどうしたいんだ結局。

> ・HTMLElementCollection ec = HTMLDocument.GetElementsByTagName("タグ")とするとビルドエラー
> IHTMLElementCollectionにすると可能

> ・elem.innerText , elem.parentElement は可能だが、
> elem.children , elem.getAttribute , elem.title などは不可。

> また、こちらのパースも試したのですが、ビルドエラーになってしまいました。

なんでエラーの詳細すら書かない?
76デフォルトの名無しさん:2006/03/10(金) 01:38:23
はい、innerTextだとそうなるのは当然だと思います。
ツリーの何階層目がどんなタグで、どの子要素がどんなタグで、widthとheightが○○で、bgcolorが○○で・・・
といったものをすぐに取り出せるようにしたいと思っています。
DOMだとどのようにやるのか今わからない状態です。

HTMLElementCollection ec = HTMLDocument.GetElementsByTagName("タグ")
とすると、
型 'MSHTML.IHTMLElementCollection' を 'MSHTML.HTMLElementCollection' に暗黙的に変換できません。明示的な変換が存在します。(cast が不足していないかどうかを確認してください)
コンパイラ エラー CS0266
になります。

IHTMLElement elem = (IHTMLElement)ee.Current;
IHTMLElement test = elem.parentElement;
は可能なのですが、
HTMLElement test = elem.children;
IHTMLElement test = elem.children;
HTMLElementCollection test = elem.children;
IHTMLElementCollection test = elem.children;
などにすると、
型 'object' を 'MSHTML.HTMLElementCollection' に暗黙的に変換できません。明示的な変換が存在します。(cast が不足していないかどうかを確認してください)
コンパイラ エラー CS0266

となります。
どこが間違っているのでしょうか。
77デフォルトの名無しさん:2006/03/10(金) 01:49:04
どこがって……わざわざ丁寧にコンパイラが教えてくれてるじゃん……。
78デフォルトの名無しさん:2006/03/10(金) 01:55:47
ヒントをください
79デフォルトの名無しさん:2006/03/10(金) 01:59:45
10時間くらい粘ったんですが、ほんとにわかりませんでした。
きついです。助言お願いします。
80デフォルトの名無しさん:2006/03/10(金) 02:08:13
HTMLDocument.getElementsByTagName が返す型は何よ?
IHTMLElement.children が返す型は何よ?

public object Hoge() {return new object(); } ってメソッドが返す型は何よ?

string str = Hoge(); ってどうよ?
81デフォルトの名無しさん:2006/03/10(金) 02:39:41
HTMLDocumentクラス
http://msdn2.microsoft.com/ja-jp/library/system.windows.forms.htmldocument(VS.80).aspx

こちらのページに、
「GetElementsByTagName は、DIV や TABLE など、指定された HTML タグ名を持つすべての HtmlElement オブジェクトの HtmlElementCollection を返します。」
とあります。しかし
HTMLElementCollection ec = doc.getElementsByTagName("table");
とすると先ほどのエラーになります。
IHTMLElementCollection ec = doc.getElementsByTagName("table");
とするとビルドが出来ます。
これはなぜなのでしょうか?

また、
IHTMLElement elem = (IHTMLElement)ee.Current;
IHTMLElement test = elem.parentElement;

HTMLElement elem = (HTMLElement)ee.Current;
HTMLElement test = elem.parentElement;
としても先ほどのエラーになります。
全てのIHTMLをHTMLとしてもエラーになります。

82デフォルトの名無しさん:2006/03/10(金) 02:40:45

IHTMLElement.children の返す型はIHTMLElementCollectionであっているでしょうか?
IHTMLElement elem = (IHTMLElement)ee.Current;
IHTMLElementCollection child = elem.children;
だとしたらこれも同様のエラーになるのはなぜなのでしょうか。

また、
Boolean flag = elem.CanHaveChildren;
'MSHTML.IHTMLElement' に 'CanHaveChildren' の定義がありません。
コンパイラ エラー CS0117
になります。
83デフォルトの名無しさん:2006/03/10(金) 02:45:46
そろそろコテつけるかどうにかしてくれ
84デフォルトの名無しさん:2006/03/10(金) 02:46:16
IHTMLDocument や HTMLDocument , IHTMLElement , HTMLElement 等を使って、
テーブルの何番目の行の何番目のセルの値や背景色を得る方法を知っている方がいましたら
教えていただければと思います。
85デフォルトの名無しさん:2006/03/10(金) 02:50:23
> HTMLDocumentクラス  
> ttp://msdn2.microsoft.com/ja-jp/library/system.windows.forms.htmldocument(VS.80).aspx  

それは
System.Windows.Forms.HtmlDocument クラスであって、
mshtml.HTMLDocument クラスではなかろうが。
C# でコーディングするならせめて大文字小文字の区別ぐらいは付けれ。

> HTMLElement test = elem.parentElement;  

だからさ、IHTMLElement.parentElement が返す型は何よ?

public namespace Foo {
    public class A {}
}
public namespace Bar {
    public class a {}
}

a hoge = new A();
はどうよ。
86デフォルトの名無しさん:2006/03/10(金) 07:26:18
まずデバッグ用の各種ウィンドウの見方を覚えることからはじめることをお勧めする
質問のほとんどはローカルウィンドウとかウオッチウィンドウで確認できることばかり

君の現時点の能力以上のことをやろうとしているんだから、今やっつけでクリアできてもまた質問厨になるだけ
8762:2006/03/10(金) 13:45:22
>85
System.Windows.Forms.HtmlDocument
mshtml.HTMLDocument
の違いをやっと理解しました。

IHTMLElement.children
が返す型がわかりません。
HTMLDocument , IHTMLElement でキャストしてみたのですが出来ませんでした。
(IHTMLElement.children).GetType()や
(IHTMLElement.children).ToString()
とするとSystem._Comobjectとなり、わかりませんでした。
javaだと.toString()でオブジェクトの種類やプロパティが列挙されたりすると思うんですが、
C#では、オブジェクトやプロパティを調べる一般的な方法はあるんでしょうか?

すみませんが、わかる方いたらよろしくお願いします。
88デフォルトの名無しさん:2006/03/10(金) 14:33:44
>>87
オブジェクトブラウザは
 object children { get; }
  mshtml.IHTMLElement のメンバ
だと言ってますが。

2.0使っているならmshtmlのお世話にならなくても
なんとかなりそうな気配がするんだけども
触らずに言っているので嘘かも。
8962:2006/03/10(金) 15:01:29
object型にはキャスト出来るのですが、object型だと.GetEnumeratorが使えないので、
どのようにして、childrenの各要素をいじれるのかわからないのです。

>2.0使っているならmshtmlのお世話にならなくても
>なんとかなりそうな気配がするんだけども
>触らずに言っているので嘘かも。
試してみたいので、ヒントをお願いします。

HTMLのツリー構造を解析する方法について何か知っている方がいたら、
何でもいいので教えていただけると助かります。
関連ページだけでもいいので、よろしくお願いします。
90デフォルトの名無しさん:2006/03/10(金) 15:53:24
>>89

> HTMLのツリー構造を解析する方法について何か知っている方がいたら、
> 何でもいいので教えていただけると助かります。
> 関連ページだけでもいいので、よろしくお願いします。

Web Development
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dnanchor/html/anch_webdev.asp?frame=true

これのHTML関係一通り読破してから出直してきてね
91デフォルトの名無しさん:2006/03/10(金) 16:18:44
>>89
お前超ウザいから消えて
おみやげあげるからあとは自分で考えろ
理解できなきゃ無能と思って諦めろ

private void webBrowser1_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
{
treeView1.BeginUpdate();
treeView1.Nodes.Clear();
ParseHTML(webBrowser1.Document.All, treeView1.Nodes.Add(webBrowser1.Url.AbsoluteUri));
treeView1.EndUpdate();
}

private void ParseHTML(HtmlElementCollection hec, TreeNode node)
{
foreach (HtmlElement he in hec)
{
TreeNode NewTreeNode = node.Nodes.Add(he.TagName);
if (he.Children != null)
{
ParseHTML(he.Children, NewTreeNode);
}
}
}
92デフォルトの名無しさん:2006/03/11(土) 15:30:37
ここは偉そうな人が一杯いるスレですね
つーかプログラマって対人能力無いから嫌い
93デフォルトの名無しさん:2006/03/11(土) 16:11:36
>>92
俺も空気の読めないお前が嫌い。
94デフォルトの名無しさん:2006/03/11(土) 16:30:44
ODP接続でレコードカウントを取得した際、「指定されたキャストは有効ではありません」
というエラーになります。対策をご教授願います。


int iRec;


iRec = Ora.GetInt32(0);  ←ここでエラー
95デフォルトの名無しさん:2006/03/11(土) 16:36:23
DbNullが入ってるとかじゃね?
96デフォルトの名無しさん:2006/03/11(土) 16:39:00
>>95
レスどうも。
トレースしたら「20」という値が入っていました。(SQLはカウント文です。)
GetInt16でも駄目でした。OracleValues(0)でも駄目です。
97デフォルトの名無しさん:2006/03/11(土) 16:50:57
GetDataTypeName でデータ型を調べてみたら
98デフォルトの名無しさん:2006/03/11(土) 16:53:32
Decimalでした。
けど駄目です。
99デフォルトの名無しさん:2006/03/11(土) 17:01:03
>>97 >>95
iRecをdecimal型にしたら取得できました。
ヒントを頂きありがとう御座いました。
100デフォルトの名無しさん:2006/03/11(土) 21:23:42
OracleでのNumberはdecimalになってるからね。
直接decimal以外の数値型にはキャストできないんだよね。
101デフォルトの名無しさん:2006/03/11(土) 22:45:28
C#はまだ慣れてないから面白いけど、工数が足りない・・・
102デフォルトの名無しさん:2006/03/12(日) 12:42:51
すいません、
DataGridViewの内容をクリアするにはどうしたらよいでしょうか?
某サンプルにDataGridView1.Rows.Clearが載っていたから試しましたが上手く動きません。
ヘルプを見たりググっても見当たらないのですが。
103デフォルトの名無しさん:2006/03/12(日) 12:57:38
内容ってどこからどこまでさ。
データソースは何さ。
104102:2006/03/12(日) 13:09:58
>>103
データソースは使っていません。
ホームページから取り込んだ表(HtmlElementCollection)を以下のように表に取り込んでいます。
DataGridView1.Rows.Add(new object[] { Data1, Data2, Data3 });
更新が出来なくて困ってるんです。
105デフォルトの名無しさん:2006/03/12(日) 13:17:53
>>92
>>91
これだけ書いてもらえれば十分優しいだろ。
一人でいくつも投稿したら、うざがられるにきまってる。
mixiでトピでも立てろ。コテだとみんな親切に振る舞うからな。
106デフォルトの名無しさん:2006/03/12(日) 13:27:42
>>104
Rows.Clear で問題なさそうだが、どう「うまく動かない」んだ?
107デフォルトの名無しさん:2006/03/12(日) 13:51:09
C#では構造体のメンバを配列に指定することができるのでしょうか?
下記のインスタンスを生成した際、「構造体にインスタンスフィールド
初期化子を指定することはできません。」というエラーとなります。

ご教授願います。

structure{
   public [] array = new string[10]
}
108デフォルトの名無しさん:2006/03/12(日) 13:52:36
引数付きコンストラクタ定義して初期化汁
109デフォルトの名無しさん:2006/03/12(日) 14:30:27
>>108
どうも、調べてみます。
110デフォルトの名無しさん:2006/03/12(日) 16:48:52
こんど、C#を使ってアプリケーションを開発する事になったのですが、
初めてなので、色々と勉強しております。(今までVB6かVC6でした)

そこで、質問なのですが、DBを使用して色々と弄ってみようと思ったのですが、
色々と疑問が湧いてきました。

コネクションやらアダプタを貼り付けて・・・というサンプルを書籍やインターネット上でよく見かけます。
確かに、そういった開発はサンプルを元に出来るようにはなったのですが、
複数画面あるアプリケーションが一般的であり、そういった画面1つ1つにコントロールを貼り付けて・・・
という作業は非効率的な気がします。

また、データベース接続部分などを関数化して・・・というサンプルも見かけるのですが、
どれも接続文字列のみを外部や引数などで取得し、DataSetやDataAdapterを作ってから、
それらのオブジェクトを戻り値として返すようなものを多く見かけます。

VB6などでは、グローバル変数にコネクションなどを宣言しておいて、
ログイン処理などのあとは1つのコネクション変数に対してレコードセットを作成したりしていました。

C#でまったく同じという訳にはいかないでしょうが、アプリケーションが終了するまで
1つのコネクション参照するといった事はNGなのでしょうか?

もしNGでないならば、そういったサンプルがありましたら書籍やHPなどの情報を教えて頂きたく。
111デフォルトの名無しさん:2006/03/12(日) 16:52:17
ADO.NET では、コネクションは必要なときに作っていらなくなったらさっさと破棄するもの。
112110:2006/03/12(日) 17:47:46
>>111
なるほど。

でも、そうすると別の疑問が湧いてきます。
DBアプリケーション全般に言える事だと思うのですが、
DB接続のコストはCPU負荷も時間も相当のコストを使うものだと思うのですが、
そんなに接続・切断を繰り返していいものなのでしょうか?

また、(機能の異なる)複数の画面が同時に立ち上がったとき、
コネクションの数はどうなるのでしょうか?
1つのアプリケーションで2つ3つ、場合によっては数十個のコネクションが生成されるのでしょうか?
113デフォルトの名無しさん:2006/03/12(日) 17:53:32
だからそのためにコネクションプーリングと言う仕組みがある
プログラマが意識する必要はないが
114デフォルトの名無しさん:2006/03/12(日) 18:46:22
>>112
111に補足すると、必要な時と言うのは別に1レコードセット単位という訳ではない。
連続したDBアクセスがあるなら1つのコネクションを使いまわすべき。
途中にユーザのアクセスを挟まないのを基本的な1単位とすると良い。

次に、DBとのコネクションは「同じユーザ」が「同じ接続文字列」で接続した場合にコネクションプーリングが機能して無駄なコネクションが発生しなくなる。
普通アプリケーション内では同じ接続文字列を利用するため、キーになるのは「同じユーザ」であること。
もし認証機構の都合で同じユーザにならない場合は、擬装を用いて同じユーザにする。
ASP.NETでは基本的に同一の接続文字列を使うだけでプーリングが機能するので楽だが、Windowsアプリでは色々と意識することが必要(データ層で擬装するなど)
また、どうしても複数ユーザを用いる場合はプール数を調整するなど色々な対処方法がある。

この手のことはMCPを勉強すると当たり前の知識になる
MCPを開発者は馬鹿にすることが多いが、初心者はMCPの勉強を一通りやることをお勧めする(実際に受験する必要はない)
下手な参考書見てぐぐるよりよっぽど体系的な知識が付く
115102:2006/03/12(日) 19:00:06
>>106
>Rows.Clear で問題なさそうだが・・・
とおっしゃるので実験したら、出来ました。
どうもウェブの再読み込みに問題があるようです。
どうもありがとうございました。
116110:2006/03/12(日) 20:01:38
>>113-114
なるほど参考になります。

ただ1つ気になったのは、

>もし認証機構の都合で同じユーザにならない場合は、擬装を用いて同じユーザにする。
>ASP.NETでは基本的に同一の接続文字列を使うだけでプーリングが機能するので楽だが、Windowsアプリでは色々と意識することが必要(データ層で擬装するなど)

偽装をした場合、DBに対しては接続ユーザを正確に知らせる事は出来るのでしょうか?
(例えばOracleのログイン・ログオフ データベーストリガーでユーザのアクセスログなどを取っている場合など)

個人情報保護法の関係で、こういった情報が必要ですので、誤魔化せるとなると
逆にどうやっても誤魔化せないように実装しないといけないので・・・
117デフォルトの名無しさん:2006/03/12(日) 21:01:40
>>116

> 偽装をした場合、DBに対しては接続ユーザを正確に知らせる事は出来るのでしょうか?

無論偽装したんだからできない
DBレベルでセキュリティ強化するのであればプーリングはユーザ単位にするしかない
あらゆる要素を都合良く盛り込むことはできないから、何かをトレードオフする必要があるわな

ただ、Oracleの接続にADO.NET以外を使えば解決策があるかもしれない
そこはもうADO.NETもC#も関係ないOracle開発の世界だからそっちのコミュニティなりスレで聞くべし
118デフォルトの名無しさん:2006/03/13(月) 00:39:33
C#って最強の言語じゃね?
119デフォルトの名無しさん:2006/03/13(月) 00:39:51
いいえ
120102:2006/03/13(月) 00:54:25
今度はキャッシュに困ってます。
webBrowser_DocumentCompletedでHtmlDocumentを解析して表を取り込んでいるのですが、
更新が上手く出来ません。Navigateで飛ばすとキャッシュを読み込んでしまいます。
Refreshでキャッシュを消してもDocumentCompletedを呼び出してくれません。
Refresh後SleepさせてからNavigateでDocumentCompletedで呼び出しても駄目でした。。
ヘルプに、「キャッシュ内で存続できる時間を示す有効期限を指定できます」とあるのですが、
その方法が記されていません。ならばレジストリを直に操作しようと思ったのですがググっても出てきません。
どなたか良い方法を御存知でないでしょうか?
121デフォルトの名無しさん:2006/03/13(月) 01:25:18
まあ Refresh 呼び出して ReadyState が Complete になるのを待つしかないんじゃない?
いっそ WebClient でローカルにファイルを保存してそれを開くようにした方が手っ取り早いかもね

>キャッシュ内で存続できる時間を示す有効期限を指定できます
これは相手のサーバが返す値をキャッシュに保存してるってことのはず
指定するのは相手のサーバ
122デフォルトの名無しさん:2006/03/13(月) 09:14:26
>>120
君さー、いい加減基礎知識の勉強からやってよ
話してる次元がC#で実装する以前のレベルだから

そもそもWebBrowserコンポーネントって内部的に何だか理解してる?
あと、ざっとでいいからHTTPヘッダ読んで意味を理解できる?
単にHTMLページを表示するだけの話じゃないから、そういうところの知識が要る

どうせ文句だけ書くと読まない厨だろうからここからざっと回答

キャッシュを取り込むのはIEとして普通
キャッシュを取りたくないのであれば、サーバ側でpragmaにno-cache突っ込むとかmetaでexpiresを-1にするとか色々な方法がある

[HOWTO] Internet Explorer でキャッシュを無効にする
http://support.microsoft.com/default.aspx?scid=kb;ja;234067

あとAPIを利用する方法もある。
これはVBの例だが移植すれば使える。

アプリケーションが WebBrowser コントロール をホストするとき、操作方法クリア キャッシュ
http://support.microsoft.com/kb/262110/

URLが変われば違うページと認識することを利用して、毎回ランダムな引数を付与するって方法もある。

基本を知っていればこの程度の情報は簡単に検索できる。
逆を返せば、最低限の知識も無く実装しようとしている。
もっと基本的な事を理解してから手をつけるべきだと思うよ。
誰が使うか知らんが、リリース後にクレーム受けまくって対処できなくなっても知らんよ。
123102:2006/03/13(月) 11:10:28
>>122
ちょっと待ってください!
質問似てるけど私は >92とは全くの別人です!
彼のやろうとしてることは出来ます!
でもアドバイスありがとですw
124デフォルトの名無しさん:2006/03/13(月) 12:07:28
なんつーか、元気はつらつ?
125デフォルトの名無しさん:2006/03/13(月) 12:15:30
>彼のやろうとしてることは出来ます!
何気に自分の方が優秀だとアピールすな。
126デフォルトの名無しさん:2006/03/13(月) 12:29:49
すいません。>>107ですが、やっぱり分かりません。
ご教授願います。
127デフォルトの名無しさん:2006/03/13(月) 12:36:44
おまえネタだろw
目をくまなくして見ろ。このうんこ野郎が!
128デフォルトの名無しさん:2006/03/13(月) 12:41:49
普段VB.NETメインでやってる人間なんですが、
C#ではヌルストリングを表すのに空の文字列とnull(VBではNothing)が混在するような場合
どうするのが通常でしょうか?

ヌルストリングかどうか判定する際、いちいちorをとるコードを書くのが普通か。
それとも、そもそも混在を許さないようにどちらかに強制するようにするべきか。

VBでは「空の文字列とNothingは等価扱い」という(いい意味で?)いい加減な仕様になっているので
何も考えなくていいんですが。
129デフォルトの名無しさん:2006/03/13(月) 12:54:39
空文字列は空文字列って値が存在してるんだから混在も何もなかろ。
どんな状況を想定してるんだ?

.NET 2.0 では Stribg,IsNullOrEmpty メソッドが増えたが。
130デフォルトの名無しさん:2006/03/13(月) 13:31:39
>>126

public struct Foo
{
  public string[] KonoUnkoYarou;

  public Foo( string[] netas )
  {
    KonoUnkoYarou = netas;
  }
}
131デフォルトの名無しさん:2006/03/13(月) 13:33:55
IsNullOrEmpty・・・・・・・・たぶん使うこと無いだろうな、一生
132デフォルトの名無しさん:2006/03/13(月) 13:48:58
DELPHIのビルドの速度に感動したんですが、
C#のビルド速度ってどうですか?
まぁまぁ速いならちょっと勉強しようかな・・と
133デフォルトの名無しさん:2006/03/13(月) 13:56:50
>>128
VBでは「空の文字列とNothingは等価扱い」って嘘じゃない?
str=Nothing と str="" が等価なのは便宜上のうんこ仕様

vbの str Is Nothing がC#の str==null

空文字判定は、C#ではstr==""だとインスタンスが生成されるから
str==String.Emptyか、
nullじゃないことが分かってるならstr.Length==0を見るのが一般的
134デフォルトの名無しさん:2006/03/13(月) 14:26:47
>>132
TurboCでも使ったら?
きっとDelphiなんて捨ててしまいたいくらい感動するから
135デフォルトの名無しさん:2006/03/13(月) 14:35:55
>>132
同じボリュームのソースならC++のコンパイルより速い。
てか何でこんな速いのか謎なくらい。
136120:2006/03/13(月) 15:01:25
>>130
どうもありがとう御座います。
137デフォルトの名無しさん:2006/03/13(月) 15:07:52
 > 空文字判定は、C#ではstr==""だとインスタンスが生成されるから

それぐらい最適化されるんじゃない?




と言ってみるテスト
138デフォルトの名無しさん:2006/03/13(月) 15:12:18
よくこういうコードを書くことがあるので
IsNullOrEmptyは個人的にはおっけー

if(foobar==null || foobar.Length==0){
ほにゃらら
}
139デフォルトの名無しさん:2006/03/13(月) 15:13:46
最適化というか。
"" と String.Empty は別インスタンスが作られる。
"" は "" で一つのインスタンスを使い回す。
140デフォルトの名無しさん:2006/03/13(月) 15:14:53
>>128
俺は基本的にstringにnullはいれない方針。
おっしゃるとおり混在するとめんどいしね。
ただ空文字も意味がある場合は、無効な値の場合はnullを入れる
という使い方をするときもある。
141デフォルトの名無しさん:2006/03/13(月) 15:22:13
ToolStripMenuItem でラジオチェックマークをつけるにはどうしたらよいでしょうか?
MenuItem には RadioChecked がありますが、ToolStripMenuItem で見当たらないようですが。
142デフォルトの名無しさん:2006/03/13(月) 15:22:14
abstract class parent
{
public event EventHandler Hoge;
...

}

class child : parent
{
public override void foo()
{
...
Hoge(this, EventArgs.Empty);
// ↑ コンパイルエラー: イベント '〜.Parent.Hoge' は +=、-= の左辺にのみ使用できます。ただし、'〜.Parent' 型内から使用されている場合を除きます。
...
}
...
}

継承したクラスから継承元クラスで定義されたイベントを発生させるにはどうすればよいのでしょうか?

環境はVisual C# 2005です。
143デフォルトの名無しさん:2006/03/13(月) 15:22:42
>>132
速いのは結構だが、最適化とかちゃんとされてるの?
リンクされるライブラリの差は?
単に速ければいいってもんじゃないと思うんだけどね

オレはVC#2005とDelphiの同じボリューのソースのコンパイル速度がDelphiの方が圧倒的に超絶に速くてもVC#を選ぶ
ビルド速度なんて超絶に遅くなけりゃどうでもいい

ビルドの速さごときで全く違う開発系のDelphiからVC#へ乗り換えようと思うってことは、何かその部分を圧倒的に重視する理由があるんだよね
そこを重視する理由に興味がある
是非教えて欲しい
144102:2006/03/13(月) 15:23:20
>>125
いえ、別人だとアピールしたかっただけですw
145デフォルトの名無しさん:2006/03/13(月) 15:28:35
>>142
基底クラスに protected virtual OnHoge を用意する。
146デフォルトの名無しさん:2006/03/13(月) 15:37:21
>>145
早速のレスありがとうございます。

継承したクラスのメソッドが基底クラスのOnHoge()を呼んで、
基底クラスのOnHoge()でイベントを投げればよいということでしょうか?
147デフォルトの名無しさん:2006/03/13(月) 15:43:20
そういうこと。
System.Windows.Forms のコントロール群見てもそうなってるでしょ?
>派生させて OnTextChanged をオーバーライドして base.OnTextChanged を呼ばないと、
 TextChanged イベントに登録したハンドラが実行されない
148デフォルトの名無しさん:2006/03/13(月) 15:43:41
>>143
別人だけど、トライ&エラーで学習するなら
ビルドは速ければ速いほどいいんじゃない?
実行速度よりも重要かも。
149デフォルトの名無しさん:2006/03/13(月) 15:47:30
>>148
俺も別人だけど、学習レベルのコード量で
トライ&エラーが遅くて勉強にならないという
糞マシンのスペックを教えて欲しい。
150148:2006/03/13(月) 15:57:52
>>149
さあ?

うちのPCは P4 1.7GHz+1GBmem だけど、 ビルドで不快な程待たされたことはないなあ。
最大でも30kstepくらいのものしかビルドしてないけど。

celeron1GHz+256MBmemとかの、一昔前のエントリーマシンなら
それなりに時間かかるんじゃね?知らないけど。
151デフォルトの名無しさん:2006/03/13(月) 16:15:04
配列に新しい要素を追加する場合、

1.配列をコピー
2.配列の要素数を増やして初期化
3.コピーした配列をセット
4.追加したい要素をセット

現在このような方法をとっているのですが、
array.Add(index, 要素)
のように、配列の要素数を簡単に動的に扱う機能というのはあるでしょうか。

Arrayクラスあたりのメソッドにあるかと思ったのですが、見つかりませんでした。
152デフォルトの名無しさん:2006/03/13(月) 16:17:36
つArrayList
153デフォルトの名無しさん:2006/03/13(月) 16:23:24
つ List<T>
154148:2006/03/13(月) 16:24:56
>>151
2.0ならGenericのList<>も候補
そういう「集まり」を扱うクラスは、System.Collectionsもしくは
System.Collections.Genericに色々あるから見てみるといいよ
155デフォルトの名無しさん:2006/03/13(月) 16:27:53
>152-154
ありがとうございます。
156デフォルトの名無しさん:2006/03/13(月) 17:04:30
>>134
TurboPascalはTurboCよりさらにコンパイルが速かったのを覚えています。
>>132
私はDelphi使いですがWindowsCEアプリを開発する必要にせまられて
VS2005を評価しています。
同じ大きさのソースで較べたんじゃないけど今までのMSの開発環境に
較べて圧倒的に速い。かつ、IDEがとても使いやすい。
DelphiがVer7の次からどんどんもっさりして使いにくくなっていってるのに
対してこれがMicrosoftの製品かと思うくらい使いやすくなってる。

以前Delphiの開発者がMicrosoftに引き抜かれたという話を聞いたことがあるが
その影響を痛切に感じました。
157デフォルトの名無しさん:2006/03/13(月) 17:13:43
>>156
ベースにDelphiマンセーがあるようだけど、コア技術者が引き抜かれたってのは相当前の話だから
君が評価してるっぽい7の頃にはコア技術者はとっくにMSの住人ですよ
158デフォルトの名無しさん:2006/03/13(月) 17:36:33
VisualC#2005ExpressB2を使用しているのですが、
いきなりリターンキーやバックスペースキー、デリートキーが
入力不能になることって、ないですか?
159デフォルトの名無しさん:2006/03/13(月) 17:38:04
>>158
B2って何?ベータ版ってこと?
既に製品版が期間限定で無償提供されてるからそっち使え
とっくにベータ版の評価受付は終わってるから、評価しても受け取ってもらえないよ
160デフォルトの名無しさん:2006/03/13(月) 17:44:19
しかしリファクタリングの機能にはかなり不満。
Eclipseに比べると見劣りするな。
せめてgetter/setterまとめて作ることはできんのかな。
161デフォルトの名無しさん:2006/03/13(月) 17:47:19
無料版だからなー。
Standard 以上には確かついてるぜ。
162158:2006/03/13(月) 17:50:12
>>159
ありがとう。さっそくやてみるー
163デフォルトの名無しさん:2006/03/13(月) 17:58:02
>>157
うん、DlphiマンセーというかDlphiを開発した人のコンセプトが大好き。
だから今はVS2005マンセーになりかけてる。

きみもプログラマなら、コア技術者が抜けたからと言って製品の性格が
すぐに変わる訳じゃないし、新しい製品が使い物になるのに時間がかかるって
ことはわかるよね。
時間はかかったけどmicrosoftがその技術者を活かすことが出来るような
会社だった(なった?)んだなってことを思ったってこと。
164102:2006/03/13(月) 18:04:34
>>121
遅くなりましたがレスありがとうございました。
参考にさせて頂きます。
165デフォルトの名無しさん:2006/03/13(月) 22:57:33
>>163
なに急にえらそうになってるの?
166デフォルトの名無しさん:2006/03/13(月) 23:20:41
System.Runtime.Remoting.Channels.Ipc
って試してみた人いる?これまでSendMessage APIとか使うしか
なかった、アプリ間のデータのやり取りに使えるんだろうか。
167デフォルトの名無しさん:2006/03/13(月) 23:26:31
しかなかったって、別にアプリ間で HttpChannel や TcpChannel が禁じられてた訳じゃないが。
168デフォルトの名無しさん:2006/03/13(月) 23:37:17
>>166
ファイヤーウォールとか空きポートとか気にしなくていいからいいかんじでっせ。
169デフォルトの名無しさん:2006/03/13(月) 23:38:10
あえて口開けて待つようにするか微妙
170デフォルトの名無しさん:2006/03/14(火) 04:42:17
複数のFormを表示しているときに、
ウィンドウが重なると後ろに隠れてしまうのですが、
TopMostを使うと常に一番前にきてしまいます。

細かい位置調整する手段はあるのでしょうか?

171デフォルトの名無しさん:2006/03/14(火) 04:44:34
Owner
172170:2006/03/14(火) 04:57:07
>>171
できました。
ありがとうございました。m(_ _)m
173デフォルトの名無しさん:2006/03/14(火) 09:28:17
Visual C# 2005 Expressで、初めてのC#でプログラムを作ろうとしています。

プロジェクトの新規作成で、Windowsアプリケーションを選択すると
フォームのみが表示される雛型が作成されますが、自分で作成したクラスから
このフォーム Form1 に対するアクセスはどうしたら良いんでしょう?
自動作成されるProgram.csのApplication.Run(new Form1());の部分で
フォームが作成されると思うのですが、この部分が
Form1 form = new Form1();
のようになっていれば、インスタンス form を介してフォームにアクセスできる
はずですが、自動作成された部分の
Application.Run(new Form1());
だと、インスタンスはどうなってるんでしょう?

長くなりましたが要は、自作クラスからフォーム及びそのフォームに貼り付けられた
コンポーネントにアクセスするには、どのようにすれば良いですか?
174デフォルトの名無しさん:2006/03/14(火) 09:49:23
そう言う風に変更すればいい。
が、それは Main の中でやらなきゃいけないことなのか?

つか初めてならコンソールで Hello world から……
175デフォルトの名無しさん:2006/03/14(火) 10:14:15
>>173

> Application.Run(new Form1());

このコードを、よーーーーーく目を凝らして見てみなさい
きっと何かが見えてくるから

ヒントは君が書いた

> インスタンスはどうなってるんでしょう?

だよ

がんばってね☆
176デフォルトの名無しさん:2006/03/14(火) 10:20:42
>>173

> 長くなりましたが要は、自作クラスからフォーム及びそのフォームに貼り付けられた
> コンポーネントにアクセスするには、どのようにすれば良いですか?

フォームもクラスです
クラス間のインタフェースの取り方はC#の基礎です
つまり、基礎が欠落しているため、何を説明されても理解できないでしょう
コードを直接提示されても、コードに対する疑問が湧くだけです
まず、C#の言語の基礎を勉強しましょう

今回のはアクセス修飾子を理解してないから「コンポーネントにアクセス」する方法が理解できないのです
また、自動生成されたコードの流れもしっかり読んで、どういう制御構造にすべきか理解しましょう
177デフォルトの名無しさん:2006/03/14(火) 10:32:26
this
178デフォルトの名無しさん:2006/03/14(火) 10:32:58
>>173
以前はVB6だったのかな?
Run(new Form1);はForm1 form = new Form1(); Run(form);を縮めただけ。
int a = b + c; Debug.Write(a);をDebug.Write(b + c);にしたのと一緒です。
インスタンスは作ったけど、それを参照する変数を用意してないということ。
だから
class MyClass{//詰め込んで書いてます
  private Form1 form1;
  public MyClass(Form1 form1){this.form1 = form1;}
  public Form1 form1{get{return this.form1;}}
}
ってして、
MyClass myClass1 = new MyClass1(new Form1);
Application.Run(myClass1.Form1);
とでもするのが一案。やりかたはいろいろあります。

フォームに貼ったコンポーネントは既定でprivateなのでそのままでは×。
VB同様internalに変更することもできるが、プロパティを使おう。
class Form1 : Form{
  internal decimal Hoge{get{return this.textBoxHoge.Text;}set{this.textBoxHoge.Text = value;}}
}
class MyClass{
  ...
  Debug.Write(this.form1.Hoge);
  ...
}
179デフォルトの名無しさん:2006/03/14(火) 10:34:33
ねぼけて適当に書いたからなんか間違ってるような気がしてきた
まあ、ここみたほうが早い

http://www.microsoft.com/japan/msdn/net/books/ProgWinCsharp/chapter2.asp
180デフォルトの名無しさん:2006/03/14(火) 10:35:43
すまん、俺177な
181デフォルトの名無しさん:2006/03/14(火) 10:36:26
アアアアID非表示板なれてなくてスミマセン

177=179=180ッス
182デフォルトの名無しさん:2006/03/15(水) 14:41:27
static char[] hexDigits = {
   '0', '1', '2', '3', '4', '5', '6', '7',
   '8', '9', 'A', 'B', 'C', 'D', 'E', 'F'};

public static string ToHexString(byte[] bytes) {
  char[] chars = new char[bytes.Length * 2];
  for (int i = 0; i < bytes.Length; i++) {
     int b = bytes[i];
     chars[i * 2] = hexDigits[b >> 4];
     chars[i * 2 + 1] = hexDigits[b & 0xF];
  }
   return new string(chars);
}

バイト列を16進の文字列に変換したいのですが
この処理標準ライブラリだとなんというメソッドですか?
183デフォルトの名無しさん:2006/03/15(水) 14:50:54
>>182
1バイトだけならこんな感じで
byte a = 11;
textBox1.Text = a.ToString("X2");
184デフォルトの名無しさん:2006/03/15(水) 15:05:08
すみません、ご存じの方がいたら教えてください。
.NET Framework 1.1でButtonを使用すると左クリックでしか押下
状態になりませんよね?
これを右クリックでも押下状態にしたいのですが、マウスイベントから
自前でガリガリ組むしか手はないのでしょうか?

MFCでいうSetState()的なものが見つからないのです・・・。
185デフォルトの名無しさん:2006/03/15(水) 15:05:45
BitConverter.ToStringとか
186デフォルトの名無しさん:2006/03/15(水) 16:38:22
あるツールを作ってまして、入力項目(ファイル名とか)が複数あるので
これをファイルに保存できるようにしようと思って、XmlSerializerで
保存するようにしました。ですがこのクラス、終了時に「変更されています。
保存しますか?」と聞けるように、何かプロパティを変更したらSavedプロパティ
というのをfalseにするようにしてるんですが、デシリアライズ時にも
プロパティ変更とみなされてSaved == falseになるので、ファイルを開いて
何もせずに終了させても「保存しますか?」と聞かれてしまいます。
Savedプロパティを書き込み可能にするとなにか気持ち悪いので、ほかに
どう回避したらいいでしょう。
187デフォルトの名無しさん:2006/03/15(水) 17:00:06
OnDeserialized って XmlSerializer で使えたっけ
188デフォルトの名無しさん:2006/03/15(水) 23:17:47
>>186
シリアライズ、デシリアライズするメンバをそのクラスに持たせればいいんじゃね?
189デフォルトの名無しさん:2006/03/15(水) 23:25:23
class Base {
  public virtual int Value { get.. }
}

このBaseのソースがないとして
Base.Value に新しい属性を追加したいとき

class Ext : Base {
  [SomeAttribute]
  public override int Value { get.. }
}
って風にサブクラス作る以外に方法はありませんか?
190デフォルトの名無しさん:2006/03/15(水) 23:28:18
無い
クラスで一意なのが属性
191デフォルトの名無しさん:2006/03/15(水) 23:39:52
残念。そしてありがとう。
192デフォルトの名無しさん:2006/03/16(木) 00:16:21
>>186
staticメンバで自分の永続化オブジェクトを呼び出す(ロード)メソッドを作成し、そこでprivateのsaved変数をFalseにする。
ってどう?
193デフォルトの名無しさん:2006/03/16(木) 10:33:05
>>192
あーなるほど、今ちょっと試したんですが
同じクラスの中ならstaticメソッドの中でインスタンスメンバを
覗けるんですね。いけるかどうかやってみます。
194デフォルトの名無しさん:2006/03/16(木) 14:16:28
.NetのIDropTargetインターフェイスと、OLEドラッグ&ドロップのIDropTargetって
関係ありますか?

エクスプローラのツールバー作ってるんですが、
コントロールのAllowDrop = trueにして実装すると
なんかexplorerのプロセスが終了しないで残るんです。

OLEのほうでIDropTarget実装して、終了時にRevokeDragDropしたら
きちんと終了するようになったんですが、これと同じようなことを
マネージドでできないのかと思いまして
195デフォルトの名無しさん:2006/03/16(木) 16:06:53
string を IntPtr へ渡したいんだけどどうしたらいいかな。
196デフォルトの名無しさん:2006/03/16(木) 16:15:28
Marshal.StringToPtr()
197デフォルトの名無しさん:2006/03/16(木) 16:45:55
はやい、どうもありがとう。
198デフォルトの名無しさん:2006/03/16(木) 16:56:48
いや、そんなメソッド無いけどな。
Enodingでバイト配列にしてMarshal.Copyとか。
199194:2006/03/16(木) 17:24:07
AllowDropって、RegisterDragDrop/RevokeDragDropするだけだったんですね。
で、どっちにしろexplorerのプロセスが終了してないことに気づきました。
どなたか理由の思いつく方いらっしゃいませんか?
200デフォルトの名無しさん:2006/03/16(木) 18:01:35
StructureToPtr() とごっちゃになってた。

StringToHGlobalAnsi/Auto/Uni、あるいは、StringToCoTaskMemXXX か。
GCHandle.AddrOfPinnedObject() って手もあるけど、こっちは面倒だな。
201デフォルトの名無しさん:2006/03/16(木) 18:04:42
>>200
> StringToHGlobalAnsi/Auto/Uni、あるいは、StringToCoTaskMemXXX か。
既存のポインタに書き込むにはどうにもならない。
コピーするにも変換後のバイト数が判らない。
202デフォルトの名無しさん:2006/03/16(木) 18:11:42
>>201
あ、そういうことなの?

じゃ、俺は RtlMoveMemory() でいいや。Marshal.Copy と変わらんけどw
203デフォルトの名無しさん:2006/03/16(木) 19:29:55
コントロールの OnHoehoge をオーバーライドすんな、Hogehoge に登録しろと言う人がいるんだが、
MDSN に(例えば OnLoad には)
> OnLoad メソッドを使用すると、デリゲートを結び付けずに、
> 派生クラスでイベントを処理することもできます。
> 派生クラスでイベントを処理する場合は、この手法をお勧めします。
と書かれてるんだ。
どうすれば良いと思う?
204デフォルトの名無しさん:2006/03/16(木) 19:33:05
baseよびだしゃいいんじゃね?
205デフォルトの名無しさん:2006/03/16(木) 19:44:48
>>203
仕様の通りに実装すれば良いとおもう。
派生元の処理も行うタイなら base 呼び出せばよいし、
(オーバーライドしないときと同様に)イベントハンドラを呼び出したいなら呼び出せばいいし、
イベントハンドラを呼び出したくないなら呼び出さなければ良いし。
206デフォルトの名無しさん:2006/03/17(金) 00:35:03
>コントロールの OnHoehoge をオーバーライドすんな、Hogehoge に登録しろと言う人がいるんだが、
だれだよ
207デフォルトの名無しさん:2006/03/17(金) 01:25:03
どーでもいいが、ライブラリでイベントハンドラの名前が
Onを抜いただけになってるのってきもくない?
ClosedとかNavigatedとか。普通のメソッドと混同しそう。
自分でイベント定義するときはHogeEventとかにしてるのだが。
208デフォルトの名無しさん:2006/03/17(金) 01:28:45
英語能力がないのは分かった
209デフォルトの名無しさん:2006/03/17(金) 01:33:59
むしろメソッドにOnがついてる方が気持ち悪い
210デフォルトの名無しさん:2006/03/17(金) 01:45:55
英語能力がないのは分かったってば
211デフォルトの名無しさん:2006/03/17(金) 02:01:28
例が悪かったな。edがついてるのはまだいい。
LoadとかInitとかがイベントなのがきもい。
212デフォルトの名無しさん:2006/03/17(金) 02:12:47
>>210
Onついてるメソッドって動詞じゃないじゃん。
副詞句みたいなもの
213デフォルトの名無しさん:2006/03/17(金) 02:15:37
>>211
そんな「日本なのに左ハンドルの車とかきもい」的なことを言われても困る。
214デフォルトの名無しさん:2006/03/17(金) 03:04:32
コントロールなんかのイベントはまだある程度統一されているだけまし。
LoadやらInitやらは過去からの流れもあるしな。

むしろ他のイベントに気持ち悪い名前が多い。
215デフォルトの名無しさん:2006/03/17(金) 09:34:33
>>192
どうやらその手で大丈夫そうです。かなり悩んでたんですがエレガントに
解決しました。お礼に歌いたい気分です。
216デフォルトの名無しさん:2006/03/17(金) 12:28:45
>>215
「ダイナマイトが150トン」きぼん
217デフォルトの名無しさん:2006/03/17(金) 12:39:19
クリップボードを使用してファイルのコピーや移動を行いたいのですが、
ファイルが切り取りされているかコピーされているかはどう判断すればよいのでしょうか。
ドラッグ&ドロップならDragDropEffectsで判断できるのですが。
218デフォルトの名無しさん:2006/03/17(金) 12:56:22
>>217
Clipboard.GetDataObject().GetData("Preferred DropEffect")
をMemoryStreamにしてBinaryReaderなりBitConverterなりでInt32に変換。
DragDropEffectsにキャスト。
219217:2006/03/17(金) 13:18:03
>>218
さっそくのレスどうもありがとうございます。
うまくいきました。
220デフォルトの名無しさん:2006/03/17(金) 16:12:07
質問です。マウスジェスチャーのようなものを実現しようと思い、
SetWindowsHookExにフックして、とりあえず実現はできたのですが、
ジェスチャー終了後に、コンテキストメニューが表示されてしまいます。
コンテキストメニューを抑止することはできないのでしょうか?
221デフォルトの名無しさん:2006/03/17(金) 16:59:12
ローカル専用ならSetWindowsHookEx 使うんじゃなくて IMessageFilter 使った方が良いんじゃね?
WM_RBUTTONUP のときに true 返せばメニューを表示しない。
222デフォルトの名無しさん:2006/03/17(金) 18:21:48
>>221
thx、出来たよ。
223デフォルトの名無しさん:2006/03/18(土) 04:51:16
なぜだ〜IExtenderProviderが効かねー
224http://www.vector.co.jp/soft/win95/util/se072729.html:2006/03/18(土) 19:38:58
TextSS のWindowsXP(Professional)64bit化おながいします

もしくは64bitにネイティブ対応したテキスト置換ソフトありますか?
225デフォルトの名無しさん:2006/03/18(土) 19:48:39
>>224
死ね
226デフォルトの名無しさん:2006/03/19(日) 17:06:43
C#なのかC♯なのかどっちなの?
227デフォルトの名無しさん:2006/03/19(日) 17:11:41
どっちでもない。C# だ。
228デフォルトの名無しさん:2006/03/19(日) 17:16:41
>>129,131
IsNullOrEmptyって一見便利そうだけど、
たいていの場合、「空白のみの文字列」も除きたいから、
あまり使う場面はなさそうだね。
229デフォルトの名無しさん:2006/03/19(日) 17:22:43
それは場面というか開発対象によるんじゃね?
私は空白のみからなる文字列を除きたいと思ったことは今のところ無いしなー。
NullOrEmpty以上となると空白のみ文字列以外にも除く文字/文字列が出てくることばっかりだ。
230デフォルトの名無しさん:2006/03/19(日) 18:57:18
他人の作ったメソッドで文字列返すやつはIsNullOrEmptyでチェックする。
さらにtryで囲む。さすがに" "とか返してくるやつはみたことない。
231デフォルトの名無しさん:2006/03/19(日) 19:13:20
OnなんちゃらのOnって、turn onみたいな意味かと思ってたけど違うの?
イベント発動メソッド。
232デフォルトの名無しさん:2006/03/19(日) 19:48:18
C#2005のwebBrowserでアプリ作ってるのですが
ページが切り替わるときに出る音を消したいのですが良い方法ありませんか?
233デフォルトの名無しさん:2006/03/19(日) 20:29:24
>>230
さらにTryで囲むって・・・ 作ったメソッドの仕様をしっかり把握するべきでは
関係ないけどC#覚えたての人って無駄にTryCatchする人多くない?制御文の代わりに使ってみたり
この前、Gotoの代わりに使ってるのみて凹んだ
234デフォルトの名無しさん:2006/03/19(日) 20:29:40
コントロールパネル
サウンドとオーディオデバイス
サウンド
エクスプローラ
ナビゲーション開始
235デフォルトの名無しさん:2006/03/19(日) 20:39:54
VisualStudio2005のIDEに用いられているGUIコンポーネントは
提供されていないのでしょうか?ドッキングやフローティングの機能が
使いやすくて。
236デフォルトの名無しさん:2006/03/19(日) 20:43:01
>>235
よくしらないけどStrip系のやつじゃないの?
237デフォルトの名無しさん:2006/03/19(日) 20:51:49
Stripとは別物だよ
238デフォルトの名無しさん:2006/03/19(日) 20:52:33
あー、ドッキング位置が中くらいの大きさのアイコンで出てくるヤツか
239デフォルトの名無しさん:2006/03/19(日) 20:56:13
>>235
そういう要望が結構あるが複雑すぎるので提供しないそーです。
240デフォルトの名無しさん:2006/03/19(日) 20:59:22
そうですか、残念ですね。レスありがとうございました。
241デフォルトの名無しさん:2006/03/19(日) 21:02:46
タイプライブラリから自動生成された構造体
public struct STRUCT {
public ushort[] wszTitle;
}
のwszTitleにSystem.Stringをコピーするにはどうしますか?
cからみるとwszTitleは
WCHAR wszTitle[256];
です。
242デフォルトの名無しさん:2006/03/19(日) 21:07:44
>>239,235
あれは便利なんでいつか整理してコンポーネントにしてほしいよなぁ〜
243デフォルトの名無しさん:2006/03/19(日) 21:08:09
Encoding.GetBytesでバイトに変換してBitConverterでushortにするとか
244デフォルトの名無しさん:2006/03/19(日) 21:51:43
String.ToCharArray と Buffer.BlockCopy だな。
245デフォルトの名無しさん:2006/03/19(日) 22:07:45
>>234
なるほど、ありがとうございます。
246デフォルトの名無しさん:2006/03/19(日) 22:32:40
>>240
http://dobon.net/vb/dotnet/links/dockingwindow.html
類似品ならあるみたいだよ。
247デフォルトの名無しさん:2006/03/19(日) 23:01:37
ListView.Add するとアイテムが末尾に挿入されるのですが、
先頭に入れたい場合はどうすればいいのでしょうか?
248デフォルトの名無しさん:2006/03/19(日) 23:05:05
ListView に Add なんてねーよ。

ListViewItemCollection には Insert というメソッドがある。
249デフォルトの名無しさん:2006/03/19(日) 23:12:47
なるほど、先頭に Insert することにします。
ありがとうございました。
250デフォルトの名無しさん:2006/03/20(月) 01:36:41
>>233
いや、寧ろ逆に感じる。
C#は例外に対して緩いから、それを使うプログラマも例外に対して無頓着。
投げないのは勿論、捕捉もしないから、例外が出ると即落ちる。
当然、テストには[ExpectedException(...)]は出てこない。

Javaだと例外をどう扱うか定義しないとコンパイルすら通らないから、否応
なく最低限の対応(catch(Exception)やthrow Exceptionを含むw)が見られ
るけど、C#ではそれすらない者が驚くほど多い。
251デフォルトの名無しさん:2006/03/20(月) 02:42:54
>>250
やたらTryCatchするのはDelphi出身者。
252デフォルトの名無しさん:2006/03/20(月) 03:01:37
>>251
確かに、言われてみればDelphi出身者には>>233の傾向が見られるな。
Abort投げてファイナリーへジャンプとか、そりゃ形を変えたgotoだみたいなw
253デフォルトの名無しさん:2006/03/20(月) 04:45:25
ボタンクリックとかで他部署の作ったメソッド呼ぶときは全部catchじゃ
254デフォルトの名無しさん:2006/03/20(月) 05:08:20
メソッドの<exception>タグにないExceptionをキャッチしてるコードを書いてる奴はとりあえず、問い詰める
<exception>タグにないExceptionがテスト時にきたら、そこの担当者を問い詰める
try{hoge();}catch{}なんて書いたらバグ発見できなくない?

最上位ではCatchするようにしているけど
ところで>>250はDelphi出身者ですか?
ちなみに私はJava出身者
255デフォルトの名無しさん:2006/03/20(月) 08:25:29
キャッチされてない例外を他人に見せるのが恥ずかしいんじゃね?

そ、その例外くらい知ってるんだからね!って。
256デフォルトの名無しさん:2006/03/20(月) 08:35:39
キャッチしてもどうにもならない例外までキャッチしてしまうのは良くない。
キャッチしてなんらかの対処をしてプログラムの実行を継続できるのなら
キャッチすべし。
だからJavaのような例外の扱いは、ある意味無責任
257デフォルトの名無しさん:2006/03/20(月) 09:58:40
Java の方針だと、後から throws の所に例外追加したら、
利用側コードの修正も強要されるのが嫌で throws は採用しなかったのよね?
258デフォルトの名無しさん:2006/03/20(月) 10:00:29
複数種類の例外を投げうるメソッドだと throws Exception とか書かれて
実質的な意味をなさないことが多かったからとも聞いたぞ
259デフォルトの名無しさん:2006/03/20(月) 12:24:22
例外ダイアログが出ると、これはバグだから直せと言われるから全部catch。
260デフォルトの名無しさん:2006/03/20(月) 12:42:34
throws 書いても
catch {}
ってされるだけだからそうしなかったって
あんだーすがゆってた
261デフォルトの名無しさん:2006/03/20(月) 13:05:05
>>254
最上位でキャッチして何するの?エラーが出ましたって表示しておしまい?
だったらvoid mainにthrows Exceptionて書いとけ、同じ事だ。

>>256
リカバーできなくても原因を詳細化できるならcatch-throwsというイディオムを使う
べき例えば、catch(NullPointerException) throws new InvalidArgumentの様に?
ただ、本当にどうにもならない例外というのも確かにあるにはある。
この辺はJ2EEパターンで出てくるRuntimeExceptionを標準として利用する方法や
アダプタパターンを利用してExceptionをcatchしてthrows RuntimeExceptionする
方法なんかがある(全部Javaの言語仕様内で実現可能)。

>>257
例外はパブリックなメソッドと同じくインターフェイス(≠interface)なんだよ。
だからそれを変更するには当然コストが掛かる。
これで何度か痛い目をみると設計レスで指先コーディングする悪い癖が抜けるw
262デフォルトの名無しさん:2006/03/20(月) 13:29:22
つ On Error
263デフォルトの名無しさん:2006/03/20(月) 14:12:22
WebBrowserのクリックを検出したかったのでWebBrowser.WndProcをオーバーライドしてみたのですが、
MouseUpの時のメッセージがよく分かりません。。。
ちなみにMouseDownはMessage構造体のWParamから取得しました。

ご存知の方いらっしゃいましたら宜しくお願いします。
264デフォルトの名無しさん:2006/03/20(月) 14:18:39
素直に HtmlDocument のマウスイベントを処理するんじゃ駄目か。
まあこんなのもあるようだが。
ttp://homepage1.nifty.com/yasunari/VB/VB2005/WebBrowserMouseDownEvent.htm
265256:2006/03/20(月) 15:24:07
>>261

 > リカバーできなくても原因を詳細化できるならcatch-throwsというイディオムを使う

それは開発者にとって都合がいいからでそ?
漏れが言いたいのは、ユーザーが何ら対処できないような例外が発生しうる処理のところで
キャッチするべきではないということ。
代わりにMain()の中で、最終的にキャッチされなかった例外を処理するイベントハンドラを設定すればいい。
266デフォルトの名無しさん:2006/03/20(月) 17:05:00
まあ要はお前ら適切に例外を処理しろと
267デフォルトの名無しさん:2006/03/20(月) 17:32:48
はっきり言って基盤にちかいライブラリ部分以外では
あんまりキャッチする事はない。
例外が出る事が分かっててその場で処理するならキャッチするが、
それもそんなに多くはない。
268デフォルトの名無しさん:2006/03/20(月) 18:29:36
配列をつかわずにメンバとインデクスを対応させるよい方法は
ないでしょうか?s[0]でs.num0を返すといった具合にしたいのですが。
269デフォルトの名無しさん:2006/03/20(月) 18:34:43
インデクサ
270デフォルトの名無しさん:2006/03/20(月) 18:42:18
説明が下手で申し訳ございません。。
内部に配列を持たずインデクサの実装をしようとするとifかswitch
を用いて泥臭く書き連ねていかねばなりませんから、
よりスマートな方法があればご教授頂きたいということです。
271デフォルトの名無しさん:2006/03/20(月) 18:44:49
リフレクションとか?
それがスマートとは思わないけど。
272デフォルトの名無しさん:2006/03/20(月) 18:50:53
Mapしかおもいつきませんわい
273デフォルトの名無しさん:2006/03/20(月) 19:05:04
リフレクションを使うのはスマートと思われないのですか…。
Mapというのは知らないのですがコレクションのことでしょうか?
やはり条件分岐させていくしかないのかな。
構造体にインデクサくっつけようと思っただけなのですが。
274デフォルトの名無しさん:2006/03/20(月) 19:42:13
どれくらいのメンバ数なわけ?
なんで構造体なの?
275デフォルトの名無しさん:2006/03/20(月) 19:58:50
5つくらいです。面倒ではないけど、よい方法があればと思った次第です。
DateTimeのような用途を想定しており、hashのkeyに用いたり
比較を行わせるときに、構造体だと都合がよいので使っています。
クラスでも演算子やGetHashCodeをoverrideすれば同じようですが。
276デフォルトの名無しさん:2006/03/20(月) 20:19:10
メンバの方をプロパティにするのはまずいんですか?

struct SDate {
 int data[3];
 public int Year {
  get { return data[0]; }
  put { data[0] = value; }
 }
...
}
みたいな感じで。
277デフォルトの名無しさん:2006/03/20(月) 20:20:16
面罵をプロパティにしないで何をぷとぱてぃにするのかと。
278デフォルトの名無しさん:2006/03/20(月) 20:26:01
そうすると、配列のアドレスに依存してしまうために
値によって一意ではなくなります。
279デフォルトの名無しさん:2006/03/20(月) 23:30:21
>>278
kwsk
280デフォルトの名無しさん:2006/03/21(火) 02:09:01
初心者です。

ファイルをFileStreamを使用して開こうとしたところ
他プロセスが使用しているため例外が発生しました。

問題解決の判別のため、まず、
当該ファイルをどのプロセスが使用しているのか知りたいときは
みなさんどうしていますか。プロセス名とかがわかればいいのですが……。
281デフォルトの名無しさん:2006/03/21(火) 02:20:17
無理無理。
282デフォルトの名無しさん:2006/03/21(火) 05:52:45
>>280
FileStream.Close()できちんとファイルをクローズしても
…しばらく待たないと例外がでることがあるよw
283デフォルトの名無しさん:2006/03/21(火) 13:19:42
284デフォルトの名無しさん:2006/03/21(火) 13:54:41
IOException をcatchとかいう話ではなくて?
285デフォルトの名無しさん:2006/03/21(火) 14:38:38
>>283 handleにかんけいしてるオブジェクト【NTオブジェクト】をしらべるAPIってあったっけ?
286デフォルトの名無しさん:2006/03/21(火) 17:24:12
ペゾルド→プログラミングC#4thとやって
引っかかるところはvisual C#.net逆引き大全 500の極意でやってるんだが、
もっと洗練されたプログラミングをつくりたいという目的に適した本は何かない?
287デフォルトの名無しさん:2006/03/21(火) 18:40:13
GetType()や(Object is A)などで型情報を得ることは
Type型変数を読み込むより時間がかかりますか?
もしそうなら何故Object型はType型のメンバを持たないの?
288デフォルトの名無しさん:2006/03/21(火) 18:55:35
必要になることがあまり無いのでメモリの無駄食いになるから
289デフォルトの名無しさん:2006/03/21(火) 19:51:44
Objectが持つって事は、intやなんかの値型も持つってことだぜ?
※ま、Box化したときだけ持つなんて方法もあるっちゃあるかも知れんけど。
290デフォルトの名無しさん:2006/03/21(火) 21:53:35
各インスタンスが型固有の情報(static)をフィールドとして持っているのはどうかと
IntのインスタンスがMaxValueとかフィールドとして持ってるようなもの?
291287:2006/03/21(火) 22:06:06
う〜ん、愚問でした
>>288-290ありがと
292デフォルトの名無しさん:2006/03/22(水) 14:35:32
multipart/form-data でデータを受け付けるWEBフォームへのPOSTがうまくいきません。
application/x-www-form-urlencoded と要領は一緒なのかと思ったのですが、
何かやるべき処理に違いがあるのでしょうか?

System.Text.Encoding enc = System.Text.Encoding.GetEncoding( "EUC-JP");

System.String PostUrl = "http://www.microsoft.com/post.cgi";
System.String param = "";

System.Collections.Hashtable PostTable = new System.Collections.Hashtable();

PostTable [ "hoge1" ] = System.Web.HttpUtility.UrlEncode( "hoge1", enc );
PostTable [ "hoge2" ] = System.Web.HttpUtility.UrlEncode( "hoge2", enc );

foreach( string key in PostTable.Keys ) {
param += String.Format( "{0}={1}&", key, PostTable [ key ] );
}
byte [] data = System.Text.Encoding.ASCII.GetBytes( param );

// リクエスト
System.Net.HttpWebRequest Request = (System.Net.HttpWebRequest)System.Net.WebRequest.Create( PostUrl );
Request.Method = "POST";
Request.ContentType = "multipart/form-data";
Request.ContentLength = data.Length;
Request.Timeout = 30000;
// ポストデータ
System.IO.Stream RequestStream = Request.GetRequestStream();
RequestStream.Write( data, 0, data.Length );
RequestStream.Close();
// レスポンス
System.Net.WebResponse Responce = Request.GetResponse();
System.IO.Stream ResponceStream = Responce.GetResponseStream();
293デフォルトの名無しさん:2006/03/22(水) 14:38:12
Base64
294デフォルトの名無しさん:2006/03/22(水) 15:09:30
>>292
>application/x-www-form-urlencoded と要領は一緒なのかと思ったのですが、

むしろ一緒の部分は殆ど無い。
ちゃんとmultipart/form-dataの形式でデータをPOSTするべし。
295デフォルトの名無しさん:2006/03/22(水) 18:44:16
コントロール自体のイメージ化?というのか、なんなのか。

マウスがあるボタンの上にあったら
別のピクチャーボックスにそのボタンの画を表示するという機能を実現したいのですけれども…

どなたかヒントを。
296デフォルトの名無しさん:2006/03/22(水) 20:02:45
つ ttp://dobon.net/vb/dotnet/graphics/drawcontrols.html
XPスタイルのボタンは描画できんのかな・・・
297デフォルトの名無しさん:2006/03/22(水) 20:09:30
ttp://dobon.net/vb/dotnet/vb6/printform.html
こっちを応用してハードコピーを取る手もあるが
298デフォルトの名無しさん:2006/03/22(水) 20:23:24
>>295
デバイスコンテキスト経由でDDBを転送すればいいんじゃねーの?
.NET的なやり方はシラネ
299デフォルトの名無しさん:2006/03/23(木) 00:05:45
ToolStripItemってCloneできないんですかね?
MenuItemはイベントハンドラまで含めてCloneできるので便利だったんですが
300デフォルトの名無しさん:2006/03/23(木) 00:50:41
派生クラス作るなりして MemberwiseClone やってやればできなくもないが、なんか問題もあるやも知れぬ
301デフォルトの名無しさん:2006/03/23(木) 11:54:29
>>295
DrawToBitmap() は?
302デフォルトの名無しさん:2006/03/24(金) 03:15:16
String.IsNullOrEmpty に対抗して、Array.IsNullOrEmpty があれば良かったとふと思った。
303デフォルトの名無しさん:2006/03/24(金) 10:50:53
.NET1.1のWindows.Formsで
DataTableに関連づけたDataGridを
使っているのですが

DataGridTableStyleを使うと、5〜10秒ほど
一時的にアプリケーションが無反応になります。
起動後、数回目の操作でこれが起き、
一度起こると起動終了まで起きないようです。

何かヒントになるものはないでしょうか?
よろしくお願いします。
304デフォルトの名無しさん:2006/03/24(金) 16:28:17
プログラミングC#買いました(^_^)
305デフォルトの名無しさん:2006/03/24(金) 16:36:35
┏━━━━━━━━━━━━━━━━━━━━━━┓
┃* 「さんこうしょは りかいしないといみがないよ!   ┃
┃                               ▼┃
┗━━━━━━━━━━━━━━━━━━━━━━┛
306デフォルトの名無しさん:2006/03/24(金) 17:28:28
参考書を理解するための参考書を教えてください
307デフォルトの名無しさん:2006/03/24(金) 18:05:59
>>306
つ【ヘルプ】
308デフォルトの名無しさん:2006/03/24(金) 18:19:16
ヘルプを(ry
309デフォルトの名無しさん:2006/03/24(金) 19:36:51
下手な参考書を買うくらいだったら、MSDNオンラインを読んだほうがいいよ
310デフォルトの名無しさん:2006/03/24(金) 19:42:01
でもいい参考書は買ってもいいと思うよ。
・C#によるぷろぐらみんぐWindows
・デザパタ
・パターン嗜好リファクタリング
・ModernC++Designe
この辺は結構よかった。ほかにもあるけど。
311デフォルトの名無しさん:2006/03/24(金) 21:24:37
>>303
IDEのデバッグモードでだけ発生したりしないか?
312デフォルトの名無しさん:2006/03/24(金) 21:41:03
>>311
おおなんと!

Debugに限らずReleaseもですが、
確かにIDE上で実行したときだけ発生し、
BuildしたEXEを単体で実行したときは
発生しません。
なんでなんでしょね?
313デフォルトの名無しさん:2006/03/24(金) 21:46:24
Ctrl+F5でデバッグなしで実行しても大丈夫でしょ??

まあ、デバッガも頑張ってるんだ。
314デフォルトの名無しさん:2006/03/24(金) 21:47:16
>>312
たぶんいろんなアセンブリがそこでロードされて、IDE がシンボル探し回るから。
デバグウィンドウの「出力(だっけ?)」とか見てれば様子わかると思う。
315デフォルトの名無しさん:2006/03/25(土) 01:03:37
サイズが0とか1とかのウインドウって作れない?
0,0に指定してもうまくいかないから、何かが悪さしてるのかと思って
最大化ボタン無しにしたりとか、あれこれ試したけど、小さな
ウインドウが表示されちゃうんだけど。
316デフォルトの名無しさん:2006/03/25(土) 01:07:05
>>315
Windowsの仕様で作れなかった気がす
つか、非表示にすればいいんちゃいますか
317デフォルトの名無しさん:2006/03/25(土) 03:14:31
>>315
そこまで来たらあと一歩だ。最近は透明化機能なんて普通に付いてるから
Opacityプロパティを0にすればまったく映らなくなるし、0のときはクリックも
できなくなる。表示していないのとおんなじだ!
まあ、これでいいならフォームのサイズ自体はなんでもいいんだけどな。
318デフォルトの名無しさん:2006/03/25(土) 13:54:43
背景がまったく透過でイベントなども透過するようなフォームをつくるにはどのようにすればよいでしょうか?
デスクトップに文字列を書き込むような効果に利用したいんですけど。
(Win32使ってデスクトップに書き込むのはあんまりやりたくない)
319デフォルトの名無しさん:2006/03/25(土) 13:58:13
RegionとかTransparencyKeyとか。
320デフォルトの名無しさん:2006/03/25(土) 21:01:25
TransparencyKeyでいけそうです。ありがとうございました。
321デフォルトの名無しさん:2006/03/25(土) 21:51:18
>>318
似たようなソフト作ったことあるけど、
そのままだと、文字部分(色ついた部分)がイベント透過しないよ
速度も遅かったり色々あったんで、
結局ULWとWS_EX_TRANSPARENT|WS_EX_LAYERED使って自前で処理した
322デフォルトの名無しさん:2006/03/26(日) 00:45:49
確かに書き込んだ部分についてはイベントが透過しませんでした。
レイヤード ウィンドウを検索するなどして調べましたが
Form上でイベントをまったくスルーしてしまう方法がよくわかりません
どのようにWndProcをオーバライドすればスルーできるのでしょうか?
323デフォルトの名無しさん:2006/03/26(日) 01:18:38
APIがいやだったらManaged DirectX使えば?
324デフォルトの名無しさん:2006/03/26(日) 04:01:42
>>322
WndProcをオーバーライドって時点で何か方向が間違ってる気がするんだが・・・
来たイベントを自分の下のウインドウに自前で渡そうとか考えてる?
WS_EX_TRANSPARENT|WS_EX_LAYEREDの事だったら、CreateParamsでヘルプ見れ
325デフォルトの名無しさん:2006/03/26(日) 10:18:15
APIのmciSendCommandで質問なんすけど、Cだとの最後の引数は構造体をDWORDに
キャストしてアドレスを渡すんですがC#だとどうすればいい?
mciSendStringはサンプルで一杯あったんだけどmciSendCommandがほとんどなかった。
326デフォルトの名無しさん:2006/03/26(日) 10:34:32
>>325
ヘルプを見ずに答えると、最後の引数を 「ref 構造体」 で定義しておけばよさげ。
型が変わるケースがあるならオーバーロードで。

複数の定義をするのが面倒なら、StructureToPtr で IntPtr にして、それを int にして
渡せばいいんでね?
327デフォルトの名無しさん:2006/03/26(日) 10:37:49
ref で参照渡すか、Marshal.AllocCoTaskMem で確保したメモリに Marshal.StructureToPtr で書き込んでそれを渡す
// だれだこの関数作った奴 なんでポインタを渡すのに DWORD なんだよ LPVOID とかにしとけよ
328325:2006/03/26(日) 10:58:35
>>326
>>327
ありがとん。
「ref 構造体」は見かけたけどあとの2つは知らんかった。
やってみます。
329デフォルトの名無しさん:2006/03/26(日) 12:49:04
すみません。ちょっと質問なんですが

よくレスを見てると、一つのクラスにプログラムをダラダラ書くと
分かりづらいとか、関数ごとにできるだけクラスを作成したほうがいいとか
聞きますがどういう場合にクラスにすればいいかいまいちわかりません

例えば、FORM上のコントロールに対しての命令もわざわざクラスを作って作成したほうがいいんでしょうか?
例えば、listviewの選択されたアイテムを削除するなど・・
もしくは、FORM内のコントロールはそのFORMクラスで作成して
別ウィンドウのFORMなどは別のクラスで書くみたいに、FORMごとにプログラムを書くのがいいんでしょうか?
よろしくお願いします


 197KB 549.61秒
dummy_for_searchRef
330デフォルトの名無しさん:2006/03/26(日) 13:04:03
> 関数ごとにできるだけクラスを作成したほうがいい

初めて聞いた
331デフォルトの名無しさん:2006/03/26(日) 13:13:56
>>329
つ partial class

中華、「データと手続きを一体化して扱う」のが、オブジェクト指向なのでは・・・。
332デフォルトの名無しさん:2006/03/26(日) 13:19:46
>>329
> 例えば、FORM上のコントロールに対しての命令もわざわざクラスを作って作成したほうがいいんでしょうか?
> 例えば、listviewの選択されたアイテムを削除するなど・・

それを別のフォームでも利用するのなら、その部分を抜き出して別クラスにしておくようにする

> もしくは、FORM内のコントロールはそのFORMクラスで作成して
> 別ウィンドウのFORMなどは別のクラスで書くみたいに、FORMごとにプログラムを書くのがいいんでしょうか?

一般的にはこっち。
333329:2006/03/26(日) 13:44:09
>>330
自作関数ごとにクラスを作成することを推奨する旨をソフト付属の入門書に書いてたので・・
まだちゃんと理解してないです

>>331
partial classは便利な機能ですね。まだ、これを使うほど複雑なプログラムではないですが

>>332
なるほど、まだ始めたばかりなんですけど、最初の内に一般的な記述をする癖をつけて置きたいので
みなさんがどういう風に作られてるか聞けてよかったです
ありがとうございました
334デフォルトの名無しさん:2006/03/26(日) 14:09:46
>>329 作りこんでるうちに、これは別クラスにしようとか感覚つかめるよ。
でまた本読んだりして参考にすると。
335デフォルトの名無しさん:2006/03/26(日) 14:46:45
>>333

>自作関数ごとにクラスを作成することを推奨する旨をソフト付属の入門書に書いてたので・・

参考までになんの本なのか詳しく
336デフォルトの名無しさん:2006/03/26(日) 15:20:21

 > それを別のフォームでも利用するのなら、その部分を抜き出して別クラスにしておくようにする

別クラスにしないで、デリゲート経由で呼び出すべき。クラス間の参照関係はゆるい方がいい。

 > 作りこんでるうちに、これは別クラスにしようとか感覚つかめるよ。

作り始める前にちゃんとクラス設計するべき。
337デフォルトの名無しさん:2006/03/26(日) 15:23:28
Hello world の人にクラス設計とか持ち出すのは無意味だろ
338デフォルトの名無しさん:2006/03/26(日) 16:01:14
クラス設計とかの関係が書いてある本ってある?
中身がCとかじゃなくC#だとなんとなく助かるんだが。
339デフォルトの名無しさん:2006/03/26(日) 16:05:29
>>336 いやいろんなプログラム作ってるうちに暮らすどんな風に分けたらいいか感覚がつかめるということ。
340デフォルトの名無しさん:2006/03/26(日) 16:09:42

  _   ∩
( ゚∀゚)彡 Static! Static!
 ⊂彡

341デフォルトの名無しさん:2006/03/26(日) 16:14:26
>>338
C++/Java関連のOOP本は選り取りみどりな上に書評も揃ってる。
C#に拘った本選びをすると、某C#のデザパタ本みたいな本をうっかり
掴んでしまいかねない。
342デフォルトの名無しさん:2006/03/26(日) 16:15:58
まあ、Cは無いから安心汁
343329:2006/03/26(日) 16:20:28
>>335
VC#2001のstanderdに付属の「今からはじめるC#」です
と、思ったのですが、今見てみると見つかりません。どこで見たんだろ・・
現在2005の無料版を使ってます

クラス設計とかデリゲートとかまだちんぷんかんぷんですが、コツコツやっていきたいと思います
小物アプリをいろいろ作ってると、コントロールに対して同じ関数を作ってたりするんです
listviewだと選択反転や選択削除などなど、よく使う関数をアプリを作るごとに以前作ったアプリのソースをコピペしたりしてて
他の人はこれらの関数を別クラスにしたり、もしくはlistviewを継承して、よく使う関数を盛り込んで独自のコントロールを作ったり
してるのかなぁ?と、まだ自作コントロールの作り方はわからないですけど・・・
やっぱりここらへんは慣れなんでしょうね
344デフォルトの名無しさん:2006/03/26(日) 16:23:39
> 某C#のデザパタ本みたいな本をうっかり
> 掴んでしまいかねない。
これあの本だと思うが、だめなの?
345デフォルトの名無しさん:2006/03/26(日) 16:46:49
>>344
ぜひ一度手に取ってみてもらいたい。
そして、金を払う前に気付く事を祈ってる。
346デフォルトの名無しさん:2006/03/26(日) 16:58:24
非表示のフォームのインスタンスを数個、5秒おきに生成したいのですが、

MainForm内
FormMaker fm = new FormMaker();
fm.Visible = false;

FormMakerのtimer1_Tick内
if(count == 0)
{
Form1 f1 = new Form1();
f1.Visible = false;
}
if(count == 1)
{
Form2 f2 = new Form2();
f2.Visible = false;
}

以上のようなプログラムを書いたところ、
FormMakerはVisible = falseでもインスタンスが生成され動作するのですが、
Form1とForm2は動作しません。
なぜ、同じようにVisible = falseにしているのに動作しないのでしょうか。
347デフォルトの名無しさん:2006/03/26(日) 17:02:03
Form f1 = new Form();
f1.Visible = false;
}
if(count == 1)
{
Form f2 = new Form();
f2.Visible = false;
}
348デフォルトの名無しさん:2006/03/26(日) 18:46:32
何をしたいのかさっぱり分からんが。
作った直後に破棄しちゃってるし。
349デフォルトの名無しさん:2006/03/26(日) 18:49:44
作った直後に破棄してるのですが、FormMakerだけは動いているんです。
Form1やForm2も同様の状態にしたいのですが。

350デフォルトの名無しさん:2006/03/26(日) 19:00:06
FormMakerってのがようわからんが、Form1とForm2はtick抜けたら破棄されるじゃまいか
351デフォルトの名無しさん:2006/03/26(日) 19:16:00
>>349
> FormMakerだけは動いているんです。
Form1 のフィールドにおいてたり他に参照が残ってたりするんだろ。
それ以外の理由もあるかもしれんがこれだけじゃ判断できん。
352デフォルトの名無しさん:2006/03/26(日) 19:34:08
>348,350,351
ありがとうございます。
もう少し詳しく説明します。

もともと機能ごとに分けて別々のフォームで実装したプログラムを統合したいと考え、
インタフェースだけMainFormに集約し、MainFormから全てのフォームの機能を操作出来るようにしました。
しかし、MainFormから全てのForm(5つあります)のインスタンスの同時に生成してみたらとても不安定だったので、
5秒おきに起動することにし、FormMakerというタイマー付のフォームを作成しました。
FormMakerで作成したForm1〜Form5のフォームは、生成後にMainFormに関連付けています。
しかしここで問題になったのが、MainFormを操作してForm1等のメソッドが呼ばれた際にactivateが移ってしまうということです。
なのでいっそのこと非表示にしたりタスクトレイに入れたりしてなくしてしまおうと思ったのですが、なかなかうまくいきません。
353デフォルトの名無しさん:2006/03/26(日) 19:44:37
なんつーか果てしなく泥縄だな。

> しかし、MainFormから全てのForm(5つあります)のインスタンスの同時に生成してみたらとても不安定だったので、
インスタンス作るだけで不安定になる環境ってどんなんだよ。単に遅いってだけだろ。

> 5秒おきに起動することにし、FormMakerというタイマー付のフォームを作成しました。
それはフォームである必要があるのか?

> FormMakerで作成したForm1〜Form5のフォームは、生成後にMainFormに関連付けています。
さっきのコードを見る限り、生成後速やかに破棄されているが。

> しかしここで問題になったのが、MainFormを操作してForm1等のメソッドが呼ばれた際にactivateが移ってしまうということです。
メソッド呼んだだけでアクティブにはならん。アクティブになるようなことをしたんだろ。

結局、MainForm は Form1 他のメソッドを使いたいだけ?
GUI 部品を使わないくて完結するようなのならそんなメソッドは別クラスにまとめるべきだが。
354デフォルトの名無しさん:2006/03/26(日) 20:12:54
めんどくさいからFormMaker内のフィールドとしてf1〜f5もっとけ
355デフォルトの名無しさん:2006/03/26(日) 20:13:35
Stringはクラスなのにインスタンス化しなくても使えるのはなじぇ?
356デフォルトの名無しさん:2006/03/26(日) 20:16:42
>>355
いや、してるし
357デフォルトの名無しさん:2006/03/26(日) 20:17:06
明示的には書いてないだけで実際にはインスタンスが作られてる
358デフォルトの名無しさん:2006/03/26(日) 22:42:25
>>355
基礎からやり直せ

アルゴリズム入門 : 第 1 章 Visual C# による文字列処理入門
http://www.microsoft.com/japan/msdn/academic/Articles/Algorithm/01/
359デフォルトの名無しさん:2006/03/27(月) 07:10:03
継承クラスから親クラスが持つeventをいじることはできないんですか?
+=,-=しか使えないとエラーメッセージがでますが、継承クラスから
nullチェックやハンドラ呼び出しできないのは不便なように思うのですが。
360デフォルトの名無しさん:2006/03/27(月) 10:06:32
TextBox を派生させたクラスを考える。
その派生クラスが勝手に TextChanged を呼び出した。Text は変わっていない。
さて、更にその派生クラスを作って、TextChanged にハンドラを引っかける。当然 Text が変わっていることを期待するが……。
TextChanged くらいならまだしも、HandleCreated とかはなお厄介だ。
361デフォルトの名無しさん:2006/03/27(月) 10:12:29
On〜メソッドを呼べば?
362デフォルトの名無しさん:2006/03/27(月) 10:28:22
>>360 それは使い方の問題であって言語的に制約かけるべき門じゃないだろ。
何のための軽症だよ。
363デフォルトの名無しさん:2006/03/27(月) 11:16:27
C#の話題とはいえないと思うけど、C#のプロセスから Process.Start で IE を起動後、
親プロセスを終了させると IE も終了してしまうという問題で悩んでいます。

IEがすでに起動している状態の場合は explorer の子として動いている IE 上に
表示されるので消えないですが、未起動状態から IE を起動すると、
C#プロセスの直接の子プロセスとして起動してしまうため発生しています。
どうすればよいでしょうか?
364デフォルトの名無しさん:2006/03/27(月) 11:24:35
C#のネーミングの由来って、C++++なんですか?
365デフォルトの名無しさん:2006/03/27(月) 12:00:25
ちがうちがう、C++の++を斜めに重ね合わせたのさ。おしゃれじゃん。
366デフォルトの名無しさん:2006/03/27(月) 12:11:14
>>363
親プロセス終了させても普通子プロセスまで終了はしないような……?
Process.Start が静的メソッドだとして、返値の Process インスタンスを Dispose したらどうなる?
367デフォルトの名無しさん:2006/03/27(月) 12:32:18
Form1のメソッド内でForm2を作成して
Form2にあるtextBox.textの内容をForm2のメソッドからForm1に渡したいんだけどどうすればいいかな?
368デフォルトの名無しさん:2006/03/27(月) 12:37:03
流れがつかめん。
Form2 はモーダル?モードレス?
Form2 のメソッドってことは Form2 は表示させっぱなし?
369367:2006/03/27(月) 12:42:03
Form frm2=new Form();
frm2.showDialog(this);

↑これはモーダルかな?
この記述をForm1に書いてます

で、frm2でファイル名や検索文字などを入力してもらって
frm2の検索ボタンや作成ボタンを押すとfrm2は閉じて
Form1の処理にもどり、frm2のテキストボックスの内容を元にファイル作成したり検索したりしたんです


370デフォルトの名無しさん:2006/03/27(月) 12:47:26
モーダルだな。
Form2 は textBox.Text を string のプロパティとして公開する。
Form1 は Form2 から返ってきた後、そのプロパティを参照する。
371デフォルトの名無しさん:2006/03/27(月) 12:48:14
Form2 からはおかしいな。Form2 の ShowDialog から。
372367:2006/03/27(月) 13:15:27
Form2に
public string str="";
を作ることでform2が閉じた後もstrを見ることができました!
アリガト!(´▽`)

でも、form2が閉じたのに
Form1からForm2のフィールドが見れるのはなぜ?
373デフォルトの名無しさん:2006/03/27(月) 13:17:10
class Form2{
 public string ファイル名
 {
  get{return this.textBox.Text;}
  set{this.textBox.Text = value;}
 }
}

class Form1{
 void hoge(){
  Form2 form2 = new Form2();
  form2.ファイル名 = "既定値";
  DialogResult result = form2.ShowDialog(this);
  if (result != DialogResult.OK)return;
  Debug.WriteLine(form2.ファイル名 + "だクマ");
  form2.Dispose();
 }
}
374367:2006/03/27(月) 13:25:52
>>373
あ、フィールドでこんな風に読み込んでたけど
class Form1{
string str=form2.ファイル名
}

プロパティだと戻り値みたいに取得できるんですね
なるほど、openFileDialogとかMessageBox.Showとかと同じような使い方ができるんですね
ありがとう
375デフォルトの名無しさん:2006/03/27(月) 13:38:28
>>373
result != DialogResult.OKのときにDisposeしてないのはいかがなものか
376デフォルトの名無しさん:2006/03/27(月) 13:42:48
ListBoxの内容を右寄せで表示する方法はありますか?
String.PadLeftしたのですがスペース、英数字、漢字が混ざっているとうまく右寄せになってくれなくて。
377363:2006/03/27(月) 14:01:58
>>366 うーん。ProcessExplorer で見てると、親の exit で IE も消えますね。
ちなみに URL を指定した場合は Start() で Process オブジェクトは帰ってこず(null)。
で、とりあえず Start("explorer", url) とすることで、何とか自分の直接の子では無い形で
IE が起動できましたが…。
378デフォルトの名無しさん:2006/03/27(月) 14:03:15
379デフォルトの名無しさん:2006/03/27(月) 14:03:33
DateTimeの値をファイルに記録して、
次回起動後にまたDateTimeに変換したいのですが、
一般的な方法やおすすめの方法はあるでしょうか?
今は無理やりファイルの文字列をパースしてセットしています。
380373:2006/03/27(月) 14:06:50
>>375
ガ━━━━━━(゚д゚lll)━━━━━━ン
381デフォルトの名無しさん:2006/03/27(月) 14:07:39
無理矢理?
DateTime.ToString と DateTime.Parse/ParseExact でもいいし、
DateTimeConverter 使っても良いし、
XmlSerializer 使っても良いし。
382デフォルトの名無しさん:2006/03/27(月) 14:11:59
ヘルプでMSDNライブラリを表示する時、表示するのに5秒くらいかかるのはおれだけ?
383デフォルトの名無しさん:2006/03/27(月) 14:12:35
うちは10秒
384デフォルトの名無しさん:2006/03/27(月) 14:13:46
>383
どんまい
しょうがないのか
385デフォルトの名無しさん:2006/03/27(月) 14:16:11
>>382 RamDiskつかえ。ばかっぱや。














だといいな・・・orz
386デフォルトの名無しさん:2006/03/27(月) 14:16:46
381さnありがとうございます。
調べてみます。
387デフォルトの名無しさん:2006/03/27(月) 15:59:33
こっちは22秒なんだが…
388デフォルトの名無しさん:2006/03/27(月) 16:29:44
んなもんディスクとメモリのIO次第
389デフォルトの名無しさん:2006/03/27(月) 19:04:47
>>375
FormはDisposeしなきゃだめだったのか。
new SomeDialog().ShowDialog();
って風に書いてたわい。
390デフォルトの名無しさん:2006/03/27(月) 19:09:09
using使うのが定石だと思ってたけど違うの?
391デフォルトの名無しさん:2006/03/27(月) 19:09:12
MUST ではないよ。
ほっといてもそのうち GC が片づけるし、
Dispose せずに GC されたらファイナライザが Dispose(false) を呼び出すだろう。
できる限り IDisposable なものは使い終わったら Dispose するのが作法だけど。
392デフォルトの名無しさん:2006/03/27(月) 19:13:27
FormをDisposeするなんて初めて聞いたぞ・・・
とりあえず俺のもしておくか・・・
393デフォルトの名無しさん:2006/03/27(月) 22:29:03
ttps://www.microsoft.com/japan/msdn/practices/type/Patterns/enterprise/ImpSingletonInCsharp.asp

「・この実装では、オブジェクトからインスタンスを要求されたときに初めて
 インスタンス化が行われるため、このアプローチは "遅いインスタンス化" という特徴を持っています。
 遅いインスタンス化により、アプリケーションの起動時に不要なシングルトンの初期化が行われなくなります。」


・・・日本人なんだけど、理解不能。誰か解説しる
394デフォルトの名無しさん:2006/03/27(月) 22:43:16
必要なときにはじめてインスタンス化されるから、必要でなかったときの初期化のコストが節約されるってこと。
遅い=delayed
395デフォルトの名無しさん:2006/03/27(月) 22:59:45
>>394 サンクス
理解しました。"遅いインスタンス化"を変に捕えてました
396デフォルトの名無しさん:2006/03/28(火) 00:13:41
visual studio 2003 + C# です。

800x600 程度のサイズのフォームの上にラベルが数個、フォームの背景画像
を指定しているのですが、特にラベル付近の描画が遅く、背景画像が、
一瞬で描画されません。

これを、フォームの描画を一瞬でさせる方法があれば教えて頂けないでしょうか?

ダブルバッファリングなども調べてみましたが、画像に画像を合成するよう
な場合は使えるかとおもったのでですが、画像だけではなく、
ラベルコントロールなども使いたいのでダブルバッファリング先の
画像にラベルコントロールで描画される内容を描画する方法がわからなくて。

他にも例えば Visible = False としたフォームにラベルや背景画像を
設定して、そのフォームを「画像」として取得でき、その画像を
描画させる、などの方法も考えたのですがそれを実現させる方法が
わからなく。

いろいろ書きましたが、いくつかのラベルと背景画像で作られる画面を
画面に描画しているサマをあらわさず、パッと表示させるよい方法が
ありましたらアドバイスください。よろしくお願いします。
397デフォルトの名無しさん:2006/03/28(火) 01:00:11
>>396
BeginUpdate
398デフォルトの名無しさん:2006/03/28(火) 11:47:59
BeginUpdate は Listbox などの個別コントロールで対応している
ものもありますが、フォーム全体では対応していないですよね...

フォームの描画/再描画を停止する方法、もしくは
フォームの内容を画像として取得する方法があれば
その先はなんとかなるかもしれない、と思っています。

アドバイスよろしくお願いします。
399デフォルトの名無しさん:2006/03/28(火) 12:53:29
>>396
いつも遅いのならあまり改善の余地はないと思います。
初回の描画の話なら、必要になった時点でノロノロとアセンブリを
ロードし始めるという CLI の動作のせいだと思います。

その辺を綺麗にすばやく表示することがビジュアル的に重要であって、
コントロールの外観を自前でオフスクリーンに書く手間も惜しまないのなら、
XPExplorerBarのソースが大変参考になると思います。
400デフォルトの名無しさん:2006/03/28(火) 17:00:40
>>389
気になったので試してみたのだが、ShowDialogとShowで動作が違うのね。
ShowDialogの場合DialogResultの設定されたボタンやXボタンで抜けた場合はDisposeされていなくて、
Showの場合Xボタンで抜けた場合はDisposeされている。
当然といえば当然な仕様なんだけど、ドキュメントに明記してないと迷いそう。
401デフォルトの名無しさん:2006/03/28(火) 17:04:46
IDisposable は Dispose と考えておけば良いさ。
Dispose は複数回呼んでも問題ないよう設計することが求められるし。
ちなみに、Close メソッドの解説でフォローされてるけどな。> Dispose
402デフォルトの名無しさん:2006/03/28(火) 21:57:40
C# でマルチスレッドのプログラムを作ろうとしています。
D:\ E:\ G:\ と順番に for で回してファイルをコピーしていくプログラムがあるとします。
シングルスレッドだと D:\ の処理が終わってから E:\ の処理に入りますが、マルチスレッドだと
同時に複数のドライブに処理が行えるという認識でいいのでしょうか?
その場合、どのように for 文の中を書くとよいでしょうか?

for (int i = (int)startDrive; i <= (int)endDrive; i++)
{
File.Copy (String, String) ;
}
403デフォルトの名無しさん:2006/03/28(火) 22:02:56
> マルチスレッドだと同時に複数のドライブに処理が行える
実際に同時に書けるかどうかは PC 次第だがな。

取りあえずまずシングルスレッドで動くまともなコード書け。
404デフォルトの名無しさん:2006/03/28(火) 22:03:59
>>402
非同期プログラミングのデザインパターン
ttp://www.gyao.jp/common/css/catetop.css
405デフォルトの名無しさん:2006/03/28(火) 22:05:02
>>402
ファイルをコピーするマルチスレッド用のメソッド作る
引数渡して、スレッド起動。俺だったら別途にクラス作る。
というかBackgroundWorker使え。
406デフォルトの名無しさん:2006/03/28(火) 22:05:11
407402:2006/03/28(火) 22:26:12
ありがとうございますた。
408デフォルトの名無しさん:2006/03/29(水) 02:44:13
>>404のurlいきなりメモ帳でcss開かれたんだけど気のせい?
409デフォルトの名無しさん:2006/03/29(水) 02:47:57
410デフォルトの名無しさん:2006/03/29(水) 03:28:21
初心者なんですけど、この板全体あんまり人いないですねよ
質問も初心者の質問が多かったり
やっぱり上級者というか本職にしてるひとは
ここで聞くより自分で調べたほうが早いみたいな感じなんでしょうか?
411デフォルトの名無しさん:2006/03/29(水) 03:33:11
412デフォルトの名無しさん:2006/03/29(水) 07:57:09
ListViewItem item1=new ListViewItem();
ListView lv1=new ListView();←これはフォームに組み込んでカラー設定してるやつ

item1.subItems.Add(str)とやってるのに

↓こっちじゃなくて
ListViewItem.ListViewSubItemCollection.Add メソッド (String)
↓のが有効になってるみたいで(Addのところにマウスポインタあわせると↓の説明が出る)
ListViewItem.ListViewSubItemCollection.Add メソッド (String, Color, Color, Font)

lv1.Items.Add(item);
とやると、カラーまでコピーされたのかlv1のカラーまで変わってしまいます
単純にデータを受け渡したいんだけどどうすればいいんでしょうか?
413デフォルトの名無しさん:2006/03/29(水) 07:58:53
訂正:item1

lv1.Items.Add(item1);
414デフォルトの名無しさん:2006/03/29(水) 09:02:51
>>412
FormにListViewを貼ってForm_Loadで

listView1.View = View.Details;
listView1.ForeColor = Color.White;
listView1.BackColor = Color.Blue;
listView1.Columns.Add("1");
listView1.Columns.Add("2");
ListViewItem item = new ListViewItem();
item.Text = "a";
item.SubItems.Add("b");
listView1.Items.Add(item);

とやったら青地に白で表示されたが。
ちなみにオーバーロードされてるメソッドはヒントで表示されるやつが使われてるんじゃないぞ。
415デフォルトの名無しさん:2006/03/29(水) 10:06:29
メニューやツールバーのコメントアウトコマンドを使うと一番左に
// が付きますが、この行を含んだ部分をコピペすると、// が
行頭であるということで、右のほうによってしまいますよね。だったら
最初っからインデントにあわせて // を手作業でつけたほうが、と
思うんですが、複数行になるとまんどくさいです。複数行に対して
インデントにあわせて // を付けることってできませんか?2003です。
(VB.NETだとそういう動きになってるんです)
416412:2006/03/29(水) 10:19:59
>>414
フォームにバックカラーとフォントカラーを変更したListViewを追加して以下のコードを実行します
public partial class Form1 : Form
{
    private void Form1_Load(object sender, EventArgs e)
    {
        Class1 cs1 = new Class1();
        cs1.lv.Items.Add("test");
        cs1.lv.Items[0].SubItems.Add("test2");
        copyItems(cs1);
    }
    private void copyItems(Class1 cs1)
    {
        //↓このコードにしたのですが・・・・文字が黒でバック白になる
        foreach (ListViewItem item in cs1.lv.Items)
        {
            this.listView1.Items.Add((ListViewItem) item.Clone());
        }
    }
}
class Class1
{
    public ListView lv = new ListView();


}
これはいったいどういうことなんでしょうか?

>ちなみにオーバーロードされてるメソッドはヒントで表示されるやつが使われてるんじゃないぞ。
なるほど、これは原因じゃなかったんですね
417412:2006/03/29(水) 10:22:13
いくつか試してみました、本文長かったので追記

        //↓なぜかこれだと例外が出て処理されないので
        //foreach (ListViewItem item in cs1.lv.Items)
        //{
        //    listView1.Items.Add(item);
        //}
        //↓このコードにしたのですが・・・・文字が黒でバック白になる
        foreach (ListViewItem item in cs1.lv.Items)
        {
            this.listView1.Items.Add((ListViewItem) item.Clone());
        }
        //↓これでも同じくカラーが変わる
        //foreach (ListViewItem item in cs1.lv.Items)
        //{
        //    this.listView1.Items.Add((ListViewItem)item.Clone());
        //}
        //↓でこれをやると何とかできたけど、無駄に文が長くなってしまったような
        //foreach (ListViewItem item in cs1.lv.Items)
        //{
        //    ListViewItem itemC = (ListViewItem)item.Clone();
        //    this.listView1.Items.Add(itemC.Text);
        //    this.listView1.Items[this.listView1.Items.Count - 1].SubItems.Add(itemC.SubItems[1]);
        //}
418デフォルトの名無しさん:2006/03/29(水) 10:26:09
>>415
マクロにやらせれば?
419デフォルトの名無しさん:2006/03/29(水) 10:53:12
>>416
CloneすればForeColorやBackColorも当然コピーされてそれが使われる。
420デフォルトの名無しさん:2006/03/29(水) 11:00:07
>>416
そもそも何故 Class1 とやらにわざわざ ListView 作ってそれに格納してるんだ?
ArrayList じゃダメなのか?
421412:2006/03/29(水) 11:35:31
>>420
同じ形式だと見た目わかりやすいと思いまして
あと、同じ操作させたい場合も便利なんじゃないかなと思ったり
今のとこはデータを保存してるだけなんですけど
データを保存するためにArrayList使うにしても、

arrayList.Add(item)
listView.items.Add(arrayList[0])

みたいな形で、結局データを取り出してListViewに表示しようとすると
色が変わってしまいますよね?
あと、上記のように、listviewのitemをそのまま格納すると、listviewの内容変更した場合
arrayListに格納しているitemも変更されてしまいますよね?
参照とかじゃなくてデータだけをコピーして格納したいんです
どうすればいいんでしょうか?
422デフォルトの名無しさん:2006/03/29(水) 11:50:04
>>417
色は変更したい(元のとは変えたい)けどSubItems は元のと同じにしたい、
ってことですよね。そんなのライブラリにないと思うので、

・Clone してから適切な色に変更する
・string を Add してから、SubItems を自前で複製する

のどっちかしかないでしょう。

後者は漏れならこうかな
foreach (ListViewItems item in lv.items)
{
 ListViewItem newItem = new ListViewItem(item.Text);
 newItems.SubItems = item.SubItems.Clone();
 this.lv.Items.Add(newItems);
}

>参照とかじゃなくてデータだけをコピーして格納したいんです
>どうすればいいんでしょうか?

普通はデータを格納するのにListViewItemCollection なんかに頼らずに、
自前でちゃんと Class { string title; ArrayList subItems; } とか作って
ArrayList なんかに格納しておく。
423デフォルトの名無しさん:2006/03/29(水) 11:51:21
色が変わるんじゃなくて変わらないのが問題だな。
ListViewItem の各情報を設定しないまま ListView.Items.Add すると自動的に ListView での色やフォントに設定されるが、
Clone した場合は設定されてるかどうかは無関係に ForeColor ほかの各プロパティを参照してサブアイテムを構成する。
既に設定済みだから ListView.Items.Add しても色は ListView から感染しない。

ListViewItemManager クラスでも作ってそこで管理すれば良いんじゃね
424412:2006/03/29(水) 12:19:27
>>422
フォームにあるlistviewの色は変えないで
中身の文字データだけを保存したり、保存したデータを取り出して表示したかったんです
これがどうも、参照?でコピーしてるのか、フォームのリストビューを変更したら、保存先も変更されたり
うまくコピーできたと思ったら、取り出すときにカラーまでコピーされたり・・てな感じです

>普通はデータを格納するのにListViewItemCollection なんかに頼らずに
そういうものなんですか・・
データ取り出したあと、Listview形式に変換する関数も必要ってことですね
やっぱり、不必要な機能を持った自前クラスなんてのはスマートじゃないってことなんですかね?
文字保存するだけなのに、listviewの全機能を保持するなんてだめかやっぱ
いろいろ試しましたけどうまくいきませんでした。
ArrayListでがんばってやってみたいと思います。
425412:2006/03/29(水) 12:58:13
>>423
すみません。ちょっと意味がわからないです
ListView.Items.Add←こういう関数はないので・・・
listView1.items.Add(listView2のitem.Clone())
listView1は色が変わってしまうけど、listView2の色は変わらないってことですか?


item1=item2

これで文字データだけ渡してくれればいんですけどねぇ
色とかもろもろのいらないデータもコピーされてしまうので
フォームのListViewのカラーまで初期化されてしまう

items.Add(item)とするとエラー出るし
クローンすると、カラーまで移るし
結局、items.Add(String)とSubItems.Add(String)でコツコツとデータコピーしてやらないとダメってことですね
426412:2006/03/29(水) 13:28:57
arraylistでやったところ思っていたことがあっさりできました・・・w
コードも少なくて済みます
面倒などころかこっちのほうがわかりやすくてよかったです
でも、同じようにオブジェクトをコピーしてるだけなのに
なんでカラーはコピーされないんだろ・・参照にもなってなく値渡しできてるみたいだし

        private void Form1_Load(object sender, EventArgs e)
        {
            Class1 cs1 = new Class1();
            ListViewItem item = new ListViewItem();
            item.Text = ("tesuto");
            item.SubItems.Add("test2");
            cs1.al.Add(item);
            copyItems(cs1);
        }
        private void copyItems(Class1 cs1)
        {
            foreach (ListViewItem item in cs1.al)
            {
                this.listView1.Items.Add(item);
            }
            
          
        }
    }
    class Class1
    {
       public ArrayList al=new ArrayList();
    }

みなさまありがとうございました
427デフォルトの名無しさん:2006/03/29(水) 13:35:28
いや、ListViewItem がクラスである以上どうしようが参照でのやりとりになるが。

例えば cl1.al[0] を二つの ListView.Items に入れようとしてみ?
428デフォルトの名無しさん:2006/03/29(水) 13:41:22
ねぇねぇ
フォーム内のコントロールのリサイズってどうやってる?
VB6の時は
コントロール検出->比率保管
resizeイベント->再設定->比率保管
ってのを毎回作ってるんだが・・・

C#でも同じように毎回いるの?
this.Nurupo.Size(?,?);
を書くのがめんどくさい・・・

自動リサイズコントロールは需要あるかな?
429デフォルトの名無しさん:2006/03/29(水) 13:47:18
Dock や Anchor のことか?
430デフォルトの名無しさん:2006/03/29(水) 13:50:23
TableLayoutPanel とか FlowLayoutPanel が出来たおかげで殆ど困らなくなったな
431412:2006/03/29(水) 13:58:18
>>427
> いや、ListViewItem がクラスである以上どうしようが参照でのやりとりになるが。
オブジェクトの値渡しはできないんですか・・・知らなかった

> 例えば cl1.al[0] を二つの ListView.Items に入れようとしてみ?
エラーでました・・・がっくり・・今よろこんで本プログラムをArrayListに書き換えてたのに・・・
ってことはやっぱ文字データで渡すやるしかないのか・・・
それはさすがに面倒だなぁ・・多次元配列とか苦手・・・
432デフォルトの名無しさん:2006/03/29(水) 14:06:42
そもそも ListViewItem を複数の ListView から参照することなぞまずないと思うんだがな。

ListViewItem のコレクションクラスを CollectionBase から派生させて、
取得するときに新しく作り直せば良いじゃん。
433412:2006/03/29(水) 14:37:13
>>432
> そもそも ListViewItem を複数の ListView から参照することなぞまずないと思うんだがな。
複数の保存したデータをフォームのリストビューに表示、追加などして編集してその後また保存したいんです
なので参照だと、フォームのリストビューのデータに手を加えた時点で元のデータも壊れてしまう。
ので、値渡しでないときびしいんです

> ListViewItem のコレクションクラスを CollectionBase から派生させて、
> 取得するときに新しく作り直せば良いじゃん。
すんません。私にはまだ高度なプログラミン内容なようで設計が難しいです。
地道にstringにしてデータ渡して行きます
434デフォルトの名無しさん:2006/03/29(水) 14:45:49
DataTable と DataGridView / DataGrid 使うべきところのような気がする
435デフォルトの名無しさん:2006/03/29(水) 15:26:57
編集させるんなら DataGridView だよな
436デフォルトの名無しさん:2006/03/29(水) 16:41:06
for(int i = 0; i < dataGridView1.Rows.Count; i++)
{
dataGridView1.Rows.RemoveAt(i);
}

for文の中でDataGridViewの行を削除すると行が繰り上がり
for文の中で行がひとつ飛ばされると思うのですが、
一般的にはどのような方法で対策するのでしょうか。
437デフォルトの名無しさん:2006/03/29(水) 16:47:27
Clear
438デフォルトの名無しさん:2006/03/29(水) 16:52:01
Form.Invokeが必要なスレッドの終了を待ちたいのですが、
以下のようにすると固まってしまいます。
何か方法があるのでしょうか?


private void Exec(){
this.Invoke(new System.Threading.ThreadStart(Start));
System.Threading.Thread.Sleep(3000);
this.Invoke(new System.Threading.ThreadStart(End));
}
protected override void OnClosing(CancelEventArgs e){
m_th.Join();
base.OnClosing(e);
}
private void startButton_Click(object sender, EventArgs e){
m_th = new System.Threading.Thread(new System.Threading.ThreadStart(Exec));
m_th.Start();
}
439デフォルトの名無しさん:2006/03/29(水) 16:54:36
>>436
forで消したいならRemoveAt(0)
440デフォルトの名無しさん:2006/03/29(水) 17:11:33
もしくは逆順ループ
441デフォルトの名無しさん:2006/03/29(水) 17:14:25
Stringから IntPtrにしたいんだけど、これではだめみたい。
なんか方法ある?

IntPtr lpBuffer = Marshal.StringToCoTaskMemAnsi("文字");
442デフォルトの名無しさん:2006/03/29(水) 17:15:53
>>438
Invoke で元のスレッドで処理しようとするが、その元のスレッドそのものが Join で止まっててデッドロック。
UI スレッドを待機させちゃいけないな。
大体 Closing が発生する時に Invoke が必要な処理やってちゃいかんし意味無いだろう。
せいぜい Thread が IsAlive なら Closing をキャンセルするとか。
443デフォルトの名無しさん:2006/03/29(水) 17:16:23
>>441
何がどう駄目なのか書け。話はそれからだ。
444デフォルトの名無しさん:2006/03/29(水) 17:53:00
質問です。
wininet.dll の Win32 API 関数 GetUrlCacheEntryInfo を呼び出し、
アドレスからキャッシュファイル名を取得したいと手探りで頑張ってみたのですが、
構造体の取得が出来ておらず、関数の戻り値もfalseで
どうにもうまく動いていない様なのです。
どうか御指導おねがい致します。

ttp://free.gikoneko.net/up/source/up83723.zip
445438:2006/03/29(水) 18:08:54
>>442
なるほど、UIThreadではClosingをキャンセルして、
終了用のスレッドでCloseしたらうまくいきました。
ありがとうございました。

private void WaitClose()
{
while (m_th.IsAlive) {
System.Threading.Thread.Sleep(100);
}
this.Close();
}
protected override void OnClosing(CancelEventArgs e)
{
if (m_th != null)
{
if (!m_th.IsAlive)
{
base.OnClosing(e);
}
else
{
e.Cancel = true;
System.Threading.Thread th = new System.Threading.Thread(new System.Threading.ThreadStart(WaitClose));
th.Start();
}
}
}
446デフォルトの名無しさん:2006/03/29(水) 18:10:01
>>444
まあ MSDN 嫁で片づけても良いような気もするが。
基本的な手順はこうだ。
・GetUrlCacheEntryInfo に URL、 NULL ポインタ、 0 を渡す。第三引数に必要なサイズが格納される
・返ってきたサイズ分のメモリを確保する。
・もう一度 GetUrlCacheEntryInfo 呼び出し、引数に URL、確保したメモリのポインタ、確保したメモリのサイズを渡す。
・メモリを構造体にコピーする。
・メモリを解放する。
で、必要なキーワードは
IntPtr Marshal.AllocCoTaskMem Marshal.PtrToStructure Marshal.FreeCoTaskMem
447デフォルトの名無しさん:2006/03/30(木) 03:58:16
>>446
解答ありがとうございます、が情けない事にまだわからないのです。

private extern static bool GetUrlCacheEntryInfo
(
string lpszUrlName,
out INTERNET_CACHE_ENTRY_INFO lpCacheEntryInfo,
out uint lpdwCacheEntryInfoBufferSize
);
(略)
IntPtr ptr;
GetUrlCacheEntryInfo(address, out ptr.ToPointer(),out size); // error
ptr = Marshal.AllocCoTaskMem((int)size);
GetUrlCacheEntryInfo(address, out ptr, out size); // error
INTERNET_CACHE_ENTRY_INFO cacheinfo =
(INTERNET_CACHE_ENTRY_INFO)Marshal.PtrToStructure(ptr, typeof(INTERNET_CACHE_ENTRY_INFO));
Marshal.FreeCoTaskMem(ptr);

自分なりにヒントを頼りに調べて考えてこうなったのですが、
GetUrlCacheEntryInfo関数の第二引数をどうすれば良いのかわからないのです。
もう少しヒントを、面倒ならMSDNの該当部だけでも教えて貰えないでしょうか。、もうだめねむいねる
448デフォルトの名無しさん:2006/03/30(木) 07:29:18
ComboBox.SelectionChangeCommitted イベント
選択した項目が変更され、その変更が ComboBox に表示されると発生します。

この機能まともに働いてないと思いませんか?
項目を選択しても、その項目の情報が送られるわけじゃなくて
その項目を選択する前に表示されていた文字列(ComboBox.Text)が
送られてくるんですけど・・・
449デフォルトの名無しさん:2006/03/30(木) 09:09:09
>>448 仕様どうなってるかしらんが、現在のセレクションはそのときに呼び出せるんじゃないの?
450デフォルトの名無しさん:2006/03/30(木) 09:39:14
>>447
IntPtr はポインタそのものなので、out つけたらポインタのポインタを渡すことになってしまうぞ。

>>448
Text じゃなくて SelectedItem 使え。
Text で以前のが取れるなら嬉しさ倍増だな。
451448:2006/03/30(木) 12:15:25
>>449
>448にも書いてるとおり
変更が表示されてから発生とか抜かしておきながら
実際は変更される直前。ダウンアイテムをクリックして閉じる瞬間にイベント起こしてやがる糞野郎です

>>450
言ってる意味がわからないんですけど?
senderComboBox.SelectedTextこれでも前のテキストが読み込まれて
senderComboBox.Textと同じ内容
もうだめぽーw

あとさ、イベントでDELキー押されるとリストアイテムを削除するようにしたらさ
IDE自体がDELキー受け付けなくなってるんでやんのww
自作ソフトのイベントがなんでIDEまで反映されてるんだよと・・

ほんとがんばってくださいM$さん
452デフォルトの名無しさん:2006/03/30(木) 12:17:44
SelectedItem 、と言ったんだが?
453デフォルトの名無しさん:2006/03/30(木) 12:27:59
>>451
デザインモードなのにイベントをハンドリングしてるからでは?
454デフォルトの名無しさん:2006/03/30(木) 12:38:30
>>451
お前ががんばれよ
455デフォルトの名無しさん:2006/03/30(木) 13:07:25
IntPtr、略してインポ
456448:2006/03/30(木) 14:38:12
>>452
そういうイベントもないし、コンボボックスにそういうメンバもないんですけど
主語抜けてるんで、主語いれてください。「選択したアイテム」だけじゃ
誰が選択したこと言ってるかわからないじゃないですか

>>453
ハンドリングってなんですか?解除はどうすればいいですか

>>454
これからも応援してくださいね^^
457デフォルトの名無しさん:2006/03/30(木) 14:45:33
>>456
>項目を選択しても、その項目の情報が送られるわけじゃなくて
>その項目を選択する前に表示されていた文字列(ComboBox.Text)が
>送られてくるんですけど・・・

何がどこから送られてくるって?

public event EventHandler SelectionChangeCommitted

このイベントのどこにそんな情報が入ってるというのだ?
458デフォルトの名無しさん:2006/03/30(木) 14:51:29
どうやら 448 によるとこれは存在しないプロパティらしい。
ttp://msdn.microsoft.com/library/ja/default.asp?url=/library/ja/cpref/html/frlrfSystemWindowsFormsComboBoxClassSelectedItemTopic.asp
ttp://msdn2.microsoft.com/ja-jp/library/system.windows.forms.combobox.selecteditem(VS.80).aspx
まいったな、どうやって ComboBox の選択中のオブジェクト取得しようか。
SelectedIntex と Items から調べるか。
459448:2006/03/30(木) 14:53:33
>>457
ドロップダウンメニューをクリックすると、
ドロップダウンメニューで選んだアイテムじゃなくて
元々、ComboBox.Textにあったものが
イベントのsenderで送られてくるんですよ!
しかも、イベントの発生時点では、まだ、ComboBox.Textが更新されてないから
腹が立つンです!!M$は変更されてから発生って書いてるのに!!!!

選んでTEXTが変更されてから、その情報が取れたらいんだけどね
いくつか試したけど、そういう機能のイベントはない
てか、使えないイベントばっかじゃん

もっとがんばってねM$ちゃん
460448:2006/03/30(木) 14:56:40
>>458
えぅ〜><ごめんなさぁいですぅ〜
でもでも〜。ドロップダウンで選んだ直後は選択状態になるけどぉ〜
どのタイミングで取得するかなんだよねぇ〜。
選択されたら常に取得するんだとぉ、ドロップダウンアイテム選んでなくても
選択したりすることあるしぃ〜。
そう考えるとわたすぃのあたまではむりぽぉ〜。。。
461デフォルトの名無しさん:2006/03/30(木) 16:58:40
>>456
Componentに DesignMode っていうプロパティがあるでそ?
それが true の場合は、デザイナの中で動いているから、
デザイナの中で動くときには不要な処理はしないように
if 文入れるなりなんなり「自分で」コードを修正する。
462448:2006/03/30(木) 17:32:44
>>461
おおーーー!!!!!!
なんだか意味がよくわからなかったが、なんとなくやってみたらうまくいったぞ!!
最初System.ComponentModelやSystem.Web.UI.WebControlsなネームスペース作ってねーよ!って
思ってたけどなw
てか、こんなややこしいことさせるなんて!!普通にわかるだろ!こんなデザイン時までキー入力受け付けないなんて!

もっとがんばってよM$さん

>>461
それにしてもこんなのよく見つけたね?すぐ見つけれたの?すごいね天才だね
ほんと感謝感激です!ありがとう
463デフォルトの名無しさん:2006/03/30(木) 17:34:07
常識だし
464デフォルトの名無しさん:2006/03/30(木) 18:53:33
Properties.Resourcesに埋め込んだWAVファイルを
再生するにはどうすればいいでしょうか

PlaySoundとして、外部ファイル名を指定すれば再生できますが
.Properties.Resources._1.ToString(),
と指定してもビープ音しか鳴りません。
465デフォルトの名無しさん:2006/03/30(木) 19:18:24
適当に答えると、ストリームでとればなんとかならんか。
466デフォルトの名無しさん:2006/03/30(木) 19:19:18
byte配列になるんだっけ?
それつかってMemoryStream初期化してSystem.Media.SoundPlayerに渡せば良さそうだが。
._1の型は何よ。
467デフォルトの名無しさん:2006/03/30(木) 19:33:31
こういう奴はイベントが起こらなければ起こらないで、
文句を言うんだろ。
468デフォルトの名無しさん:2006/03/30(木) 19:46:57
SoundPlayerを使ったら出来ました。
回答ありがとうございました。
469デフォルトの名無しさん:2006/03/31(金) 02:00:02
初心者某です。
FileStream、StreamReader、StreamWriterを利用してテキストファイルを読み書きしています。

親プロセスが書き込んだファイルを子プロセスが読み込んでそのFormに表示する、
というプログラムを作りました。(下記@〜F)
しかし、子プロセスに表示されるファイルの中身が不完全(末尾が欠ける)
という不具合が発生しました。
BとCの間にThread.Sleepを入れたら解消したので
「ファイルの書き込みが間に合わないのだ」と理解したのですが、
そんなことってあるのでしょうか。
Bのメソッドが発行された時点で既にファイルへの書き込みって完了しているものと
思っていたのですが、実際にはタイムラグがあるのでしょうか…。

@ファイルオープン
Aファイルに書き込み
Bファイルクローズ
C子プロセス起動
D子プロセスがファイルオープン
E子プロセスがファイルを読み込みフォームに表示
F子プロセスがファイルをクローズ





470デフォルトの名無しさん:2006/03/31(金) 05:47:56
3と4のコードはどんななってますのん?
471デフォルトの名無しさん:2006/03/31(金) 08:17:22
プロセス? スレッドとちゃう?
472デフォルトの名無しさん:2006/03/31(金) 09:12:24
>>469
まずは何の初心者か明示しろ
俺には日本語の初心者にしか見えない
473デフォルトの名無しさん:2006/03/31(金) 09:22:58
?日本語的にはまったく問題ないように思うが。
とりあえずコードを晒して欲しい
474デフォルトの名無しさん:2006/03/31(金) 10:48:33
>>469
メモリの書き込み速度とHDDの書き込み速度は
1000倍以上もあるのでプログラムはすぐ次の動作に移るけど
ファイルの書き込みが追いつかないというのは仕様
暇があれば書き込んでやってもいいぞって感じでファイル作るから
ちゃんとファイルがあるかどうか、何よりフォルダ内をちゃんと更新されたのを確認しないとだめ
475デフォルトの名無しさん:2006/03/31(金) 11:18:15
>>474
人を騙して楽しいかい?
親や兄弟、大切な人とかに「人を騙すのは楽しい」って言える?
476デフォルトの名無しさん:2006/03/31(金) 11:25:15
>>469 動機書き込みぐらいあるだろ
477デフォルトの名無しさん:2006/03/31(金) 11:59:25
>>469
仕様は分かった、コード曝せや
問題が発生しているときに仕様だけ伝えられても仕様のミスくらいしかわからん
ここはC♯言語のスレなんだからC♯言語のを載せろ
478デフォルトの名無しさん:2006/03/31(金) 12:33:51
StreamReader.Close を呼ぶと、元になっているStream (例えば FileStream ) も Close されます、
ってドキュメントに書いてありますよね。あれ嘘のような気がしませんか?
479デフォルトの名無しさん:2006/03/31(金) 12:36:14
しないよ
なんで嘘だと思ったんだ
480デフォルトの名無しさん:2006/03/31(金) 12:40:04
Net1.1で、FileStreamを読み込みモードで開いて、それを読むStreamReaderを
作成、使用後にCloseしても元のファイルが消せなかったことがあって。
481デフォルトの名無しさん:2006/03/31(金) 13:07:02
どっちにしろ再現性のあるコードをあげてくれ、議論はそれから。
482デフォルトの名無しさん:2006/03/31(金) 17:20:09
ちょっと質問です。
Control.Invalidate(Rectangle)を呼ぶとGraphics.Clipプロパティに適切なリージョンが設定されるものかと思ったのですが、
どうもPaintEventArgs.GraphicsのGraphics.Clipプロパティには常に無限領域が設定されているようです。
これはこういうものなんでしょうか。
もしそうだとしたら、無効になった領域だけを再描画するにはどうしたらよいのでしょうか。
483デフォルトの名無しさん:2006/03/31(金) 17:40:11
そういうもの。
内部では InvalidateRect が呼び出されて無効領域を設定するので、
フォームのデバイスコンテキストにはその範囲だけしか描画されない。
ちなみに無効領域は PaintEventArgs.ClipRectangle
484482:2006/03/31(金) 18:56:18
>>483
なるほど、PaintEventArgsの方にあったんですか。気づきませんでした。
どうもありがとうございました。
485デフォルトの名無しさん:2006/03/32(土) 02:15:10
NumericUpDown(Win 1.1)で、キーボードから打ち込んだときになぜだか
ValueChangedイベントが発生しない、という事態が発生しました。
Enterを押さないと発生しないし、Valueも更新されていません。
ためしに新規プロジェクトの空のフォームに置いて試したらちゃんと
イベントが発生したので、俺の作ったフォームのせいなんだと思いますが、
みなさん同じ現象が出たことありませんか?
もう今週も終わりなので、月曜日にひきつづき原因調べてみます。。。
486デフォルトの名無しさん:2006/03/32(土) 02:25:55
> NumericUpDown(Win 1.1)で、キーボードから打ち込んだときになぜだか
> ValueChangedイベントが発生しない、という事態が発生しました。
> Enterを押さないと発生しないし、Valueも更新されていません。

これが正しい挙動のはずだが?
487デフォルトの名無しさん:2006/03/32(土) 12:43:54
Dictionary<string,T>で大文字小文字を区別しないようにするためにはなにを使えばよいのでしょう?
HashtableならばCollectionsUtilでなんとかなるのですが
Dictionary.Comparerを実装しようと思ったのですが標準で用意されていないのでしょうか?
 CaseInsensitiveComparerは使えるのですが、
 CaseInsensitiveHashCodeProviderは「使用しないでください」ってなっているので
488デフォルトの名無しさん:2006/03/32(土) 12:53:35
Dictionary(IEqualityComparer<TKey>) コンストラクタ使えばいいんじゃね?
489487:2006/03/32(土) 12:58:16
>>488
しってるよ
490デフォルトの名無しさん:2006/03/32(土) 13:21:55
IEqualityComparer<string>のCaseInsensitiveな奴の実装方法が知りたいと言ってると思われ
491デフォルトの名無しさん:2006/03/32(土) 13:32:49
そのコンストラクタのサンプルにあるし
492487:2006/03/32(土) 14:16:55
>>491
しってるよ
493487:2006/03/32(土) 15:05:13
>>490
そうだよ
494デフォルトの名無しさん:2006/03/32(土) 17:36:35
        ,ィ≦テ三三テ≧ュ- 、
      ィ州ii} |!{ヾ(((ヾ(((ハ三ミミ 、
     〃/ノノリ |ヽ.._ノヽ   }}ミミミミh、
    〃//〃  |      ヽ=ノ ;'⌒ヽ}}ミl、
   ,}}| 川|{   ノ     ((⌒ ノ     }}}li
   /川||}!}i|           ̄      }州
   レ {!州!|     ,x‐  ̄ ヽ   ,.z==〃/
   l!( リノ川      <( ハ〉 ノ   { ,ィTヽ /
   トvソノ}}ハ)、        ̄ ノ    l ` ̄ {
   ))ト〃 }|::ヽ            i     ′
    /ノ》州}}}ィ::、     イ    l   ′
    ((∧  州}ソ,ノ   / ` = _ノ   ′
     }  \  ヾィ    ノー- __ -  ,'
    ′   \  ` 、    -‐-  イ
    ′       \   `   __ ,/ l
   ′        \ ヽ       |

  モーネ・アホカト[Maulnen Ahoccato]
     (1666〜1738 フランス)
495487:2006/03/32(土) 19:45:46
ここは騙りがいっぱいなインターネットですね。

>>488-491できました。ありがとうございました。
496デフォルトの名無しさん:2006/04/02(日) 01:11:45
現在C#で長時間録音ソフト(ネトラジ録音ソフトの様なもの)を作ろうとしています。
・DirectSoundを使う
・mciSendStringを使う
の2つの方法を見つけました。
前者はMSDN(日本)の説明がよく分からず、またサンプルソースも無いので途方に暮れていたときに後者の方法を発見しました。

後者はこのURLの一番下にある方法を利用しました。
http://f57.aaa.livedoor.jp/~jeanne/bbs/faq.cgi?mode=al2&namber=2460
ですが、この方法では長時間録音すると不安定になったりと不向きと言うことが分かりました。
wavファイルを録音しながら徐々に書き出していきたいのですが、そういった方法、またはそういった方法(サンプルソース)が乗っているWebサイトを教えてください。
私はDirectSoundを使えばいけると思うのですが、MSDNの解説にはサンプルソースが無いのでよく分かりません。
よろしくお願いします。
497デフォルトの名無しさん:2006/04/02(日) 01:23:55
DirectSound のサンプルなぞいくらでも転がってると思うんだが。
Managed DirectX のとなると少なそうだが、SDK にサンプル付いてなかったっけ?
まあ C++ のを大体流用できるだろうし。
498デフォルトの名無しさん:2006/04/02(日) 02:18:02
ManagedDirectX SDKのサンプルにある CaptureSoundとかじゃだめなん?
499デフォルトの名無しさん:2006/04/02(日) 02:24:13
>>496
DirectShowでWebからストリーム受信するフィルタ作ってバイナリを保存するのが定石。
500496:2006/04/02(日) 03:41:14
>>497
C++とかわかるわけねーだろタコ
501デフォルトの名無しさん:2006/04/02(日) 07:00:17
匿名デリゲートは直接Invokeすることはできないんでしょうか?
Invoke(delegate(){ 〜;});みたいな感じで。
502デフォルトの名無しさん:2006/04/02(日) 07:00:19
匿名デリゲートは直接Invokeすることはできないんでしょうか?
Invoke(delegate(){ 〜;});みたいな感じで。
503デフォルトの名無しさん:2006/04/02(日) 07:00:55
連続書き込みすみませんでした。
504デフォルトの名無しさん:2006/04/02(日) 07:11:35
new MethodInvoker(delegate(){ }).Invoke();
でもなんか意味あるの?
505デフォルトの名無しさん:2006/04/02(日) 10:11:29
>>497
C++のコードは読めませんが、500は私ではありません。

>>498
ありがとうございます。SDKのサンプルは盲点でした。
私が考えていた物と結構同じ動作をしているので、これから解析してみたいと思います。
506デフォルトの名無しさん:2006/04/02(日) 15:15:27
timer_tickイベントの中にMessegeboxを入れると
それ以降の処理がされないんですがなぜだかわかりますか?
例えばmsgboxの後にmsgboxを表示しないようにするコードを入力しても
なんでもmsgboxが表示されるんです
507デフォルトの名無しさん:2006/04/02(日) 15:16:36
DirectSoundはマシンによっては使えないことがあるから
現時点ではあまり選択肢に入れない方がいいよ
508デフォルトの名無しさん:2006/04/02(日) 15:17:55
>>506
別スレッドで表示しる
509デフォルトの名無しさん:2006/04/02(日) 15:19:07
>>506
おおざっぱに言うとメインスレッドのメッセージループが止まるから。
510デフォルトの名無しさん:2006/04/02(日) 17:03:16
>>506
おおざっぱに言うと MessageBox はモーダルダイアログだから。


ところで 『ファイル名を指定して実行』 みたいな、自動補完のポップアップの表示の仕方が分かりません。
VS.NET のインテリセンスにしてもそうだけど、ポップアップをクリックしても元のコントロールにはフォーカスが残ったままですし。

単純に API の ShowWindow を使って、非アクティブのまま前面表示するだけでは、↑のようにはならないのですが、
どのようにすれば、これらと同じように表示できるんでしょうか。
511デフォルトの名無しさん:2006/04/02(日) 17:11:27
>>510
TextBox.AutoCompleteMode
TextBox.AutoCompleteSource
512デフォルトの名無しさん:2006/04/02(日) 17:38:17
さんくす。v1.1 が対象だから直接扱うのはムリだけど、情報をたどっていったら IAutoComplete インターフェイスにたどり着いた。
なんとかがんばってみるわ。
513デフォルトの名無しさん:2006/04/02(日) 19:24:51
>>508
>>509
>>510
>>510
ありがとう
原因がわかるまで何度もコード手直しして
たまたま、msgboxを//で囲んだらうまくいった
こういうことってすごく初歩的なことなのかな?
やっぱ本とか買わないとプログラミングって難しいですね
ヘルプみても説明の説明がほしい感じ。専門用語だらけだから
514510:2006/04/02(日) 20:19:53
ん〜。ごめん。確かにやりたかったのはオートコンプリートなんだけど、
TextBox.AutoCompleteSource とか IAutoComplete ではインテリセンスのようなアイコン描画はできないです。・゚・(ノД`)・゚・。

……もう一度、お願いします orz
515デフォルトの名無しさん:2006/04/02(日) 20:25:18
>>510
オートコンプリート風にフォーカスを奪わずにformを表示したいのなら、
以下のコードが参考になると思います。

ttp://www.codeproject.com/csharp/BalloonTipsArticle.asp

んで上下矢印、ENTERだけは奪いたいとかそういう欲求が出てきたら
API呼んでフックなりサブクラス化なりで。
516デフォルトの名無しさん:2006/04/02(日) 23:36:52
Formでやろうと考えるからややこしい。
UserContorolで作って、単純にContorols.AddでOK。
517デフォルトの名無しさん:2006/04/02(日) 23:49:39
>>514
ヒント:WM_MOUSEACTIVATE
518デフォルトの名無しさん:2006/04/03(月) 04:21:42
C#で,Java の BigInteger のような多倍長整数演算を行う方法についての質問です。

http://www.codeproject.com/csharp/biginteger.asp
は,325の階乗を計算させたら,オーバーフローしたとの例外を吐きました。
どうも,Java の BigInteger と異なり,大きさに制限があるようです。

また,
http://ant0x.udap.jp/tips/tips_bigInteger.htm
の方法に従って,J# の BigInteger を使う方法も試してみました。
これなら 1000 の階乗でも計算できるのですが,我がマシンでは30秒近くかかりました。
ソースコード全体を J# で書き直しても,実行速度は変わりませんでした。

一方,同じソースコードを,Java で書き直して,javac でコンパイルして実行してみたところ,
1000 の階乗の計算が 0.03秒しかかかりませんでした。

どうも,J#の BigInteger と,本家 Java の BigInteger は,根本的に計算アルゴリズムが違って,そのために計算速度がこれだけ違うのだと推測されます。

C# で,高速に,メモリの許す限りの桁数の計算をする方法はありませんでしょうか。
よろしくお願いします。
519デフォルトの名無しさん:2006/04/03(月) 04:47:00
>>518
ソースあるんなら、制限変更すればいいんじゃないの?
520デフォルトの名無しさん:2006/04/03(月) 05:05:07
>>519
CodeProjectのBigInteger.csを見ると,
try{
    for(int i = 0; i < bi1.dataLength; i++){
        if(bi1.data[i] == 0)    continue;
        ulong mcarry = 0;
        for(int j = 0, k = i; j < bi2.dataLength; j++, k++){
// k = i + j
ulong val = ((ulong)bi1.data[i] * (ulong)bi2.data[j]) + (ulong)result.data[k] + mcarry;
result.data[k] = (uint)(val & 0xFFFFFFFF);
        mcarry = (val >> 32);
        }
        if(mcarry != 0) result.data[i+bi2.dataLength] = (uint)mcarry;
    }
}
catch(Exception){
        throw(new ArithmeticException("Multiplication overflow."));
}
こんな感じで例外を投げているので,例外の発生源を突き止めるのが大変そうです...
521デフォルトの名無しさん:2006/04/03(月) 10:47:28
>>520
単純にmaxLengthを増やせばいいんじゃないの?
522デフォルトの名無しさん:2006/04/03(月) 11:50:18
>>518
もしターゲットのプラットフォームを"Any"にしてビルドしてるんなら、
"X86" だかなんだかにしてみては?
漏れの今書いてるアプリはこれで実行速度が10倍以上変わる。
523デフォルトの名無しさん:2006/04/03(月) 12:15:17
単に多倍長演算ライブラリをC#から使いたいんなら、
C++ のライブラリ拾ってきて、C++/CLI でラッピングして Maneged コードにして、
それを C# から呼べばいいのでは。
524518:2006/04/03(月) 13:06:59
>>521
確かにその通りでした。。。

>>522
それも試してみました。
ですが,劇的な変化は特に見られませんでした。

>>523
なるほど。しかしラッピングが面倒そうなので今回はパスとします。。。

今回のテストコードは
http://up.spawn.jp/file/up15828.zip
に置いておきます。
nmake test
でテストできます。

結果は,概ね
Java≒Ruby > C# > J#
という順位になりました。

ご意見をお待ちしております。
525デフォルトの名無しさん:2006/04/03(月) 13:09:51
アルゴリズムが違うもの使って速度比較というのもどうかと思うが。
526518:2006/04/03(月) 13:16:54
>>525
はい。全くその通りであります。
>>524では言語の優劣を論じたように書いてしまいまして申し訳ありません。
あくまで,その言語の付属ライブラリ(C#のは配布されている最も有名なライブラリ)の速度比較をしたつもりであります。
527デフォルトの名無しさん:2006/04/03(月) 16:15:35
んなミニマムテストにどんな意義が?
限界を求めるならトライアンドエラーではなくそれぞれのコンパイラの性質について調査したほうが良いと思うが
極限を測るのに現象ベースじゃ解は得られないよ
528デフォルトの名無しさん:2006/04/03(月) 16:23:38
Form1内のあらゆるメソッドからForm2のプロパティの値を扱う場合

@Form1のどこからでも扱えるようにForm1のフィールでForm2をインスタンス化して
Form1のどのメソッドからでもForm2のプロパティを扱えるようにする

AForm1の1つのメソッドでForm2をインスタンス化して、Form1の他のメソッドは
Form2のプロパティを引数として得ることで処理する

BForm1の1つのメソッドでForm2をインスタンス化して、Form1の他のメソッドは
Form2をインスタン化したオブジェクトを引数として得ることで処理する

Cどれでもいい

どれがもっとも適切なんでしょうか?Aでやると、同じようなコードが大量になります。
そもそも、Form1のメソッドでの処理をすべてForm2にやらせたほうがいいのでしょうか?
529デフォルトの名無しさん:2006/04/03(月) 17:12:56
>>528
D設計を見直す
530デフォルトの名無しさん:2006/04/03(月) 17:22:05
>>528
Form1とForm2が何だか知らんが、インスタンスをどう保持すべきかを考えろ

Form2はForm1のどこからでもってことは、Form1が存在している間はForm2が必要ってことだろ
ではForm1が存在しなくなったらForm2はどうするの?
Form1の子としてForm2が存在するなら、Form1のprivateな変数としてForm2のインスタンスを受け取ればいい
Form1とForm2の寿命に関連性が無いなら、Form1とForm2をインスタンス化する別のクラスでそれぞれのインスタンスを保持して、Form1のコンストラクタでForm2のインスタンスを受け取るとかすればいい

目的だけから実装を検討しても後でスパゲティになる
>>529の言うように設計を見直し、ちゃんとクラス設計をするのが正しい解だと思うが
531デフォルトの名無しさん:2006/04/03(月) 17:27:31
>>518
よくわからんけど、Javaのライブラリの方がネイティブのコードで
書かれてるんじゃないの?
532デフォルトの名無しさん:2006/04/03(月) 17:35:46
>>531
それで1000倍の差はつかないんじゃない?
533デフォルトの名無しさん:2006/04/03(月) 18:50:15
>>529
>>530
form1のダイアログとしてform2を開いて、そこのtextboxの内容によって
frm1のtextboxにどのように値を入れるかという処理をしたかったんですが

Form2 frm2=new Form2()
frm2.ShowDialog(this);

addText(frm2)

private void addText(Form2 text)
{
}
みたいにすることで、コードが少し減りました。
534デフォルトの名無しさん:2006/04/03(月) 18:59:53
CodeProjectの BigInteger で maxLength を 300 にして 1000! を計算すると
16msec くらいだった。Java のは未計測。

ホントに J# のアセンブリの BigInteger がそんなに遅いなら、
CodeProject の奴を上限無しに改修して使ったほうが良さそう。
535デフォルトの名無しさん:2006/04/03(月) 19:38:45
>>533
マジで設計見直した方がいいんじゃね?
addTextの引数の名前が text なのに Form2 はないだろ・・・

まあ処理自体はそれでいいと思うけど
Form2にプロパティつくったほうがよくね?
DialogResultとかもプロパティがあるくらいだから。
536528:2006/04/03(月) 19:49:57
>>535
一応プロパティはあります
class Form2
{
public string Address
{
get{retrun this.textbox1.text;}
set{this.textbox1.text=value;}
}
}
見たいな感じで、設計と言われてもどうすればいいのかがよくわからないんです
いつも作ってて迷うのが、変換や処理が必要なデータの受け渡し、受け取りをFORM間でする場合に
どっちに処理をさせるかってのがわからないんです。
どっちもでいえけるし、いろんな別のやり方もあるし・・・
こういうことを迷わずできるようにするにはどういうことを勉強すればいいんでしょ?
何かキーワード教えてください
537デフォルトの名無しさん:2006/04/03(月) 19:53:24
>>536
こういうコードが期待されている。

using (Form2 frm = new Form2()) {
 if (frm2.ShowDialog(this) == DialogResult.OK) {
  this.addText( frm2.text );
 }
}
538デフォルトの名無しさん:2006/04/03(月) 20:01:42
>>536
処理の責任を明確にしないから悩む
大きな枠として良く言われるのはn階層って概念
例えば、プレゼンテーション(表示や入出力)/ビジネス(計算)/データ(データベース入出力)と処理の担当を明確にすれば悩まない。

君の例で言えば、Form2は入力に特化すべきで、プロパティが表現するのは「ダイアログから入力された結果」だけ
入力結果を勝手に書き換えてはいけない
ただし、入力結果をダイアログ上で処理するのであれば、ダイアログ内でも処理層を考えて実装し、ダイアログの結果として何をプレゼンテーションすべきか仕様を練る

みんなが設計を見直せと言うのはこういうこと
ちゃんとしたポリシーで実装していれば、どこでデータを処理するかとか悩むはずも無い
539528:2006/04/03(月) 20:21:26
>>537
>>538
なんとなく見えてきた気がしました
FORM1は表示でFORM2はデータ入出力で変換処理は別クラスを設ければいいのかな?
それぞれのクラスがどういう役目をするのかを与えてやらないから混乱するんでしょうね
今私のプログラムはあっちこっちのフォームで変換処理などがされてて
自分でももう訳がわからなくなってます
作りながら考えて、コードの打ちやすい方に書いてって曖昧なことをしてたのがだめだったんですね
設計見直して見ます。ありがとう。
540デフォルトの名無しさん:2006/04/03(月) 21:15:40
>>539 自分の中の基本はクラスがおのおの自分のことだけに専念しほかの人のことをほとんど知らない疎結合にすること。
よくわからんけど、例示の例ならForm1の内部に_selectedTextメンバ作ってForm2の存在はなるべく多くのメソッドで知ることがないようにするかも。
541デフォルトの名無しさん:2006/04/04(火) 00:05:35
あるクラスXXService@モジュールAが 状態のパラメータとして外部@モジュールB から
文字列値(アプリ起動中何度か変更される可能性がある)が必要だという場合に

1.XXService側にSetterを作って、セットする側(モジュールB)が値が変更される度にXXService側にPushする
2.XXService側に文字列を返すデリゲートをセットできるようにする
3.XXService側に文字列を返すinterfaceをセットできるようにする
1.がちょっと面倒だったんで2.で実装したんだけど、何か問題ありますかね?
542デフォルトの名無しさん:2006/04/04(火) 00:07:11
>>541 まず日本語が問題だと思う。
543デフォルトの名無しさん:2006/04/04(火) 00:14:33
>>541
2で問題なし。次!
544デフォルトの名無しさん:2006/04/04(火) 00:26:23
すいません。彼女の作り方を教えて下さい

1.引き篭もりをやめて外に出る
2.エロゲで彼女を見つける
3.妄想で彼女を作る
545デフォルトの名無しさん:2006/04/04(火) 00:31:50
死ねば楽になりますよ
546デフォルトの名無しさん:2006/04/04(火) 00:48:55
>>544 かあちゃんで
547デフォルトの名無しさん:2006/04/04(火) 01:04:26
母親とやった奴の大半は自殺するらしいよ
マジレスすると
PCに回ってる資金で雑誌でも買って服装の研究すればいいんじゃね?
548デフォルトの名無しさん:2006/04/04(火) 01:43:06
オサレすれば女にモテるのか・・メモっとこ
549デフォルトの名無しさん:2006/04/04(火) 03:42:50
だめなやつはなにをやってもだめ
550デフォルトの名無しさん:2006/04/04(火) 10:01:51
ニートだろうがエロゲしまくってようが心の底からハードオタクだろうがイケメンには女が集まる
それどころか「イケメンなのに」ってギャップに惹かれる女もいる
ブサメンは外に出るだけでは無駄、努力しろ
551デフォルトの名無しさん:2006/04/04(火) 10:04:29
外に出るだけ無駄、と読んで引きこもってろって事かと納得しかけた
552デフォルトの名無しさん:2006/04/04(火) 11:26:51
何このスレ違いの連続カキコ
553デフォルトの名無しさん:2006/04/04(火) 12:58:48
まず彼女クラスの設計から入れよ
554デフォルトの名無しさん:2006/04/04(火) 13:02:33
設計から入ってその通り行くわけねーだろ
ウォーターフォールで恋愛できたら苦労しない
恋愛はアジャイルで行こう
555デフォルトの名無しさん:2006/04/04(火) 13:54:52
彼女クラスはシングルトンにすべきですか?
それとも複数インスタンスの生成破棄を繰り返すべきですか?
556デフォルトの名無しさん:2006/04/04(火) 14:11:21
たぶんメモリ割り当てに失敗するから心配するな。
557デフォルトの名無しさん:2006/04/04(火) 14:12:59
C#ってのは静的束縛ですか?それとも動的束縛ですか?
558デフォルトの名無しさん:2006/04/04(火) 14:19:57
いい加減うぜぇ
559デフォルトの名無しさん:2006/04/04(火) 14:39:59
http://www.uploda.org/uporg356003.cs

C#学習開始10分でこんなの作ったんだけどセンスとしてはどうかな?
560デフォルトの名無しさん:2006/04/04(火) 15:18:47
は?こんなんでセンス計れ言われても
とりあえずツッコミはある
・文字インジェクション未対応でセキュリティリスクがある
・引数チェックが無いのでセキュリティリスクがある
・tryがあるのにcatchが無いから例外処理を正しく扱えてない
・変数のスコープが適切じゃない
・無駄に変数を使用している
・変数名に意味を持たせていない
561デフォルトの名無しさん:2006/04/04(火) 15:21:27
>>560
ありがとう

結構難しいもんだな
562デフォルトの名無しさん:2006/04/04(火) 15:34:41
 ・文字インジェクション未対応でセキュリティリスクがある
 ・引数チェックが無いのでセキュリティリスクがある
これはWebアプリではない。DBアクセスもない。
 ・tryがあるのにcatchが無いから例外処理を正しく扱えてない
catchは必要無ければ書く必要なし。例外処理の正しさとは無関係。

むしろ気になるのは、readerをStreamReader.Nullで初期化していないこと。
そうすれば、finally内で無駄にnull判定しないで済む。
563デフォルトの名無しさん:2006/04/04(火) 16:28:59
>>562

>  ・文字インジェクション未対応でセキュリティリスクがある
>  ・引数チェックが無いのでセキュリティリスクがある
> これはWebアプリではない。DBアクセスもない。

ちょ、ちょ、おま
StreamReaderは絶対バグ無しと確信できるか?
巨大な引数やバグを誘発する引数によって異常な動作を起こさないと確信できるか?
>>560はそういう点からインジェクション攻撃対応と引数チェックを書いてると思うんだが
Webアプリじゃなきゃ引数チェック不要って発想は穴を作るだけ

>  ・tryがあるのにcatchが無いから例外処理を正しく扱えてない
> catchは必要無ければ書く必要なし。例外処理の正しさとは無関係。

このアプリは引数を元に動作するから内部完結せず、例外が発生する可能性が高い
しかも引数チェックをしていないし
にも関わらず例外処理を突っ込んでいないのは「不必要だから」とは思えないが
564デフォルトの名無しさん:2006/04/04(火) 16:29:36
SQLインジェクションと勘違いして無いか?
565デフォルトの名無しさん:2006/04/04(火) 16:45:11
>>563
「インジェクション攻撃対応」ってw
>>559のアプリを起動するときに引数を渡すのは
どこから誰が行うのかな?ウェブから第三者が
行うのかな?そんなことはないだろう?
566デフォルトの名無しさん:2006/04/04(火) 16:48:06
>>563
チェックするコード書いてよ
567デフォルトの名無しさん:2006/04/04(火) 16:48:11
おまえら何アホくさいこと言いあってんだよ
568デフォルトの名無しさん:2006/04/04(火) 16:49:14
aga
569デフォルトの名無しさん:2006/04/04(火) 17:13:56
おらも後学のために563の書いたソースみてみたい
570デフォルトの名無しさん:2006/04/04(火) 17:15:08
異論反論インジェクション!
571デフォルトの名無しさん:2006/04/04(火) 17:48:00
おまいらおめでたいな
572デフォルトの名無しさん:2006/04/04(火) 17:52:15
場合によってはチェックしたほうがよい、くらいでいいんちゃうの?
俺もリーダーの初期化が気になる。
ていうか、こんなのループ内で宣言すりゃいいじゃん。
573デフォルトの名無しさん:2006/04/04(火) 17:53:24
チェックのないエントリポイントはセキュリティホールの可能性となる
>>563はセキュアアプリケーションコーディングの常識を書いてるだけじゃないかと
ちょっとばかし日本語は不自由そうだが
574デフォルトの名無しさん:2006/04/04(火) 17:57:17
>>565
その発想はあまりにお目出度過ぎる
他のアプリケーションの不具合を付いてシステムに介入するウィルス・トロイは多くいる
そういう悪意あるアプリケーションがネット等を通じて進入し、ローカルのアプリケーションを突かないと断定できるか?
ローカル利用限定アプリであっても、それでは脅威モデルの設計が稚拙過ぎると思うが
575564:2006/04/04(火) 18:01:52
あー、もしかしてオレが原因?
オレの

> SQLインジェクションと勘違いして無いか?

>>562宛だからね
>>562は文字インジェクションとSQLインジェクションを混同してるんじゃないかと思ってね

>>563
要は引数経由で危険な文字列がインジェクションされるかもしれないってことだよね
576デフォルトの名無しさん:2006/04/04(火) 18:02:04
>StreamReaderは絶対バグ無しと確信できるか?
>巨大な引数やバグを誘発する引数によって異常な動作を起こさないと確信できるか?
で、実際にバグの有無もどのようなバグかもわからないバグに対しての
引数チェックのコードはどう書くわけ?
577デフォルトの名無しさん:2006/04/04(火) 18:03:00
なんでこうPGってのは頭固くて依怙地そうな文章しかかけないのか
578デフォルトの名無しさん:2006/04/04(火) 18:09:51
>>576
引数が求めるものだけ渡すってことだろ
引数がstringだけってことはこれだよね

StreamReader コンストラクタ (String) (System.IO)
http://msdn2.microsoft.com/ja-JP/library/f2ke0fzy(VS.80).aspx

とすると、引数に必要な条件は以下となる
1.ファイルパスとして有効な文字列数であること
2.ファイルパスとして有効な文字列であること

また、このアプリの仕様的な制限を加えても良いかと
例えばこんなところ
・ローカルのパスであること
・UNCパスであること
・絶対パスであること
・相対パスであること

もしかして特定の書き方をしたら異常動作を起こすバグがあるかもしれない。
そしてそれは知られていないかもしれない。
勿論それに対して対処するコードは組めない。
だとすれば、現時点で判明している最低限の制限である「引数が要求する値」のチェックは組み込むべき。
外部から入力される値に対して「絶対安全」という前提で組むのは良くない
579デフォルトの名無しさん:2006/04/04(火) 18:12:10
>>578 ごめん。ずぼらな自分には無理です・・・
580デフォルトの名無しさん:2006/04/04(火) 18:13:27
>>577
このスレ見ているお前も同じ人種だろw
581デフォルトの名無しさん:2006/04/04(火) 18:17:23
MulticastDelegateオブジェクトとして受け取ったデリゲートを
呼び出すにはどうしたらいい?
582デフォルトの名無しさん:2006/04/04(火) 18:18:11
DynamicInvoke
あるいはキャスト
583デフォルトの名無しさん:2006/04/04(火) 18:38:22
誰かが>>559を訂正したコードを書けばいい
584デフォルトの名無しさん:2006/04/04(火) 18:49:52
チェックしないてのもありだと思うけどな。
もちろん使い方による話だよ。
明確に使い方に条件があるならそれをチェックすればいい。
ないならリーダーにまかすのもありだろ?
585デフォルトの名無しさん:2006/04/04(火) 18:52:48
>>584
論外
586デフォルトの名無しさん:2006/04/04(火) 18:57:21
>>585>>559を訂正したコードを書けばいい
587デフォルトの名無しさん:2006/04/04(火) 19:38:45
どう論外なのか詳しく。
588デフォルトの名無しさん:2006/04/04(火) 19:43:26
初めて10分程度の奴に何マジレスしてるんだか
初心者叩きしてる奴も程度が知れてる
589デフォルトの名無しさん:2006/04/04(火) 19:43:58
StreamReaderを信用するなんて論外だ
590デフォルトの名無しさん:2006/04/04(火) 19:45:22
StreamReaderを信用するなんてムリーダー
591デフォルトの名無しさん:2006/04/04(火) 19:48:17
Stringを信用するなんて論外だ
592デフォルトの名無しさん:2006/04/04(火) 20:00:31
Microsoftを信用するなんて論外だ
593デフォルトの名無しさん:2006/04/04(火) 20:07:58
ストリングを信用するなんてスリリングだ
594デフォルトの名無しさん:2006/04/04(火) 20:42:15
おまえら…
595デフォルトの名無しさん:2006/04/04(火) 21:12:52
お前ら仕事のしすぎだ。休め。
たっぷり睡眠をとれ。
596デフォルトの名無しさん:2006/04/04(火) 21:29:10
二徹の俺に対する嫌味かコラ
597デフォルトの名無しさん:2006/04/04(火) 21:30:15
初心者ネタならこっちに書け

ふらっとC♯(初心者用) Part7
http://pc8.2ch.net/test/read.cgi/tech/1141458468/
598デフォルトの名無しさん:2006/04/04(火) 22:55:42
外部 DLL などに含まれているアイコンなどのリソースって読み込めますか?
c# で作成したリソースの読み込みなどはサンプルがありますが、普通の exe, dll 等は
見当たりません。
こういうことって出来るんでしょうか?
599デフォルトの名無しさん:2006/04/04(火) 23:01:11
Win32API 使うことになる。
600デフォルトの名無しさん:2006/04/04(火) 23:02:32
>>574
いや、そもそもトロイに入られた時点でアウトだから。。。
マシンに進入できたトロイがわざわざローカルのアプリなんぞ狙う必要は無い。
601デフォルトの名無しさん:2006/04/04(火) 23:17:23
>>599
素早いお返事ありがとうございます。リソースを読み込むWin32API 名前を教えていただけ無いでしょうか。
602デフォルトの名無しさん:2006/04/04(火) 23:27:34
ちょっとは調べたのか?
調べても見つからなかったというのなら検索したキーワードを言ってみろ。
603デフォルトの名無しさん:2006/04/05(水) 09:25:41
>600
>574にとっては不十分なんだろう。
何を神経質になっているのか皆目見当がつかんが。
cgiで使われる場合にぃぃとか言い出すのかな。
604デフォルトの名無しさん:2006/04/05(水) 10:21:53
システムに侵入を許した時点でなんでもありだ。
侵入されないためならまだ話は分かるが。
巨大な入力があったらと言うが、
アプリが起動してる時点でそのチェックはもはや手遅れ

場合による、使い方によると言うのさえ論外って
どういう事なんだ?
605デフォルトの名無しさん:2006/04/05(水) 11:34:41
>>604
たぶん「引数に明確な条件が無いならリーダーに任す」
というのが論外なわけでは?

上流工程での仕様で所与の条件がないなら、
設計段階で条件を適当に作って、
その仕様に基づいてコードを書くべき。
仕様がないとテスト項目も作成できない。

まぁ漏れなんか論外プログラマだから、
FileOpenDialog で得られたパスをそのまま
使ってファイル開いたりするけどね。
606デフォルトの名無しさん:2006/04/05(水) 11:52:07
Existくらいしろよwwwww
607デフォルトの名無しさん:2006/04/05(水) 11:59:03
604のようなアマグラマが危険なプログラムを作るという事が良く分かった
608デフォルトの名無しさん:2006/04/05(水) 12:01:48
>>606
Exist で検査するファイルパスが有効なものかどうかチェックするコードきぼん
609デフォルトの名無しさん:2006/04/05(水) 12:28:43
くだらないセキュリティ論で自説の展開したいならよそ行ってやれよ
ここはC#相談室だ
610デフォルトの名無しさん:2006/04/05(水) 12:33:36

Encoding.ASCII.GetString(bytes);

ってしたときにVS2003とVS2005で同じbytesに対して結果が違うのですが、
何が変わったんでしょうか?
ためしたbytesは0xb5 0xeb 0x2dです。
611デフォルトの名無しさん:2006/04/05(水) 12:59:50
今は仕様がない状態なんじゃないの?
でファイルパスとして正しいかどうかの条件も明確に出来ない現状で
勝手なチェックを入れることでどれだけ安全にできると?
それは作者のやりたいことを阻害しないチェックになるのか?

別に本来チェックすべきだってことには異存はないけど
今みたいなためしに作ったコードにこうするべきなんて仕様は定義できないし、場合によっては渡されたものは自作コード部分では受け入れる
ってのもあるっていってんたよ。

具体的にこれがどんだけ危険なのか、
てきとうなチェックを入れることでどんだけ安全になると言うのか
いってみてくれ

例えばOSのコマンドで使い方次第で危険なものなんていくらでもあるだろ

やっぱり誤解されそうだが、基本的にチェックするべきってのに異存はない。
612デフォルトの名無しさん:2006/04/05(水) 12:59:55
>>609
C#にはセキュリティの概念が無いのか?
613デフォルトの名無しさん:2006/04/05(水) 13:05:28
Directory.GetFilesはなんで引数searchPatternにワイルドカードが
指定出来るのに↓みたいな仕様なんだろ

>>拡張子の長さがちょうど 3 文字の場合の searchPattern の一致の動作は、
>>拡張子が 3 文字を超えている場合の動作と異なります。ちょうど 3 文字の
>>searchPattern の場合は、3 文字以上の拡張子を持つファイルが返されます。

hoge.txtは拾いたくてhoge.txtaaaは拾いたく無い場合にはどうしたらいいんだろ?
614デフォルトの名無しさん:2006/04/05(水) 13:05:52
>>606
Existsはファイルシステムにアクセするから不適切

>>608
無難なのはファイルの有無を問わないIsPathRootedかな
文字列そのままがfalseの場合は相対パスの可能性があるんでカレントパスとCombineしてチェック
それでもfalseならパスではないということで弾く
やるならこの後Existsかな
615デフォルトの名無しさん:2006/04/05(水) 13:08:57
とりあえずだ、セキュリティを語るならこれ読んでからにしてくれ

プログラマのためのセキュリティ対策テクニック
https://www.microsoft.com/japan/msdn/net/security/securecode/

以上
616デフォルトの名無しさん:2006/04/05(水) 13:15:54
流れに乗って質問させてください
HDDの中身をすべて削除するようなプログラム作りたいんですけど
2005で作った場合、誰が作ったかexeファイルだけでバレたりしますか?
617デフォルトの名無しさん:2006/04/05(水) 13:17:29
>>611

 > 別に本来チェックすべきだってことには異存はないけど

いや、漏れは異存あるよ。
無駄なチェックはやるべきじゃないと思うよ。
とりあえず安全のために何でもしとけ、って思想には賛成できない。

>>560

 > ・文字インジェクション未対応でセキュリティリスクがある
 > ・引数チェックが無いのでセキュリティリスクがある

についてなんだけど、具体的な攻撃機序(メカニズム)を説明して欲しいな。
でないと、無用なチェックと言われても仕方がないと思うが。
618デフォルトの名無しさん:2006/04/05(水) 13:18:13
>>616
何故バレると困るのか教えて欲しい
619デフォルトの名無しさん:2006/04/05(水) 13:27:09
>>616
バレる場合もあるよ。
.NETアセンブリにはいろいろな情報を埋め込めるから
逆アセンブラ(ILDASM)使ってそれを知ることができる。
心配なら作った後でILDASMで確認しる。
620デフォルトの名無しさん:2006/04/05(水) 13:27:48
極限までセキュアにするのであるなら、エントリポイントに対するチェックは考えられる限りすべてやるべき
例えば金融系モバイル用アプリなら脅威モデルとして直接操作もありうる
未知の問題に対する保険の意味でも「既知の制限」を実装するのは悪いことではない



アプリ環境の前提もなくセキュリティの基準を語っても何の意味もないわけで

>>617
例えば「StreamReaderには未解決のバッファオーバーフローの問題によって管理権限を奪われる」という問題があるかもしれない。
そしてその攻撃方法は「非常に大きな文字列を唯一の引数として渡すこと」かもしれない。
実際これは存在しない(はず)わけだが、これらの問題が存在しないことを証明するのは非常に困難(悪魔の証明)
そしてその困難さを付いてくる顧客もいる。(私が金融系モバイルシステムを発注したなら、どこまで安全かとことん問い詰めるかもしれない)
そのため、次善策として例えば「ファイルパスとして有効な文字列しか渡さない」という方法を実装できる。

とまあ言い連ねればキリがないわけだが、そういう論理も展開できる。
そしてそういう次善策を極限まで求められる業界(金融系・個人情報系)もあるわけで。
ま、普通はここまで考える必要は無いと思う。アプリ環境次第。
621デフォルトの名無しさん:2006/04/05(水) 13:29:19
622デフォルトの名無しさん:2006/04/05(水) 13:32:25
AppDomain上で動くマネージド・コードなら
バファオーバーフロー問題は起こらないと聞いたが。。。
623デフォルトの名無しさん:2006/04/05(水) 13:38:22
むしろ

    public static void Main(string[] args)

の string[] に不正な文字列……例えば巨大な文字列を入れることを防ぐことは出来ないよ。
そして万一 string にバグがあった場合、それはセキュリティホールになる可能性がある。


……みたいに神経質になるんだったら、俺は出来ることだけ考えるよ。面倒すぎる。
624デフォルトの名無しさん:2006/04/05(水) 13:41:32
>>622
マイクロソフトの公式見解である「AppDomain上ならバッファオーバーフローの問題は起きない」を信用してくれる顧客もいるが、
IT業界に詳しくない顧客は「何だかんだ言ってもセキュリティ問題で毎月ニュースになるミクロソフトの発言なんて信用できねーよ」と言うかもしれない
運用管理側の人々は「限界まで開発者としての安全性を保証してください。」って言ってくるだろうし
もしものときに「だってマイクロソフトが安全って言ってたから」じゃ通用しないわけで

いままで「絶対安全」と言われながら穴があった例も多数あるわけだし
625デフォルトの名無しさん:2006/04/05(水) 13:44:00
これを読むこともお勧めする

Amazon.co.jp:脅威モデル セキュアなアプリケーション構築: 本
http://www.amazon.co.jp/exec/obidos/ASIN/4891004576/
626デフォルトの名無しさん:2006/04/05(水) 13:45:26
できるかぎりやる
それでも穴が空いたら謝る
そんだけ
627デフォルトの名無しさん:2006/04/05(水) 14:10:03
パッケージソフトなら使用許諾契約書に免責事項入れときゃいいけどなぁ・・・
628デフォルトの名無しさん:2006/04/05(水) 14:10:13
>>612
セキュリティの概念論や方法論は特定の言語に結びつくものなのか?
629デフォルトの名無しさん:2006/04/05(水) 14:15:07
>>628
概念論はそうだが、言語が違えば方法論は違ってくる。
630デフォルトの名無しさん:2006/04/05(水) 14:16:00
>>619
ありがとう。ILDASM調べてみます
631デフォルトの名無しさん:2006/04/05(水) 14:29:00
>>627
アプリケーションソフトだと瑕疵担保期間があるからな
それが終わっても運用フェーズにはいるから手離れするわけじゃないし
632デフォルトの名無しさん:2006/04/05(水) 15:35:45
openFileDialogのボタンの文字って変更可能でしょうか?
633デフォルトの名無しさん:2006/04/05(水) 15:58:56
無理
634デフォルトの名無しさん:2006/04/05(水) 16:00:23
vbよりc#のほうがいいの?
635デフォルトの名無しさん:2006/04/05(水) 16:04:39
VB と言うのが VB7 以降のことなら、大差ない 好きな方を選べ
636デフォルトの名無しさん:2006/04/05(水) 16:26:24
>>635
アリガd
VBはVB7以前の知識しかなく、C++は基礎知識のみ、C#は知識ゼロなんだけど、
大差ないんだったら、これを機会に C#を覚えたほうがいい?
637フリープログラマ:2006/04/05(水) 16:44:41
VB.NETとC#の両方を覚えた方が絶対にいいです。
仕事を得やすいです。
638610:2006/04/05(水) 16:46:04

すいません。
どなたか>>610
お願いします。
639デフォルトの名無しさん:2006/04/05(水) 16:53:10
非 ASCII 文字の解釈が変わったんだろ
Encoding.ASCII に非 ASCII 文字を渡してどうなるかなんて別に定義されてないし
640デフォルトの名無しさん:2006/04/05(水) 18:04:08
C#で、赤外線付PC、又は赤外線を後付したPCの赤外線を操作するアプりを作成することはできますか?
例えば、リモコンアプりとか。

できるのならばさっそく赤外線商品をサーチしようと思うのですが
641デフォルトの名無しさん:2006/04/05(水) 18:05:01
C,C++のAPIでもあるならどうとでもなるだろ。
642640:2006/04/05(水) 18:20:46
>>641
回答ありがとうございます。
どうとでもなるのであればさっそくサーチしようと思います。
ついでにAPIも並行で探しながら、あればそれを使って簡単に作れそうですね。
643氏天国:2006/04/05(水) 18:26:08
644デフォルトの名無しさん:2006/04/05(水) 18:28:34
>>621
これからは大量破壊兵器の証明に変えるえるべきだな。
645デフォルトの名無しさん:2006/04/05(水) 23:52:35
>>614
OpenFileDialogで開いているカレントパスはどうやって取得するの?
ていうか、OpenFileDialog.FileNameってパス付だし、Combineする必要ないんじゃ?

Existsで問題ないでしょ。Existの仕様をみれば
そもそもCheckFileExistsにしてればそのまま開いちゃっていいし。
どの辺が論外プログラマなの?

アプリはAPIの仕様を元に組むので基本的には「〜〜かもしれない+無用のチェック」はする必要はない。というよりもしてはならない。
仕様を把握しないでとりあえずチェックしておけ、みたいなのは問題外かと
「無用のチェックで読み辛くなる、処理が追い辛くなるリスク」 >> 「未知のAPI(下物)によるセキュリティホールリスク」
それでもやれというなら、相当のコストを払ってもらわないとね。
646デフォルトの名無しさん:2006/04/06(木) 00:13:07
ウェブの閲覧履歴(Documents and SettingsのHistory)の内容を
エクスプローラでみるのと同じようにビューとして表示したいのですが
どうすればよいでしょうか?
WebBrowserコントロールでDocuments and SettingsのHistoryを
パスに指定するとビューとして閲覧はできるのですが、
現在選択しているファイルがなんであるかを知る方法が見つかりませんでした。
647デフォルトの名無しさん:2006/04/06(木) 00:44:54
>>645

> OpenFileDialogで開いているカレントパスはどうやって取得するの?

ん?元質問者はコマンドライン引数としてパスを受け取っているけど
606の「まぁ漏れなんか」以下はそれまでの流れとは無関係な独り言だろ
少しは流れ嫁

> それでもやれというなら、相当のコストを払ってもらわないとね。

それでもやれって仕事があるわけで
当然相当のコストを払ってもらうわけですが
そもそも業務開発にオレ流は不要で、顧客がどこまでを望むかに対する成果物だけ
べき論もへったくれもないし、それを顧客に押し付けるのは開発者の傲慢
648デフォルトの名無しさん:2006/04/06(木) 00:46:51
>>646
自分でパスを取ってきてListViewなりに表示すればいーやん
WebBrowserがホストしてる内容を取る方がめんどい
649デフォルトの名無しさん:2006/04/06(木) 00:48:35
はいはいもうそのくらいでオレ流を語るのはやめてくれ
不毛で鬱陶しいから
どうしても書きたいならチラシの裏をやるから、これにかいてくれ、な

チラシの裏
http://yuukiremix.s33.xrea.com/chirashi/
650デフォルトの名無しさん:2006/04/06(木) 01:46:15
おれは今猛烈ににセキュリティに気を使ってコーディングしている!
ウッキー!

651646:2006/04/06(木) 07:51:52
>>648
Historyの中身ってエクスプローラでみるとURLのリストが表示されるけど
実際はindex.datって1つのファイルに保存されています。
それを解析する必要があるのでしょうか?
652646:2006/04/06(木) 08:04:06
IEコンポにIUrlHistoryStgってのがあるみたいっすね。
あとは自分で調べます。スレ汚しました・・・
653デフォルトの名無しさん:2006/04/06(木) 09:41:05
コントロール(例えばMultiLineなTextBox)をクライアント領域いっぱいに広げるコードってどうやって書けばいいんですか?
最初にぴっちり広げておいてAnchorsを全部チェックしてみたところ
一見それなりに動いてはいるんですが、
例えばステータスバーを非表示にするとその領域にまで自動的に広がってくれません。
654デフォルトの名無しさん:2006/04/06(木) 10:38:27
>>653
textBox1.Dock=DockStyle.Fill
とやってみたらいかがでそうか(´・ω・`)
655デフォルトの名無しさん:2006/04/06(木) 15:09:02
>>654
あとそのときは、コントロールのZオーダーに気をつけることじゃ。
656デフォルトの名無しさん:2006/04/06(木) 19:18:41
VisualC#.NET 実践講座 という本を読んで、DBアクセスの処理を作ろうとしているのですが、
早速つまづいてしまいました。

本によると、フォームのデザイナを開き、サーバエクスプローラウインドウから、テーブルを
フォームにドラッグすると、sqlConnection1と、sqlDataAdapter1が追加されるとあるのですが、
テーブルをドラッグしても何も起きず、どう進めて良いのかわかりません。
テープルの参照などは問題なくできるのですが、プログラムからどうアクセスするのか、
どうもわかりません。

環境は、VS2005、SQLServer2000です。
どうぞ宜しくお願いします。
657デフォルトの名無しさん:2006/04/06(木) 19:20:12
メニュー項目に日本語つけるとそれが変数名になってしまってハゲウザい。
これってやめられないの?
658デフォルトの名無しさん:2006/04/06(木) 19:20:58
>>656 IDE使ってやると実際に何がおきてるのか判らなくなるので世故世故コード書くことをお勧めします。
659デフォルトの名無しさん:2006/04/06(木) 19:35:57
>>657
Name 書き換えろ。
660デフォルトの名無しさん:2006/04/06(木) 21:04:08
>>656
その本2005に対応してないから無理だよ
661デフォルトの名無しさん:2006/04/06(木) 21:36:35
Trace.WriteLine("RES:2");
と書きますと
アンダーバーが引かれて"リンクにしたがいます"とかツールチップ表示されます。

いったい何の機能でしょうか?
662デフォルトの名無しさん:2006/04/06(木) 21:40:48
.NET C#を始めて体験するのですが、本屋で
マニュアル購入したり、WEBで調査してもわかりませんでした。
CSV読込や配列の場所を読んでも、目的の部分がわかりませんでした。

データ11,データ12,データ13
データ21,データ22,データ23
データ31,データ32,データ33
(縦/横 カンマで区切られた二次元配列---->CSV(TXT)ファイル)

この、カンマで区切られた二次元配列のテキストファイルを
Streamreaderで一行読込(または全部読込)した場合、
どうしても、二次元配列型の変数(バファ)に格納したいのですが、
うまくできません。
x[2,2] <-- この二次元配列が全て埋まるように入れたいのですが
どうしても、x[0,0][1,0][2,0]にしか入りません。
うまく、カンマを区切りと認証して、横の配列にも格納
したい場合どのように記述すればよろしいのでしょうか?
ご指導お願いいたします。m(_ _;m)三(m;_ _)mペコ
663デフォルトの名無しさん:2006/04/06(木) 21:46:53
>>662
x の宣言と初期化はどうなってるんだ
664デフォルトの名無しさん:2006/04/06(木) 21:51:13
>>663 返信ありがとうございます。

@配列の宣言→string [,] x;
Aメモリ確保→x = new string [2,2];

すみません、二日前に始めたばかりなので、
初期化はわかりません。。
すみません。
665デフォルトの名無しさん:2006/04/06(木) 22:04:38
>>662はマルチ
666デフォルトの名無しさん:2006/04/06(木) 23:17:23
String.Sprit(',')で得られたString[]をArrayListに順次放り込んでいって最後にToArray
667デフォルトの名無しさん:2006/04/06(木) 23:53:20
>>666
それだと string[][] になるような・・・
668デフォルトの名無しさん:2006/04/07(金) 00:10:26
マルチ歓迎
こっちはいちいち関連するスレ全部巡回してるわけじゃないから
同じ質問でも情報でもなるべくたくさん書き込んでくれ
いまどきたかがマルチぐらいでリソース枯らすような鯖なんて
使ってる掲示板サイトなんて無いから。
669デフォルトの名無しさん:2006/04/07(金) 00:13:27
まあおまいはそうしろ。
670デフォルトの名無しさん:2006/04/07(金) 00:52:01
staticクラスが使い勝手がいいので何も考えずに使っているんですけど
基本的に複製しないでプログラムにひとつだけのものや機能だけを何度も使う場合やフォーム上の自作コントロールなどは
staticでも問題ないですか?
いろんなクラスから自由に使えるので、いちいちインスタンス化しなくても済むので便利なんですけど
671デフォルトの名無しさん:2006/04/07(金) 00:56:01
機能だけを使うのは分かるが、コントロールが static というのは理論的には変だな。
まあ自分しか使わないのなら別にどうでもいいんじゃね。
672デフォルトの名無しさん:2006/04/07(金) 03:59:14
SMTP-AUTHでメール送りたいんですが、SmtpClientとMailMessageを
使ってできますか?
673デフォルトの名無しさん:2006/04/07(金) 07:24:37
this.Load += new System.EventHandler(this.Form1_Load);

Loadなどのイベントに対して
何個のハンドラが追加されているか知る方法はありませんでしょうか。
674デフォルトの名無しさん:2006/04/07(金) 07:58:21
>>673
汎用的なのは無い。
675デフォルトの名無しさん:2006/04/08(土) 11:59:19
SortedDictionaryをValueでソートすることはありませんか。
676デフォルトの名無しさん:2006/04/08(土) 12:00:44
×ありませんか
○できませんか
です。
677デフォルトの名無しさん:2006/04/08(土) 12:02:12
それは意味不明すぎるな
678デフォルトの名無しさん:2006/04/08(土) 12:03:35
KeyValuePairのリスト作ってソートするしかないんじゃね
679デフォルトの名無しさん:2006/04/08(土) 12:31:57
foreach (var pair in from p in dictionary orderby p.Value select p) {
    /* DoSomething */
}
こんなの?@C#3.0
680デフォルトの名無しさん:2006/04/08(土) 15:08:41
List<T>.ForEach(Action<T>)で要素の内容を変更してもいいの?
681デフォルトの名無しさん:2006/04/08(土) 15:21:42
>>680
いいんじゃね
俺の感覚だと Predicate<T> で副作用のあることは絶対禁止で
Action<T> ならなんでもOK
682デフォルトの名無しさん:2006/04/08(土) 15:48:09
TreeViewでキー名とラベル名を一緒にしてノード作っているんだけど
ユーザーによってラベルが変更さた場合、キーもラベルと同じにしたいのに
変更できないんですがどうすればいいでしょうか?
同じキーがあるかどうかや、キーによって値を取得したりキーをメインに使っているのに
ラベルが変えられると選択されているノードがどのキーかもわからず
また、新しくノードが使われた場合、ラベル名は被ってないけど、キー名が被ってしまったりするし
なぜ、キーを設定し直せないのか疑問なんですけど
エクスプローラーはどういう構造してるんでしょうか?
みなさんはこういう場合どうしてるんでしょうか?
683デフォルトの名無しさん:2006/04/08(土) 15:59:54
つかキーって何よ。
684682:2006/04/08(土) 16:05:44
public virtual TreeNode Add (
string key,
string text
)
のキーです
685デフォルトの名無しさん:2006/04/08(土) 16:23:20
ほー、2.0 でこんなの増えたんだ。TreeNode.Name プロパティか。
AfterLabelEdit で書き換えれば?

んー、しかしどういう風に使うもんなんだろ。
今までに慣れてた身では思いつかんなぁ。
686682:2006/04/08(土) 16:35:58
>>685
TreeNode.Name
これはラベル名と思い込んでたんだけどキープロパティなのかな?
ちょっと調べてみます

SortedListなどにしても基本的にキーで管理するので
キー名と例えばタイトル名(SortedListに格納するオブジェクト名)を一緒にして管理し易いようにすると思うのですが
タイトル名が変わるとどうするんだ?ってとこでいつも行き詰まります
687デフォルトの名無しさん:2006/04/08(土) 17:52:04
デザイナでフォームとか作ると
buttonHogeHoge.Name = "buttonHogeHoge";
とかやたらに作ってくれるんですが

これ削ってもいいですよね?
削るとファイルサイズがかなり減るんですが
688デフォルトの名無しさん:2006/04/08(土) 17:58:05
以降、デザイナで変更を行わないんだったらな。
Name は変数名と同じになってたはずだから。
689デフォルトの名無しさん:2006/04/08(土) 18:29:31
初歩的なことかもしれませんが、以下のソースを書くと
「未割り当てのローカル変数 'b' が使用されました。」とエラーが出ます。

 int b;
 for (int a = 1; a <= 10; a++)
 {
  b = a;
 } 
 MessageBox.Show(b.ToString());

ところが int b を int b=0 と書き換えるときちんと 10 と表示されます。
バグのような気もするのですが、これって仕様なんでしょうか?
690デフォルトの名無しさん:2006/04/08(土) 18:31:13
仕様です。何を持ってバグといってるのか。
691デフォルトの名無しさん:2006/04/08(土) 18:38:13
次からはフラットスレに書こうな
692デフォルトの名無しさん:2006/04/08(土) 18:39:17
コンパイラがforやifが確実に実行されることを理解してないからそういうエラーとしてはじくって事か。
これってほんとに仕様として定められてるのか?
693デフォルトの名無しさん:2006/04/08(土) 18:49:55
int a;
if(boolHoge) a=1; else a=0;
Console.WriteLine(a);

これはエラーにならないと思うよ
694689:2006/04/08(土) 19:42:18
なるほど。
コンパイルの時点で値が代入される保障がないということですか。
皆さんありがとうございます。分かりました。
695689:2006/04/08(土) 20:55:17
度々すみません。
同様の事をVB6とVB.Netでやってみたら問題なく動きます。
WindowsDevelopersMagazine4月号P23のアンダース・ヘルスバーグのインタビューを読むと
違いがないように思えるのですが。C#の方がより厳格ってことなんでしょうか。

<VB.Net> 動いて10と表示される。
Dim a As Integer
Dim b As Integer
For b = 0 To 10
a = b
Next
Console.Write(a)


<C#2005> コンパイルエラー:未割り当てのローカル変数 'a' が使用されました。
int a;
int b;
for (b = 0; b <= 10; b++)
a = b;
Console.Write(a);
696デフォルトの名無しさん:2006/04/08(土) 20:56:24
vbは0で初期化されてるとかって落ちだったりしないの。知らんけど。
697デフォルトの名無しさん:2006/04/08(土) 20:59:56
Dim ステートメントの解説読め。
698デフォルトの名無しさん:2006/04/08(土) 21:01:18
コンパイル時にそういうちぇくするかしないかの違いだけだろう。
699デフォルトの名無しさん:2006/04/08(土) 21:04:54
Dim
If you do not specify an initialization value for a variable,
Visual Basic initializes it to the default value for its data type.
The default initialization values are as follows:

0 for all numeric types (including Byte).
(略)


つまり
Dim a As Integer

int a = new int();
と同じってこった
700デフォルトの名無しさん:2006/04/08(土) 21:10:43
良くわからんがなんか怪しい香がするttp://www6.atwiki.jp/hakkar0/
701689:2006/04/08(土) 21:26:18
今まで Dim a As Integer と int a は全く同じだと思ってました。
ありがとうござういました。
702デフォルトの名無しさん:2006/04/08(土) 21:27:37
C#も未初期化エラー出すなら遡って0突っ込むくらいの芸があってもいいのにな
703デフォルトの名無しさん:2006/04/08(土) 21:30:08
それはそれでバグの元なのでイヤだな。
大抵の場合に面倒なだけなのは確かだけど。
704デフォルトの名無しさん:2006/04/08(土) 23:59:45
あるフォームに適当なコントロール(ボタンとか)を
動的にForm.Controls.Add()してRemove()して
GC.Collectしてもデストラクタが呼ばれないんですが、なぜなんでしょう。
他で誰も参照してないように見えるんですが。

705デフォルトの名無しさん:2006/04/09(日) 00:08:56
呼ばれるし。
あと Component 派生クラスでデストラクタ(というかファイナライザ)定義しちゃいかんよ。
protected Dispose(bool) をオーバーライドせんと。
706デフォルトの名無しさん:2006/04/09(日) 01:17:43
祐美クラスを作ってコンストラクタで初期化したのですが
ボクのことを好きになってくれません

Class 祐美
{
  private string 好きな人="";

  public 祐美(string name)
  {
     好きな人=name;
  }


Class 健太

   public void 愛してる()
   {
      祐美 ゆみちゃん=new 祐美(健太);
   }
}     
707デフォルトの名無しさん:2006/04/09(日) 01:20:25
取りあえず、設計が間違ってる
708デフォルトの名無しさん:2006/04/09(日) 01:22:08
>>707
祐美はボクの妹なんで設計はあってます
709デフォルトの名無しさん:2006/04/09(日) 01:27:41
new 祐美(typeof(健太).ToString());
710デフォルトの名無しさん:2006/04/09(日) 03:26:48
>>706 色々おかしすぎ。

class 女 {
  private string name = string.Empty;
  private 男 好きな人 = null;

  public 女(string name) { this.name = name; }

  public string Name { get { return this.name; } }

  public 恋する(男 man) { if (man.Isキモいニート) { throw new 絶望的Exception(man.Name); } this.好きな人 = man; }
}

class 男 {
  private string name = string.Empty;
  private bool isキモいニート = false;

  public 男(string name, ) { this.name = name; }

  public string Name { get { return this.name; } }
  public bool Isキモいニート { get { return this.isキモいニート; } set { this.isキモいニート = value; } }

  static void Main() {
    男 俺 = new 男("健太");
    俺.Isキモいニート = true;
    女 妹 = new 女("祐美");
    try { 妹.恋する(俺); }
    catch (絶望的Exception ex) { Console.WriteLine("予期せぬ例外が発生しました。" + ex.Message); }
  }
} 

予期せぬ例外が発生しました。悪いことは言いません。健太さん、誰かに恋するなんてやめといた方がいいですよ・・・。おこがましいです。
711デフォルトの名無しさん:2006/04/09(日) 09:36:37
↑ものすごい説得力ww
712デフォルトの名無しさん:2006/04/09(日) 10:08:11
>>706
もう少しまともな例題選ぶかスレ選ぶかしてくれ。
713デフォルトの名無しさん:2006/04/09(日) 16:44:07
なぜフォーム上のコントロールのイベントがすべてフォームクラスに記述されるんでしょうか?
それぞれのイベントはそれぞれのコントロールで処理したほうがいいように思うんですが
コントロールが増えてくるとそれをすべてフォームクラスで中継して
データを参照したり受け渡ししたり変換したり、表示するように命令したりなどしなければならないのがすごく煩わしいです
714デフォルトの名無しさん:2006/04/09(日) 16:46:28
>イベントはそれぞれのコントロールで処理したほうがいい

意味が分からん
715デフォルトの名無しさん:2006/04/09(日) 16:52:06
>>713
そうしたきゃそうすればいいよ。
絶対今よりも煩わしく複雑になるけど。
716デフォルトの名無しさん:2006/04/09(日) 17:02:16
MVCは原理主義
717デフォルトの名無しさん:2006/04/09(日) 17:30:39
>>713
UserControlがあるだろ。
設計とかそんなん自分で頭働かせて煩わしくないようにすればいい
718デフォルトの名無しさん:2006/04/09(日) 18:18:58
>>713
もしかしてFlashのActionScriptあたりの影響受けてるのか?
あの糞実装は現在「推奨されない記述方法」となっていてActionScript用のレイヤにまとめて書くことが推奨されてるぞ

どっかのレスにもあったが、処理の責任区分を明確にしてないからそういう糞発想が出るんだよ。
ボタンは一般的には「ユーザインタフェースとしてボタンを押すという入力を受け取る」機能が目的なんだから、その上位に対して「ボタンが押されたこと」を通知するのが責任区分
ボタンが押されたことに対してどう処理するかをボタンに責任持たせるべきだと思うか?
・・・まあ、思うからそうユーザ視点で処理を書いているんだろうな
開発者の癖にユーザ視点というのはデザイナー出身FlashActionScript屋っぽい発想だな

処理のレイヤを分割するのは今時の設計では基礎の基礎だと思う
ユーザ視点で処理を実装しているとそのうち破綻するぞ
719デフォルトの名無しさん:2006/04/09(日) 18:19:20
ファイルダイアログに処理全部かくことにしました。
720713:2006/04/09(日) 18:57:22
まだプログラミング初めて1ヶ月程度なんでそんな大そうな人間はありません

ボタンが押される→DATAを読み込む→DATAをテキスト形式に変換→テキストボックスに表示
               ↓
            データを一覧できるようにリストに追加

この一連の作業をFormクラスで記述するのがどうもまどろっこしいんです。
小規模ならいいんですが、徐々に複雑になっていくとFormクラスがメソッドだらけになりそうで
パーティアルとかで分散クラスにすることもできるようですがしっくりきません。
なので、ボタンが押されたら、FormにRead("ファイル名");だけを記述すれば全部やってくれるようにしたかった
できれば、わざわざFormにイベント送ってくるんじゃなくてボタンクラスで処理できればと思ったり
ファイルを読み込むクラスと変換するクラスなどそれぞれ作っても
ファイルクラスにファイル名を送るのも、DATAをテキストに変換するクラスのメソッドにDATAを渡すのも
そのDATAをtextboxに渡すのもすべてFormクラスで記述するのって混乱しませんか?
って、発想から来てます。
721デフォルトの名無しさん:2006/04/09(日) 19:03:20
>>720
Formにイベント送ってくるんじゃなくてボタンにイベント送ってくるんだけど。
Formに記述してるメソッドをボタンのイベントに登録してるだけ。

好きなとこにメソッド書いて登録すればいいと思うよ。
722デフォルトの名無しさん:2006/04/09(日) 19:10:32
>>720 混乱するとかはよくわからんが・・・何かするときに誰が何の責任を謳歌で考えればいいと思うよ。
723デフォルトの名無しさん:2006/04/09(日) 19:12:14
>>720
そんなに複雑なら、データ入出力クラス作っちゃえ。
すれば Form から分離することが出来る。


ところでパーティアルじゃなくてパーシャル。
724デフォルトの名無しさん:2006/04/09(日) 19:15:45
Visual C# 2005 Express Edition を使用しています。
プロジェクト内のすべての.csファイルを一括印刷する方法はありますでしょうか。
725デフォルトの名無しさん:2006/04/09(日) 19:15:52
読めてないなぁ俺。下のほう完全に重複してるじゃん。

>>720
フォームは、自分にボタンとテキストボックスが乗っかってることを知ってるよな?
じゃあ、ボタンは、自分が載っているフォームにテキストボックスがあることを知ってるべきなのか?とか。
処理を仲介するものを1つ定義するとしたら、Form あたりが適切になってくると思うが。
726713:2006/04/09(日) 19:18:37
>>721
ボタンなどのコントロールはFormクラスでインスタンス化されたオブジェクトだから
外部のクラスからは他のクラスのオブジェクトは直接操作できないですよね?
いや、コントロールをすべてpublicにしてしまえばいけますけど、よくないですよね?
だから、好きなとこにメソッド書いてもアクセス権が無ければ意味がないわけで
結局、コントロールを配置してるFormクラスですべてのコントロールのデータ受け渡し表示まで
管理しないとダメってことになりますよね?

Formクラス→それぞれのコントロール管理するクラス→コントロールクラス

みたいな構造が理想かな?
管理クラスをFormで宣言して、管理クラス内でコントロールを作成したらいけるんでしょうが
そうなると、グラフィカル(IDEでマウス操作で)にコントロールのプロパティや外見を作成できず、
すべてコードで記入しないといけないですよね?
>>720のような一連の作業の橋渡しをするようなクラスを実現したいんです
727デフォルトの名無しさん:2006/04/09(日) 19:26:09
別クラスにスりゃいいだろ
728デフォルトの名無しさん:2006/04/09(日) 19:26:44
>>726 そのフォームでやる内容がほかの場合でも使うようなものならば別クラスもいいと思うけれど、
その場合にしかないような処理ならば、そのFormでしてもいいんじゃないか?
要はコントロール郡をまとめる管理クラスをFormがかねてるのが気に食わないんでしょ?
729713:2006/04/09(日) 19:36:09
簡単にいうと中央集権型の構造が嫌なんです
コントロール分権型のほうが扱い易くないですか?そうでもないですか?
別クラスと言っても、結局Formクラスにコントロールがある以上は
データの中継はFormクラスを通さないといけないわけで
自分でも何言ってるのかよくわからなくなってきましたがw
コントロールの管理はFORMがするのが基本なんですか?

>>728
> 要はコントロール郡をまとめる管理クラスをFormがかねてるのが気に食わないんでしょ?
そうなんです。繰り返し使う関数や処理はできるだけ別クラス作ってますが
クラスが増えれば増えるほど、クラスのメソッド呼び出し、データ受け取りなど増えていきませんか?
今Formクラスのメソッドは呼び出しとデータ受け渡しだらけです。こんなもんなんでしょうか?
730デフォルトの名無しさん:2006/04/09(日) 19:38:26
んなら UserControl に Button と TextBox をはっつけりゃいいだろ
731デフォルトの名無しさん:2006/04/09(日) 19:39:25
屋根の上に屋根をつくってほしいって言ってるように見えるが。

>繰り返し使う関数や処理はできるだけ別クラス作ってますが
これが間違いっぽい。
732デフォルトの名無しさん:2006/04/09(日) 19:40:13
スクロールするのがめんどくさいって話でしょ
そんなん知るか
733713:2006/04/09(日) 19:40:29
Formはユーザーに対してインターフェースを提供するだけであって
データの受け渡しなどはしてほしくないんです
そういう内部的な動作は別のクラスに一挙にまかせて
Formはそれぞれのコントロールのイベントを取得して
内部処理クラスにそういうイベントがありましたよってのを通知するだけにしたいんです
734713:2006/04/09(日) 19:44:11
>>730
連動させるのがその二つだけの小規模なものならいんですが
大量にコントロールが増えた時のことを考えてください
そうなるとFormの二の舞です

>>731
そうです。C#を実現するために、windows上にframeworkがあるようなもんです

>>732
簡単にいうとそういうことです。
一つ一つのクラスのメソッドはできるだけ少なくしたいんです
735728:2006/04/09(日) 19:47:14
>>729 MVCってしってる?デザパタ読め。
同じような繰り返し処理が分離でき再利用されるものなら関数としてであろうがクラスとしてであろうが分離すべし。
まぁ自分はビューとコントローラはそこまで分離させないが。
736デフォルトの名無しさん:2006/04/09(日) 19:51:53
>>733
プレゼンテーション層であるFormにビジネスロジックなんて載せないだろ
ビジネスロジック用の別クラスを作ってButton→Form→ビジネスロジックのメソッドってやるだろが
自分で勝手にFormを中央集権にしてるんじゃん
だから処理の責任区分が曖昧だっつーの
737713:2006/04/09(日) 19:59:02
>>736
もちろんビジネスロジックは別に用意してますよ

何度もいうようにそれぞれのコントロールを中継する役割をFormがやるのが気に食わないんです
×Button→Form→ビジネスロジック
○Button→ビジネスロジック
これならいいんです。すべてのコントロールの中継するためのコードだけでも
大量になりますよね?>>720のような一連の作業をFormを通さないでできますか?
私が言ってるのはそういうことなんです
Formからすべてのコントロールのパブリックメソッドにアクセスできるような状態が嫌なんです

738デフォルトの名無しさん:2006/04/09(日) 20:03:13
それがいいとは思わんが、そのためにイベントがあるんだと思うが。
ボタンのイベントにビジネスロジックの呼び出しを登録すればよいだけ。
739713:2006/04/09(日) 20:07:04
>>733の言ってる内部処理とは関数とかそういうのではなく
中継するためのコードのことです

private textView()
{
   string[] data=ファイル入出力クラス.FileOpen("ファイル名");
   string[] text=変換処理クラス.ConvertToText(data);
textBox1.Text=text;
}
↑のようなコードをFormクラスで書きますよね?こういうのがウザいんです
たったこれだけならいいですが、コントロールの数だけ、変換処理の種類だけ
大量に書かないといけないわけで、それが嫌なんです
740デフォルトの名無しさん:2006/04/09(日) 20:08:17
>>713
知らんがな
マイクロソフトに言えや
741デフォルトの名無しさん:2006/04/09(日) 20:15:07
>>739 じゃ、おまいの理想のコード書いてミーよ。
742デフォルトの名無しさん:2006/04/09(日) 20:21:58
>>739
好きなクラスに書いたらいいがな

ところで型まちがってるよ
743デフォルトの名無しさん:2006/04/09(日) 20:26:48
おれは >>738 の意見に賛成だな。

Button1_Click {
  Text1.Text = Hoge.ReadAndConvert("ファイル名");
}

って感じで。
744デフォルトの名無しさん:2006/04/09(日) 20:32:23
>>743
そのコードが Form クラスにかかれるのが気に食わないらしいんですよ
745713:2006/04/09(日) 20:32:53
>>743
そのイベントドリブンをFormに書くってことですよね?
既に、私のFormはそういう感じです。
ほとんどの処理がイベントドリブン内で収まってます
メソッドやフィールド、プロパティなどはほとんどありません。
でも、コードはだんだんと長くなりFormクラスを圧迫しつつあります
イベント処理をFormに書くことが嫌なんです
Formはほっといてほしいんです
746デフォルトの名無しさん:2006/04/09(日) 20:33:54
>>745
知らんがな
マイクロソフトに言えや
747デフォルトの名無しさん:2006/04/09(日) 20:35:13
今週のキーワード

ホームはほっといてほしいんです

はい、続けて

ホームh(ry
748デフォルトの名無しさん:2006/04/09(日) 20:36:10
てことは、

Private Button1_Click() {
  Controller.Button1_Click();
}

Class Controller {
  void Button1_Click() {
    // 処理をここに書く
  }
}

ってやりたいと? それこそ無駄だと思うなw
749デフォルトの名無しさん:2006/04/09(日) 20:36:21
>>744-745 ちゃうちゃう
必要な処理はManagerクラスにでも書く。
そのイベントドリブン処理が全部マネージャークラスに行く。
750749:2006/04/09(日) 20:38:41
Form{
Form(){
button1.Click+=new ButtonEventHandler(controller.DoClick);
}
}
Controller{
void DoClick(){
sukinasyori
}
}
751デフォルトの名無しさん:2006/04/09(日) 20:38:56
イベントデリゲートを登録するときに Manager クラスに引っ掛ければいいんだろうけど、
IDE のサポートがなくなっちゃうしな・・・
752713:2006/04/09(日) 20:40:32
>>746
私はまだC#を熟知したわけじゃありません。
一通りのC#の概要について一読しただけで
これからアプリを作成しようと思っている若輩者です
ここにいる住民の方々なら匠の技を教えて頂けるのではと思い相談に上がった次第です
わたしの言っていることは傲慢なんでしょうか?
一般的なプログラミングとはかけ離れた妄想なんでしょうか?
もしそういうことなら遠慮なくそうおっしゃってください。
一般的にはこうするものだと言っていただければ従います
クラス設計をするに当たってただ単に質問させて頂いただけなんです
不快な気持ちにさせようとしている訳じゃない事をご了承ください
753デフォルトの名無しさん:2006/04/09(日) 20:43:02
>>752
少なくとも、MS はフォームの責務としてイベントを受け取るところまではやるべき、という考えなんだろ。
IDE はその考えに基づいて作られてるから、あくまで我を通したいというなら IDE のサポートは期待
しないこった。
754デフォルトの名無しさん:2006/04/09(日) 20:49:01
private void _executeCommandOnButtonXXXClicked(){
textBox.Text = this.LogicController.GetDataText("filename");
}
一行ならだめか?
コントロールの数だけクラス作るほうがめんどくさいと思うんだが。
713の理想のコードってコマンドパターンチックに行く感じ?
class GetDataButton: Button{
  protected override void OnClick(EventArgs e){
    /**/
  }
}
755デフォルトの名無しさん:2006/04/09(日) 20:56:52
>>752
そっちの理想だと、Button と動作が完全に癒着しているけど良いの?
ボタンを押すことと、処理を行うことはそこまで密接に関係があるのか。


とりあえず、悪いとは言わない。色んな方法があるから。
756713:2006/04/09(日) 21:05:10
>>753
なるほど、Formにイベントドリブンを記述しないとそうなりますか
IDEを恩恵を捨ててまで初心者がやるべきことではないということですね

>>754
イベント処理をFormで受け取って、イベント処理内容を別クラスに定義するということですよね?
でも結局イベントはFormで受け取っている以上、実際には1行では済まなくなると思います
ファイルが存在しなかったら?ファイル内容が○○だった場合の処理分岐は?など
イベントを受け取る側では実行結果後の分岐処理が待っているんだと思います

やはり、すべてFormでデータの受け渡し、データ入出力要請などをしないとダメっぽいですね
Formコードが長くなったらパーシャル使うなど・・・と言った感じですか。

>>755
クラスはできるだけ隠蔽すべきだってのを呼んでいると、Formクラスから多くのコントロールが見えてしまうのは
あまりよくないんじゃないのか?それだったらコントロールごとに動作と連携させればいいんじゃないか?
そしてデータ構造や動作に関してはFormクラスからは見えないようにしたほうがいいんじゃないのか?って発想なんです
それぞれのコントロールはお互い何をやっているかもわからないし、ただ与えられただけのことをやればいいみたいな感じです
アクセス修飾子に関しても、publicprotectprivateとかじゃなくて、このクラスとだけ入出力できるような特定できればいいんですけど
public(bottun1) Class ボタンの動作//Bottunからだけ見える管理クラス
{
}
みたいな感じですね。こうなると別のネームスペース、プロジェクトを作れということなのかな?
757デフォルトの名無しさん:2006/04/09(日) 21:05:17
結局どっかには書くことになるから、まとめてあるほうが楽だよ
漏れのお勧めは
Form{
Form(){
button1.Click+=new EventHandler(button1_Clicked);
}
private void button1_Clicked(object sender, EventArgs e){
   this.Controller.Execute();
}
}
Controller{
void Execute(){/**/}
}
結果はExecuteの戻り値なりイベントなりで取得。

さらにコントロールが多かったりするとbutton1とロジックを結びつけるコンポーネント作ったりしてるけど
button1.Click += ....のところを
LogicAndViewTieManager.Join(button1, this.Controller.Execute);みたいな
758デフォルトの名無しさん:2006/04/09(日) 21:20:21
>>756
・・・・・・? そこまで自分の考えがまとまっているのなら、それでやればいいじゃん。
Button クラス継承して、イベント引っ掛けてデータ処理して・・・・・・ Form 介さずにも何とか出来るよ。
759713:2006/04/09(日) 21:32:04
>>757
うまく例えられないですけど、フォルダのサブフォルダのそのまたサブフォルダのって感じで
多段階層に対しての管理はそれでやるとまとめられると思うけど
私がほしいのは横とのつながりなんです。Form上のTextBoxとListViewのデータの受け渡し変換など

>>758
その言葉聞くとなんだか自分の考えがおかしいような気がしてきた
私がやろうとしてるのは
IEでお気に入りのURLをクリックするとHPが開かれる
けれども、URLのボタンにHP内の画像や文字列が格納されてるわけじゃない
HPはHPでサーバーが管理しているわけで・・・
やっぱり、ボタンなどコントロールにデータ管理処理などすべてをやらせるのは
逆に管理が大変になるでしょうね
760デフォルトの名無しさん:2006/04/09(日) 21:37:42
すべてのメソッドをイベントハンドラとして設計するのはマズイかな?
渡したい値はEventArgs継承型に全部いれちゃって。
761デフォルトの名無しさん:2006/04/09(日) 21:48:27
個人的にはsenderがオブジェクト型なのでわかり辛いとおもう
Controller内にpublicで定義して、イベントとして登録する使い方ではsenderに依存しちゃいけないと思うし
762デフォルトの名無しさん:2006/04/09(日) 21:58:55
>>759 だから>>750で結論でてるやん
763713:2006/04/09(日) 22:40:44
>>762
別クラスから、FormクラスのtextboxとListviewの両方にはアクセスできませんよ
764デフォルトの名無しさん:2006/04/09(日) 22:43:55
できるだろ。
765デフォルトの名無しさん:2006/04/09(日) 22:44:13
>>763 Controllerに両方のポインタ渡しとけばいいだけやん。
766デフォルトの名無しさん:2006/04/09(日) 22:46:52
dllに分けてinternalプロパティやメソッドで公開
767デフォルトの名無しさん:2006/04/09(日) 22:48:26
>>713
まずさ、マイクロソフトの提示するやりかたをキッチリ理解してよ
次に開発の一般的な実装方法を学習してよ(デザインパターンとか)
当然の知識が無いのに「オレ流の正しさを理解してくれ」って語られても困るんだよね
768713:2006/04/09(日) 22:55:24
>>765
それはかっこ悪いです

>>766
作業効率が悪いです

>>767
学習します
769デフォルトの名無しさん:2006/04/09(日) 23:02:57
>>768
>それはかっこ悪いです
ControllerがFormのかわりにコントロールを管理したいんやなかったの?
ポインタも知らんとどないして管理するつもりやねん。
 
770デフォルトの名無しさん:2006/04/09(日) 23:03:34
protected virtual void OnSizeChanged(EventArgs e)
{
EventHandler handler = base.Events[eventKeySizeChanged] as EventHandler;
if (handler != null)
{
handler(this, e);
}
}

On〜メソッドを追加するたびに似たようなコードを書くのは気持ち悪いので、
この中身をOn〜から汎用的に使える1つのメソッドにまとめられませんか?
771デフォルトの名無しさん:2006/04/09(日) 23:06:42
まとめりゃいいだろ。
base.Events 使うなら、RaiseEvent メソッドでも作ってそれにイベント識別オブジェクト送れ
772713:2006/04/09(日) 23:16:14
>>769
コントロールの参照を渡すなんてかっこ悪いと思います
小規模ならいいですけど
複雑になってくるとどうなりますか?

Controller.メソッド(textbox,listview,ファイル名、データ名、何行目?、、、)
これこそ余計に混乱しますし、無駄な処理です
773デフォルトの名無しさん:2006/04/09(日) 23:18:17
相手にした俺が馬鹿だった
以後スルーします
774デフォルトの名無しさん:2006/04/09(日) 23:22:08
んじゃインタフェースつかえ
775デフォルトの名無しさん:2006/04/09(日) 23:23:37
1回1回渡すわけねーだろが
776デフォルトの名無しさん:2006/04/09(日) 23:24:55
小規模なのでいいから一回IDE使わないでGUIアプリ作ってみれば色々見えてくるよ。
学習目的なんだからそのくらい経験してみないと。
777デフォルトの名無しさん:2006/04/09(日) 23:36:35
713は俺サマ仕様考える前に、学ぶべきことがあるはずだ。
778デフォルトの名無しさん:2006/04/09(日) 23:56:21
バカはJavaでもやっとけ
779デフォルトの名無しさん:2006/04/09(日) 23:58:43
>>772
そういうときはインタフェイスを使うんだよ。
780デフォルトの名無しさん:2006/04/10(月) 00:38:46
713はC♯を作った人間達って自分より低脳だと思っているんだろうな
781デフォルトの名無しさん:2006/04/10(月) 00:58:59
いきなり仕様を「バグですか?」とか聞いてくるやつもいるからな
初めて数週間で仕様のバグを見抜いたら天才だよな
782デフォルトの名無しさん:2006/04/10(月) 01:04:43
案外同一人物だったりなw
783デフォルトの名無しさん:2006/04/10(月) 01:25:05
713の中の人は.NetFrameworkで定義済みのクラスに
機能追加できるようになるC#3.xまで待てば?:)
784デフォルトの名無しさん:2006/04/10(月) 01:30:51
言ってることが矛盾してるなあ。
あちこちでいろんなものを管理すると分散するし参照の引き回しがややこしくなるから
すべての持ち主であるFormが管理するようになってるんだと思うがなあ。
いやなら別のクラスに分けるけど、分けた以上は必要な参照は渡さざるを得ないし。

ひょっとしてjavaでWebプログラミングしてた人?
785713:2006/04/10(月) 01:31:59
インターフェースは特殊な例に対してのみ使うものではないと思うんです
似通った振る舞いをそれぞれのクラスがする場合に一貫性を保つ位置付けであると考えてます
それにインターフェースを付けたからといって根本的な解決にはなっていないようにも思えます
786デフォルトの名無しさん:2006/04/10(月) 01:32:02
>>783
おいおい無茶言うな
ちなみに無茶ってのは3.0を待つということじゃなくて解決になってないってことな。
787デフォルトの名無しさん:2006/04/10(月) 01:36:49
・・・・・・あれかな? 理想を追い求めるばかりに、自分で自分を絞め殺しちゃうような。
788デフォルトの名無しさん:2006/04/10(月) 01:37:37
>>785
C#が気に入らなければ自分で言語作れば?
789713:2006/04/10(月) 01:39:36
>>784
その通りです。参照の引き回しをしたくないから、単純に別クラスにすればいいとか
イベントドリブンを包括するクラスを作ればいいとかそういう問題ではないんですよ

例えば警備会社がここの家を監視しているとして、警備会社の社長がすべての家をモニタするでしょうか?
実際は従業員がそれぞれの家を監視するわけです
Formは言わば社長なんです。それぞれのコンロールを保持しているけれども、管理まではさせたくないんです
あるクラスは、ファイルの入出力からTextBoxに表示するまでを管理して
あるクラスは、TextBoxのデータを元にListViewに表示する
あるクラスは、データの入出力だけを管理する
と言った具合に、管理する業務を分担したいんです
これらをすべてメソッドで書くなんて大変です

あと、プログラミングはまったく初めてです。今までしたことがありません
C#が初めてです。
790デフォルトの名無しさん:2006/04/10(月) 01:42:08
Form が社長と考えてるからそうなるんだろうなぁ
791713:2006/04/10(月) 01:47:42
正直にいうとむかーし、F-BASIC386とHigh C CompilerとQuick Cはやったことがあります
でもその頃は小学生だったのでほとんどまともなことができません
ドラクエのみたいに背景がスクロールしてキャラが動く程度です
792デフォルトの名無しさん:2006/04/10(月) 01:53:41
誰もあなたの身のうち話なんて知りたくない。
いい加減空気読んで回線切ろうね。
793デフォルトの名無しさん:2006/04/10(月) 02:03:14
C#だと社長は.NETになるんじゃないかなぁとおもたり。
その下にFormという中間管理職がいるのが妥当では?>例えると
794713:2006/04/10(月) 02:03:29
そうですか
では、今日はこの辺にしておきます
また、進展ありましたら報告しにやってきます。
ありがとうございました
795デフォルトの名無しさん:2006/04/10(月) 02:04:54
進展しないと思う
796713:2006/04/10(月) 02:05:29
>>793
そういう話になれば、OSが社長で中間管理職(中間コンパイラ)がFrameworkなわけで・・
そういう次元の話ではないんですよ。あくまで例えですから。
797デフォルトの名無しさん:2006/04/10(月) 02:09:22
C#でプログラミングする場合にはOSは殆ど見えんだろ
798デフォルトの名無しさん:2006/04/10(月) 02:11:49
というか 752 で言ってる当初の目的は住人の総反対という結果で満たされたと思うんだが、
それでもなお自説にこだわるってのはどうなんだか。
799デフォルトの名無しさん:2006/04/10(月) 02:16:06
つ プライド

聞いてもいない自分のことを語り出した時点でダメだこりゃと思った
800713:2006/04/10(月) 02:26:37
聞いてはいないですが、何度も以前プログラムしてたのでは?
みたいなことを言われるので言ったまでの話です。
普通の会話だと思いますが、プログラマのみなさんには
命令したこと以外のことが起きると困惑されるみたいですね
801デフォルトの名無しさん:2006/04/10(月) 02:32:03
なんですって!キーッ!
802デフォルトの名無しさん:2006/04/10(月) 02:40:09
>>801の手腕に舌鼓を打った。
803デフォルトの名無しさん:2006/04/10(月) 03:10:27
>>713
君の心の中を書いてあげるよ

・自分が絶対
・自分が正しいと思ったことは客観的に見ても正しい
・自分が違うと思ったことは客観的に見ても誤っている
・自分の意見を理解できない人々はおかしい人々だ
・だからどうして私の高尚な意見を理解できないんだクズ共が

こんなとこだろ
少しは他人の意見に耳を傾けて脊髄反射レスするまえに勉強しろや
804デフォルトの名無しさん:2006/04/10(月) 03:14:05
>>789
> あるクラスは、ファイルの入出力からTextBoxに表示するまでを管理して
> あるクラスは、TextBoxのデータを元にListViewに表示する

カプリングとコヒージョンからやり直せ。責務の持たせ方がめちゃくちゃ。

> あるクラスは、データの入出力だけを管理する

これはまぁいいけど。
805デフォルトの名無しさん:2006/04/10(月) 03:31:53
GUI つくるときには、同じ処理をコマンドラインからも行えるように考えながら設計してみるといいよ。
それだけで処理を GUI から切り離して考えられる。
806デフォルトの名無しさん:2006/04/10(月) 07:17:18
713に対する反論には開発業界が時間をかけて培ってきた定石が多く含まれている
それに対する713の反論は概念と断片的な例だけで具体性が無く「○○だから△△」という対症療法的な稚拙なものばかり

713は脊髄反射する前に反論に含まれる定石を理解すべきだと思うがな
それらの定石が成立するまでには数年に渡る多くの人間の試行錯誤があるわけで、たかが一個人が10日程度試行錯誤したものとは次元が違う
807デフォルトの名無しさん:2006/04/10(月) 07:29:51
結局Form上に書くのがベストだけど、長くなるからPartial Classを実現させた、
って感じでおk?
808デフォルトの名無しさん:2006/04/10(月) 08:10:51
長くなるからパーシャルなんていってるやつはいないんじゃねえ?
713以外は。
809デフォルトの名無しさん:2006/04/10(月) 08:19:24
>>806
「自分の理解を超えるものは全否定」っていう、厨房天才の典型パターンじゃまいか。

それで自己完結して自己解決しているならどうでもいいけど、こうして語られると鬱陶しいね。

何を言っても「自分の理解を超えるもの」だから、厨反論しかしてこないしね。
810デフォルトの名無しさん:2006/04/10(月) 09:29:51
>>807
pertial は、IDE のデザイナ側が弄るファイルとプログラマ側が弄るファイルを明確に分離するのが一番の目的。
まあ、長くなるから分けるってのは俺自身やったことあるから何ともいえないけど。
811デフォルトの名無しさん:2006/04/10(月) 09:36:20
partial だよ…… orz
だめだ。このキーワード自分で打つ機会が少ないから憶えらんない。・゚・(ノД`)・゚・。
812デフォルトの名無しさん:2006/04/10(月) 09:42:53
>>811 お前がスレ建てるとPert31になりそうだな
813デフォルトの名無しさん:2006/04/10(月) 09:50:04
part -> partial か。納得 orz
814デフォルトの名無しさん:2006/04/10(月) 10:53:10
>>810
ネストクラスで長いの分けて書いたりしてみたけども(Internalに
すればいいんだがもっと厳密にアクセサビリティ追求してみよう
と思って)いまいち使い勝手がよくない。

さらにprojファイルいじってdependentUponなんてしてみたが
結局戻した。

いや、見通しはよくなりはするんだけど。やるまでもないっていうか
815デフォルトの名無しさん:2006/04/10(月) 14:07:14
>>796
そのたとえなら、Form社長はControl従業員の名簿くらいは持っていて、
いま誰が何の業務でどこに配備されているか把握しておくものだろ。
現場での業務内容は、ビジネスロジックという名の
業務手順書に書いておけばよくて、社長は把握しなくてもいい。
この手順書さえあれば、web新社長が就任してフリーターのsubmit君を
雇ったときにも対応できる。
従業員や職種が増えたらUserControl課長を雇うんだよ。そのとき社長が
把握するのは課長と一部の直属従業員。

Formにビジネスロジックまで書くのはワンマン社長のやることで、
Formにコントロールのイベントハンドラすらないのは放漫経営だ。
816デフォルトの名無しさん:2006/04/10(月) 14:25:37
概念論しか語らない香具師に概念論を語っても理解してくれない
根本を理解してもらうしかない
817デフォルトの名無しさん:2006/04/10(月) 14:34:06
曖昧論な例え話禁止
818713:2006/04/10(月) 16:42:00
初心者にしてはレベルの高い議題を上げてしまって、みなさんを困惑させてしまったようですね
あれからいろいろ調べたところ、Form1をインスタンス化するクラスとそのクラスを実行する
メインエントリクラスを作ることで分担させることができました
つまり、Form1を包括するクラスとそれを包括するクラスを用意したわけで
これで作業分担できそうです。とりあえず、これでやっていきたいと思います
819デフォルトの名無しさん:2006/04/10(月) 17:02:38
もう来なくていいよ
820デフォルトの名無しさん:2006/04/10(月) 17:14:08
古今まれに見るうざさ。ここまでひどいのもめずらしい。
821デフォルトの名無しさん:2006/04/10(月) 17:27:47
ぜんぶふぉーむくらすのなかに、かくこんとろーるをけいしょうしたくらすをていぎすればいいとおもいまうす
822デフォルトの名無しさん:2006/04/10(月) 17:34:44
解決法見る限り、どう見ても質問してたこと解決してないし。
もういいや。少しでも手助けしようとした自分が馬鹿だった。
823デフォルトの名無しさん:2006/04/10(月) 17:36:38
自称で「ぼくはレベルが高い」という初心者には困る。
824713:2006/04/10(月) 17:47:11
>>821
もうしてます

>>822
してますよ。包括クラス1はコントロール間の管理、包括2はファイル入出力とデータコレクションクラス間の管理
何度も言ってますが、ビジネスロジックは別に設けています。ここでいう管理はクラスの振る舞いに対する指示だけです
825デフォルトの名無しさん:2006/04/10(月) 17:49:11
>>818
レベルの低い人間からの常識外れな議題でみんな困惑したんだよ
何言っても理解できないレベルの人に教えるのは本当大変な事なんだよ
826デフォルトの名無しさん:2006/04/10(月) 17:51:50
>>824
君の脳内結論に非常に興味がある
是非blogかWikiに書いてくれ
ここまで定石ができあがった業界に対して疑問を持ち自分なりの結論を得たというのは興味深い
もしかして定石に一石を投じる結果になるかもしれない
だから今度はオレ達に教えてくれ
827713:2006/04/10(月) 17:59:21
私が編み出したこのプログラミング手法をHierarchical Management(階層的管理)志向と名づけます
1つ1つのコントロールは多種多様な振る舞いをするわけで、その振る舞いを一括して支持するのが
Form1クラスだけというのは負担が大きすぎます。
会社の組織に例えるとForm1は直属の上司と言った所でしょうか
その上司にも上司がいるわけで、木の枝のように指示内容も量も広がっていきます
それぞれの節目に管理クラスを設けることで、できるだけ分散させようという試みです。
例えば、あるコントロールの動作を変更したいと思った場合、Form1の数多くあるメソッドの中から
変更に関係あるメソッドを探すのは大変です。管理職と現場はグループ化していればこういう問題は起きません。
みなさんも試してみてください。そうすれば私が言っていることがわかるでしょう。
828821:2006/04/10(月) 18:01:19
>>824 オイ、マヂカヨ
俺の言ってることって

class Form1:form {
MyButton1 button1;
MyButton2 button2;
中略
class MyButton1 :Button {
てきとうなしょり
てきとうなOnイベントメソッド
}
class MyButton2 :Button {
てきとうなしょり
てきとうなOnイベントメソッド
}
}

こんなかんじのことっすよ(´・ω・)
こんなんやってるほうが狭軌の沙汰だと思うんだが
829デフォルトの名無しさん:2006/04/10(月) 18:02:38
>>827 >>713
既にそうなってくるとスレ違いなので
どっかにまとめてきておくれ。ここに書かないで下さい。
830713:2006/04/10(月) 18:08:12
>>828
それならそうと最初に言ってください。そういうことはしていません。ダサいです。
今私が議論していることはそんな低次元なことじゃないんですよね・・・。
昔から要領がよくて何でもすぐ出来てしまう私は飽きっぽいんですよ。
私はこの1ヶ月間で実質的なプログラミングはしていません。
C#の概要とオブジェクト志向について学んだだけに過ぎません。
いや、実際のところプログラミングよりそこが重要なんですけどね。
アルゴリズムは多くあれど、プログラミング手法についてはまだまだ
介入できる隙があるようですけどねw
831デフォルトの名無しさん:2006/04/10(月) 18:11:12
解決したってんだからいいじゃん。
もうお触り禁止
832デフォルトの名無しさん:2006/04/10(月) 18:12:04
途中から釣りなんだろうけど。
CompositeとかDecoratorあたりだろ。
そもそもIDE自体はMicrosoftが想定してるデザインに基づいて動いているだけで他のデザインが間違ってるわけじゃない。
独自のデザインでやるならGUI配置等の恩恵は諦めろ。
833デフォルトの名無しさん:2006/04/10(月) 18:12:38
まあここまで来るとネタだろうけども
もし本当に何か新しい方法を見つけたと思ってるのなら
どっかにサンプルコードをまとめてくれませんか。
私は馬鹿なので827のように日本語で書かれても
実際どんな実装をしているのか分からないのです。
834デフォルトの名無しさん:2006/04/10(月) 18:13:07
>連動させるのがその二つだけの小規模なものならいんですが
>大量にコントロールが増えた時のことを考えてください
>そうなるとFormの二の舞です

すいません、このへんの話とどう違うのかわかりません・・・。
835デフォルトの名無しさん:2006/04/10(月) 18:19:08
まあ折角なので根本に戻って考えると

例えば、テキストボックスの脇に「参照」ってボタンつけて
ボタン押すとファイル選択ダイアログを開く
そしてそのファイル名をテキストボックスに入れる

こんな実装を結構使うわけだけど
確かにこの場合、ボタンは該当するテキストボックスとしか関係しないわけで
このテキストボックスとボタンを綺麗にまとめてカプセル化し、
かつ、いちいち独自のユーザコントロールを作ったり継承したりしないで、
かつ、現在のIDEのGUIと矛盾しない、楽な方法があるなら
俺も知りたい
836713:2006/04/10(月) 18:33:11
>>835
私が議論しているのはまさにそれですね。
つまり、Form上でインスタンス化されたオブジェク群は平社員です。
横並びでずらーっと並んでいるわけですよ。それをFormだけが管理するのが
開発効率的にも、そしてクラスを隠蔽するという原因となった人間の誤操作と点でも問題なんですよ。
オブジェクト同士が横と繋がるパイプラインをどう持たせるかが問題なわけです。
ユーザーコントロールというのも手ですが、これは効率がよくありません。
グループ化は動的で柔軟に対応できるようなものでないと意味がありません。
しかし、現在のところIDEが対応していないということなので、Formクラスを包括するクラスをいくつか作り
自制しながらプログラミングするしかないのが現状だということなんです。
837デフォルトの名無しさん:2006/04/10(月) 18:42:16
>>836
最終的に Control 系は、クラス階層的にも Composite 階層的にも木構造だから。
葉と葉は、直接連絡しあえないんだよね。必ず幹を通らなくては、隣の葉にすら移動できない。

木構造を止めてしまえば直接つなぐことが出来るけど、
管理しにくくなるというデメリットまで許容することが出来るか〜ってのは問題かな。
838713:2006/04/10(月) 18:53:40
>>837
すいません。ちょっと語弊がありました。
オブジェクト同士の連携は直接というより、管理クラス(幹)がほしいわけなんです
そうでないと、隠蔽どころか完全なブラックボックスですからね
隠蔽と言っても必要な情報はやりとりしたいわけで。
M$のIDEは木の根から多数の葉が生えているような状態なんですよ
これが非常にうざいんですよね。面倒なだけでできなくはないですが
プログラミングを本職にしている人ならわかると思いますが、できるだけじゃダメですよね?
時間を節約できる効率的なプログラミングを目指しますよね?
ある一連の振る舞いを管理するためだけのクラスがあったら便利と思いませんか?
平社員の連携を保つために、わざわざ社長が指導するんでしょうか?
私が言ってるのはそういうことなんです
839デフォルトの名無しさん:2006/04/10(月) 18:57:08
>>835
つ component (見えない奴)

参照ボタンなるユーザ定義コンポーネントを作って、それのプロパティに
ボタンとテキストボックスを指定できるようにすればいいんじゃない?

>>836>>837
Panel みたいな見える奴にいれるから階層構造になっちゃうわけで、
単に論理的にまとめ(て機能させ)るだけなら見えないのから参照させて
おけばいい。
840713:2006/04/10(月) 19:09:40
具体的に書くと

student.Name
student.学校名
student.クラス名

というのがあってこれをそれぞれのコントロールに渡す処理をするとします

Class Form
{
 public View()
 {
   textBox1.Text=student.Name;
   comboBox1.Text=student.学校名
   listView1.Items.Add(クラス名);
 }
}

どうですか?面倒ですよね?まあ、これぐらいじゃ別に面倒でもないか
しかし、データの種類や量が多くなってきたらどうなりますか?
↓のようなのが理想だと思います

Class Form
{
 public View()
 {
   //管理クラスにstudentを渡すことで
   //上記のようにそれぞれのコントロールに表示されます
   管理クラス(student);
 }
}
841デフォルトの名無しさん:2006/04/10(月) 19:13:03
>>840 どっちが面倒かっていったら後者じゃね?
実質的な手間は変わらんし

まあ見た目はしらんが
842デフォルトの名無しさん:2006/04/10(月) 19:15:50
だからそういうのをIDEで簡単にやろうってのが component なんだってば。
Form には形のある Control しか貼れないわけじゃないでそ?

Menu と MenuItem の関係のように、「生徒管理」とかいうコンポーネントを
それのプロパティ textBox に textBox1 を、comboBox に comboBox1 を、
ListView に ListView1 を指定して、データソースなりアレイのプロパティ
なりで student(s) を渡してやればいいんだよ。、
843838:2006/04/10(月) 19:18:43
>>838
悪い。管理クラスが欲しいにもかかわらず、その管理クラスを作るのを面倒に思っているように見えた。
UserControl 使って管理クラス作ればいいじゃん。
844デフォルトの名無しさん:2006/04/10(月) 19:19:36
ちげえよバカ。837だ。
845デフォルトの名無しさん:2006/04/10(月) 19:26:46
>>840
class 管理クラス : UserControl
{
public 管理クラス(Student student)
{
textBox1.Text=student.Name;
comboBox1.Text=student.学校名
listView1.Items.Add(クラス名);
}
}
846デフォルトの名無しさん:2006/04/10(月) 19:38:24
社長がどうのとか概念論からコードに話を変えたら粗が見えるな
つか何年前の議論だこれ?
847713:2006/04/10(月) 19:39:48
>>845
UserControlは嫌なんですよ。
ファイルダイアログとテキストボックスなど近くに配置して
単純な連動するものならいいですが、
UserControlでは、全体のデザインを変えなくてはダメじゃないですか
デザインにもこだわりたいし、それから、listviewにアクセスするコントロールは別にもあるんです

Aコントロールから、targetコントロールへの連動
Bコントロールから、targetコントロールへの連動

この二つを独立させたいんです。単純に機能がまとまってるなら私もUserControl使ってますよ
それから、話はそれだけじゃないんです。ファイル入出力から表示するまでの一連の動作を管理したいんです

それからcomponentクラスのヘルプが「情報がありません」とかで見れませんでした
ComponentEditorForm クラスのヘルプは見れたので多分同じような機能だとは思いますが
これもユーザーコントロールみたいにコントロールをカプセル化するための機能なんじゃないですか?
848デフォルトの名無しさん:2006/04/10(月) 19:40:10
> Class Form
> {
>  public View()
>  {
>    //管理クラスにstudentを渡すことで
>    //上記のようにそれぞれのコントロールに表示されます
>    管理クラス(student);
>  }
> }

管理クラスの中で何をやってるのか教えてよ。
849デフォルトの名無しさん:2006/04/10(月) 19:43:04
>>847
UserControl が嫌なら、管理クラス作ればいいじゃん。何を迷ってるのさ。
それから、管理は一元化するべき。listview に直接アクセスするオブジェクトを2個も3個も作るとややこしくなる。
850デフォルトの名無しさん:2006/04/10(月) 19:43:04
>>835
コンポーネントじゃだめなの?
Formを経由せずに複数の情報を必要な範囲で連携させる方法って正しくコンポーネントだと思うんだけど
フォームはコントロールのホストって構成ならASP.NETなんてもっと顕著だろ
ノンプログラミング(フォームは構造定義に特化)でblog作ったりできるわけだし、Windows Formでもコンポーネント使えばFormのコードに全く触らずコントロール連携中心の開発もできる
「知らないから実装されていない」って思い込んじゃ駄目だよ
851デフォルトの名無しさん:2006/04/10(月) 19:45:24
>>847

> これもユーザーコントロールみたいにコントロールをカプセル化するための機能なんじゃないですか?

偉そうな口聞くならさ、自分の中でヘルプ見れば分かるレベルの疑問を解決してからにしてよ
プログラム初めて何日だか知らんが、同じレベルで会話したいんならんな逃げ口上使うなや
852デフォルトの名無しさん:2006/04/10(月) 19:46:41
>>847
>それから、話はそれだけじゃないんです。ファイル入出力から表示するまでの一連の動作を管理したいんです 
それまで全部やってくれる管理クラスを、なぜ作ろうとしないのか。
853デフォルトの名無しさん:2006/04/10(月) 19:48:20
>>713
君のその実装方法で何か作ってよ
外枠ばっかりで具体例が無いからわけわかんない
一つのものを作り上げてそこから見えてくるものもあるだろうし
とりあえず簡単なDB編集ツールでも組み上げて公開してよ
プログラムってのはコントロールだけじゃないんだからデータベースなんかにも対応できるんだよね?
854デフォルトの名無しさん:2006/04/10(月) 19:49:55
>>847
>これもユーザーコントロールみたいにコントロールをカプセル化するための機能なんじゃないですか?
合ってる。

というより Form 含め GUI は、ユーザからの入出力のみを担当するべきだと思うんだけどな。
それ以外のデータ処理は別の箇所で行うべきじゃないのかなって。
855デフォルトの名無しさん:2006/04/10(月) 19:53:20
713のプログラムってコントロール操作だけなんかな
856713:2006/04/10(月) 19:54:04
管理クラス作れば?ってまた話がもどりましたね
過去ログぐらい見てくださいよ。

ユーザーを入力によってイベントが発生して、そして一連の動作が発生するわけなんですよ
そのイベントをどこが拾いますか?Formじゃないですか?
一連の動作するクラスをFormから呼び出す場合、その動作に必要なコントロールポインタを
すべて渡さないとだめじゃないですか

何度もいうように

Form→管理クラス→コントロール
            →ファイル入出力
           →データ管理

のような構造が理想だと言っているんです。

>>851
ヘルプがないんだから仕方がありません。
857デフォルトの名無しさん:2006/04/10(月) 19:57:19
>>856
>そのイベントをどこが拾いますか?Formじゃないですか? 
Form じゃなくても良いですよ。


>Form→管理クラス→コントロール 
>            →ファイル入出力 
>           →データ管理 
>
>のような構造が理想だと言っているんです。 

だから、その理想に従って管理クラス作ればいいじゃん。
悪いとは言ってない。設計思想は人によって異なるから。
858デフォルトの名無しさん:2006/04/10(月) 19:58:32
表示のことで言えば、Student クラスにコントロールをバインドする方向で考えるかな。
859713:2006/04/10(月) 19:58:58
>>854
もちろんそうですよ。ビジネスロジックはそれようのクラスが担当すればいいだけで
私が言ってるのはデータの橋渡しなんですよ。
コントロールがユーザーからのデータを受け取ってそれでおしまいですか?
違いますよね?そのデータをコレクションクラスに追加しなければならないし
そのデータを元にListviewを更新しなくてはならないわけで
そのような操作をすべてFormクラスがやるのが間違っていると言っているんです
一連の動作はそれようの管理クラスがあるべきです。が、
ユーザーコントロールやコンポーネントではただのコントロールの集約でしかありません。
一連の流れのある振る舞いを管理するものではありません。
もう少し理解力のある人いませんか?何度も同じ説明させないでください。
過去ログみて、それでも意見がある人が答えてくださいよ
860デフォルトの名無しさん:2006/04/10(月) 19:59:08
>>856
「過去ログ嫁」はみんなが君に対して思っている言葉だよ orz

> ヘルプがないんだから仕方がありません。

んな逃げ口上言うなよ
おれは昔からMSDNだけで勉強して開発してるよ
2ちゃんに書き込めるのにMSDNが見れないなんて馬鹿なこと言わないよな
861デフォルトの名無しさん:2006/04/10(月) 20:01:03
>>856
>のような構造が理想だと言っているんです。

713 の目的が聞きたい。とりあえず下から選んでくれ。

[1] 構造が上手に設計できなくて困っている。アドヴァイスが欲しい。
[2] 理想的な形を見つけた。みんなに布教したい。
862713:2006/04/10(月) 20:01:36
>>858
つまりデータの中身のある場所の参照を表示コントロールのデータに渡すっていうことですよね?
listviewでデータが削除されれば、参照元のデータも削除されると。それでいい場合もありますよ。
しかし、データを壊されたくない場合はそういう訳には行きません
863854:2006/04/10(月) 20:01:48
>>859
>コントロールがユーザーからのデータを受け取ってそれでおしまいですか? 
おしまいだよ。それ以上は望んでいない。
864デフォルトの名無しさん:2006/04/10(月) 20:08:26
>>856 >>750,765で結論でてるんだよ池沼。
865デフォルトの名無しさん:2006/04/10(月) 20:08:48
>>859
君が書いてることはさ、オブジェクト指向とかデザパタとか色々な手法でとっくに議論されてきた話題だよ。
そしてそれに対する実装も、いくつかは君の言う通りに解決されてる。
でも全てが全て君の言う通りじゃない。
そこは何かと言うと、データの扱いに対する責任区分。
君はユーザサイド(主にプレゼンテーション層)からのデータ整流ばかりを気にしてシステム全体でのデータの流れを見ていない。
そこに対してみんなが違和感を感じてツッコミを入れてくるわけ。

じゃあどうすればみんなと対話ができるかというと、君の理論をまとめてドキュメント化して「これでどうですか」とするしかない。
言ってる範囲が無駄に広くてレスの応酬で片付かないし、お互い断片的な部分しか見れないからまともな対話にならない。
だから君の自論を文章化するなりして明示せよ。
それは新たな開発方法論として人がついてくるかも知れないし、よく見れば既存の方法論の劣化版や旧版に過ぎないかもしれない。
君の脳内の全容を知っているのは君しかいないんだから、それをみんなに「わかりやすく・まぎれなく・必要充分に(ISBN4-526-04317-6のキャッチコピーより引用)」表現してくれ
まともな話はそれからだ。
866713:2006/04/10(月) 20:09:34
>>863
ちょっと次元が違いますね
私はコントロールにデータ処理までさせるなんて言ってませんよ
あなたはテキストボックスに入力された文字をListViewにどうやって表示させる気ですか?
わたしはその部分の話をしているんです
867854:2006/04/10(月) 20:10:35
>>859
付け加えておく。俺は 713 の設計思想には、大筋で同意しているんだ。
反論しないでくれ。ややこしくなるorz
868デフォルトの名無しさん:2006/04/10(月) 20:10:55
まぁ大量にレスすると不都合なのスルーされるからとりあえず>>861に答えてもらおうぜ
869デフォルトの名無しさん:2006/04/10(月) 20:12:22
>>868
[3]みんなが知ってることを、さも自分だけは気付いたように勘違いして皆を見下したい。
870854:2006/04/10(月) 20:14:18
>>866
>あなたはテキストボックスに入力された文字をListViewにどうやって表示させる気ですか? 
少なくとも、TextBox -> ListView の連結は Form が担当することじゃないし、知っているべきことでもない。

よく考えて。TextBox から入力されたデータは、ListView に伝わらない可能性は?
ListView には TextBox から入力されたデータ以外のものは表示されないの?
871713:2006/04/10(月) 20:15:01
>>865
確かにそうですね。抽象的なこと言ってても解決されませんね。
わかりました。ちゃんと私が作成した実データを元に反証して頂く事にしましょう。
872デフォルトの名無しさん:2006/04/10(月) 20:15:42
なんの為に?
873854:2006/04/10(月) 20:16:44
というより 713 がステキすぎるw
ここまで話せるのが初心者だとは思えないww
874デフォルトの名無しさん:2006/04/10(月) 20:17:42


それ以後、713を見た者はいない・・・・

875デフォルトの名無しさん:2006/04/10(月) 20:20:27
よくわからんのだけど「管理クラス」ってのは複数あるんかな?
ひとつだと結局Form上で作るのとあんまりかわらんよな
876デフォルトの名無しさん:2006/04/10(月) 20:21:13
プログラミングなんて知らないユーザーが頭に描いているアプリの構造を
そのまま実現したいんじゃないのか?
それに開発者が振り回されたらたまらん。
877デフォルトの名無しさん:2006/04/10(月) 20:23:42
香ばしい・・・実に香ばしい。
ぉぃ、君!>>713は何でできているのかね?
878デフォルトの名無しさん:2006/04/10(月) 20:26:49
713の成分解析結果 :

713の43%は大人の都合で出来ています。
713の31%は鉄の意志で出来ています。
713の14%は時間で出来ています。
713の9%は黒インクで出来ています。
713の2%は勢いで出来ています。
713の1%は血で出来ています。
879デフォルトの名無しさん:2006/04/10(月) 20:27:16
まともにレスしてる奴は自演じゃないのか?
なんにしてもウザ過ぎる
880デフォルトの名無しさん:2006/04/10(月) 20:27:29
まちがった。こっちだ。

713[sage]の成分解析結果 :

713[sage]の58%は波動で出来ています。
713[sage]の37%はやましさで出来ています。
713[sage]の2%はやらしさで出来ています。
713[sage]の2%は嘘で出来ています。
713[sage]の1%は食塩で出来ています。
881デフォルトの名無しさん:2006/04/10(月) 20:30:14
>>713
つーか自分でサイトでも立ち上げて
そこに掲示板でもなんでもつくってそこで議論してくれ。
882713:2006/04/10(月) 20:38:34
>>875
複数あります。そうでなければ分担作業にならないですからね。

たとえば、入力された文字をすべてリストビューに表示するみたいな
閉塞的で単調な労働をさせられるならユーザーコントロールなどで統合しても問題はないでしょう。
しかし、入力された文字が、「ファイルを開く」だったら?「データを参照」だったら?
呼ばれるコントロールも動作も変わってきます。
それをユーザーコントロールだけで管理するんですか?

ファイルを開くだったら、ファイルを開いて、ListViewItems形式に変換してlistviewに表示する
データ参照だったら、格納されているデータを読み出し表示する

こういったことに柔軟に対応させるには、コントロールの統合だけじゃ役不足なんです。
入力された文字から木の枝のように伸び分かれる一連の動作をそれぞれ管理する場合
Formクラスの上のメソッドのような、管理権限が平等でだらだらと書き記したコード群は綺麗だとは言えません
管理クラスとは一連の動作を柔軟に対応するだけでなく、管理権限の優劣をつけるものでもあります
何度も言うように、Formクラスを社長というなら、管理クラスは直属の上司です。
社長いうことは絶対ですが、通常は直属の上司が平社員の動作を監視します。
PublicやPrivateなどのアクセス権だけでなく、管理権限にも優劣をつけるべきだと思います
1つのアプリケーションを複数の人が作成する場合のことを考えてください。
関数的なクラスの分担だけでなく、ある一定の権限をも持つべきだとは思いませんか?
それをFormとコントロールとの関係へと修正させたいわけなんです。

まあ、のちのち、私が作成したソースをみなさんに提出しますから
そのときにご意見あれば言ってください。
883デフォルトの名無しさん:2006/04/10(月) 20:41:00
>>882
>複数あります。そうでなければ分担作業にならないですからね。 
これが間違い。
884デフォルトの名無しさん:2006/04/10(月) 20:41:57
こないだ似た様なスレみたなぁ

正直HTML + CSS でデザインするのいやなんですけど
ttp://pc8.2ch.net/test/read.cgi/hp/1018053359/
885デフォルトの名無しさん:2006/04/10(月) 20:42:48
お前らこの池沼によく付き合ってられルナ。出来れば別スレ立ててそっちでやってくれ。
スレが汚れる8。
886デフォルトの名無しさん:2006/04/10(月) 20:43:29
>>882
オブジェクト指向勉強したらまたおいで。待ってるから。
887デフォルトの名無しさん:2006/04/10(月) 20:45:44


それ以後、713を見た者はいない・・・・



888デフォルトの名無しさん:2006/04/10(月) 20:55:27
>>713
悪いけど別にスレ立ててそっちでやってくれない?
幸いマジレスする人もいるみたいだしさ

・・・自演じゃないよねw
889デフォルトの名無しさん:2006/04/10(月) 21:31:56
しつも〜ん。RegexOptionsのECMAScriptって、どんな意味があるの?
890デフォルトの名無しさん:2006/04/10(月) 21:49:46
>>889

正規表現のオプション
http://msdn2.microsoft.com/ja-jp/library/yd1hzczs(VS.80).aspx
> 式に対して ECMAScript 互換の動作が有効になるように指定します。

あとどんな説明がいるんだ?
891デフォルトの名無しさん:2006/04/10(月) 21:55:36
>>890
ようするに、ECMAScriptの正規表現エンジン互換で動かすってことなんですか?
892デフォルトの名無しさん:2006/04/10(月) 22:07:32
良スレだったのにな……。
893835:2006/04/10(月) 22:21:03
>>850
Component使えばできるのか…知らなかったよ
と思ってMSDNとか色々見たけどイマイチつかめないなあ…
もし数行のコードで済むようなら、835に書いた内容をどなたかComponent使って
書いてみていただけませんか。
894デフォルトの名無しさん:2006/04/10(月) 22:36:00
こういうのはどの板にも居ます。
為替のスレで両建てまんせーなやつはもっと香ばしかった。
895デフォルトの名無しさん:2006/04/10(月) 23:34:12
デザインパターン以前の質問でもうしわけないんですが、

public sealed class Singleton
{
private static Singleton instance = new Singleton();
private Singleton()
{
}
public static Singleton Instance
{
get { return instance; }
set { instance = value; }
}


2度目以降の参照では、
get 以前を飛ばす理由が判りません ><
ご存知の方おねがいします
896デフォルトの名無しさん:2006/04/10(月) 23:37:43
日本語でおk
897デフォルトの名無しさん:2006/04/10(月) 23:42:21
get以前てどこ?
898デフォルトの名無しさん:2006/04/10(月) 23:45:34
シングルトンのインスタンス取得プロパティに set てどうよ。
899デフォルトの名無しさん:2006/04/10(月) 23:48:28
ほんまや、わろた。
900デフォルトの名無しさん:2006/04/10(月) 23:51:50
public sealed class Singleton 

    public static readonly Singleton Instance = new Singleton(); 
    private Singleton() {}
}

これで十分
901デフォルトの名無しさん:2006/04/11(火) 00:09:52
895です
デバッガでステップしていて気が付いたんですが、
飛ばされた部分があるのでおかしいなと思い質問しました
それと、インスタンスの有無をどこで判断したのかも
わかりません
902デフォルトの名無しさん:2006/04/11(火) 00:11:52
>>901
static メンバが何時どんなときに初期化されるのか考えると良いよ。
903デフォルトの名無しさん:2006/04/11(火) 00:45:31
904デフォルトの名無しさん:2006/04/11(火) 01:19:06
>>713
そんなことよりオブジェクト指向とかアーキテクチャとかデザインパターンとかアジャイル開発とかテスト駆動とか
その辺に興味を示せ。
そんな質問どうでもよくなるから。
905デフォルトの名無しさん:2006/04/11(火) 07:40:24
アプリを作る場合、思いつきで作っていると
とんでもないミスを犯していたり、あとで修正を加えたくなることがよくあります
結局、作り直したりやる気が無くなってしまったりするので
まず、始めにどのようにクラス設計を建てるかを考えなければと思うのですが
こういうときに便利なソフトはないでしょうか?
フローチャートみたいに大まかな流れを書き出したて、作る時の参考にしたいんですけれども
また、ほかに何か良い方法があるなら教えてください
906デフォルトの名無しさん:2006/04/11(火) 08:37:10
>>905
>こういうときに便利なソフトはないでしょうか?
Visual Studio
907デフォルトの名無しさん:2006/04/11(火) 08:49:56
VS.NETのリファクタリング機能使って
作り変え時のコストを抑えるようにすればいいと質問の内容を無視してカキコ。

中身空のクラス先に作ってXMLDOCで出力とか。
908デフォルトの名無しさん:2006/04/11(火) 09:27:58
便利なソフトなど使わなくても思いつきでつくりさえしなければそんなことにはならない。
909デフォルトの名無しさん:2006/04/11(火) 15:26:02
>>905
最初に適当に書いたソースを眺めて反省しながら設計する。
910デフォルトの名無しさん:2006/04/11(火) 17:13:02
>>905
>とんでもないミスを犯していたり、あとで修正を加えたくなることがよくあります
>結局、作り直したりやる気が無くなってしまったりするので

最初から完璧なコードなど書けるわけないだろ、
なんでミスを見つけたり修正することに対してネガティブなの?

1.下書きとしてとにかく動くものを作ってから全体を見直して完成度をあげる。
2.机上で完璧な設計をおこなってからプログラムを書き始める。
チーム作業でなければ完成度や開発効率で2の方が優れてるなんてことはない。
個人で作るアプリなら1の方が絶対楽しいし、結果的にいいソフトが作れるはずだ。
911デフォルトの名無しさん:2006/04/11(火) 17:18:46
>>905
ヒント 次につくるときのこやしとすること
912デフォルトの名無しさん:2006/04/11(火) 17:22:47
>>905 UMLお絵かきソフト
913905:2006/04/11(火) 18:03:39
絵を描く場合にまず、構図を考えるんですね
それをもとに作成していったほうが効率がいいんですが
プログラミングは実際に粘土をこねるような?
いじりながら徐々に目的のものを作り上げていく
そういう感じと捕らえていいんですか?

それにしても、フローチャート書くことがそんなにいけないことなのか?
914デフォルトの名無しさん:2006/04/11(火) 18:44:03
>>913
いや、だからVS2005持ってるんならソリューションエクスプローラあたりで
右クリックしてクラスダイアグラムの作成、とかやってみれ。当然コードとも
同期してくれる。Pro以上の機能?かも知れないが。

ちなみにフローチャートがいけないって誰が言った?そっちはWorkflow Foundation
あたりを調べてみれ
915910:2006/04/11(火) 21:42:50
>>913
フローチャートを描くのがほんとに好きならフローチャートから入ればいいよ。
要はどのようにしてモチベーションを保つかってことが大事。
プログラミングを始めた頃は何でもかんでも面白いけど知識だけで
ものを作り上げる喜びがなければ数年もしないうちに飽きて嫌になってくる。

それと今はプログラミングツールが便利になって開発効率があがったけど
そのぶんドキュメント化されてないノウハウや落とし穴も大幅に増えている。
プログラミングに上達しようと思ったらデッサン力と同時にツールに対する経験と洞察力が不可欠。
そんなわけで粘土をこねるような作業を避けては通れない。

>>713のように知識だけでプログラムを解ったつもりになってると
実際に何か作りはじめた段階でくじけてしまいかねない。
916905:2006/04/11(火) 22:00:56
>>915
どうもためになるお話ありがとうございます
実戦してその結果に対して考察しながら知識と経験を高めていく。
物作りの原点を忘れていました。
ライト兄弟の時代、推力や揚力など飛ぶ原理など知らなくても
空を飛びたいという情熱で作り上げていたことを思い浮かべました
飛ぶことができて初めて、なぜ飛べたのか、より遠くへ飛ぶにはどうすればいいか
まず作ってから、考察をするべきだと言えますね

ちなみにわたしは>713ですw
917デフォルトの名無しさん:2006/04/11(火) 22:04:29
オブジェクト指向うんぬんを言う前に、構造化設計の技法を確認したほうがよさげ。
それから、きっちりオブジェクト指向のお勉強だな。

「クラスの設計が・・・」なんていうのは十年早いと見た。
918905:2006/04/11(火) 22:15:25
オブジェクト指向は理解してます
今勉強しているのはGRASPとリファクタリングです
919デフォルトの名無しさん:2006/04/11(火) 22:17:47
アホが嬉々としてわきそうなレスだな
920デフォルトの名無しさん:2006/04/11(火) 22:20:53
すごいな。UML も知らずに「オブジェクト指向は理解してます」なんていい切れるのか。
921デフォルトの名無しさん:2006/04/11(火) 22:53:48
んで>>713たんは何を作ろうとしてんの?
後学のために教えて♪
922905:2006/04/11(火) 23:06:01
本職は3Dグラフィックデザイナーをやっています。
いわゆる、みなさんと同じデジタル土方ですね。
使用しているソフト用の補助的なツールを開発しようと思って
プログラミングを勉強してみようと思いました。
ソフト付属のマクロ程度なら組むこともできるんですが、それだけでは物足りなくなったわけです
923デフォルトの名無しさん:2006/04/11(火) 23:15:38
フローチャート風のダイアグラムは、世間一般では全部まとめてフローチャートといわれたりするからな。
俺の書いたユースケースやアクティビティ、ステートチャートも全部まとめてフローチャートと呼ばれちゃってるよ。
924デフォルトの名無しさん:2006/04/11(火) 23:52:12
>いわゆる、みなさんと同じデジタル土方ですね。
ななななんですってー!キィーツ!
925デフォルトの名無しさん:2006/04/12(水) 00:01:19
ワロタw
926デフォルトの名無しさん:2006/04/12(水) 00:24:33
>オブジェクト指向は理解してます
>ソフト付属のマクロ程度なら組むこともできる
むむむー
927デフォルトの名無しさん:2006/04/12(水) 02:45:52
いいから別スレ作れ。713の質問にみんなが答えるスレとか。
928デフォルトの名無しさん:2006/04/12(水) 06:19:48
713=905だよな?ウザすぎる。あの自己中っぷりは学生だからだと
思っていたんだが、デザイナだったのね。
929デフォルトの名無しさん:2006/04/12(水) 07:43:37
そのままコンピュータの前で閉じこもっていてほしい
930デフォルトの名無しさん:2006/04/12(水) 12:11:34
トリップないし中の人って複数人いるのかなあと思ったり。
931デフォルトの名無しさん:2006/04/12(水) 17:59:44
デジタルひじかた?CG合成か?
932915:2006/04/12(水) 18:15:48
>>916
>ちなみにわたしは>713ですw
なんかそんな気がしたんだよね。

>>713って理解力はあるのに惜しいなと思ってたんだが、
別に頭が固いわけじゃなくて思いついたことを率直に言うタイプだったんですね。

優秀なプログラマになれそうな気がする、頑張って下さい。
933デフォルトの名無しさん:2006/04/12(水) 18:17:01
いいかげんにしてくれ
934デフォルトの名無しさん:2006/04/12(水) 18:30:01
じゃあ、703=905=932ってことで一件落着!暴れはっちゃく!
935デフォルトの名無しさん:2006/04/12(水) 18:31:30
まちがえっちった。
936デフォルトの名無しさん:2006/04/12(水) 22:05:29
ListViewの項目のフォーカスが変更されたときに発生するイベントってある?
項目選択の変更はSelectedIndexChangedでわかるけど、
Ctrlを押しながらカーソルキーを押してフォーカスする項目を変更したときは
どのイベントで通知されるんだろう。
937デフォルトの名無しさん:2006/04/12(水) 23:05:57
C#のオブジェクト指向は一子相伝のようですが
習得は大変ですか?がんばればケンシロウになれますか?
938デフォルトの名無しさん:2006/04/12(水) 23:11:11
>>936
ないっぽいね。
親フォームで LVN_ITEMCHANGED を捕まえるくらいか。
939デフォルトの名無しさん:2006/04/12(水) 23:33:35
>>938
レスありがとう。
ラベルの編集は開始と終了別で教えてくれるのに、
より基本的な変更は簡単にいかないのな。
940デフォルトの名無しさん:2006/04/13(木) 01:46:45
>>713 = 905
なんかオブジェクト指向を理解した気になってるようだが
そんな簡単に理解できるほど浅いモノではない。
ポリモーフィズムとかインヘリタンスとかの意味をちょちょいっと調べて、オブジェクト指向をわかった気になってるとかそんなだろうな。

つーか

>アプリを作る場合、思いつきで作っていると
>とんでもないミスを犯していたり、あとで修正を加えたくなることがよくあります
>結局、作り直したりやる気が無くなってしまったりするので

とか言ってる時点でオブジェクト指向の入り口すら、全くもってわかってない。
941デフォルトの名無しさん:2006/04/13(木) 01:49:16
あとリファクタリングはテスト駆動開発で用いる手法であって、単体テストありきだから。
君みたいな素人には早いんじゃない?
942703:2006/04/13(木) 02:28:34
nunitの使い方がよくわからない・・・ぐふぅ〜w
943デフォルトの名無しさん:2006/04/13(木) 02:33:12
>>940
おまえしつこいな
もうええやろ
944713:2006/04/13(木) 02:41:08
713の間違いw
やっぱ、地道にプログラミングに慣れていくしかないかな
945713:2006/04/13(木) 02:47:55
>>940
オブジェクト指向?たくさん本読んだからわかったよ
実践はまだしてないけどね

てか、私のプログラミングのミスとオブジェクト志向への理解との相関関係がわからないのに
なぜそういうことを言えるのか不思議です。超能力者かな?
ただ、ポリモーフィズムって言いたかっただけじゃないんかと・・
ま、知識はついたからあとは実践だね。

今までの経験上、独学をやる場合の教訓は

・知識と経験のバランス
・独断と偏見は捨て先人達を敬う

だな。ま、応援してくれていると受け取っておくよ。

>>943
キミは自分以外が目立つのが気に食わないだけじゃないのかと
946デフォルトの名無しさん:2006/04/13(木) 02:49:32
誰かココID付にしてくれ。うざす。
947デフォルトの名無しさん:2006/04/13(木) 03:38:51
>>945
>自分以外が目立つのが気に食わないだけじゃないのかと

あんたは目立ちたいの?だったらただの荒らしだな。
いや・・・そうじゃなくて、みんなが使う掲示板なんだから
自分専用みたいな使い方はどうかと。
どうしてもというのなら新たなスレを作るなり、
自分のHPへ誘導するなりしたらどうですか?
948713:2006/04/13(木) 03:52:04
>>947
目立ちたいとも言っていないし
自分専用という根拠について教えてくださいな

私の発言に対して返答してたのはあなた達ですよ
私が独り言のように黙々とメモ帳のようにレスしていたのなら
私物化と言ってもいいかもしれませんけどね。
それにスレ違いの内容でもないですからね。
それより、自分専用のスレを立てるように誘導するほうがどうかしてると思います
ちゃんと2chの規約読みましたか?2ch初心者さんですか?
あなたの意見は見当違いです。
949デフォルトの名無しさん:2006/04/13(木) 04:58:12
あとは>>947が一番ウザい存在だという自覚を持ってくれることを祈るのみだな。
950デフォルトの名無しさん:2006/04/13(木) 05:44:34
>ちなみにわたしは>713ですw

この一文は何か意味あったん? 
目立ちたい以外に
951デフォルトの名無しさん:2006/04/13(木) 05:51:50
あぼーんしやすいように。
952デフォルトの名無しさん:2006/04/13(木) 06:05:30
関西弁を使う約1名が必死に噛み付いてるのはなぜ?
953デフォルトの名無しさん:2006/04/13(木) 06:54:00
>>948 これから713は713としてかきこんでくれ。おまいが言ってるように。
ほかの人は出来るだけ相手にしないでください。スレ汚されるのが我慢ならん。
954デフォルトの名無しさん:2006/04/13(木) 10:13:31
>>937
ジャギ止まり。
955デフォルトの名無しさん:2006/04/13(木) 12:19:04
いや、ここまでくるとネタだろ
とりあえずスルー推奨
&相手する奴も嵐
956デフォルトの名無しさん:2006/04/13(木) 13:45:34
Hashtableでkeyの値を上書きするのは
Hashtable[key] = 値ですが、
以下の文だと、実行時に
foreachが抜ける辺りで
InvalidOperationExceptionが
発生してしまいます。
ご存じの方、原因をご教示下さい。

//ハッシュテーブルの全ての値をkey値の2倍にする。
 public static Hashtable TestHash()
   {
    Hashtable h = new Hashtable();
    h.Add(1, 0);
    h.Add(2, 0);
    h.Add(3, 0);
    foreach (int i in h.Keys)
    {
     h[i] = i * 2;
    }
    return h;
   }
957デフォルトの名無しさん:2006/04/13(木) 13:50:58
原因は例外メッセージに書いてるとおりだが。
958デフォルトの名無しさん:2006/04/13(木) 14:02:36
foreachの取り出し元の変数に変更加えちゃいけないんだっけか?
そのような処理したい場合はいったん配列にキーコピーとかかしら?
959デフォルトの名無しさん:2006/04/13(木) 14:11:45
つーことでこれでうごいたぽいけど、いい方法かどうかはしらん

Hashtable h = new Hashtable();
h.Add(1, 0);
h.Add(2, 0);
h.Add(3, 0);
int[] a = new int[h.Count];
h.Keys.CopyTo(a, 0);
foreach (int i in a)
{
Console.WriteLine("{0}, {1}", i, h[i]);
h[i] = i * 2;
}
960デフォルトの名無しさん:2006/04/13(木) 14:42:23
>>958-959
ありがとうございます。

foreach のループ対象はkeyの値ですし、
実際に取り出したkey値を操作するのではなく、
ハッシュリストの値の方を編集するわけですし・・・

実際のコードは、以下の様に、編集後のレコードを
もう一つ別に作成したHashtableに入れて、返しています。
キーをコピーした方法も試してみます。
Hashtable h = new Hashtable();
Hashtable rh = new Hashtable();
h.Add("a", 1);
h.Add("b", 2);
h.Add("c", 3);

foreach (string key in h.Keys)
{
  rh.Add(key,(int)h[key] * 2);
}
return rh;
961936:2006/04/13(木) 18:58:33
LVN_ITEMCHANGEDの定義を調べてみたんだが、
こんなのや
#define GVN_SELCHANGED LVN_ITEMCHANGED
こんなの
#define LVN_FIRST ((UINT)-100)
#define LVN_ITEMCHANGED (LVN_FIRST-1)
しか見つからない。
ダメもとでm.Msg == checked((uint)-0x100-1)なんてのも試した。
ローカルの.NET関連のフォルダも見たけどだめ。
WndProcをフォームとリストビューそれぞれに置いてメッセージを調べてみたが、
項目のフォーカスが変更されたときに発行されるものがないような。
それとも>>938は、項目のフォーカスが変更される可能性のある操作を
すべて受け取れって意味だったのかな。
962デフォルトの名無しさん:2006/04/13(木) 19:18:32
あ、そこから解説必要だった?
**N_*** ってメッセージは NotifyMessage って言われるもんで、WM_NOTIFY で親フォームに送られる。
WM_NOTIFY を受け取った場合、LPARAM を NMHDR 構造体にキャストして code メンバでどのメッセージなのか確認する。
// これに関しては unsafe でポインタ使った方が凄い楽。
で、pnmhdr->code == LVN_ITEMCHANGED のときにあれこれする。
ちなみに、WM_NOTIFY は親フォームに流れるけど、
.NET では親フォームはそのコントロール自身にも (WM_REFLECT + WM_NOTIFY) を改めて送信するので、
コントロール自身でも判断可能だ。
963デフォルトの名無しさん:2006/04/13(木) 23:16:30
713の降臨まだぁ?
964713:2006/04/14(金) 00:12:53
今APIについて猛勉強中
資料が少ないから大変だけど、おもしろいねこれ
てか、選ぶ言語間違えたかな。C++のほうがいいみたい
965704:2006/04/14(金) 00:32:40
>>705
うーん、以下のコードだと呼ばれないんですが。
適当なFormの中のコードです。
Formに配置されたボタンを押すとgcButton_Clickが呼ばれると思ってください。

private Button testButton = null;
private void gcButton_Click(object sender, EventArgs e) {
 if (testButton == null) {
  testButton = new Button();
  testButton.Disposed += new EventHandler(testButton_Disposed);
  Controls.Add(testButton);
 } else {
  Controls.Remove(testButton);
  testButton = null;
  GC.Collect(); //<- ここでGCしてもtestButton_Disposed()が呼ばれない
 }
}
void testButton_Disposed(object sender, EventArgs e) {
 Debug.WriteLine("button disposed.");
}
966デフォルトの名無しさん:2006/04/14(金) 00:37:14
GC.Collect() したら GC されるって保障されてんだっけ?
967デフォルトの名無しさん:2006/04/14(金) 00:50:32
うっわぁ、ほんとに713降臨しやがった^^;
君うざすぎw
C++の方がいいって思うんだったらC++に乗り換えなよ
そんでもうC#には関わらないで^^





っていうと、今更乗り換えられないとか、途中で投げ出したくないとか、C#をちゃんと覚えてからとか言うんだろうね
そんでここのスレにいつまでもまとわりつくと。
968デフォルトの名無しさん:2006/04/14(金) 00:51:49
1回目はファイナライズキューに入り次のGCで破棄される
969デフォルトの名無しさん:2006/04/14(金) 01:00:33
>>965
いわゆるデストラクタってのはファイナライザのこと。
ファイナライザはオブジェクトが削除されるときに呼び出される。
で、Disposed イベントは Dispose() メソッドが呼ばれたときに発生する。
Dispose() とファイナライザは直接は関係ないよ。
Disposed を発生させたいなら明示的に Dispose() を呼び出さないと。
970デフォルトの名無しさん:2006/04/14(金) 01:04:20
っていうかぁ、ファイナライズではイベントハンドラなんて呼ばれないと思うんですけどぉ。
971デフォルトの名無しさん:2006/04/14(金) 01:05:54
あう、時間差で…
>>970>>965あてなの
972704:2006/04/14(金) 01:16:18
>>970
じゃあ>>391は嘘なのかな?
IDisposeを実装してるオブジェクトはDispose()はプログラムで明示的に呼び出せと?
ちなみにボタンを動的にControls.Add()したままの状態でFormを閉じるとDisposeが呼ばれます。
973デフォルトの名無しさん:2006/04/14(金) 01:16:53
確かデストラクタはFinalizeメソッドに変換されるんだよな。

IDisposable実装クラスのファイナライザは、通常Dispose(false)を呼び出すように設計しなければならない。
んで、実際System.Windows.Forms.Buttonクラスの基本クラスであるSystem.ComponentModel.ComponentクラスのFinalizeの中身を
覗いてみると、ちゃんとDispose(false)を呼び出している。
ちなみにDispose(bool disposing)メソッドの中でイベントもちゃんと呼ぶようになってるぞ。
だからGCがButtonクラスの回収をすればイベントは発生するはずということ。

んで、GC.Collectっていうのはガベージコレクタを即実行するわけだが、
ガベージコレクタってのは世代管理を行っていて引数を指定しないでGC.Collectを呼び出した場合は
メモリがやばくない限り1世代目の回収しかしない(あとここで世代移動が行われる気がした)。だから必ずしもButtonオブジェクトがGCに回収されるとは限らないわけだ。

つまり、GC.Collect(3)ってやればOKだと思う。
974デフォルトの名無しさん:2006/04/14(金) 01:22:32
もしかしたら多少違ってるかもしれんから、一度自分でGCについてちゃんと調べることをお勧めしとくよ。
975デフォルトの名無しさん:2006/04/14(金) 01:22:56
>>972
なんで嘘になるのさ。
Disposed イベントなんて所詮ただのイベント。オブジェクトの掃除とは何の関係もない。
IDisposable は Dispose() が呼ばれなかったら最終的にファイナライザが Dispose(false) を呼び出す。
Dispose(false) は Disposed を発生させないってだけの話。

>>973
Dispose(false) の場合は Disposed を発生させない。
ファイナライザでは参照型のメンバにアクセスしちゃ駄目だから。
もちろんイベントの実体もデリゲートインスタンスなのでファイナライザではさわれない。
さらに、GC.Collect() は全世代のオブジェクトに対して GC を行うとリファレンスに明記されてる。
976デフォルトの名無しさん:2006/04/14(金) 01:26:23
>>975
すまん、至る所で勘違いが混じってたな。首吊ってくるorz
977970:2006/04/14(金) 01:27:38
>>972に突っ込もうと思ったけど>>975がみんな書いてくれた…
978704:2006/04/14(金) 01:31:07
>>975
理解しました!
動的ボタンを直接Buttonクラスを使わず以下のように継承してMyButtonを定義し、
overrideしたDisposeメソッドはきちんと呼ばれました。
 private class MyButton : Button {
  protected override void Dispose(bool disposing) {
   Debug.WriteLine("button disposed." + disposing);
   base.Dispose(disposing);
  }
 }
MyButton testButton = null;
979デフォルトの名無しさん:2006/04/14(金) 01:32:42
>覗いてみると、ちゃんとDispose(false)を呼び出している。
>ちなみにDispose(bool disposing)メソッドの中でイベントもちゃんと呼ぶようになってるぞ。
ここまで見といてなんでその際の条件を見ないw
980デフォルトの名無しさん:2006/04/14(金) 10:07:42
GC.WaitForPendingFinalizersも呼んでおくと幸せになれそう。
とチラシの裏。
981デフォルトの名無しさん:2006/04/14(金) 23:20:39
>>962
丁寧な解説どうもありがとう。
LVN_ITEMCHANGEDの定義の
#define LVN_FIRST (0U-100U)
#define LVN_ITEMCHANGED (LVN_FIRST-1)
が0xffffff9bなんだろうということもやっとわかった。
ただ、LVN_ITEMCHANGEDどころかまずWM_NOTIFYが送られてこないような。
if( m.Msg == 0x004e ){ ... } //こんな感じでスタンバってる
フォーカス移動を知りたいだけなのになんでunsafeとか使わにゃいかんのだ、Gates。
982デフォルトの名無しさん:2006/04/14(金) 23:29:05
>GC.WaitForPendingFinalizersも呼んでおくと幸せになれそう。
なんですと?
983デフォルトの名無しさん:2006/04/14(金) 23:56:37
>>981
WM_NOTIFY は親フォームに送られるって点は OK ? コントロール自身が待ってない?
ていうかここにかいてあった
ttp://hongliang.seesaa.net/article/16550502.html
984デフォルトの名無しさん:2006/04/15(土) 00:19:03
MSのコードは適当なタイミングでGC.Collectとか
GC.WaitForPendingFinalizersとか呼んでるね
985デフォルトの名無しさん:2006/04/15(土) 01:23:26
968が正解
986デフォルトの名無しさん:2006/04/15(土) 12:28:54
MenuStripを持つ子ウインドウをそのメニューから
this.Close()で閉じるとObjectDisposedExceptionが発生するんですが
ただしい娘ウインドウの終了の仕方ってどんなんでしょう?
987986:2006/04/15(土) 12:42:30
いまテストしてみたんですが、

ToolStripMenuItemの
DropDownItemClickedイベントでthis.Close()で閉じると例外、

サブメニューそのもののClickイベントで閉じれば例外が起きません。
こっちでやれってことですかね
988デフォルトの名無しさん:2006/04/15(土) 12:42:48
微妙に意味が取りづらいが、発生しないよ?
989986:2006/04/15(土) 13:06:54
えーとですね、
子フォームにMenuStripをくっつけて、最初のアイテムを"ファイル”として、
そのサブアイテムを”閉じる”とします。

”ファイル”のDropDownItemClickedでthis.Close();を呼ぶと例外、
"閉じる"のClickでthis.Close()なら普通に閉じる。

うちでは100%再現するんですが、(VS2005Express)
とりあえず下の方法でお茶を濁しました……
990デフォルトの名無しさん:2006/04/15(土) 13:10:04
>>989 自分はそういう自分のせいでない(と思いたい)例外が出るときは、めんどくさいのでイレギュラーな手でお茶を濁す。まぁ全体に影響しない範囲でだが。
この場合なら別スレッドにhandleわたしてPostMessageすると思う。
991デフォルトの名無しさん:2006/04/15(土) 13:10:26
いや、それは当然だろ。
さあサブメニューを表示しようって時にいきなり親が Dispose されるんだから。
なんで DropDownItemClicked で this.Close なんだよ。
992デフォルトの名無しさん:2006/04/15(土) 13:16:22
>>991
ああ、そういうことですか。

"DropDownした先のItemをClicked"じゃなくて
"DropDownするItemをClicked"って意味だったんですか。

あんまり腑に落ちませんが
ありがとうございました。
993デフォルトの名無しさん:2006/04/15(土) 13:27:09
うお、1000ギリギリでも埋めに入らねぇ。
994デフォルトの名無しさん:2006/04/15(土) 13:30:56
つか新スレ立ててくれ新スレ。私は無理だったし。
スレタイの♯は半角だと消えるから全角でな。Shift+3 は別の文字だから「しゃーぷ」を変換するんだ。
ていうかコピーすればいいな。
995デフォルトの名無しさん:2006/04/15(土) 13:32:10
んじゃ建てるよ?
996デフォルトの名無しさん:2006/04/15(土) 13:34:53
997デフォルトの名無しさん:2006/04/15(土) 13:39:36
ksk
998デフォルトの名無しさん:2006/04/15(土) 13:40:12
乙&梅
999デフォルトの名無しさん:2006/04/15(土) 13:41:12
Vistaはよせい
1000デフォルトの名無しさん:2006/04/15(土) 13:43:06




          次スレ以降、>>713は書き込み禁止
10011001
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。