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

C♯相談室 Part28

■ このスレッドは過去ログ倉庫に格納されています
0001名無しさん♯2005/12/14(水) 07:47:02

(#゚ー゚)つ < C#、.NETの話題はこちらでどうぞ。


過去スレは>>2-5あたり。


関連リンク
http://onigiri.s3.xrea.com:8080/csharp/index.php?%5B%5B%A5%EA%A5%F3%A5%AF%5D%5D
0232デフォルトの名無しさん2005/12/24(土) 04:36:34
でもICloneableである必要ってよく分からないんだよな
各クラスが独自に実装してしまってもそう困るもんでないような気が

>>231
object ICloneable.Clone() {...}
public Hoge Clone() {...}
じゃ駄目?
0233デフォルトの名無しさん2005/12/24(土) 04:53:31
>>232
>282にそう書いてあるじゃん
0234デフォルトの名無しさん2005/12/24(土) 05:06:53
今までの傾向からして
public interface ICloneable<T> : ICloneable
になりそうな予感。
0235デフォルトの名無しさん2005/12/24(土) 11:36:08
そしてそれをどう使うのか…
あんまり有効な使い方は思い付かん。
0236デフォルトの名無しさん2005/12/24(土) 13:28:03
質問させて下さい。VC#2005Expressで、
 using System.Web.UI.HtmlControls;   
を使うと
 エラー 型または名前空間名 'UI' は名前空間 'System.Web' に存在しません。アセンブリ参照が不足しています。
と出て、UIに青い波線が入ります。
オブジェクトブラウザをみるとちゃんと存在します。
どこがいけないのでしょうか?ヘルプをみても問題ない気がします。
昔VBの経験があり、OSはXP2、PCは自作です。お願いします。
0237デフォルトの名無しさん2005/12/24(土) 13:30:31
add reference
0238デフォルトの名無しさん2005/12/24(土) 13:32:48
>>236
参照の追加
0239デフォルトの名無しさん2005/12/24(土) 13:42:52
>>237 >>238
おお、早速の返答ありがとうございます。
しかし悲しいかな、いまひとつ理解できず苦しんでおります。
もう少し詳しい説明をお願いできないでしょうか。
0240デフォルトの名無しさん2005/12/24(土) 13:47:39
>>239
ソリューションエクスプローラのプロジェクトのところに参照ってない?
右クリックしてみ

しまった、俺まだ2003だった
0241デフォルトの名無しさん2005/12/24(土) 13:52:22
>>240
おお、これか!
動いた!
ありがとうございました!!!
0242デフォルトの名無しさん2005/12/24(土) 15:30:07
p/invoke した関数から NullReferenceException 飛んでくるんだけど、
呼び出し先の関数が null 返した時にもこの例外は出るんだっけ?
0243デフォルトの名無しさん2005/12/24(土) 15:39:37
定義やら宣言やらが間違ってると思われ
02442362005/12/24(土) 15:47:18
度々で恐縮です。
C#でHPに自動ログインさせようとしてるのですが、うまくいきません。
HtmlDocumentを使うのは分かったのですが、Itemプロパティが何故か使えません。
仕方ないの調べたらSetAttributeが使えそうなのですがこれも何故かうまく使えません。
Helpファイルの使用例も変です。恐れ入りますがよろしくお願いします。
02452362005/12/24(土) 15:54:01
あ、IDは事前に分かっています。
0246デフォルトの名無しさん2005/12/24(土) 15:54:37
System.Windows.Forms.HtmlDocument?
Itemなんてプロパティは見当たらないが。HtmlElementにも。
うまく使えないってなにがどううまく使えないんだ。

……ってSystem.Web?
その名前空間は基本的にASP.NET用の名前空間であってWinFormアプリには使わないぞ?
02472422005/12/24(土) 16:00:53
>>243
ん〜。NULL 以外の値が帰ってくる時には正常に動作するらしい。
NULL を返す時に限って例外出てくるんだけど……。それとも内部でこけてるだけかな……?

ちなみに宣言は
[DllImport("dxwrap.dll")] private extern static IntPtr DXMusic_New_FromFile(IntPtr hWnd, string filename);
02482362005/12/24(土) 16:11:22
>>246
実は下記のサイトを参考に自分なりに作り直しています。
http://peace.poosan.net/investor/workshop/2512.htm
このページからダウンロードしたソリューションは動くんです。
C#のバージョンが違うのですが、新しいバージョンならもっと簡単に出来るのではないかと勉強がてらにやっていました。
ここではログインページを管理する変数とタイマーを使ってるのですが、DocumentCompletedを使ってやれないか模索していました。
ですがうまくデータを書き込めないんです。
0249デフォルトの名無しさん2005/12/24(土) 16:26:09
つまりAxWebBrowser/IHTMLDocument/IHTMLElement他の仕様と
System.Windows.Forms名前空間のWebBrowser/HtmlDocument/HtmlElementの仕様の差がわからないと。
ヘルプ嫁としか言いようが無いな。

//しかしそのサンプルもずいぶん無造作にCOMオブジェクトを使ってるねー。
02502422005/12/24(土) 16:47:01
>>243
悪い。自己解決。p/invoke 先にバグがあった orz
02512362005/12/24(土) 17:00:50
>>249
要は自動ログインしたいだけなんです。
WebBrowser.Document プロパティのヘルプに
「HTML ドキュメント オブジェクト モデル (DOM: Document Object Model) によって、
WebBrowser コントロールに表示されている Web ページのコンテンツにアクセスするには、このプロパティを使用します。」
とあるのですが、うまくログインできないんです。
他に参考になるページは http://www.gdncom.jp/general/bbs/ShowPost.aspx?PostID=18348 ですが、
ここもやり方が古い(?)ようです。
お付き合いくださってありがとうございました。頑張って試行錯誤を続けます。
0252デフォルトの名無しさん2005/12/24(土) 17:06:18
> とあるのですが、うまくログインできないんです。

なにやら果てしない飛躍だな。
02532362005/12/24(土) 17:15:37
え?方向性間違ってますか・・・orz
0254デフォルトの名無しさん2005/12/24(土) 17:25:50
エクスプローラーのファイルリストのように、
列の入れ替えができるリストビュ−ってどうやれば実装できるのでしょうか?
コンポーネントの名前とかも分らないので教えてもらえないでしょうか〜。m(_ _)m
0255デフォルトの名無しさん2005/12/24(土) 17:26:42
別に間違っては無いが、過程がすっぽ抜けてるから。
質問するときは具体的に、なにをどうやってどうなったかをはっきりと。
0256デフォルトの名無しさん2005/12/24(土) 17:27:53
>>254
AllowColumnReorder?
アイテムの管理が大変だけど。
0257デフォルトの名無しさん2005/12/24(土) 17:30:31
>>256
サンクスです!
0258デフォルトの名無しさん2005/12/24(土) 17:43:11
>>253
2005で付いたブラウザコンポーネントは、
フレーム超えられないみたいだから注意してね。
まぁ、ネイティブのインタフェースも実装してるから
そっち使えばいいだけだけどね。

そんじゃ、これからデートで体力限界までハッスルしてきまつ!
02592362005/12/24(土) 18:00:55
すみません。説明不足でしたか・・・orz  Form1にwebBrowse1を貼り付けて以下のように記入しました。

private void button1_Click(object sender, EventArgs e)
{
webBrowser1.Navigate("http://login.yahoo.co.jp/config/login?.src=www&.done=http://www.yahoo.co.jp");
}

private void webBrowser1_DocumentCompleted(object sender, WebBrowserNavigatedEventArgs e)
{
HtmlDocument doc = this.webBrowser1.Document;
doc.All.Item("login",0).value = "名前";  //axwebBrowserの例からこれでいけると思ったがダメ。itemの定義がないとエラー
}
この後SetAttributeを使ったり、書き方を変えてみたりしたが全滅でした。
現在もググってますが良い例が見つかっていません。
0260デフォルトの名無しさん2005/12/24(土) 18:05:20
<input type=text size=23 id=txbx name="login">
0261デフォルトの名無しさん2005/12/24(土) 18:15:35
HtmlDocumentにSetAttributeなんてないが。
つかVS2005使ってないの?

まずHtmlDocument.Allを調べる。するとHtmlElementCollection型のインスタンスが返ってくると言うことが分かる。
HtmlElementCollectionのItemプロパティを調べる。
で、ここでC#の一般常識:Itemって名前の"引数をとるプロパティ"は、普通C#ではインデクサで表現する。
インデクサの使い方を調べる。
改めてHtmlElementCollection.Itemプロパティを見てみる。

と言う風に順番に解決してけ。
02622362005/12/24(土) 18:51:09
>>261
VS2005使ってますがhelpでクリックして辿ってる内に変なところにたどり着いていたようです。
半ばヤケになっていろいろ試していました。もう一度最初から調べてみます。
ありがとうございました。
0263デフォルトの名無しさん2005/12/24(土) 21:05:13
ライブラリモジュールに
namespace Lib{
class ClassA{
}
}
というのがあるんだが、ほかのプロジェクトで使うときLib.ClassAじゃあかんのですか?
リファレンス参照追加しても見つけてくれない・・・orz
0264デフォルトの名無しさん2005/12/24(土) 21:09:10
Libプロジェクトを追加したの? ならLibはビルドしてる?
0265デフォルトの名無しさん2005/12/24(土) 21:14:45
class は internal class じゃけえの
public class にせいや
0266デフォルトの名無しさん2005/12/24(土) 21:18:52
レスありがとうございます。
ビルドはしてます。
現状:
ライブラリプロジェクトを同じソリューションに追加。
ライブラリのDLLは作成されている。
リフレクターで見ると対象のクラスなどは存在する。
ライブラリを参照したいプロジェクトにはDLLは存在しない←これがおかしい?
02672632005/12/24(土) 22:24:47
DLLをソリューションに直接追加したらコンパイル通りました。
でもライブラリいじっても古いDLLのままなので手動でコピーしないといけないですね。
0268デフォルトの名無しさん2005/12/24(土) 23:44:49
ほかの掲示板にも書き込んで見ます。
理由わかったら結果報告します。
0269デフォルトの名無しさん2005/12/24(土) 23:53:44
クロスポストなら許そう
0270デフォルトの名無しさん2005/12/25(日) 01:12:30
文字列通信を行うコンポーネントが読み込んだ文字列を string で返してくるのですが、
文字列の文字コードは UTF-8, UTF-16, ASCII, SHIFT-JIS, EUC-JP などさまざまです。

そこで、文字コードと string の関係がすごく気になります。
EUC-JP とか SHIFT-JIS の文字列を string に代入したら、内容は破壊されるんでしょうか。

もし破壊されないのなら、string で渡された文字列を byte[] に変換して、
それから正しい文字コードを指定して表示するなり変換するなりできますが、
場合によって破壊されてしまうのなら、そもそもそのコンポーネントの仕様に
問題があることになるので…。
0271デフォルトの名無しさん2005/12/25(日) 01:18:48
stringはstringだ。CLIでの内部表現はUTF16だな。
内容が破壊とか意味不明。
EUC-JPなりShift_jisなりで表現されるのは所詮バイト列。stringとは関係無い。
0272デフォルトの名無しさん2005/12/25(日) 01:34:18
要は、
・そのコンポーネントは文字列を string として返してくる。
・しかし、その内容は UTF-8, Shift_JIS, EUC-JP などさまざま。
という点が問題なのです。

おっしゃるとおり string の内部表現は UTC-16 です。

しかし、実際にコンポーネントが EUC-JP の文字列を string に
入れて返してきたものを、そのまま UTF-16 のつもりで表示すると、
化け化けでまったく表示できないんです。

ですので。

コンポーネントが string に入れてきた文字列は、 UTF-16 のように
みせているが byte[] としてとりだすと元のエンコーディングの
文字列のバイト列のままで、バイト列から正しいエンコーディングに
変換することができるのか。

それとも、そもそも string に入れて返されてきた(もともと UTF で
はない EUC-JP などだった)文字列は、UTF-16 と思って表示すると
化け化けなことから、既に破壊されていて、そこから変換して正しい
文字列を EUC-JP なり UTF-8 なりとして取り出すなんてことは、
不可能なのか。

そのどちらなのかが、わからないのです。
0273デフォルトの名無しさん2005/12/25(日) 01:39:54
書き込んでからしばらく考えて思ったのですが、この場合、
コンポーネント内部の処理の時点で既におかしくなっている
気がしてきました。

string で値を渡してくるわけだから、string として表示
なりなんなりしたときに化ける時点で値をセットした側の
処理に問題がある気がします。
0274デフォルトの名無しさん2005/12/25(日) 01:56:10
○○の考え休むに似たり。
普通にデコードためしてみりゃ良かろうに
0275デフォルトの名無しさん2005/12/25(日) 02:00:13
>>272
勿論stringはstringなのだから、stringで返してきた文字列が化けているのならそれはコンポーネントのデコードミスだ。
コンポーネントがバイト列からstringに変換するときに正しいエンコーディングを使わなかったんだろう

> 化け化けなことから、既に破壊されていて、そこから変換して正しい
> 文字列を EUC-JP なり UTF-8 なりとして取り出すなんてことは、
> 不可能なのか。

例えば「あいうえお」という文字列をUTF-8で表現すると
E3 81 82 E3 81 84 E3 81 86 E3 81 88 E3 81 8A
ってバイトの列になる。
これをShift_jisでデコードするとまあ当然化けるわけだが、
その化けた文字列を再びShift_jisとしてバイト列にしてみると、
E3 81 82 E3 81 84 E3 81 81 45 81 88 E3 81 81 45
って感じになる。
何故かと言うと、途中変換できない文字は?または・に強制的に変更してしまうから。
だから>>272が言う「既に破壊」はある意味では正しい。
0276デフォルトの名無しさん2005/12/25(日) 02:01:38
あーなるほど。
実際に byte[] に変換して元データのエンコーディングを使って
再度 string にして確かめてみろということですね。
やってみます。ありがとう。
0277デフォルトの名無しさん2005/12/25(日) 02:06:56
お舞らC#のパーサー(コンパイルまでしなくていいから、継承関係とかどこでどのメソッドが使われてるかがわかるレベル)作るとしたらどのぐらい時間かかると思います?
なんかかなりまんどくせそうなんだが。
0278デフォルトの名無しさん2005/12/25(日) 02:13:36
継承関係を調べるだけならリフレクションでやればすむだけじゃん
呼び出し関係を調べたいならコンパイルしてからILを読めばいいだけだし
0279デフォルトの名無しさん2005/12/25(日) 02:17:59
プログラム中で使うんだよ。VSのエディタみたいなもんだと思ってくれ。
0280デフォルトの名無しさん2005/12/25(日) 02:30:25
>>269
それはただのスレ違いレスとどう違うんだ?
0281デフォルトの名無しさん2005/12/25(日) 02:32:25
>>277
かなり。
とりあえずC#の言語仕様を精査するところから開始。


気が遠くなるだろ?
0282デフォルトの名無しさん2005/12/25(日) 02:37:23
>>277
どこで使われてるか調べるならObsolete付けてビルドするのが手っ取り早いと思う。
0283デフォルトの名無しさん2005/12/25(日) 02:39:33
>>278=282かわからないけど、そういう話じゃないから。
0284デフォルトの名無しさん2005/12/25(日) 02:42:55
.NETで作るんならCodeDOMはどうよ?
0285デフォルトの名無しさん2005/12/25(日) 02:47:12
>>284
よく調べてないんだけど、実質パーサー何もなくない?
0286デフォルトの名無しさん2005/12/25(日) 02:56:24
つ http://sourceforge.net/projects/cscodedomparser/
0287デフォルトの名無しさん2005/12/25(日) 02:59:13
>>277
まぁ、System.CodeDom名前空間のクラス郡か、ANTLRでも持ってくるかって感じだな。
0288デフォルトの名無しさん2005/12/25(日) 03:21:12
>>276
System.Text.Encoding
0289デフォルトの名無しさん2005/12/25(日) 09:38:26
>>263
DLLの直接参照をやめて、プロジェクト参照にしたら動きました・・・
デモなんかそれができなかったりしたんだよな・・・
02902362005/12/25(日) 16:16:56
>>261
丸三日掛かりましたがようやく出来ました。
ありがとうございました。
0291デフォルトの名無しさん2005/12/25(日) 16:52:47
テキストファイルから文字を読み込んでlistBoxに表示
させる時に、スペースやカンマだけは読み込まないように
したいのですがどうすればいいのでしょうか?
誰か助けて!
0292デフォルトの名無しさん2005/12/25(日) 16:58:55
読み込まないって意味をどう理解するのかが難しいな。
とりあえずReplaceで取り除くという簡単な手段を提示。
0293デフォルトの名無しさん2005/12/25(日) 17:11:15
C#でツールバーって作れますか?
エクスプローラでファイルの操作とかしたいんですが、できますかね?
具体的にはどうやったらいいんでしょう
0294デフォルトの名無しさん2005/12/25(日) 17:19:20
BancObjectでも使え。
0295デフォルトの名無しさん2005/12/25(日) 18:04:49
http://www.google.com/search?num=100&as_qdr=all&as_occt=any&as_dt=i&lr=lang_ja&as_q=C%23+tips
0296デフォルトの名無しさん2005/12/25(日) 20:23:30
DNSのMXレコード引く方法は用意されてるの?
0297デフォルトの名無しさん2005/12/25(日) 20:34:05
Socket使うことになるな
0298デフォルトの名無しさん2005/12/25(日) 20:37:01
>>297
生で出し入れするのか…。
ありがとう。RFC文書探してみるよ。
0299デフォルトの名無しさん2005/12/25(日) 20:41:53
勉強したいってんなら別だが、CodeProject辺り調べたらあるんじゃね?
0300デフォルトの名無しさん2005/12/25(日) 20:42:02
何が面倒って、プロトコルの規格を調べることだよな・・・
Socket使って生からで作る事自体は大した手間ではなかったり

0301デフォルトの名無しさん2005/12/25(日) 21:01:54
HttpWebRequest.Connection プロパティってどうやって設定するの?
ヘルプには「Connection HTTP ヘッダーの値を取得または設定します。 」って書いてあるけど、
ヘルプのサンプルを動かしたら、
HttpWebRequest myHttpWebRequest2 =
(HttpWebRequest)WebRequest.Create("http://www.contoso.com");
myHttpWebRequest2.Connection = "Close";    ←ここでエラーが起こる。

このプロパティを使用して、Keep-Alive および Close を設定することはできません。
パラメータ名: value
なんてエラーが出やがった。


0302デフォルトの名無しさん2005/12/25(日) 21:09:24
KeepAliveのプロパティで良いんじゃね
0303デフォルトの名無しさん2005/12/25(日) 21:11:57
>>298
生で出し入れだと!
0304デフォルトの名無しさん2005/12/25(日) 21:13:03
KeepAlive = false;
ってすればいいだけなのか。サンクス。
0305デフォルトの名無しさん2005/12/25(日) 23:54:15
>>303
53番のネェちゃんがアナ開けて待ってるから
そこにナマで出し入れしてネタを聞き出すんだよ。
0306デフォルトの名無しさん2005/12/26(月) 00:24:55
下品なネタよそうよ。
今年は2日で計8戦して、摩擦しすぎで腫れちゃって
風呂入っても凍みるんだから。
くだらない妄想なんてやめて、
世界がどうやったら平和になるか考えようよ。
0307デフォルトの名無しさん2005/12/26(月) 00:55:29
>>306
人類が滅べば平和
0308デフォルトの名無しさん2005/12/26(月) 01:33:52
順子4組+頭をそろえると平和
0309デフォルトの名無しさん2005/12/26(月) 01:34:08
所詮この世は弱肉強食なんだよ
俺は真っ先に死にそうだがorz
0310デフォルトの名無しさん2005/12/26(月) 03:28:26
>>308
最後が頭だとダメだろ
0311デフォルトの名無しさん2005/12/26(月) 18:36:44
IList<T> のソートってどうやればいいんでしょう?
List<T>ならList<T>.Sortメソッドがあるし配列ならArray.Sortメソッドがあるんですが
そのどちらかわからない場合はどうすれば・・・
0312デフォルトの名無しさん2005/12/26(月) 18:37:40
インタフェースの明示的実装
03133112005/12/26(月) 19:10:20
>>312
インターフェースってIList<T>のことですか?
ドキュメントによるとIList<T>にソートをするメソッドはないみたいです。
0314デフォルトの名無しさん2005/12/26(月) 19:14:14
頑張ってSort<T>(IList<T>)とかSort<T>(IList<T>, IComparer<T>)とか自前で書くこったな。
03153112005/12/26(月) 19:34:20
>>314
ほんとにそれしかないんですか・・・
なんか釈然としないですがとにかくやってみます。
どうもありがとうございました。
0316デフォルトの名無しさん2005/12/26(月) 20:28:21
KeyEventについて質問させてください。

KeyEventArgsで
KeyCodeとKeyDataってどう違うんですか?

ただコンボボックスでEnterが押されたらコマンドを実行するようにしたいだけなんですが
0317デフォルトの名無しさん2005/12/26(月) 20:53:14
KeyDataの解説に書いてるだろ。
0318デフォルトの名無しさん2005/12/26(月) 23:18:03
前スレを読んだんですが、.NETでは(Win32APIを呼ばない限り)
caretを直接扱えないってことでしょうか。

ドローソフトみたいに画面上の任意の位置に文字を入力できるようなのを
作りたいのですが……。
0319デフォルトの名無しさん2005/12/26(月) 23:23:33
枠なしTextBox使うとかどうよ。
0320デフォルトの名無しさん2005/12/26(月) 23:25:46
.NET は Win32API ありきだから
0321デフォルトの名無しさん2005/12/27(火) 00:43:25
sgenってDLL中の特定の複数の型に対して使うのはむりぽ?
/t Hogeって単体は指定できるのですが・・
0322デフォルトの名無しさん2005/12/27(火) 00:44:58
デフォルトだと全部にならないっけ?
sgenの情報が少ないな
03233112005/12/27(火) 05:44:32
もう一度よく調べてみたら、
ArrayList.AdapterメソッドがIListをArrayListに変換するのに使えるようです。
内容のコピーはしないらしいのでIListのコピーに使えそうです。
03243112005/12/27(火) 05:45:17
× IListのコピー
○ IListのソート
0325デフォルトの名無しさん2005/12/27(火) 10:05:28
IList<T>はIListを実装しないけどな。
03263112005/12/27(火) 12:19:29
>>325
そうでした・・・
List<T> と配列が両方 IList を継承していたからうまくいっただけでした。
IList<T> をソートする方法は依然として不明のままです。
0327デフォルトの名無しさん2005/12/27(火) 14:35:34
IList<T>ってインターフェースだよね。
一体何を悩んでいるのか読めない。
03283112005/12/27(火) 16:15:10
あ、自分の場合は List<T> と配列を共通の方法でソートしたかっただけなので
>>323 の方法で問題ないです。すみません。
ただ IList<T> を実装したコレクションを共通の方法でソートする場合はどうするのかなあと思っただけです。
0329デフォルトの名無しさん2005/12/28(水) 00:07:51
いくつかの動画を同時に再生しようと思っているのですが
MediaPlayerをウィンドウに配置してMDIとして再生するのと
DirectShowを使ってウィンドウに直接描画し、MDIアプリとして再生するのでは
どちらの方が処理が軽くなるでしょうか?
再生する動画の数は1〜4つを想定しています。

また、DirectShowを使う場合はマルチスレッドにする必要がありますか?
0330デフォルトの名無しさん2005/12/28(水) 00:31:18
そんぐらいは自分で試せ。
0331デフォルトの名無しさん2005/12/28(水) 00:42:17
>>330
わかりました。
■ このスレッドは過去ログ倉庫に格納されています