トップページ⇒tech
1001コメント280KB

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

■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん2013/06/23(日) 09:41:13.50
「どんなにくだらないC#プログラミングやVisual C#の使い方に関する質問でも誰かが優しくレスをしてくれるスレッド」です。

他のスレッドでは書き込めないような低レベルな質問。
質問者自身なんだか意味がよく分からない質問。
ググろうにもキーワードが分からないなど、勇気をもって書き込んでください。

内容に応じて、他スレ・他板へ行くことを勧められることがあります、ご了承下さい。

なお、テンプレ2行目が読めない回答者は邪魔なので後述のC#相談室に移動して下さい。

>>980を踏んだ人は新スレを建てて下さい。
>>980が無理な場合、話し合って新スレを建てる人を決めて下さい。

前スレ
ふらっとVisual C#,C♯,C#(初心者用) Part104
http://toro.2ch.net/test/read.cgi/tech/1366503422/
関連スレ
C#, C♯, C#相談室 Part79
http://toro.2ch.net/test/read.cgi/tech/1363632378/

コード貼るなら↓使ってください
http://ideone.com/
0002デフォルトの名無しさん2013/06/23(日) 14:41:51.41
>>1
乙乙
0003デフォルトの名無しさん2013/06/24(月) 20:41:32.83
HttpUtility.UrlEncodeって' 'を'+'に変えないの?
これって結構問題の元だったりする?
0004デフォルトの名無しさん2013/06/25(火) 00:48:44.68
はい?

http://msdn.microsoft.com/ja-jp/library/4fkewx0t.aspx
>UrlEncode メソッドは、各空白文字をプラス記号 (+) に変換します。
0005デフォルトの名無しさん2013/06/26(水) 08:42:53.74
どうやればアドレスを渡してキャストすることができるか分かりません。教えてもらえませんか?

private delegate int EnumWindowsDelegate(IntPtr hWnd, int lParam);
[System.Runtime.InteropServices.DllImport("user32.dll")]
private static extern int EnumWindows(EnumWindowsDelegate lpEnumFunc, int lParam);
----

IntPtr[] ahWnd = new ahWnd[0];  //←これをコールバックに渡したい

EnumWindows(new EnumWindowsDelegate(delegate(IntPtr hWnd, int lParam)
{
 IntPtr[] ahWndTmp = (IntPtr[])lParam;   //←ここで指定する方法が分からない

 //配列に追加
 Array.Resize(ref ahWndTmp, ahWndTmp.Length + 1);
 ahWndTmp[ahWndTmp.Length - 1] = hWnd;
 }
 return 1;
}), (int) ahWnd);  //←ここで指定する方法が分からない
0006デフォルトの名無しさん2013/06/26(水) 08:55:20.66
質問です。

http://ameblo.jp/vcplusplusnote/entry-10205262635.html
こういう事をやりたいのですが、これだと上層のmenu内全部が対象になります。
これを同一menu内のセパレーターで区切ったブロック毎に行うスマートな方法ありますか?

現在は上記の方法でなく、if文でmenuの数だけ処理する野暮ったい事になってます。

よろしくお願いします。
0007デフォルトの名無しさん2013/06/26(水) 09:00:21.89
EnumWindowsの第2引数はポインタ型だ
ていうか別にわざわざlParam経由させんでも
適当にフィールドなりローカル変数なりにList<IntPtr>置いといてそれにAddしていけばいいだろ

あと渡すデリゲートは一旦ローカル変数に取り出しておいて
EnumWindows終わった後でGC.KeepAliveしとけ
0008デフォルトの名無しさん2013/06/26(水) 09:12:04.75
>>6
var group1 = new ToolStripMenuItem[]{ item11, item12,.. };
var group2 = new ToolStripMenuItem[]{ item21, item22,.. };
...

みたいに配列を持っといて

private void dropDown_ItemClicked( object sender, ToolStripItemClickedEventArgs e )
{
 if( group1.Contains( e.ClickedItem ) )
 {
  ...
 }
 else if( group2.Contains( e.ClickedItem ) )
 {
  ...
 }
}

ってやるとか。
0009デフォルトの名無しさん2013/06/26(水) 09:26:38.63
>>5
var lst = new List<IntPtr>();

EnumWindows( ( hwnd, lParam ) =>
{
 lst.Add( hwnd );
 return 1;
}, IntPtr.Zero );


じゃあかんのか?
ローカルなデリゲートのメモリ上の位置って移動したっけ?
スコープ抜けるまでは有効なんじゃね?
0010デフォルトの名無しさん2013/06/26(水) 09:29:13.02
>>7
>EnumWindows終わった後でGC.KeepAliveしとけ

終わった後にGC.KeepAliveするの?
0011デフォルトの名無しさん2013/06/26(水) 09:40:31.48
>>7,9
ありがとう!まさかローカル変数にアクセスできる(ただしout変数にはアクセス出来ない)とは・・・C#楽すぎる
0012デフォルトの名無しさん2013/06/26(水) 09:59:56.10
>>9
> ローカルなデリゲートのメモリ上の位置って移動したっけ?
移動どころかファイナライズされうる。
マーシャリングでポインタに変換された後はマネージから参照されないからGC対象になる。
アンマネージ実行中にGCが走るとあぼーん。

>>10
GC.KeepAliveは「このオブジェクトはここまで使用中だから勝手に消すなよ」ってマーク。
0013デフォルトの名無しさん2013/06/26(水) 10:16:54.92
>>8
ありがとうございます
そのままだと自分の状態ではエラーが出たので、
イベントハンドラ内に配列を入れて、

private void dropDown_ItemClicked(object sender, EventArgs e)
{
 if( group1.Contains(sender))
 {
  ...
 }
 if( group2.Contains(sender))
 {
  ...
 }
}
としたところ、正常に使えました
まだ何もわかってないので、なんでエラーが出たのか分からないですが、自分の変更が間違ってないならこれで行きつつ、エラーの原因しらべて勉強します。

配列でグループ分けしつつ・・・というのは想像が付いたのですが、実現する方法を理解してませんでした。
勉強になりました。
ありがとうございました。
0014デフォルトの名無しさん2013/06/26(水) 11:10:19.77
EnumWindowsのような同期型のコールバックの場合は
GC.KeepAliveは不要だな。
0015デフォルトの名無しさん2013/06/26(水) 11:43:41.83
GCが完全バックグラウンド処理になるのはいつですか?
今のままじゃC++に勝てない
0016デフォルトの名無しさん2013/06/26(水) 11:52:13.64
並列(バックグランド)GCで無いほうが
スループットは向上するよ。
0017デフォルトの名無しさん2013/06/26(水) 12:21:00.21
というか、誰が勝とうとしてるの?
お前?
0018デフォルトの名無しさん2013/06/26(水) 12:24:57.55
今は広い部屋があるんだから
ゴミの片付けなんかしないで
作業に集中しなさい。
ゴミで部屋がいっぱいになったら
そのときに初めて片付ければ良いでしょ。
0019デフォルトの名無しさん2013/06/26(水) 12:25:36.30
シープラプラ トモダチ コワクナイヨ
0020デフォルトの名無しさん2013/06/26(水) 12:28:20.10
15の理想どおりに動いたとして
並んでも勝ちはしないだろ
生産性のために払った代償でもあるしな
0021デフォルトの名無しさん2013/06/26(水) 12:32:09.01
並んだら生産性の分で勝ちになる
0022デフォルトの名無しさん2013/06/26(水) 12:36:06.18
代償ってのは両方取れないって意味だ
並ぶなら生産性が疎かになるだろう
0023デフォルトの名無しさん2013/06/26(水) 13:28:05.32
IME が ON のとき、Ctrl+F10(デフォルトではIMEメニュー表示)を、
IMEより先に取得して、imeのメニューを出さずに、プログラム側で取得するようにする方法はありますか?
SystemCmdKeyより先にフックされてしまうようで、うまくとれません。
WindowsMessageでできるのかもしれませんが、いまいちやりかたがわかりません・・。
Windows7 標準のIME です。
0024デフォルトの名無しさん2013/06/26(水) 16:20:03.36
23です。
すいません、書き間違いがありました。
× SystemCmdKey
○ ProcessCmdKey
よろしくお願いします。
0025デフォルトの名無しさん2013/06/27(木) 04:51:23.99
System.Xml.XmlReaderを使ってRSSを読もうとしたのですが、System.ServiceModel.Syndication.SyndicationFeedでエラーが出ます

using (System.Xml.XmlReader xdr =
System.Xml.XmlReader.Create("RSSのURL"))
{
System.ServiceModel.Syndication.SyndicationFeed feed =
System.ServiceModel.Syndication.SyndicationFeed.Load(xdr);
}

System.Xml.XmlException はハンドルされませんでした。
Message=名前 'RDF' と名前空間 'http://www.w3.org/1999/02/22-rdf-syntax-ns#' が指定された要素は、フィードの形式を許可されていません。

どうすれば読むことができるのでしょうか。よろしくおねがいします
0026デフォルトの名無しさん2013/06/28(金) 19:56:51.72
簡単に言えば

「RSSの規格が古くて読めねえよ」

ってことです。
RDFが出てくるのはRSS1.0だけど、SyndicationFeedが対応してるのはRSS2.0とAtom1.0だから。
SyndicationFeed使っている限り、世界が滅亡するまで待っても読めないので
他の方法を探しましょう。私は知りません。
0027252013/06/29(土) 11:35:22.52
>>26
ようやく悩みがとけました。
xmlで処理していくしかなさそうですね
丁寧な解説ありがとうございました。
0028デフォルトの名無しさん2013/06/30(日) 12:14:25.82
HttpWebRequest/HttpWebResponse でファイルをダウンロードする場合、
byte[]をバッファーにしてFileStreamに書き込むわけですが、
今の時代(のPC性能とネットワーク速度)に適切なバッファーサイズってどのくらいなんでしょうか?
0029デフォルトの名無しさん2013/06/30(日) 12:15:17.58
今の時代でもネットワーク速度なんてピンきりなんですから一言では言えないと思いますが
0030デフォルトの名無しさん2013/06/30(日) 12:23:19.03
あとTCPに関しては送受信単位はTCPウィンドウで指定されるので
そこで指定するバッファのサイズと一致しない
0031デフォルトの名無しさん2013/06/30(日) 12:24:42.88
8192がいいよ
0032デフォルトの名無しさん2013/06/30(日) 12:44:38.67
数十KBとっとけよ
0033デフォルトの名無しさん2013/06/30(日) 17:43:52.36
大きいとプログレスバー等に通知する場合ガタガタになるという
0034デフォルトの名無しさん2013/07/02(火) NY:AN:NY.AN
ファイル閉じるときは
CloseするのかDisposeするのか
どちらが正解ですか?
0035デフォルトの名無しさん2013/07/02(火) NY:AN:NY.AN
Streamから派生している場合CloseとDisposeは等価(であるべき)

まあusingを使え
0036デフォルトの名無しさん2013/07/02(火) NY:AN:NY.AN
CloseしてからDispose
0037デフォルトの名無しさん2013/07/02(火) NY:AN:NY.AN
Closeは中でDispose呼ぶだろ
0038デフォルトの名無しさん2013/07/02(火) NY:AN:NY.AN
それはアプリ終了時に〜だからDisposeしなくていいだろって言うようなもの
0039デフォルトの名無しさん2013/07/02(火) NY:AN:NY.AN
全然違うし
using使えでFAですし
0040デフォルトの名無しさん2013/07/02(火) NY:AN:NY.AN
意味論的に正しいのはCloseだと思う
Dispose の本来の目的は、自分自身が責任をもつリソースの処分
0041デフォルトの名無しさん2013/07/02(火) NY:AN:NY.AN
Close=DisposeはMSがマニュアルに明記してる上、
usingを使った方法も説明されているから問題ない
ただ意味的にって話なら、usingなしの単独の場合は
Closeを使ったほうがいいだろうな
0042デフォルトの名無しさん2013/07/02(火) NY:AN:NY.AN
精神衛生上はCloseが良いかと
0043デフォルトの名無しさん2013/07/02(火) NY:AN:NY.AN
IDisposable実装してるクラスはとにかくusingって覚えてるけどマズイの?
0044デフォルトの名無しさん2013/07/02(火) NY:AN:NY.AN
寿命が単一メソッド内に収まらないとか間々ある
0045デフォルトの名無しさん2013/07/02(火) NY:AN:NY.AN
オープンした状態のReaderなりWriterをメンバーとして保持してるクラスは、
そのReaderなりWriterをusingで囲むわけにはいかない
0046デフォルトの名無しさん2013/07/02(火) NY:AN:NY.AN
あたりまえだろハゲ
リソース解放の責任がどこにあるかというだけ
0047デフォルトの名無しさん2013/07/02(火) NY:AN:NY.AN
ファイルとかdisposeしないとファイルが使用中になってたような
0048デフォルトの名無しさん2013/07/02(火) NY:AN:NY.AN
あたりまえだろハゲ
ファイルハンドル握ってんだよ
0049デフォルトの名無しさん2013/07/02(火) NY:AN:NY.AN
ハゲてないよ
0050デフォルトの名無しさん2013/07/02(火) NY:AN:NY.AN
ステータスを外部に依存するメンバ変数ってどうなのよ
0051デフォルトの名無しさん2013/07/02(火) NY:AN:NY.AN
なにいってんだハゲ
そういうリソースをメンバに持ってるクラスこそIDisposableを実装すんだろが
0052デフォルトの名無しさん2013/07/02(火) NY:AN:NY.AN
エクセル操作に関して

double型からRange型への変換方法を知っている方がいたら教えてください
0053デフォルトの名無しさん2013/07/02(火) NY:AN:NY.AN
それは変換するもんじゃなくて設定するもんだと思うが
やりたいことは具体的に
0054デフォルトの名無しさん2013/07/02(火) NY:AN:NY.AN
エクセルの値を読み込み
ある関数で計算する
その計算結果をエクセルに出力させる
というプログラムです。

設定するものなのですか。
調べます、ありがとうございます。
0055デフォルトの名無しさん2013/07/02(火) NY:AN:NY.AN
ICカードを扱う無料の.NETライブラリありますか?
0056デフォルトの名無しさん2013/07/02(火) NY:AN:NY.AN
>>54
少しも具体的ではないよ
0057デフォルトの名無しさん2013/07/02(火) NY:AN:NY.AN
>>56
具体的でなくてすみません
ユーザー設定の仕方がいまいちわからず
別の方法を探していました

CSVで出力すれば良いとわかったので
解決しました

ありがとうございます
0058デフォルトの名無しさん2013/07/02(火) NY:AN:NY.AN
ユーザー設定というキーワードが出てきたけど…
0059デフォルトの名無しさん2013/07/02(火) NY:AN:NY.AN
設定で数値の型を無理やり変えることができる
と思ったのですができませんでした
0060デフォルトの名無しさん2013/07/02(火) NY:AN:NY.AN
VBAの方が早そうな気が
0061デフォルトの名無しさん2013/07/02(火) NY:AN:NY.AN
VBAが良かったのですがC#で作れとの命令だったのでした
あしからずorz

エクセルデータを読み込んで、double型の関数で計算
その計算結果をCSVに出力後、gnuplotでグラフ描いて終わり

プログラムは完成して納期に間に合わせることができます
アドバイスくれた方々に感謝です
0062デフォルトの名無しさん2013/07/03(水) NY:AN:NY.AN
どんなグラフ書いてるか知らんが、EXCELだけで完結する気がするが
わざわざC#で作ってぼったくりか
0063デフォルトの名無しさん2013/07/03(水) NY:AN:NY.AN
なんちゃら理論で3Dのグラフを描くらしいです
頼まれたのはコンソール版でのファイル入出力部分
最終的にはwindowsアプリケーションにしたいと言われています
0064デフォルトの名無しさん2013/07/03(水) NY:AN:NY.AN
話ずれるけどofficeもVBAじゃなくてC#で書けるようにならんかねー
0065デフォルトの名無しさん2013/07/03(水) NY:AN:NY.AN
Cでしかやったことないけど、間接的にC#でも書けると思う
コントロール作って、フォームに貼り付ける形にしたりVBAから呼び出したり、
officeのコントロールを叩いてWindowsフォームアプリからoffice呼び出す形にする
グラフの描画だけしたいならchartコントロールで。ただこのコントロールは非常に使いにくいw
0066デフォルトの名無しさん2013/07/03(水) NY:AN:NY.AN
そして次にお前は Excel が入っていないPCで動かないじゃないか!! と言う
0067デフォルトの名無しさん2013/07/03(水) NY:AN:NY.AN
VBA使わずにC#アプリでOfficeを制御する派
今のVBAってまだVB6なん?
0068デフォルトの名無しさん2013/07/04(木) NY:AN:NY.AN
>>62-63
むしろそれエクセル要らねえな
0069デフォルトの名無しさん2013/07/04(木) NY:AN:NY.AN
>>68
同意
0070デフォルトの名無しさん2013/07/04(木) NY:AN:NY.AN
Form閉じた後に、別スレッド上からInvokeメソッドで呼び出すとObjectDisposedExceptionが投げられます
WebBrowserクラスを派生して非同期でデータをダウンロードするようにしているのですが、どのように対処すればいいですか?
0071デフォルトの名無しさん2013/07/04(木) NY:AN:NY.AN
>>70
根本的に設計が汚い。
この際だから依存関係逆転ぐらい覚えよう。
要するにイベントを使う
0072デフォルトの名無しさん2013/07/04(木) NY:AN:NY.AN
行番号を表示させようとしてます

int lineSpacingPixel = (int)Math.Round(font.GetHeight(g),0);
for (int i = 1; i <= lastLine + 1; i++)
{
g.DrawLine(p,
new Point(myPictureBox.Width - 5, (int)(lineSpacingPixel * (i + 1))),
new Point(myPictureBox.Width, (int)(lineSpacingPixel * (i + 1)))
);
}

これをフォントと重ね合わせると基本的にはうまくいくんですが、
フォントによっては改行するごとにズレが生じる事があります

行間を取得する方法として何かまずいんでしょうか
0073デフォルトの名無しさん2013/07/04(木) NY:AN:NY.AN
>>70
Invokeする前にIsHandleCreatedやIsDisposedプロパティでハンドルが生きてるか確かめる
0074デフォルトの名無しさん2013/07/04(木) NY:AN:NY.AN
で、確かめた後InvokeするまでにFormが閉じられて死ぬ未来が見えました
0075デフォルトの名無しさん2013/07/04(木) NY:AN:NY.AN
try
catch
で握り潰せばいいと思う
0076デフォルトの名無しさん2013/07/04(木) NY:AN:NY.AN
根本的に作りが腐ってると思う
0077デフォルトの名無しさん2013/07/04(木) NY:AN:NY.AN
というか、Invokeでやりたい処理ってなんだよ
握りつぶしていい処理ならそもそもやらんでいいかも知れんぞ
0078デフォルトの名無しさん2013/07/04(木) NY:AN:NY.AN
根本厨つてどこにでもいるなw
007970 忍法帖【Lv=2,xxxP】(3+0:5) 2013/07/04(木) NY:AN:NY.AN
ありがとうございます、間違ってるかもしれませんが、
WebBrowserクラスのDisposedイベントでスレッドが動いてたらAbortすれば動くようになりました

>>77
外部クラスのログをFormのテキストボックスに表示させたかったんです
0080デフォルトの名無しさん2013/07/04(木) NY:AN:NY.AN
よかった、これで解決ですね
0081デフォルトの名無しさん2013/07/05(金) NY:AN:NY.AN
へえC#でExcel扱えるのか
0082デフォルトの名無しさん2013/07/05(金) NY:AN:NY.AN
Windows上ならExcel扱えない言語のほうが珍しい
0083デフォルトの名無しさん2013/07/05(金) NY:AN:NY.AN
人類の夢だからな
0084デフォルトの名無しさん2013/07/05(金) NY:AN:NY.AN
Appication.Exitを呼ぶと
次の項目のどれが、どの順で実行されますか?

A Exitを呼んだスレッドで作られたControlとHandleの破棄
B ほかのスレッドで作られたControlとHandleの破棄
C Exitを読んだスレッドのApplication.Runから抜ける
D ほかのスレッドのApplication.Runから抜ける

>>70ではないのですが、BeginInvokeするためだけに作った
Controlが、終了処理中、HandleDestroyedが呼ばれることなく
いつの間にか死んでます。
0085デフォルトの名無しさん2013/07/05(金) NY:AN:NY.AN
不定
0086デフォルトの名無しさん2013/07/05(金) NY:AN:NY.AN
とりあえず、Application.Exitというのは、ほかのスレッドの
ハンドル破棄やApplication.Run終了もやってくれるという
認識でいいですか?
0087デフォルトの名無しさん2013/07/05(金) NY:AN:NY.AN
ハンドルの破棄はExitが直接やってるわけじゃないだろ
0088デフォルトの名無しさん2013/07/05(金) NY:AN:NY.AN
ts
0089デフォルトの名無しさん2013/07/05(金) NY:AN:NY.AN
C#でKinect for Windows SDKを利用してプログラム開発を進めようと思うのですが
Kinect独自の画面認証や体のジョイント認証と混同して

単純な四角形の描画やdelay関数を用いることは出きるのでしょうか??
0090デフォルトの名無しさん2013/07/05(金) NY:AN:NY.AN
>>81-82
> Windows上ならExcel扱えない言語のほうが珍しい

そう、C からでも使える。
0091デフォルトの名無しさん2013/07/05(金) NY:AN:NY.AN
>>86
マルチGUIスレッド自体がグレーだよ
不定の意味分かる?
0092 忍法帖【Lv=2,xxxP】(1+0:5) 2013/07/05(金) NY:AN:NY.AN
WebBrowserを派生して自前のメソッドでDocumentTextにソースを流し込んでいるんですが、
リンクをクリックした場合も、自前のメソッドでDocumentTextにソースを流し込むようにしたいのですが、
クリックされたリンクを取得して自前のメソッドに投げることはできたのですが、
webBrowser自体の?でリンクをクリックしたときに自動でページ移動するみたいです
Navigatingイベントを見てみましたが、これをどこで潰せばいいのかわかりません
どうにかヒントだけでもください。お願いします
0093デフォルトの名無しさん2013/07/05(金) NY:AN:NY.AN
WebBrowserユーザー=糞の図式が成り立ちつつある
0094デフォルトの名無しさん2013/07/05(金) NY:AN:NY.AN
OnBeforeNavigateのことか?
0095デフォルトの名無しさん2013/07/05(金) NY:AN:NY.AN
BeforeNavigate2とかなかったっけ
あればそれでキャンセルできる
なけりゃWebBrowserじゃなくてSHDocVwかなんかから引っ張ってきたらいい
0096デフォルトの名無しさん2013/07/07(日) NY:AN:NY.AN
ノベルゲー的なものを作ろうとしています
そこで画像の表示なのですが、どのように表示させるのがセオリーというか、ベターなのでしょうか?

今はpictureboxを複数重ねて同じ位置に配置し、透過して表示させています(背景、キャラなど)
しかし、これだと後々キャラが動くモーションなどを組む時に困る気がしてきまして・・・
0097デフォルトの名無しさん2013/07/07(日) NY:AN:NY.AN
Paintイベントで全部描く
0098デフォルトの名無しさん2013/07/07(日) NY:AN:NY.AN
ノベルゲーをつくるんじゃないんです
ノベルゲー的なナニカを作りたいんです
0099デフォルトの名無しさん2013/07/07(日) NY:AN:NY.AN
「モーション」はどういうデータ形式(ファイル)で持ってくるつもり?それにあわせればいいだろ
とりあえず静止画のみで作ったら?
0100デフォルトの名無しさん2013/07/07(日) NY:AN:NY.AN
WPFのほうが良さそう(てきとう)
0101デフォルトの名無しさん2013/07/07(日) NY:AN:NY.AN
HTML CSS javascriptだな
■ このスレッドは過去ログ倉庫に格納されています