ふらっとC♯, C#(初 ..
[2ch|▼Menu]
239:223
07/09/08 19:48:34
>>238
いや、だから現在の状態は取得できても元の状態は取得できないんですが・・・

240:デフォルトの名無しさん
07/09/08 19:51:06
なら元の状態を記録しておけよ?

241:223
07/09/08 19:59:41
>>240
とりあえず>>237の前半を読んでもらえないですかね?

242:デフォルトの名無しさん
07/09/08 20:01:08
223はプログラマ向いてないんじゃないか?
なんかネタじゃなさそうだし....

243:デフォルトの名無しさん
07/09/08 20:16:26
ズレてるのは>>238だろ
public void RestoreWindow(Form f) {
 if (f.WindowState == FormWindowState.Minimized) {
  //
 }
}
これをどう書くかって話だろ?
まあ多分ShowWindow使うしかないと思うけど。

244:デフォルトの名無しさん
07/09/08 20:19:11
なんで事前にインスタンスを登録しとく形ではダメなの?

245:デフォルトの名無しさん
07/09/08 20:22:25
きっと「クラス」ライブラリという考え方が理解できないのでしょうw
ライブラリといえばスタティックメソッドのことだと思い込んでるんだよ

246:デフォルトの名無しさん
07/09/08 20:24:05
C#で各プロジェクト共通に使えるクラスを作成して
そのクラスをまとめて格納するフォルダを作りました。
それを別フォルダにあるプロジェクトからそのフォルダにあるクラスを
プロジェクト→既存項目の追加で追加すると同じプロジェクト内の
フォルダへコピーされてしまいました。
やりたい事はコピーでなくその共通フォルダにあるクラスそのものを参照して
共通フォルダのクラスを変更するだけですべてのプロジェクトが修正されている
仕組みにしたいのですがやり方がわかりません。VB6なら汎用モジュールを格納する
フォルダを作りその中のファイルをIDEで追加するとできたのですが・・・
コピーされてしまうと各プロジェクト分同じファイルができてしまい
メンテナンスが大変になりそうなので・・・
どなたか、共通ファイルを複数プロジェクトで共有する方法を教えて下さい。

247:デフォルトの名無しさん
07/09/08 20:27:13
追加するときのファイルダイアログの「追加」ボタンの右の三角をクリック
リンクとして追加(だったかな)を選ぶ

DLLにした方がいいと思うけどね

248:デフォルトの名無しさん
07/09/08 20:28:21
>>246
プロジェクトとリソルーションの区別がついてないと見た。
まずはそれを理解するのが先決だと思う。


249:デフォルトの名無しさん
07/09/08 20:29:56
>>246
共通ファイルをクラスライブラリーにしてそのDLLを各プロジェクトで参照すればいいんじゃね

250:223
07/09/08 20:41:52
>>243
大体そんな感じです。やっぱAPI使うしかないですね。

>>244
API使えばわざわざそういう方式にする必要もないので。

>>245
ライブラリって言葉はまずかったですかね?
でもそれはあくまでも補足で、その前の一行を読めば十分わかると思ったんですけどね。

まあというわけでWin32APIを使うことにします。
どうもありがとうございました。

251:デフォルトの名無しさん
07/09/08 20:42:00
>>246
共通に使えるクラスを集めたプロジェクトを作って
そのプロジェクト自体をソリューションに追加するといいよ
ファイルを直接参照するんじゃなくてDLLができちゃうけど気にするな
DLLの存在は全く意識せずに扱えるようになってるから

252:デフォルトの名無しさん
07/09/08 20:47:40
>>250
馬鹿なくせに頑なお方だねえw

>その前の一行を読めば十分わかると思ったんですけどね。
じゃないよw
何もわかってないのはお前さんの方。

君のような性格の奴はぜったに伸びないよ。

>>251
246が望んでいるのは、恐らく複数の「リソルーション」から同じクラスライブラリを
参照することで、君がいっているようなこととは微妙に違うと思うよ。

253:デフォルトの名無しさん
07/09/08 20:51:11
ごめん

×リソルーション
○ソルーション(ソリューション)

254:251
07/09/08 20:52:55
>>252
>複数の「リソルーション」から同じクラスライブラリを参照すること
いやその意味で言ったんだ
>>251の「そのプロジェクト」は利用側じゃなくて
「共通に使えるクラスを集めたプロジェクト」を指してるつもりだった

255:デフォルトの名無しさん
07/09/08 21:07:43
>>247
回答ありがとうございます。

256:デフォルトの名無しさん
07/09/08 21:24:15
どうみても馬鹿は>>252です。ありがたくない。


257:デフォルトの名無しさん
07/09/08 21:28:35
このスレッドは
「どんなにくだらないC#プログラミングに関する発言でも誰かが優しくレスをしてくれるスレッド」です。

258:デフォルトの名無しさん
07/09/08 21:42:07
>>256
君223か?あるいは>>243?
このレベルのことが理解できなお馬鹿がそんなに多いとも思えない。

まあこれ以上騒がれてももうっとうしいから
一応簡単に223のどこが「馬鹿」か書くことにする。

223は、フォームが最小化される前の状態がわからないからできない、
と言っているがこれは愚かな発言だ。

わからない(不可知)なのではなく、223にわかるようなコードが書けないだけだ。
「わかる」ようなコードを書けよ。

>>257
くだらない質問をするのは問題ないが、無知を認められない頑なさ故に
自ら答えを知ろうとしない人間をなだめすかして手取り足取り教えてやるほど
誰もお人よしじゃないだろ。

259:デフォルトの名無しさん
07/09/08 21:48:37
おまえら、もうほっといてやれよ
これから相手にしたやつも同じくらいバカってことで↓

260:デフォルトの名無しさん
07/09/08 21:54:23
>>258
放置できないんなら君もヽ( ・∀・)人(・∀・ )ノナカーマ

261:デフォルトの名無しさん
07/09/08 22:07:01
つーか
ShowWindow( hWnd, SW_RESTORE );

fm.WindowState= FormWindowState.Normal;
って挙動いっしょじゃないのか?

262:155
07/09/08 22:36:19
>>231
返信遅れてしまってすいません。
元からThreadで回す予定だったので長くとも1分以内に切れてくれるならいいのですが、
いつまで経っても切れないのでメインスレッドに持って来て実験すると案の定
Closeのところでハングしてるんです orz

263:デフォルトの名無しさん
07/09/08 23:58:04
ACSESSをC#からオートメーションで動かしたいのですが
VB6だと
'AccessをVB6でオートメーションで動かす
Public Sub AutoAccess()
Dim objAcc As Access.Application
Set objAcc = CreateObject("Access.Application")

With objAcc
.OpenCurrentDatabase "C:\test\test.mdb"
.DoCmd.OpenQuery "Q_クエリーテスト"
.CloseCurrentDatabase
End With
End Sub

となります。
C#だとどう書けばよろしいのでしょうか?

264:デフォルトの名無しさん
07/09/08 23:59:27
VSTO

265:デフォルトの名無しさん
07/09/09 00:14:26
>>264
VSTOはありません。ACCESS97です。

266:デフォルトの名無しさん
07/09/09 00:31:20
つ Visual C# .NET を使用して Office オートメーション サーバーのウィンドウ ハン…
URLリンク(support.microsoft.com)

267:デフォルトの名無しさん
07/09/09 00:51:55
>263
VB.NETを使って書いて作ったdllをC#から呼ぶ。
Missing.Valueが面倒なんだよねぇ……

268:デフォルトの名無しさん
07/09/09 00:57:53
>>267
Missing.Valueとは何でしょうか?

269:デフォルトの名無しさん
07/09/09 01:32:03
Valueさんがいなくて寂しいわ

270:デフォルトの名無しさん
07/09/09 03:09:44
>>266
具体的なコード例があれば助かるのですが・・・

271:デフォルトの名無しさん
07/09/09 03:17:23
URLリンク(store.yahoo.co.jp)

272:デフォルトの名無しさん
07/09/09 08:41:35
System.Runtime.InteropServices

273:デフォルトの名無しさん
07/09/09 09:56:07
いいかげんしろや
簡単なことだったらググレカス。
キーワード位判るだろ!!!!

c# access オートメーション

URLリンク(support.microsoft.com)

でもな、c#からoffice使うのは勧めない。VB6やVBAからのほうがよい。

274:デフォルトの名無しさん
07/09/09 11:47:55
文字列の
"$実行("hoge",1,"nage")"
を解析して
「$実行」

「"hoge"」「1」「"nage"」
を返してほしいのだがどうすればよいでしょうか?
正規表現でやれると思うけど引数部分が何回繰り返されるかわからないのです。
この引数の部分はobject[]に格納したいです。


275:デフォルトの名無しさん
07/09/09 11:50:27
その前に文字列になってないような…

276:デフォルトの名無しさん
07/09/09 11:55:48
>>274
地道にコード書けば?


277:デフォルトの名無しさん
07/09/09 11:56:21
Match と Group 使いこなせばどうとでもなる
確か @IT に .NET の正規表現講座があったからそれで勉強してみれ

278:デフォルトの名無しさん
07/09/09 11:59:28
正規表現使わないほうが楽なんでないの?

"hoge"に [ , ( ) ]が含まれているかも知れないし。

279:デフォルトの名無しさん
07/09/09 12:01:19
それは面倒ではないが、" のエスケープがあると面倒だな

280:デフォルトの名無しさん
07/09/09 12:12:07
TextFieldParser で超手抜きw


281:デフォルトの名無しさん
07/09/09 12:28:47
なんかC#からExcelとかAccess使うのは
かなり評判が悪いみたいですね
COM開放しわすれて残骸が残るから?
それとも遅いから?
VSTOつかえといっても高いしアレ

おとなしくVSスクリプトでも使ってなさいってこと?

282:デフォルトの名無しさん
07/09/09 12:30:47
追加:Missing.Value面倒

283:デフォルトの名無しさん
07/09/09 13:54:14
初心者です。どなたか教えてください。

interfaceを作って、そのままクラスの中で宣言して使ってる
サンプルソースによく出くわすのですが、
interfaceってクラスで実装して初めて使えるものではないのでしょうか?

たとえば、IShellLinkのサンプルやseasarのオマケでついてくるサンプルなどです。

よろしくお願いします。

284:デフォルトの名無しさん
07/09/09 13:57:30
COM参照のインターフェイスは特別
seasarのおまけとやらは知らん

285:デフォルトの名無しさん
07/09/09 14:00:25
>>283
ちとエスパーしてみるが、
ファクトリが返してきたインスタンスをインターフェイスで受けてるケースのことか?
インターフェイスだけでインスタンスは作れないが、変数(参照の受け皿)は宣言できる。

IABC abc = ABC.Factory();


286:デフォルトの名無しさん
07/09/09 14:13:00
もっと端的に書けばこういうこと。
interface IAbc {}
class Abc : IAbc {}
IAbc abc = new Abc();

287:デフォルトの名無しさん
07/09/09 14:14:03
そのためのインターフェースだしな

288:デフォルトの名無しさん
07/09/09 15:01:23
みなさまありがとうございます。
>>286であれば理解できるのですが、

 class Abc : IAbc {}

にあたる部分が見当たらないのです。

強いていえば、interfaceのはじめに

[ComImport]
[Guid("000214EE-0000-0000-C000-000000000046")]
[InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
internal interface IShellLinkA

メソッドなどの宣言では、
void GetWorkingDirectory( [Out, MarshalAs(UnmanagedType.LPStr)] StringBuilder pszDir, int cch );

みたいに書いてあるのですが。
その後は実装なしにinterfaceの型で変数を宣言してそのまま使ってるように見えます。
>>284さんの言われるように特別な例なのでしょうか?
よろしくお願いします。

289:デフォルトの名無しさん
07/09/09 15:08:07
宣言はそりゃできるわさ。問題は初期化。
CoClass 属性がなけりゃ直接 new はできんはずだが。

ていうかそのサンプルってのはどこにあるのさ?

290:デフォルトの名無しさん
07/09/09 15:16:52
>>288
特別な例なので半年後ぐらいに見直すといいよ。
言語の機能というよりはランタイムライブラリの機能だし。

291:デフォルトの名無しさん
07/09/09 15:23:18
>>289
たしかにコクラスというのがあります!

他サイトへのリンクについて言及していないようなので貼ってみます。
以下のサイトのサンプルです。
URLリンク(smdn.invisiblefulmoon.net)

コクラスについて調べてみましたがさっぱり意味がわかりませんでした。
この機能の目的についてだけでも教えていただけますか?
あとは参考にすればよい本などがあれば・・・

よろしくお願いします。

>>290
半年後ですか・・・なにもせずに半年というわけではなく、
その間、充分勉強してスキルアップしろという意味でしょうね。
真摯に受け止めます。ありがとうございます。

292:デフォルトの名無しさん
07/09/09 15:31:12
COM っていう昔使われてた(今も使われてるけど)異言語間のやり取り用の取り決めがあって、
.NET でその取り決めに従うための特別な記述だ。
まああんまり今は気にするな。結局大して役に立たんし。

293:デフォルトの名無しさん
07/09/09 15:34:15
>>291
>その間、充分勉強してスキルアップしろという意味でしょうね。

まあCOMについて半年も勉強してても飽きると思うが。

COMを知らなくてもC#の勉強はできるし、
普通なら先に知るべきことはたくさんあるので
半年ぐらい忘れてもいいぐらいだと思う。

294:デフォルトの名無しさん
07/09/09 15:37:39
そのページはCOMInteropを自作してるのか(笑)
初心者向きじゃないと思うぞ。
ヒントを言えばShellLinkクラスはCOMオブジェクトそのものじゃなくて、
COMオブジェクトをC#から利用するための中間クラス。
インターフェイスの実装はCOMモジュールの中にあるから安心しろ。

295:291
07/09/09 15:39:36
>>292
今の私には「決まり」としてしか理解できないようです。
おまじないのようなものだと思っておきます。
アドバイスありがとうございました。

>>293
ありがとうございます。
まずはもっとほかの事を勉強してみます。

296:291
07/09/09 15:47:18
>>294
COMってDLLの一種というくらいの認識しかないのですが、
COMが実装してryinterfaceの仕様をCOMをりようするプログラムのほうで
書き直しているのでしょうか?でもinterfaceを書き直しても実装してるプログラムには
影響ないように思えるのですが。

書いててよくわかんなくなってきました・・・

もしよろしければコクラスの機能だけでも教えていただけたらと思います。

よろしくお願いします。

297:デフォルトの名無しさん
07/09/09 16:18:34
>>296
[
  uuid(11219420-1768-11D1-95BE-00609797EA4F),
  helpstring("Shell Link object")
]
coclass ShellLinkObject {
  [default] interface IShellLinkDual;
};

VC++/ATLでCOMサーバーを作れるようになったらも一回挑戦してみろ。
上のIDLが読めないようだと理解は無理。

ちなみにCOMInteropは「参照の追加」「COM」「Microsoft Shell Controls and Automation」で
自動的にDLLにしてくれるからこれを使うのが普通。

298:デフォルトの名無しさん
07/09/09 16:23:03
>>296

ごめん。
COMとは10年以上のつきあいだけどそれでも質問の意味がわかんねぇす。

いわゆる入門書は先にC++の仮想関数テーブルとかIUnknownを説明した上で
その後「coclassとは」みたいな流れを踏むので、
いきなりcoclassだけ説明して下さいってのは無理ってもんだし
かえって遠回りなんじゃないかな。

忠告を無視してまでどうしても知りたければ
この辺の本読んでみるところから初めてみたらいいんじゃない?

URLリンク(www.amazon.co.jp)
URLリンク(www.amazon.co.jp)
URLリンク(www.amazon.co.jp)

C++も分からなければもちろんC++の基礎も勉強と。

そのあと『Essential .NET』と『プログラミングMicrosoft .NET Framework 第2版』
を読破すると。

そこまでやってくれれば、多分ここの書き込み文字数制限程度の分量で
coclassの説明もできると思う。

299:デフォルトの名無しさん
07/09/09 16:24:36
>>297
レスありがとうございます。
VC、ATL、COMサーバー・・・どれひとつマスターしておりません・・・。
でもプログラムとう世界の奥深さは実感できました。
いつか理解できる日を夢見ていろいろ勉強してみます。

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

300:デフォルトの名無しさん
07/09/09 16:30:41
>>298
ただ混乱しているだけの質問をしてご迷惑をおかけしております。

たくさんの書籍の紹介ありがとうございます。
今の私には真に理解できるとは思えませんが、
少しずつでも勉強したいと思っております。

ありがとうございました。

301:デフォルトの名無しさん
07/09/09 18:29:00
>281
解放忘れでオブジェクトの残骸が残ってしまうのはVB.NETでも共通だけど、
やっぱ、単純に書きづらいんだよ。
VBでは省略可能な引数をMissing.Valueで埋めなきゃいけない。
普段全引数を指定とかしないから気づかないけどOfficeのバージョンによって引数の数がさりげなく違うなんてこともある。
これがVB.NETならVB6までと同じように書けるようにできている。
同じことができてもっと楽に扱えるVB.NETがあるのにC#で無理に書かなくてもいいんでない?

302:デフォルトの名無しさん
07/09/09 18:43:36
俺はType.Missingを使ってるけどMissing.Value派のひとも多そうだな。
どっちが推奨なんだろ。

303:デフォルトの名無しさん
07/09/09 18:46:52
> Missing フィールドは、パラメータの既定値を取得するリフレクションによる呼び出しのために使用します。
だから、普通のときは Missing.Value なんじゃね

304:デフォルトの名無しさん
07/09/09 18:49:34
MethodInfo.InvokeでやっちゃってるMSのサンプルを見た覚えがある

305:デフォルトの名無しさん
07/09/09 19:01:19
それはレイトバインドのサンプルだろ多分。


306:304
07/09/09 19:16:06
URLリンク(support.microsoft.com)
ちょっと記憶が違ってたけど見つけた

307:デフォルトの名無しさん
07/09/09 19:18:36
しかしいつ見てもこの oMissing の羅列はありえないよな

308:デフォルトの名無しさん
07/09/09 19:26:04
オーバーロードのソースコード生成するしかないか

309:デフォルトの名無しさん
07/09/09 19:43:09
private object InvokeMethod(object obj, string name, params object[] args){
return oApp.GetType().InvokeMember(name, BindingFlags.Default | BindingFlags.InvokeMethod, null, obj, args);
}
oBook = (Excel._Workbook)InvokeMethod(oBooks, "Open", "c:\\book1.xls");
>>360によると、こうすればmissing付けなくてもいいみたいだよ

310:デフォルトの名無しさん
07/09/09 20:11:34
>302
そもそもインスタンスは1つしかないのでどっちも同じだろ。
Missing.Valueを使ったサンプルの方が圧倒的に多いと思うが。

>309
遅延バインディングだな。

311:デフォルトの名無しさん
07/09/09 21:13:32
VSTO用のプロジェクトを作るとmissingというのが自動生成されていてこれを使えということらしい。
global::System.Object missing = global::System.Type.Missing;

英語のドキュメントをみるとどちらの量もどっこいなのだが、
日本語化されてるドキュメントだとSystem.Refrection.Missing.Valueが多い。

System.Type.MissingのMSDNのリフレクション云々のくだりはVB前提で書かれていて、
VBであってもリフレクションを使う場合はOptionalにはType.Missingが必要になりますの意味。
結局同じものだからどちらでもいいのだろう。MSも混乱してるし。

312:デフォルトの名無しさん
07/09/09 21:30:53
office2007ってXML形式のファイルに対応してるらしいけど
既存のバイナリファイルいじるのでなければ
直接XMLなファイルを生成するプログラムにしたほうが
COMでがんばるよりはるかに楽な気がしまつ
ExcelはCOMつかわないでCSVでがんばってる人も多いと勝手に妄想

313:デフォルトの名無しさん
07/09/09 21:36:00
すみません。
イベントとデリゲートについてよく分かりません。
デリゲートはインスタンス化したもののアドレスを入れるもの(?)
と認識しました。

イベントとデリゲートの関係がよくわからず、イベントがさっぱり分かりません。

どなたか簡単に教えていただけないでしょうか?

変なお願いと思いますが、どうしてもわからなくて。
どうやったらイベントのメソッドに飛んでいくのかが全然わからない
状況です

314:デフォルトの名無しさん
07/09/09 21:47:15
デリゲートはメソッド呼び出し手続きそのものをオブジェクトにすることでほかのオブジェクトとのやり取りに使用できるようにしたもの。
イベントはデリゲートを利用してあるタイミングを通知してもらうための機構。
って言葉で言っても理解できないと思うけど。

・このインスタンスのこのメソッドを呼び出す手続きはこのデリゲートにある。
 これさえあれば元のインスタンスもメソッドも知る必要はない。
てのがデリゲート(とそのデリゲートの実体)。
・このデリゲートを渡しておくから、こういう状況が発生したときに登録した手続きを呼んでくれ。
てのがイベント。
ますます分からんな。

315:デフォルトの名無しさん
07/09/09 21:54:56
マルチキャストデリゲートが事態をややこしくしているのは間違いない。

316:デフォルトの名無しさん
07/09/09 22:03:54
デリゲートは「型」。intとかStringとかclass ほにゃららと一緒。

delegate void Foo();
↑これが class Foo{...} とかと同じ、型の「定義」。

イベントは型の「メンバー」の種類のひとつ。フィールドやメソッド、
プロパティと一緒。

event Foo Bar;
↑これが int Bar() {...} (この場合メソッド)とかと一緒でイベントメンバーの定義。


317:313
07/09/09 22:05:59
>>314
さっそくありがとうございます。確かにまだまだわかりません。
質問させてください

例えばデリゲートA、オブジェクトB、オブジェクトCがあったとして、
オブジェクトB,CにデリゲートAを持たせるということですか?
なんかインターフェースと同じ感じがするんですが、見当違いのこと言ってますか?

>>これさえあれば元のインスタンスもメソッドも知る必要はない。
ということは、何かの手続き(一連の流れ)を実行するものがデリゲート?
ってことですか?


318:デフォルトの名無しさん
07/09/09 22:13:17
じゃあ、メソッドが一つだけのインターフェイスのようなものだといったらわかる?
Javaなんかだといちいち内部クラスでインターフェイスを実装したりしてたけど、
それが面倒だから言語に組み込んだだけ。
イベントはイベントハンドラを登録するメソッドと削除するメソッドを
一つにまとめたプロパティみたいなもの

319:313
07/09/09 22:19:07
>>315
マルチキャストデリゲートですか?
ちょっとくぐってみます。ご指摘ありがとうございます。

>>316
classとintやstringが一緒ですか?
ちょっとこんがらがってきちゃいました。
classについてもう一度調べてみます
ありがとうございます

320:デフォルトの名無しさん
07/09/09 22:30:26
class String (クラス型)
struct Int32 (構造体型)
enum Keys (列挙型)
delegate EventHandler (デリゲート型)
上の二つは今作った言葉だから使わないでね

321:デフォルトの名無しさん
07/09/09 22:31:43
デリゲートは、
ある型の引数を取りある型の戻り値を返すメソッドを
なんでもいいから受け取って(インスタンスメソッドでも
スタティックメソッドでもいい)、それを受け取った側が
好きなタイミング(ボタンが押された時とか)で実行できる仕組み

delegateとeventはほとんと同じものだが、
eventに対しては+=と-=しか出来ない。

class Hoge{
public Action<int> Delegate;
public event Action<int> Event;
}

Hoge hoge = new Hoge();
hoge.Delegate = new Action<int>(...); //ok
hoge.Event = new Action<int>(...); //代入はNG
hoge.Event += new Action<int>(...); //ok
hoge.Event -= new Action<int>(...); //ok
hoge.Delegate += new Action<int>(...); //ok.+=や-=もdelegateでも出来る。

322:デフォルトの名無しさん
07/09/09 22:34:59
> delegateとeventはほとんと同じものだが、
これはねーだろ、折角>>316が解説してくれたのに
delegateとそのインスタンスはこういう場合きっちり言葉を区別しようや

323:313
07/09/09 22:35:29
みなさん、親切にありがとうございます。
ただ私、ただいま頭がパンクしそうです。
一個ずつ整理していますので、レス遅れます。
すみません。


324:313
07/09/09 22:41:08
>>318
そうなると、インターフェースとデリゲートは一緒ということ?
例えばどんな場合にインターフェースでどんな時にデリゲートを使うんでしょうか?


325:デフォルトの名無しさん
07/09/09 22:47:20
しかしdelegateのインスタンスもデリゲートというのだよな

デリゲートの使い方1

public delegate Result Hoge(Arg1 arg1, Arg2 arg2);

こんな感じで引数と戻り値の型を規定する機能

デリゲートの使い方2
規定された型のメソッドを実際に保持するものもデリゲートという

class Foo{
public Hoge Delegate;
public event Hoge Event;
}

//実際のメソッド
Result Method(Arg1 arg1, Arg2 arg2){ ... }

Foo foo = new Foo();
foo.Delegate = new Hoge(Method);
foo.Delegate = Method; //こうでもいい
foo.Event += Method;

326:デフォルトの名無しさん
07/09/09 22:57:52
313じゃないが盛れのバカな頭もパンクしそうでつ
デリゲートの項目だけは何度復習しても理解不能なんだが
↑みてたら理解できそ・・・・・うにもないorz

327:デフォルトの名無しさん
07/09/09 22:59:13
インターフェースとデリゲートは全然違うもの
たとえばあるクラスにHogeという名前のイベントがあったら、イメージとしてはそのクラス内に
add_Hoge(EventHandler value)//valueをhogeに追加するメソッド
remove_Hoge(EventHandler value)//valueをhogeから削除するメソッド
EventHandler hoge //登録されたデリゲートを保持する実体(これ自身もデリゲート)
これらが生成されると考えるといいよ。
クラス外部からのデリゲートの実体へのアクセスを登録と削除のみに制限するのが目的。
実際、addとremoveの処理を完全に自分で定義してしまうこともできて
URLリンク(msdn2.microsoft.com)(VS.80).aspx
プロパティにそっくりなのがわかると思う

328:313
07/09/09 23:00:11
>>325
使い方1はインターフェースのようなもの。
使い方2は実際の処理を+=などで保持するもの。

ということでいいでしょうか?

329:デフォルトの名無しさん
07/09/09 23:00:12
>>313
たぶん具象を知らずに抽象を知ろうとするからわからなくなるんだろうな。
とりあえず第一次接近としては、デリゲートは関数ポインタみたいなもの
だと考えればいいと思う。

つまり、メソッドのメモリ上の位置(アドレス)に関する情報を格納するための
データ型だと、とりあえずは思えばいいと思う。

デリゲート型の変数にはメソッドの位置情報が入っているわけだから、
当然その位置情報を利用してメソッドを呼び出すことも可能なはずだ。

イベントは、何らかの出来事(たとえばユーザーがボタンをクリックしたとき)に
シバかれるデリゲート型のフィールドみたいなものだと思えばいい。

だから「ユーザーがクリックしたときにシバかれる」デリゲートに対して
予めフォームの中の適当なメソッドの位置情報をぶち込んでおいてやれば、
ユーザーがボタンをクリックした時にそのメソッドが呼ばれるというわけだ。

まああくまで第一次接近だからあんまり真に受けてもダメだけど、
概念的な理解としてはこれでいいと思う。

330:313
07/09/09 23:15:26
>>326
私も何度本を読んでみても理解できないのでここに書き込むことにしました。
お互いがんばりましょう。

>>327
これはイベントのことになるんでしょうか?
EventHandler hoge にはadd_Hoge(EventHandler value)で追加された
ものが入っているということでいいですか?

>>329
デリゲートはポインタのようなもので、そこに実行させたい処理を入れる(+=で
複数登録できるんですよね?)
そして、イベントが実行されたら、デリゲートのさすアドレスの処理(↑で登録したもの)
を実行するって感じでいいでしょうか?


331:デフォルトの名無しさん
07/09/09 23:30:57
ボタン押した時実行させたい処理を入れるとか、

List<int> list = new List<int>();
list.Add(1);list.Add(2);list.Add(3);

List<string> strList = list.ConvertAll<string>(IntToString);

string IntToString(int x){
return x.ToString();
}

コレクション全体に実行させたい処理を入れるとか、
使い道はいろいろだ

332:313
07/09/09 23:42:05
自分が理解できない箇所がわかりました!
イベントを登録するときに

delegate 戻り値の型 イベントハンドラの名前(パラメータリスト);

と宣言しますよね。このdelegateが曲者でした。

私の解釈ですが、
デリゲートは様々な処理をあるアドレスに入れておくもの。
イベントは何かされたとき(クリック等)にデリゲートに定義された
処理を行うこと。

というふうに理解しましたが、あってますか?
なんかちょっと違う気がしてきましたが。

333:デフォルトの名無しさん
07/09/09 23:58:37
>>332
実際のところeventを無視してdelegateだけきっちり理解しておけば当面はそれでいいよ。
自分でGUIコントロール作ったりしない限りeventを自分で作ることはないから。

先にdelegateを完璧にしなはれ。

334:デフォルトの名無しさん
07/09/10 00:04:15
デリゲート(のインスタンス)は、単にある特定のメソッドを表している(指している)。
じゃ駄目なのかな?

インスタンスメソッドとスタティックで微妙とかマルチキャストはとかあるけど、
その辺はおいおい理解していけばいいわけで、
まずは、デリゲートとは、なんらかのメソッドを指しているもの。


335:デフォルトの名無しさん
07/09/10 00:21:41
>>332
そうじゃないよ。
だから関数ポインタのようなものだとまずは理解せよ、と言っているじゃないか。

「様々な処理をあるアドレスに入れておく」(これちなみに意味不明だよ)のではなく、
処理のコードが書かれているメモリ上の位置、すなわちアドレス「を」入れておくんだよ。


>>333
>自分でGUIコントロール作ったりしない限りeventを自分で作ることはないから。
これはおかしいというより、完全に認識違いだよ「w

イベントっていうのはGUIにまったく限らない。
典型的には何らかのデバイスの状態が変化したときとかね。

例えばCDドライブを抽象化したクラスがあるとして、
トレーが開かれたときにイベントでそれを通知する、というのは想像しやすいシナリオでしょ。

336:デフォルトの名無しさん
07/09/10 00:25:02
内部のことを言えば、スタティックメソッドを登録した場合はメソッドのポインタ
インスタンスメソッドを登録した場合はメソッドのポインタ+インスタンスのポインタ
をデリゲートは持っている
デリゲートを実行すると、ポインタを辿り、そのインスタンスのそのメソッドを実行する
といった感じ

337:デフォルトの名無しさん
07/09/10 00:38:01
>>332
うん、いやだからdelegateは型だって。もっというと特殊なclass。
ここをまずは押さえよう。とりあえずeventは忘れて。

順番に行こう。まずdelegate型を定義してみる。
internal delegate void Foo();

書き方はクラスとずいぶん違ってみえるけどね。

で、delegateはclassだからclassっぽく使える。

Foo foo = new Foo(HogeMethod);
こんな感じに。Fooクラスの変数fooにFooクラスをnewしてぶちこんでるわけだ。
コンストラクタにメソッドを渡してね。コンストラクタがちょっと特殊なだけだね。

class Hoge {
private Foo foo=null;
}

こうも使える。Foo型のフィールドね。

void Hoge(Foo foo){
//...
}

メソッドのパラメータにも。


338:333
07/09/10 01:39:06
>>335
>これはおかしいというより、完全に認識違いだよ「w

すまん、確かに言うとおりだが、

>トレーが開かれたときにイベントでそれを通知する、というのは想像しやすいシナリオでしょ。

そんなクラスを>>332が作るというのは本当に想像しやすいかw
>>332が「CDドライブを抽象化したクラス」の必要を感じるころには多分イベントで困ることもなかろう。

339:デフォルトの名無しさん
07/09/10 02:03:24
正直どんな場合にせよeventを使おうとは思わないんだよな
delegateだって+=も-=も出来るし、代入して入れ替えることも出来る
+=と-=だけに制限する意味がわからない
タスクトレイが開いた時の動作だって入れ替えたくなる時があると思うんだよな

340:デフォルトの名無しさん
07/09/10 02:12:03
>>339
イベントを通知されるクラスが、他の通知されるクラスを意識しなくていい様にするためじゃね
=で上書きしたら他に通知されるクラスに上書きを通知しなくちゃいけなくなる

341:デフォルトの名無しさん
07/09/10 03:33:56
デリゲートは理解するのに自分も結構苦労たなぁ
>>320が理解できてればなんとなくわかると思う。

>>332補足

internal delegate void Foo();
これでFooと言うデータ型を作った、と考えればいいと思う。
つまり、戻り値がvoidで引数を取らないメソッドを代入できるデータ型。
Fooはデータ型なので、変数を定義するときに使用する

ただ、そもそもデータ型という単語の使い方が間違ってないかすごく不安。誰か教えてorz
int型はデータ型だけど、元をたどれば構造体ってことを考えれば、
C#におけるデータ型の意味は、定義されたもの全般・・・と考えてます






342:デフォルトの名無しさん
07/09/10 03:39:42
ごめんミス
つまり、戻り値がvoidで引数を取らないメソッドを代入できるデータ型。

戻り値がvoidで引数を取らないメソッド(のアドレス)を代入できる変数、を作るデータ型。


343:デフォルトの名無しさん
07/09/10 03:47:26
まあC#も3.0にもなれば、継承やinterfaceを使ってたところは
大部分がdelegateとラムダ式に置き換わると思うから
ここは理解しといて損は無いというか必須になっていくと思うよ

344:313
07/09/10 07:44:08
みなさん、ありがとうございます。

>>335
ポインタだからメモリ上のどこかにアドレスが割り当てられる。ということですよね。
あとはこのアドレスから呼び出す処理をすれば、そのアドレスにある
処理が実行されるってことでいいですか?


>>337
デリゲートは型。
Foo foo = new Foo(HogeMethod);
でFool型のfooをインスタンス化する。
このときにメソッドを引数ととる。
classは引数にint型やstring型をとるが、デリゲートはメソッドを引数にとることができる。


class Hoge {
private Foo foo=null;
}

int i = nullのようにデリゲートにもnullが代入できるってことですよね?
ゆえにデリゲートはclassやint,stringと同じように型になるってことですね?

345:デフォルトの名無しさん
07/09/10 08:30:08
>>344
まずはデリゲートの機能の物理的イメージを持つのが先決だと思う。

多分ここのほかの人が言ってるような「デリゲートは型でイベントはクラスの
メンバで〜」みたいな抽象的な話を聞いても、余計わからなくなるだけ。

>ポインタだからメモリ上のどこかにアドレスが割り当てられる。ということですよね。
>あとはこのアドレスから呼び出す処理をすれば、そのアドレスにある
>処理が実行されるってことでいいですか?

だから、たぶん変に誤解してるよ。
プログラムというのはメモリ上に置かれる、というのはOK?

だから関数(メソッド)というのも当然メモリ上の位置というものを持つはずだ。
関数ポインタという変数は、その関数のメモリ上の位置を格納するための変数だ。

もちろん「関数ポインタ」という変数自身もメモリ上の特定の位置に存在する
わけだが、それはとりあえずデリゲートを理解するためにはどうでもいい。

関数ポインタは関数がメモリ上のどこの位置に存在するかを「知っている」から、
それを利用すれば関数を呼び出すことができるでしょ?

以上のようなイメージを理解することが先決だと思うよ。
ただ、これはあくまでたとえ話であって正確じゃないことを理解しておくことも
一方で重要。

346:デフォルトの名無しさん
07/09/10 11:11:09
すいません。馬鹿みたいな質問ですが、よろしくお願いします。

double result = Math.Cos(1/4);
とした場合、result には 1.0 が入ってしまいます。
私としては 0.999990 がほしいのですが、勝手に四捨五入されてしまいます。
どうしたらよいのでしょうか。

347:デフォルトの名無しさん
07/09/10 11:16:37
URLリンク(www.atmarkit.co.jp)

348:デフォルトの名無しさん
07/09/10 11:23:23
>>347
ありがとうございます。
これみても double は、0.99999 を扱えると思うのですが・・・

349:デフォルトの名無しさん
07/09/10 11:29:30
>>348
1/4がいくつか知ってるか。

350:デフォルトの名無しさん
07/09/10 11:33:28
>>349
すいません間違えました。
double result = Math.Cos(1/30);
です。

351:デフォルトの名無しさん
07/09/10 11:34:29
>>350
そうじゃなくて。
1/30 は整数/整数で答えは整数の 0 だろ
1.0/30 とかでやってみそ

352:デフォルトの名無しさん
07/09/10 11:36:30
>>346
0.999990が四捨五入されて1.0になってると思ってるのなら大間違い

353:デフォルトの名無しさん
07/09/10 11:40:20
>>351-352
大間違いしてました!ありがとうございますm(__)m

354:デフォルトの名無しさん
07/09/10 12:37:40
VBだと/使うと演算結果はオペランドの型によらずdoubleになるのが基本だけど、
これはc#のルールの方がシンプルでむしろ初心者向きに感じるな。

355:313
07/09/10 12:40:30
>>345
ありがとうございます。メモリ上に関数ポインタが割り当てられ、その関数ポインタにはメソッドのアドレスが格納している。
この辺りはOKです。(私の表現は下手ですが)

デリゲートは関数ポインタということでいいですよね?

初めて携帯から書くので見にくかったらすみません

356:デフォルトの名無しさん
07/09/10 12:46:03
>>354
CもC++も、C#と同じだと思ったけど

357:デフォルトの名無しさん
07/09/10 13:09:48
VB
/ 商が実数になる割り算
¥商が整数になる割り算


358:デフォルトの名無しさん
07/09/10 13:51:20
delegateって

typedef void* Foo ≒ delegate void Foo

って覚えたらだめなの?
俺の場合C#が先だったから、関数ポインタは

delegate void Foo ≒ typedef void* Foo

って覚えたんだけど…

359:デフォルトの名無しさん
07/09/10 13:57:44
割ったら切り捨てだろ
少数なんて邪道だぜ

360:デフォルトの名無しさん
07/09/10 14:14:29
>>357
なんか間違ってないか?

361:360
07/09/10 14:32:37
ごめん。勘違い。

362:ガチャピンの外の人 ◆GaTtuN/dqE
07/09/10 18:45:14 BE:254472252-2BP(1300)
すごくいいIDの男発見!!!!!!!!

715 :私事ですが名無しです:2007/09/10(月) 14:27:10 ID:TAkaKazu0
ところで俺のIDを見てくれ こいつをどう思う?



716 :私事ですが名無しです:2007/09/10(月) 14:44:34 ID:R76+t3Z/0
すごく・・・いいです


717 :私事ですが名無しです:2007/09/10(月) 14:44:45 ID:H/zeEu5e0
記念かきこw

スレリンク(news7板)


363:デフォルトの名無しさん
07/09/10 19:33:29
コピペ君って馬鹿だな、まで読んだ。

364:デフォルトの名無しさん
07/09/10 20:41:09
>>358
スレチなんで適当に答えるが関数ポインタ間違ってるぞ
あとインスタンスメソッドの場合のポインタはもう一息いる

まあdelegateありがたがりやがれという話だ

365:デフォルトの名無しさん
07/09/10 22:38:02
ラムダ式が中心になったら脱落者続出だなあ

366:313
07/09/10 22:43:33
今また調べていたんですけど、どうもデリゲートの使い方というか、
どのタイミングで使うかがいまいちピンときません。

あるデリゲートを個々のクラスで定義して、様々なメソッドから呼び出す
ため?ということでしょうか?
またバカな質問してる気がしますが。


367:デフォルトの名無しさん
07/09/10 22:44:27
>>365
中心ってなんだろうねw

368:デフォルトの名無しさん
07/09/10 22:46:39
>>366
ぴんと来ないなら使う必要なし。
必要になったら使え。

369:デフォルトの名無しさん
07/09/10 22:49:09
>>367
いったいなんだろうねw

370:デフォルトの名無しさん
07/09/10 22:49:26
>>366
とりあえずはイベントハンドラとしてだけ使っとけばいいだろ

371:デフォルトの名無しさん
07/09/10 22:59:18
>>366
@ITの記事は読んだ?
URLリンク(www.atmarkit.co.jp)

あと、川俣のc#入門は?
URLリンク(www.atmarkit.co.jp)

とりあえずこれ読んでからだな。タダで読めるんだし。

372:313
07/09/10 23:22:10
>>368
仕事で、外部の人が作ったものを私がUpdateすることになったんです。
C#使える人がこの会社にいないんで。。。

>>371
参考URLありがとうございます。
私はいつも下のHPを見ていました。

URLリンク(ufcpp.net)
URLリンク(www.kumei.ne.jp)

教えていただいたHPで勉強して出直します。
ありがとうございました

373:デフォルトの名無しさん
07/09/10 23:36:23
川俣かよ

374:デフォルトの名無しさん
07/09/10 23:37:14
前任者がどこで使ってたかソース見ればなんとなくわかるんじゃないか?

375:デフォルトの名無しさん
07/09/10 23:42:53
>>373
人物はアレだが書いてることは別におかしくないだろw
というか、読んでみると結構わかりやすくていい記事だぞ

376:デフォルトの名無しさん
07/09/11 00:56:19
interfaceのメソッド実装するとき、直入力が面倒なんですが、
インテリセンスを効かせる方法ってありますか?


377:デフォルトの名無しさん
07/09/11 01:01:03
ああ、Eclipseのアレみたいなのか
それ自分も知りたかった

378:デフォルトの名無しさん
07/09/11 01:21:23
>>376
class Hoge : IHage
のIHageにマウスのせるでてくるやつじゃなくて?

379:デフォルトの名無しさん
07/09/11 01:35:12
あー、そこから右クリックでメニューでますね
メソッド名途中入力とかの線しか考えてなかったので目から鱗です。
これでちょっと楽になりそうです。ありがとうございました。

380:デフォルトの名無しさん
07/09/11 01:37:19
なるほど
俺からもありがとう

381:デフォルトの名無しさん
07/09/11 04:30:07
私はJava経験者ですが、今C#を勉強中で分からないことがあるので質問です。

親クラスのメソッドを上書きするとき、Javaでは常にオーバーライドですが、
C#ではnewによって新しいメソッドとして定義する方法と、
overrideによってオーバーライドする方法があるじゃないですか。
この2つのうち、newでやる方法の価値が分からなく、教えてもらいたいです。
ちなみに、実装時のnewとoverrideの違いは把握してます。

今の私の考えでは、全部overrideでいいのでは?と思うし、
むしろnewなど無い方がよいとさえ思っています。


382:デフォルトの名無しさん
07/09/11 05:24:51
ベースクラス実装者が想定していないオーバーライドを許可すべき
ではないかつ継承先のことを考えながらコード書くことのほうが少ない
かつvirtualメソッドのほうが高コストとかもろもろ

newがよく使われているのは経験上staticメソッドが重複する場合、
コンポーネントメンバの属性値の変更、COMインポートなインターフェイス、
内部的にはもうちょいあったかな

383:381
07/09/11 07:50:32
>>382
>ベースクラス実装者が想定していないオーバーライドを許可すべき
>ではないかつ継承先のことを考えながらコード書くことのほうが少ない

でもそれって、virtualにしなければいいというだけの事ですよね。
オーバーライドされたくないなら、そのシグネチャのメソッドは
「子クラスでは実装禁止!」でいいじゃないですか?
何であえて、newとか使って再定義できるようにしてるのかが、
分からないんです。

ちなみに、何でnewを悪者扱いするかというと、例えば
クラスBはクラスAを継承してて、
さらに、AのhogeメソッドをBクラスがnewで書き換えてるとして、
--------------------
A a = new B();
a.hoge();
--------------------
この場合実行されるhoge()はAの実装の方ですよね?
それってつまり、親クラスの型に子クラスのインスタンスを代入するという事が
安全じゃないって事だと思います。メソッドの引数や戻り値に関しても同じで、
作ったインスタンスは、その型のままにしておけという事になります。

そうなると、引数や戻り値に親クラスを指定できなくなり、
汎用性を持たせられなくなってしまいます。
私がnewに否定的な理由はこれですね。

ちなみに、staticメソッドの場合はいいと思うんですよ、
staticはあくまでもその「型」にくっついているわけだし。

と、長く書いてしまいましたが、よろしくお願いします
もし、前提知識がそもそも間違っているとかありましたら、すいません。。

384:デフォルトの名無しさん
07/09/11 08:19:30
>>383
あのね、そんな馬鹿でも分かる例あげる前に俺があげた例調べた?
BCLで標準的に使われているものや経験上必要だったものを挙げたんだが
聞く気がないんなら帰ってくれ

あとJavaやってたらしいから前段はvirtualがデフォじゃない説明だから
わかってるなら読み飛ばして。


385:デフォルトの名無しさん
07/09/11 08:24:58
そんなの調べろっていわれても困るでしょ
そんな能力あったらこんなスレで質問しねえよw
間違ってるか?

>>383
むしろAの型の変数に入っていれば安心してAとして扱えることを
保障するための仕組みじゃないの?

386:デフォルトの名無しさん
07/09/11 08:38:45
>>385
なら〜ってなんですか?って聞けよ

こっちが挙げてみたら分かりきってる講釈たれてそれに反応なし、
同意だけ求めてるのが透けて見えるだけの確証バイアス野郎じゃねーか

387:デフォルトの名無しさん
07/09/11 08:46:18
>>381はただしいよ

終了

388:デフォルトの名無しさん
07/09/11 09:04:39
>>381
>この場合実行されるhoge()はAの実装の方ですよね?
それでいいんじゃん。わざわざAの参照で宣言してるんだから、欲しいのは
Aの規約に則った実装でしょ。なんでAとは無関係の実装であることを
newで明治したメソッドが派生型で定義できると困るの?

ちゅーかnewって、派生型で既に定義されているシグネチャが
あとから基底型で定義されてしまった場合に、派生型を前提とした
コードへの影響を最小限に抑えるための一時しのぎって印象なんだけど。

389:デフォルトの名無しさん
07/09/11 10:14:52
派生クラスとたまたまシグネチャが被るインターフェイスのメソッドを実装したいときとか
インターフェイスの明示的実装というのもあるけど、それだとインターフェイスのメソッドの方が隠れちゃうから
どうしてもインターフェイスのメソッドの方を見せたいとき
そんな場合本当にあるのか知らんけどw


次ページ
最新レス表示
スレッドの検索
類似スレ一覧
話題のニュース
おまかせリスト
▼オプションを表示
暇つぶし2ch

4619日前に更新/255 KB
担当:undef