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

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

■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん2010/12/16(木) 18:23:33
このスレッドは
「どんなにくだらないC#プログラミングに関する発言でも誰かが優しくレスをしてくれるスレッド」です。
ほかのスレッドでは恐ろしくて書き込めないような低レベル、もしくは質問者自身なんだか意味がよく分からない質問、
ググろうにもキーワードが分からない場合など、勇気をもって書き込んでください。
内容に応じて、他スレ・他板へ行くことを勧められる、あるいは誘導される場合がありますがご了承下さい。

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

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

■前スレ
ふらっとC#,C♯,C#(初心者用) Part66
http://hibari.2ch.net/test/read.cgi/tech/1290854247/

■関連スレ
C#, C♯, C#相談室 Part63
http://hibari.2ch.net/test/read.cgi/tech/1289733048/
VB.NET質問スレ(Part35)
http://hibari.2ch.net/test/read.cgi/tech/1284423653/
くだすれC++/CLI(初心者用)part2
http://pc12.2ch.net/test/read.cgi/tech/1268613679/

■備考
コードの量が多い場合は下記サイトを使うなどしたほうがいいかも
http://ideone.com/
コードを貼り付けてRun codeのチェックをはずしてsubmitボタンを押すと
コードを鯖側にアップして専用のアドレスが発行されます。

直接貼る場合は下記サイトなどを利用してhtmlエンコードした方が
インデントも残って見やすいです
http://kawama.jp/php/encode_html.php
0153デフォルトの名無しさん2010/12/21(火) 02:19:08
>>151
.NetのDLLなら参照設定に追加すれば使える。
開発時に手に入らないものであれば、
実行時にロードしてクラスやメソッドを呼ぶ。
0154デフォルトの名無しさん2010/12/21(火) 02:19:08
>>149
hoge(int n) で hoge(10+5); って書いたら n=10+5 じゃん。
hoge(Func<int,int> f) で hoge(a=>a*a); って書いたら f=a=>a*a だべさ。
0155デフォルトの名無しさん2010/12/21(火) 03:48:29
>>151
本体でインターフェース定義しといて
それを実装したプラグインを作ってもらえばいい

このへんが参考になるんじゃないかな
http://dobon.net/vb/dotnet/programing/plugin.html
0156デフォルトの名無しさん2010/12/21(火) 05:17:04
>>149
型推論の結果、自動で適切な型に入れてくれる。
0157デフォルトの名無しさん2010/12/21(火) 11:22:34
コードから参照設定を追加するにはどう書けば良いでしょうか

WMP.Libを参照設定
フォームを作成し、そのなかにWMPコントロールを配置します
0158デフォルトの名無しさん2010/12/21(火) 11:41:18
>>155
なるほど、インターフェースですか
C++のhファイルがインターフェースにあたるのかな?
あるソフトのプラグインsdkを見ても
hファイルが入っているだけなんです
C++はよくわからないですが、コードを見た感じインターフェースっぽいですね
足がかりが出来ました。ありがとう。
0159デフォルトの名無しさん2010/12/21(火) 11:43:18
LoadLibrary API
0160デフォルトの名無しさん2010/12/21(火) 12:47:21
今から作るならMEF(Managed Extensibility Framework)を使うのがいいよ
プラグイン側も本体の方もアホみたいに簡単
0161デフォルトの名無しさん2010/12/21(火) 13:06:41
どうもありがとうございます
C#製のプラグイン対応アプリてないですよね
C++の得意分野なのかなと思っていました
01621232010/12/21(火) 13:36:33
>>150
その方法でも実現できました。ありがとうございます。
0163デフォルトの名無しさん2010/12/21(火) 13:51:33
>>161
VS2010
だいたいC#で書かれててプラグインにはMEF使ってる
0164デフォルトの名無しさん2010/12/21(火) 18:01:07
(´・ω・`)…
0165デフォルトの名無しさん2010/12/21(火) 18:50:10
ω・`)…
0166デフォルトの名無しさん2010/12/21(火) 18:56:14
・`)…
0167デフォルトの名無しさん2010/12/21(火) 20:06:44
ContextMenu(ContextMenuStripではありません)を使って「'〜' を検索」のようなメニューを作っています。
〜の文字列の長さによってメニューの幅が広がりますが、〜の文字列が短くなってもメニューの幅が
広がったままになってしまい、
│ '〜〜' を検索  (無駄なスペース)  │
のように右に無駄なスペースができてしまいます。
このスペースを消したいのですがどうしたらよいでしょうか?
ちなみにオーナードローはしていません。また、他のメニュー項目のTextはこの項目のTextより短いです。
0168デフォルトの名無しさん2010/12/21(火) 20:14:38
Width="Auto"
0169デフォルトの名無しさん2010/12/21(火) 20:17:15
>>168
すいません書き忘れました、WinFormsです。
0170デフォルトの名無しさん2010/12/22(水) 00:34:27
>>156
最初から自動変換あってもよかったのにね。
途中入りなのが、過去のコード資産が微妙に残念に見える。
0171デフォルトの名無しさん2010/12/22(水) 01:13:40
�@参照設定したWMPコントロールをフォームに記述して再生するにはどうすればいいですか
�AWindowsFormsApplication1とやらに作成したフォームを別のプロジェクトから表示するにはどうしたらいいですか

もーわけわかんねーです
0172デフォルトの名無しさん2010/12/22(水) 01:38:16
>>171
�@参照設定ではなく、ツールボックスのアイテムの選択。
COMコンポーネント一番下のWMPコントロールをツールボックスに追加&フォームに貼り付け
再生は、
this.axWindowsMediaPlayer1.URL = @"C:\hoge.wmv";
"axWindowsMediaPlayer1"でググれば使い方はいくらでも出てくる。
�A別のプロジェクトの参照設定から、プロジェクトタブのWindowsFormsApplication1を選択
0173デフォルトの名無しさん2010/12/22(水) 07:56:14
>>172
ありがとうございます
�Aはそのとおり設定出来ました(動かないけどなんとなく解りました)

�@訂正
(1)
フォームに対して、動的なコントロールを追加する場合に、WMPコントロールの記述はどのように行えば良いですか?

(2)
>>157
0174デフォルトの名無しさん2010/12/22(水) 08:17:28
参照設定を動的に追加は出来ないと思うというか、状況が分からないんだけど。
Form1.Designer.csにaxWindowsMediaPlayer1を追加するコードが生成されてるから、
好きなタイミングで呼べば動的な〜かと。
0175デフォルトの名無しさん2010/12/22(水) 11:27:38
RichTextBox を PlanText のみを扱う TextBox にすることは可能でしょうか?

ブラウザからコピーしてペーストすると、書式もペーストされるため、困ってます。
Paste() のオーバーライドが不可だったため、今はKeyDownでの独自ペースト処理を検討しています。
0176デフォルトの名無しさん2010/12/22(水) 12:15:20
>>174
状況としては別個で、次のそれぞれについて、必要なコードが知りたいのです

a.あらかじめ作成したフォームにWMPコントロールをコードから追加

b.フォームをコード上で作成し、コードからWMPコントロールを追加
c.コードから参照設定を行う

d.c.を行いb.を実装する(要手動ビルド)
0177デフォルトの名無しさん2010/12/22(水) 13:07:07
おい、おまえら、俺がすげえブラウザ作ってやったよ。

タブ型ブラウザじゃなくて、チェックボックス式ブラウザだ。

くくく、これはすげえ賜物だぞ・・ すげえ、気になるだろ?

でも、教えてやんねえ。
0178デフォルトの名無しさん2010/12/22(水) 13:09:30
>>175
普通のTextBoxをmultiLineにするのじゃあかんのけ?
0179デフォルトの名無しさん2010/12/22(水) 13:12:19
>>178
そういう意味じゃないと思いますw

それほど昔じゃないけどここか相談すれで似たようなのを見たな・・・

ブラウザが扱うのはhtmlという整形言語、リッチテキストもリッチテキストというフォーマット

この辺を吸収したければドロップ情報をそのままリッチテキストに渡すんじゃなく
書式を加工するとかしないとだめだと思うよ
01801752010/12/22(水) 13:40:41
>>178
TextBox よりも RichTextBox の方が機能が多そうなので、RichTextBoxを使っています。
例えばUndoなどは、RichTextBox の方が良いので。

>>179
PlainTextにするプロパティはなさそうですね。
Ctrl+V を独自実装して回避してみます。
ありがとうございました。
0181デフォルトの名無しさん2010/12/22(水) 13:48:57
>>176
VSで参照設定すると、使いやすいようにラッパーが自動生成される。
それを使わずにということになると、COMを触る必要があって結構難しい。
VSで参照設定したときに生成されるDLLの中身をReflectorかなんかで読んでみたらいいと思う。
ずっと簡単な方法としては、WPFのMediaElementをElementHostで利用する手もあるよ。
0182デフォルトの名無しさん2010/12/22(水) 14:06:53
>>180
アプリ起動時にwebbrowserを内部的に用意して
D&Dで貰ったhtmlをwebbrowser入れて処理させた後
WebBrowser.Document.Body.InnerText
で貰ってきたらどうだろう?

ヘッダー部分はでてこないが、body以下は確か全部でてきたはず
0183デフォルトの名無しさん2010/12/22(水) 14:15:46
参考までに
http://ideone.com/Mtynz
0184デフォルトの名無しさん2010/12/22(水) 14:43:06
ふーん
0185デフォルトの名無しさん2010/12/22(水) 22:24:49
>>180
EM_SETTEXTMODEでTM_PLAINTEXTを設定するといいかも
http://ideone.com/zXwcT
01861752010/12/22(水) 22:54:29
>>185
ありがとうございます。そのやり方で確認できました。
VBとかはプロパティであった気がしましたが、裏では持ってたんですね。

>>182
ありがとうございます。
今回は単純にリッチをプレーンにしたかっただけなので。。。
0187デフォルトの名無しさん2010/12/23(木) 00:07:11
>>186
よかったね
Ctrl+Vは他にコンテキストメニューとか
場合によってはShift+Insertもあったりして面倒
0188デフォルトの名無しさん2010/12/23(木) 02:16:06
>>186
お礼はいらないよ
0189デフォルトの名無しさん2010/12/23(木) 02:33:16
>>186
どういたしまして
0190デフォルトの名無しさん2010/12/23(木) 15:31:03
>>186
いえいえ
0191デフォルトの名無しさん2010/12/24(金) 14:48:21
XmlReader.ReadContentAsDateTime メソッドの
「現在の位置でテキストの内容を DateTime オブジェクトとして読み取ります」
という説明の"現在の位置で"とはどういう意味ですか?
現在の位置を取得または設定できるプロパティ、メソッドがあるのでしょうか?

またReadContentAsDateTimeメソッドを使って下記の<updated>〜</updated>の中の文字列を
"05時00分00秒"と"01時00分57秒"と置換する方法に適していますか?

<entry>
<title>タイトル1</title>
 <name>名前1</name>
<updated>2010-12-22T05:00:00Z</updated>
</entry>
<entry>
<title>タイトル2</title>
 <name>名前2</name>
<updated>2010-12-23T01:00:57Z</updated>
</entry>
0192デフォルトの名無しさん2010/12/24(金) 15:00:36
XmlReaderはテキストの前から後ろにカーソルが動いていって
その下の文字列を順に読んで、タグなどが見つかるたびに「なんか見つかった」と通知してくる感じ
そのカーソルの位置が現在の位置。取得しても特に意味はないよ
XmlReaderは扱いが難しいのでLINQ to XMLでも使った方がいいと思う
でもそれ置換するだけなら正規表現でよくないか
XMLとして扱う必要無いような
0193デフォルトの名無しさん2010/12/24(金) 15:24:06
string 結果 = Regex.Replace(元のXML文字列, "<updated>(.+)</updated>",
 m => "<updated>" + DateTime.Parse(m[1].ToString()).ToString("HH時mm分ss秒") + "</updated>");
合ってるかは知らん
もしDateTime.Parseが使えなかったらParseExactで
0194デフォルトの名無しさん2010/12/24(金) 15:41:03
すんません。

targetFiles.GroupBy( _ => i++ / 100 )

を見せられたのですが、"_"の意味がわからず頭を抱えております。

やりたいことを考えたら、ラムダ式の結果でグループわけ、
ラムダ式は、アイテムごとにi++して、/100で云々、だとは思うのですが…

よろしくお願いします(´・ω・`)
01951912010/12/24(金) 15:46:31
レスありがとうございます
なんとなく分かりました

XMLはネットのRSSを
XmlReader reader = XmlReader.Create("http://www.***.com/index.rss");
で取得してそのままdatagridviewに表示してます
XMLであればタグの中身だけ抽出して変換で加工できるかな思いました
stringやStringBuilderに変換し加工しても問題ないのでそっちの方法でやってみます
>>192さん>>193さんありがとうございました
0196デフォルトの名無しさん2010/12/24(金) 15:51:15
>>194
意味はないだろ
>>193でいうならm=>でmという名前の引数を宣言する代わりに_という名前の引数を宣言してるだけ
使わないからいかにも無意味そうな名前にしてるんでしょ
01971942010/12/24(金) 16:11:16
>>196

あー、なるほど…
ありがとうございます。

リファレンスとかで一生懸命演算子とか探してましたw
0198デフォルトの名無しさん2010/12/24(金) 20:52:22
コードを短く記述出来るのがC#の特徴ったって、やっぱ可読性は大事だよな…。
俺ならそういう時は、 ( dummy => i++ / 100 ) って書くかも。
0199デフォルトの名無しさん2010/12/24(金) 20:54:08
俺ならOrderByなんか使わないw
どうしてもLINQ使いたかったらSliceみたいな拡張メソッド作るわ
0200デフォルトの名無しさん2010/12/24(金) 21:52:53
HTMLタグで記述し作成したテーブルの表示、非表示の切り替えを
c#で習得した値を元に行いたいのですが、どのような方法がありますか?

c#のコード→javascriptへ値を渡す→値を元にcss(displayプロパティ)を書き換えるjavascriptを実行
というのは可能なんでしょうか?
0201デフォルトの名無しさん2010/12/24(金) 21:53:13
LINQで配列の平均と標準偏差求めるプログラム書いてみてください
0202デフォルトの名無しさん2010/12/24(金) 23:18:13
ひとりぼっちのクリスマスに気持ちが暖かくなるような
コードを書いてくれ・・・
0203デフォルトの名無しさん2010/12/24(金) 23:23:20
Message.Show("Hello World!");
0204デフォルトの名無しさん2010/12/25(土) 00:06:55
Message.Show("大丈夫だ、問題ない。");
0205デフォルトの名無しさん2010/12/25(土) 00:16:25
var ave = data.Average();
var dev = Math.Sqrt(data.Average(d => Math.Pow(d - ave, 2)));
クエリ式使ってないけどいいよね
0206デフォルトの名無しさん2010/12/25(土) 02:30:05
Message.Show("そんなクリスマスで大丈夫か?");
0207デフォルトの名無しさん2010/12/25(土) 04:42:39
>>200
たとえばjsに
function showmsg(msg) {
  alert(msg);
}
ってのがあったとしたらC#からは
webBrowser1.Document.InvokeScript("showmsg", new object[]{"hello!"});
で呼び出せる。
0208デフォルトの名無しさん2010/12/25(土) 07:35:37
なんで「≠」が!==じゃなくて!=なんだよ!
0209デフォルトの名無しさん2010/12/25(土) 09:06:17
>>208
長い
2文字で頼む
0210デフォルトの名無しさん2010/12/25(土) 09:09:28
>>198
ラムダ式で使わない変数を_で置くってのは割と定型句なので、慣れといたほうがいいよ
0211デフォルトの名無しさん2010/12/25(土) 09:27:27
>>208
!(a==b)
0212デフォルトの名無しさん2010/12/25(土) 09:38:59
のっと いこーる で != でいいやんけ。
0213デフォルトの名無しさん2010/12/25(土) 11:02:13
==はどうなるんだよ?いこーるいこーるか?
0214デフォルトの名無しさん2010/12/25(土) 11:27:24
むしろ代入記号の=を変えてくれ
0215デフォルトの名無しさん2010/12/25(土) 11:30:38
>>214
わかりやすく <- とかどうだろうか
不等号&マイナスと区別が付かないとかそんなことは知らない
0216デフォルトの名無しさん2010/12/25(土) 11:36:10
if(((a==b) == true) == false)
0217デフォルトの名無しさん2010/12/25(土) 11:38:01
>>215
その辺は使ってるしなあ・・・
0218デフォルトの名無しさん2010/12/25(土) 11:42:15
代入に<=や:=あたりを使ってる言語ならあるが
0219デフォルトの名無しさん2010/12/25(土) 11:53:28
よく使い記号の方を簡素にすべきで、
等号を =、代入の方がを他のに変えるためには
まず代入の少ない言語設計が必要。
0220デフォルトの名無しさん2010/12/25(土) 12:30:02
>>214
PASCAL流に:=がいいんじゃね

>>219
代入を少なくしてもなくすことはできない
0221デフォルトの名無しさん2010/12/25(土) 12:31:41
つ[Haskell]
0222デフォルトの名無しさん2010/12/25(土) 12:39:21
今日もどうでもいいことで盛り上がってますね
0223デフォルトの名無しさん2010/12/25(土) 12:47:17
Int32.SetValue(i, 10);

うわ、いやだ
0224デフォルトの名無しさん2010/12/25(土) 13:35:10
DataBindingsプロパティについて教えてください。

�@
button1.DataBindings.Add(new Binding("Enabled",checkBox1,"Checked"));
このコードは一見うまい事連動できているように見えますが、
デザイナ上のDataBindingsプロパティからは指定できません。
なんでですか?やっちゃいけないのでしょうか?

�A
button1.DataBindings.Add(new Binding("Text", this.dataSet11, "DataTable1.Col1", true));
こっちはデザイナ上で指定可能ですが、
常に1レコード目がバインドされ無意味に思えます。
DataTableにPositionプロパティのようなものがあり、制御可能なのでしょうか?
それともBindingSource前提という事ですか?
0225デフォルトの名無しさん2010/12/25(土) 14:37:52
>>224
1)
バインディングはデータとビューを分けましょうってのが根底にあるからじゃね

2)
うん、BindingSource前提
どうしても使いたくないってのならCurrencyManagerもあるけどめんどくさいだけ
0226デフォルトの名無しさん2010/12/25(土) 14:59:27
>>207
試してみます
ありがとうございました
0227デフォルトの名無しさん2010/12/25(土) 15:58:28
>>225
>1)
なるほど、�@はビュー制御だから違うでしょ!って事ですか。
でもChangedイベントでの同期って初期処理で一度呼んでやらんといけないのが微妙。
(もはや書き慣れてしまいましたが)
>2)
CurrencyManager調べてみます。
>BindingSource前提
INotifyPropertyChangedを実装したクラスなども目的から外れてはいないですよね?
デザイナ上で指定できないだけで。
0228デフォルトの名無しさん2010/12/25(土) 16:01:45
あの〜(´・ω・`)
FormのPaintイベント発生時にDrawpath&FillPathでForm上に縁取り文字を描画して
描画した縁取り文字の形でフォームをくり抜きたいんですが「e.Graphics」に描画されてる縁取り文字のパスのとり方がよくわかりません
ご存知の方はどうかこの卑しい豚に助言というエサをお与えください。

【現状のそーす】
ttp://ideone.com/EqxNJ

これだとAddString時点のパスでくりぬかれるので、
FillPath後のパスでくりぬくようにしないといけないっぽいけれど
やり方が全然わからない(´・ω・`)ボスケテ
0229デフォルトの名無しさん2010/12/25(土) 16:34:32
>>228
塗ってから縁取りすりゃいいんじゃね?

//内側を塗る
Brush fillBrush = new SolidBrush(Color.White);
e.Graphics.FillPath(fillBrush, gp);

//縁を描画
Pen drawPen = new Pen(Color.Blue, 4);
e.Graphics.DrawPath(drawPen, gp);
0230デフォルトの名無しさん2010/12/25(土) 17:17:04
>>228
http://ideone.com/LHFfy
0231デフォルトの名無しさん2010/12/25(土) 18:03:49
>>229-230
グアアア、こんなことだったのか
ありがとう、できたよ(´;ω;`)
0232デフォルトの名無しさん2010/12/25(土) 18:59:15
縁を描画するときはSmoothingMode.Noneにしたほうがいいぞ
0233デフォルトの名無しさん2010/12/25(土) 19:41:55
縁を描画するときはSmoothingMode.Noneにしたほうがいいね
0234デフォルトの名無しさん2010/12/25(土) 20:12:45
今時WinForm使ってる人って、高解像度ディスプレイでの動作はどう考えてんの?
画面に画像貼り付けると他の部品とサイズがずれるのは時代遅れだと思うんだ。
0235デフォルトの名無しさん2010/12/25(土) 20:16:42
はぁ
0236デフォルトの名無しさん2010/12/25(土) 20:19:32
それは作り方がおかしい。デザイナーでサイズ決めてStretchモードにすればずれない。
プログラムからPictureBoxのサイズ変更してたりすると死ぬ。
0237デフォルトの名無しさん2010/12/25(土) 20:49:59
WinFormsと高解像度ってなんか関係あんの?
0238デフォルトの名無しさん2010/12/25(土) 21:25:59
画面部品のサイズはピクセル数指定だけどフォントはPt単位で環境によって比が違うし、
中途半端なDPI仮想化のせいでデザイン時に設定したサイズ(ピクセル)と実行時に
取得したサイズ(ピクセル)が一致しなかったりする。
いろんな画面部品のデフォルトサイズが小さくて詳細ディスプレイだと見づらくなることがある。

WinFomクラスも頑張っているけど、ときどき落とし穴があるんだよなあ。
WPFだとデザイン時も実行時も一貫してDPIが仮想化されているから気にする必要がない。
0239デフォルトの名無しさん2010/12/25(土) 21:33:35
割とどうでもいいw
02402382010/12/25(土) 21:42:58
>>239
俺は結構気になるな。
http://msdn.microsoft.com/ja-jp/windows/dd630126
ここで例として貼り付けられている表示の崩れの幾つかはWinFormsでも起こるんだけど、
こういうのでイラっとしたことない?
WPFならこれらの問題とおさらばできます(←怪しい商法のようなセリフだ)
0241デフォルトの名無しさん2010/12/25(土) 21:44:45
ささいな問題持ち出されてWPFの優位性を主張されてもなw
まずはXPで字がにじむのをどうにかしてほしい
0242デフォルトの名無しさん2010/12/25(土) 21:47:32
客に怒られたら直すわ
0243デフォルトの名無しさん2010/12/25(土) 21:48:15
メイン機が120dpiの俺にとっては割と問題だ
0244デフォルトの名無しさん2010/12/25(土) 21:48:59
WPFはWPFがゆえに受け入れられない
WinForm完全互換のWPFが出たら流行るだろう
0245デフォルトの名無しさん2010/12/25(土) 21:49:56
>>241
もう直ってるよ
0246デフォルトの名無しさん2010/12/25(土) 22:16:00
こういうのがFormsのダサいところなんだよな
0247デフォルトの名無しさん2010/12/25(土) 22:19:34
WPFにしたいならすればいいだけだし、おかしなアピールはいらんよ
0248デフォルトの名無しさん2010/12/25(土) 22:19:38
フルHD液晶のPC(140dpi)使ってる俺にとってはかなり問題だ。
MFCとWinFormsアプリ以外は問題ないと思っていたが、ブラウザの
拡大表示使ってたらSilverlightのサイズ計算もおかしくなるので困っている。
IEのDPI対応を何とかしてくれ。
0249デフォルトの名無しさん2010/12/25(土) 22:24:11
分かった
0250デフォルトの名無しさん2010/12/25(土) 22:30:51
WinFormsのダサいのは、GDIの設計が糞なのと、
文化オリエントの臭いがついているところ。
0251デフォルトの名無しさん2010/12/25(土) 22:50:30
Vistaから導入されたDPI仮想化を使えば、高DPI環境でも(ボケや滲みを許容すれば)WinFormsでも戦える。

96DPIじゃない環境が一般的な時代になったんだし、
崩れて読めなくなったりしない程度には対応を進めるべきだとは思うけどね。
0252デフォルトの名無しさん2010/12/25(土) 22:55:52
>>251
それはForm.PerformLayoutによるニセ仮想化じゃなくてVistaの仮想化だよね?
WinFormのニセ仮想化をオフにする必要があるけど、どうやるの?
■ このスレッドは過去ログ倉庫に格納されています