ふらっとVisual C#,C♯,C#(初心者用) Part105at TECH
ふらっとVisual C#,C♯,C#(初心者用) Part105 - 暇つぶし2ch1:デフォルトの名無しさん
13/06/23 09:41:13.50
「どんなにくだらないC#プログラミングやVisual C#の使い方に関する質問でも誰かが優しくレスをしてくれるスレッド」です。

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

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

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

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

前スレ
ふらっとVisual C#,C♯,C#(初心者用) Part104
スレリンク(tech板)
関連スレ
C#, C♯, C#相談室 Part79
スレリンク(tech板)

コード貼るなら↓使ってください
URLリンク(ideone.com)

2:デフォルトの名無しさん
13/06/23 14:41:51.41
>>1
乙乙

3:デフォルトの名無しさん
13/06/24 20:41:32.83
HttpUtility.UrlEncodeって' 'を'+'に変えないの?
これって結構問題の元だったりする?

4:デフォルトの名無しさん
13/06/25 00:48:44.68
はい?

URLリンク(msdn.microsoft.com)
>UrlEncode メソッドは、各空白文字をプラス記号 (+) に変換します。

5:デフォルトの名無しさん
13/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);  //←ここで指定する方法が分からない

6:デフォルトの名無しさん
13/06/26 08:55:20.66
質問です。

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

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

よろしくお願いします。

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

あと渡すデリゲートは一旦ローカル変数に取り出しておいて
EnumWindows終わった後でGC.KeepAliveしとけ

8:デフォルトの名無しさん
13/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 ) )
 {
  ...
 }
}

ってやるとか。

9:デフォルトの名無しさん
13/06/26 09:26:38.63
>>5
var lst = new List<IntPtr>();

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


じゃあかんのか?
ローカルなデリゲートのメモリ上の位置って移動したっけ?
スコープ抜けるまでは有効なんじゃね?

10:デフォルトの名無しさん
13/06/26 09:29:13.02
>>7
>EnumWindows終わった後でGC.KeepAliveしとけ

終わった後にGC.KeepAliveするの?

11:デフォルトの名無しさん
13/06/26 09:40:31.48
>>7,9
ありがとう!まさかローカル変数にアクセスできる(ただしout変数にはアクセス出来ない)とは・・・C#楽すぎる

12:デフォルトの名無しさん
13/06/26 09:59:56.10
>>9
> ローカルなデリゲートのメモリ上の位置って移動したっけ?
移動どころかファイナライズされうる。
マーシャリングでポインタに変換された後はマネージから参照されないからGC対象になる。
アンマネージ実行中にGCが走るとあぼーん。

>>10
GC.KeepAliveは「このオブジェクトはここまで使用中だから勝手に消すなよ」ってマーク。

13:デフォルトの名無しさん
13/06/26 10:16:54.92
>>8
ありがとうございます
そのままだと自分の状態ではエラーが出たので、
イベントハンドラ内に配列を入れて、

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

配列でグループ分けしつつ・・・というのは想像が付いたのですが、実現する方法を理解してませんでした。
勉強になりました。
ありがとうございました。

14:デフォルトの名無しさん
13/06/26 11:10:19.77
EnumWindowsのような同期型のコールバックの場合は
GC.KeepAliveは不要だな。

15:デフォルトの名無しさん
13/06/26 11:43:41.83
GCが完全バックグラウンド処理になるのはいつですか?
今のままじゃC++に勝てない

16:デフォルトの名無しさん
13/06/26 11:52:13.64
並列(バックグランド)GCで無いほうが
スループットは向上するよ。

17:デフォルトの名無しさん
13/06/26 12:21:00.21
というか、誰が勝とうとしてるの?
お前?

18:デフォルトの名無しさん
13/06/26 12:24:57.55
今は広い部屋があるんだから
ゴミの片付けなんかしないで
作業に集中しなさい。
ゴミで部屋がいっぱいになったら
そのときに初めて片付ければ良いでしょ。

19:デフォルトの名無しさん
13/06/26 12:25:36.30
シープラプラ トモダチ コワクナイヨ

20:デフォルトの名無しさん
13/06/26 12:28:20.10
15の理想どおりに動いたとして
並んでも勝ちはしないだろ
生産性のために払った代償でもあるしな

21:デフォルトの名無しさん
13/06/26 12:32:09.01
並んだら生産性の分で勝ちになる

22:デフォルトの名無しさん
13/06/26 12:36:06.18
代償ってのは両方取れないって意味だ
並ぶなら生産性が疎かになるだろう

23:デフォルトの名無しさん
13/06/26 13:28:05.32
IME が ON のとき、Ctrl+F10(デフォルトではIMEメニュー表示)を、
IMEより先に取得して、imeのメニューを出さずに、プログラム側で取得するようにする方法はありますか?
SystemCmdKeyより先にフックされてしまうようで、うまくとれません。
WindowsMessageでできるのかもしれませんが、いまいちやりかたがわかりません・・。
Windows7 標準のIME です。

24:デフォルトの名無しさん
13/06/26 16:20:03.36
23です。
すいません、書き間違いがありました。
× SystemCmdKey
○ ProcessCmdKey
よろしくお願いします。

25:デフォルトの名無しさん
13/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' と名前空間 'URLリンク(www.w3.org)' が指定された要素は、フィードの形式を許可されていません。

どうすれば読むことができるのでしょうか。よろしくおねがいします

26:デフォルトの名無しさん
13/06/28 19:56:51.72
簡単に言えば

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

ってことです。
RDFが出てくるのはRSS1.0だけど、SyndicationFeedが対応してるのはRSS2.0とAtom1.0だから。
SyndicationFeed使っている限り、世界が滅亡するまで待っても読めないので
他の方法を探しましょう。私は知りません。

27:25
13/06/29 11:35:22.52
>>26
ようやく悩みがとけました。
xmlで処理していくしかなさそうですね
丁寧な解説ありがとうございました。

28:デフォルトの名無しさん
13/06/30 12:14:25.82
HttpWebRequest/HttpWebResponse でファイルをダウンロードする場合、
byte[]をバッファーにしてFileStreamに書き込むわけですが、
今の時代(のPC性能とネットワーク速度)に適切なバッファーサイズってどのくらいなんでしょうか?

29:デフォルトの名無しさん
13/06/30 12:15:17.58
今の時代でもネットワーク速度なんてピンきりなんですから一言では言えないと思いますが

30:デフォルトの名無しさん
13/06/30 12:23:19.03
あとTCPに関しては送受信単位はTCPウィンドウで指定されるので
そこで指定するバッファのサイズと一致しない

31:デフォルトの名無しさん
13/06/30 12:24:42.88
8192がいいよ

32:デフォルトの名無しさん
13/06/30 12:44:38.67
数十KBとっとけよ

33:デフォルトの名無しさん
13/06/30 17:43:52.36
大きいとプログレスバー等に通知する場合ガタガタになるという

34:デフォルトの名無しさん
13/07/02 05:40:45.80
ファイル閉じるときは
CloseするのかDisposeするのか
どちらが正解ですか?

35:デフォルトの名無しさん
13/07/02 06:22:16.15
Streamから派生している場合CloseとDisposeは等価(であるべき)

まあusingを使え

36:デフォルトの名無しさん
13/07/02 08:42:55.51
CloseしてからDispose

37:デフォルトの名無しさん
13/07/02 10:00:41.18
Closeは中でDispose呼ぶだろ

38:デフォルトの名無しさん
13/07/02 10:12:08.71
それはアプリ終了時に~だからDisposeしなくていいだろって言うようなもの

39:デフォルトの名無しさん
13/07/02 10:32:16.09
全然違うし
using使えでFAですし

40:デフォルトの名無しさん
13/07/02 12:50:54.05
意味論的に正しいのはCloseだと思う
Dispose の本来の目的は、自分自身が責任をもつリソースの処分

41:デフォルトの名無しさん
13/07/02 13:17:14.22
Close=DisposeはMSがマニュアルに明記してる上、
usingを使った方法も説明されているから問題ない
ただ意味的にって話なら、usingなしの単独の場合は
Closeを使ったほうがいいだろうな

42:デフォルトの名無しさん
13/07/02 13:24:49.98
精神衛生上はCloseが良いかと

43:デフォルトの名無しさん
13/07/02 13:41:58.23
IDisposable実装してるクラスはとにかくusingって覚えてるけどマズイの?

44:デフォルトの名無しさん
13/07/02 14:05:59.44
寿命が単一メソッド内に収まらないとか間々ある

45:デフォルトの名無しさん
13/07/02 14:06:19.75
オープンした状態のReaderなりWriterをメンバーとして保持してるクラスは、
そのReaderなりWriterをusingで囲むわけにはいかない

46:デフォルトの名無しさん
13/07/02 14:23:17.18
あたりまえだろハゲ
リソース解放の責任がどこにあるかというだけ

47:デフォルトの名無しさん
13/07/02 14:40:01.01
ファイルとかdisposeしないとファイルが使用中になってたような

48:デフォルトの名無しさん
13/07/02 14:50:24.75
あたりまえだろハゲ
ファイルハンドル握ってんだよ

49:デフォルトの名無しさん
13/07/02 14:55:45.10
ハゲてないよ

50:デフォルトの名無しさん
13/07/02 14:59:49.51
ステータスを外部に依存するメンバ変数ってどうなのよ

51:デフォルトの名無しさん
13/07/02 16:59:17.67
なにいってんだハゲ
そういうリソースをメンバに持ってるクラスこそIDisposableを実装すんだろが

52:デフォルトの名無しさん
13/07/02 18:18:49.50
エクセル操作に関して

double型からRange型への変換方法を知っている方がいたら教えてください

53:デフォルトの名無しさん
13/07/02 18:25:45.18
それは変換するもんじゃなくて設定するもんだと思うが
やりたいことは具体的に

54:デフォルトの名無しさん
13/07/02 18:40:36.62
エクセルの値を読み込み
ある関数で計算する
その計算結果をエクセルに出力させる
というプログラムです。

設定するものなのですか。
調べます、ありがとうございます。

55:デフォルトの名無しさん
13/07/02 19:50:39.01
ICカードを扱う無料の.NETライブラリありますか?

56:デフォルトの名無しさん
13/07/02 20:08:06.77
>>54
少しも具体的ではないよ

57:デフォルトの名無しさん
13/07/02 21:16:18.86
>>56
具体的でなくてすみません
ユーザー設定の仕方がいまいちわからず
別の方法を探していました

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

ありがとうございます

58:デフォルトの名無しさん
13/07/02 21:21:05.99
ユーザー設定というキーワードが出てきたけど…

59:デフォルトの名無しさん
13/07/02 21:27:15.76
設定で数値の型を無理やり変えることができる
と思ったのですができませんでした

60:デフォルトの名無しさん
13/07/02 22:37:35.30
VBAの方が早そうな気が

61:デフォルトの名無しさん
13/07/02 23:19:40.39
VBAが良かったのですがC#で作れとの命令だったのでした
あしからずorz

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

プログラムは完成して納期に間に合わせることができます
アドバイスくれた方々に感謝です

62:デフォルトの名無しさん
13/07/03 02:22:08.18
どんなグラフ書いてるか知らんが、EXCELだけで完結する気がするが
わざわざC#で作ってぼったくりか


最新レス表示
レスジャンプ
類似スレ一覧
スレッドの検索
話題のニュース
おまかせリスト
オプション
しおりを挟む
スレッドに書込
スレッドの一覧
暇つぶし2ch