1 :
名無しぃ♯ :
2006/03/04(土) 13:54:32 (#゚ー゚)つ < C#、.NETの話題はこちらでどうぞ。
過去スレは
>>2-5 あたり。
2 :
名無しぃ♯ :2006/03/04(土) 13:55:32
3 :
名無しぃ♯ :2006/03/04(土) 13:56:30
Wiki は既に機能してないから外した。反省はしていない。
C#でカーソルのある位置のカラーコードを取得するにはどうしたらよいのでしょうか。 例えば、黒い画像の上にカーソルを持っていくと#000000を取得する、のような感じです。 どなたか教えてください。お願いいたします。
Win32API の GetPixel かね。
.netプログラムって逆コンパイル可能ですか?
pictureBoxとかでやるんならBitmap.GetPixel メソッドとかでもokですね
9 :
5 :2006/03/04(土) 15:14:54
>>6 ,
>>8 さんご回答どうもありがとうございました。
label2.Text = Bitmap.GetPixel(x, y).ToString();
今このようにやっているのですが、
「静的でないフィールド、メソッド、またはプロパティ 'System.Drawing.Bitmap.GetPixel(int, int)' で、オブジェクト参照が必要です。」
というエラーがでて、コンパイルできません。
どのようにやったらよいのでしょうか?
ずこー
>label2.Text = Bitmap.GetPixel(x, y).ToString(); GetPixelはスタティックなメソッドではないからエラーが出る 例えばprivate PictureBox p;という感じでクラス変数として持ってるなら p.Image.GetPixel(x, y);こんな感じで使う ソースがどうなってるかわからんので、こういう感じでしかアドバイスできません
やはりふらっとスレを復活させるべきかも知れぬ
13 :
デフォルトの名無しさん :2006/03/04(土) 16:50:57
14 :
5 :2006/03/04(土) 18:10:03
詳しい説明ありがとうございました。 まだまだ勉強不足ですね。がんばってきます。
usingでのオブジェクトの解放って、みんなどれくらい使ってる? ガベージコレクションがあるし、そんな気にしなくていいじゃんと、 あんまり使わない派か、ほっとくのも気持ち悪いので、頻繁に 使う派か。
使うべきところで使う
ガベージコレクションはそのうち暇があったら整理してくれる程度に過ぎない 要らないでかいオブジェクトや貴重なリソースを保持するオブジェクトは 不要になったら明示的に捨てるベッキー
そうでもない
usingは()の中に長々と書くことになりかねないから使わん( ゚д゚)、
usingかDisposeかの話なら 中が長いときはDisposeで短いときはusingやなー
>>20 でもtry-finallyだとスコープを一個外に出さんといけないのがいや。
まぁケースバイケースだけども。
画像とか、大きいオブジェクトを扱う時だけかな。むやみやたらには使わない。 メモリを意識しすぎるとmalloc/freeやnew/deleteと何らかわりないと思うよ。usingしてもGCしてもちゃんと解放されることに変わりはないし。
>>23 「メモリを意識しすぎる」なんて考えてるから分からんのだよ
例えばGDIリソースならヒープの領域サイズが固定で決まってい
るので、メインメモリ確保量に関係なく、放置してたらデスクトップ
アプリケーションヒープを圧迫する。それはGCが感知することが
出来ない。
一言でいえばコンピュータにある限定されたリソースなんてのは
メモリだけじゃないんだ。あらゆるリソースが限定されていると
いってもいい。GCはそのうち「メインメモリだけ」を扱う。それ以外の
リソースについて管理する手間が減るわけじゃない。
それにFinalizerの実行保証は2.0からだぞ?ついでに言えば
スレッド依存性を持つリソースはFinalizerで開放することは無理
なのでDispose呼んでくれないとリークさせるしかない
メソッド内のローカルなクラスが消えるのを見てみようと試したら、 メソッド抜けたら速攻で消していきますね。 つーか本当に消したのかな。デクストラクタでメッセージ出しただけだが。
ローカルな変数(に格納されたクラス)は別枠ですぐ解放じゃなかったか
GCは悪
正直、ファイナライザなんて要らんからデストラクタ返せと思う C#のあれをデストラクタなんて呼んでると、C++と関わるときに不幸になる
C++ と関わると不幸になる そもそもそれは C++/CLI に言ってやれ
世界で最も パワフルかつポピュラーな言語はC++だと思うんだが… ゲーム機も片っ端からC++だし ま、それは言語議論スレにでもまかせておくが、正直C++にboost::smart_ptrがある以上C#の魅力はあまりないんだよなぁ
31 :
デフォルトの名無しさん :2006/03/06(月) 01:28:09
スレ違いです
携帯電話ゲーもau以外はJavaですよ?
33 :
デフォルトの名無しさん :2006/03/06(月) 09:42:47
リサイズされたときに Paint を呼んで欲しいので、 InitializeComponent(void) の中で this.SetStyle(ControlStyles.ResizeRedraw, true); を呼んでいるのですが、この設定ってデザイナでできませんか? 手書きすれば済む話なんですが、できるだけ デザイナでさくさくやりたいなぁ、と。
34 :
33 :2006/03/06(月) 10:39:54
InitializeComponent(void) の中で、ってのはうそです。 「後で」の間違いでした。
OnResizeじゃだめなのか? リサイズされうるものならたぶんあると思うんだが
37 :
デフォルトの名無しさん :2006/03/06(月) 19:31:02
イベントにGraphicsオブジェクトが入ってるけど その中にクライアント領域のサイズが入ってないのは不便じゃねぇ?
そもそも何のイベントだよ
39 :
デフォルトの名無しさん :2006/03/06(月) 20:46:13
ああ、 PictureBox の Paint イベントなんだけろ
あんたがプロパティをろくにチェックしていないのはよくわかった
>>40 kwsk おしえてくれ〜
ちなみにクリッピング領域はGraphicsオブジェクトに入ってるんだよな。
>>37 senderとPaintEventArgs.ClipRectangleでサイズ関係は全部取れるのにGraphicsオブジェクトになんで必要なの?
あちこちに同じ情報がある必要は無いし、そもそもGDI+に紐付くGraphicにWindowのサイズ関係が無いと不便と言う発想が理解できない
消す ・・・消す・・・ 消す消す消す消す 速攻で消す GCまかせだとこんな感じですか
意味分からん
>>43 そんなに焦ってない
消す・・・そろそろ消そうかなぁ・・・忙しいから後で・・・
暇になってきたから消そう・・・次は・・・
何か気分乗ってきたからまとめて消そう!
こんな感じ
つまり、任せて信頼しきると微妙に裏切られる
パフォーマンスが最大になるように注意しながら消してもらえる
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); } 雛形ってこんなんですか?
>>47 is_disposed は必須じゃないとおも
メモリ再配置してくれんのは楽でいいと思うよまじで
明示的にGCを起動させた方がいいのは、 比較的大きなオブジェクトを生成し、 それを長いループの最初の1回だけで使用し あとはメソッドを抜けるまで1回も使用しないような状況のときだな。 例えばだけど。
[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を自動でクリアしたいんですが、 どうすればいいでしょうか。
Hashtable の方が良くね?
ミノタブとの併用者なんですけど、経過報告ダメですか?
54 :
53 :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
58 :
デフォルトの名無しさん :2006/03/07(火) 21:01:18
ツリービューにチェックボックスを出して、下階層のチェックがオンオフ 混合のとき、親ノードのチェックをグレーにするにはどうしたらよいですか? Windows Formで1.1です。
そもそも TreeView 自体 CheckState をサポートしてない。 .NET 2.0 ならオーナードローもできるが。
HashtableだとXmlSerializerはそのままでは使えないのが面倒ですね。 1.コンストラクタに初期化値をロードするロジックを書かないでロード後に空だった場合にのみ初期化値を書き込む 2.ArrayListを使わないでStringの配列にする。 のどちらかかな
61 :
デフォルトの名無しさん :2006/03/08(水) 10:41:15
>>52 >>60 やっぱり初期値を突っ込むかどうかの判断をどこかでするのが単純ですかね・・・
ファイルの有無で判断しようかとも思ってます。あえて0件にカスタマイズ
されているかもしれないんで。
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はハンドルされませんでした。 というものです。
63 :
62 :2006/03/08(水) 17:14:26
HTMLAnchorElementClass aATag = (HTMLAnchorElementClass)ee.Current; を Object aATag = ee.Current; に変えたところ正常に動作しました。 なぜHTMLAnchorElementClassが使えないのでしょうか。 すみません、分かる方いたらよろしくお願いします。
HTMLAnchorElement ならどう?
>>63 変数 aATag に格納されているオブジェクトの型を見ればいーんじゃないの
>>62 もしかしてこういう事?
・★1の地点にブレークポイントを置いてブレークして、その後F5で続行すると例外は起きない
・★2の地点にブレークポイントを置くと、その前で例外が起きてそこまで到達しない
だとすると、WebBrowserのロードが完了していないうちにパースしようとして例外が発生してるんだと思うよ
読み込みは非同期処理だから、コードは DocumentCompleted イベントを使うとか readyState を見るとか読み込みに対して責任を負わなければならない
はい、MSDNAAのおもしろプログラミングのページを参考にしました。 HTMLAnchorElementに変えたところ動作しました! いろいろとありがとうございました。
ASP.NET で JavaScript のgetElementById 相当するメソッドってありますk? 教えてエロイ人
FindControl か?
71 :
69 :2006/03/09(木) 14:41:36
>>71 DOMを相手にするならControlは広すぎ
FindControlしてHTMLGenericControl型の変数に入れるのが良いかと
事前に型が特定できるならHTMLGenericControl型の変数ではなくその型に入れるのが良いかと
73 :
62 :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 と表示されます。このようにテーブルの入れ子になっている場合に要素内容が重複してしまいます。
74 :
62 :2006/03/10(金) 00:59:23
>>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 などは不可。
> また、こちらのパースも試したのですが、ビルドエラーになってしまいました。
なんでエラーの詳細すら書かない?
はい、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 となります。 どこが間違っているのでしょうか。
どこがって……わざわざ丁寧にコンパイラが教えてくれてるじゃん……。
ヒントをください
10時間くらい粘ったんですが、ほんとにわかりませんでした。 きついです。助言お願いします。
HTMLDocument.getElementsByTagName が返す型は何よ? IHTMLElement.children が返す型は何よ? public object Hoge() {return new object(); } ってメソッドが返す型は何よ? string str = Hoge(); ってどうよ?
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としてもエラーになります。
IHTMLElement.children の返す型はIHTMLElementCollectionであっているでしょうか? IHTMLElement elem = (IHTMLElement)ee.Current; IHTMLElementCollection child = elem.children; だとしたらこれも同様のエラーになるのはなぜなのでしょうか。 また、 Boolean flag = elem.CanHaveChildren; 'MSHTML.IHTMLElement' に 'CanHaveChildren' の定義がありません。 コンパイラ エラー CS0117 になります。
そろそろコテつけるかどうにかしてくれ
IHTMLDocument や HTMLDocument , IHTMLElement , HTMLElement 等を使って、 テーブルの何番目の行の何番目のセルの値や背景色を得る方法を知っている方がいましたら 教えていただければと思います。
> 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();
はどうよ。
まずデバッグ用の各種ウィンドウの見方を覚えることからはじめることをお勧めする 質問のほとんどはローカルウィンドウとかウオッチウィンドウで確認できることばかり 君の現時点の能力以上のことをやろうとしているんだから、今やっつけでクリアできてもまた質問厨になるだけ
87 :
62 :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#では、オブジェクトやプロパティを調べる一般的な方法はあるんでしょうか? すみませんが、わかる方いたらよろしくお願いします。
>>87 オブジェクトブラウザは
object children { get; }
mshtml.IHTMLElement のメンバ
だと言ってますが。
2.0使っているならmshtmlのお世話にならなくても
なんとかなりそうな気配がするんだけども
触らずに言っているので嘘かも。
89 :
62 :2006/03/10(金) 15:01:29
object型にはキャスト出来るのですが、object型だと.GetEnumeratorが使えないので、 どのようにして、childrenの各要素をいじれるのかわからないのです。 >2.0使っているならmshtmlのお世話にならなくても >なんとかなりそうな気配がするんだけども >触らずに言っているので嘘かも。 試してみたいので、ヒントをお願いします。 HTMLのツリー構造を解析する方法について何か知っている方がいたら、 何でもいいので教えていただけると助かります。 関連ページだけでもいいので、よろしくお願いします。
>>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);
}
}
}
ここは偉そうな人が一杯いるスレですね つーかプログラマって対人能力無いから嫌い
94 :
デフォルトの名無しさん :2006/03/11(土) 16:30:44
ODP接続でレコードカウントを取得した際、「指定されたキャストは有効ではありません」 というエラーになります。対策をご教授願います。 int iRec; ・ ・ iRec = Ora.GetInt32(0); ←ここでエラー
DbNullが入ってるとかじゃね?
96 :
デフォルトの名無しさん :2006/03/11(土) 16:39:00
>>95 レスどうも。
トレースしたら「20」という値が入っていました。(SQLはカウント文です。)
GetInt16でも駄目でした。OracleValues(0)でも駄目です。
GetDataTypeName でデータ型を調べてみたら
98 :
デフォルトの名無しさん :2006/03/11(土) 16:53:32
Decimalでした。 けど駄目です。
99 :
デフォルトの名無しさん :2006/03/11(土) 17:01:03
>>97 >>95 iRecをdecimal型にしたら取得できました。
ヒントを頂きありがとう御座いました。
OracleでのNumberはdecimalになってるからね。 直接decimal以外の数値型にはキャストできないんだよね。
101 :
デフォルトの名無しさん :2006/03/11(土) 22:45:28
C#はまだ慣れてないから面白いけど、工数が足りない・・・
102 :
デフォルトの名無しさん :2006/03/12(日) 12:42:51
すいません、 DataGridViewの内容をクリアするにはどうしたらよいでしょうか? 某サンプルにDataGridView1.Rows.Clearが載っていたから試しましたが上手く動きません。 ヘルプを見たりググっても見当たらないのですが。
内容ってどこからどこまでさ。 データソースは何さ。
104 :
102 :2006/03/12(日) 13:09:58
>>103 データソースは使っていません。
ホームページから取り込んだ表(HtmlElementCollection)を以下のように表に取り込んでいます。
DataGridView1.Rows.Add(new object[] { Data1, Data2, Data3 });
更新が出来なくて困ってるんです。
>>92 >>91 これだけ書いてもらえれば十分優しいだろ。
一人でいくつも投稿したら、うざがられるにきまってる。
mixiでトピでも立てろ。コテだとみんな親切に振る舞うからな。
>>104 Rows.Clear で問題なさそうだが、どう「うまく動かない」んだ?
107 :
デフォルトの名無しさん :2006/03/12(日) 13:51:09
C#では構造体のメンバを配列に指定することができるのでしょうか? 下記のインスタンスを生成した際、「構造体にインスタンスフィールド 初期化子を指定することはできません。」というエラーとなります。 ご教授願います。 structure{ public [] array = new string[10] }
引数付きコンストラクタ定義して初期化汁
109 :
デフォルトの名無しさん :2006/03/12(日) 14:30:27
こんど、C#を使ってアプリケーションを開発する事になったのですが、 初めてなので、色々と勉強しております。(今までVB6かVC6でした) そこで、質問なのですが、DBを使用して色々と弄ってみようと思ったのですが、 色々と疑問が湧いてきました。 コネクションやらアダプタを貼り付けて・・・というサンプルを書籍やインターネット上でよく見かけます。 確かに、そういった開発はサンプルを元に出来るようにはなったのですが、 複数画面あるアプリケーションが一般的であり、そういった画面1つ1つにコントロールを貼り付けて・・・ という作業は非効率的な気がします。 また、データベース接続部分などを関数化して・・・というサンプルも見かけるのですが、 どれも接続文字列のみを外部や引数などで取得し、DataSetやDataAdapterを作ってから、 それらのオブジェクトを戻り値として返すようなものを多く見かけます。 VB6などでは、グローバル変数にコネクションなどを宣言しておいて、 ログイン処理などのあとは1つのコネクション変数に対してレコードセットを作成したりしていました。 C#でまったく同じという訳にはいかないでしょうが、アプリケーションが終了するまで 1つのコネクション参照するといった事はNGなのでしょうか? もしNGでないならば、そういったサンプルがありましたら書籍やHPなどの情報を教えて頂きたく。
ADO.NET では、コネクションは必要なときに作っていらなくなったらさっさと破棄するもの。
112 :
110 :2006/03/12(日) 17:47:46
>>111 なるほど。
でも、そうすると別の疑問が湧いてきます。
DBアプリケーション全般に言える事だと思うのですが、
DB接続のコストはCPU負荷も時間も相当のコストを使うものだと思うのですが、
そんなに接続・切断を繰り返していいものなのでしょうか?
また、(機能の異なる)複数の画面が同時に立ち上がったとき、
コネクションの数はどうなるのでしょうか?
1つのアプリケーションで2つ3つ、場合によっては数十個のコネクションが生成されるのでしょうか?
だからそのためにコネクションプーリングと言う仕組みがある プログラマが意識する必要はないが
>>112 111に補足すると、必要な時と言うのは別に1レコードセット単位という訳ではない。
連続したDBアクセスがあるなら1つのコネクションを使いまわすべき。
途中にユーザのアクセスを挟まないのを基本的な1単位とすると良い。
次に、DBとのコネクションは「同じユーザ」が「同じ接続文字列」で接続した場合にコネクションプーリングが機能して無駄なコネクションが発生しなくなる。
普通アプリケーション内では同じ接続文字列を利用するため、キーになるのは「同じユーザ」であること。
もし認証機構の都合で同じユーザにならない場合は、擬装を用いて同じユーザにする。
ASP.NETでは基本的に同一の接続文字列を使うだけでプーリングが機能するので楽だが、Windowsアプリでは色々と意識することが必要(データ層で擬装するなど)
また、どうしても複数ユーザを用いる場合はプール数を調整するなど色々な対処方法がある。
この手のことはMCPを勉強すると当たり前の知識になる
MCPを開発者は馬鹿にすることが多いが、初心者はMCPの勉強を一通りやることをお勧めする(実際に受験する必要はない)
下手な参考書見てぐぐるよりよっぽど体系的な知識が付く
115 :
102 :2006/03/12(日) 19:00:06
>>106 >Rows.Clear で問題なさそうだが・・・
とおっしゃるので実験したら、出来ました。
どうもウェブの再読み込みに問題があるようです。
どうもありがとうございました。
116 :
110 :2006/03/12(日) 20:01:38
>>113-114 なるほど参考になります。
ただ1つ気になったのは、
>もし認証機構の都合で同じユーザにならない場合は、擬装を用いて同じユーザにする。
>ASP.NETでは基本的に同一の接続文字列を使うだけでプーリングが機能するので楽だが、Windowsアプリでは色々と意識することが必要(データ層で擬装するなど)
偽装をした場合、DBに対しては接続ユーザを正確に知らせる事は出来るのでしょうか?
(例えばOracleのログイン・ログオフ データベーストリガーでユーザのアクセスログなどを取っている場合など)
個人情報保護法の関係で、こういった情報が必要ですので、誤魔化せるとなると
逆にどうやっても誤魔化せないように実装しないといけないので・・・
>>116 > 偽装をした場合、DBに対しては接続ユーザを正確に知らせる事は出来るのでしょうか?
無論偽装したんだからできない
DBレベルでセキュリティ強化するのであればプーリングはユーザ単位にするしかない
あらゆる要素を都合良く盛り込むことはできないから、何かをトレードオフする必要があるわな
ただ、Oracleの接続にADO.NET以外を使えば解決策があるかもしれない
そこはもうADO.NETもC#も関係ないOracle開発の世界だからそっちのコミュニティなりスレで聞くべし
118 :
デフォルトの名無しさん :2006/03/13(月) 00:39:33
C#って最強の言語じゃね?
いいえ
120 :
102 :2006/03/13(月) 00:54:25
今度はキャッシュに困ってます。 webBrowser_DocumentCompletedでHtmlDocumentを解析して表を取り込んでいるのですが、 更新が上手く出来ません。Navigateで飛ばすとキャッシュを読み込んでしまいます。 Refreshでキャッシュを消してもDocumentCompletedを呼び出してくれません。 Refresh後SleepさせてからNavigateでDocumentCompletedで呼び出しても駄目でした。。 ヘルプに、「キャッシュ内で存続できる時間を示す有効期限を指定できます」とあるのですが、 その方法が記されていません。ならばレジストリを直に操作しようと思ったのですがググっても出てきません。 どなたか良い方法を御存知でないでしょうか?
まあ Refresh 呼び出して ReadyState が Complete になるのを待つしかないんじゃない? いっそ WebClient でローカルにファイルを保存してそれを開くようにした方が手っ取り早いかもね >キャッシュ内で存続できる時間を示す有効期限を指定できます これは相手のサーバが返す値をキャッシュに保存してるってことのはず 指定するのは相手のサーバ
>>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が変われば違うページと認識することを利用して、毎回ランダムな引数を付与するって方法もある。
基本を知っていればこの程度の情報は簡単に検索できる。
逆を返せば、最低限の知識も無く実装しようとしている。
もっと基本的な事を理解してから手をつけるべきだと思うよ。
誰が使うか知らんが、リリース後にクレーム受けまくって対処できなくなっても知らんよ。
123 :
102 :2006/03/13(月) 11:10:28
>>122 ちょっと待ってください!
質問似てるけど私は >92とは全くの別人です!
彼のやろうとしてることは出来ます!
でもアドバイスありがとですw
なんつーか、元気はつらつ?
>彼のやろうとしてることは出来ます! 何気に自分の方が優秀だとアピールすな。
126 :
デフォルトの名無しさん :2006/03/13(月) 12:29:49
すいません。
>>107 ですが、やっぱり分かりません。
ご教授願います。
おまえネタだろw 目をくまなくして見ろ。このうんこ野郎が!
普段VB.NETメインでやってる人間なんですが、 C#ではヌルストリングを表すのに空の文字列とnull(VBではNothing)が混在するような場合 どうするのが通常でしょうか? ヌルストリングかどうか判定する際、いちいちorをとるコードを書くのが普通か。 それとも、そもそも混在を許さないようにどちらかに強制するようにするべきか。 VBでは「空の文字列とNothingは等価扱い」という(いい意味で?)いい加減な仕様になっているので 何も考えなくていいんですが。
空文字列は空文字列って値が存在してるんだから混在も何もなかろ。 どんな状況を想定してるんだ? .NET 2.0 では Stribg,IsNullOrEmpty メソッドが増えたが。
>>126 public struct Foo
{
public string[] KonoUnkoYarou;
public Foo( string[] netas )
{
KonoUnkoYarou = netas;
}
}
131 :
デフォルトの名無しさん :2006/03/13(月) 13:33:55
IsNullOrEmpty・・・・・・・・たぶん使うこと無いだろうな、一生
DELPHIのビルドの速度に感動したんですが、 C#のビルド速度ってどうですか? まぁまぁ速いならちょっと勉強しようかな・・と
>>128 VBでは「空の文字列とNothingは等価扱い」って嘘じゃない?
str=Nothing と str="" が等価なのは便宜上のうんこ仕様
vbの str Is Nothing がC#の str==null
空文字判定は、C#ではstr==""だとインスタンスが生成されるから
str==String.Emptyか、
nullじゃないことが分かってるならstr.Length==0を見るのが一般的
>>132 TurboCでも使ったら?
きっとDelphiなんて捨ててしまいたいくらい感動するから
>>132 同じボリュームのソースならC++のコンパイルより速い。
てか何でこんな速いのか謎なくらい。
136 :
120 :2006/03/13(月) 15:01:25
> 空文字判定は、C#ではstr==""だとインスタンスが生成されるから それぐらい最適化されるんじゃない? と言ってみるテスト
よくこういうコードを書くことがあるので IsNullOrEmptyは個人的にはおっけー if(foobar==null || foobar.Length==0){ ほにゃらら }
最適化というか。 "" と String.Empty は別インスタンスが作られる。 "" は "" で一つのインスタンスを使い回す。
>>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です。
>>132 速いのは結構だが、最適化とかちゃんとされてるの?
リンクされるライブラリの差は?
単に速ければいいってもんじゃないと思うんだけどね
オレはVC#2005とDelphiの同じボリューのソースのコンパイル速度がDelphiの方が圧倒的に超絶に速くてもVC#を選ぶ
ビルド速度なんて超絶に遅くなけりゃどうでもいい
ビルドの速さごときで全く違う開発系のDelphiからVC#へ乗り換えようと思うってことは、何かその部分を圧倒的に重視する理由があるんだよね
そこを重視する理由に興味がある
是非教えて欲しい
144 :
102 :2006/03/13(月) 15:23:20
>>125 いえ、別人だとアピールしたかっただけですw
>>142 基底クラスに protected virtual OnHoge を用意する。
>>145 早速のレスありがとうございます。
継承したクラスのメソッドが基底クラスのOnHoge()を呼んで、
基底クラスのOnHoge()でイベントを投げればよいということでしょうか?
そういうこと。 System.Windows.Forms のコントロール群見てもそうなってるでしょ? >派生させて OnTextChanged をオーバーライドして base.OnTextChanged を呼ばないと、 TextChanged イベントに登録したハンドラが実行されない
>>143 別人だけど、トライ&エラーで学習するなら
ビルドは速ければ速いほどいいんじゃない?
実行速度よりも重要かも。
>>148 俺も別人だけど、学習レベルのコード量で
トライ&エラーが遅くて勉強にならないという
糞マシンのスペックを教えて欲しい。
150 :
148 :2006/03/13(月) 15:57:52
>>149 さあ?
うちのPCは P4 1.7GHz+1GBmem だけど、 ビルドで不快な程待たされたことはないなあ。
最大でも30kstepくらいのものしかビルドしてないけど。
celeron1GHz+256MBmemとかの、一昔前のエントリーマシンなら
それなりに時間かかるんじゃね?知らないけど。
配列に新しい要素を追加する場合、 1.配列をコピー 2.配列の要素数を増やして初期化 3.コピーした配列をセット 4.追加したい要素をセット 現在このような方法をとっているのですが、 array.Add(index, 要素) のように、配列の要素数を簡単に動的に扱う機能というのはあるでしょうか。 Arrayクラスあたりのメソッドにあるかと思ったのですが、見つかりませんでした。
つArrayList
つ List<T>
154 :
148 :2006/03/13(月) 16:24:56
>>151 2.0ならGenericのList<>も候補
そういう「集まり」を扱うクラスは、System.Collectionsもしくは
System.Collections.Genericに色々あるから見てみるといいよ
>152-154 ありがとうございます。
>>134 TurboPascalはTurboCよりさらにコンパイルが速かったのを覚えています。
>>132 私はDelphi使いですがWindowsCEアプリを開発する必要にせまられて
VS2005を評価しています。
同じ大きさのソースで較べたんじゃないけど今までのMSの開発環境に
較べて圧倒的に速い。かつ、IDEがとても使いやすい。
DelphiがVer7の次からどんどんもっさりして使いにくくなっていってるのに
対してこれがMicrosoftの製品かと思うくらい使いやすくなってる。
以前Delphiの開発者がMicrosoftに引き抜かれたという話を聞いたことがあるが
その影響を痛切に感じました。
>>156 ベースにDelphiマンセーがあるようだけど、コア技術者が引き抜かれたってのは相当前の話だから
君が評価してるっぽい7の頃にはコア技術者はとっくにMSの住人ですよ
158 :
デフォルトの名無しさん :2006/03/13(月) 17:36:33
VisualC#2005ExpressB2を使用しているのですが、 いきなりリターンキーやバックスペースキー、デリートキーが 入力不能になることって、ないですか?
>>158 B2って何?ベータ版ってこと?
既に製品版が期間限定で無償提供されてるからそっち使え
とっくにベータ版の評価受付は終わってるから、評価しても受け取ってもらえないよ
しかしリファクタリングの機能にはかなり不満。 Eclipseに比べると見劣りするな。 せめてgetter/setterまとめて作ることはできんのかな。
無料版だからなー。 Standard 以上には確かついてるぜ。
162 :
158 :2006/03/13(月) 17:50:12
>>157 うん、DlphiマンセーというかDlphiを開発した人のコンセプトが大好き。
だから今はVS2005マンセーになりかけてる。
きみもプログラマなら、コア技術者が抜けたからと言って製品の性格が
すぐに変わる訳じゃないし、新しい製品が使い物になるのに時間がかかるって
ことはわかるよね。
時間はかかったけどmicrosoftがその技術者を活かすことが出来るような
会社だった(なった?)んだなってことを思ったってこと。
164 :
102 :2006/03/13(月) 18:04:34
>>121 遅くなりましたがレスありがとうございました。
参考にさせて頂きます。
System.Runtime.Remoting.Channels.Ipc って試してみた人いる?これまでSendMessage APIとか使うしか なかった、アプリ間のデータのやり取りに使えるんだろうか。
しかなかったって、別にアプリ間で HttpChannel や TcpChannel が禁じられてた訳じゃないが。
>>166 ファイヤーウォールとか空きポートとか気にしなくていいからいいかんじでっせ。
あえて口開けて待つようにするか微妙
複数のFormを表示しているときに、 ウィンドウが重なると後ろに隠れてしまうのですが、 TopMostを使うと常に一番前にきてしまいます。 細かい位置調整する手段はあるのでしょうか?
Owner
172 :
170 :2006/03/14(火) 04:57:07
>>171 できました。
ありがとうございました。m(_ _)m
Visual C# 2005 Expressで、初めてのC#でプログラムを作ろうとしています。 プロジェクトの新規作成で、Windowsアプリケーションを選択すると フォームのみが表示される雛型が作成されますが、自分で作成したクラスから このフォーム Form1 に対するアクセスはどうしたら良いんでしょう? 自動作成されるProgram.csのApplication.Run(new Form1());の部分で フォームが作成されると思うのですが、この部分が Form1 form = new Form1(); のようになっていれば、インスタンス form を介してフォームにアクセスできる はずですが、自動作成された部分の Application.Run(new Form1()); だと、インスタンスはどうなってるんでしょう? 長くなりましたが要は、自作クラスからフォーム及びそのフォームに貼り付けられた コンポーネントにアクセスするには、どのようにすれば良いですか?
そう言う風に変更すればいい。 が、それは Main の中でやらなきゃいけないことなのか? つか初めてならコンソールで Hello world から……
>>173 > Application.Run(new Form1());
このコードを、よーーーーーく目を凝らして見てみなさい
きっと何かが見えてくるから
ヒントは君が書いた
> インスタンスはどうなってるんでしょう?
だよ
がんばってね☆
>>173 > 長くなりましたが要は、自作クラスからフォーム及びそのフォームに貼り付けられた
> コンポーネントにアクセスするには、どのようにすれば良いですか?
フォームもクラスです
クラス間のインタフェースの取り方はC#の基礎です
つまり、基礎が欠落しているため、何を説明されても理解できないでしょう
コードを直接提示されても、コードに対する疑問が湧くだけです
まず、C#の言語の基礎を勉強しましょう
今回のはアクセス修飾子を理解してないから「コンポーネントにアクセス」する方法が理解できないのです
また、自動生成されたコードの流れもしっかり読んで、どういう制御構造にすべきか理解しましょう
this
>>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);
...
}
すまん、俺177な
アアアア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進の文字列に変換したいのですが この処理標準ライブラリだとなんというメソッドですか?
>>182 1バイトだけならこんな感じで
byte a = 11;
textBox1.Text = a.ToString("X2");
すみません、ご存じの方がいたら教えてください。 .NET Framework 1.1でButtonを使用すると左クリックでしか押下 状態になりませんよね? これを右クリックでも押下状態にしたいのですが、マウスイベントから 自前でガリガリ組むしか手はないのでしょうか? MFCでいうSetState()的なものが見つからないのです・・・。
BitConverter.ToStringとか
あるツールを作ってまして、入力項目(ファイル名とか)が複数あるので これをファイルに保存できるようにしようと思って、XmlSerializerで 保存するようにしました。ですがこのクラス、終了時に「変更されています。 保存しますか?」と聞けるように、何かプロパティを変更したらSavedプロパティ というのをfalseにするようにしてるんですが、デシリアライズ時にも プロパティ変更とみなされてSaved == falseになるので、ファイルを開いて 何もせずに終了させても「保存しますか?」と聞かれてしまいます。 Savedプロパティを書き込み可能にするとなにか気持ち悪いので、ほかに どう回避したらいいでしょう。
OnDeserialized って XmlSerializer で使えたっけ
>>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.. } } って風にサブクラス作る以外に方法はありませんか?
無い クラスで一意なのが属性
残念。そしてありがとう。
>>186 staticメンバで自分の永続化オブジェクトを呼び出す(ロード)メソッドを作成し、そこでprivateのsaved変数をFalseにする。
ってどう?
>>192 あーなるほど、今ちょっと試したんですが
同じクラスの中ならstaticメソッドの中でインスタンスメンバを
覗けるんですね。いけるかどうかやってみます。
.NetのIDropTargetインターフェイスと、OLEドラッグ&ドロップのIDropTargetって 関係ありますか? エクスプローラのツールバー作ってるんですが、 コントロールのAllowDrop = trueにして実装すると なんかexplorerのプロセスが終了しないで残るんです。 OLEのほうでIDropTarget実装して、終了時にRevokeDragDropしたら きちんと終了するようになったんですが、これと同じようなことを マネージドでできないのかと思いまして
195 :
デフォルトの名無しさん :2006/03/16(木) 16:06:53
string を IntPtr へ渡したいんだけどどうしたらいいかな。
Marshal.StringToPtr()
はやい、どうもありがとう。
いや、そんなメソッド無いけどな。 Enodingでバイト配列にしてMarshal.Copyとか。
199 :
194 :2006/03/16(木) 17:24:07
AllowDropって、RegisterDragDrop/RevokeDragDropするだけだったんですね。 で、どっちにしろexplorerのプロセスが終了してないことに気づきました。 どなたか理由の思いつく方いらっしゃいませんか?
StructureToPtr() とごっちゃになってた。 StringToHGlobalAnsi/Auto/Uni、あるいは、StringToCoTaskMemXXX か。 GCHandle.AddrOfPinnedObject() って手もあるけど、こっちは面倒だな。
>>200 > StringToHGlobalAnsi/Auto/Uni、あるいは、StringToCoTaskMemXXX か。
既存のポインタに書き込むにはどうにもならない。
コピーするにも変換後のバイト数が判らない。
>>201 あ、そういうことなの?
じゃ、俺は RtlMoveMemory() でいいや。Marshal.Copy と変わらんけどw
コントロールの OnHoehoge をオーバーライドすんな、Hogehoge に登録しろと言う人がいるんだが、 MDSN に(例えば OnLoad には) > OnLoad メソッドを使用すると、デリゲートを結び付けずに、 > 派生クラスでイベントを処理することもできます。 > 派生クラスでイベントを処理する場合は、この手法をお勧めします。 と書かれてるんだ。 どうすれば良いと思う?
baseよびだしゃいいんじゃね?
>>203 仕様の通りに実装すれば良いとおもう。
派生元の処理も行うタイなら base 呼び出せばよいし、
(オーバーライドしないときと同様に)イベントハンドラを呼び出したいなら呼び出せばいいし、
イベントハンドラを呼び出したくないなら呼び出さなければ良いし。
>コントロールの OnHoehoge をオーバーライドすんな、Hogehoge に登録しろと言う人がいるんだが、 だれだよ
どーでもいいが、ライブラリでイベントハンドラの名前が Onを抜いただけになってるのってきもくない? ClosedとかNavigatedとか。普通のメソッドと混同しそう。 自分でイベント定義するときはHogeEventとかにしてるのだが。
英語能力がないのは分かった
むしろメソッドにOnがついてる方が気持ち悪い
英語能力がないのは分かったってば
例が悪かったな。edがついてるのはまだいい。 LoadとかInitとかがイベントなのがきもい。
>>210 Onついてるメソッドって動詞じゃないじゃん。
副詞句みたいなもの
>>211 そんな「日本なのに左ハンドルの車とかきもい」的なことを言われても困る。
コントロールなんかのイベントはまだある程度統一されているだけまし。 LoadやらInitやらは過去からの流れもあるしな。 むしろ他のイベントに気持ち悪い名前が多い。
>>192 どうやらその手で大丈夫そうです。かなり悩んでたんですがエレガントに
解決しました。お礼に歌いたい気分です。
クリップボードを使用してファイルのコピーや移動を行いたいのですが、 ファイルが切り取りされているかコピーされているかはどう判断すればよいのでしょうか。 ドラッグ&ドロップならDragDropEffectsで判断できるのですが。
>>217 Clipboard.GetDataObject().GetData("Preferred DropEffect")
をMemoryStreamにしてBinaryReaderなりBitConverterなりでInt32に変換。
DragDropEffectsにキャスト。
219 :
217 :2006/03/17(金) 13:18:03
>>218 さっそくのレスどうもありがとうございます。
うまくいきました。
質問です。マウスジェスチャーのようなものを実現しようと思い、 SetWindowsHookExにフックして、とりあえず実現はできたのですが、 ジェスチャー終了後に、コンテキストメニューが表示されてしまいます。 コンテキストメニューを抑止することはできないのでしょうか?
ローカル専用ならSetWindowsHookEx 使うんじゃなくて IMessageFilter 使った方が良いんじゃね? WM_RBUTTONUP のときに true 返せばメニューを表示しない。
なぜだ〜IExtenderProviderが効かねー
224 :
http://www.vector.co.jp/soft/win95/util/se072729.html :2006/03/18(土) 19:38:58
TextSS のWindowsXP(Professional)64bit化おながいします もしくは64bitにネイティブ対応したテキスト置換ソフトありますか?
C#なのかC♯なのかどっちなの?
どっちでもない。C# だ。
>>129 ,131
IsNullOrEmptyって一見便利そうだけど、
たいていの場合、「空白のみの文字列」も除きたいから、
あまり使う場面はなさそうだね。
それは場面というか開発対象によるんじゃね? 私は空白のみからなる文字列を除きたいと思ったことは今のところ無いしなー。 NullOrEmpty以上となると空白のみ文字列以外にも除く文字/文字列が出てくることばっかりだ。
他人の作ったメソッドで文字列返すやつはIsNullOrEmptyでチェックする。 さらにtryで囲む。さすがに" "とか返してくるやつはみたことない。
OnなんちゃらのOnって、turn onみたいな意味かと思ってたけど違うの? イベント発動メソッド。
232 :
デフォルトの名無しさん :2006/03/19(日) 19:48:18
C#2005のwebBrowserでアプリ作ってるのですが ページが切り替わるときに出る音を消したいのですが良い方法ありませんか?
>>230 さらにTryで囲むって・・・ 作ったメソッドの仕様をしっかり把握するべきでは
関係ないけどC#覚えたての人って無駄にTryCatchする人多くない?制御文の代わりに使ってみたり
この前、Gotoの代わりに使ってるのみて凹んだ
コントロールパネル サウンドとオーディオデバイス サウンド エクスプローラ ナビゲーション開始
VisualStudio2005のIDEに用いられているGUIコンポーネントは 提供されていないのでしょうか?ドッキングやフローティングの機能が 使いやすくて。
>>235 よくしらないけどStrip系のやつじゃないの?
Stripとは別物だよ
あー、ドッキング位置が中くらいの大きさのアイコンで出てくるヤツか
>>235 そういう要望が結構あるが複雑すぎるので提供しないそーです。
そうですか、残念ですね。レスありがとうございました。
241 :
デフォルトの名無しさん :2006/03/19(日) 21:02:46
タイプライブラリから自動生成された構造体 public struct STRUCT { public ushort[] wszTitle; } のwszTitleにSystem.Stringをコピーするにはどうしますか? cからみるとwszTitleは WCHAR wszTitle[256]; です。
>>239 ,235
あれは便利なんでいつか整理してコンポーネントにしてほしいよなぁ〜
Encoding.GetBytesでバイトに変換してBitConverterでushortにするとか
String.ToCharArray と Buffer.BlockCopy だな。
245 :
デフォルトの名無しさん :2006/03/19(日) 22:07:45
ListView.Add するとアイテムが末尾に挿入されるのですが、 先頭に入れたい場合はどうすればいいのでしょうか?
ListView に Add なんてねーよ。 ListViewItemCollection には Insert というメソッドがある。
なるほど、先頭に Insert することにします。 ありがとうございました。
>>233 いや、寧ろ逆に感じる。
C#は例外に対して緩いから、それを使うプログラマも例外に対して無頓着。
投げないのは勿論、捕捉もしないから、例外が出ると即落ちる。
当然、テストには[ExpectedException(...)]は出てこない。
Javaだと例外をどう扱うか定義しないとコンパイルすら通らないから、否応
なく最低限の対応(catch(Exception)やthrow Exceptionを含むw)が見られ
るけど、C#ではそれすらない者が驚くほど多い。
>>250 やたらTryCatchするのはDelphi出身者。
>>251 確かに、言われてみればDelphi出身者には
>>233 の傾向が見られるな。
Abort投げてファイナリーへジャンプとか、そりゃ形を変えたgotoだみたいなw
ボタンクリックとかで他部署の作ったメソッド呼ぶときは全部catchじゃ
メソッドの<exception>タグにないExceptionをキャッチしてるコードを書いてる奴はとりあえず、問い詰める
<exception>タグにないExceptionがテスト時にきたら、そこの担当者を問い詰める
try{hoge();}catch{}なんて書いたらバグ発見できなくない?
最上位ではCatchするようにしているけど
ところで
>>250 はDelphi出身者ですか?
ちなみに私はJava出身者
キャッチされてない例外を他人に見せるのが恥ずかしいんじゃね? そ、その例外くらい知ってるんだからね!って。
キャッチしてもどうにもならない例外までキャッチしてしまうのは良くない。 キャッチしてなんらかの対処をしてプログラムの実行を継続できるのなら キャッチすべし。 だからJavaのような例外の扱いは、ある意味無責任
Java の方針だと、後から throws の所に例外追加したら、 利用側コードの修正も強要されるのが嫌で throws は採用しなかったのよね?
複数種類の例外を投げうるメソッドだと throws Exception とか書かれて 実質的な意味をなさないことが多かったからとも聞いたぞ
例外ダイアログが出ると、これはバグだから直せと言われるから全部catch。
throws 書いても catch {} ってされるだけだからそうしなかったって あんだーすがゆってた
>>254 最上位でキャッチして何するの?エラーが出ましたって表示しておしまい?
だったらvoid mainにthrows Exceptionて書いとけ、同じ事だ。
>>256 リカバーできなくても原因を詳細化できるならcatch-throwsというイディオムを使う
べき例えば、catch(NullPointerException) throws new InvalidArgumentの様に?
ただ、本当にどうにもならない例外というのも確かにあるにはある。
この辺はJ2EEパターンで出てくるRuntimeExceptionを標準として利用する方法や
アダプタパターンを利用してExceptionをcatchしてthrows RuntimeExceptionする
方法なんかがある(全部Javaの言語仕様内で実現可能)。
>>257 例外はパブリックなメソッドと同じくインターフェイス(≠interface)なんだよ。
だからそれを変更するには当然コストが掛かる。
これで何度か痛い目をみると設計レスで指先コーディングする悪い癖が抜けるw
つ On Error
WebBrowserのクリックを検出したかったのでWebBrowser.WndProcをオーバーライドしてみたのですが、 MouseUpの時のメッセージがよく分かりません。。。 ちなみにMouseDownはMessage構造体のWParamから取得しました。 ご存知の方いらっしゃいましたら宜しくお願いします。
265 :
256 :2006/03/20(月) 15:24:07
>>261 > リカバーできなくても原因を詳細化できるならcatch-throwsというイディオムを使う
それは開発者にとって都合がいいからでそ?
漏れが言いたいのは、ユーザーが何ら対処できないような例外が発生しうる処理のところで
キャッチするべきではないということ。
代わりにMain()の中で、最終的にキャッチされなかった例外を処理するイベントハンドラを設定すればいい。
まあ要はお前ら適切に例外を処理しろと
はっきり言って基盤にちかいライブラリ部分以外では あんまりキャッチする事はない。 例外が出る事が分かっててその場で処理するならキャッチするが、 それもそんなに多くはない。
配列をつかわずにメンバとインデクスを対応させるよい方法は ないでしょうか?s[0]でs.num0を返すといった具合にしたいのですが。
インデクサ
説明が下手で申し訳ございません。。 内部に配列を持たずインデクサの実装をしようとするとifかswitch を用いて泥臭く書き連ねていかねばなりませんから、 よりスマートな方法があればご教授頂きたいということです。
リフレクションとか? それがスマートとは思わないけど。
Mapしかおもいつきませんわい
リフレクションを使うのはスマートと思われないのですか…。 Mapというのは知らないのですがコレクションのことでしょうか? やはり条件分岐させていくしかないのかな。 構造体にインデクサくっつけようと思っただけなのですが。
どれくらいのメンバ数なわけ? なんで構造体なの?
5つくらいです。面倒ではないけど、よい方法があればと思った次第です。 DateTimeのような用途を想定しており、hashのkeyに用いたり 比較を行わせるときに、構造体だと都合がよいので使っています。 クラスでも演算子やGetHashCodeをoverrideすれば同じようですが。
メンバの方をプロパティにするのはまずいんですか? struct SDate { int data[3]; public int Year { get { return data[0]; } put { data[0] = value; } } ... } みたいな感じで。
面罵をプロパティにしないで何をぷとぱてぃにするのかと。
そうすると、配列のアドレスに依存してしまうために 値によって一意ではなくなります。
280 :
デフォルトの名無しさん :2006/03/21(火) 02:09:01
初心者です。 ファイルをFileStreamを使用して開こうとしたところ 他プロセスが使用しているため例外が発生しました。 問題解決の判別のため、まず、 当該ファイルをどのプロセスが使用しているのか知りたいときは みなさんどうしていますか。プロセス名とかがわかればいいのですが……。
無理無理。
282 :
デフォルトの名無しさん :2006/03/21(火) 05:52:45
>>280 FileStream.Close()できちんとファイルをクローズしても
…しばらく待たないと例外がでることがあるよw
IOException をcatchとかいう話ではなくて?
>>283 handleにかんけいしてるオブジェクト【NTオブジェクト】をしらべるAPIってあったっけ?
ペゾルド→プログラミングC#4thとやって 引っかかるところはvisual C#.net逆引き大全 500の極意でやってるんだが、 もっと洗練されたプログラミングをつくりたいという目的に適した本は何かない?
GetType()や(Object is A)などで型情報を得ることは Type型変数を読み込むより時間がかかりますか? もしそうなら何故Object型はType型のメンバを持たないの?
必要になることがあまり無いのでメモリの無駄食いになるから
Objectが持つって事は、intやなんかの値型も持つってことだぜ? ※ま、Box化したときだけ持つなんて方法もあるっちゃあるかも知れんけど。
各インスタンスが型固有の情報(static)をフィールドとして持っているのはどうかと IntのインスタンスがMaxValueとかフィールドとして持ってるようなもの?
291 :
287 :2006/03/21(火) 22:06:06
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();
Base64
>>292 >application/x-www-form-urlencoded と要領は一緒なのかと思ったのですが、
むしろ一緒の部分は殆ど無い。
ちゃんとmultipart/form-dataの形式でデータをPOSTするべし。
コントロール自体のイメージ化?というのか、なんなのか。 マウスがあるボタンの上にあったら 別のピクチャーボックスにそのボタンの画を表示するという機能を実現したいのですけれども… どなたかヒントを。
>>295 デバイスコンテキスト経由でDDBを転送すればいいんじゃねーの?
.NET的なやり方はシラネ
299 :
デフォルトの名無しさん :2006/03/23(木) 00:05:45
ToolStripItemってCloneできないんですかね? MenuItemはイベントハンドラまで含めてCloneできるので便利だったんですが
派生クラス作るなりして MemberwiseClone やってやればできなくもないが、なんか問題もあるやも知れぬ
String.IsNullOrEmpty に対抗して、Array.IsNullOrEmpty があれば良かったとふと思った。
303 :
デフォルトの名無しさん :2006/03/24(金) 10:50:53
.NET1.1のWindows.Formsで DataTableに関連づけたDataGridを 使っているのですが DataGridTableStyleを使うと、5〜10秒ほど 一時的にアプリケーションが無反応になります。 起動後、数回目の操作でこれが起き、 一度起こると起動終了まで起きないようです。 何かヒントになるものはないでしょうか? よろしくお願いします。
プログラミングC#買いました(^_^)
┏━━━━━━━━━━━━━━━━━━━━━━┓ ┃* 「さんこうしょは りかいしないといみがないよ! ┃ ┃ ▼┃ ┗━━━━━━━━━━━━━━━━━━━━━━┛
参考書を理解するための参考書を教えてください
ヘルプを(ry
下手な参考書を買うくらいだったら、MSDNオンラインを読んだほうがいいよ
でもいい参考書は買ってもいいと思うよ。 ・C#によるぷろぐらみんぐWindows ・デザパタ ・パターン嗜好リファクタリング ・ModernC++Designe この辺は結構よかった。ほかにもあるけど。
>>303 IDEのデバッグモードでだけ発生したりしないか?
>>311 おおなんと!
Debugに限らずReleaseもですが、
確かにIDE上で実行したときだけ発生し、
BuildしたEXEを単体で実行したときは
発生しません。
なんでなんでしょね?
Ctrl+F5でデバッグなしで実行しても大丈夫でしょ?? まあ、デバッガも頑張ってるんだ。
>>312 たぶんいろんなアセンブリがそこでロードされて、IDE がシンボル探し回るから。
デバグウィンドウの「出力(だっけ?)」とか見てれば様子わかると思う。
サイズが0とか1とかのウインドウって作れない? 0,0に指定してもうまくいかないから、何かが悪さしてるのかと思って 最大化ボタン無しにしたりとか、あれこれ試したけど、小さな ウインドウが表示されちゃうんだけど。
>>315 Windowsの仕様で作れなかった気がす
つか、非表示にすればいいんちゃいますか
>>315 そこまで来たらあと一歩だ。最近は透明化機能なんて普通に付いてるから
Opacityプロパティを0にすればまったく映らなくなるし、0のときはクリックも
できなくなる。表示していないのとおんなじだ!
まあ、これでいいならフォームのサイズ自体はなんでもいいんだけどな。
318 :
デフォルトの名無しさん :2006/03/25(土) 13:54:43
背景がまったく透過でイベントなども透過するようなフォームをつくるにはどのようにすればよいでしょうか? デスクトップに文字列を書き込むような効果に利用したいんですけど。 (Win32使ってデスクトップに書き込むのはあんまりやりたくない)
RegionとかTransparencyKeyとか。
TransparencyKeyでいけそうです。ありがとうございました。
>>318 似たようなソフト作ったことあるけど、
そのままだと、文字部分(色ついた部分)がイベント透過しないよ
速度も遅かったり色々あったんで、
結局ULWとWS_EX_TRANSPARENT|WS_EX_LAYERED使って自前で処理した
322 :
デフォルトの名無しさん :2006/03/26(日) 00:45:49
確かに書き込んだ部分についてはイベントが透過しませんでした。 レイヤード ウィンドウを検索するなどして調べましたが Form上でイベントをまったくスルーしてしまう方法がよくわかりません どのようにWndProcをオーバライドすればスルーできるのでしょうか?
APIがいやだったらManaged DirectX使えば?
>>322 WndProcをオーバーライドって時点で何か方向が間違ってる気がするんだが・・・
来たイベントを自分の下のウインドウに自前で渡そうとか考えてる?
WS_EX_TRANSPARENT|WS_EX_LAYEREDの事だったら、CreateParamsでヘルプ見れ
APIのmciSendCommandで質問なんすけど、Cだとの最後の引数は構造体をDWORDに キャストしてアドレスを渡すんですがC#だとどうすればいい? mciSendStringはサンプルで一杯あったんだけどmciSendCommandがほとんどなかった。
>>325 ヘルプを見ずに答えると、最後の引数を 「ref 構造体」 で定義しておけばよさげ。
型が変わるケースがあるならオーバーロードで。
複数の定義をするのが面倒なら、StructureToPtr で IntPtr にして、それを int にして
渡せばいいんでね?
ref で参照渡すか、Marshal.AllocCoTaskMem で確保したメモリに Marshal.StructureToPtr で書き込んでそれを渡す // だれだこの関数作った奴 なんでポインタを渡すのに DWORD なんだよ LPVOID とかにしとけよ
328 :
325 :2006/03/26(日) 10:58:35
>>326 >>327 ありがとん。
「ref 構造体」は見かけたけどあとの2つは知らんかった。
やってみます。
すみません。ちょっと質問なんですが よくレスを見てると、一つのクラスにプログラムをダラダラ書くと 分かりづらいとか、関数ごとにできるだけクラスを作成したほうがいいとか 聞きますがどういう場合にクラスにすればいいかいまいちわかりません 例えば、FORM上のコントロールに対しての命令もわざわざクラスを作って作成したほうがいいんでしょうか? 例えば、listviewの選択されたアイテムを削除するなど・・ もしくは、FORM内のコントロールはそのFORMクラスで作成して 別ウィンドウのFORMなどは別のクラスで書くみたいに、FORMごとにプログラムを書くのがいいんでしょうか? よろしくお願いします 197KB 549.61秒 dummy_for_searchRef
> 関数ごとにできるだけクラスを作成したほうがいい 初めて聞いた
>>329 つ partial class
中華、「データと手続きを一体化して扱う」のが、オブジェクト指向なのでは・・・。
>>329 > 例えば、FORM上のコントロールに対しての命令もわざわざクラスを作って作成したほうがいいんでしょうか?
> 例えば、listviewの選択されたアイテムを削除するなど・・
それを別のフォームでも利用するのなら、その部分を抜き出して別クラスにしておくようにする
> もしくは、FORM内のコントロールはそのFORMクラスで作成して
> 別ウィンドウのFORMなどは別のクラスで書くみたいに、FORMごとにプログラムを書くのがいいんでしょうか?
一般的にはこっち。
333 :
329 :2006/03/26(日) 13:44:09
>>330 自作関数ごとにクラスを作成することを推奨する旨をソフト付属の入門書に書いてたので・・
まだちゃんと理解してないです
>>331 partial classは便利な機能ですね。まだ、これを使うほど複雑なプログラムではないですが
>>332 なるほど、まだ始めたばかりなんですけど、最初の内に一般的な記述をする癖をつけて置きたいので
みなさんがどういう風に作られてるか聞けてよかったです
ありがとうございました
>>329 作りこんでるうちに、これは別クラスにしようとか感覚つかめるよ。
でまた本読んだりして参考にすると。
>>333 >自作関数ごとにクラスを作成することを推奨する旨をソフト付属の入門書に書いてたので・・
参考までになんの本なのか詳しく
> それを別のフォームでも利用するのなら、その部分を抜き出して別クラスにしておくようにする 別クラスにしないで、デリゲート経由で呼び出すべき。クラス間の参照関係はゆるい方がいい。 > 作りこんでるうちに、これは別クラスにしようとか感覚つかめるよ。 作り始める前にちゃんとクラス設計するべき。
Hello world の人にクラス設計とか持ち出すのは無意味だろ
クラス設計とかの関係が書いてある本ってある? 中身がCとかじゃなくC#だとなんとなく助かるんだが。
>>336 いやいろんなプログラム作ってるうちに暮らすどんな風に分けたらいいか感覚がつかめるということ。
_ ∩ ( ゚∀゚)彡 Static! Static! ⊂彡
>>338 C++/Java関連のOOP本は選り取りみどりな上に書評も揃ってる。
C#に拘った本選びをすると、某C#のデザパタ本みたいな本をうっかり
掴んでしまいかねない。
まあ、Cは無いから安心汁
343 :
329 :2006/03/26(日) 16:20:28
>>335 VC#2001のstanderdに付属の「今からはじめるC#」です
と、思ったのですが、今見てみると見つかりません。どこで見たんだろ・・
現在2005の無料版を使ってます
クラス設計とかデリゲートとかまだちんぷんかんぷんですが、コツコツやっていきたいと思います
小物アプリをいろいろ作ってると、コントロールに対して同じ関数を作ってたりするんです
listviewだと選択反転や選択削除などなど、よく使う関数をアプリを作るごとに以前作ったアプリのソースをコピペしたりしてて
他の人はこれらの関数を別クラスにしたり、もしくはlistviewを継承して、よく使う関数を盛り込んで独自のコントロールを作ったり
してるのかなぁ?と、まだ自作コントロールの作り方はわからないですけど・・・
やっぱりここらへんは慣れなんでしょうね
> 某C#のデザパタ本みたいな本をうっかり > 掴んでしまいかねない。 これあの本だと思うが、だめなの?
>>344 ぜひ一度手に取ってみてもらいたい。
そして、金を払う前に気付く事を祈ってる。
非表示のフォームのインスタンスを数個、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にしているのに動作しないのでしょうか。
Form f1 = new Form(); f1.Visible = false; } if(count == 1) { Form f2 = new Form(); f2.Visible = false; }
何をしたいのかさっぱり分からんが。 作った直後に破棄しちゃってるし。
作った直後に破棄してるのですが、FormMakerだけは動いているんです。 Form1やForm2も同様の状態にしたいのですが。
FormMakerってのがようわからんが、Form1とForm2はtick抜けたら破棄されるじゃまいか
>>349 > FormMakerだけは動いているんです。
Form1 のフィールドにおいてたり他に参照が残ってたりするんだろ。
それ以外の理由もあるかもしれんがこれだけじゃ判断できん。
>348,350,351 ありがとうございます。 もう少し詳しく説明します。 もともと機能ごとに分けて別々のフォームで実装したプログラムを統合したいと考え、 インタフェースだけMainFormに集約し、MainFormから全てのフォームの機能を操作出来るようにしました。 しかし、MainFormから全てのForm(5つあります)のインスタンスの同時に生成してみたらとても不安定だったので、 5秒おきに起動することにし、FormMakerというタイマー付のフォームを作成しました。 FormMakerで作成したForm1〜Form5のフォームは、生成後にMainFormに関連付けています。 しかしここで問題になったのが、MainFormを操作してForm1等のメソッドが呼ばれた際にactivateが移ってしまうということです。 なのでいっそのこと非表示にしたりタスクトレイに入れたりしてなくしてしまおうと思ったのですが、なかなかうまくいきません。
なんつーか果てしなく泥縄だな。 > しかし、MainFormから全てのForm(5つあります)のインスタンスの同時に生成してみたらとても不安定だったので、 インスタンス作るだけで不安定になる環境ってどんなんだよ。単に遅いってだけだろ。 > 5秒おきに起動することにし、FormMakerというタイマー付のフォームを作成しました。 それはフォームである必要があるのか? > FormMakerで作成したForm1〜Form5のフォームは、生成後にMainFormに関連付けています。 さっきのコードを見る限り、生成後速やかに破棄されているが。 > しかしここで問題になったのが、MainFormを操作してForm1等のメソッドが呼ばれた際にactivateが移ってしまうということです。 メソッド呼んだだけでアクティブにはならん。アクティブになるようなことをしたんだろ。 結局、MainForm は Form1 他のメソッドを使いたいだけ? GUI 部品を使わないくて完結するようなのならそんなメソッドは別クラスにまとめるべきだが。
めんどくさいからFormMaker内のフィールドとしてf1〜f5もっとけ
Stringはクラスなのにインスタンス化しなくても使えるのはなじぇ?
明示的には書いてないだけで実際にはインスタンスが作られてる
継承クラスから親クラスが持つeventをいじることはできないんですか? +=,-=しか使えないとエラーメッセージがでますが、継承クラスから nullチェックやハンドラ呼び出しできないのは不便なように思うのですが。
TextBox を派生させたクラスを考える。 その派生クラスが勝手に TextChanged を呼び出した。Text は変わっていない。 さて、更にその派生クラスを作って、TextChanged にハンドラを引っかける。当然 Text が変わっていることを期待するが……。 TextChanged くらいならまだしも、HandleCreated とかはなお厄介だ。
On〜メソッドを呼べば?
>>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++++なんですか?
ちがうちがう、C++の++を斜めに重ね合わせたのさ。おしゃれじゃん。
>>363 親プロセス終了させても普通子プロセスまで終了はしないような……?
Process.Start が静的メソッドだとして、返値の Process インスタンスを Dispose したらどうなる?
Form1のメソッド内でForm2を作成して Form2にあるtextBox.textの内容をForm2のメソッドからForm1に渡したいんだけどどうすればいいかな?
流れがつかめん。 Form2 はモーダル?モードレス? Form2 のメソッドってことは Form2 は表示させっぱなし?
369 :
367 :2006/03/27(月) 12:42:03
Form frm2=new Form(); frm2.showDialog(this); ↑これはモーダルかな? この記述をForm1に書いてます で、frm2でファイル名や検索文字などを入力してもらって frm2の検索ボタンや作成ボタンを押すとfrm2は閉じて Form1の処理にもどり、frm2のテキストボックスの内容を元にファイル作成したり検索したりしたんです
モーダルだな。 Form2 は textBox.Text を string のプロパティとして公開する。 Form1 は Form2 から返ってきた後、そのプロパティを参照する。
Form2 からはおかしいな。Form2 の ShowDialog から。
372 :
367 :2006/03/27(月) 13:15:27
Form2に public string str=""; を作ることでform2が閉じた後もstrを見ることができました! アリガト!(´▽`) でも、form2が閉じたのに Form1からForm2のフィールドが見れるのはなぜ?
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(); } }
374 :
367 :2006/03/27(月) 13:25:52
>>373 あ、フィールドでこんな風に読み込んでたけど
class Form1{
string str=form2.ファイル名
}
プロパティだと戻り値みたいに取得できるんですね
なるほど、openFileDialogとかMessageBox.Showとかと同じような使い方ができるんですね
ありがとう
>>373 result != DialogResult.OKのときにDisposeしてないのはいかがなものか
ListBoxの内容を右寄せで表示する方法はありますか? String.PadLeftしたのですがスペース、英数字、漢字が混ざっているとうまく右寄せになってくれなくて。
377 :
363 :2006/03/27(月) 14:01:58
>>366 うーん。ProcessExplorer で見てると、親の exit で IE も消えますね。
ちなみに URL を指定した場合は Start() で Process オブジェクトは帰ってこず(null)。
で、とりあえず Start("explorer", url) とすることで、何とか自分の直接の子では無い形で
IE が起動できましたが…。
DateTimeの値をファイルに記録して、 次回起動後にまたDateTimeに変換したいのですが、 一般的な方法やおすすめの方法はあるでしょうか? 今は無理やりファイルの文字列をパースしてセットしています。
380 :
373 :2006/03/27(月) 14:06:50
>>375 ガ━━━━━━(゚д゚lll)━━━━━━ン
無理矢理? DateTime.ToString と DateTime.Parse/ParseExact でもいいし、 DateTimeConverter 使っても良いし、 XmlSerializer 使っても良いし。
ヘルプでMSDNライブラリを表示する時、表示するのに5秒くらいかかるのはおれだけ?
うちは10秒
>383 どんまい しょうがないのか
>>382 RamDiskつかえ。ばかっぱや。
だといいな・・・orz
381さnありがとうございます。 調べてみます。
こっちは22秒なんだが…
んなもんディスクとメモリのIO次第
>>375 FormはDisposeしなきゃだめだったのか。
new SomeDialog().ShowDialog();
って風に書いてたわい。
using使うのが定石だと思ってたけど違うの?
MUST ではないよ。 ほっといてもそのうち GC が片づけるし、 Dispose せずに GC されたらファイナライザが Dispose(false) を呼び出すだろう。 できる限り IDisposable なものは使い終わったら Dispose するのが作法だけど。
FormをDisposeするなんて初めて聞いたぞ・・・ とりあえず俺のもしておくか・・・
393 :
デフォルトの名無しさん :2006/03/27(月) 22:29:03
必要なときにはじめてインスタンス化されるから、必要でなかったときの初期化のコストが節約されるってこと。 遅い=delayed
395 :
デフォルトの名無しさん :2006/03/27(月) 22:59:45
>>394 サンクス
理解しました。"遅いインスタンス化"を変に捕えてました
visual studio 2003 + C# です。 800x600 程度のサイズのフォームの上にラベルが数個、フォームの背景画像 を指定しているのですが、特にラベル付近の描画が遅く、背景画像が、 一瞬で描画されません。 これを、フォームの描画を一瞬でさせる方法があれば教えて頂けないでしょうか? ダブルバッファリングなども調べてみましたが、画像に画像を合成するよう な場合は使えるかとおもったのでですが、画像だけではなく、 ラベルコントロールなども使いたいのでダブルバッファリング先の 画像にラベルコントロールで描画される内容を描画する方法がわからなくて。 他にも例えば Visible = False としたフォームにラベルや背景画像を 設定して、そのフォームを「画像」として取得でき、その画像を 描画させる、などの方法も考えたのですがそれを実現させる方法が わからなく。 いろいろ書きましたが、いくつかのラベルと背景画像で作られる画面を 画面に描画しているサマをあらわさず、パッと表示させるよい方法が ありましたらアドバイスください。よろしくお願いします。
BeginUpdate は Listbox などの個別コントロールで対応している ものもありますが、フォーム全体では対応していないですよね... フォームの描画/再描画を停止する方法、もしくは フォームの内容を画像として取得する方法があれば その先はなんとかなるかもしれない、と思っています。 アドバイスよろしくお願いします。
>>396 いつも遅いのならあまり改善の余地はないと思います。
初回の描画の話なら、必要になった時点でノロノロとアセンブリを
ロードし始めるという CLI の動作のせいだと思います。
その辺を綺麗にすばやく表示することがビジュアル的に重要であって、
コントロールの外観を自前でオフスクリーンに書く手間も惜しまないのなら、
XPExplorerBarのソースが大変参考になると思います。
>>389 気になったので試してみたのだが、ShowDialogとShowで動作が違うのね。
ShowDialogの場合DialogResultの設定されたボタンやXボタンで抜けた場合はDisposeされていなくて、
Showの場合Xボタンで抜けた場合はDisposeされている。
当然といえば当然な仕様なんだけど、ドキュメントに明記してないと迷いそう。
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) ; }
> マルチスレッドだと同時に複数のドライブに処理が行える 実際に同時に書けるかどうかは PC 次第だがな。 取りあえずまずシングルスレッドで動くまともなコード書け。
>>402 ファイルをコピーするマルチスレッド用のメソッド作る
引数渡して、スレッド起動。俺だったら別途にクラス作る。
というかBackgroundWorker使え。
407 :
402 :2006/03/28(火) 22:26:12
ありがとうございますた。
>>404 のurlいきなりメモ帳でcss開かれたんだけど気のせい?
初心者なんですけど、この板全体あんまり人いないですねよ 質問も初心者の質問が多かったり やっぱり上級者というか本職にしてるひとは ここで聞くより自分で調べたほうが早いみたいな感じなんでしょうか?
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のカラーまで変わってしまいます 単純にデータを受け渡したいんだけどどうすればいいんでしょうか?
訂正:item1 lv1.Items.Add(item1);
>>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);
とやったら青地に白で表示されたが。
ちなみにオーバーロードされてるメソッドはヒントで表示されるやつが使われてるんじゃないぞ。
メニューやツールバーのコメントアウトコマンドを使うと一番左に // が付きますが、この行を含んだ部分をコピペすると、// が 行頭であるということで、右のほうによってしまいますよね。だったら 最初っからインデントにあわせて // を手作業でつけたほうが、と 思うんですが、複数行になるとまんどくさいです。複数行に対して インデントにあわせて // を付けることってできませんか?2003です。 (VB.NETだとそういう動きになってるんです)
416 :
412 :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();
}
これはいったいどういうことなんでしょうか?
>ちなみにオーバーロードされてるメソッドはヒントで表示されるやつが使われてるんじゃないぞ。
なるほど、これは原因じゃなかったんですね
417 :
412 :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]); //}
>>416 CloneすればForeColorやBackColorも当然コピーされてそれが使われる。
>>416 そもそも何故 Class1 とやらにわざわざ ListView 作ってそれに格納してるんだ?
ArrayList じゃダメなのか?
421 :
412 :2006/03/29(水) 11:35:31
>>420 同じ形式だと見た目わかりやすいと思いまして
あと、同じ操作させたい場合も便利なんじゃないかなと思ったり
今のとこはデータを保存してるだけなんですけど
データを保存するためにArrayList使うにしても、
arrayList.Add(item)
listView.items.Add(arrayList[0])
みたいな形で、結局データを取り出してListViewに表示しようとすると
色が変わってしまいますよね?
あと、上記のように、listviewのitemをそのまま格納すると、listviewの内容変更した場合
arrayListに格納しているitemも変更されてしまいますよね?
参照とかじゃなくてデータだけをコピーして格納したいんです
どうすればいいんでしょうか?
>>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 なんかに格納しておく。
色が変わるんじゃなくて変わらないのが問題だな。 ListViewItem の各情報を設定しないまま ListView.Items.Add すると自動的に ListView での色やフォントに設定されるが、 Clone した場合は設定されてるかどうかは無関係に ForeColor ほかの各プロパティを参照してサブアイテムを構成する。 既に設定済みだから ListView.Items.Add しても色は ListView から感染しない。 ListViewItemManager クラスでも作ってそこで管理すれば良いんじゃね
424 :
412 :2006/03/29(水) 12:19:27
>>422 フォームにあるlistviewの色は変えないで
中身の文字データだけを保存したり、保存したデータを取り出して表示したかったんです
これがどうも、参照?でコピーしてるのか、フォームのリストビューを変更したら、保存先も変更されたり
うまくコピーできたと思ったら、取り出すときにカラーまでコピーされたり・・てな感じです
>普通はデータを格納するのにListViewItemCollection なんかに頼らずに
そういうものなんですか・・
データ取り出したあと、Listview形式に変換する関数も必要ってことですね
やっぱり、不必要な機能を持った自前クラスなんてのはスマートじゃないってことなんですかね?
文字保存するだけなのに、listviewの全機能を保持するなんてだめかやっぱ
いろいろ試しましたけどうまくいきませんでした。
ArrayListでがんばってやってみたいと思います。
425 :
412 :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)でコツコツとデータコピーしてやらないとダメってことですね
426 :
412 :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(); } みなさまありがとうございました
いや、ListViewItem がクラスである以上どうしようが参照でのやりとりになるが。 例えば cl1.al[0] を二つの ListView.Items に入れようとしてみ?
ねぇねぇ フォーム内のコントロールのリサイズってどうやってる? VB6の時は コントロール検出->比率保管 resizeイベント->再設定->比率保管 ってのを毎回作ってるんだが・・・ C#でも同じように毎回いるの? this.Nurupo.Size(?,?); を書くのがめんどくさい・・・ 自動リサイズコントロールは需要あるかな?
Dock や Anchor のことか?
TableLayoutPanel とか FlowLayoutPanel が出来たおかげで殆ど困らなくなったな
431 :
412 :2006/03/29(水) 13:58:18
>>427 > いや、ListViewItem がクラスである以上どうしようが参照でのやりとりになるが。
オブジェクトの値渡しはできないんですか・・・知らなかった
> 例えば cl1.al[0] を二つの ListView.Items に入れようとしてみ?
エラーでました・・・がっくり・・今よろこんで本プログラムをArrayListに書き換えてたのに・・・
ってことはやっぱ文字データで渡すやるしかないのか・・・
それはさすがに面倒だなぁ・・多次元配列とか苦手・・・
そもそも ListViewItem を複数の ListView から参照することなぞまずないと思うんだがな。 ListViewItem のコレクションクラスを CollectionBase から派生させて、 取得するときに新しく作り直せば良いじゃん。
433 :
412 :2006/03/29(水) 14:37:13
>>432 > そもそも ListViewItem を複数の ListView から参照することなぞまずないと思うんだがな。
複数の保存したデータをフォームのリストビューに表示、追加などして編集してその後また保存したいんです
なので参照だと、フォームのリストビューのデータに手を加えた時点で元のデータも壊れてしまう。
ので、値渡しでないときびしいんです
> ListViewItem のコレクションクラスを CollectionBase から派生させて、
> 取得するときに新しく作り直せば良いじゃん。
すんません。私にはまだ高度なプログラミン内容なようで設計が難しいです。
地道にstringにしてデータ渡して行きます
DataTable と DataGridView / DataGrid 使うべきところのような気がする
編集させるんなら DataGridView だよな
for(int i = 0; i < dataGridView1.Rows.Count; i++) { dataGridView1.Rows.RemoveAt(i); } for文の中でDataGridViewの行を削除すると行が繰り上がり for文の中で行がひとつ飛ばされると思うのですが、 一般的にはどのような方法で対策するのでしょうか。
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(); }
>>436 forで消したいならRemoveAt(0)
もしくは逆順ループ
Stringから IntPtrにしたいんだけど、これではだめみたい。 なんか方法ある? IntPtr lpBuffer = Marshal.StringToCoTaskMemAnsi("文字");
>>438 Invoke で元のスレッドで処理しようとするが、その元のスレッドそのものが Join で止まっててデッドロック。
UI スレッドを待機させちゃいけないな。
大体 Closing が発生する時に Invoke が必要な処理やってちゃいかんし意味無いだろう。
せいぜい Thread が IsAlive なら Closing をキャンセルするとか。
>>441 何がどう駄目なのか書け。話はそれからだ。
445 :
438 :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();
}
}
}
>>444 まあ MSDN 嫁で片づけても良いような気もするが。
基本的な手順はこうだ。
・GetUrlCacheEntryInfo に URL、 NULL ポインタ、 0 を渡す。第三引数に必要なサイズが格納される
・返ってきたサイズ分のメモリを確保する。
・もう一度 GetUrlCacheEntryInfo 呼び出し、引数に URL、確保したメモリのポインタ、確保したメモリのサイズを渡す。
・メモリを構造体にコピーする。
・メモリを解放する。
で、必要なキーワードは
IntPtr Marshal.AllocCoTaskMem Marshal.PtrToStructure Marshal.FreeCoTaskMem
>>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の該当部だけでも教えて貰えないでしょうか。、もうだめねむいねる
ComboBox.SelectionChangeCommitted イベント 選択した項目が変更され、その変更が ComboBox に表示されると発生します。 この機能まともに働いてないと思いませんか? 項目を選択しても、その項目の情報が送られるわけじゃなくて その項目を選択する前に表示されていた文字列(ComboBox.Text)が 送られてくるんですけど・・・
>>448 仕様どうなってるかしらんが、現在のセレクションはそのときに呼び出せるんじゃないの?
>>447 IntPtr はポインタそのものなので、out つけたらポインタのポインタを渡すことになってしまうぞ。
>>448 Text じゃなくて SelectedItem 使え。
Text で以前のが取れるなら嬉しさ倍増だな。
451 :
448 :2006/03/30(木) 12:15:25
>>449 >448にも書いてるとおり
変更が表示されてから発生とか抜かしておきながら
実際は変更される直前。ダウンアイテムをクリックして閉じる瞬間にイベント起こしてやがる糞野郎です
>>450 言ってる意味がわからないんですけど?
senderComboBox.SelectedTextこれでも前のテキストが読み込まれて
senderComboBox.Textと同じ内容
もうだめぽーw
あとさ、イベントでDELキー押されるとリストアイテムを削除するようにしたらさ
IDE自体がDELキー受け付けなくなってるんでやんのww
自作ソフトのイベントがなんでIDEまで反映されてるんだよと・・
ほんとがんばってくださいM$さん
SelectedItem 、と言ったんだが?
>>451 デザインモードなのにイベントをハンドリングしてるからでは?
455 :
デフォルトの名無しさん :2006/03/30(木) 13:07:25
IntPtr、略してインポ
456 :
448 :2006/03/30(木) 14:38:12
>>452 そういうイベントもないし、コンボボックスにそういうメンバもないんですけど
主語抜けてるんで、主語いれてください。「選択したアイテム」だけじゃ
誰が選択したこと言ってるかわからないじゃないですか
>>453 ハンドリングってなんですか?解除はどうすればいいですか
>>454 これからも応援してくださいね^^
>>456 >項目を選択しても、その項目の情報が送られるわけじゃなくて
>その項目を選択する前に表示されていた文字列(ComboBox.Text)が
>送られてくるんですけど・・・
何がどこから送られてくるって?
public event EventHandler SelectionChangeCommitted
このイベントのどこにそんな情報が入ってるというのだ?
459 :
448 :2006/03/30(木) 14:53:33
>>457 ドロップダウンメニューをクリックすると、
ドロップダウンメニューで選んだアイテムじゃなくて
元々、ComboBox.Textにあったものが
イベントのsenderで送られてくるんですよ!
しかも、イベントの発生時点では、まだ、ComboBox.Textが更新されてないから
腹が立つンです!!M$は変更されてから発生って書いてるのに!!!!
選んでTEXTが変更されてから、その情報が取れたらいんだけどね
いくつか試したけど、そういう機能のイベントはない
てか、使えないイベントばっかじゃん
もっとがんばってねM$ちゃん
460 :
448 :2006/03/30(木) 14:56:40
>>458 えぅ〜><ごめんなさぁいですぅ〜
でもでも〜。ドロップダウンで選んだ直後は選択状態になるけどぉ〜
どのタイミングで取得するかなんだよねぇ〜。
選択されたら常に取得するんだとぉ、ドロップダウンアイテム選んでなくても
選択したりすることあるしぃ〜。
そう考えるとわたすぃのあたまではむりぽぉ〜。。。
>>456 Componentに DesignMode っていうプロパティがあるでそ?
それが true の場合は、デザイナの中で動いているから、
デザイナの中で動くときには不要な処理はしないように
if 文入れるなりなんなり「自分で」コードを修正する。
462 :
448 :2006/03/30(木) 17:32:44
>>461 おおーーー!!!!!!
なんだか意味がよくわからなかったが、なんとなくやってみたらうまくいったぞ!!
最初System.ComponentModelやSystem.Web.UI.WebControlsなネームスペース作ってねーよ!って
思ってたけどなw
てか、こんなややこしいことさせるなんて!!普通にわかるだろ!こんなデザイン時までキー入力受け付けないなんて!
もっとがんばってよM$さん
>>461 それにしてもこんなのよく見つけたね?すぐ見つけれたの?すごいね天才だね
ほんと感謝感激です!ありがとう
常識だし
464 :
デフォルトの名無しさん :2006/03/30(木) 18:53:33
Properties.Resourcesに埋め込んだWAVファイルを 再生するにはどうすればいいでしょうか PlaySoundとして、外部ファイル名を指定すれば再生できますが .Properties.Resources._1.ToString(), と指定してもビープ音しか鳴りません。
適当に答えると、ストリームでとればなんとかならんか。
byte配列になるんだっけ? それつかってMemoryStream初期化してSystem.Media.SoundPlayerに渡せば良さそうだが。 ._1の型は何よ。
こういう奴はイベントが起こらなければ起こらないで、 文句を言うんだろ。
SoundPlayerを使ったら出来ました。 回答ありがとうございました。
469 :
デフォルトの名無しさん :2006/03/31(金) 02:00:02
初心者某です。 FileStream、StreamReader、StreamWriterを利用してテキストファイルを読み書きしています。 親プロセスが書き込んだファイルを子プロセスが読み込んでそのFormに表示する、 というプログラムを作りました。(下記@〜F) しかし、子プロセスに表示されるファイルの中身が不完全(末尾が欠ける) という不具合が発生しました。 BとCの間にThread.Sleepを入れたら解消したので 「ファイルの書き込みが間に合わないのだ」と理解したのですが、 そんなことってあるのでしょうか。 Bのメソッドが発行された時点で既にファイルへの書き込みって完了しているものと 思っていたのですが、実際にはタイムラグがあるのでしょうか…。 @ファイルオープン Aファイルに書き込み Bファイルクローズ C子プロセス起動 D子プロセスがファイルオープン E子プロセスがファイルを読み込みフォームに表示 F子プロセスがファイルをクローズ
3と4のコードはどんななってますのん?
プロセス? スレッドとちゃう?
>>469 まずは何の初心者か明示しろ
俺には日本語の初心者にしか見えない
?日本語的にはまったく問題ないように思うが。 とりあえずコードを晒して欲しい
>>469 メモリの書き込み速度とHDDの書き込み速度は
1000倍以上もあるのでプログラムはすぐ次の動作に移るけど
ファイルの書き込みが追いつかないというのは仕様
暇があれば書き込んでやってもいいぞって感じでファイル作るから
ちゃんとファイルがあるかどうか、何よりフォルダ内をちゃんと更新されたのを確認しないとだめ
>>474 人を騙して楽しいかい?
親や兄弟、大切な人とかに「人を騙すのは楽しい」って言える?
>>469 仕様は分かった、コード曝せや
問題が発生しているときに仕様だけ伝えられても仕様のミスくらいしかわからん
ここはC♯言語のスレなんだからC♯言語のを載せろ
StreamReader.Close を呼ぶと、元になっているStream (例えば FileStream ) も Close されます、 ってドキュメントに書いてありますよね。あれ嘘のような気がしませんか?
しないよ なんで嘘だと思ったんだ
Net1.1で、FileStreamを読み込みモードで開いて、それを読むStreamReaderを 作成、使用後にCloseしても元のファイルが消せなかったことがあって。
どっちにしろ再現性のあるコードをあげてくれ、議論はそれから。
ちょっと質問です。 Control.Invalidate(Rectangle)を呼ぶとGraphics.Clipプロパティに適切なリージョンが設定されるものかと思ったのですが、 どうもPaintEventArgs.GraphicsのGraphics.Clipプロパティには常に無限領域が設定されているようです。 これはこういうものなんでしょうか。 もしそうだとしたら、無効になった領域だけを再描画するにはどうしたらよいのでしょうか。
そういうもの。 内部では InvalidateRect が呼び出されて無効領域を設定するので、 フォームのデバイスコンテキストにはその範囲だけしか描画されない。 ちなみに無効領域は PaintEventArgs.ClipRectangle
484 :
482 :2006/03/31(金) 18:56:18
>>483 なるほど、PaintEventArgsの方にあったんですか。気づきませんでした。
どうもありがとうございました。
NumericUpDown(Win 1.1)で、キーボードから打ち込んだときになぜだか ValueChangedイベントが発生しない、という事態が発生しました。 Enterを押さないと発生しないし、Valueも更新されていません。 ためしに新規プロジェクトの空のフォームに置いて試したらちゃんと イベントが発生したので、俺の作ったフォームのせいなんだと思いますが、 みなさん同じ現象が出たことありませんか? もう今週も終わりなので、月曜日にひきつづき原因調べてみます。。。
> NumericUpDown(Win 1.1)で、キーボードから打ち込んだときになぜだか > ValueChangedイベントが発生しない、という事態が発生しました。 > Enterを押さないと発生しないし、Valueも更新されていません。 これが正しい挙動のはずだが?
487 :
デフォルトの名無しさん :2006/03/32(土) 12:43:54
Dictionary<string,T>で大文字小文字を区別しないようにするためにはなにを使えばよいのでしょう? HashtableならばCollectionsUtilでなんとかなるのですが Dictionary.Comparerを実装しようと思ったのですが標準で用意されていないのでしょうか? CaseInsensitiveComparerは使えるのですが、 CaseInsensitiveHashCodeProviderは「使用しないでください」ってなっているので
Dictionary(IEqualityComparer<TKey>) コンストラクタ使えばいいんじゃね?
489 :
487 :2006/03/32(土) 12:58:16
IEqualityComparer<string>のCaseInsensitiveな奴の実装方法が知りたいと言ってると思われ
そのコンストラクタのサンプルにあるし
492 :
487 :2006/03/32(土) 14:16:55
493 :
487 :2006/03/32(土) 15:05:13
,ィ≦テ三三テ≧ュ- 、 ィ州ii} |!{ヾ(((ヾ(((ハ三ミミ 、 〃/ノノリ |ヽ.._ノヽ }}ミミミミh、 〃//〃 | ヽ=ノ ;'⌒ヽ}}ミl、 ,}}| 川|{ ノ ((⌒ ノ }}}li /川||}!}i|  ̄ }州 レ {!州!| ,x‐  ̄ ヽ ,.z==〃/ l!( リノ川 <( ハ〉 ノ { ,ィTヽ / トvソノ}}ハ)、  ̄ ノ l ` ̄ { ))ト〃 }|::ヽ i ′ /ノ》州}}}ィ::、 イ l ′ ((∧ 州}ソ,ノ / ` = _ノ ′ } \ ヾィ ノー- __ - ,' ′ \ ` 、 -‐- イ ′ \ ` __ ,/ l ′ \ ヽ | モーネ・アホカト[Maulnen Ahoccato] (1666〜1738 フランス)
495 :
487 :2006/03/32(土) 19:45:46
ここは騙りがいっぱいなインターネットですね。
>>488-491 できました。ありがとうございました。
現在C#で長時間録音ソフト(ネトラジ録音ソフトの様なもの)を作ろうとしています。
・DirectSoundを使う
・mciSendStringを使う
の2つの方法を見つけました。
前者はMSDN(日本)の説明がよく分からず、またサンプルソースも無いので途方に暮れていたときに後者の方法を発見しました。
後者はこのURLの一番下にある方法を利用しました。
http://f57.aaa.livedoor.jp/~jeanne/bbs/faq.cgi?mode=al2&namber=2460 ですが、この方法では長時間録音すると不安定になったりと不向きと言うことが分かりました。
wavファイルを録音しながら徐々に書き出していきたいのですが、そういった方法、またはそういった方法(サンプルソース)が乗っているWebサイトを教えてください。
私はDirectSoundを使えばいけると思うのですが、MSDNの解説にはサンプルソースが無いのでよく分かりません。
よろしくお願いします。
DirectSound のサンプルなぞいくらでも転がってると思うんだが。 Managed DirectX のとなると少なそうだが、SDK にサンプル付いてなかったっけ? まあ C++ のを大体流用できるだろうし。
ManagedDirectX SDKのサンプルにある CaptureSoundとかじゃだめなん?
>>496 DirectShowでWebからストリーム受信するフィルタ作ってバイナリを保存するのが定石。
500 :
496 :2006/04/02(日) 03:41:14
匿名デリゲートは直接Invokeすることはできないんでしょうか? Invoke(delegate(){ 〜;});みたいな感じで。
匿名デリゲートは直接Invokeすることはできないんでしょうか? Invoke(delegate(){ 〜;});みたいな感じで。
連続書き込みすみませんでした。
new MethodInvoker(delegate(){ }).Invoke(); でもなんか意味あるの?
>>497 C++のコードは読めませんが、500は私ではありません。
>>498 ありがとうございます。SDKのサンプルは盲点でした。
私が考えていた物と結構同じ動作をしているので、これから解析してみたいと思います。
timer_tickイベントの中にMessegeboxを入れると それ以降の処理がされないんですがなぜだかわかりますか? 例えばmsgboxの後にmsgboxを表示しないようにするコードを入力しても なんでもmsgboxが表示されるんです
DirectSoundはマシンによっては使えないことがあるから 現時点ではあまり選択肢に入れない方がいいよ
>>506 おおざっぱに言うとメインスレッドのメッセージループが止まるから。
>>506 おおざっぱに言うと MessageBox はモーダルダイアログだから。
ところで 『ファイル名を指定して実行』 みたいな、自動補完のポップアップの表示の仕方が分かりません。
VS.NET のインテリセンスにしてもそうだけど、ポップアップをクリックしても元のコントロールにはフォーカスが残ったままですし。
単純に API の ShowWindow を使って、非アクティブのまま前面表示するだけでは、↑のようにはならないのですが、
どのようにすれば、これらと同じように表示できるんでしょうか。
>>510 TextBox.AutoCompleteMode
TextBox.AutoCompleteSource
さんくす。v1.1 が対象だから直接扱うのはムリだけど、情報をたどっていったら IAutoComplete インターフェイスにたどり着いた。 なんとかがんばってみるわ。
>>508 >>509 >>510 >>510 ありがとう
原因がわかるまで何度もコード手直しして
たまたま、msgboxを//で囲んだらうまくいった
こういうことってすごく初歩的なことなのかな?
やっぱ本とか買わないとプログラミングって難しいですね
ヘルプみても説明の説明がほしい感じ。専門用語だらけだから
514 :
510 :2006/04/02(日) 20:19:53
ん〜。ごめん。確かにやりたかったのはオートコンプリートなんだけど、 TextBox.AutoCompleteSource とか IAutoComplete ではインテリセンスのようなアイコン描画はできないです。・゚・(ノД`)・゚・。 ……もう一度、お願いします orz
Formでやろうと考えるからややこしい。 UserContorolで作って、単純にContorols.AddでOK。
>>514 ヒント:WM_MOUSEACTIVATE
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# で,高速に,メモリの許す限りの桁数の計算をする方法はありませんでしょうか。
よろしくお願いします。
>>518 ソースあるんなら、制限変更すればいいんじゃないの?
>>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."));
}
こんな感じで例外を投げているので,例外の発生源を突き止めるのが大変そうです...
>>520 単純にmaxLengthを増やせばいいんじゃないの?
>>518 もしターゲットのプラットフォームを"Any"にしてビルドしてるんなら、
"X86" だかなんだかにしてみては?
漏れの今書いてるアプリはこれで実行速度が10倍以上変わる。
単に多倍長演算ライブラリをC#から使いたいんなら、 C++ のライブラリ拾ってきて、C++/CLI でラッピングして Maneged コードにして、 それを C# から呼べばいいのでは。
524 :
518 :2006/04/03(月) 13:06:59
アルゴリズムが違うもの使って速度比較というのもどうかと思うが。
526 :
518 :2006/04/03(月) 13:16:54
>>525 はい。全くその通りであります。
>>524 では言語の優劣を論じたように書いてしまいまして申し訳ありません。
あくまで,その言語の付属ライブラリ(C#のは配布されている最も有名なライブラリ)の速度比較をしたつもりであります。
んなミニマムテストにどんな意義が? 限界を求めるならトライアンドエラーではなくそれぞれのコンパイラの性質について調査したほうが良いと思うが 極限を測るのに現象ベースじゃ解は得られないよ
Form1内のあらゆるメソッドからForm2のプロパティの値を扱う場合 @Form1のどこからでも扱えるようにForm1のフィールでForm2をインスタンス化して Form1のどのメソッドからでもForm2のプロパティを扱えるようにする AForm1の1つのメソッドでForm2をインスタンス化して、Form1の他のメソッドは Form2のプロパティを引数として得ることで処理する BForm1の1つのメソッドでForm2をインスタンス化して、Form1の他のメソッドは Form2をインスタン化したオブジェクトを引数として得ることで処理する Cどれでもいい どれがもっとも適切なんでしょうか?Aでやると、同じようなコードが大量になります。 そもそも、Form1のメソッドでの処理をすべてForm2にやらせたほうがいいのでしょうか?
>>528 Form1とForm2が何だか知らんが、インスタンスをどう保持すべきかを考えろ
Form2はForm1のどこからでもってことは、Form1が存在している間はForm2が必要ってことだろ
ではForm1が存在しなくなったらForm2はどうするの?
Form1の子としてForm2が存在するなら、Form1のprivateな変数としてForm2のインスタンスを受け取ればいい
Form1とForm2の寿命に関連性が無いなら、Form1とForm2をインスタンス化する別のクラスでそれぞれのインスタンスを保持して、Form1のコンストラクタでForm2のインスタンスを受け取るとかすればいい
目的だけから実装を検討しても後でスパゲティになる
>>529 の言うように設計を見直し、ちゃんとクラス設計をするのが正しい解だと思うが
>>518 よくわからんけど、Javaのライブラリの方がネイティブのコードで
書かれてるんじゃないの?
>>531 それで1000倍の差はつかないんじゃない?
>>529 >>530 form1のダイアログとしてform2を開いて、そこのtextboxの内容によって
frm1のtextboxにどのように値を入れるかという処理をしたかったんですが
Form2 frm2=new Form2()
frm2.ShowDialog(this);
addText(frm2)
private void addText(Form2 text)
{
}
みたいにすることで、コードが少し減りました。
CodeProjectの BigInteger で maxLength を 300 にして 1000! を計算すると 16msec くらいだった。Java のは未計測。 ホントに J# のアセンブリの BigInteger がそんなに遅いなら、 CodeProject の奴を上限無しに改修して使ったほうが良さそう。
>>533 マジで設計見直した方がいいんじゃね?
addTextの引数の名前が text なのに Form2 はないだろ・・・
まあ処理自体はそれでいいと思うけど
Form2にプロパティつくったほうがよくね?
DialogResultとかもプロパティがあるくらいだから。
536 :
528 :2006/04/03(月) 19:49:57
>>535 一応プロパティはあります
class Form2
{
public string Address
{
get{retrun this.textbox1.text;}
set{this.textbox1.text=value;}
}
}
見たいな感じで、設計と言われてもどうすればいいのかがよくわからないんです
いつも作ってて迷うのが、変換や処理が必要なデータの受け渡し、受け取りをFORM間でする場合に
どっちに処理をさせるかってのがわからないんです。
どっちもでいえけるし、いろんな別のやり方もあるし・・・
こういうことを迷わずできるようにするにはどういうことを勉強すればいいんでしょ?
何かキーワード教えてください
>>536 こういうコードが期待されている。
using (Form2 frm = new Form2()) {
if (frm2.ShowDialog(this) == DialogResult.OK) {
this.addText( frm2.text );
}
}
>>536 処理の責任を明確にしないから悩む
大きな枠として良く言われるのはn階層って概念
例えば、プレゼンテーション(表示や入出力)/ビジネス(計算)/データ(データベース入出力)と処理の担当を明確にすれば悩まない。
君の例で言えば、Form2は入力に特化すべきで、プロパティが表現するのは「ダイアログから入力された結果」だけ
入力結果を勝手に書き換えてはいけない
ただし、入力結果をダイアログ上で処理するのであれば、ダイアログ内でも処理層を考えて実装し、ダイアログの結果として何をプレゼンテーションすべきか仕様を練る
みんなが設計を見直せと言うのはこういうこと
ちゃんとしたポリシーで実装していれば、どこでデータを処理するかとか悩むはずも無い
539 :
528 :2006/04/03(月) 20:21:26
>>537 >>538 なんとなく見えてきた気がしました
FORM1は表示でFORM2はデータ入出力で変換処理は別クラスを設ければいいのかな?
それぞれのクラスがどういう役目をするのかを与えてやらないから混乱するんでしょうね
今私のプログラムはあっちこっちのフォームで変換処理などがされてて
自分でももう訳がわからなくなってます
作りながら考えて、コードの打ちやすい方に書いてって曖昧なことをしてたのがだめだったんですね
設計見直して見ます。ありがとう。
>>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.で実装したんだけど、何か問題ありますかね?
すいません。彼女の作り方を教えて下さい 1.引き篭もりをやめて外に出る 2.エロゲで彼女を見つける 3.妄想で彼女を作る
死ねば楽になりますよ
母親とやった奴の大半は自殺するらしいよ マジレスすると PCに回ってる資金で雑誌でも買って服装の研究すればいいんじゃね?
オサレすれば女にモテるのか・・メモっとこ
だめなやつはなにをやってもだめ
ニートだろうがエロゲしまくってようが心の底からハードオタクだろうがイケメンには女が集まる それどころか「イケメンなのに」ってギャップに惹かれる女もいる ブサメンは外に出るだけでは無駄、努力しろ
外に出るだけ無駄、と読んで引きこもってろって事かと納得しかけた
何このスレ違いの連続カキコ
まず彼女クラスの設計から入れよ
設計から入ってその通り行くわけねーだろ ウォーターフォールで恋愛できたら苦労しない 恋愛はアジャイルで行こう
彼女クラスはシングルトンにすべきですか? それとも複数インスタンスの生成破棄を繰り返すべきですか?
たぶんメモリ割り当てに失敗するから心配するな。
C#ってのは静的束縛ですか?それとも動的束縛ですか?
いい加減うぜぇ
は?こんなんでセンス計れ言われても とりあえずツッコミはある ・文字インジェクション未対応でセキュリティリスクがある ・引数チェックが無いのでセキュリティリスクがある ・tryがあるのにcatchが無いから例外処理を正しく扱えてない ・変数のスコープが適切じゃない ・無駄に変数を使用している ・変数名に意味を持たせていない
・文字インジェクション未対応でセキュリティリスクがある ・引数チェックが無いのでセキュリティリスクがある これはWebアプリではない。DBアクセスもない。 ・tryがあるのにcatchが無いから例外処理を正しく扱えてない catchは必要無ければ書く必要なし。例外処理の正しさとは無関係。 むしろ気になるのは、readerをStreamReader.Nullで初期化していないこと。 そうすれば、finally内で無駄にnull判定しないで済む。
>>562 > ・文字インジェクション未対応でセキュリティリスクがある
> ・引数チェックが無いのでセキュリティリスクがある
> これはWebアプリではない。DBアクセスもない。
ちょ、ちょ、おま
StreamReaderは絶対バグ無しと確信できるか?
巨大な引数やバグを誘発する引数によって異常な動作を起こさないと確信できるか?
>>560 はそういう点からインジェクション攻撃対応と引数チェックを書いてると思うんだが
Webアプリじゃなきゃ引数チェック不要って発想は穴を作るだけ
> ・tryがあるのにcatchが無いから例外処理を正しく扱えてない
> catchは必要無ければ書く必要なし。例外処理の正しさとは無関係。
このアプリは引数を元に動作するから内部完結せず、例外が発生する可能性が高い
しかも引数チェックをしていないし
にも関わらず例外処理を突っ込んでいないのは「不必要だから」とは思えないが
SQLインジェクションと勘違いして無いか?
>>563 「インジェクション攻撃対応」ってw
>>559 のアプリを起動するときに引数を渡すのは
どこから誰が行うのかな?ウェブから第三者が
行うのかな?そんなことはないだろう?
おまえら何アホくさいこと言いあってんだよ
568 :
デフォルトの名無しさん :2006/04/04(火) 16:49:14
aga
おらも後学のために563の書いたソースみてみたい
異論反論インジェクション!
おまいらおめでたいな
場合によってはチェックしたほうがよい、くらいでいいんちゃうの? 俺もリーダーの初期化が気になる。 ていうか、こんなのループ内で宣言すりゃいいじゃん。
チェックのないエントリポイントはセキュリティホールの可能性となる
>>563 はセキュアアプリケーションコーディングの常識を書いてるだけじゃないかと
ちょっとばかし日本語は不自由そうだが
>>565 その発想はあまりにお目出度過ぎる
他のアプリケーションの不具合を付いてシステムに介入するウィルス・トロイは多くいる
そういう悪意あるアプリケーションがネット等を通じて進入し、ローカルのアプリケーションを突かないと断定できるか?
ローカル利用限定アプリであっても、それでは脅威モデルの設計が稚拙過ぎると思うが
575 :
564 :2006/04/04(火) 18:01:52
あー、もしかしてオレが原因?
オレの
> SQLインジェクションと勘違いして無いか?
は
>>562 宛だからね
>>562 は文字インジェクションとSQLインジェクションを混同してるんじゃないかと思ってね
>>563 要は引数経由で危険な文字列がインジェクションされるかもしれないってことだよね
576 :
デフォルトの名無しさん :2006/04/04(火) 18:02:04
>StreamReaderは絶対バグ無しと確信できるか? >巨大な引数やバグを誘発する引数によって異常な動作を起こさないと確信できるか? で、実際にバグの有無もどのようなバグかもわからないバグに対しての 引数チェックのコードはどう書くわけ?
なんでこうPGってのは頭固くて依怙地そうな文章しかかけないのか
>>576 引数が求めるものだけ渡すってことだろ
引数がstringだけってことはこれだよね
StreamReader コンストラクタ (String) (System.IO)
http://msdn2.microsoft.com/ja-JP/library/f2ke0fzy (VS.80).aspx
とすると、引数に必要な条件は以下となる
1.ファイルパスとして有効な文字列数であること
2.ファイルパスとして有効な文字列であること
また、このアプリの仕様的な制限を加えても良いかと
例えばこんなところ
・ローカルのパスであること
・UNCパスであること
・絶対パスであること
・相対パスであること
もしかして特定の書き方をしたら異常動作を起こすバグがあるかもしれない。
そしてそれは知られていないかもしれない。
勿論それに対して対処するコードは組めない。
だとすれば、現時点で判明している最低限の制限である「引数が要求する値」のチェックは組み込むべき。
外部から入力される値に対して「絶対安全」という前提で組むのは良くない
>>578 ごめん。ずぼらな自分には無理です・・・
MulticastDelegateオブジェクトとして受け取ったデリゲートを 呼び出すにはどうしたらいい?
DynamicInvoke あるいはキャスト
チェックしないてのもありだと思うけどな。 もちろん使い方による話だよ。 明確に使い方に条件があるならそれをチェックすればいい。 ないならリーダーにまかすのもありだろ?
586 :
デフォルトの名無しさん :2006/04/04(火) 18:57:21
どう論外なのか詳しく。
初めて10分程度の奴に何マジレスしてるんだか 初心者叩きしてる奴も程度が知れてる
StreamReaderを信用するなんて論外だ
StreamReaderを信用するなんてムリーダー
Stringを信用するなんて論外だ
Microsoftを信用するなんて論外だ
ストリングを信用するなんてスリリングだ
おまえら…
お前ら仕事のしすぎだ。休め。 たっぷり睡眠をとれ。
二徹の俺に対する嫌味かコラ
外部 DLL などに含まれているアイコンなどのリソースって読み込めますか? c# で作成したリソースの読み込みなどはサンプルがありますが、普通の exe, dll 等は 見当たりません。 こういうことって出来るんでしょうか?
Win32API 使うことになる。
>>574 いや、そもそもトロイに入られた時点でアウトだから。。。
マシンに進入できたトロイがわざわざローカルのアプリなんぞ狙う必要は無い。
>>599 素早いお返事ありがとうございます。リソースを読み込むWin32API 名前を教えていただけ無いでしょうか。
ちょっとは調べたのか? 調べても見つからなかったというのなら検索したキーワードを言ってみろ。
>600 >574にとっては不十分なんだろう。 何を神経質になっているのか皆目見当がつかんが。 cgiで使われる場合にぃぃとか言い出すのかな。
システムに侵入を許した時点でなんでもありだ。 侵入されないためならまだ話は分かるが。 巨大な入力があったらと言うが、 アプリが起動してる時点でそのチェックはもはや手遅れ 場合による、使い方によると言うのさえ論外って どういう事なんだ?
>>604 たぶん「引数に明確な条件が無いならリーダーに任す」
というのが論外なわけでは?
上流工程での仕様で所与の条件がないなら、
設計段階で条件を適当に作って、
その仕様に基づいてコードを書くべき。
仕様がないとテスト項目も作成できない。
まぁ漏れなんか論外プログラマだから、
FileOpenDialog で得られたパスをそのまま
使ってファイル開いたりするけどね。
Existくらいしろよwwwww
604のようなアマグラマが危険なプログラムを作るという事が良く分かった
>>606 Exist で検査するファイルパスが有効なものかどうかチェックするコードきぼん
くだらないセキュリティ論で自説の展開したいならよそ行ってやれよ ここはC#相談室だ
610 :
デフォルトの名無しさん :2006/04/05(水) 12:33:36
Encoding.ASCII.GetString(bytes); ってしたときにVS2003とVS2005で同じbytesに対して結果が違うのですが、 何が変わったんでしょうか? ためしたbytesは0xb5 0xeb 0x2dです。
今は仕様がない状態なんじゃないの? でファイルパスとして正しいかどうかの条件も明確に出来ない現状で 勝手なチェックを入れることでどれだけ安全にできると? それは作者のやりたいことを阻害しないチェックになるのか? 別に本来チェックすべきだってことには異存はないけど 今みたいなためしに作ったコードにこうするべきなんて仕様は定義できないし、場合によっては渡されたものは自作コード部分では受け入れる ってのもあるっていってんたよ。 具体的にこれがどんだけ危険なのか、 てきとうなチェックを入れることでどんだけ安全になると言うのか いってみてくれ 例えばOSのコマンドで使い方次第で危険なものなんていくらでもあるだろ やっぱり誤解されそうだが、基本的にチェックするべきってのに異存はない。
612 :
デフォルトの名無しさん :2006/04/05(水) 12:59:55
>>609 C#にはセキュリティの概念が無いのか?
Directory.GetFilesはなんで引数searchPatternにワイルドカードが 指定出来るのに↓みたいな仕様なんだろ >>拡張子の長さがちょうど 3 文字の場合の searchPattern の一致の動作は、 >>拡張子が 3 文字を超えている場合の動作と異なります。ちょうど 3 文字の >>searchPattern の場合は、3 文字以上の拡張子を持つファイルが返されます。 hoge.txtは拾いたくてhoge.txtaaaは拾いたく無い場合にはどうしたらいいんだろ?
>>606 Existsはファイルシステムにアクセするから不適切
>>608 無難なのはファイルの有無を問わないIsPathRootedかな
文字列そのままがfalseの場合は相対パスの可能性があるんでカレントパスとCombineしてチェック
それでもfalseならパスではないということで弾く
やるならこの後Existsかな
流れに乗って質問させてください HDDの中身をすべて削除するようなプログラム作りたいんですけど 2005で作った場合、誰が作ったかexeファイルだけでバレたりしますか?
>>611 > 別に本来チェックすべきだってことには異存はないけど
いや、漏れは異存あるよ。
無駄なチェックはやるべきじゃないと思うよ。
とりあえず安全のために何でもしとけ、って思想には賛成できない。
>>560 > ・文字インジェクション未対応でセキュリティリスクがある
> ・引数チェックが無いのでセキュリティリスクがある
についてなんだけど、具体的な攻撃機序(メカニズム)を説明して欲しいな。
でないと、無用なチェックと言われても仕方がないと思うが。
>>616 バレる場合もあるよ。
.NETアセンブリにはいろいろな情報を埋め込めるから
逆アセンブラ(ILDASM)使ってそれを知ることができる。
心配なら作った後でILDASMで確認しる。
極限までセキュアにするのであるなら、エントリポイントに対するチェックは考えられる限りすべてやるべき
例えば金融系モバイル用アプリなら脅威モデルとして直接操作もありうる
未知の問題に対する保険の意味でも「既知の制限」を実装するのは悪いことではない
が
アプリ環境の前提もなくセキュリティの基準を語っても何の意味もないわけで
>>617 例えば「StreamReaderには未解決のバッファオーバーフローの問題によって管理権限を奪われる」という問題があるかもしれない。
そしてその攻撃方法は「非常に大きな文字列を唯一の引数として渡すこと」かもしれない。
実際これは存在しない(はず)わけだが、これらの問題が存在しないことを証明するのは非常に困難(悪魔の証明)
そしてその困難さを付いてくる顧客もいる。(私が金融系モバイルシステムを発注したなら、どこまで安全かとことん問い詰めるかもしれない)
そのため、次善策として例えば「ファイルパスとして有効な文字列しか渡さない」という方法を実装できる。
とまあ言い連ねればキリがないわけだが、そういう論理も展開できる。
そしてそういう次善策を極限まで求められる業界(金融系・個人情報系)もあるわけで。
ま、普通はここまで考える必要は無いと思う。アプリ環境次第。
622 :
デフォルトの名無しさん :2006/04/05(水) 13:32:25
AppDomain上で動くマネージド・コードなら バファオーバーフロー問題は起こらないと聞いたが。。。
むしろ public static void Main(string[] args) の string[] に不正な文字列……例えば巨大な文字列を入れることを防ぐことは出来ないよ。 そして万一 string にバグがあった場合、それはセキュリティホールになる可能性がある。 ……みたいに神経質になるんだったら、俺は出来ることだけ考えるよ。面倒すぎる。
>>622 マイクロソフトの公式見解である「AppDomain上ならバッファオーバーフローの問題は起きない」を信用してくれる顧客もいるが、
IT業界に詳しくない顧客は「何だかんだ言ってもセキュリティ問題で毎月ニュースになるミクロソフトの発言なんて信用できねーよ」と言うかもしれない
運用管理側の人々は「限界まで開発者としての安全性を保証してください。」って言ってくるだろうし
もしものときに「だってマイクロソフトが安全って言ってたから」じゃ通用しないわけで
いままで「絶対安全」と言われながら穴があった例も多数あるわけだし
できるかぎりやる それでも穴が空いたら謝る そんだけ
627 :
デフォルトの名無しさん :2006/04/05(水) 14:10:03
パッケージソフトなら使用許諾契約書に免責事項入れときゃいいけどなぁ・・・
>>612 セキュリティの概念論や方法論は特定の言語に結びつくものなのか?
>>628 概念論はそうだが、言語が違えば方法論は違ってくる。
>>627 アプリケーションソフトだと瑕疵担保期間があるからな
それが終わっても運用フェーズにはいるから手離れするわけじゃないし
openFileDialogのボタンの文字って変更可能でしょうか?
無理
vbよりc#のほうがいいの?
VB と言うのが VB7 以降のことなら、大差ない 好きな方を選べ
>>635 アリガd
VBはVB7以前の知識しかなく、C++は基礎知識のみ、C#は知識ゼロなんだけど、
大差ないんだったら、これを機会に C#を覚えたほうがいい?
VB.NETとC#の両方を覚えた方が絶対にいいです。 仕事を得やすいです。
638 :
610 :2006/04/05(水) 16:46:04
非 ASCII 文字の解釈が変わったんだろ Encoding.ASCII に非 ASCII 文字を渡してどうなるかなんて別に定義されてないし
640 :
デフォルトの名無しさん :2006/04/05(水) 18:04:08
C#で、赤外線付PC、又は赤外線を後付したPCの赤外線を操作するアプりを作成することはできますか? 例えば、リモコンアプりとか。 できるのならばさっそく赤外線商品をサーチしようと思うのですが
C,C++のAPIでもあるならどうとでもなるだろ。
642 :
640 :2006/04/05(水) 18:20:46
>>641 回答ありがとうございます。
どうとでもなるのであればさっそくサーチしようと思います。
ついでにAPIも並行で探しながら、あればそれを使って簡単に作れそうですね。
643 :
氏天国 :2006/04/05(水) 18:26:08
h
>>621 これからは大量破壊兵器の証明に変えるえるべきだな。
>>614 OpenFileDialogで開いているカレントパスはどうやって取得するの?
ていうか、OpenFileDialog.FileNameってパス付だし、Combineする必要ないんじゃ?
Existsで問題ないでしょ。Existの仕様をみれば
そもそもCheckFileExistsにしてればそのまま開いちゃっていいし。
どの辺が論外プログラマなの?
アプリはAPIの仕様を元に組むので基本的には「〜〜かもしれない+無用のチェック」はする必要はない。というよりもしてはならない。
仕様を把握しないでとりあえずチェックしておけ、みたいなのは問題外かと
「無用のチェックで読み辛くなる、処理が追い辛くなるリスク」 >> 「未知のAPI(下物)によるセキュリティホールリスク」
それでもやれというなら、相当のコストを払ってもらわないとね。
ウェブの閲覧履歴(Documents and SettingsのHistory)の内容を エクスプローラでみるのと同じようにビューとして表示したいのですが どうすればよいでしょうか? WebBrowserコントロールでDocuments and SettingsのHistoryを パスに指定するとビューとして閲覧はできるのですが、 現在選択しているファイルがなんであるかを知る方法が見つかりませんでした。
>>645 > OpenFileDialogで開いているカレントパスはどうやって取得するの?
ん?元質問者はコマンドライン引数としてパスを受け取っているけど
606の「まぁ漏れなんか」以下はそれまでの流れとは無関係な独り言だろ
少しは流れ嫁
> それでもやれというなら、相当のコストを払ってもらわないとね。
それでもやれって仕事があるわけで
当然相当のコストを払ってもらうわけですが
そもそも業務開発にオレ流は不要で、顧客がどこまでを望むかに対する成果物だけ
べき論もへったくれもないし、それを顧客に押し付けるのは開発者の傲慢
>>646 自分でパスを取ってきてListViewなりに表示すればいーやん
WebBrowserがホストしてる内容を取る方がめんどい
おれは今猛烈ににセキュリティに気を使ってコーディングしている! ウッキー!
651 :
646 :2006/04/06(木) 07:51:52
>>648 Historyの中身ってエクスプローラでみるとURLのリストが表示されるけど
実際はindex.datって1つのファイルに保存されています。
それを解析する必要があるのでしょうか?
652 :
646 :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
とやってみたらいかがでそうか(´・ω・`)
>>654 あとそのときは、コントロールのZオーダーに気をつけることじゃ。
VisualC#.NET 実践講座 という本を読んで、DBアクセスの処理を作ろうとしているのですが、 早速つまづいてしまいました。 本によると、フォームのデザイナを開き、サーバエクスプローラウインドウから、テーブルを フォームにドラッグすると、sqlConnection1と、sqlDataAdapter1が追加されるとあるのですが、 テーブルをドラッグしても何も起きず、どう進めて良いのかわかりません。 テープルの参照などは問題なくできるのですが、プログラムからどうアクセスするのか、 どうもわかりません。 環境は、VS2005、SQLServer2000です。 どうぞ宜しくお願いします。
メニュー項目に日本語つけるとそれが変数名になってしまってハゲウザい。 これってやめられないの?
>>656 IDE使ってやると実際に何がおきてるのか判らなくなるので世故世故コード書くことをお勧めします。
>>656 その本2005に対応してないから無理だよ
Trace.WriteLine("RES:2"); と書きますと アンダーバーが引かれて"リンクにしたがいます"とかツールチップ表示されます。 いったい何の機能でしょうか?
.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 返信ありがとうございます。
@配列の宣言→string [,] x;
Aメモリ確保→x = new string [2,2];
すみません、二日前に始めたばかりなので、
初期化はわかりません。。
すみません。
String.Sprit(',')で得られたString[]をArrayListに順次放り込んでいって最後にToArray
>>666 それだと string[][] になるような・・・
マルチ歓迎 こっちはいちいち関連するスレ全部巡回してるわけじゃないから 同じ質問でも情報でもなるべくたくさん書き込んでくれ いまどきたかがマルチぐらいでリソース枯らすような鯖なんて 使ってる掲示板サイトなんて無いから。
まあおまいはそうしろ。
staticクラスが使い勝手がいいので何も考えずに使っているんですけど 基本的に複製しないでプログラムにひとつだけのものや機能だけを何度も使う場合やフォーム上の自作コントロールなどは staticでも問題ないですか? いろんなクラスから自由に使えるので、いちいちインスタンス化しなくても済むので便利なんですけど
機能だけを使うのは分かるが、コントロールが static というのは理論的には変だな。 まあ自分しか使わないのなら別にどうでもいいんじゃね。
SMTP-AUTHでメール送りたいんですが、SmtpClientとMailMessageを 使ってできますか?
this.Load += new System.EventHandler(this.Form1_Load); Loadなどのイベントに対して 何個のハンドラが追加されているか知る方法はありませんでしょうか。
SortedDictionaryをValueでソートすることはありませんか。
×ありませんか ○できませんか です。
それは意味不明すぎるな
KeyValuePairのリスト作ってソートするしかないんじゃね
foreach (var pair in from p in dictionary orderby p.Value select p) { /* DoSomething */ } こんなの?@C#3.0
List<T>.ForEach(Action<T>)で要素の内容を変更してもいいの?
>>680 いいんじゃね
俺の感覚だと Predicate<T> で副作用のあることは絶対禁止で
Action<T> ならなんでもOK
TreeViewでキー名とラベル名を一緒にしてノード作っているんだけど ユーザーによってラベルが変更さた場合、キーもラベルと同じにしたいのに 変更できないんですがどうすればいいでしょうか? 同じキーがあるかどうかや、キーによって値を取得したりキーをメインに使っているのに ラベルが変えられると選択されているノードがどのキーかもわからず また、新しくノードが使われた場合、ラベル名は被ってないけど、キー名が被ってしまったりするし なぜ、キーを設定し直せないのか疑問なんですけど エクスプローラーはどういう構造してるんでしょうか? みなさんはこういう場合どうしてるんでしょうか?
つかキーって何よ。
684 :
682 :2006/04/08(土) 16:05:44
public virtual TreeNode Add ( string key, string text ) のキーです
ほー、2.0 でこんなの増えたんだ。TreeNode.Name プロパティか。 AfterLabelEdit で書き換えれば? んー、しかしどういう風に使うもんなんだろ。 今までに慣れてた身では思いつかんなぁ。
686 :
682 :2006/04/08(土) 16:35:58
>>685 TreeNode.Name
これはラベル名と思い込んでたんだけどキープロパティなのかな?
ちょっと調べてみます
SortedListなどにしても基本的にキーで管理するので
キー名と例えばタイトル名(SortedListに格納するオブジェクト名)を一緒にして管理し易いようにすると思うのですが
タイトル名が変わるとどうするんだ?ってとこでいつも行き詰まります
デザイナでフォームとか作ると buttonHogeHoge.Name = "buttonHogeHoge"; とかやたらに作ってくれるんですが これ削ってもいいですよね? 削るとファイルサイズがかなり減るんですが
以降、デザイナで変更を行わないんだったらな。 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 と表示されます。 バグのような気もするのですが、これって仕様なんでしょうか?
仕様です。何を持ってバグといってるのか。
次からはフラットスレに書こうな
コンパイラがforやifが確実に実行されることを理解してないからそういうエラーとしてはじくって事か。 これってほんとに仕様として定められてるのか?
int a; if(boolHoge) a=1; else a=0; Console.WriteLine(a); これはエラーにならないと思うよ
694 :
689 :2006/04/08(土) 19:42:18
なるほど。 コンパイルの時点で値が代入される保障がないということですか。 皆さんありがとうございます。分かりました。
695 :
689 :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);
vbは0で初期化されてるとかって落ちだったりしないの。知らんけど。
Dim ステートメントの解説読め。
コンパイル時にそういうちぇくするかしないかの違いだけだろう。
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(); と同じってこった
701 :
689 :2006/04/08(土) 21:26:18
今まで Dim a As Integer と int a は全く同じだと思ってました。 ありがとうござういました。
C#も未初期化エラー出すなら遡って0突っ込むくらいの芸があってもいいのにな
それはそれでバグの元なのでイヤだな。 大抵の場合に面倒なだけなのは確かだけど。
あるフォームに適当なコントロール(ボタンとか)を 動的にForm.Controls.Add()してRemove()して GC.Collectしてもデストラクタが呼ばれないんですが、なぜなんでしょう。 他で誰も参照してないように見えるんですが。
呼ばれるし。 あと Component 派生クラスでデストラクタ(というかファイナライザ)定義しちゃいかんよ。 protected Dispose(bool) をオーバーライドせんと。
祐美クラスを作ってコンストラクタで初期化したのですが ボクのことを好きになってくれません Class 祐美 { private string 好きな人=""; public 祐美(string name) { 好きな人=name; } } Class 健太 { public void 愛してる() { 祐美 ゆみちゃん=new 祐美(健太); } }
取りあえず、設計が間違ってる
new 祐美(typeof(健太).ToString());
>>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); }
}
}
予期せぬ例外が発生しました。悪いことは言いません。健太さん、誰かに恋するなんてやめといた方がいいですよ・・・。おこがましいです。
↑ものすごい説得力ww
>>706 もう少しまともな例題選ぶかスレ選ぶかしてくれ。
なぜフォーム上のコントロールのイベントがすべてフォームクラスに記述されるんでしょうか? それぞれのイベントはそれぞれのコントロールで処理したほうがいいように思うんですが コントロールが増えてくるとそれをすべてフォームクラスで中継して データを参照したり受け渡ししたり変換したり、表示するように命令したりなどしなければならないのがすごく煩わしいです
>イベントはそれぞれのコントロールで処理したほうがいい 意味が分からん
>>713 そうしたきゃそうすればいいよ。
絶対今よりも煩わしく複雑になるけど。
MVCは原理主義
>>713 UserControlがあるだろ。
設計とかそんなん自分で頭働かせて煩わしくないようにすればいい
>>713 もしかしてFlashのActionScriptあたりの影響受けてるのか?
あの糞実装は現在「推奨されない記述方法」となっていてActionScript用のレイヤにまとめて書くことが推奨されてるぞ
どっかのレスにもあったが、処理の責任区分を明確にしてないからそういう糞発想が出るんだよ。
ボタンは一般的には「ユーザインタフェースとしてボタンを押すという入力を受け取る」機能が目的なんだから、その上位に対して「ボタンが押されたこと」を通知するのが責任区分
ボタンが押されたことに対してどう処理するかをボタンに責任持たせるべきだと思うか?
・・・まあ、思うからそうユーザ視点で処理を書いているんだろうな
開発者の癖にユーザ視点というのはデザイナー出身FlashActionScript屋っぽい発想だな
処理のレイヤを分割するのは今時の設計では基礎の基礎だと思う
ユーザ視点で処理を実装しているとそのうち破綻するぞ
ファイルダイアログに処理全部かくことにしました。
720 :
713 :2006/04/09(日) 18:57:22
まだプログラミング初めて1ヶ月程度なんでそんな大そうな人間はありません ボタンが押される→DATAを読み込む→DATAをテキスト形式に変換→テキストボックスに表示 ↓ データを一覧できるようにリストに追加 この一連の作業をFormクラスで記述するのがどうもまどろっこしいんです。 小規模ならいいんですが、徐々に複雑になっていくとFormクラスがメソッドだらけになりそうで パーティアルとかで分散クラスにすることもできるようですがしっくりきません。 なので、ボタンが押されたら、FormにRead("ファイル名");だけを記述すれば全部やってくれるようにしたかった できれば、わざわざFormにイベント送ってくるんじゃなくてボタンクラスで処理できればと思ったり ファイルを読み込むクラスと変換するクラスなどそれぞれ作っても ファイルクラスにファイル名を送るのも、DATAをテキストに変換するクラスのメソッドにDATAを渡すのも そのDATAをtextboxに渡すのもすべてFormクラスで記述するのって混乱しませんか? って、発想から来てます。
>>720 Formにイベント送ってくるんじゃなくてボタンにイベント送ってくるんだけど。
Formに記述してるメソッドをボタンのイベントに登録してるだけ。
好きなとこにメソッド書いて登録すればいいと思うよ。
>>720 混乱するとかはよくわからんが・・・何かするときに誰が何の責任を謳歌で考えればいいと思うよ。
>>720 そんなに複雑なら、データ入出力クラス作っちゃえ。
すれば Form から分離することが出来る。
ところでパーティアルじゃなくてパーシャル。
Visual C# 2005 Express Edition を使用しています。 プロジェクト内のすべての.csファイルを一括印刷する方法はありますでしょうか。
読めてないなぁ俺。下のほう完全に重複してるじゃん。
>>720 フォームは、自分にボタンとテキストボックスが乗っかってることを知ってるよな?
じゃあ、ボタンは、自分が載っているフォームにテキストボックスがあることを知ってるべきなのか?とか。
処理を仲介するものを1つ定義するとしたら、Form あたりが適切になってくると思うが。
726 :
713 :2006/04/09(日) 19:18:37
>>721 ボタンなどのコントロールはFormクラスでインスタンス化されたオブジェクトだから
外部のクラスからは他のクラスのオブジェクトは直接操作できないですよね?
いや、コントロールをすべてpublicにしてしまえばいけますけど、よくないですよね?
だから、好きなとこにメソッド書いてもアクセス権が無ければ意味がないわけで
結局、コントロールを配置してるFormクラスですべてのコントロールのデータ受け渡し表示まで
管理しないとダメってことになりますよね?
Formクラス→それぞれのコントロール管理するクラス→コントロールクラス
みたいな構造が理想かな?
管理クラスをFormで宣言して、管理クラス内でコントロールを作成したらいけるんでしょうが
そうなると、グラフィカル(IDEでマウス操作で)にコントロールのプロパティや外見を作成できず、
すべてコードで記入しないといけないですよね?
>>720 のような一連の作業の橋渡しをするようなクラスを実現したいんです
別クラスにスりゃいいだろ
>>726 そのフォームでやる内容がほかの場合でも使うようなものならば別クラスもいいと思うけれど、
その場合にしかないような処理ならば、そのFormでしてもいいんじゃないか?
要はコントロール郡をまとめる管理クラスをFormがかねてるのが気に食わないんでしょ?
729 :
713 :2006/04/09(日) 19:36:09
簡単にいうと中央集権型の構造が嫌なんです
コントロール分権型のほうが扱い易くないですか?そうでもないですか?
別クラスと言っても、結局Formクラスにコントロールがある以上は
データの中継はFormクラスを通さないといけないわけで
自分でも何言ってるのかよくわからなくなってきましたがw
コントロールの管理はFORMがするのが基本なんですか?
>>728 > 要はコントロール郡をまとめる管理クラスをFormがかねてるのが気に食わないんでしょ?
そうなんです。繰り返し使う関数や処理はできるだけ別クラス作ってますが
クラスが増えれば増えるほど、クラスのメソッド呼び出し、データ受け取りなど増えていきませんか?
今Formクラスのメソッドは呼び出しとデータ受け渡しだらけです。こんなもんなんでしょうか?
んなら UserControl に Button と TextBox をはっつけりゃいいだろ
屋根の上に屋根をつくってほしいって言ってるように見えるが。 >繰り返し使う関数や処理はできるだけ別クラス作ってますが これが間違いっぽい。
スクロールするのがめんどくさいって話でしょ そんなん知るか
733 :
713 :2006/04/09(日) 19:40:29
Formはユーザーに対してインターフェースを提供するだけであって データの受け渡しなどはしてほしくないんです そういう内部的な動作は別のクラスに一挙にまかせて Formはそれぞれのコントロールのイベントを取得して 内部処理クラスにそういうイベントがありましたよってのを通知するだけにしたいんです
734 :
713 :2006/04/09(日) 19:44:11
>>730 連動させるのがその二つだけの小規模なものならいんですが
大量にコントロールが増えた時のことを考えてください
そうなるとFormの二の舞です
>>731 そうです。C#を実現するために、windows上にframeworkがあるようなもんです
>>732 簡単にいうとそういうことです。
一つ一つのクラスのメソッドはできるだけ少なくしたいんです
735 :
728 :2006/04/09(日) 19:47:14
>>729 MVCってしってる?デザパタ読め。
同じような繰り返し処理が分離でき再利用されるものなら関数としてであろうがクラスとしてであろうが分離すべし。
まぁ自分はビューとコントローラはそこまで分離させないが。
>>733 プレゼンテーション層であるFormにビジネスロジックなんて載せないだろ
ビジネスロジック用の別クラスを作ってButton→Form→ビジネスロジックのメソッドってやるだろが
自分で勝手にFormを中央集権にしてるんじゃん
だから処理の責任区分が曖昧だっつーの
737 :
713 :2006/04/09(日) 19:59:02
>>736 もちろんビジネスロジックは別に用意してますよ
何度もいうようにそれぞれのコントロールを中継する役割をFormがやるのが気に食わないんです
×Button→Form→ビジネスロジック
○Button→ビジネスロジック
これならいいんです。すべてのコントロールの中継するためのコードだけでも
大量になりますよね?
>>720 のような一連の作業をFormを通さないでできますか?
私が言ってるのはそういうことなんです
Formからすべてのコントロールのパブリックメソッドにアクセスできるような状態が嫌なんです
それがいいとは思わんが、そのためにイベントがあるんだと思うが。 ボタンのイベントにビジネスロジックの呼び出しを登録すればよいだけ。
739 :
713 :2006/04/09(日) 20:07:04
>>733 の言ってる内部処理とは関数とかそういうのではなく
中継するためのコードのことです
private textView()
{
string[] data=ファイル入出力クラス.FileOpen("ファイル名");
string[] text=変換処理クラス.ConvertToText(data);
textBox1.Text=text;
}
↑のようなコードをFormクラスで書きますよね?こういうのがウザいんです
たったこれだけならいいですが、コントロールの数だけ、変換処理の種類だけ
大量に書かないといけないわけで、それが嫌なんです
>>739 じゃ、おまいの理想のコード書いてミーよ。
>>739 好きなクラスに書いたらいいがな
ところで型まちがってるよ
おれは
>>738 の意見に賛成だな。
Button1_Click {
Text1.Text = Hoge.ReadAndConvert("ファイル名");
}
って感じで。
>>743 そのコードが Form クラスにかかれるのが気に食わないらしいんですよ
745 :
713 :2006/04/09(日) 20:32:53
>>743 そのイベントドリブンをFormに書くってことですよね?
既に、私のFormはそういう感じです。
ほとんどの処理がイベントドリブン内で収まってます
メソッドやフィールド、プロパティなどはほとんどありません。
でも、コードはだんだんと長くなりFormクラスを圧迫しつつあります
イベント処理をFormに書くことが嫌なんです
Formはほっといてほしいんです
今週のキーワード ホームはほっといてほしいんです はい、続けて ホームh(ry
てことは、 Private Button1_Click() { Controller.Button1_Click(); } Class Controller { void Button1_Click() { // 処理をここに書く } } ってやりたいと? それこそ無駄だと思うなw
>>744-745 ちゃうちゃう
必要な処理はManagerクラスにでも書く。
そのイベントドリブン処理が全部マネージャークラスに行く。
750 :
749 :2006/04/09(日) 20:38:41
Form{ Form(){ button1.Click+=new ButtonEventHandler(controller.DoClick); } } Controller{ void DoClick(){ sukinasyori } }
イベントデリゲートを登録するときに Manager クラスに引っ掛ければいいんだろうけど、 IDE のサポートがなくなっちゃうしな・・・
752 :
713 :2006/04/09(日) 20:40:32
>>746 私はまだC#を熟知したわけじゃありません。
一通りのC#の概要について一読しただけで
これからアプリを作成しようと思っている若輩者です
ここにいる住民の方々なら匠の技を教えて頂けるのではと思い相談に上がった次第です
わたしの言っていることは傲慢なんでしょうか?
一般的なプログラミングとはかけ離れた妄想なんでしょうか?
もしそういうことなら遠慮なくそうおっしゃってください。
一般的にはこうするものだと言っていただければ従います
クラス設計をするに当たってただ単に質問させて頂いただけなんです
不快な気持ちにさせようとしている訳じゃない事をご了承ください
>>752 少なくとも、MS はフォームの責務としてイベントを受け取るところまではやるべき、という考えなんだろ。
IDE はその考えに基づいて作られてるから、あくまで我を通したいというなら IDE のサポートは期待
しないこった。
private void _executeCommandOnButtonXXXClicked(){ textBox.Text = this.LogicController.GetDataText("filename"); } 一行ならだめか? コントロールの数だけクラス作るほうがめんどくさいと思うんだが。 713の理想のコードってコマンドパターンチックに行く感じ? class GetDataButton: Button{ protected override void OnClick(EventArgs e){ /**/ } }
>>752 そっちの理想だと、Button と動作が完全に癒着しているけど良いの?
ボタンを押すことと、処理を行うことはそこまで密接に関係があるのか。
とりあえず、悪いとは言わない。色んな方法があるから。
756 :
713 :2006/04/09(日) 21:05:10
>>753 なるほど、Formにイベントドリブンを記述しないとそうなりますか
IDEを恩恵を捨ててまで初心者がやるべきことではないということですね
>>754 イベント処理をFormで受け取って、イベント処理内容を別クラスに定義するということですよね?
でも結局イベントはFormで受け取っている以上、実際には1行では済まなくなると思います
ファイルが存在しなかったら?ファイル内容が○○だった場合の処理分岐は?など
イベントを受け取る側では実行結果後の分岐処理が待っているんだと思います
やはり、すべてFormでデータの受け渡し、データ入出力要請などをしないとダメっぽいですね
Formコードが長くなったらパーシャル使うなど・・・と言った感じですか。
>>755 クラスはできるだけ隠蔽すべきだってのを呼んでいると、Formクラスから多くのコントロールが見えてしまうのは
あまりよくないんじゃないのか?それだったらコントロールごとに動作と連携させればいいんじゃないか?
そしてデータ構造や動作に関してはFormクラスからは見えないようにしたほうがいいんじゃないのか?って発想なんです
それぞれのコントロールはお互い何をやっているかもわからないし、ただ与えられただけのことをやればいいみたいな感じです
アクセス修飾子に関しても、publicprotectprivateとかじゃなくて、このクラスとだけ入出力できるような特定できればいいんですけど
public(bottun1) Class ボタンの動作//Bottunからだけ見える管理クラス
{
}
みたいな感じですね。こうなると別のネームスペース、プロジェクトを作れということなのかな?
結局どっかには書くことになるから、まとめてあるほうが楽だよ 漏れのお勧めは 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);みたいな
>>756 ・・・・・・? そこまで自分の考えがまとまっているのなら、それでやればいいじゃん。
Button クラス継承して、イベント引っ掛けてデータ処理して・・・・・・ Form 介さずにも何とか出来るよ。
759 :
713 :2006/04/09(日) 21:32:04
>>757 うまく例えられないですけど、フォルダのサブフォルダのそのまたサブフォルダのって感じで
多段階層に対しての管理はそれでやるとまとめられると思うけど
私がほしいのは横とのつながりなんです。Form上のTextBoxとListViewのデータの受け渡し変換など
>>758 その言葉聞くとなんだか自分の考えがおかしいような気がしてきた
私がやろうとしてるのは
IEでお気に入りのURLをクリックするとHPが開かれる
けれども、URLのボタンにHP内の画像や文字列が格納されてるわけじゃない
HPはHPでサーバーが管理しているわけで・・・
やっぱり、ボタンなどコントロールにデータ管理処理などすべてをやらせるのは
逆に管理が大変になるでしょうね
すべてのメソッドをイベントハンドラとして設計するのはマズイかな? 渡したい値はEventArgs継承型に全部いれちゃって。
個人的にはsenderがオブジェクト型なのでわかり辛いとおもう Controller内にpublicで定義して、イベントとして登録する使い方ではsenderに依存しちゃいけないと思うし
763 :
713 :2006/04/09(日) 22:40:44
>>762 別クラスから、FormクラスのtextboxとListviewの両方にはアクセスできませんよ
できるだろ。
>>763 Controllerに両方のポインタ渡しとけばいいだけやん。
dllに分けてinternalプロパティやメソッドで公開
>>713 まずさ、マイクロソフトの提示するやりかたをキッチリ理解してよ
次に開発の一般的な実装方法を学習してよ(デザインパターンとか)
当然の知識が無いのに「オレ流の正しさを理解してくれ」って語られても困るんだよね
768 :
713 :2006/04/09(日) 22:55:24
>>768 >それはかっこ悪いです
ControllerがFormのかわりにコントロールを管理したいんやなかったの?
ポインタも知らんとどないして管理するつもりやねん。
protected virtual void OnSizeChanged(EventArgs e) { EventHandler handler = base.Events[eventKeySizeChanged] as EventHandler; if (handler != null) { handler(this, e); } } On〜メソッドを追加するたびに似たようなコードを書くのは気持ち悪いので、 この中身をOn〜から汎用的に使える1つのメソッドにまとめられませんか?
まとめりゃいいだろ。 base.Events 使うなら、RaiseEvent メソッドでも作ってそれにイベント識別オブジェクト送れ
772 :
713 :2006/04/09(日) 23:16:14
>>769 コントロールの参照を渡すなんてかっこ悪いと思います
小規模ならいいですけど
複雑になってくるとどうなりますか?
Controller.メソッド(textbox,listview,ファイル名、データ名、何行目?、、、)
これこそ余計に混乱しますし、無駄な処理です
相手にした俺が馬鹿だった 以後スルーします
んじゃインタフェースつかえ
1回1回渡すわけねーだろが
小規模なのでいいから一回IDE使わないでGUIアプリ作ってみれば色々見えてくるよ。 学習目的なんだからそのくらい経験してみないと。
713は俺サマ仕様考える前に、学ぶべきことがあるはずだ。
バカはJavaでもやっとけ
>>772 そういうときはインタフェイスを使うんだよ。
713はC♯を作った人間達って自分より低脳だと思っているんだろうな
いきなり仕様を「バグですか?」とか聞いてくるやつもいるからな 初めて数週間で仕様のバグを見抜いたら天才だよな
案外同一人物だったりなw
713の中の人は.NetFrameworkで定義済みのクラスに 機能追加できるようになるC#3.xまで待てば?:)
言ってることが矛盾してるなあ。 あちこちでいろんなものを管理すると分散するし参照の引き回しがややこしくなるから すべての持ち主であるFormが管理するようになってるんだと思うがなあ。 いやなら別のクラスに分けるけど、分けた以上は必要な参照は渡さざるを得ないし。 ひょっとしてjavaでWebプログラミングしてた人?
785 :
713 :2006/04/10(月) 01:31:59
インターフェースは特殊な例に対してのみ使うものではないと思うんです 似通った振る舞いをそれぞれのクラスがする場合に一貫性を保つ位置付けであると考えてます それにインターフェースを付けたからといって根本的な解決にはなっていないようにも思えます
>>783 おいおい無茶言うな
ちなみに無茶ってのは3.0を待つということじゃなくて解決になってないってことな。
・・・・・・あれかな? 理想を追い求めるばかりに、自分で自分を絞め殺しちゃうような。
>>785 C#が気に入らなければ自分で言語作れば?
789 :
713 :2006/04/10(月) 01:39:36
>>784 その通りです。参照の引き回しをしたくないから、単純に別クラスにすればいいとか
イベントドリブンを包括するクラスを作ればいいとかそういう問題ではないんですよ
例えば警備会社がここの家を監視しているとして、警備会社の社長がすべての家をモニタするでしょうか?
実際は従業員がそれぞれの家を監視するわけです
Formは言わば社長なんです。それぞれのコンロールを保持しているけれども、管理まではさせたくないんです
あるクラスは、ファイルの入出力からTextBoxに表示するまでを管理して
あるクラスは、TextBoxのデータを元にListViewに表示する
あるクラスは、データの入出力だけを管理する
と言った具合に、管理する業務を分担したいんです
これらをすべてメソッドで書くなんて大変です
あと、プログラミングはまったく初めてです。今までしたことがありません
C#が初めてです。
Form が社長と考えてるからそうなるんだろうなぁ
791 :
713 :2006/04/10(月) 01:47:42
正直にいうとむかーし、F-BASIC386とHigh C CompilerとQuick Cはやったことがあります でもその頃は小学生だったのでほとんどまともなことができません ドラクエのみたいに背景がスクロールしてキャラが動く程度です
誰もあなたの身のうち話なんて知りたくない。 いい加減空気読んで回線切ろうね。
C#だと社長は.NETになるんじゃないかなぁとおもたり。 その下にFormという中間管理職がいるのが妥当では?>例えると
794 :
713 :2006/04/10(月) 02:03:29
そうですか では、今日はこの辺にしておきます また、進展ありましたら報告しにやってきます。 ありがとうございました
進展しないと思う
796 :
713 :2006/04/10(月) 02:05:29
>>793 そういう話になれば、OSが社長で中間管理職(中間コンパイラ)がFrameworkなわけで・・
そういう次元の話ではないんですよ。あくまで例えですから。
C#でプログラミングする場合にはOSは殆ど見えんだろ
というか 752 で言ってる当初の目的は住人の総反対という結果で満たされたと思うんだが、 それでもなお自説にこだわるってのはどうなんだか。
つ プライド 聞いてもいない自分のことを語り出した時点でダメだこりゃと思った
800 :
713 :2006/04/10(月) 02:26:37
聞いてはいないですが、何度も以前プログラムしてたのでは? みたいなことを言われるので言ったまでの話です。 普通の会話だと思いますが、プログラマのみなさんには 命令したこと以外のことが起きると困惑されるみたいですね
なんですって!キーッ!
>>713 君の心の中を書いてあげるよ
・自分が絶対
・自分が正しいと思ったことは客観的に見ても正しい
・自分が違うと思ったことは客観的に見ても誤っている
・自分の意見を理解できない人々はおかしい人々だ
・だからどうして私の高尚な意見を理解できないんだクズ共が
こんなとこだろ
少しは他人の意見に耳を傾けて脊髄反射レスするまえに勉強しろや
>>789 > あるクラスは、ファイルの入出力からTextBoxに表示するまでを管理して
> あるクラスは、TextBoxのデータを元にListViewに表示する
カプリングとコヒージョンからやり直せ。責務の持たせ方がめちゃくちゃ。
> あるクラスは、データの入出力だけを管理する
これはまぁいいけど。
GUI つくるときには、同じ処理をコマンドラインからも行えるように考えながら設計してみるといいよ。 それだけで処理を GUI から切り離して考えられる。
713に対する反論には開発業界が時間をかけて培ってきた定石が多く含まれている それに対する713の反論は概念と断片的な例だけで具体性が無く「○○だから△△」という対症療法的な稚拙なものばかり 713は脊髄反射する前に反論に含まれる定石を理解すべきだと思うがな それらの定石が成立するまでには数年に渡る多くの人間の試行錯誤があるわけで、たかが一個人が10日程度試行錯誤したものとは次元が違う
結局Form上に書くのがベストだけど、長くなるからPartial Classを実現させた、 って感じでおk?
長くなるからパーシャルなんていってるやつはいないんじゃねえ? 713以外は。
>>806 「自分の理解を超えるものは全否定」っていう、厨房天才の典型パターンじゃまいか。
それで自己完結して自己解決しているならどうでもいいけど、こうして語られると鬱陶しいね。
何を言っても「自分の理解を超えるもの」だから、厨反論しかしてこないしね。
>>807 pertial は、IDE のデザイナ側が弄るファイルとプログラマ側が弄るファイルを明確に分離するのが一番の目的。
まあ、長くなるから分けるってのは俺自身やったことあるから何ともいえないけど。
partial だよ…… orz だめだ。このキーワード自分で打つ機会が少ないから憶えらんない。・゚・(ノД`)・゚・。
>>811 お前がスレ建てるとPert31になりそうだな
part -> partial か。納得 orz
>>810 ネストクラスで長いの分けて書いたりしてみたけども(Internalに
すればいいんだがもっと厳密にアクセサビリティ追求してみよう
と思って)いまいち使い勝手がよくない。
さらにprojファイルいじってdependentUponなんてしてみたが
結局戻した。
いや、見通しはよくなりはするんだけど。やるまでもないっていうか
>>796 そのたとえなら、Form社長はControl従業員の名簿くらいは持っていて、
いま誰が何の業務でどこに配備されているか把握しておくものだろ。
現場での業務内容は、ビジネスロジックという名の
業務手順書に書いておけばよくて、社長は把握しなくてもいい。
この手順書さえあれば、web新社長が就任してフリーターのsubmit君を
雇ったときにも対応できる。
従業員や職種が増えたらUserControl課長を雇うんだよ。そのとき社長が
把握するのは課長と一部の直属従業員。
Formにビジネスロジックまで書くのはワンマン社長のやることで、
Formにコントロールのイベントハンドラすらないのは放漫経営だ。
概念論しか語らない香具師に概念論を語っても理解してくれない 根本を理解してもらうしかない
曖昧論な例え話禁止
818 :
713 :2006/04/10(月) 16:42:00
初心者にしてはレベルの高い議題を上げてしまって、みなさんを困惑させてしまったようですね あれからいろいろ調べたところ、Form1をインスタンス化するクラスとそのクラスを実行する メインエントリクラスを作ることで分担させることができました つまり、Form1を包括するクラスとそれを包括するクラスを用意したわけで これで作業分担できそうです。とりあえず、これでやっていきたいと思います
もう来なくていいよ
古今まれに見るうざさ。ここまでひどいのもめずらしい。
ぜんぶふぉーむくらすのなかに、かくこんとろーるをけいしょうしたくらすをていぎすればいいとおもいまうす
解決法見る限り、どう見ても質問してたこと解決してないし。 もういいや。少しでも手助けしようとした自分が馬鹿だった。
自称で「ぼくはレベルが高い」という初心者には困る。
824 :
713 :2006/04/10(月) 17:47:11
>>821 もうしてます
>>822 してますよ。包括クラス1はコントロール間の管理、包括2はファイル入出力とデータコレクションクラス間の管理
何度も言ってますが、ビジネスロジックは別に設けています。ここでいう管理はクラスの振る舞いに対する指示だけです
>>818 レベルの低い人間からの常識外れな議題でみんな困惑したんだよ
何言っても理解できないレベルの人に教えるのは本当大変な事なんだよ
>>824 君の脳内結論に非常に興味がある
是非blogかWikiに書いてくれ
ここまで定石ができあがった業界に対して疑問を持ち自分なりの結論を得たというのは興味深い
もしかして定石に一石を投じる結果になるかもしれない
だから今度はオレ達に教えてくれ
827 :
713 :2006/04/10(月) 17:59:21
私が編み出したこのプログラミング手法をHierarchical Management(階層的管理)志向と名づけます 1つ1つのコントロールは多種多様な振る舞いをするわけで、その振る舞いを一括して支持するのが Form1クラスだけというのは負担が大きすぎます。 会社の組織に例えるとForm1は直属の上司と言った所でしょうか その上司にも上司がいるわけで、木の枝のように指示内容も量も広がっていきます それぞれの節目に管理クラスを設けることで、できるだけ分散させようという試みです。 例えば、あるコントロールの動作を変更したいと思った場合、Form1の数多くあるメソッドの中から 変更に関係あるメソッドを探すのは大変です。管理職と現場はグループ化していればこういう問題は起きません。 みなさんも試してみてください。そうすれば私が言っていることがわかるでしょう。
828 :
821 :2006/04/10(月) 18:01:19
>>824 オイ、マヂカヨ
俺の言ってることって
class Form1:form {
MyButton1 button1;
MyButton2 button2;
中略
class MyButton1 :Button {
てきとうなしょり
てきとうなOnイベントメソッド
}
class MyButton2 :Button {
てきとうなしょり
てきとうなOnイベントメソッド
}
}
こんなかんじのことっすよ(´・ω・)
こんなんやってるほうが狭軌の沙汰だと思うんだが
>>827 >>713 既にそうなってくるとスレ違いなので
どっかにまとめてきておくれ。ここに書かないで下さい。
830 :
713 :2006/04/10(月) 18:08:12
>>828 それならそうと最初に言ってください。そういうことはしていません。ダサいです。
今私が議論していることはそんな低次元なことじゃないんですよね・・・。
昔から要領がよくて何でもすぐ出来てしまう私は飽きっぽいんですよ。
私はこの1ヶ月間で実質的なプログラミングはしていません。
C#の概要とオブジェクト志向について学んだだけに過ぎません。
いや、実際のところプログラミングよりそこが重要なんですけどね。
アルゴリズムは多くあれど、プログラミング手法についてはまだまだ
介入できる隙があるようですけどねw
解決したってんだからいいじゃん。 もうお触り禁止
途中から釣りなんだろうけど。 CompositeとかDecoratorあたりだろ。 そもそもIDE自体はMicrosoftが想定してるデザインに基づいて動いているだけで他のデザインが間違ってるわけじゃない。 独自のデザインでやるならGUI配置等の恩恵は諦めろ。
まあここまで来るとネタだろうけども もし本当に何か新しい方法を見つけたと思ってるのなら どっかにサンプルコードをまとめてくれませんか。 私は馬鹿なので827のように日本語で書かれても 実際どんな実装をしているのか分からないのです。
>連動させるのがその二つだけの小規模なものならいんですが >大量にコントロールが増えた時のことを考えてください >そうなるとFormの二の舞です すいません、このへんの話とどう違うのかわかりません・・・。
まあ折角なので根本に戻って考えると 例えば、テキストボックスの脇に「参照」ってボタンつけて ボタン押すとファイル選択ダイアログを開く そしてそのファイル名をテキストボックスに入れる こんな実装を結構使うわけだけど 確かにこの場合、ボタンは該当するテキストボックスとしか関係しないわけで このテキストボックスとボタンを綺麗にまとめてカプセル化し、 かつ、いちいち独自のユーザコントロールを作ったり継承したりしないで、 かつ、現在のIDEのGUIと矛盾しない、楽な方法があるなら 俺も知りたい
836 :
713 :2006/04/10(月) 18:33:11
>>835 私が議論しているのはまさにそれですね。
つまり、Form上でインスタンス化されたオブジェク群は平社員です。
横並びでずらーっと並んでいるわけですよ。それをFormだけが管理するのが
開発効率的にも、そしてクラスを隠蔽するという原因となった人間の誤操作と点でも問題なんですよ。
オブジェクト同士が横と繋がるパイプラインをどう持たせるかが問題なわけです。
ユーザーコントロールというのも手ですが、これは効率がよくありません。
グループ化は動的で柔軟に対応できるようなものでないと意味がありません。
しかし、現在のところIDEが対応していないということなので、Formクラスを包括するクラスをいくつか作り
自制しながらプログラミングするしかないのが現状だということなんです。
>>836 最終的に Control 系は、クラス階層的にも Composite 階層的にも木構造だから。
葉と葉は、直接連絡しあえないんだよね。必ず幹を通らなくては、隣の葉にすら移動できない。
木構造を止めてしまえば直接つなぐことが出来るけど、
管理しにくくなるというデメリットまで許容することが出来るか〜ってのは問題かな。
838 :
713 :2006/04/10(月) 18:53:40
>>837 すいません。ちょっと語弊がありました。
オブジェクト同士の連携は直接というより、管理クラス(幹)がほしいわけなんです
そうでないと、隠蔽どころか完全なブラックボックスですからね
隠蔽と言っても必要な情報はやりとりしたいわけで。
M$のIDEは木の根から多数の葉が生えているような状態なんですよ
これが非常にうざいんですよね。面倒なだけでできなくはないですが
プログラミングを本職にしている人ならわかると思いますが、できるだけじゃダメですよね?
時間を節約できる効率的なプログラミングを目指しますよね?
ある一連の振る舞いを管理するためだけのクラスがあったら便利と思いませんか?
平社員の連携を保つために、わざわざ社長が指導するんでしょうか?
私が言ってるのはそういうことなんです
>>835 つ component (見えない奴)
参照ボタンなるユーザ定義コンポーネントを作って、それのプロパティに
ボタンとテキストボックスを指定できるようにすればいいんじゃない?
>>836 >>837 Panel みたいな見える奴にいれるから階層構造になっちゃうわけで、
単に論理的にまとめ(て機能させ)るだけなら見えないのから参照させて
おけばいい。
840 :
713 :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); } }
>>840 どっちが面倒かっていったら後者じゃね?
実質的な手間は変わらんし
まあ見た目はしらんが
だからそういうのをIDEで簡単にやろうってのが component なんだってば。 Form には形のある Control しか貼れないわけじゃないでそ? Menu と MenuItem の関係のように、「生徒管理」とかいうコンポーネントを それのプロパティ textBox に textBox1 を、comboBox に comboBox1 を、 ListView に ListView1 を指定して、データソースなりアレイのプロパティ なりで student(s) を渡してやればいいんだよ。、
843 :
838 :2006/04/10(月) 19:18:43
>>838 悪い。管理クラスが欲しいにもかかわらず、その管理クラスを作るのを面倒に思っているように見えた。
UserControl 使って管理クラス作ればいいじゃん。
ちげえよバカ。837だ。
>>840 class 管理クラス : UserControl
{
public 管理クラス(Student student)
{
textBox1.Text=student.Name;
comboBox1.Text=student.学校名
listView1.Items.Add(クラス名);
}
}
社長がどうのとか概念論からコードに話を変えたら粗が見えるな つか何年前の議論だこれ?
847 :
713 :2006/04/10(月) 19:39:48
>>845 UserControlは嫌なんですよ。
ファイルダイアログとテキストボックスなど近くに配置して
単純な連動するものならいいですが、
UserControlでは、全体のデザインを変えなくてはダメじゃないですか
デザインにもこだわりたいし、それから、listviewにアクセスするコントロールは別にもあるんです
Aコントロールから、targetコントロールへの連動
Bコントロールから、targetコントロールへの連動
この二つを独立させたいんです。単純に機能がまとまってるなら私もUserControl使ってますよ
それから、話はそれだけじゃないんです。ファイル入出力から表示するまでの一連の動作を管理したいんです
それからcomponentクラスのヘルプが「情報がありません」とかで見れませんでした
ComponentEditorForm クラスのヘルプは見れたので多分同じような機能だとは思いますが
これもユーザーコントロールみたいにコントロールをカプセル化するための機能なんじゃないですか?
> Class Form > { > public View() > { > //管理クラスにstudentを渡すことで > //上記のようにそれぞれのコントロールに表示されます > 管理クラス(student); > } > } 管理クラスの中で何をやってるのか教えてよ。
>>847 UserControl が嫌なら、管理クラス作ればいいじゃん。何を迷ってるのさ。
それから、管理は一元化するべき。listview に直接アクセスするオブジェクトを2個も3個も作るとややこしくなる。
>>835 コンポーネントじゃだめなの?
Formを経由せずに複数の情報を必要な範囲で連携させる方法って正しくコンポーネントだと思うんだけど
フォームはコントロールのホストって構成ならASP.NETなんてもっと顕著だろ
ノンプログラミング(フォームは構造定義に特化)でblog作ったりできるわけだし、Windows Formでもコンポーネント使えばFormのコードに全く触らずコントロール連携中心の開発もできる
「知らないから実装されていない」って思い込んじゃ駄目だよ
>>847 > これもユーザーコントロールみたいにコントロールをカプセル化するための機能なんじゃないですか?
偉そうな口聞くならさ、自分の中でヘルプ見れば分かるレベルの疑問を解決してからにしてよ
プログラム初めて何日だか知らんが、同じレベルで会話したいんならんな逃げ口上使うなや
>>847 >それから、話はそれだけじゃないんです。ファイル入出力から表示するまでの一連の動作を管理したいんです
それまで全部やってくれる管理クラスを、なぜ作ろうとしないのか。
>>713 君のその実装方法で何か作ってよ
外枠ばっかりで具体例が無いからわけわかんない
一つのものを作り上げてそこから見えてくるものもあるだろうし
とりあえず簡単なDB編集ツールでも組み上げて公開してよ
プログラムってのはコントロールだけじゃないんだからデータベースなんかにも対応できるんだよね?
>>847 >これもユーザーコントロールみたいにコントロールをカプセル化するための機能なんじゃないですか?
合ってる。
というより Form 含め GUI は、ユーザからの入出力のみを担当するべきだと思うんだけどな。
それ以外のデータ処理は別の箇所で行うべきじゃないのかなって。
713のプログラムってコントロール操作だけなんかな
856 :
713 :2006/04/10(月) 19:54:04
管理クラス作れば?ってまた話がもどりましたね
過去ログぐらい見てくださいよ。
ユーザーを入力によってイベントが発生して、そして一連の動作が発生するわけなんですよ
そのイベントをどこが拾いますか?Formじゃないですか?
一連の動作するクラスをFormから呼び出す場合、その動作に必要なコントロールポインタを
すべて渡さないとだめじゃないですか
何度もいうように
Form→管理クラス→コントロール
→ファイル入出力
→データ管理
のような構造が理想だと言っているんです。
>>851 ヘルプがないんだから仕方がありません。
>>856 >そのイベントをどこが拾いますか?Formじゃないですか?
Form じゃなくても良いですよ。
>Form→管理クラス→コントロール
> →ファイル入出力
> →データ管理
>
>のような構造が理想だと言っているんです。
だから、その理想に従って管理クラス作ればいいじゃん。
悪いとは言ってない。設計思想は人によって異なるから。
表示のことで言えば、Student クラスにコントロールをバインドする方向で考えるかな。
859 :
713 :2006/04/10(月) 19:58:58
>>854 もちろんそうですよ。ビジネスロジックはそれようのクラスが担当すればいいだけで
私が言ってるのはデータの橋渡しなんですよ。
コントロールがユーザーからのデータを受け取ってそれでおしまいですか?
違いますよね?そのデータをコレクションクラスに追加しなければならないし
そのデータを元にListviewを更新しなくてはならないわけで
そのような操作をすべてFormクラスがやるのが間違っていると言っているんです
一連の動作はそれようの管理クラスがあるべきです。が、
ユーザーコントロールやコンポーネントではただのコントロールの集約でしかありません。
一連の流れのある振る舞いを管理するものではありません。
もう少し理解力のある人いませんか?何度も同じ説明させないでください。
過去ログみて、それでも意見がある人が答えてくださいよ
>>856 「過去ログ嫁」はみんなが君に対して思っている言葉だよ orz
> ヘルプがないんだから仕方がありません。
んな逃げ口上言うなよ
おれは昔からMSDNだけで勉強して開発してるよ
2ちゃんに書き込めるのにMSDNが見れないなんて馬鹿なこと言わないよな
>>856 >のような構造が理想だと言っているんです。
713 の目的が聞きたい。とりあえず下から選んでくれ。
[1] 構造が上手に設計できなくて困っている。アドヴァイスが欲しい。
[2] 理想的な形を見つけた。みんなに布教したい。
862 :
713 :2006/04/10(月) 20:01:36
>>858 つまりデータの中身のある場所の参照を表示コントロールのデータに渡すっていうことですよね?
listviewでデータが削除されれば、参照元のデータも削除されると。それでいい場合もありますよ。
しかし、データを壊されたくない場合はそういう訳には行きません
863 :
854 :2006/04/10(月) 20:01:48
>>859 >コントロールがユーザーからのデータを受け取ってそれでおしまいですか?
おしまいだよ。それ以上は望んでいない。
>>859 君が書いてることはさ、オブジェクト指向とかデザパタとか色々な手法でとっくに議論されてきた話題だよ。
そしてそれに対する実装も、いくつかは君の言う通りに解決されてる。
でも全てが全て君の言う通りじゃない。
そこは何かと言うと、データの扱いに対する責任区分。
君はユーザサイド(主にプレゼンテーション層)からのデータ整流ばかりを気にしてシステム全体でのデータの流れを見ていない。
そこに対してみんなが違和感を感じてツッコミを入れてくるわけ。
じゃあどうすればみんなと対話ができるかというと、君の理論をまとめてドキュメント化して「これでどうですか」とするしかない。
言ってる範囲が無駄に広くてレスの応酬で片付かないし、お互い断片的な部分しか見れないからまともな対話にならない。
だから君の自論を文章化するなりして明示せよ。
それは新たな開発方法論として人がついてくるかも知れないし、よく見れば既存の方法論の劣化版や旧版に過ぎないかもしれない。
君の脳内の全容を知っているのは君しかいないんだから、それをみんなに「わかりやすく・まぎれなく・必要充分に(ISBN4-526-04317-6のキャッチコピーより引用)」表現してくれ
まともな話はそれからだ。
866 :
713 :2006/04/10(月) 20:09:34
>>863 ちょっと次元が違いますね
私はコントロールにデータ処理までさせるなんて言ってませんよ
あなたはテキストボックスに入力された文字をListViewにどうやって表示させる気ですか?
わたしはその部分の話をしているんです
867 :
854 :2006/04/10(月) 20:10:35
>>859 付け加えておく。俺は 713 の設計思想には、大筋で同意しているんだ。
反論しないでくれ。ややこしくなるorz
まぁ大量にレスすると不都合なのスルーされるからとりあえず
>>861 に答えてもらおうぜ
>>868 [3]みんなが知ってることを、さも自分だけは気付いたように勘違いして皆を見下したい。
870 :
854 :2006/04/10(月) 20:14:18
>>866 >あなたはテキストボックスに入力された文字をListViewにどうやって表示させる気ですか?
少なくとも、TextBox -> ListView の連結は Form が担当することじゃないし、知っているべきことでもない。
よく考えて。TextBox から入力されたデータは、ListView に伝わらない可能性は?
ListView には TextBox から入力されたデータ以外のものは表示されないの?
871 :
713 :2006/04/10(月) 20:15:01
>>865 確かにそうですね。抽象的なこと言ってても解決されませんね。
わかりました。ちゃんと私が作成した実データを元に反証して頂く事にしましょう。
なんの為に?
873 :
854 :2006/04/10(月) 20:16:44
というより 713 がステキすぎるw ここまで話せるのが初心者だとは思えないww
それ以後、713を見た者はいない・・・・
よくわからんのだけど「管理クラス」ってのは複数あるんかな? ひとつだと結局Form上で作るのとあんまりかわらんよな
プログラミングなんて知らないユーザーが頭に描いているアプリの構造を そのまま実現したいんじゃないのか? それに開発者が振り回されたらたまらん。
香ばしい・・・実に香ばしい。
ぉぃ、君!
>>713 は何でできているのかね?
713の成分解析結果 : 713の43%は大人の都合で出来ています。 713の31%は鉄の意志で出来ています。 713の14%は時間で出来ています。 713の9%は黒インクで出来ています。 713の2%は勢いで出来ています。 713の1%は血で出来ています。
まともにレスしてる奴は自演じゃないのか? なんにしてもウザ過ぎる
まちがった。こっちだ。 713[sage]の成分解析結果 : 713[sage]の58%は波動で出来ています。 713[sage]の37%はやましさで出来ています。 713[sage]の2%はやらしさで出来ています。 713[sage]の2%は嘘で出来ています。 713[sage]の1%は食塩で出来ています。
>>713 つーか自分でサイトでも立ち上げて
そこに掲示板でもなんでもつくってそこで議論してくれ。
882 :
713 :2006/04/10(月) 20:38:34
>>875 複数あります。そうでなければ分担作業にならないですからね。
たとえば、入力された文字をすべてリストビューに表示するみたいな
閉塞的で単調な労働をさせられるならユーザーコントロールなどで統合しても問題はないでしょう。
しかし、入力された文字が、「ファイルを開く」だったら?「データを参照」だったら?
呼ばれるコントロールも動作も変わってきます。
それをユーザーコントロールだけで管理するんですか?
ファイルを開くだったら、ファイルを開いて、ListViewItems形式に変換してlistviewに表示する
データ参照だったら、格納されているデータを読み出し表示する
こういったことに柔軟に対応させるには、コントロールの統合だけじゃ役不足なんです。
入力された文字から木の枝のように伸び分かれる一連の動作をそれぞれ管理する場合
Formクラスの上のメソッドのような、管理権限が平等でだらだらと書き記したコード群は綺麗だとは言えません
管理クラスとは一連の動作を柔軟に対応するだけでなく、管理権限の優劣をつけるものでもあります
何度も言うように、Formクラスを社長というなら、管理クラスは直属の上司です。
社長いうことは絶対ですが、通常は直属の上司が平社員の動作を監視します。
PublicやPrivateなどのアクセス権だけでなく、管理権限にも優劣をつけるべきだと思います
1つのアプリケーションを複数の人が作成する場合のことを考えてください。
関数的なクラスの分担だけでなく、ある一定の権限をも持つべきだとは思いませんか?
それをFormとコントロールとの関係へと修正させたいわけなんです。
まあ、のちのち、私が作成したソースをみなさんに提出しますから
そのときにご意見あれば言ってください。
>>882 >複数あります。そうでなければ分担作業にならないですからね。
これが間違い。
お前らこの池沼によく付き合ってられルナ。出来れば別スレ立ててそっちでやってくれ。 スレが汚れる8。
>>882 オブジェクト指向勉強したらまたおいで。待ってるから。
それ以後、713を見た者はいない・・・・
>>713 悪いけど別にスレ立ててそっちでやってくれない?
幸いマジレスする人もいるみたいだしさ
・・・自演じゃないよねw
しつも〜ん。RegexOptionsのECMAScriptって、どんな意味があるの?
>>890 ようするに、ECMAScriptの正規表現エンジン互換で動かすってことなんですか?
良スレだったのにな……。
893 :
835 :2006/04/10(月) 22:21:03
>>850 Component使えばできるのか…知らなかったよ
と思ってMSDNとか色々見たけどイマイチつかめないなあ…
もし数行のコードで済むようなら、835に書いた内容をどなたかComponent使って
書いてみていただけませんか。
こういうのはどの板にも居ます。 為替のスレで両建てまんせーなやつはもっと香ばしかった。
デザインパターン以前の質問でもうしわけないんですが、 public sealed class Singleton { private static Singleton instance = new Singleton(); private Singleton() { } public static Singleton Instance { get { return instance; } set { instance = value; } } 2度目以降の参照では、 get 以前を飛ばす理由が判りません >< ご存知の方おねがいします
日本語でおk
get以前てどこ?
シングルトンのインスタンス取得プロパティに set てどうよ。
ほんまや、わろた。
public sealed class Singleton { public static readonly Singleton Instance = new Singleton(); private Singleton() {} } これで十分
895です デバッガでステップしていて気が付いたんですが、 飛ばされた部分があるのでおかしいなと思い質問しました それと、インスタンスの有無をどこで判断したのかも わかりません
>>901 static メンバが何時どんなときに初期化されるのか考えると良いよ。
>>713 そんなことよりオブジェクト指向とかアーキテクチャとかデザインパターンとかアジャイル開発とかテスト駆動とか
その辺に興味を示せ。
そんな質問どうでもよくなるから。
アプリを作る場合、思いつきで作っていると とんでもないミスを犯していたり、あとで修正を加えたくなることがよくあります 結局、作り直したりやる気が無くなってしまったりするので まず、始めにどのようにクラス設計を建てるかを考えなければと思うのですが こういうときに便利なソフトはないでしょうか? フローチャートみたいに大まかな流れを書き出したて、作る時の参考にしたいんですけれども また、ほかに何か良い方法があるなら教えてください
>>905 >こういうときに便利なソフトはないでしょうか?
Visual Studio
VS.NETのリファクタリング機能使って 作り変え時のコストを抑えるようにすればいいと質問の内容を無視してカキコ。 中身空のクラス先に作ってXMLDOCで出力とか。
便利なソフトなど使わなくても思いつきでつくりさえしなければそんなことにはならない。
>>905 最初に適当に書いたソースを眺めて反省しながら設計する。
>>905 >とんでもないミスを犯していたり、あとで修正を加えたくなることがよくあります
>結局、作り直したりやる気が無くなってしまったりするので
最初から完璧なコードなど書けるわけないだろ、
なんでミスを見つけたり修正することに対してネガティブなの?
1.下書きとしてとにかく動くものを作ってから全体を見直して完成度をあげる。
2.机上で完璧な設計をおこなってからプログラムを書き始める。
チーム作業でなければ完成度や開発効率で2の方が優れてるなんてことはない。
個人で作るアプリなら1の方が絶対楽しいし、結果的にいいソフトが作れるはずだ。
>>905 ヒント 次につくるときのこやしとすること
913 :
905 :2006/04/11(火) 18:03:39
絵を描く場合にまず、構図を考えるんですね それをもとに作成していったほうが効率がいいんですが プログラミングは実際に粘土をこねるような? いじりながら徐々に目的のものを作り上げていく そういう感じと捕らえていいんですか? それにしても、フローチャート書くことがそんなにいけないことなのか?
>>913 いや、だからVS2005持ってるんならソリューションエクスプローラあたりで
右クリックしてクラスダイアグラムの作成、とかやってみれ。当然コードとも
同期してくれる。Pro以上の機能?かも知れないが。
ちなみにフローチャートがいけないって誰が言った?そっちはWorkflow Foundation
あたりを調べてみれ
915 :
910 :2006/04/11(火) 21:42:50
>>913 フローチャートを描くのがほんとに好きならフローチャートから入ればいいよ。
要はどのようにしてモチベーションを保つかってことが大事。
プログラミングを始めた頃は何でもかんでも面白いけど知識だけで
ものを作り上げる喜びがなければ数年もしないうちに飽きて嫌になってくる。
それと今はプログラミングツールが便利になって開発効率があがったけど
そのぶんドキュメント化されてないノウハウや落とし穴も大幅に増えている。
プログラミングに上達しようと思ったらデッサン力と同時にツールに対する経験と洞察力が不可欠。
そんなわけで粘土をこねるような作業を避けては通れない。
>>713 のように知識だけでプログラムを解ったつもりになってると
実際に何か作りはじめた段階でくじけてしまいかねない。
916 :
905 :2006/04/11(火) 22:00:56
>>915 どうもためになるお話ありがとうございます
実戦してその結果に対して考察しながら知識と経験を高めていく。
物作りの原点を忘れていました。
ライト兄弟の時代、推力や揚力など飛ぶ原理など知らなくても
空を飛びたいという情熱で作り上げていたことを思い浮かべました
飛ぶことができて初めて、なぜ飛べたのか、より遠くへ飛ぶにはどうすればいいか
まず作ってから、考察をするべきだと言えますね
ちなみにわたしは>713ですw
オブジェクト指向うんぬんを言う前に、構造化設計の技法を確認したほうがよさげ。 それから、きっちりオブジェクト指向のお勉強だな。 「クラスの設計が・・・」なんていうのは十年早いと見た。
918 :
905 :2006/04/11(火) 22:15:25
オブジェクト指向は理解してます 今勉強しているのはGRASPとリファクタリングです
アホが嬉々としてわきそうなレスだな
すごいな。UML も知らずに「オブジェクト指向は理解してます」なんていい切れるのか。
んで
>>713 たんは何を作ろうとしてんの?
後学のために教えて♪
922 :
905 :2006/04/11(火) 23:06:01
本職は3Dグラフィックデザイナーをやっています。 いわゆる、みなさんと同じデジタル土方ですね。 使用しているソフト用の補助的なツールを開発しようと思って プログラミングを勉強してみようと思いました。 ソフト付属のマクロ程度なら組むこともできるんですが、それだけでは物足りなくなったわけです
フローチャート風のダイアグラムは、世間一般では全部まとめてフローチャートといわれたりするからな。 俺の書いたユースケースやアクティビティ、ステートチャートも全部まとめてフローチャートと呼ばれちゃってるよ。
>いわゆる、みなさんと同じデジタル土方ですね。 ななななんですってー!キィーツ!
ワロタw
>オブジェクト指向は理解してます >ソフト付属のマクロ程度なら組むこともできる むむむー
いいから別スレ作れ。713の質問にみんなが答えるスレとか。
713=905だよな?ウザすぎる。あの自己中っぷりは学生だからだと 思っていたんだが、デザイナだったのね。
そのままコンピュータの前で閉じこもっていてほしい
トリップないし中の人って複数人いるのかなあと思ったり。
デジタルひじかた?CG合成か?
932 :
915 :2006/04/12(水) 18:15:48
>>916 >ちなみにわたしは>713ですw
なんかそんな気がしたんだよね。
>>713 って理解力はあるのに惜しいなと思ってたんだが、
別に頭が固いわけじゃなくて思いついたことを率直に言うタイプだったんですね。
優秀なプログラマになれそうな気がする、頑張って下さい。
いいかげんにしてくれ
じゃあ、703=905=932ってことで一件落着!暴れはっちゃく!
まちがえっちった。
ListViewの項目のフォーカスが変更されたときに発生するイベントってある? 項目選択の変更はSelectedIndexChangedでわかるけど、 Ctrlを押しながらカーソルキーを押してフォーカスする項目を変更したときは どのイベントで通知されるんだろう。
C#のオブジェクト指向は一子相伝のようですが 習得は大変ですか?がんばればケンシロウになれますか?
>>936 ないっぽいね。
親フォームで LVN_ITEMCHANGED を捕まえるくらいか。
>>938 レスありがとう。
ラベルの編集は開始と終了別で教えてくれるのに、
より基本的な変更は簡単にいかないのな。
>>713 = 905
なんかオブジェクト指向を理解した気になってるようだが
そんな簡単に理解できるほど浅いモノではない。
ポリモーフィズムとかインヘリタンスとかの意味をちょちょいっと調べて、オブジェクト指向をわかった気になってるとかそんなだろうな。
つーか
>アプリを作る場合、思いつきで作っていると
>とんでもないミスを犯していたり、あとで修正を加えたくなることがよくあります
>結局、作り直したりやる気が無くなってしまったりするので
とか言ってる時点でオブジェクト指向の入り口すら、全くもってわかってない。
あとリファクタリングはテスト駆動開発で用いる手法であって、単体テストありきだから。 君みたいな素人には早いんじゃない?
942 :
703 :2006/04/13(木) 02:28:34
nunitの使い方がよくわからない・・・ぐふぅ〜w
944 :
713 :2006/04/13(木) 02:41:08
713の間違いw やっぱ、地道にプログラミングに慣れていくしかないかな
945 :
713 :2006/04/13(木) 02:47:55
>>940 オブジェクト指向?たくさん本読んだからわかったよ
実践はまだしてないけどね
てか、私のプログラミングのミスとオブジェクト志向への理解との相関関係がわからないのに
なぜそういうことを言えるのか不思議です。超能力者かな?
ただ、ポリモーフィズムって言いたかっただけじゃないんかと・・
ま、知識はついたからあとは実践だね。
今までの経験上、独学をやる場合の教訓は
・知識と経験のバランス
・独断と偏見は捨て先人達を敬う
だな。ま、応援してくれていると受け取っておくよ。
>>943 キミは自分以外が目立つのが気に食わないだけじゃないのかと
誰かココID付にしてくれ。うざす。
>>945 >自分以外が目立つのが気に食わないだけじゃないのかと
あんたは目立ちたいの?だったらただの荒らしだな。
いや・・・そうじゃなくて、みんなが使う掲示板なんだから
自分専用みたいな使い方はどうかと。
どうしてもというのなら新たなスレを作るなり、
自分のHPへ誘導するなりしたらどうですか?
948 :
713 :2006/04/13(木) 03:52:04
>>947 目立ちたいとも言っていないし
自分専用という根拠について教えてくださいな
私の発言に対して返答してたのはあなた達ですよ
私が独り言のように黙々とメモ帳のようにレスしていたのなら
私物化と言ってもいいかもしれませんけどね。
それにスレ違いの内容でもないですからね。
それより、自分専用のスレを立てるように誘導するほうがどうかしてると思います
ちゃんと2chの規約読みましたか?2ch初心者さんですか?
あなたの意見は見当違いです。
あとは
>>947 が一番ウザい存在だという自覚を持ってくれることを祈るのみだな。
>ちなみにわたしは>713ですw この一文は何か意味あったん? 目立ちたい以外に
あぼーんしやすいように。
関西弁を使う約1名が必死に噛み付いてるのはなぜ?
>>948 これから713は713としてかきこんでくれ。おまいが言ってるように。
ほかの人は出来るだけ相手にしないでください。スレ汚されるのが我慢ならん。
いや、ここまでくるとネタだろ とりあえずスルー推奨 &相手する奴も嵐
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; }
原因は例外メッセージに書いてるとおりだが。
foreachの取り出し元の変数に変更加えちゃいけないんだっけか? そのような処理したい場合はいったん配列にキーコピーとかかしら?
つーことでこれでうごいたぽいけど、いい方法かどうかはしらん 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; }
>>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;
961 :
936 :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 は、項目のフォーカスが変更される可能性のある操作を
すべて受け取れって意味だったのかな。
あ、そこから解説必要だった? **N_*** ってメッセージは NotifyMessage って言われるもんで、WM_NOTIFY で親フォームに送られる。 WM_NOTIFY を受け取った場合、LPARAM を NMHDR 構造体にキャストして code メンバでどのメッセージなのか確認する。 // これに関しては unsafe でポインタ使った方が凄い楽。 で、pnmhdr->code == LVN_ITEMCHANGED のときにあれこれする。 ちなみに、WM_NOTIFY は親フォームに流れるけど、 .NET では親フォームはそのコントロール自身にも (WM_REFLECT + WM_NOTIFY) を改めて送信するので、 コントロール自身でも判断可能だ。
713の降臨まだぁ?
964 :
713 :2006/04/14(金) 00:12:53
今APIについて猛勉強中 資料が少ないから大変だけど、おもしろいねこれ てか、選ぶ言語間違えたかな。C++のほうがいいみたい
965 :
704 :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.");
}
GC.Collect() したら GC されるって保障されてんだっけ?
うっわぁ、ほんとに713降臨しやがった^^; 君うざすぎw C++の方がいいって思うんだったらC++に乗り換えなよ そんでもうC#には関わらないで^^ っていうと、今更乗り換えられないとか、途中で投げ出したくないとか、C#をちゃんと覚えてからとか言うんだろうね そんでここのスレにいつまでもまとわりつくと。
968 :
デフォルトの名無しさん :2006/04/14(金) 00:51:49
1回目はファイナライズキューに入り次のGCで破棄される
>>965 いわゆるデストラクタってのはファイナライザのこと。
ファイナライザはオブジェクトが削除されるときに呼び出される。
で、Disposed イベントは Dispose() メソッドが呼ばれたときに発生する。
Dispose() とファイナライザは直接は関係ないよ。
Disposed を発生させたいなら明示的に Dispose() を呼び出さないと。
っていうかぁ、ファイナライズではイベントハンドラなんて呼ばれないと思うんですけどぉ。
972 :
704 :2006/04/14(金) 01:16:18
>>970 じゃあ
>>391 は嘘なのかな?
IDisposeを実装してるオブジェクトはDispose()はプログラムで明示的に呼び出せと?
ちなみにボタンを動的にControls.Add()したままの状態でFormを閉じるとDisposeが呼ばれます。
確かデストラクタは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だと思う。
もしかしたら多少違ってるかもしれんから、一度自分でGCについてちゃんと調べることをお勧めしとくよ。
>>972 なんで嘘になるのさ。
Disposed イベントなんて所詮ただのイベント。オブジェクトの掃除とは何の関係もない。
IDisposable は Dispose() が呼ばれなかったら最終的にファイナライザが Dispose(false) を呼び出す。
Dispose(false) は Disposed を発生させないってだけの話。
>>973 Dispose(false) の場合は Disposed を発生させない。
ファイナライザでは参照型のメンバにアクセスしちゃ駄目だから。
もちろんイベントの実体もデリゲートインスタンスなのでファイナライザではさわれない。
さらに、GC.Collect() は全世代のオブジェクトに対して GC を行うとリファレンスに明記されてる。
>>975 すまん、至る所で勘違いが混じってたな。首吊ってくるorz
977 :
970 :2006/04/14(金) 01:27:38
978 :
704 :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;
>覗いてみると、ちゃんとDispose(false)を呼び出している。 >ちなみにDispose(bool disposing)メソッドの中でイベントもちゃんと呼ぶようになってるぞ。 ここまで見といてなんでその際の条件を見ないw
GC.WaitForPendingFinalizersも呼んでおくと幸せになれそう。 とチラシの裏。
>>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。
>GC.WaitForPendingFinalizersも呼んでおくと幸せになれそう。 なんですと?
MSのコードは適当なタイミングでGC.Collectとか GC.WaitForPendingFinalizersとか呼んでるね
985 :
デフォルトの名無しさん :2006/04/15(土) 01:23:26
968が正解
MenuStripを持つ子ウインドウをそのメニューから this.Close()で閉じるとObjectDisposedExceptionが発生するんですが ただしい娘ウインドウの終了の仕方ってどんなんでしょう?
987 :
986 :2006/04/15(土) 12:42:30
いまテストしてみたんですが、 ToolStripMenuItemの DropDownItemClickedイベントでthis.Close()で閉じると例外、 サブメニューそのもののClickイベントで閉じれば例外が起きません。 こっちでやれってことですかね
微妙に意味が取りづらいが、発生しないよ?
989 :
986 :2006/04/15(土) 13:06:54
えーとですね、 子フォームにMenuStripをくっつけて、最初のアイテムを"ファイル”として、 そのサブアイテムを”閉じる”とします。 ”ファイル”のDropDownItemClickedでthis.Close();を呼ぶと例外、 "閉じる"のClickでthis.Close()なら普通に閉じる。 うちでは100%再現するんですが、(VS2005Express) とりあえず下の方法でお茶を濁しました……
>>989 自分はそういう自分のせいでない(と思いたい)例外が出るときは、めんどくさいのでイレギュラーな手でお茶を濁す。まぁ全体に影響しない範囲でだが。
この場合なら別スレッドにhandleわたしてPostMessageすると思う。
いや、それは当然だろ。 さあサブメニューを表示しようって時にいきなり親が Dispose されるんだから。 なんで DropDownItemClicked で this.Close なんだよ。
>>991 ああ、そういうことですか。
"DropDownした先のItemをClicked"じゃなくて
"DropDownするItemをClicked"って意味だったんですか。
あんまり腑に落ちませんが
ありがとうございました。
うお、1000ギリギリでも埋めに入らねぇ。
つか新スレ立ててくれ新スレ。私は無理だったし。 スレタイの♯は半角だと消えるから全角でな。Shift+3 は別の文字だから「しゃーぷ」を変換するんだ。 ていうかコピーすればいいな。
んじゃ建てるよ?
ksk
乙&梅
Vistaはよせい
1001 :
1001 :
Over 1000 Thread このスレッドは1000を超えました。 もう書けないので、新しいスレッドを立ててくださいです。。。