[表示 : 全て 最新50 1-99 101- 201- 301- 401- 2chのread.cgiへ]
Update time : 02/16 13:16 / Filesize : 126 KB / Number-of Response : 495
[このスレッドの書き込みを削除する]
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧] [類似スレッド一覧]


↑キャッシュ検索、類似スレ動作を修正しました、ご迷惑をお掛けしました

C#, C♯, C#相談室 Part50



1 名前:デフォルトの名無しさん mailto:sage [2008/12/19(金) 13:45:15 ]
(#゚ー゚)つ < C#、.NETの話題はこちらでどうぞ。

前スレ
C#, C♯, C#相談室 Part49
pc11.2ch.net/test/read.cgi/tech/1224754660/


Visual C# 2008 Express Edition 日本語版
www.microsoft.com/japan/msdn/vstudio/express/vcsharp/

その他テンプレ>>2-5くらい

237 名前:デフォルトの名無しさん [2009/01/04(日) 16:33:54 ]
>>234
クリックされたときにそこの内容がつかめればいいということですか。

>>235
NewWindow イベント というものがあるのですね、知りませんでした、
これで単純にキャンセルすることはできそうですね!!
これで新しいブラウザではなくて自分のところにリダイレクトできれば
いいのですね。この CancelEventArgs にはアドレスがなさそうなので
どうやったら掴めるか、また調べてみますです。

どうもありがとうございました!



238 名前:デフォルトの名無しさん mailto:sage [2009/01/04(日) 16:38:12 ]
>>236
BluetoothSetLocalServiceInfo() とかの API は使えないの?

239 名前:デフォルトの名無しさん mailto:sage [2009/01/04(日) 16:40:09 ]
>>237
> クリックされたときにそこの内容がつかめればいいということですか。

違う。DOM でパースして、target 属性を見ればいいんじゃない? ってこと。
ま、a タグに Javascript を仕込まれてたりしたときのことを考えなくちゃならんけどw



240 名前:デフォルトの名無しさん [2009/01/04(日) 18:07:58 ]
C#でAccessデータベースをOLEで連携してDataGridで表示しつつ
右横に単票状態のデータベースを表示し、修正する名簿ソフトを
作っています。
そこで質問をさせてください。

----
DataGridに表示させ、DataGridの右横にテキストボックス
を配置し、テキストボックスにデータベースのデータソースと
バインドさせて、名簿管理ソフトを作りました

これに機能追加で、DataGridの表示条件を絞り込みできるようにしようと
しました。

そこで、
DataViewを使って、RowFilterプロパティを使って抽出条件で
DataGridの表示条件を絞り込み出来る機能を追加しましたが
DataGridの右横にあるテキストボックスとDataGridのデータが
連動されなくなってしまいました。
(DataGridの絞込みをしてもテキストボックスに表示されるのは
データソースの1行目の情報となってしまう)

これを解消する良い方法は無いでしょうか?
テキストボックスでデータ修正をし、データベースの情報を
修正する機能をつけていて、それを無くしたくは無いのです。
お手数をおかけしますがご教示ください

また、説明不足や表現力不足でわかりづらかったらご指摘ください
ますと幸いです。

241 名前:デフォルトの名無しさん mailto:sage [2009/01/04(日) 18:15:00 ]
TextBoxのバインディングソースもそのDataView使えばいいんじゃね

242 名前:デフォルトの名無しさん [2009/01/04(日) 18:56:09 ]
>>241
なるほど、試してみます
どうもありがとうございます

243 名前:デフォルトの名無しさん [2009/01/05(月) 01:12:37 ]
教えてください。

フォームに配置されているコントロールの使用可制御を 以下のように行いたいのです。


textA.Enabled = true;

if (条件1)
{
textA.Enabled = false;
}

if (条件2)
{
textA.Enabled = false;
}

if (条件3)
{
textA.Enabled = false;
}


このソースを実行すると、if文の条件に合ったとき、 一瞬、コントロールが使用可になってから使用不可になる というちらつきが生じてしまいます。
「textA」としていますが、このようなコントロールがとてもたくさんあり、
if文の条件もたくさんあります。
また、条件はコントロールが『使用不可になる条件』しかなく、 使用可になる条件がない(使用不可の条件に1つも当てはまらなければ使用可) ため、いったんコントロールを使用可にしてから条件にあったときだけ 使用不可にする方法をとっています。
ちらつきをなくす良い方法はないでしょうか。
上記のソースが流れ終わるまでは画面の再描画を行わない、などの
方法があればお願いします。


244 名前:デフォルトの名無しさん mailto:sage [2009/01/05(月) 01:30:44 ]
textA.Enabled = !(条件1||条件2||条件3);

245 名前:デフォルトの名無しさん mailto:sage [2009/01/05(月) 01:33:24 ]
if (条件1)
{
textA.Enabled = false;
}
else if (条件2)
{
textA.Enabled = false;
}
else if (条件3)
{
textA.Enabled = false;
}
else
{
textA.Enabled = true;
}




246 名前:デフォルトの名無しさん mailto:sage [2009/01/05(月) 01:53:18 ]
LockWindowUpdate() とかダメ?

247 名前:デフォルトの名無しさん mailto:sage [2009/01/05(月) 02:18:21 ]
bool tmp = true;

if (条件1)
{
tmp = false;
}

if (条件2)
{
tmp = false;
}

if (条件3)
{
tmp = false;
}

if(textA.Enabled != tmp)//これ無いとちらつく?試してないけど
{
textA.Enabled = tmp;
}

248 名前:デフォルトの名無しさん mailto:sage [2009/01/05(月) 02:36:56 ]
>>247
> ラスト4行
確認はしていないが、そのチェックはプロパティの実装に入ってる可能性が高い
他のには大抵入ってるし、ないとEnabledChangedが正常動作しなくなる


249 名前:デフォルトの名無しさん mailto:sage [2009/01/05(月) 06:42:38 ]
textA.BeginUpdate(); // EndUpdate()まで画面の再描画を行わないようにする
textA.Enabled = true;

if (条件1)
{
textA.Enabled = false;
}

if (条件2)
{
textA.Enabled = false;
}

if (条件3)
{
textA.Enabled = false;
}

textA.EndUpdate();

250 名前:デフォルトの名無しさん [2009/01/05(月) 11:54:19 ]
240の質問の続きです・・・
240の質問事項については、>>241で無事解決しました。
どうもありがとうございます。


RowFilterでフィルタをかけている状態で、下記のコマンドをボタンで実行
させていますが、DataGridのフォーカスを手動で変更をしないと
データベースが更新されないのです。
※フォーカスを移動しなくても更新されるようにEndCurrentEdit
メソッドを事前にかけているのですが・・・

---------------------------------
int iRow; //更新したレコード数
this.BindingContext[dbCustomer1, "M_Customer"].EndCurrentEdit();
iRow = oleDbDataAdapter1.Update(dbCustomer1, "M_Customer");
MessageBox.Show("更新 " + iRow + "件");
-----------------------------
度々すみませんが、ご教示いただけないでしょうか?


251 名前:デフォルトの名無しさん mailto:sage [2009/01/05(月) 12:06:07 ]
string path が不正なパスのとき ( "::{hogehoge}" みたいな )

bool b = Directory.Exists( path );
は例外ださないでfalseが返る (内部では出ててcatchされてるのがパフォーマンスモニタで確認できる) けど

DirectoryInfo di = new DirectoryInfo( path );
bool b = di.Exists
だとコンストラクタの時点でArgumentExceptionがでる

前者でも例外出してくれた方がいいかなぁ
でも実用的じゃなくなるかなぁ
ただ「信頼性とパフォーマンスモニタ」の「# of Exceps Thrown」が増えてくのは気持ち悪い
つーか増えてく原因探すのでえらい手間取ったorz

252 名前:デフォルトの名無しさん [2009/01/05(月) 12:23:10 ]
Visual Studio 2008で専用ブラウザを作成しています
FormClosing時に画面は閉じても良いのですが閉じる前に
サーバーに対してログアウト処理のページを読み込ませて
強制ログアウトさせたいのですが、FormClosingでNavigate
に処理ファイルを書いて実行しても処理は行われず
FormClosingの最終部にe.Cancel = true;を書くと
処理は実行されます。
しかしこれだとどうやっても画面が閉じれなくなるので
何とかしたいのですが、この場合どういう書き方をしたら良いのでしょうか?

253 名前:デフォルトの名無しさん mailto:sage [2009/01/05(月) 12:35:07 ]
FormClosing
{
 if( !ログアウト処理した )
 {
  e.Cancel = true;
  FomClosing中ですよ = true;
  ログアウト処理();
 }
}

ログアウト処理
{
 ...

 ログアウト処理した = true;
 if(FomClosing中ですよ)
 {
  this.Close();
 }
} 

254 名前:デフォルトの名無しさん mailto:sage [2009/01/05(月) 12:41:51 ]
ログアウトしたかどうかの判断がFormのイベントハンドラに入ってて、
フォームを閉じる処理がログアウト処理()に入ってるっていうのはどうなの。
まるでVB厨の書くコードみたいw

ってういか、そもそも>>252のいっているような現象って本当に起こるの?

255 名前:デフォルトの名無しさん mailto:sage [2009/01/05(月) 12:42:00 ]
最終部にApplication.DoEvent();



256 名前:デフォルトの名無しさん mailto:sage [2009/01/05(月) 13:44:23 ]
UWSCというマクロツールの画像判定処理
(bmpファイルを読み込んで、その画像と同じものが画面上になければfalseを返す
画面上にあればtrueを返してその画像の座標を参照渡しするというモノ)
をC#で実現しようとしてがんばってるんだけど

BitmapクラスのGetPixelを使って再現してみたら実行にものすごく時間がかかるんですけど
これを早くする方法はないですか?


257 名前:デフォルトの名無しさん mailto:sage [2009/01/05(月) 13:51:57 ]
LockBits

258 名前:デフォルトの名無しさん mailto:sage [2009/01/05(月) 14:00:20 ]
GetPixel/SetPixelって何のために生きてるの?
知らないと使ってしまいがちな絶対使ってはいけないものの代表格だよね

259 名前:デフォルトの名無しさん mailto:sage [2009/01/05(月) 14:02:53 ]
>>258
極端な思考だなあ。。
こういうのを2ch脳っていうのかなあ。(というのも極端な思考かもしれんが)

260 名前:252 [2009/01/05(月) 15:00:37 ]
>>253
書かれている方法で試したのですがこれだと無限ループが発生して
しまいませんか?

>>254
私の環境では起きてます。orz

webBrowser.Navigateで通信が完了した等の
情報をひらう事は出来ないのでしょうか?
もし出来るならやり方を教えてもらえませんか?

261 名前:デフォルトの名無しさん mailto:sage [2009/01/05(月) 15:18:58 ]
ログアウト処理はBeginInvoke使って呼び出さないと駄目っしょ
ログアウト後のCloseはまた別にWebBrowserのイベントとかで呼び出しってことになるだろうけど
>>254
FormClosing中にWebBrowser.Navigateしても意味無いのは当然

あとはWebBrowserのイベント調べれ

262 名前:デフォルトの名無しさん mailto:sage [2009/01/05(月) 15:22:25 ]
そう言えばどうせNavigateして完了待ちになるならBeginInvokeも特に必要ないな

263 名前:109 mailto:sage [2009/01/05(月) 15:46:03 ]
>>110
情報ありがとです。
なぜか{"テーブルに主キーがありません。"}って怒られました。
データベースエクスプローラのテーブルにある奴をダブルクリックしたら構成画面みたいなの出たので
右クリックで「主キーの設定」ってのはやったんですけど・・・
やさしそうな本買って勉強してみます。

264 名前:252 [2009/01/05(月) 16:56:12 ]
>>261-262
ありがとうございます
調べてみます

265 名前:デフォルトの名無しさん mailto:sage [2009/01/05(月) 17:20:31 ]
>>263
主キー(primary key)とは制約(constraint)であり、その列に重複(duplicate)する値を持たないので一意性(ユニーク,unique)がある
つまり主キーから行を特定できる



266 名前:デフォルトの名無しさん mailto:sage [2009/01/05(月) 20:53:41 ]
NUnitを使っているのですが、

テストデータとして予め用意したテストファイル(VS2008のプロジェクトディレクトリ内)を
使う場合、そのパスを取得するいい方法は何でしょうか?

Assembly.GetAssemblyで取得しようとすると、NUnit の GUI runner がshadow copyをしているので
違う一時ディレクトリになってしまい、shadow copyをオフにするとAssemblyにロックがかかってしまい
VSでのビルドができなくなってしまって困っています。

267 名前:デフォルトの名無しさん [2009/01/05(月) 22:49:38 ]
Gifファイルのカラーパレットを変更したいです。
現在はビット深さが8bitで、カラーパレットは2^(7+1)で256色用意してあります。というかこれがデフォルトだと思います。
この状態で、ビット深さは8bitのままで、カラーパレットのエントリーのレングスを2にしたいのですが、

どうやったらいいのかわかりません。お願いいたします。

(目的は、特許庁のインターネット出願ソフトをパスするためです。どうやら、カラーパレットが2でないと
出願ソフトではじかれてしまうようなのです)

268 名前:デフォルトの名無しさん mailto:sage [2009/01/05(月) 23:04:17 ]
意味が分からん
パレットのエントリ数は色深度で決まるもんだろ?
つーか普通に画像処理ソフト使えよと思うわけだが

269 名前:デフォルトの名無しさん [2009/01/05(月) 23:11:38 ]
>>268
>>パレットのエントリ数は色深度で決まるもんだろ?

原則、そうだと思います。ただ、GIFのヘッダーのパックドの2〜4ビット目と、6〜8ビット目を
みるとお分かりの通り、デプスとエントリ数は異なる値に設定できるようになっています。

Universal Document Printerという市販ソフトでモノクロ出力すると、
デプスが8でパレットのエントリ数は2で出力されます。
個人的には、こうするんだったら、デプスが1bitでエントリ数が2という組み合わせで
いいじゃないかとも思うんですが、業界としてデプスは8bitが標準なので
それに倣っているんだな、と勝手に解釈しています。

270 名前:デフォルトの名無しさん [2009/01/05(月) 23:17:30 ]
static public void test()
{
Bitmap bmp = new Bitmap(@"C:\Documents and Settings\stuv\デスクトップ\b1.gif");
Rectangle rect = new Rectangle(0, 0, bmp.Width, bmp.Height);
BitmapData bmpData = bmp.LockBits(rect, ImageLockMode.ReadWrite,bmp.PixelFormat);
IntPtr ptr = bmpData.Scan0; int stride = bmpData.Stride; int bytes = stride * bmp.Height; byte[] index = new byte[bytes];

// Copy the RGB values into the array.
System.Runtime.InteropServices.Marshal.Copy(ptr, index, 0, bytes);

int initX;
for (int y = 0; y <bmp.Height; y++)
{
initX = stride * y;
for (int x = 0; x < bmp.Width; x=x+2)
{
index[initX + x] = 0;
index[initX + x+1] = 1;
}
}
System.Runtime.InteropServices.Marshal.Copy(index, 0, ptr, bytes);
bmp.UnlockBits(bmpData);
Bitmap bmpTemp = new Bitmap(1, 1, PixelFormat.Format1bppIndexed);
ColorPalette pal = bmpTemp.Palette;
pal.Entries[0]=Color.Black;
pal.Entries[1]=Color.White;
bmp.Palette = pal;
bmp.Save(@"C:\Documents and Settings\stuv\デスクトップ\b2.gif", ImageFormat.Gif);
bmp.Dispose();
コンソールです。これよりスマートなのはありますでしょうか。

271 名前:デフォルトの名無しさん [2009/01/06(火) 01:13:23 ]
RowFilterでフィルタをかけている状態で、下記のコマンドをボタンで実行
させていますが、DataGridのフォーカスを手動で変更をしないと
データベースが更新されないのです。
※フォーカスを移動しなくても更新されるようにEndCurrentEdit
メソッドを事前にかけているのですが・・・

---------------------------------
int iRow; //更新したレコード数
this.BindingContext[dbCustomer1, "M_Customer"].EndCurrentEdit();
iRow = oleDbDataAdapter1.Update(dbCustomer1, "M_Customer");
MessageBox.Show("更新 " + iRow + "件");
-----------------------------


272 名前:デフォルトの名無しさん mailto:sage [2009/01/06(火) 11:32:48 ]
ネットワークからのデータを1バイトずつ処理したいので、BufferedStreamを使おうとしたのですが、
BufferedStreamにデータが到着したかどうかを取得できる機能が見つからなくて困っています。
普通にReadByte()すると切断されるかリモートホストからデータが1バイト来るまでブロックしてしまいますし、
LengthやPositionの取得はおろかタイムアウトの設定すらサポートされていません。
1バイトを読むためにいちいちコールバックさせるのも面倒でたまりません。何かいい方法はありませんか?

273 名前:デフォルトの名無しさん mailto:sage [2009/01/06(火) 12:28:03 ]
非同期でやれば

274 名前:デフォルトの名無しさん mailto:sage [2009/01/06(火) 19:12:20 ]
NetworkStream.DataAvailable

275 名前:デフォルトの名無しさん [2009/01/06(火) 19:32:40 ]
64*64の画像をバッファに取り込んで、そこから32*32の範囲を拡大縮小せずに取り出すことはできますか?Rectangleを使うらしいですが、そこから先が分かりません。教えて下さい。

(例)
Bitmap bmp = new Bitmap("test.bmp");
Rectangle rec = new Rectangle(0,0,32,32);
Bitmap result = ??



276 名前:デフォルトの名無しさん mailto:sage [2009/01/06(火) 20:00:40 ]
新しいBitmap作ってGraphics.FromImageで作ったGraphicsにGraphics.DrawImage

277 名前:デフォルトの名無しさん [2009/01/06(火) 20:30:02 ]
>>276
それはここのことを言ってると思いますが、
dobon.net/vb/dotnet/graphics/triming.html

Bitmap img = new Bitmap(@"C:\サンプル.jpg");
//PictureBox1のGraphicsオブジェクトの作成
Graphics g = PictureBox1.CreateGraphics();

//元の画像の(10,10)-(100,100)の部分を切り取って表示する
//座標(0,0)に表示し、単位をピクセルとする
Rectangle rect = new Rectangle(10, 10, 100, 100);
g.DrawImage(img, 0, 0, rect, GraphicsUnit.Pixel);

//Graphicsオブジェクトを破棄
g.Dispose();

これは一部を表示するだけで、私がしたい「別のbitmapまたはimageデータに切り取った画像を入れたい」ことにつながってません。
この点厚かましいお願いとは思いますがよろしくお願いします

278 名前:デフォルトの名無しさん mailto:sage [2009/01/06(火) 20:35:06 ]
言ってない

279 名前:デフォルトの名無しさん mailto:sage [2009/01/06(火) 20:35:46 ]
ぽかーん・・・

280 名前:デフォルトの名無しさん mailto:sage [2009/01/06(火) 20:44:19 ]
>>277
噴いたwwレベル高いなおいwww


まぁ、この程度の事にGraphics持ち出すのは大袈裟だとは思うが、要求仕様は満たしてるな。
MSDN行って、Bitmapクラスのメソッド一覧読んで来い。

281 名前:デフォルトの名無しさん [2009/01/06(火) 21:06:00 ]
Objectとobjectってなにが違うんですか?
(先頭の大文字と小文字)
イベントの引数を書いてると、小文字のobjectが最初に出てきます。


282 名前:デフォルトの名無しさん mailto:sage [2009/01/06(火) 21:06:54 ]
>>281
C# のキーワードと、.NET のオブジェクト

283 名前:デフォルトの名無しさん mailto:sage [2009/01/06(火) 21:07:10 ]
あ、逆ね。object が C# のキーワード。

284 名前:デフォルトの名無しさん mailto:sage [2009/01/06(火) 21:26:50 ]
おまえらはStringとstringどっちで書いてるんだ

285 名前:デフォルトの名無しさん mailto:sage [2009/01/06(火) 21:29:44 ]
宣言はstring



286 名前:デフォルトの名無しさん mailto:sage [2009/01/06(火) 21:30:04 ]
string だなぁ。

287 名前:デフォルトの名無しさん mailto:sage [2009/01/06(火) 21:31:15 ]
Int32

288 名前:デフォルトの名無しさん mailto:sage [2009/01/06(火) 21:31:33 ]
String
VSで型名が水色に統一されるからw
by 素人

289 名前:デフォルトの名無しさん mailto:sage [2009/01/06(火) 21:31:39 ]
静的メソッド呼び出すときだけString

290 名前:デフォルトの名無しさん mailto:sage [2009/01/06(火) 21:53:38 ]
何か水色だと参照型な気がしてしまう

291 名前:デフォルトの名無しさん mailto:sage [2009/01/06(火) 22:04:39 ]
>>289
オマエハオレカ

292 名前:デフォルトの名無しさん mailto:sage [2009/01/06(火) 22:36:47 ]
折角キーワード用意してくれてるんだから全部小文字でいいじゃん

293 名前:デフォルトの名無しさん mailto:sage [2009/01/06(火) 22:39:43 ]
小文字で始まるとJava臭くなるから

294 名前:デフォルトの名無しさん mailto:sage [2009/01/06(火) 23:10:42 ]
String や Object のほうが Java くさい

295 名前:デフォルトの名無しさん mailto:sage [2009/01/06(火) 23:48:50 ]
StringやObjectはVBくさい。



296 名前:デフォルトの名無しさん mailto:sage [2009/01/06(火) 23:53:18 ]
ほにゃらら臭くない命名規則なんてあるのか?

297 名前:デフォルトの名無しさん mailto:sage [2009/01/07(水) 00:03:35 ]
CodeZineで瀬○遥が投稿するたびに
憂鬱になるのは俺だけ?

298 名前:デフォルトの名無しさん mailto:sage [2009/01/07(水) 00:15:38 ]
stringが正解です。

299 名前:デフォルトの名無しさん mailto:sage [2009/01/07(水) 00:19:44 ]
namespace書かない方がusingで指定しなくてもクラス使えて便利だった

300 名前:デフォルトの名無しさん mailto:sage [2009/01/07(水) 01:30:33 ]
教えてください。
TreeViewにあるアイテムを選択し、それをExplorerを使って
あるフォルダへD&Dすることで、そのフォルダにテキストファイルを作成する
ことを考えています。
そのために、D&D先のフォルダのパスを検出する必要があるのですが、
それがどうもわかりません。
QueryContinueDragを使ったほうがいい?とWebにもあるのですが、
そのイベントで得られるイベント引数にはExplorerのパスが含まれていません。

ExplorerからTreeViewへのD&Dは簡単だったのですが・・・

どなたか教えていただけないでしょうか。

301 名前:デフォルトの名無しさん [2009/01/07(水) 09:45:14 ]
>>300

dobon.net/vb/dotnet/control/droptoexplore.html
ここを参考にしてみては?

今どうやろうとしているのかよくわからないんだけど、explorerのパスを取得するの
ではなくて、あらかじめテキストファイルを作成しておいて、ドロップしたいそのファイルの
パスを IDataObject(Dataformats.FileDrop, string[]{パス})として、explorerに通知するん
だと思うが。

302 名前:デフォルトの名無しさん mailto:sage [2009/01/07(水) 09:50:29 ]
>>300
ファイルやディレクトリをエクスプローラへドラッグ&ドロップするには?
www.atmarkit.co.jp/fdotnet/dotnettips/384expdragdrop/expdragdrop.html
エクスプローラへドロップしたタイミングでファイルを作成し、コピーしたい
forums.microsoft.com/msdn-ja/showpost.aspx?postid=1325458&siteid=7

これらを見た感じ、エクスプローラ側のドロップ先パスを調べることは出来ないみたいだね。
エクスプローラへのドロップは、ファイルコピーまたは移動をエクスプローラが主体となって行う。

だからあらかじめ、作成したいファイルをどこか一時的に出力しておいて、
それらのファイルパスをドラッグデータに設定するしかないんでない?

303 名前:デフォルトの名無しさん [2009/01/07(水) 09:55:39 ]
すまん被った。

質問。
XmlSerializerで任意の型が含まれるobject配列をシリアライズしたいのですが、
その為にはXmlSerializerのコンストラクタへ、含まれる可能性のあるTypeを
全て渡しておかなければいけません。
そこで、XmlSerializer生成前にobject配列内の要素を総なめしType一覧を生成して
XmlSerializerに渡しているのですが、これって正しい方法なのでしょうか?

304 名前:デフォルトの名無しさん mailto:sage [2009/01/07(水) 10:11:03 ]
普通は属性で事前に定義しとくもんだろ
デシリアライズ時にどうすんだ

>>300
ドロップ時の動作はドロップ側で行うものだから
基本的にはDataFormats.FileDropとダミーファイル作るしかない。
ダミーを作るのが嫌ならシェル拡張でExplorerのドロップ時動作を書き換えることになる。
が.NET/C#でシェル拡張は止めといたほうがいいというのが定説だな。
Explorer以外のファイラとかだとまず無意味だし。

305 名前:デフォルトの名無しさん mailto:sage [2009/01/07(水) 11:03:46 ]
最近、C#を勉強しはじめたのですが、delegate、event で困惑してしまって・・・。

namespace my_namespace
{
  delegate void my_delegate();

  class my_class
  {
    public event my_delegate MyEvent;

    public void my_func()
    {
      Console.WriteLine("hello");
    }

    static void Main(string[] args)
    {
      my_class oIns = new my_class();

      my_delegate del0 = oIns.my_func; //※1
      my_delegate del1 = new my_delegate(oIns.my_func); //※2
      del0 += oIns.my_func; //※3
      del1 += new my_delegate(oIns.my_func); //※4
              :
    }
  }
}
[質問1]
※1と※2、※3と※4 この2種類の式でどのような違いがあるのかわかりません;;




306 名前:305 mailto:sage [2009/01/07(水) 11:04:38 ]
あと、
"System.Windows.Forms.Buttonクラスインスタンス"の"Clickイベント"へイベントリスナーを登録しようとした際、

  public void MyEventHandler(object sender, System.EventArgs e){ … }
         :
  this.button1.Click = this.MyEventHandler;

と記述すると、
  イベント 'System.Windows.Forms.Control.Click' は += または -= の左側にのみ表示されます。
と、コンパイルエラーが表示されます。

[質問2]
どうして、"="ではリスナーの登録ができないのでしょうか;;

長文ですいません;;。何かお分かりの方、どうぞ、お知恵を…m(_ _)m

307 名前:デフォルトの名無しさん mailto:sage [2009/01/07(水) 11:09:27 ]
> ※1と※2、※3と※4 この2種類の式でどのような違いがあるのかわかりません;;
同じ 型が明らかなので省略可能ってだけ

> どうして、"="ではリスナーの登録ができないのでしょうか;;
eventがそういう仕様(add/removeのみ)だから

308 名前:デフォルトの名無しさん mailto:sage [2009/01/07(水) 11:48:11 ]
> ※1と※2、※3と※4 この2種類の式でどのような違いがあるのかわかりません;;

デリゲートの場合、=を使うとデリゲートがクリアされて新しく格納される
+=つかうと追加になって実行時にマルチキャストされる

イベントは基本的にマルチキャストされるべきなので外部からは+=か-=しかできない仕様になってる
イベントを実装するクラスでは=も可能

309 名前:305 mailto:sage [2009/01/07(水) 11:51:11 ]
>>307
レス、ありがとうございます m(_ _)m

> > どうして、"="ではリスナーの登録ができないのでしょうか;;
> eventがそういう仕様(add/removeのみ)だから
ご回答頂いたとおり、私も最初、「そういうものなんだろうなぁ〜」と思ったのですが、以下のソースでは、問題なくコンパイルが通ります。
※環境ですが、VS2008sp1 .NetFramework3.5sp1 です。

310 名前:305 mailto:sage [2009/01/07(水) 11:52:44 ]
using System;
namespace my_namespace
{
  delegate void my_delegate();

  class my_class
  {
    public event my_delegate MyEvent;

    public void my_func()
    {
      Console.WriteLine("hello");
    }

    static void Main(string[] args)
    {
      my_class oIns = new my_class();

      my_delegate del0 = oIns.my_func;
      my_delegate del1 = new my_delegate(oIns.my_func);

      oIns.MyEvent = oIns.my_func; //※1
      oIns.MyEvent = del0; //※2
      oIns.MyEvent = del1; //※3
    }
  }
}
※1〜3部分がコンパイルエラーにならないんです・・・
なんでだろ;;

311 名前:デフォルトの名無しさん mailto:sage [2009/01/07(水) 11:55:41 ]
同じクラス内だから

312 名前:デフォルトの名無しさん mailto:sage [2009/01/07(水) 11:58:31 ]
>>308でも書いたけど、
外部から=できてしまうということは、他で登録されていたかもしれないイベントを
全部削除できてしまうということになる。
それだからイベントを使う側からは追加か、既知のデリゲートの削除しかできないような仕様はあたりまえっしょ
イベント定義したクラスではすべてのことができる

313 名前:305 mailto:sage [2009/01/07(水) 12:21:16 ]
>>308,311,312
レスありがとうございますm(_ _)m
309-310を書き込んでる間に、308が書かれていたようで;;
大変失礼しましたm(_ _)m
レス頂いた内容でスッキリしました。ありがとうございます。

余談なのですが…
私は、もともと、C→java、そして、C#と勉強?(仕事で使っている)してきたのですが、どうにも、C#はややこしく感じてしまいます…。
うまくいえないのですが、
・vatualやorverrideやnew
・delegateやevent
・struct(これは、アリだとおもいますが…)
といったものは、javaをやっていると、「必要かな?」とおもうような言語仕様のように思えます…
ただただ、ややこしくしているように感じます…
もう、歳なんですかね;;

314 名前:デフォルトの名無しさん mailto:sage [2009/01/07(水) 12:25:59 ]
>>305
.NET1.xまでは※4で書く必要があったが、.NET2.0以降は※3でよくなった。
匿名メソッドやラムダ式への布石だと思う。
>del0 += oIns.my_func; //※3
>del1 += new my_delegate(oIns.my_func); //※4

.NET2.0以降なら※3を使ったほうがよい。最適化してくれることがある。

>>313
単に慣れかと、むしろ
>・struct(これは、アリだとおもいますが…)
この一文に不安を感じる。

315 名前:デフォルトの名無しさん mailto:sage [2009/01/07(水) 12:32:02 ]
CとJavaの間にC++が入ってたらすんなりだったかもな。



316 名前:デフォルトの名無しさん mailto:sage [2009/01/07(水) 12:46:33 ]
DelphiやJ++に手を出してたもので理解は早かった。ヘジたんラブということで(笑

eventは一度add/removeを自分で書いてみると完全に理解できると思う。
java1.1で匿名クラスが出たときの方が理解に時間がかかったな。

317 名前:デフォルトの名無しさん mailto:sage [2009/01/07(水) 13:04:45 ]
overrideはJavaにあるじゃない
overrideはないと困るから追加されたんだよ
あとJavaにはvirtualがないために
メソッド定義にfinalをつけると速度が格段に上がるということが実際にあったんだよ

delegate的なものもそのうち追加されるよ

318 名前:デフォルトの名無しさん mailto:sage [2009/01/07(水) 17:12:22 ]
これからC#勉強するため本を買おうと思っています。
VB, Delphiはそこそこ使えます。
ローカルデータベースでの顧客管理みたいなプログラムを作ろうと思ってるのですが
今まで買って「この本はなかなかお勧めだよ」って本あったらぜひ教えて下さい。
データベースはSQL ServerかAccessがいいのかなって思ってます。

319 名前:デフォルトの名無しさん [2009/01/07(水) 17:36:21 ]
codezine.jp/article/detail/1?p=1
上のサイトを参考に、Plug-inフォルダに入れ込んだDLLをアプリケーションの起動時に読み込むようにしようとしています。
コードもほとんどコピーのはずなのに、何故か実行するとダウンキャストを行う所で例外が発生します。

// 読みだし終わったDLLにあるクラスをインスタンス化
Object obj = asm.CreateInstance(t.FullName); // tFullNameはCountChars.CountChars
Debug.WriteLine(obj.GetType()); // 「CountChars.CountChars」が表示される
CountChars.CountChars plg = (CountChars.CountChars)obj; // ここで型変換したのだが、System.InvalidCastExceptionが発生
// Exceptionが発生したため、以下のコードが実行されません
Debug.WriteLine("Plug-in Run");
plg.Run();
Debug.WriteLine("Plug-in Runed");

正直、何故うまくダウンキャストされないのか理由が思い浮かばないという状況です。
お知恵をお貸しいただけると大変ありがたいです。


320 名前:デフォルトの名無しさん mailto:sage [2009/01/07(水) 17:39:04 ]
C#は上位の名前空間と同名のクラスを認めてないみたいな話じゃないの

321 名前:デフォルトの名無しさん mailto:sage [2009/01/07(水) 17:54:31 ]
プラグインが実装するインターフェイスのアセンブリは、
呼び出し側とプラグイン側で同じものを参照する必要がある。
両方に同じコードをコピーしてそれぞれでコンパイルしてるのではないかな。

322 名前:デフォルトの名無しさん mailto:sage [2009/01/07(水) 17:56:37 ]
俺はC++&PythonからC#入ったら、ほとんど覚えることは無かったな。
最近のGC付き言語はどれも似たような感じだね。

323 名前:319 [2009/01/07(水) 18:34:24 ]
>>321
どうもご返答ありがとうございました
一応あの後頑張った結果

1.インターフェースクラスのみをdllに吐き出す
2.参照の追加、でdllを参照に加える(これは継承したクラスとアプリケーションどちらも)
3.この状態で動的ロードとダウンキャストを行う

で、うまく行きました
ありがとうございました。




324 名前:デフォルトの名無しさん [2009/01/07(水) 20:27:38 ]
>>275
解決しました

325 名前:デフォルトの名無しさん mailto:sage [2009/01/07(水) 20:44:01 ]
Runed・・・ 笑うとこ?



326 名前:デフォルトの名無しさん mailto:sage [2009/01/08(木) 07:59:11 ]
sql serverへの接続プログラムを作っていて不思議に思ったことがありました。

SqlConnectionクラスが保持しているリソースの開放を、
『using + IDisposableインタフェイス』で行いました。
 using (SqlConnection oCon = new SqlConnection("接続文字列"))
 {…処理…}

この時、ふと、
 「SqlConnectionクラスって、IDisposableインタフェイスを実装してるよね?」
と思い、継承関係を追いかけてみると、親クラスであるDbConnectionが、
IDisposableインタフェイスを継承していました。
 「あ〜、ここで継承してるのね。」
 「Disposeメソッドを定義してるのが、SqlConnectionクラスなんだ。」
と思ったのですが、SqlConnectionクラスのDisposeメソッドを見てみると
 protected override void Dispose(bool disposing)
となっていました。
 「あれ? "void Dispose()" じゃないの?」
と思い、引き続き調べてみると、DbConnectionクラスの親クラスである
Componentクラスもまた、IDisposableインタフェイス継承しており、
ComponentクラスにてDisposeメソッドが定義されていました。

ComponentクラスでもIDisposableインタフェイスを継承しており、
Componentクラスを継承しているDbConnectionクラスもまた、IDisposableインタフェイスを
継承していることがとても、不思議でした。
なぜ、DbConnectionクラスでもIDisposableインタフェイスを継承する必要があるのでしょうか?

以上、おサルな私に何かアドバイス頂けたら幸いです。

327 名前:デフォルトの名無しさん mailto:sage [2009/01/08(木) 08:10:18 ]
DbConnectionはDisposeには手を出してないよ
Componentがpublic void Dispose()とprotected virtual void Dispose(bool)を定義
Dispose()およびファイナライザ内でDispose(bool)を呼び出す
DbConnectionは何もしない
SqlConnectionがprotected override void Dispose(bool)をオーバーライド
クラスの解説の定義のとこに出てくるインターフェイスは基底が実装してるのも含めて書かれる

328 名前:326 mailto:sage [2009/01/08(木) 08:26:19 ]
>>327
>クラスの解説の定義のとこに出てくるインターフェイスは基底が実装してるのも含めて書かれる
この1行で全てが解決しました。
目から鱗です。
ありがとうございました。

329 名前:デフォルトの名無しさん mailto:sage [2009/01/08(木) 12:26:05 ]
Objectとobjectって同じもの?Stingとstringって同じもの?


330 名前:デフォルトの名無しさん mailto:sage [2009/01/08(木) 12:54:57 ]
System.Objectとobjectは同じもの
System.Stringとstringは同じもの

331 名前:デフォルトの名無しさん mailto:sage [2009/01/08(木) 12:59:58 ]
global::System.Object とすればさらに正確か

332 名前:デフォルトの名無しさん mailto:sage [2009/01/09(金) 02:34:19 ]
C#やり始めて3年、大体空気するように使えるようになったけれど、F#今初めてどのぐらいでこの域に達するかな・・・
やっぱり日々の仕事で使ってかないと上達しないんだろうな・・・

333 名前:デフォルトの名無しさん [2009/01/09(金) 12:21:41 ]
>>332

プログラミング言語なんてひと月ふた月でフルに立ち上がらないようなやつは
だめだろ 

334 名前:デフォルトの名無しさん mailto:sage [2009/01/09(金) 12:24:23 ]
F#が日々の仕事で使えるわけないがな

335 名前:デフォルトの名無しさん mailto:sage [2009/01/09(金) 13:37:02 ]
>>333
ひと月ふた月でフルに立ち上がるってどんな超人だよw
そんな奴いるんだったらうちで月50万で即雇うよ。
住所と名前教えてくれ。
フルってC#で可能な事なら何頼んでもすぐ完成させてくれるって事だよな?
マジで雇う。



336 名前:デフォルトの名無しさん [2009/01/09(金) 15:06:09 ]
VC#2008EE なんですけど、
コンパイルのたびに前回のコンパイルなどの知識を生かしてPGO(?)、最適化みたいなことって
やっているんですか?

意味不明な質問ですいません

337 名前:デフォルトの名無しさん mailto:sage [2009/01/09(金) 15:11:23 ]
>>335
派遣会社にでも相談したら?
月150万出せば、貴方の言う超人レベルの人が来てくれるよ。

>>336
ただの最適化しかしてくれないよ。
PGOみたいな機能はない。






[ 続きを読む ] / [ 携帯版 ]

前100 次100 最新50 [ このスレをブックマーク! 携帯に送る ] 2chのread.cgiへ
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧]( ´∀`)<126KB

read.cgi ver5.27 [feat.BBS2 +1.6] / e.0.2 (02/09/03) / eucaly.net products.
担当:undef