ふらっとC#,C♯,C#(初心者用) Part23
1 :
デフォルトの名無しさん :
2008/01/11(金) 15:41:00 このスレッドは
「どんなにくだらないC#プログラミングに関する発言でも誰かが優しくレスをしてくれるスレッド」です。
ほかのスレッドでは恐ろしくて書き込めないような低レベル、もしくは質問者自身なんだか意味がよく分からない質問など、
勇気をもって書き込んでください。
内容に応じて、他スレ・他板へ行くことを勧められる、あるいは誘導される場合がありますがご了承下さい。
ふらっとC#,C♯,C#(初心者用) Part22
http://pc11.2ch.net/test/read.cgi/tech/1197802312/
なかなかよろしいスレタイでございますね
お聞きしたいのですが ブラウザ(IE)上に表示されたテキストボックスからテキスト取得ってできるんですかね? サイトはJAVAアプレットで書かれているものです 参考サイト、ググるキーワードなどあればご教示下さい 宜しくお願いします
>>5 まともな方法じゃ無理、やれたとしてもC#の範疇じゃないからWin32スレにでもど〜ぞ。
>>6 そうですか・・・。
ではWin32スレに行ってきます。
ありがとうございました
C#のお勉強で小物のスクリプトをC#でリプレースしてるんですが IDEでプロジェクト作ってというのはちょっと大げさです。 軽めでC#のメソッドの補完をしてくれるテキストエディタってないですか?
新しいプロジェクトから空のプロジェクトを作って自分でソースコードを追加すればいいんじゃない。
VSのインテリセンス触ってみては? たぶんC#やるんならVSが一番いいと思うけど
VC#なしのC#なんて存在価値無いよ
Properties.Settings.Default.hogehoge の値を初期状態にしてデバッグ開始する方法ってないの?
やれば?
コアルータの切り替え失敗したんだね…
Visual C# 2005 Express Editionでアプリケーションを作っているのですが、 こいつのデータベースマネージャからでも、ソースコードからでもよいので MySQLサーバにアクセスしたいと考えております ぐぐってみたのですが、VC#2005EEではMSSQLかアクセスしか選べないと書いてあるところもありました やっぱフリーではアクセスできないんでしょうか?
>>16 ここ初心者スレなんだしもうちょっと丁寧に書いてあげれば?
自分で書けよ^^;
20 :
15 :2008/01/12(土) 01:53:31
>>16 の方が教えてくれたツール?をインストールしました。
けどこのあと結局どうやって接続していいかわかりません
VSのデータベースマネージャとかからできるのかーとか思っていますが・・・
>>20 >ソースコードからでもよいので
>VSのデータベースマネージャとかからできるのかーとか思っていますが・・・
どっちだよw
「Visual C# 2005 Express MySQL」、「C# MySQL」でググってみた?
前者はアドイン、後者は接続方法が先頭付近にあるよ?
ExpressはMS公式のアドイン以外使えないんじゃなかった?
今練習でデータベースを扱うプログラムを組んでいるのですが ADO.netデータアダプターを利用した
24 :
23 :2008/01/12(土) 10:58:44
済みません・・・・改めて 今練習でデータベースを扱うプログラムを組んでいるのですが da.update(dt); でデータのアップデートをする場合 トランザクションは自動的に内部処理されて エラーはロールバックされると考えていいのでしょうか? それとも確実に行うにはすべて手動で設定していった方が良いのでしょうか?
>>21 ぐぐってみました
前者のアドインは有料なのね・・・
後者の接続方法でやってみます
もっと簡単に接続できればいいんだけどなー
ODBC使う手もあるけどな まあMySQL Connector/Netあたりでいいべ
VSからMySQLQueryBrowserみたいなGUI環境で接続できればいいのにね
有料のにはあるみたいだけどな
>>24 トランザクションは使われていない。
System.Data.Common.DbTransactionか
System.Transactions.TransactionScopeを合わせて使う。
C# + VS2005 ExpressでのWindowsフォームアプリケーションの 開発に関してお聞きしたいのですが、フォーム(Form)上にテキストボックス(TextBox) が配置されていて、あるタイミングでクラス(Woker)のメソッド(Method)を呼び出します。 この時、UIをフリーズさせないようにMethodはデリゲートとBeginInvokeを使用した 非同期呼び出しで呼び出され、処理終了後にコールバック(MethodDoneEvent)を使用してTextBoxに 取得した内容を表示します。 Methodでは「任意のWebサーバにHTTPで接続しファイルをダウンロードしてくる」 といった処理が行われているのですが、その際Methodの中で 1.通信の準備 2.Webサーバへの接続 3.ヘッダの取得 4.ファイルの取得 5.通信の後始末 と5つのステップの処理が行われています。 この時1〜5の処理の実行と結果を、逐一Form上のTextBoxに表示したいのですが MethodDoneEventが呼ばれる時には既に5までの処理が完了しているので リアルタイム表示にはなりません。 1〜5までの処理をリアルタイムでTextBoxに表示させたい場合、1〜5の各処理を分割し それぞれを非同期呼び出し・コールバックからの結果取得・反映を行う必要があるのでしょうか? それとも他に呼出元のFormに対して情報を通知する手段は存在するのでしょうか? 単純にWorkerにFormのインスタンスを保持させて、Method内で直接Form上のTextBoxを更新させれば 早いのですが.NET Frameworkの設計で「フォームメソッド以外にフォームの要素を変更させるのは好ましくない」 といった感じのことを聞いた事があるので・・・・
「フォームメソッド」をInvokeすりゃいいんじゃね? BackgroundWorker使って その度にReportProgressでProgressChangedイベント起こせば簡単だけど
>>31-32 即レスありがとう御座います!
BackgroundWorker・・・こんな便利なものがあったんですね・・・
早速使ってみたいと思います
知識が及ばず、検索用のキーワードだけでも良いので教えてもらいたいです。 ファイルをコピーするユーティリティを作ってみていたのですが、少ないファイルなら良いのですが それが大量だったり大容量だったりするとすごく時間がかかってしまいます。 それとファイルのコピー中はフォーム上のボタンやラベル等々はenable=falseとして操作できないようにしています。 それで肝心のエラーなのですが、同じ処理をさせても出てくれませんorz 確かポンプだとかメッセージがないとか長時間だかとかといった具合の言葉があったのは覚えています。 なのでこういった時間のかかる処理をするときの作法というかベターな方法みたいのはないでしょうか?
ryの使い方を再認識した
36 :
34 :2008/01/12(土) 20:00:34
すいません、何度かチャレンジしてたら出せました マネージ デバッグ アシスタント 'ContextSwitchDeadlock' では '(ファイルへのパス)' に問題を検出しました。 追加情報: CLR は、COM コンテキスト 0x1b08b8 から COM コンテキスト 0x1b0a28 へ 60 秒で移行できませんでした。ターゲット コンテキストおよびアパートメントを所有するスレッドが、 ポンプしない待機を行っているか、Windows のメッセージを表示しないで非常に長い実行操作を処理しているかのどちらかです。この状態は通常、パフォーマンスを低下させたり、 アプリケーションが応答していない状態および増え続けるメモリ使用を導く可能性があります。この問題を回避するには、すべての Single Thread Apartment (STA) のスレッドが、 CoWaitForMultipleHandles のようなポンプする待機プリミティブを使用するか、長い実行操作中に定期的にメッセージをポンプしなければなりません。 こいつです、警告っぽいです
ネタじゃないの? >それで肝心のエラーなのですが、 突然話が出てくるんだな。 話の上の部分書き忘れたのか、ゆとりなのか?
メッセージポンプが滞る様な何かをしてるんだろうけど 何をしたくて 何をしたら 何が起きたのか をちゃんと書けよ
スレッド作って時間がかかる処理を実行させればいいんじゃないの
40 :
34 :2008/01/12(土) 20:07:50
>>37 ええっとどこが突然なのか・・質問の原因を前におけということなら質問の原因がわからないので後に置きました
それで、という接続詞の話ならば間違いなく正しいです、1つ意味を進める意味合いです
知識が及ばず、検索用のキーワードだけでも良いので教えてもらいたいです。 (なにをしたら) ファイルをコピーするユーティリティを作ってみていたのですが、少ないファイルなら良いのですが それが大量だったり大容量だったりするとすごく時間がかかってしまいます。 それとファイルのコピー中はフォーム上のボタンやラベル等々はenable=falseとして操作できないようにしています。 (なにがおきた(+後述)) それで肝心のエラーなのですが、同じ処理をさせても出てくれませんorz 確かポンプだとかメッセージがないとか長時間だかとかといった具合の言葉があったのは覚えています。 (なにをしたくて) なのでこういった時間のかかる処理をするときの作法というかベターな方法みたいのはないでしょうか? こうしてやらないとわからないか
エラーが出るとか書いてないのに いきなりエラーの説明されても・・・ どこで出たエラーなんだ?
>>41 肝心のエラーとか言われても、それまでにエラーの話なんて一言もないじゃないか。
煽るやつ荒らすやつに一々反応しないでくれ
わかんないけど上のレスを見る限りFormで長い処理をやらせるときは BackgroundWorkerを使えばいいみたいだな
こうやってタコは成長していくんだな いきなりMSDNなんて引いちゃだめだ
47 :
37 :2008/01/12(土) 20:31:36
嵐じゃないよ。アホは放置するというのなら
>>34 を放置しろ。
内容を適当に書き換えてやろうか?
どこが変わったか読んでみ。
ファイルをコピーするユーティリティを作ったのですが、大量のファイルや大容量のファイルを
コピーすると処理にかなり時間がかかって、途中でエラーが出ます。
それで肝心のエラーなのですが、同じ処理をさせても出たり出なかったりしますorz
内容は(中略)
こういった時間のかかる処理をするベターな方法はないでしょうか?
わたしって〜じゃないですか〜
>>47 > 内容は(中略)
> 内容は(中略)
> 内容は(中略)
> 内容は(中略)
C#でユニークID、親のユニークID、表示用のラベルを持ったDataTableを ListVewにバインドしてツリーを作る方法ありますかね やっぱコード書いてツリー作るしかない?
かちゅーしゃだとスレタイが化けるのはおれだけ? IEその他だとなんともない 「ふらっとC#@`C♯@`C#(初心者用) Part23」 となっている
ありゃ書き込んだらカキコはまともに見える "," が@と`になる
回答は(後略)
PictureBox上でToolTipを表示するのに マウスカーソルの位置でメッセージ内容を変えてます Popupイベントでメッセージを変えてるんだけど ただ、これだどPictureBoxの中でマウスカーソルが移動した場合に ToolTipが再度表示されなくて悩んでます 同じコントロール上でマウスカーソルを移動したときに ToolTipを再表示する設定ってできますか?
親フォーム(クラス Form1)で、BackgroundWorkerのbgwを作り裏で処理をさせています。 また、Form1から子フォーム(クラス FormOption)を呼び出せるようになっています。 ここで子フォームのボタン(btnOK)を押されたときに、裏処理を中断させたいんですが、どうしたらいいでしょうか。。。 親フォームからだったらクラスが同じなのでbgw.CancelAsync();で良いと思うんですが、クラスが違うので使えません・・・ //まだクラスとかインスタンスとかの概念がよく理解してないのが問題だと思います(´・ω・) //とりあえず似たようなケースで、異なるクラス間で変数いじったりするならstaticにすればいいってことは分かったんですが・・・
子フォームがShowDialogなら、返値みて判断。 Showでキャンセルした時に閉じるなら、子フォームにIsCancelledプロパティ用意して子フォームのClosedイベントでチェック。 一般的には子フォームにCancelledイベントを作ってキャンセルボタン押されたら発生、親フォームはイベントにキャンセル処理を設定。
別々のクラスオブジェクトのメソッドから共通のログファイルに書き出ししたい場合は どのようにすればよろしいのでしょうか?
外部のライブラリを使わない方法を教えていただけませんか
>>57 自分でやる。定番のルーチンだと思うけど。
以前の領域かどうか判別して、同じなら何もしない。
違ったらtoolTip.Active をいったんfalse にしといてSetToolTip設定、
Active をtrueに。
>>62 ユーティリティクラスの静的メソッドで書けばよかろうもん
TextBoxに対して、Ctrl+Vとかのショートカットを送る方法ってありますか? 右クリックメニューに独自処理を追加したいけど難しそうなので、独自処理+標準のコピーペーストとかをもつ メニューを作りたいと思っています。
まあ困ったらWeb検索するより先にMSDN/ヘルプを見ろってことだな
>>60 普通にTraceかTraceSource使えば?
tabControlに貼り付けたtoolStripが、勝手に移動したり、visible=falseになったりして困っています。 GripStyle=hiddenです。 ロックかけてもお構いなし。なにか良い回避策ありませんか? C# 2008 Express Editionです。
コンボボックスの値を取得したいのですが Itemには、No1〜No5までの5つの文字があって ComBoBoxのテキストには(選択してください) という文字列が入っています この時、プルダウンメニューからアイテムを選択しなかった時は ComboBox.Textには(選択してください)が入ってしまうのでしょうか? またアイテムが選択されてる状態の時は、ComboBox.Textで取得できるのでしょうか?
(´・ω・`)しらんがな
そんなもん実験すりゃいいだろうが
配列の巡回を持った言語ならC#に限らない話だと思うのですが、 foreach中に配列の要素を消したい時、一番スマートなやり方としてはどんな物が有るでしょうか? どうしてもforeachが2回以上必要な気がします。 プログラミングがうまい人ならもっとマシな方法をしていませんでしょうか? 下に目的の代換えソースを書いてみました。 //あまり綺麗では無いと思う例--- /* 「予期しない動作を防ぐため、コレクション内容の変更には使用しないでください。」という制限の為 削除する要素へのキーを別途用意した配列に入れてその配列を"又"foreachしています。 */ foreach(OBJ val in table) { if (val.needDel) delArray.Add(val.key); } foreach(key key in delArray) // { table.Remove(key) } delArray.Clear()
前スレでさんざん水掛け論やってたな確か
そうだな。 元がListBoxだったのにそれそっちのけでなんやかややってたなw
OBJとかkeyとかなぜか先頭小文字のneedDelとかvarと紛らわしいvalとか 名前ばっかり気になるw
Smalltalk風ですな
つうかあの時の奴と全く同じミスをしとる。
>>75 アイテムで削除すると同じキーが複数存在した場合にうまくいかんぞ。
foreachは消すためには使えない そもそも配列はAddもRemoveもできない
あらしや釣りでは無いです。 >76 >78 前スレ見てきました。 C#では ToList().ForEach(index => listBox1.Items.RemoveAt(index) ); あたりが使えそうですね。 これはつまり匿名メソッド? >79 >80 borland (Pascal?)から来ました。 var,valとalignはテキストエディタで色分けしています。
なんで素直にRemoveAll()じゃあかんの? たしかにあのメソッド名は大変紛らわしいが、アイテムごとに条件を見て 削除するという目的にまさにぴったりなんだが。
>>75 for (i = list.Count - 1; i >= 0; i--)
{
if (...)
{
list.RemoveAt(i);
}
}
こんな感じかな。
86 :
85 :2008/01/13(日) 17:42:13
しまった。RemoveAll()を忘れてた。
>>75 の言う配列というのがList<T>のことならRemoveAll一択
前スレから見に戻って良かったです。前スレではRemoveAll()出てないし。 ヘルプが2割も理解できてませんが、List<T>::RemoveAllが良いのですね? Delegateを返す関数を作ってvalueに入れる?? どうでも良い話。自分が一昔前にborlandつかってた頃のソースは小文字のみでした。 何処で聞いたんだっけな?
AddやRemoveが使えてるから、配列じゃなくてList<T>なんだろうな。 table.RemoveAll(x => x.needDel) といったところか
>89 ありがとう。 まとまりました。
91 :
デフォルトの名無しさん :2008/01/13(日) 18:17:25
List<T>の各要素に対して、削除と、削除とは別の処理を、1つのループで行うにはどうすればいいの?
RemoveAllかなんかで削除してからその他の処理をすれば?
RemoveAll厨必死杉
94 :
デフォルトの名無しさん :2008/01/13(日) 18:28:59
List<T>の各要素に対して、削除と、削除とは別の処理を、1つのforeachで行うにはどうすればいいの?
forを使うといい
namber?
cgiの仕様だそうだからそっとしといてやれ。
XPの音量のプロパティのうちWaveとかの特定のものを操作したいのですが .NETのライブラリを探してもないようです。 Win32APIを使うしかないのでしょうか?
うん まあちょっと検索すりゃC#ラッパとかすぐ見つかるだろうけど
101 :
58 :2008/01/13(日) 20:57:10
>>59 あ・・・ShowDialogって値返してたんですね(´・ω・)戻り値見る方法ですんなり解決しました。ありがとうこざいました。
ウインドウを表示するにはどうすればいいのでしょうか?
>>102 Form.Show();
とかってことじゃなくて?もうちょっと具体的に言ってもらえればアドバイスもしやすいと思うよ
ShowWindow( HWND, int )
105 :
デフォルトの名無しさん :2008/01/13(日) 23:07:42
すいません。 C# 2005 Express Editionを使っているのですが、 フォームのAcceptButtonに設定されているボタンの クリックイベントをキャンセルするには、 どうしたらよいのでしょうか? private void buttonOK_Click(object sender, EventArgs e) { if (エラーチェック) { エラーならキャンセル } 以下略 というようなことがやりたいのですが、 フォームのAcceptButtonに設定されているため、 ウィンドウが消えてしまいます。 AcceptButtonに設定するのをあきらめるしかないのでしょうか?
うん。
VB6.0のフォームデザイナみたいにフォームに点が表示されて コントロールが配置しやすくなる設定はできないんでしょうか?
109 :
デフォルトの名無しさん :2008/01/13(日) 23:41:20
いろんなサンプル見て調べながら、 public void myReceive (){ remoteEP = null; udp.BeginReceive(new AsyncCallback(ReceiveCallback), null); } private void ReceiveCallback (IAsyncResult ar){ byte[] ReceivedBytes = udp.EndReceive(ar, ref remoteEP); } udpはUDPClient型 remoteEPはIPEndPoint型 こんなかんじでバックグラウンドでUDPの受信待機&受信をするコードを書いてみたんですが、受信待機状態を中断するにはどうしたらいいんでしょうか・・・良い感じのメソッドとかも見つからなくて困ってます。。。
110 :
デフォルトの名無しさん :2008/01/13(日) 23:42:40
>>108 ツール→オプション→Windowsフォームデザイナ→レイアウト設定でできました
112 :
デフォルトの名無しさん :2008/01/14(月) 08:02:02
Windows2003R2 x64のWndProcにNM_CUSTOMDRAWが飛んでこないんですが、なんで? x86を明示してビルドすると動くのですが
>>112 64bit環境ではIntPtrが64ビットになるから、これが影響してないか?
あるバイナリファイルの100万バイト目から10バイトだけデータが欲しいのですが、 こういう時でも律儀に100万バイト分のデータを読み込まないと取得できないのですか?
116 :
114 :2008/01/14(月) 15:46:15
>>115 BaseStream.Seek()メソッドを利用することで取得できました
ありがとうございました
File.Copyメソッドについて質問です。 このメソッドを利用して、色々とコピーしてみていると、たまにエラーが出ます。 アクセス権の問題だったりするのですが、例えば File.Copy(From, To); このFromを読み込み可能に、Toを読み書き可能にする、というのは無理なんでしょうか?
質問の意味がよく分かりませんが。。。 そんな質問してると「日本語でおk」って書かれちゃうと思うぞw
119 :
117 :2008/01/14(月) 17:04:24
えっと、こうかけばよかった File.Copy(From,To); この時、FromとToのアクセス権の設定の問題でエラーが出るのを回避したいです。 どうすれば良いでしょうか?
エラーが出ないようにチェックしてからコピーすればいいじゃまいか。 それともアクセス権を回避して無理やり書き込みたいってことか?
無視しようと思えば無視して横車を押せるようなアクセス権なら そんなものに意味などないと思うんですが間違ってるでしょうか……
無理にというより、設定し直してやりたいです
>>122 同じことだと思いますが……
設定して「無理に」横車を押したい、と
アクセス権がないのにアクセス権を変える権利はあるのかよ。 どう考えても設定間違ってるだろw
それを言ったらPCの存在を否定してそうですが…… 設定を変えるのは無理そうですね、ファイルアクセス権に限ってというよりファイルアクセス権だからなのかな 世のバックアップソフトは一体どうなってるんだろう
126 :
デフォルトの名無しさん :2008/01/14(月) 17:16:29
ふらっとなのにあげあしとりしか存在しないのかね それも反応早いし、このスレもういらないだろ正直
前スレで「フォームの内容を保存」がどうのと騒いでた人ですが、 なるほど。拡張子がいかなるものであろうと、テキストファイルやHTMLファイルみたいな テキスト主体のデータをファイルに保存するにはテキスト形式で書き出し、 画像ファイルや音楽、動画ファイルといったデータを保存するにはバイナリ形式で書き出せば良かったのですね。 あとは書き出したい内容を然る場所に書けば、と。 その節は大変お騒がせして、お恥ずかしい(*^ ^*; (報告したかっただけなので、流してくださって構いません)
>>126 揚げ足取りってw
俺はそうは思わないけど、君がそう思うのなら自分の言葉に責任持てよ。
つまり揚げ足取りではない(繰り返すけど揚げ足とってるつもりないぞ)、
真面目な回答をぜひ頼むよ。
それとも自分棚上げ野郎なのか君は。
円の描画でつまづいています。 円の内側は塗りつぶしができるのですが, 円の外側を塗りつぶしたい時はどうしたらいいでしょうか
>>125 アクセス権の存在意義について考えろ。
アクセス権をオーバーライドできたらアクセス権の意味がないだろ。
バックアップソフトは普通はアドミン権限で実行する。
>>129 円の形でクリッピングして塗りつぶせばいいんじゃね?
>>130 様
解決しました。
ありがとうございます。
勉強になりました。
コントロールでkeydownを所得するとき 個々のkyedownイベントでとる方法とPreviewKeyDownのどちらが良いのでしょうか? ふつうにkeydownで所得できるようなイベントの時はどっちでも同じ?
所得ってなんだ…
スクロールのついているフォーム全体をキャプチャを目的に, スクロールを操作してキャプチャを試みています。 コントロールを指定して画像を取得することができたのですが スクロールは制御すらできません。 なにかよい助言をしていただけませんか?
>>133 また揚げ足かよ!と思ったら、その上も所得と書いてる・・・
たぶん132はガチでずっと、取得を所得と思って使ってきたんだろねw
>>132 2.0以降なら、PreviewKeyDownで取得すべき。
KeyDownは発生しないキーがある(IsInputKeyプロパティで発生可になるけど)
>>126 揚げ足を取られるのは、アホな質問をした場合に限られる。
まともな質問であればまともな回答が返ってくる。
とられた場合はまずは自分がアホなことを言っていないかを振り返ってみよう。
137 :
134 :2008/01/14(月) 21:19:13
どなたかおわかりになりませんか? いろいろ調べてみましたが,具体的にどのようにしたらいいのか さっぱり分かりませんでした。
WM_SCROLL投げたら?
Formの背景色だけを半透明にする方法はないでしょうか? Opacityオプションで半透明にすると、Form上のLabelなどの文字やButtonまで半透明になってしまいます。
>>139 TransparencyKeyでは完全に透明になってしまうのですが…
背景色をマゼンタにでもしとけば?
zlib(RFC1950)で圧縮されたファイルを解凍したいんだけど、C#だけでできる? DeflateStream はRFC1951、GZipStream はRFC1952を使ってるらしくてうまく解凍できない。 他にzlibに関わるクラスも見当たらないし、もしかしてC#じゃできない?
正式な方法が用意されてるかどうかは知らないけど CでできるんだったらC#でもDllImport使えばできる
C#でも自分でプログラム書けばできる
携帯からなんでURLは書けないが、Sourceforgeにzlib.netとかいうプロジェクトがある
147 :
109 :2008/01/14(月) 23:18:31
良かったらどなたか
>>109 もお願いします(´・ω・)
受信待機状態を中断…もう少し具体的に
149 :
109 :2008/01/15(火) 00:09:52
>>148 ありがとうございます。
具体的には、ボタンが押された時にポートを解放(?)してudpを破棄したいということです。
実装としては
udp=new UdpClient(port);としているんですが、ユーザの入力でポートを変更することも出来るようにしたいんです。
とりあえず今日いろいろ考えた末、
ポートを変更するときに呼ばれるメソッドを
public void ChangePort () {
udp.Close();
udp = new UdpClient(port);
myReceive;
}
として、無理矢理破棄して、ReceiveCallback内をtry〜catchで起こった例外を全て無視するようにして一応動いたんですが、あまりにも邪道すぎる気がします。。。
>>149 いやもそれでほぼオケじゃね?
例外を全て無視じゃなくて外からClose()された時の例外だけ無視するようにすれば。
151 :
109 :2008/01/15(火) 00:36:04
>>109 あ゛・・・
これでよかったんですね。例外は基本的に全て処理するべきなのかなぁって思い込みがありました(´・ω・)
とりあえずArgumentExceptionと、タイミングによってはObjectDisposedExceptionがスローされるみたいなんで、これらを無視するようにしておきました。
ありがとうございました。
C#のことでなく.NET Frameworkのことですれ違いなんだけど、
C#で文法のことはいいとしてライブラリのことが知りたいんだけど
いい情報源教えてください。
http://dobon.net/ は読みました。
とりあえず
プログラミングMicrosoft .NET Framework 第2版 (マイクロソフト公式解説書) (単行本)
は買ってみようと思います、
よろしくお願いします。
アンマネージドなリソースについてなんですが、やり直し等の機能でいつ解放 したらいいかわからないものが出てきた(ファイルとか)ので、ゴミ箱クラス作って そこで一括管理しようと思ったのですが、対象となる変数の参照カウンタって 取得できないのでしょうか? やっぱり自分で皮をかぶせるしかないですかね?
何が言いたいのかよく分からんが、 LRのガーベジコレクタは参照カウント方式じゃないぞ
s/LR/CLR/;
>>155 ありゃ、そうなんですか… orz
今ざっと調べたところ、Finalize()を積んでおけばGCが勝手に実行
してくれるみたいなんですが、どうしてもDispose出来ないときは
それでいいんですかね?
GC される前にランタイムが落ちるとか、結構ありそうだけどな。 ところで 「やり直し等の機能」 って何?
>>157 アンマネージリソースを扱うなら、必ず適切なタイミングで
Disposeを呼ぶような設計しなきゃ駄目だよ。
細かい話が多いので割愛するけど、
ファイナライザに頼るスタイルは色々問題があるのヨ。
ぶっちゃけマネージドな世界では、例えばC++において参照カウンタ式スマートポインタで
自動化できてたリソース管理の一部は使えなくなると思っていた方が良いかと。
VBの参考書で勉強しているのですが Label1.Text = DirectCast(Me.PreviousPage.FindControl( _ "TextBox1"), TextBox).Text をC#で書くにはどうしたらいいですか?
自己解決しましたm(_ _)m
>>158 ペイントなどに良くあるやり直し・元に戻す操作です。
>>159 やっぱり自前でDisposeしなきゃだめなんですね…
ちょっと基本設計見直してきます orz
Form1とForm2を定義して Form1内で Form2 f2 = new Form2(); f2.ShowDialog(); でForm2を呼び出した後にf2内のbutton_Clickイベント処理内でf2の中のテキストボックスや、コンボボックスの値をForm1で取得したいのですが どうしたらよいでしょうか?
Form2がイベント公開してf2内のbutton_Clickイベントハンドラ内でfire イベントデリゲート自分で定義してテキストやコンボボックスの値をEventArgsにつっこむか またはプロパティで公開しとく
fireってなんでしょうか?ぐぐってもよくわかんないです・・・
イベントを起こす、ってことじゃね? //Form2.cs public event EventHandler HogeEvent; private void button_Click( object sender, EventArgs e ) { if( this.HogeEvent != nul ) this.HogeEvent( this, EventArgs.Empty ); // ← ココ } ------------------------------------------- //Form1.cs ... Form2 f2 = new Form2(); f2.HogeEvent += new EventHandler( f2_HogeEvent ); ... private void f2_HogeEvent( object sender, EventArgs e ) { //ココが呼ばれる }
>>f2.HogeEvent += new EventHandler( f2_HogeEvent ); これは何をしているのでしょうか? form1では private void button_add_Click(object sender, EventArgs e) { Addition add = new Addition(); add.ShowDialog(); } でform2(Addition)を呼び出し、手動で、form2内のテキストエリアやコンボボックスに入力してOKボタンを押す そのとき、したのイベントに遷移して、このメソッド内で、form1内のデータグリッドを更新できないか?ということなんですが。 private void button_OK_Click(object sender, EventArgs e) { }
(´・ω・`)しらんがな
恥をしのんで質問いたします。 初めてコンソールアプリを作ろうとしているのですが、 エクスプローラーからコマンドプロンプトにディレクトリパスをD&Dで使わせようと思っています。 そのとき、長いフォルダ名を含む場合、絶対パスを表す文字列がダブルクォーテーションで囲まれてしまいます。 そのため、"入力文字列補正処理"を入れるようにしましたが、なんだかスッキリしません。 皆様どうやってやってますか? 以下にソースを書きます。宜しくお願いいたします。
170 :
169 :2008/01/15(火) 19:04:04
static void Main(string[] args) { string[] str; //検証用変数 string Input, Output; //フォルダパス Console.WriteLine("入力フォルダパスを入力して下さい"); //入力文字列補正 str = Console.ReadLine().Split(new char[] {'\"'}); if (str.Length == 3) { Input = str[1]; } else { Input = str[0]; } Console.WriteLine("出力フォルダパスを入力して下さい"); //入力文字列補正 str = Console.ReadLine().Split(new char[] { '\"' }); if (str.Length == 3) { Output = str[1]; } else { Output = str[0]; } if (Directory.Exists(Input) & Directory.Exists(Output)) { Console.WriteLine("valid"); Console.ReadLine(); } else { Console.WriteLine("invalid"); Console.ReadLine(); } }
>>167 form2でセットするんじゃなくて、form2はセットさせたい項目をpublicなプロパティで返すようにする
form1でDialogResultをチェックしてform2のプロパティからセットするのが正解
Trim(char[])
>>167 個人で作ってるだけでプロパティ作るのが面倒くさかったら、
form2の該当の入力フィールド(textBoxとか)のModifiersをPublicにするのも手だけど
>>171 丁寧にありがとうございます。
>>セットさせたい項目をpublicなプロパティで返すようにする
というのがいまいちわかりません。
ソース載せます。
//form1(Main)
public partial class Main : Form
{
public Main(){
InitializeComponent();
}
private void button_add_Click(object sender, EventArgs e) {
Addition add = new Addition();
add.ShowDialog();
}
}
//form2(Additon)
public partial class Addition : Form
{
public Addition() {
InitializeComponent();
}
private void button_OK_Click(object sender, EventArgs e) {
//MessageBox.Show(textBox_name.Text+"\n"+ comboBox1.Text+"\n"+textBox1.Text);
}
}
public partial class Addition : Form { public string 結果 { return textBox_name.Text+"\n"+ comboBox1.Text+"\n"+textBox1.Text; } }
>>173 publicにしたら、Form1.csの補完機能からform2のコントロールが見えました!
ありがとうございます!
177 :
175 :2008/01/15(火) 19:25:16
ミス public string 結果 { get { return textBox_name.Text+"\n"+ comboBox1.Text+"\n"+textBox1.Text; } }
はじめまして。 まことに簡単な質問で恐縮なのですが、DataGridViewのculomnsのプロパティで オートインクリメントをしたい列があるのですが、どうすればよいでしょうか? よろしくお願いいたします。
>>169 ただファイルを開くとかくらいなら、
ダブルクォーテーションがあっても問題なかった気がするけど。
>>169 dos窓でドロップやったことないのか?
スペース含むパス取り込むためにデフォルトで""囲みになるのが普通だよー
問題あるならTrimでもすりゃいいんでは?
C#でExcelを操作しようと調べているんですが、断片的な 情報しか見つける事ができませんでした。 何か参考になる本やサイトなど知っていたら紹介して貰えませんか?
COM Excel C# でググるとか
185 :
169 :2008/01/16(水) 13:21:32
>>180 そうだと思ったんですが、パスを変数に格納した後にフォルダの存在確認を
>>170 の下の方で
行っているんですが、""つきのパスだと存在しないよって言われちゃうんですよ。
>>182 調べてみます
つか、D&Dできるの始めて知ったぜ。いつもいちいちコピペしてた。
Vistaでできないな、、、XPをリモートデスクトップで出してみたらこっちではD&Dできるが・・・
188 :
デフォルトの名無しさん :2008/01/16(水) 14:38:39
VS2005でC#の勉強をしています。 質問なのですが、テキストファイルに 1 200 2 356 3 1250 4 870 5 692 といったような行列があり、それをC#のプログラムで読み込み 1000以上の値を持つものだけピックアップすることはできるでしょうか。 ピックアップした後に計算もしたいので、変数にその値を代入したいのです。 よろしくお願いします。
StreamReaderとかで開いて ReadLineして パースすればいい
var hoge = from line in File.ReadAllLines(@"...") from str in line.Split(' ') let value = Int32.Parse(str) where value >= 1000 select value;
VS2005や言うてるやろスカタン
192 :
169 :2008/01/16(水) 15:46:16
>>188 StreamReader sr = new StreamReader(filepath);
List<int[]> list = new List<int[]>();
do
{
string str = sr.ReadLine();
if (str != "")
{
string[] ary = str.Split(new char[] { ' ' });
int n1 = int.Parse(ary[0]);
int n2 = int.Parse(ary[1]);
if (n2 > 999)
{
list.Add(new int[] { n1, n2 });
}
}
}
while (sr.Peek() != -1);
193 :
169 :2008/01/16(水) 15:51:20
どうやら手動で削除するほかなさそうですね。 splitを使って面倒なことをしてましたが、 Trim(もしくはReplaceでも可)を使って少しコードがすっきりしました。 ありがとうございました。 Console.WriteLine("入力フォルダパスを入力して下さい"); Input = Console.ReadLine().Trim(new char[] { '\"' }); Console.WriteLine("出力フォルダパスを入力して下さい"); Output = Console.ReadLine().Trim(new char[] { '\"' }); if (Directory.Exists(Input) & Directory.Exists(Output)) { Console.WriteLine("valid"); Console.ReadLine(); } else { Console.WriteLine("入力したフォルダパスが不正です"); Console.ReadLine(); }
オマイラそれ絶対なんか間違ってるだろwww
195 :
デフォルトの名無しさん :2008/01/16(水) 21:20:34
すみません、教えてください。 VS2005 .netでプログラムしていますが、HOMEPATHの取得法はあるのでしょうか? もしあるならば方法をご教授ください。 よろしくお願いします
994 名前:デフォルトの名無しさん[sage] 投稿日:2008/01/11(金) 12:14:20 Environment.GetEnvironmentVariable( "HOMEPATH" );
\r\n と \n の差がわからないんだが どっちも改行するわけだが動違うの?
おおまかにはOSによって改行コードが違う。 Unix:\n Windows:\r\n Mac:\r ってか基本だと思うけど。
>>199 トンクス
Cとかだと\nが改行だから\r\nって何かと思ってたんだが
Windowsなら\r\nでいいってことでつね
>>200 Cは、テキストモードだと、\nは\r\nに変換される。(winでは)
202 :
デフォルトの名無しさん :2008/01/16(水) 21:52:10
>>200 どうでもいい話ではあるんだが意味的に言うとWinがたぶん正しい
なのでhttpとかも\r\n。この辺はCRとLFを調べてみれ
むかしタイプライターというものがあってのう
LFだけってのはおかしいと思う。
それ言ったらCRだけなのもおかしい
CRってキャリッジリターンなのは聞いたことあるけど、LFってなんて言うの? ラインフィニッシュ?
ラインフィード
CR=キャリッジリターン=キャリッジ(紙を左右に動かす装置)を初期位置に戻すこと。 LF=ラインフィード=紙送り。
210 :
デフォルトの名無しさん :2008/01/17(木) 00:53:22
C#相談室から誘導されてきました。 たとえば、こういうコードがあったとします。 if (Result == null) { transaction.Rollback(); MessageBox.Show("エラー0です。"); return false; } if ((int)Result == 1) { transaction.Rollback(); MessageBox.Show("エラー1です。"); return false; } if ((int)Result == 2) { transaction.Rollback(); MessageBox.Show("エラー2です。"); return false; } transaction.Commit(); return true; これをスッキリ表記するのに何かいい手段はないですかねぇ…。 throwで例外起こしてtry〜catchってのもスッキリしなくて…
211 :
デフォルトの名無しさん :2008/01/17(木) 01:08:54
C#でLispみたいなカッコイイプログラミングするにはどうすればいいの?
F#をダウンロードします
そして卵を御飯にかけます
>>210 result = (Result == null) ? 0 : (int)Result;
switch(result){
case 0:
case 1:
case 2:
transaction.Rollback();
string temp = "エラー" + result + "です。";
MessageBox.Show(temp);
return false;
break;
default:
transaction.Commit();
return true;
break;
}
215 :
デフォルトの名無しさん :2008/01/17(木) 01:39:34
xmlファイルをphpのsimple xmlみたいに簡単に扱える方法はないのでしょうか?
C#のswitchのcaseは絶対に下に降りられないと思ってたが、何も書かなければ並べられるのか。 しかし不必要なbreakを強要されるのが面倒くさいな。 Cの文法に慣れてる人がバグを作らないようにってことなのかな。
returnの下のbreakいらんだろ
いらん以前に到達できないコードな警告出たりしないかそれ確か
219 :
デフォルトの名無しさん :2008/01/17(木) 13:16:16
構造体のマーシャリングについて質問いいっすか?
自分よく分かってないんですが
typedef struct tagDESKBANDINFO {
DWORD dwMask;
POINTL ptMinSize;
POINTL ptMaxSize;
POINTL ptIntegral;
POINTL ptActual;
WCHAR wszTitle[256];
DWORD dwModeFlags;
COLORREF crBkgnd;
} DESKBANDINFO;
の WCHAR wszTitle[256];って
[StructLayout(LayoutKind.Sequential,CharSet=CharSet.Unicode)]
にした上で
[MarshalAs(UnmanagedType.ByValTStr, SizeConst=256)]
string wszTitle;
じゃないんですか?
http://www.pinvoke.net/default.aspx/Structures/DESKBANDINFO.html とかだと255になってるんですがどっちが正しいんでしょう?
試してみたがbreakいらんな
223 :
219 :2008/01/17(木) 13:25:09
>>222 ありがとうございます。
まじすか。
PInvoke.netのまま使ってると2バイトずつ上にずれてるってことですか?
224 :
219 :2008/01/17(木) 13:30:11
ありゃMarshal.SizeOfを見たらどっちも同じ さらにワケワカメ アラインとかPackとかのせいですか? ということは実害なし?
225 :
デフォルトの名無しさん :2008/01/17(木) 18:06:12
GTKについてわからないところがあるのですが、詳しい方いらっしゃいますか?
>>225 C#でGTKといったらMono?
Monoスレに行かないといないかもしれない。
227 :
デフォルトの名無しさん :2008/01/17(木) 18:11:31
そうですか…行ってみます。 すみません、ありがとうございました。
228 :
デフォルトの名無しさん :2008/01/18(金) 01:31:53
VC#2008関連の書籍って出ないの?
229 :
210 :2008/01/18(金) 02:17:47
>214 ありがとうございます。 これで試してみます。
230 :
デフォルトの名無しさん :2008/01/18(金) 03:32:28
C#でxmlファイルをphpのsimple xmlみたいに簡単に扱える方法はないのでしょうか?
visual studio 2005を使ってます。 pictureboxに表示する画像のリソースを指定するときは this***.Image = Properties.Resources.abc; のようにしますが(というかVSが勝手にやってくれますが) これを文字列型の変数を使ってやることはできないでしょうか? string TMP; TMP = "abc"; として5行目と同じように指定したいのです。
リフレクション使えばできると思うが、やるほどの価値はないと思う。
ResourceManager.GetObject使えばできるけど厳密な型指定できないよ
何をしたいのかを書けば、もっといい解決法があるかもよ
>>232 >>234 リソース名が連続した英数字なので、for文で数十の文字列の配列を作ったんですが、それをリソース名の指定に使う方法が分からなくて・・・
手動でやるよりはるかに効率的だと思うので、できればさわりだけでも簡単に教えてもらえればと
>>233 では、結局出来ないということになるんでしょうか・・・?
Properties.Resources.abc;の実装がどうなってるかみなよ。
238 :
188 :2008/01/18(金) 11:19:39
遅くなりましたが無事解決しました! ありがとうございました。
byte[] b1 = new byte[] {1,2,3,4}; byte[] b2 = new byte[] {1,2,3,4}; があったとして、2つの配列の内容が全て等しいか簡単に調べる方法ってないですか? b1 == b2; も b1.Equals(b2); もfalseになります(´・ω・) やっぱいちいちforeachで回さないとダメですか?
うむ Array.Equals は object.Equals と変わらんからな
ぶ、C# 配列 比較 で検索したらすぐ見つかりました。 出来ないみたいですねorz お騒がせしました。
継承クラスで共通のメソッド実行時 親クラスで共通の処理をさせたいのですがどうすればいいでしょうか うまく説明できないんですがポリモーフィズム的なメソッドの共通処理を 継承クラスでは意識せずに親で処理させたいのですが・・・
//親 virtual void Hoge() { ... } //子 override void Hoge() { ... base.Hoge(); } じゃあかんのん?
>>243 やっぱりそうなりますかね
base.Hoge()の処理は必ずして欲しいのに
base.Hoge();を付け忘れちゃったりするものですから
Hoge は virtual じゃなくして、HogeOverridable を virtual にして Hoge のなかで HogeOverridable を呼ぶ ただし派生クラスで基底クラスの処理の呼び出す位置を変更できないデメリットもある
246 :
231 :2008/01/18(金) 19:49:57
Image img = (Image)Properties.Resources.ResourceManager.GetObject( "hoge" );
248 :
デフォルトの名無しさん :2008/01/18(金) 23:19:52
VS2008を使っていますが、 FormのFormClosingイベントを捕らえて フォームを閉じることを中止するにはどうすればいいのでしょうか? 以下のように書いてもだめでした。 private void MainForm_FormClosing(object sender, FormClosingEventArgs e) { DialogResult result = MessageBox.Show("変更を保存しますか?", "確認", MessageBoxButtons.YesNoCancel, MessageBoxIcon.Question); if (result == DialogResult.Yes) { this.menuSaveProject_Click(sender, e); } else if (result == DialogResult.Cancel) { return; // ←これ } } よろしくお願いいたします。
引数調べれ
e.Cansel = true; とやればいいようですね(´・ω・`) 今までeなんて無視してました ありがとうございました
ていうかイベントの解説に書いてるよな
IPAddress[] addrs; があったとして、 この中から特定のIPの項目だけ削除ってどうすればいいんでしょうか。 InteliSenseで見てると addrs.Except(); とかそれっぽいのはあるんですが、いまいち使い方がわかりません・・・
配列は要素の削除とかできないので作り直し Array.FindAll でもいける
254 :
252 :2008/01/19(土) 01:08:38
>>253 ありがとうございます。やっぱり作り直ししかないんですね(´・ω・)
でもFindAllのおかげでさっくりいきました。
ありがとうございました。
List<IPAddress>でいけー
Listって要素の削除は向いてないんじゃない?
ほえ?
(^ω^;)⊃ アウアウ!! ⊂ミ⊃ ) / ヽ
またRemoveAll()の流れなのか・・・
末尾以外の削除は遅いと思うんだけど、大丈夫なわけ?
>>263 実装に因る
てか少なくとも配列を使うのよりは高性能に作られているとうれしい(ビクンビクン
要素の削除と挿入をやるならLinkedListでしょ? ランダムアクセスできないけど。
>>266 > ランダムアクセスできないけど。
それが答えだ。
それは削除にむいてないんじゃなくて、 ランダムアクセスにむいてないだけ。
ある時点のList<T>の内容を配列か何かに保存しておき、その内容に戻すということをしたいのですが、 インスタンスを変えたくない場合は、Clearして一つずつAddし直すしかないのでしょうか?
要するに、コストの問題だ。 データを参照するより削除と挿入の方が多いならLinkedList だろうし、 頭からforeachしたりインデクスでアクセスする必要があるならList。 目的に応じて使い分ければ済むという当たり前のことだろ。
271 :
269 :2008/01/19(土) 10:02:53
>>269 AddRangeってのが目に入っていませんでした。
ClearしてAddRangeが正解でしょうか。
273 :
252 :2008/01/19(土) 10:40:42
これは・・・荒らしちゃったかも(・ω・`) なんかごめんなさいです。 配列っていろいろ考えとかないといけないんですね。要素もすくないし、参照より削除や挿入が多いと思うんで、LinkList使ってみようかなと思います。ググってみます。ありがとうございました。
274 :
252 :2008/01/19(土) 10:43:27
LinkedListですね、すいません(汗
HashSetが合いそうだよなあと確かに話を聞いていて思ったが 要素数少なそうとも思ったのでむしろListでいい気もしたので 言わなかった
>>245 すみませんあれからいろいろやってみたのですが
class kitei
{
public void Hoge()
{
基底の処理;
派生Hoge呼び出し;
}
}
class hasei : kitei {
public virtual void Hoge()
{
派生の処理;
}
}
ということ感じになるのでしょうか
基底からの派生hogeのやり方がわからず詰まってしまいました
基底にvirtualなメソッドを一つ増やせ
>>278 共通でない処理を切り分けてvirtualメソッドを作って
基底で
public void Hoge()
{
基底の処理;
HogeSub();
}
public virtual void HogeSub()
{
}
という風にせよということでしょうか。
メソッド一つで自動的に裏で共通処理できたらいいなーと思ったんですが
使用者が何をするのか明示的に指示するのが正解か
>>279 >メソッド一つで自動的に裏で共通処理できたらいいなー
良くないだろ怖いよそんなのw
っていうか、チミは普通に継承の意味が分かってないだけとちゃうんかと
>>280 確かにそのとおりなんですよね…
派生を多人数が使うときにちゃんと規定どおりに使ってくれない場合があるもんで
もう強制自動処理にならんかなーと思った次第です…
>>281 テンプレートメソッド的な工夫ではダメなの?
つまりテンプレートメソッドから呼び出されるメソッドの方をabstractなりvirtualに
すればよくない?
>>282 具体的に言うとちょっと極端な例ですが
データ入力して保存するという共通処理で
親
public void ClickSaveButton() {
入力チェック()
データ保存()
ログ出力()
}
abstract void 入力チェック()
abstract void データ保存()
abstract void ログ出力()
とやるとabstractなんでそれぞれの実装は一応してくれんるんだが
セーブボタンを押したときClickSaveButtonを呼び出して欲しいのに
データ保存()だけ入れるやつとかいるんですよ
284 :
283 :2008/01/19(土) 16:12:27
最初の話とずれてますね… 親 public void ClickSaveButton() { 入力チェック() データ保存() ログ出力() } abstract void 入力チェック() abstract void データ保存() private void ログ出力() //共通処理 いい子 セーブボタン_Click { ClickSaveButton() } だめな子 セーブボタン_Click { データ保存() } セーブボタン_Click { 入力チェック() データ保存() }
もはや最初と別の話になってるような気がするんですが。。
>>284 まあどうしてもということなら、その例ならSaveButtonClickedイベントを持つ
インターフェイスをコンストラクタに取るようにする、みたいな姑息な
対策はできるんじゃない?
>>285 自分でもよんでもよくわからない例でした・・・
つまり共通処理とabstractな派生の処理を組み合わせたテンプレートメソッドを
作ったんだがテンプレートメソッドを使わないで処理するやつがいるのです。
だからabstractなメソッド一つで共通も派生処理も出来たらなーと思ったのです
て、あーもうだめです日本語でおkです…
セーブボタン_Click が ClickSaveButton() を呼び出すと決まっているなら 基底クラスでそう定義しておけばいいんじゃないのか?
289 :
283 :2008/01/19(土) 17:25:35
>>286 なるほどイベントを使うというのもいいですね
>>288 派生では実装無しですか、それだとすっきりですね
この方式が一番スマートな気がします
派生クラスでオーバーライドさせるためのメソッドはprotectedにしとくもんだよ
284のセーブボタン_Clickは、みんな親クラスのメソッドなのでは?
292 :
デフォルトの名無しさん :2008/01/19(土) 19:02:51
class Base{ void method(){・・・} ・・・ } class Derived : Base{ void method(){・・・} void method2(){・・・} ・・・ } で、 Base obj = new Derived(); obj.method(); とできるのはなぜ? これじゃobj.method2()とできないから Derived obj = new Base(); obj.method(); と書くべきじゃないですか?
おまえは何を言ってるんだ
>>290 そうでしたか…勉強になります
>>291 そうななってしまいますね…そしてそれだも問題なしとなる…
ボタンクリック以外にも場合によってセーブ処理を走らせる必要がある場合の対応と読み替えてください…
>>293 DerivedよりBaseの方が持ってる情報が少ないのに
型になるのはおかしいということです
Base obj = new Derived();
と書いたら、Derivedのメンバでアクセスできないものがでてきてしまいませんか?
>>292 多態化から勉強し直せ。
Derivedじゃない他のBaseから派生したクラスを同じ流れで取り扱えるようにだよ。
ちなみにvirtualとoverrideしないと、前者のobj.method();が呼ばれるのはBaseのほうだぞ。
>>296 なるほど多胎っすか
だったらDerived obj = new Derived();
obj.method();
でいいんじゃないですか?
わざわざBaseを絡ませなくても・・・
>>298 Base obj1 = new Derived1();
Base obj2 = new Derived2();
Derived1.method();
Derived2.method();
とできるってことですか?
Derived1 obj1 = new Derived1();
Derived2 obj2 = new Derived2();
と同じ挙動だと思うんですが、意味あるんですか?
アクセスできるメンバが減ってるだけだと思うのですが・・・
本当に読んだか? class Hoge : Base{ override void method(){・・・} ・・・ } というクラスを後から追加しても Base obj = new Hoge(); obj.method(); でHogeクラスのmethodを呼べるだろ というかその辺の入門書にもかいてあるだろ・・・
型っていうのは、最低限それらのメンバが使えることを保証するもの
呼び出す側をベタに書くから分かりづらい public void Write(Stream stream) { stream.Write(this.data, 0, this.data.Length); } ほらstreamはFileStreamでもMemoryStreamでもGZipStreamでもなんでも持ってこい
例えば public void show(object o) { MessageBox.Show(o.ToString()); } というメソッドを show(5); でも show(DateTime.Now); でも呼べるでしょ。そういうこと。
>>302 そういう間違いそうなのはふらっとに書くなよ
問題点を指摘してあげればプラスになるぜ
>>300-303 ああなるほど
Streamの例は分かりやすいですね
Streamを継承したクラスの分だけ全部オーバーロードしなくても
勝手にどれでも動くようにできるということですか・・・
ライブラリを使うときは便利そうですけど
自分で設計するのは難しそうですね
こういうこともできるんですか? Base[] array = new array[3]; array[0] = new Base(); array[1] = new Derived1(); array[2] = new Derived2(); foreach(Base t in array){ t.method(); }
言語の習得にはトライ&エラーも大事だぜ 試せることは試す
>>308 まったくそのとおり
書いてどうしても通し方がわからなければ聞くのがいいね
答えられる人がいないとでも思ってるのか? 安い挑発する前に手を動かせよ
はい
馬鹿にはできないんじゃね?
>>310 は偽物です
>>308 一通り疑問に思ったことはやってみました
Base obj = new Derived();
(obj as Derived).method2();
みたいなことをすればDerivedが持つメソッドも呼び出せるんですね
(なんか危なそうですが)
この場合、objが本当にDerivedのインスタンスじゃないと
実行時エラーになりますね
基本クラスは派生クラスの実装を知らないから 派生クラスのメソッドは呼び出せないようになっている
イテレータ・・・と言いたいところだけど C#のイテレータって違うんだよな
(obj as Derived).method2(); こういうのはダウンキャストという
objがDerived型だという確信があるんだったらasじゃなくてキャストしたほうがいい asは確信がない時に使うもの
この変の話は実例みて解説してるの読んで勉強してから出直せ 確か@ITに猪俣の書いた記事であったから
派生のメソッド呼んでほしいような場合にオーバーライドを使う。 それが多態ということ。 呼ぶ側のコードでは実際の型を知らなくても、 オブジェクト自身が必要な動作をしてくれる。 だからストリームの実体がなんだろうが 使う側のコードは変わらない。
323 :
デフォルトの名無しさん :2008/01/20(日) 05:21:37
>>323 Expressだと全角英数は使えないよ
いきなり欠陥とか何言ってるんだこいつは。
323がVS2008Expressを使いこなし限界にぶち当たるはるか以前にVS2010が出てしまうことを予言しておこう
スタンダードからはデフォで使えるコントロールが増えているとか 気になったのはそれぐらいかな
329 :
デフォルトの名無しさん :2008/01/20(日) 11:53:12
>>7 に関し
MSは複雑になり過ぎたWinAPIから.netのクラスに
移行するということを.netが出てきた当時聞いたこと
があります。
しかし、現状を見てみると、オーバーヘッドで起動は
遅いし、肝心のところはAPIがないと作成できない、
XPではフレームワークをインストールしないと
ダメだとか、良いところがないような気がします。
C#を含め.net環境は今後どうなるのでしょうか。
今、C#を使ってますが他の開発環境に移行した方が
良いのかなと悩んでいます。
あ、一番聞きたいことはWinAPIがなくなるかどうか
ということでした。
釣りなので放置してよし
>MSは複雑になり過ぎたWinAPIから.netのクラスに >移行するということを.netが出てきた当時聞いたこと >があります。 これに関してはWin32APIではなく、 COMで拡張していた各種サービスへのAPIを.NETベースにしようということだった。 これがWin32のAPIと誤解され一人歩きしてた。 そして、おそらくJavaへの牽制のため、MSもエバンジェリストといわれる輩もわざと 誤解が一人歩きするのを放置してた。
332 :
デフォルトの名無しさん :2008/01/20(日) 12:36:11
>>331 回答ありがとうございます。
C#スレでこんなことを言うのも何ですが
今更ですが、C#のアドバンテージはどういった
点になりますでしょうか。
そういえば、ソフトウェア誌上でもC#の記事は
少なくなって来たような気がしますし。
ジェネリッククラスのstaticフィールドって便利だな 型チェックが減らせる
>>332 俺流のアホ回答
ソフト開発の面でいうと、
c++よりjavaのほうがアドバンテージがあった、
javaよりc#のほうがアドバンテージがあった。
>>332 おまえさんみたいなのにアドバンテージはない
フレームワーク(ランタイムみたいなもん)インストールさせるのが面倒
API叩かないとできないorめんどくさい処理があること
これだけで嫌がる奴なら選択の余地はない。やめとけ。
だいたい、仕事とかで「しかたなく」使ってみたけど
結構いいところがあるのに気づいて個人でも使ってるってやつか
近頃プログラムはじめてたまたま最初にC#を選んだやつだけだろ
あどばんてーじ があるのは
おとなしくC++でWin32APIにしとき
C++だとGUI周りが面倒くさいんだよなぁ。 MFCは設計が古いし、ATL/WTLは素のAPIよりマシだが面倒くさいのは変わらんし。
GUI作成はC#のほうが圧倒的にやりやすいし、標準ライブラリもC++よりはるかに充実している。
悪い点は
>>329 の通りだが、それ以外はいいこと尽くしだろ。
Vistaが普及して.NET標準装備になってさえくれれば、C#は選択肢としてかなり良くなる気がする。
まあ、Vistaが普及するかが問題なのだが。
WinFXは何処に行ったんだか・・・
339 :
デフォルトの名無しさん :2008/01/20(日) 16:41:07
WinFXは.NET3.0のことだが? WinFSのことなら確かにどこかに逝ってしまった。
来週発売のDVDのリスト誰か貼ってくれ
VisualStudioでフォームがあるDLLを作って、それをC#コンソールアプリから呼び出して表示する場合 #DLL側 DLLのソリューションにWindows フォームを追加 参照設定にSystem.Windows.Formsを追加 [フォーム名].cs[デザイナ]に表示されるフォームウインドウダブルクリックで[フォーム名].cs作成→ビルド #コンソールアプリ側 ビルドしたDLLとSystem.Windows.Formsを参照設定から追加、usingにDLLのnamespace追加 コードの中に↓二行を書き加える [フォームのクラス名] form = new [フォームのクラス名](); form.ShowDialog(); こんな感じであってますか?
バージョン情報の取得方法で質問があります。 ・ Assembly.GetExecutingAssembly().GetName().Version.ToString(); こちらで取ってくると、 1.1.0.0 1.1.0.0 ・ Application.ProductVersion; こちらで取ってくると、 1.1 1.1 どちらも『アセンブリバージョン』と『ファイルバージョン』がくっついて並んでしまいます・・・ 片方だけ取得する方法はありませんか? @ITには片方コメントアウトするといいと書いてありましたが、 [assembly: AssemblyVersion("1.1")] //[assembly: AssemblyFileVersion("1.1")] 出力では 1.1.0.0 1.1.0.0と出てきてしまいます。
>>343 それVS2005でも起きてる?
2002/2003の頃はいろいろあったけど。
346 :
デフォルトの名無しさん :2008/01/20(日) 17:52:33
まずなにしたらいいですか
>>344 AssemblyVersionしか出ないはずだけど。
.NETのバージョンは?
348 :
344 :2008/01/20(日) 18:45:58
>>345 >>347 開発環境はVS2008 EE(.NET3.5)です。
ためしにVS2005で試してみたところ、
前者・後者の呼び出し方法共にアセンブリバージョンのみ出てきました。
.NET3.5で呼び出し内容が変わったみたいですね・・・。
>>348 .NET 3.5のみ問題なんならソースよんでみたら?
すまん。Express Editionはソース読めんのだっけか。
352 :
344 :2008/01/20(日) 19:11:33
試しにVS2008 EE(.NET3.5)ではなく、 VS2008 EE(.NET2.0)で試したところ。 変化がありませんでした。 つまりVisualStudio2008側が問題なのでしょうかね。 いい対策案が思いつきません。
単純なプログラムミスとかないか? Console.WriteLine("{0} {0}", Application.ProductVersion); とかやってたりして。 AssemblyFileVersionは 1.0.0.0 の形式になってなくてもエラーにはならない。 [assembly: AssemblyFileVersion("ほげら")] もOK [assembly: AssemblyFileVersion("1.1 1,1")] とうぜんこれもいける。
354 :
デフォルトの名無しさん :2008/01/20(日) 19:52:50
>>337 ありがとうございます。
VistaはPCの買い替えに比例して徐々に普及して
行くことは間違いないので、もうしばらくC#で
行こうかなと思います。
で、APIは無くなると信じていたので、APIをわざと
避けて来たことから、改めて勉強しようかなと
思い始めました。
駄目な奴は何をやっても駄目
356 :
344 :2008/01/20(日) 20:16:57
>>353 解決しました。
353氏がおっしゃるとおり、{0}{0}が原因でしたw
お騒がせしてすいませんでした。
357 :
デフォルトの名無しさん :2008/01/20(日) 20:24:59
すみません。 関数とクラスの違いがよくわかりません。 わかりやすい解説ページがあれば教えてください。 お願いします。
ピンポイントでそんなアホな疑問に答えてくれるところはなさそう まじめに初めから勉強してください
359 :
342 :2008/01/20(日) 20:34:19
間違ってますか…?
動かしてみたらわかるだろ。
361 :
デフォルトの名無しさん :2008/01/20(日) 20:52:26
>>357 クラスは振る舞いの定義。生成を必要とする。
継承可能。コンストラクタで初期化。
中に関数や変数が含まれる。変数はget set
でアクセス。
最近C言語から移ってきたんだけど メンバ変数って要はグローバル変数みたいなもんかな?
いいえ違います。
>>362 グローバルスコープというよりはファイルスコープ
>>357 まず古典的なcの構造体を理解する。
構造体の意義がわかればクラスの意義や意味はすぐわかると思う。(たぶん)
こういうこというとムキになって反対する人間がいるけど、
やっぱりクラスは構造体の拡張として理解するのが一番理解しやすいと思う。
>>361 そんな抽象的な説明でこういう質問する人間にわかるわけないだろw
>>364 なるほど
なんかどの関数からもアクセスできたら
Cのグローバル変数みたいに管理しにくくなったりしないのかな?
367 :
342 :2008/01/20(日) 21:02:01
>>360 表示できることはできたのですが、試行錯誤でたどり着いたので正攻法かどうか自信がないんです
>>366 なんか根本からスタイルが違うな。
クラスとして実現したい機能があって
そのためにフィールドやメソッドがある感じ。
クラスは静的な関数の寄せ集めではない
>>366 だからグローバルちゃうよ、って364はいってるんだと思いますが。。
ひょっとして(案外よくいるんだが)Cとかのファイルスコープの概念を知らないの?
メンバ変数にもアクセス修飾子とかあるから一概には言えないんじゃない。
>>366 メンバ変数のスコープは各オブジェクト内で完結
ただしstaticなメンバの場合はどこからでもアクセスできる
うん?
>>368-371 クラス=ファイル
メンバ=staticグローバル変数
みたいなもんなのかな?
>>369 知ってますよ
でも、案外ファイルの中でも色んな関数から参照されてると
訳分かんなくなりませんか?
オブジェクト指向の基本は自分で身につけないと こんなとこでのやりとりでは理解できるはずがない。
あとよくわかんないのはメンバ関数って インスタンスの分だけ関数が複製されるんですか? その意味がよくわかんなくて
>>373 >クラス=ファイル
>メンバ=staticグローバル変数
>みたいなもんなのかな?
悪いけど全然違う
だから真面目に基本から勉強しろと。
C++も使ったことないの?
オブジェクト指向について解説してるウェブページでも適当に探して読んでみるべき。
>>375 staticをつけないとインスタンスごとに複製される
嘘を教えるな
ワロタ
LinkLabelについて質問です。 配列でLinkLabelを可変で作成しているのですが、クリックしたときの処理で不明な点があります。 linklabel[i]で複数作成して、クリック時のイベントは一括で一つで処理したいのですが、押されたlinklabal対応させる方法がわかりません。 x = 選択したlinklabelのテキスト みたいな感じにしたいのですが、よい方法はないでしょうか? buttonだとselectとか使うみたいなんですがlinklabelの場合がわかりませんでした。 あらかじめlinklabel1みたいに作っている方法なら載っているサイトが見つかったのですがこの方法のやつが見つかりません。
sender
>>382 デザイナで一個置いてイベント設定してdesigner.cs見てみるといいんじゃないか?
385 :
382 :2008/01/21(月) 10:37:11
NotifyIcon.Textにセットするために、文字列が64文字を超える場合は64文字までに切りたいのですが string.Remove(64) string.Substring(0,64) のどちらも64文字未満だと例外が起きるようです。 いちいち文字数のチェックをしないでも、一発で切ってくれるメソッドはないのでしょうか?
「いちいち文字数のチェックをしないでも、一発で切ってくれるメソッド」 が存在したとしても、それは内部で長さをチェックしている。 ゆえに自分で作ればよい
388 :
386 :2008/01/21(月) 14:02:26
>>387 ということはやっぱりないんですね。
例外が起きると言うことは内部でもチェックしているはずなので
二重チェックになるのが嫌だっただけです。
拡張メソッドを作ることにしました。ありがとうございました。
そんなことに拡張メソッド使うな
Language Integrated Queryを「統合言語クエリ」と訳すのって変じゃね? 「言語統合クエリ」ならわかるけど
LINQってリンキューって読んでるけどあってる?
オレはリンク
try中に意図的にcatchに移動してほしくて 無理やり0除算発生するようにしてるんだが もっとスマートな方法はないですか?
それ最悪の書き方
何か throw しろ。
if (flag) throw new GotoCatchException<int>(); else throw new GotoCatchException<String>();
そもそも意図的にcatchに移したい処理なんて 設計に問題があるだろ
たぶん発想が逆立ちしてるんだろうね。 本来例外処理の外に置くべき処理をcatchの中に書いちゃってる、 なんてオチだと推測する。
変数が使われてなかったりするとエラー一覧ウィンドウで「警告」で表示されますが 「メッセージ」も文法的な間違いを発見すると表示されるのですか?
メッセージって""内のメッセージか? 警告と並列で括弧でくくってある意味がわからん
エラー一覧のウインドウに並んでる [エラー] [警告] [メッセージ] のことだろう。 俺もまだ見たことないな。
例外の使い方だけど try 処理1 処理2 catch(ex1) エラー1 catch(ex2) エラー2 catch() 想定外エラー で処理1と2は戻り値無しでNG時にex1とex2をthrowする って使い方は邪道? 例外は関数エラーに使うべきじゃなかたりする?
そうやって使わないで何に使う
むしろそれ以外の使い方があったら教えてほしい。
それ以外の使い方したら読みにくいだけだろw
想定外の例外を握りつぶすのがいいかどうかは賛否の分かれるところじゃなかろうか
407 :
デフォルトの名無しさん :2008/01/22(火) 02:27:48
C#ってスクリプト言語くらい気楽に使えるようにならないの。 いちいちコンパイルとかウザいし。
>>397 そうでもないキガす。
とりあえず例外処理に関してテスト条件なんて作らずに
投げたらどうなるんだか見てみたいなんて話はあるかも
しれない。 これはテストをはしょるズボラな俺だけか。
409 :
デフォルトの名無しさん :2008/01/22(火) 06:50:59
JavaScript書き出された文字列を取得 する方法はありませんか。 ブラウザコンポーネントで例えば document.write("abc")と書かれていれば このabcを取得したいとのですが。
>>400 ,401
[エラー] [警告] [メッセージ]の[メッセージ]の項目です。
ASPでweb.config内でカスタムセクションを追加した時に、
「属性○○のスキーマ情報が見つかりませんでした」と[メッセージ]でエラー一覧に表示されました。
でも問題なく動作してるのでそのまま続けてみます。
ありがとうございました。
>>409 document.body.innerText
つーかおもっくそスレ違い
>>407 ソースコードから実行てのはふつーにできるから調べてみれば?
使い物になるかは別だが。
413 :
デフォルトの名無しさん :2008/01/22(火) 18:24:43
CSVの質問です。 //string FileName = "二バイト文字テスト"; Response.AddHeader("Content-Disposition", "attachment;filename=" + HttpUtility.UrlEncode(str.ToString() + ".csv")); 上記のようにファイル名が2バイトになっても正常に「開く」「ダウンロード」「キャンセル」 のダイアログが出るようにしています。 ダウンロードした場合は日本語が含まれたファイル名でダウンロードできます。 「開く」をクリックした場合、エンコードされたファイル名で開こうとしてしまいます。 解決方法はありますか? よろしくお願いします。
あげてしまった・・・ 補足で、開くを選択した場合エラーになります エンコードされたファイル名を開こうとするためです。
誰かが作ったクラスライブラリを利用する時は、exeと一緒にそのdllも付けなきゃならないの? C/C++のスタティックリンクライブラリみたいにexeファイルに組み込むことできないのかな?
ilmerge 署名されてたら無理だけど
文字列を表示するときに文字の間隔を標準 (Graphics.DrawString で表示されるときの文字間隔) より1ドットずつ狭めて表示したいと思います。 思いついたのは ExtTextOut を使用する方法ですが、 それ以外の方法(できれば p/invoke を使わなくていいような) があったら教えてください。
419 :
デフォルトの名無しさん :2008/01/22(火) 22:55:21
Frameworkで定義されているコンストラクタを持たないクラスを使用したい場合、 どのようにすれば使えるのでしょうか? 仮に、public sealed class ModelBoneというコンストラクタが無くプロパティのみを持つ クラスのインスタンスをローカルで一時使用したいとします。 ModelBone bone = new ModelBone(); としても 'Microsoft.Xna.Framework.Graphics.ModelBone' のコンストラクタが定義されていません' のエラーが表示されてインスタンスを作成できません。
無理 他にインスタンスを取得する方法が用意されてるはずだからそれに従う
421 :
420 :2008/01/22(火) 23:02:25
ちょっと見てみたけど、ModelBoneに関してはContentManager.Loadで モデルと一緒に読み込むしかないんじゃないかな
>>418 一文字ずつMeasureCharacterRangesで測ってRectangleF作って
DrawStringすりゃいいんじゃね
>407 Windows PowerShell使えよ。
424 :
419 :2008/01/23(水) 00:37:32
>>420 やはりインスタンスは作成できないのですか・・・。
このクラスが持つプロパティを自前クラスの関数の引数で使用したくなり、
Frameworkのクラスからインスタンスを作成できない場合
全く同じプロパティとコンストラクタを持つクラスを改めて
定義しなければならないからどうしたものかと悩んでいました。
とりあえず出来ないことが分ったので、他の方法を検討してみます。
ありがとうございました。
425 :
デフォルトの名無しさん :2008/01/23(水) 01:15:38
そもそも、勝手にインスタンスを作られると不都合だから、わざわざコンストラクタを定義してないわけだ。
>>426 拡張メソッドにどんな幻想を持ってるんだ
拡張メソッドのおかげで魔法使いにならずにすみました
formA、formB、formCがあり、 A→B、A→Cと呼び出すとします。 formBで取得したテキストボックスの値を、formCで参照したいときはどのようにしたらよいでしょうか?
formAがformBから値を取得してformCに渡せばいい
渡すときはどうしたらいいでしょうか? FORMC fc = new FORMC(/*取得した値*/); でしたっけ?
コンストラクタでもプロパティでもお好きなように
ところで、そのformB、formCはそれぞれ、formAからShowDialog()で呼んでいるのですが、その場合も
>>434 さんの言うとおりでいいのでしょうか?
436 :
デフォルトの名無しさん :2008/01/23(水) 11:17:23
interface I1,I2,I3(既成の外部ライブラリ)があったとして、 I1 i1 = new I1(); I2 i2 = new I2(); i1.hoge = (I3)i2.hage(); みたいなコードがあるのですが、(I1〜3は既成の外部ライブラリ) それぞれのinterfaceで定義されているメソッドの実態はどこで定義されているんでしょうか? やりたいのはi1にひとつ例えばvoid moe(string str)みたいなメソッドを追加したclass or interfaceを作って void moe(string str){ i1で定義されているメソッドをコール; } みたいな感じにしたいのですが、何から手をつけていいのかわからなくて困っています。 よろしくお願いします。
お前は何を言ってるんだ ShowDialog()で呼ぼうとコンストラクタには関係ないだろう
>>436 I1 i1 = new I1();
I2 i2 = new I2();
↑ ↑
ここ と ここ を
よーく見比べてみよう
印刷で困っています。 ツールボックスから印刷プレビューのダイアログ(PrintPreviewDialog)をそのまま利用しています。 プレビューでは,意図した画像が正しく表示されるのですが実際に印刷すると一ページだけ 真っ黒に印刷されてしまいます。 これを解決するためにはどこを調べなければならないでしょうか。
他のソフトから印刷してみてどう?
441 :
436 :2008/01/23(水) 13:10:57
>>438 さん
れすありがとうござます。
見比べて見たのですが、やはりinterface同士でなにがおこっているのか理解出来ません
new Interface();
という構文自体が何をしているのかわからないのですが、
もう少しヒントいただけないでしょうか?
>>441 よく見ろ。newしているほうはインターフェイスではないはず。
>>440 さん
お返事ありがとうございます。
ほかの印刷ソフトでは正常でした。
PrintDocumentのデータはどのタイミングで破棄されるようになっているんでしょうか?
何度やっても再現してしまいます。。。
444 :
436 :2008/01/23(水) 13:40:26
何度見てもinterfaceです。 そのインターフェースの定義を見ると [Guid("hoge")] [CoClass(typeof(I2cls))] public interface I2 : I4 { } とかになっていてどうも思っている異常に複雑そうなのであきらめます。 ありがとうございました。
C#のGetFilesのメソッドについて質問なんですが 複数の拡張子(この場合jpg、gif、png、bmp)で 絞り込むのはどう書いたらいいんでしょう?
>>445 Path.GetExtensionすりゃいいじゃん
>>445 C#の、ってここはC#スレだ、決まってんだろ、ハゲ
第一C#の、じゃなくて.net frameworkの、だろ、ハゲ
それにクラス名まで、書けや、ハゲ
Directory.GetFilesならsearchPatternとるオーバーロードがあるっしょ
450 :
デフォルトの名無しさん :2008/01/23(水) 17:48:10
>>448 揚げ足とるな。ばか!!!!!!!!!!!!!!
452 :
デフォルトの名無しさん :2008/01/23(水) 18:47:52
トランザクションオブジェクトつくって INSERTとかUPDATEとかしたあと コミットもロールバックもしないとどうなりまつか?
コネクション閉じる時点でロールバック。 だったと思うけどプロバイダに依存しそう。 ものによっては保留状態になるかも。 いや、手動トランザクションなら保留はないかな?
>>453 トンクス
SQL Serverだとそんな感じみたいでつね
TabControlのTabPageにいくつかTextBoxとRichTextBoxを配置しました。 あるタイミングで,Text
すいません,誤って途中のものを書き込んでしまいました。 TabControlのTabPageにいくつかTextBoxとRichTextBoxを配置しました。 あるタイミングで,TextBoxとRichTextBoxのレイアウトを Fixed3D から FixedSingle に一気に変更しようとしています。 テキストボックスの変更はできたのですが,同様の方法でRichTextBoxの変更ができませんでした。 以下のようにしたのですが,何が問題でしょうか。 RichTextBox rtb = new RichTextBox(); foreach(Object ctrl in tabControl1.SelectedTab.Controls) { if(ctrl.GetType().Equals(rtb.GetType())) { rtb = (RichTextBox)ctrl; rtb.BorderStyle = BorderStyle.FixedSingle; } }
>>456 ・まず直接フォームのリッチテキストのフィールドで同じことをしてどうなるか
確認しよう。
・ブレークポイントの使い方を覚えよう。
・こんなくだらないことでいちいち悩んでるようなら、君才能ないのかも
RichTextBox rtb = new RichTextBox(); こうしてから、 if(ctrl.GetType().Equals(rtb.GetType())) こう判定して、 rtb = (RichTextBox)ctrl; こうやってしまうところに並々ならぬ才能を感じた。 向いてないよ、やっぱり。
なれてないだけ as null
460 :
456 :2008/01/24(木) 00:24:57
>>458 さん
ご指導ありがとうございます。
勉強になります。
>>459 さん
nullなんですね。
ありがとうございます。
デバッガの使い方も分からず,すいません。
ブレークポイントを指定してBorderStyleを見てみるとちゃんとFixedSingle
になっていました。
RichTextBoxはFixedSingleにしても表示が変わりませんでした。
もしかして,そういうものなんですかね。
if(ctrl is TextBox) って,できるんですね...orz
キャストするならctrl as TextBoxとしてnullかどうか見た方がいい。
>>462 ありがとうございます。
459さんのヒントを頂き,そのようにしました。
型判定について全く無知でした。。。
検討違いなこと言っていたらすみません public static void func(string str1, string str2, bool flag){ 処理 } このような文字列を2つと論理型で1つを引数とする関数を再帰的に呼び出す部分なのですが 今現在作成中のプログラムの中で、この関数による処理がほぼ全てのようなものです なのでこの再帰的にこの関数を呼び出すという部分について何か最適化の方法がないかと探しています 関数内の処理はforeachと.NET内のクラスを利用したものでほぼ埋まっているため そちらに関しては最適化はやりようがないかなと思っています それではよろしくお願いします
>>464 プログラムの概要を教えてもらえんとなんともなぁ
そもそも本当に再帰が必要なのかもわからないし
>>465 すみませんでした、書くと長いので概要を
str1にはディレクトリへのパスを(こちらをA)
str2にはまた別のディレクトリへのパスを(こちらをB)受け取ります。
Bが存在するか確認
A内に存在するファイルを探していきながら、随時B内にA内のファイルを移動していく
その後、A内でディレクトリを検索し、無ければ終了、発見した場合
(今現在のstr1とstr2の値が以下だとしたら
str1 C:\aaa
str2 D:\xxx)
A内でディレクトリ検索をして見つけたものが
C:\aaa\abcだとすると
func("C:\\aaa\\abc", "D:\\xxx\\abc", true)
こんな感じで自信を呼び出します
つまりBディレクトリ以下にAディレクトリをサブフォルダ内等一切合財移動させるという感じです
最適化する意味はどこにもないな。 せいぜい再帰やめることで万が一のStackOverflowを回避するぐらい。
再帰させる必要ないでしょ。 Private Sub moveFile(ByVal a As String, ByVal b As String) Directory.CreateDirectory(b) Dim files() As String = Directory.GetFiles(a, "*.*", SearchOption.AllDirectories) For Each f As String In files Dim newpath As String = f.Replace(a, b) Dim newdir As String = Path.GetDirectoryName(newpath) Directory.CreateDirectory(newdir) File.Move(f, newpath) Next End Sub
なんでVBなんだよ。死ぬほど読みにくいわ 466は書くと長いって書いてるんだから 全部のファイルじゃなくて、何か条件付けがあるんだろ
手元のマシンには、VBしか入っていないからVBで答えたまで。 なんか条件付けがあるというのならなぜその条件を説明しない。 その条件をこっちで考えろってか? 全部のファイルじゃない? 「一切合財移動させる」と書いてあるだろ。
.netじゃフォルダ移動したら、その下にあるのも一緒に移動しないの?
C++の頃に、switch文を嫌ってポリモーフィックを使って対応していた場合(GoFのstateやTemplete Method系?)、 C#にそのまま移植するとキャストやガベコレの為に返って処理が重たくなる事は有りませんか? これから具体例を用意しようと思いますが、2,3時間後になると思うので、 場合によるときは何処が焦点になるか、忠告頂けると助かります。 ちなみにC# 2.0です。ジェネリックの恩恵を受けれると嬉しいのですが。
参照型→参照型のキャストは無問題 参照型→値型はボクシングが入って遅くなる void Hoge<T> where T : IHogeHoge (T value) { ... } こうすればボクシングは回避できて、インターフェイスメンバも使える メソッドが一つならインターフェイスじゃなくてデリゲートを使うのも流行り
475 :
474 :2008/01/24(木) 19:35:30
間違えた 値型→参照型はボクシングが入って遅くなる
そこが処理のボトルネックになってるかどうかがまず問題だろ
>476 swichを使いたがる人に人的な問題が有るだけなので、ネックにならない事がわかればすっきりできます。 >474さんのおかげで解決ですけど、私も興味が有るので、もうちょっと面白い話がを集めたいんですけどスレ違ですかね。 私が今書き出したサンプルはデリゲートの方がスマートっぽいので練り直さないと。 void Hoge<T> where T : IHogeHoge (T value) { ... } を有効利用したサンプルを書けてないと足下をすくわれそうだし。
手段と目的を履き違えていないか?
479 :
477 :2008/01/24(木) 20:07:17
>478 そうですね。 「参照型→参照型のキャストは無問題 」の理由は解ってないし。 >where T : IHogeHoge (T value) { ... } は自分の件では要らない事が、返事を書いてから気づきました。 未だベンチテストとかできる状態では無いのでボトルネックの洗い出しはできません。 目安としてはポリモーフィックされたupdate()関数は一秒間に180回ぐらい行われて、 satateが切り替わるのは2,3秒に一回あるか無いかです。 それでupdate()関数内に switchが有るのは嫌だなと思う次第です。
C# を使うことそれ自体がボトルネックだとおもいまーす
switch使ったっていいと思うが Enumってswitch用じゃね?
問題のサンプルソースできた。 100行ある。ここに貼るとしたらどうしたら良い?
(´・ω・`)しらんがな
一秒間に180回なら全く気にする必要ないだろ
stringの連結とかやってる時点で無意味だろ
テキスト連結を削除して試したら両方15ms以下で終わったよ
>489 LinkedListの大きさを20000にして、string xをint xにして只の足し算にした。 switch無し 35928 switch 21836 C#のキャストってやっぱり痛いんだな。
インライン展開されてるみたい [MethodImpl(MethodImplOptions.NoInlining)]をswitch版のupdateに付けてみ
つけては見ましたけど、特に変わらなかったです。 21600ぐらい。 --------- using System.Runtime.CompilerServices; --中略--- [MethodImpl(MethodImplOptions.NoInlining)] public void update() { switch (this.state) ----- UMLやDPを使って設計した方が遅くなるってのはC#ユーザーなら通らされる道なんでしょうね。 キャストやガベコレの世界ってこうなっちゃうんだな。 UMLは概念?だかで実装はswitch。
間違えた インライン展開抑制でこっちで効果があったのはFunc1updateとFunc2updateの方。差がかなり小さくなった。 まあつきつめたらswitchの方が速いのは当たり前だけどそんなことに意味があるかどうかの方が大事
そりゃそんな感じの作りならswitchのが効率いいだろうし 3パターンじゃなおさらswitch有利だろうけど だからどうしたってレベルの話だな。 そのレベルでパフォーマンス重視ならC#なんざ使うのが間違い。 まあ大抵はこんなレベルの差はどうでもいい。 普通は処理そのものがもっとずっと重いしな。
でどこでキャストとガベコレが関係してるわけ?
まったく関係ないw switchの方が最適化されて有利っていうだけのこと
497 :
464 :2008/01/24(木) 23:57:54
レスくださった方、ありがとうございます 最適化の意味がないというのがいまいちピンと来ませんでしたが 少し説明不足なところがありました。 関数内の処理をどうこうしたいのではなく、関数に引数を渡す部分に関して 何か速度を上げるのに繋がる手法のようなものがあれば・・・と思ってのことでした なので検討違いかもしれないと今でも思っていますorz 再帰処理がいらないという意見がありましたが、私自身の力量ではこれで全力でして これ自体アドバイス貰いながらの完成だったりします。 どんどんと階層を深く辿るにはどうしてもこれ以外の方法が思いつきませんでした
>494 >普通は処理そのものがもっとずっと重いしな。 テキスト連結 117261-114267= 2994 足し算 35928- 21836= 14092 そうですね。 >495 どう関係しているか解らないので、適当です。 C++のポインタとキャストならこうは成らないのでは? switch無しは、何回キャストしているか把握してないし。 ガベコレとauto pointerを勘違いしているかも、 >495が関係ないと言うなら、もっとましなソースになるかもしれませんね。
499 :
498 :2008/01/25(金) 00:05:31
>496 今見た。
>>497 >最適化の意味がない
どう見てもディスクIOの方が圧倒的に重いからじゃね
501 :
497 :2008/01/25(金) 00:12:12
>>500 なるほど、確かにorz
少しでもと思ったんですが厳しそうですね
ありがとうございました
>>501 IOって面で工夫するとしたら
文字列で渡さずにDirectoryInfoを渡すようにしたらいいのでは
インラインとか書かれてるのをみると 脳内で淫乱に変換される漏れの頭を何とかしてください
PropertyGridで、uint型の配列を展開したとき、数値を16進数で表示するには どうしたらいいのでしょうか。
頑張るのならば ArrayConverter を真似して実装してから uint[] 型のプロパティに TypeConverter 属性で実装したのをつける ArrayConverter の内部クラスが private なので面倒 頑張らないのならば [TypeConverter(tyeof(UInt32HexConverter))] struct UInt32Hex{ public uint Value; } とでもして Uint32HexConverter をお手軽に実装してから UInt32Hex の配列を使う
506 :
504 :2008/01/25(金) 09:13:17
>>505 ありがとうございます。
とりあえず、頑張らない方向でやってみます…。
がんばろうぜ… いやまあどうでもいいんだけど
XMLコメントを書くと メソッド自体とパラメータのコメントはカーソルを合わせたり、Ctrl+K,Pとかすれば表示されますが 戻り値の/// <returns>xxxx</returns>に書いたものは どうすれば表示されるのでしょうか? あとデバッガでメソッドの戻り値が何になったのかを そのメソッド内で見ることは出来ないのでしょうか? バージョンは2008です
>>323 VC# 2008 Express使ってて思ったのは、
クイックウォッチが使えないこと。
ブレークポイントからステップインして処理を追っていくときに、
その時点における式の評価ができるのは結構便利なんだよな。
それ以外では全く不満はないので、それだけの為にVS2005Proに戻そうとまでは思わんね。
VS2008Pro、アップグレード版の値段によっては購入を検討する。
前を使ってないからクイックウォッチってのがわからないけど、 文面からイミディエイトウインドウのような気がする。 ?を最初につけてメソッドとか記述すれば結果がみれるし、フィールドに代入も出来る 初期状態では確かメニューにないから、ユーザー設定から追加。
式を評価するだけならウォッチ式でできるよ 2008では演算子の上にマウスカーソルを置くと評価した結果が表示されるようになってる
>>510 なるほど、イミディエイトウインドウで自作式を評価できるのか。
今まであんまり使ったこと無かったもんで知らなかった。
それならクイックウォッチいらないかもね。
>>511 それはソースに記述してある式の評価でしょ?
それは当然できる。
俺が言ってたのは、ソースに記述してない評価式のこと。
>>512 ウォッチウインドウにある空の行をダブルクリックして式を入力するだけ
.netだから出来るんだろうけど、 最初にイミディエイトウインドウを知ったときには感動した ドキュメント見て、実際の動作確認をしたくなったら 参照さえしてあれば、そのままF10(ステップオーバー)だけ押せば ソースコードに全くないクラスでもそのまま試せるし、IntelliSense効くし ちょっとしたことなら確認用のプログラム書かなくてもいいんだよな テストしたいクラスがあったときもイミディエイトウインドウから実行できるし ブレイクポイント設定しておけばちゃんと止まるし
>>502 DirectoryInfoとFileInfoにして色々試してみました
大きなディレクトリを移動させる際の重さがなくなったのですが、移動スピード(?)というか処理にかかる時間が延びてしまったようです
まだ色々試している段階なのですが、これは良くも悪くも安定したということか・・
何はともあれ新しい可能性です、もう少し試行錯誤していこうと思います
ありがとうございました
516 :
デフォルトの名無しさん :2008/01/25(金) 16:32:16
DataGridView 内のセルにて 長い文字列を入力した時に折り返すようにしたいのですが どのように設定すれば良いのでしょうか? WrapMode を True に設定したら全角文字は上手く折り返されるんですが スペースを含まない半角文字はセルから溢れてしまい、困ってます。
今データベースを使用するアプリケーションを書いているのですが、 SQL文が非常に長くて可読性が悪いので文を分割しようと考えてます。 この場合、 string query = "select hoge, fuga, hage from test" + " where hage = 1 ・・・"; 見たいな書き方しますか?それともStringBuilderを使ってApendしていきますか? どう書くのが一般的なんでしょうか?
多いのは単に+で連結じゃないかね? 俺は@でヒアドキュメントもどきが好きだが。
ループ等の中にないならstringで連結してもいいんじゃね それか余所においとくかリソースにつっこむか
リテラルの+はコンパイル時に解決されるからStringBuilderなんて使うと余計に遅くなるよ。
521 :
デフォルトの名無しさん :2008/01/26(土) 00:44:27
C#のtry-catchの質問です シリアル通信を用いたセンサのグラフを表示するプログラムを作っています。 UIのデザインForm1.csとセンサを扱うクラスSensorClass1.csにわけています。 で、シリアル通信の関連のエラー処理をしたいのですが、かきのどちらに try-catchを施せばよいでしょうか。 Form1.cs private void buttonWaaSens_Click(object sender, EventArgs e) { this.sensorClass.sens(); } SensorClass1.cs public void sens() { this.serialPort.DiscardInBuffer(); this.serialPort.WriteLine("sens +000001000 20 5 0"); System.Diagnostics.Debug.WriteLine("取得開始"); }
>>521 いや、日本語書けよw
君はエスパーかもしれんが、ここ読んでるキミ以外の人間はエスパーじゃないんだけど。
ぼくはエスパーです どちらでも好きなほうにどうぞ
PropertyGridのような折り畳み・展開可能なGrid(複数カラム保持)を作成したいのですが、 参考になるURL・方法を知っている方教えていただけますか? こんな感じを想定しています。 ColA |ColB |ColC -NodeA | | -NodeC| | +NodeB | |
>>526 ありがとうございます。
コード参考にして作ります。
if(dir.Attributes == FileAttributes.ReadOnly) { dir.Attributes = dir.Attributes & ~FileAttributes.ReadOnly; } dirはDirectoryInfoです これで読み取り属性なら読み取り属性を解除するということになっているでしょうか?
if ((dir.Attributes & FileAttributes.ReadOnly) != 0) とでもしておかないと、読み取り専用以外の属性を併せ持つディレクトリを漏らす。
ディレクトリには必ずディレクトリ属性がついているから、
>>528 のやり方では絶対に条件が成り立たないな。
>>529 ありがとうございます
流石に単純すぎて自分のものはいぶかしんでいたんですが
読み取り専用なだけ、という場合しか考慮されていなかったんですね、助かりました
>>530 DirectoryAttributes的なものでもあるんでしょうか?
一応こちらの環境では(読み取り専用にチェック入れただけのディレクトリに対しては)できましたが
状況によって消えたり消えなかったり、読み取り属性だけころっとかわったりorz もうちょっと試行錯誤してきます、すみません
534 :
508 :2008/01/26(土) 07:50:21
>>534 メソッドの戻り値はreturnの部分にブレークポイント仕掛ければ分かるよ
>>518 ,519,520 さんありがとうございました。
>>518 @使ったヒアドキュメントもどき私も使っています。
>>520 コンパイル時に解決してくれんですね。安心して+で連結できます。
form1、form2、form3があり、 form1からボタンのイベントでダイアログ形式でform2を開き、そこに値(TextBox)を入力します そのあと、okでform1に戻り、今度は別のボタンのイベントでform3を開き、そこでSaveFileDialogを開きます このときSaveFileDialogのFileName先ほどのTextBoxの値を入れたいのですがどうしたらよいでしょう?
form2にそのテキストボックスの値を取得するプロパティを定義する form2を表示して,okで戻った後にform1のコードからそのプロパティを通して値を取得して form1のフィールドに入れとく form3を開く前にプロパティとかコンストラクタとかでその値をform3に渡す
SaveFileDialogのヘルプ見れば一発でわかりそうなもんだが 一体なにがわからんの? もしかしてform1からform3にファイル名を渡す方法? そんなもん、form3を開く時にファイル名を渡すなりなんなり、自分で考えろ。
>>539 すみません
実際のコードで簡単に書いていただけないでしょうか?
>>540 お前初心者スレからでてったほうがいいと思うぞ
>>541 基礎からやり直せ
そのレスで確信したが全くわかってないだろ
>>540 具体的に言えばそうです
ただそのform3のsavefiledialogのFileNameプロパティに名前を設定するとき、
sfd.Filename = の後にどうやったらform2のテキストボックスの値を参照できるのかがしりたいです
class Form2 { public string テキストボックスの値 { get { return this.textBox1.Text; } } } class Form3 { private string fileName; public string ファイル名 { get { return fileName; } set { this.fileName = value; } } void SaveFileDialogを開くイベント() { //(略) saveFileDialog.FileName = fileName; } } class Form1 { private string fileName; void Form2を開くイベント() { using (Form2 form2 = new Form2()) { if (form2.ShowDialog() == DialogResult.OK) this.fileName = form2.テキストボックスの値; } } void Form3を開くイベント(){ Form3 form3 = new Form3(); form3.ファイル名 = this.fileName; //form3を表示 }
>>544 クラスの基礎だけでいいからどっかの解説ページを読むんだ
ここで一時凌ぎすべきじゃない項目だぞ
>>545 型 'System.Windows.Forms.TextBox' を型 'string' に暗黙的に変換できません
AD_Adjust.textBox1' はアクセスできない保護レベルになっています。
ってエラーが出てしまいました
>>542 ロクにマニュアルも見ず、自分で試してみることもしないのは
初心者以前。
>>544 だから、
form2のテキストボックスの値を参照できるように、プロパティなり
メソッドの引数なりで自分で参照できるように作るんだよ。
↑ごめんなさい、解決です
551 :
719 :2008/01/26(土) 14:29:25
>>719 です。
もう一度起動してWINXPを起動したのですが今度は正常に読み込みました。
が・・・
起動しても何か処理が重い・・・(普段なら10秒もすれば起動して処理が終わるのに・・・)
それで色々作業中にまたまた急に電源が切れました。。
そう、719を書き込んだときとまったく同じ症状で
で、「これはウィルスだな。」と思い、そうと決まれば駆除しかない!
そう思って俺の計算では成功する予定でした。(←馬鹿
しかしその結果、ウィルスチェッカー中に電源が落ちてしまいます。
(ちなみにしばらく時間を置いてから起動すれば立ち上がるみたいなんです。)
で3回程度試したんですが・・・必ずチェック数が1万を越える前に電源が落ちます。
ウィルスチェックしていない間は落ちることがないのでまず電源アダプタとかでは無いはずなんですが・・・
ニコニコにウィルスでも混入したのかな・・・?(←先にチェックして来い
というわけでちょっとニコニコに何か手がかりみたいなの無いか見てきます。
(´・ω・`)知らんがな
Point[] p = new Point[4]; p[0] = new Point(0, 0); p[1] = new Point(1, 1); p[2] = new Point(2, 2); p[3] = new Point(3, 3); クラスの配列をnewするとき↑みたいに 1個ずつnewするのがめんどいんですが スマートにやる方法教えてください
555 :
デフォルトの名無しさん :2008/01/26(土) 19:25:58
Point[] p = new Point[4]; for(int i = 0; i < 4; i++){ p[i] = new Point(i, i); }
Point は構造体だから配列つくっちゃったら 要素ごとに new する必要なんてない なので new は最初の1個だけでよい
Point[] p = { new Point(0, 0), new Point(1, 1), new Point(2, 2), new Point(3, 3) };
C#でさぁWindowsのAPIを利用するのは.netのコンセプトに反してるよね?
それがいやなら .net 側で API 用意してくれ!
560 :
554 :2008/01/26(土) 19:33:30
構造体の概念を全く理解してないでよくPointクラスを使用できるね。 掛け算の概念を知らないで九九をひたすら暗記している家の息子みたいなもんだ。
for を却下して new を羅列してる方を採用って・・・ 何がやりたいのか分からない。
>>560 Point[] p = Enumerable.Range(0, 4).Select(i => new Point(i, i)).ToArray();
564 :
デフォルトの名無しさん :2008/01/26(土) 19:38:05
今までC/C++やってたんですが 最近C#やることになって勉強中です。 ものすごく親切な仕様という印象です。
文字列のn番目の文字だけを別の文字に変えたいときはどうしたら良いでしょうか?
文字列.replace(a,b); a→b
>>554 Point[] p = new Dictionary<int, int> { { 0, 0 }, { 1, 1 }, { 2, 2 }, { 3, 3 } }.Select(xy=>new Point(xy.Key, xy.Value)).ToArray();
一旦ToCharArray()で文字配列にしていじった後にnewし直す。とか
>>566 StringBuilderならインデクサ経由で変更できるよ。
>>565 親切っていうよりガチガチに制限かけまくってるだけ
画像処理のラスター処理関連の質問です。 画面上に何か図形を2つ書いて(例えば10角形2つ)を書いて その図形の重なった部分の面積を求めるっていうとき どうやればできますか?
三角形9つにずつ分解して、重なり部分81箇所の面積の和をとる。 幾何学の問題。
9じゃねえわ。8x8=64
重なり部分をどう求めるの?
>>572 紙と鉛筆で「ry)っていうときの」アルゴリズム書ける人か書けない人かで分岐。
書ける人ならとりあえずアルゴリズム書いて晒してみると親切な人がC#での書き方のヒントくれるかも。
書けない人は……ライブラリ探すところから始める? ちなみに.NET標準にはないよ。
まあ標準ではなくてもGeometryクラスを流用すればできるかもしれんが。
ttp://d.hatena.ne.jp/hogeman/20071202
>>572 みたいな問題って意外と難しいんじゃないの?
いつでも代数的に解ける図形が与えられるとは限らないし。
だからモンテカルロ法みたいなのがあるわけじゃないの?
つーか、
>>572 は図形がどういうデータ構造で与えられるかをまず提示しなきゃ
話にならないね。
>>576 も言ってるけどWPF使えば超簡単にできるよ
579 :
578 :2008/01/26(土) 22:19:29
>>576 が言ってるのは違うGeometryだったな
580 :
572 :2008/01/26(土) 22:24:03
図形の形状は不定です。 C言語上でやったときは メモリデバイスコンテキスト上に図形を描画して それぞれ配列に格納して論理演算で求めてました ↓みたいなかんじ ■■■■■■ ■□□□□■ ■□□□□■ ■■■■■■ ■■■■■■ ■■■■■■ ■■■■■■ ■■■□□■ ■■■□□■ ■■■□□■ ■■■□□■ ■■■■■■ 重なり部分 ■■■■■■ ■■■□□■ ■■■□□■ ■■■■■■ ■■■■■■ ■■■■■■ C#だとメモリデバイスコンテキストに相当するものが あるのかよくわからないので聞いてみました WPFというのでできるんですか 調べてみます
581 :
576 :2008/01/26(土) 22:25:14
>>578 WPFのGeometry.GetAreaでいけそだね。
だとしたら「標準にはない」は嘘になる。サンクス
>>580 メモリデバイスコンテキストに相当するものならSystem.Drawing以下にあるかな。
GraphicsPathからRegion作って残りとIntersectして共通領域のRegionを作る。
できたRegionをGraphics.Clipにセットして適当に塗りつぶして塗りつぶし色でピクセル数え上げか。
それでいいならできなくはないと思う。
WPFはSystem.Drawing以下のとは別の描画ライブラリ。
583 :
572 :2008/01/26(土) 22:50:39
584 :
566 :2008/01/26(土) 23:35:17
フォントの名前からフォントファイルの名前を取得する方法ってありますか? "MS ゴシック"->"MSGOTHIC.TTC" みたいな感じで。
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Fonts
以下のような任意の2つのRectがあって、 □□□□□□□□□ □□□□□□□□□ Rect1 □□□□□□□□□ □□□□ □□□□ Rect2 □□□□ これを次のようにマージするには、空白部分をどうやって補完すればいいんでしょ。 □□□□□□□□□ □□□□□□□□□ □□□□□□□□□ Region1(=Rect1+Rect2+補完部分) □□□ □□□□ □□□□ □□□□
まず間違いなく必要なのは 「次のように」 の部分を厳密に定義することじゃないだろうか。
書き込んでから閃いた。
Rect1のBottomをRect2のTopの位置まで下げ、新しいRect1とする。
Rect2のTopをRect1のBottomまで上げ、新しいRect2とする。
次に、新しいRect1とRect2の重なりを
>>583 のHPのやり方で求めると、
これが補完部分になる。
より簡単で、いろんな場合に使える方法がありましたら教えてください。
矩形同士の重なりなんてRectangle.Intersectでいいだろ
menustripをウインドウの上に固定するにはどうしたらいい? 今は大きい画像を読み込んで↓の方にスクロールさせると menustripが消えてしまう
>>591 画像を表示するパネルに一緒にMenuStripを乗っける馬鹿がいるか。
画像処理する時処理を少しでも軽くするため ポインタ使おうかと思うんですが C#の流儀に反する?
反しない。普通にunsafeで使え。
>>593 不安ならPaint .NETのソースをunsafeでgrepしてみたら?
C#のエントリポイント、なにを書くところかさっぱりわからない
プログラムを開始してやりたいことを書けばいい。 イベントドリブンなプログラムなら、ハンドラを登録しまくれ。
とりあえず自動生成されたのを眺めていたけどクラス(デフォだとForm1)を呼び出して起動、みたいになってる様子 その呼び出されたクラス内のコンストラクタでハンドラだとかコモンコントロール?だとかを登録してる
enum型のToString()って独自定義出来ないものだろうか。 ComboBox.Itemsにするのに出し入れで変換するのが面倒くさいから日本語で要素を定義してみた。 IntelliSenseは特に問題ないけど違和感ありまくり
>>599 enumみたいな構造体を自分で定義すればいいのでは?
struct EnumWrapper<T> where T : struct { private T value; public T Value { get { return value; } } public EnumWrapper(T value) { this.value = value; } public static explicit operator T(EnumWrapper<T> value) { return value.Value; } public static explicit operator EnumWrapper<T>(T value) { return new EnumWrapper<T>(value); } public override string ToString(){ ToStringAttribute[] attr = (ToStringAttribute[])typeof(T) .GetField(Value.ToString()).GetCustomAttributes(typeof(ToStringAttribute), false); return (attr.Length != 0) ? return attr[0].String : Value.ToString();}} [AttributeUsage(AttributeTargets.Field)]class ToStringAttribute : Attribute { public string String { get; private set; } public ToStringAttribute(string str) { this.String = str; }} enum MyEnum { [ToString("いちばん")]One, [ToString("二番")]Two, } こんな風にするとか
enum の要素に属性ってつけられたっけ
フィールド扱いだからAttributeTargets.Fieldで可
>>601 ぼやきのつもりで書いたのに、あっさりこんなコードが出てきて驚きました。
中程のreturnの行の真ん中のreturnだけ削除したと思います。
使い方にちょっと悩んだけど
初期設定で
ComboBox.Items.Add((EnumWrapper<MyEnum>)MyEnum.One);
使うときには
(MyEnum)(EnumWrapper<MyEnum>)ComboBox.SelectedItem
ですね。
ありがとうございました。
なんかC#ってなんでもできそうな気がしてきた。
605 :
デフォルトの名無しさん :2008/01/27(日) 17:21:47
質問なんですが struct Foo{...}という構造体があって Foo foo = new Foo(10, 20, 30); とやる場合と foo.a = 10; foo.b = 20; foo.c = 30; では後者のほうが高速なのですか? 構造体のコピーが発生する時ってnewとかreturnとか、あと何がありますか?
しるか。
>>605 構造体のnewでコピーは発生してない。
後者の方が最適化されやすい場合があるみたいだけど基本的にはほとんど変わらないみたい Foo foo = new Foo { a=10, b=20, c=30 };はだいぶ遅い
C#わかんねーな。 >560は只の基地外だと思ってスルーしてたけど、 もしかして最適化狙いかと、勘ぐってしまう。
>>556 は単に図形の頂点か何かを直接書きたかっただけだろ
たまたま規則性のある例を挙げたから誤解されただけで
>>608 確かにC#3.0のその構文のときはコピーが発生してるね。
妙なコードを吐いてる。構造体のときは要注意か。
Foo temp = new Foo(); temp.a = 10; temp.b = 20; temp.c = 30; Foo foo = temp; になるんだっけ。
>>613 それがなぜかスタック3つも使ってる。
Foo temp1 = new Foo();
Foo temp2 = temp1;
temp2.a = 10;
temp2.b = 20;
temp2.c = 30;
Foo foo = temp2;
クラスだと2つなのだが。
それって何が嬉しいんだろう。 クラスの場合も良く分かんないんだけど。
>611 ありがとう。質問するときの参考になった。
800*600の画像があったとします。 逆透視変換のためにその画像を上辺900、下辺800、高さ1000の等脚台形に変換したいのですが、 .NETのクラスを使って簡単な方法があれば教えていただきたいです。 OpenCVのアフィン変換とかになるんですかねやっぱり。
atomicってなにwww 下の方読んで何となくわかったけど。
同期のためか。
もう
>>608 みたいな書き方するときはパフォーマンスなんて気にするな、
ってことかな。
>>617 うまく計算してWPFの3D機能でやるとか
ピクセルロックして頑張るとか
初歩の初歩だとは思うのですが ラベルやテキストボックスの文字列をセンターでそろえるというのはどうすればいいのでしょうか? ググってもなにやらコードを書く必要があるような記述ばかりなんですが、プログラムから制御を 行わないとできないのでしょうか?
VS使えばいいと思うよ
へたな本読みながら一つずつ機能を知っていくより Visual C# Express Editionと、それと一緒に入ってくるMSDNドキュメント 見ながら遊んでる方がずっとコントロール廻りは理解できるよ
VS6.0からVS2008に移った俺はMSDNの進化に感動した
>>622 フォームデザイナ上で、
複数コントロールを選択した状態で
ツールバー>書式>整列
最初に選択したコントロールを基準に整列してくれる。
627 :
デフォルトの名無しさん :2008/01/28(月) 17:57:40
2001のMSDNはウンコだったが2005あたりからようやくマシになった
>>627 通信回線が発達してオンラインがまともに使えるようになってから
かなり使えるようになったと感じる
いやローカルにインストールするライブラリのこと
>>625 は言ってるんだと思いますが。。
オンラインなんてレスポンスが悪すぎて使ってられない
おまけにブックマークしといても数ヶ月でリンク切れになるしねw
MSは何故C#の匿名メソッドをレキシカルクロージャーにしなかったの? 理由分かる人いたら教えて。
プログラマが選択できるようにしてあるし
VC#であるプログラムを作っていて、アイコンを埋め込みたいと思いました。 そこから少し話は反れて飛びます ソリューショネクスプローラのResources以下にicoファイルを入れ Form.Icon = ((System.Drawing.Icon)(resources.GetObject("アイコンファイル名"))); ↑このようにするとアイコンをセット出来るのではという結論に至りました しかしコンパイルは通るもののデバッグになるとこの記述の部分でエラーが出ます 'System.Resources.MissingManifestResourceException' のハンドルされていない例外が mscorlib.dll で発生しました。 エラーはこの通りです 見たところ、アイコンファイル自体みつけられてないのか・・?と思いましたがアイコンファイル名はいくら確認しても正しいです 何が間違っているのでしょうか?
ああ、大間違いだよ
違うよー
よく覚えてないけどソリューションエクスプローラにぶちこんだら相対指定で使えるだろうに
System.Collections.Generic.List#Add が System.ArgumentOutOfRangeException: 容量が現在のサイズより小さい値です。 なんて投げてくるんですが、これって .NET Framework のバグですか?
あーごめん。3秒で疑問が氷解。複数スレッドが一度に Add しようとしてました。すみません。
>.NET Framework のバグですか? これって見る度ネタなのかどうか理解に困る
大抵はそれを本気で言ってるし言う奴は低レベルと相場が決まってる
いや、今日初めて言ってみて、初めて言う輩の気分がわかったwwww マルチスレッド関係はやっぱ鬼門だわ……
画像処理関連で質問です。 1600*1200のbmp1があり、そのbmpの指定した座標(x,y)を支点として、 300*300のbmp2を重ねたいのですがどのようにすればいいのでしょうか。 Bitmap bmp1 = new Bitmap(filename1); Bitmap bmp2 = new Bitmap(filename2); bmp1.Add(x,y,bmp2); のような感じでできないのでしょうか? BitmapクラスとImageクラスのメンバをオブジェクトブラウザで眺めてみましたが、 そのようなメソッドを見つけることができませんでした。 GetPixelしてSetPixelするという操作を全量に対して行うしかないですか?
>GetPixelしてSetPixelするという操作を全量に対して行うしかないですか? それでもいいし bmp1のGraphicsを取得してそれでbmp2をDrawImageしてもいいよ
そしてIndexedなBitmapという落ち
646 :
643 :2008/01/29(火) 18:56:08
>>644 ありがとうございます。
追記になりますが、その画像をjpegで保存したいと思っています。
描画にGraphicsクラスを使ったことはありますが、描画した画像を保存したことがありません。
DrawImageして出来上がったGraphicsクラスのインスタンスを使って
画像保存をすることはできますか?
は?じゃないが
Graphicsクラスのインスタンスでは出来ないが、Graphicsには描画対象となるImageなりなんなりが必ずあるので、そっちの機能で保存すればOK
pictureboxより大きい画像を表示したばあい、スクロールバーを自動で表示したいけど無理ですか?
Panelに入れればいいだろ
kami
どーんと行こうや
656 :
デフォルトの名無しさん :2008/01/30(水) 10:13:51
こんにちは ToolStripMenuItemのAllowDropをtrueにしてもOnDragEnterのイベントがきません MenuTripだと正常にイベントがきます 何かご存知な方がいましたら 教えて頂けると助かります。 よろしくお願いいたします。
自分でイベント追加したら?
658 :
656 :2008/01/30(水) 13:52:55
デリケートでイベントを追加しましたが うまくいきません 開発環境はvs2005、vistaです
似たような質問どっかで見たな。ここか前スレだったかなー
前スレ945ぐらいかな
ユーザーコントロール作ってみた で、完成度が高くなったので コントロールライブラリにしようと思ってDLL作ったんだが このDLLの使い方がわからない漏れはどうしたらいいですか?
完成度低いから心配いらないよ
我々の社会って連呼かよ 中国って何回言った? 死ねや
誤爆スマソ
プログラマにもネトウヨ君っているんだね まあ近頃は一口にプログラっていっても知的水準はいろいろだからなw
プログラマ(笑
うんチョンで学生でいいよ別に。 で「チョン」って何ですか? ネトウヨ君の仲間うちで通じる「ヲタ用語」みたいなもの?w
他所でやれ
PGはリベラル派が多いんだろうな。
「PG」だと微妙かもなw
>>665 は例の餃子たべちゃったんだよ。
そっとしといてやろう……( -人-)
673 :
デフォルトの名無しさん :2008/01/30(水) 22:12:15
餃子とか右翼の話は他でやれよ スレタイ読めないバカども
フォームの位置とか状態(最大化、最小化とか)を次回起動時に復元しようと プロパティのApplicationSettingsからLocation, ClientSize, WindowStateを保存するようにしたんだが なんか挙動がおかしい。 最大化ボタン押しても最大化しなくて何故か位置が変わったり。 なんでだろう。
なんでだろうね。
676 :
656 :2008/01/31(木) 02:04:44
前スレ945とは症状が違うようです。 ファイルのドラッグ&ドロップなら私の環境でも問題ありません。 Googleで探してますが、なかなかヒントが見つかりません。
TreeViewの中身を保存しようとしています。 TreeView.Nodes[0]をBinaryFormatter.Serializeで保存し、 読み込みはBinaryFormatter.Deserializeした結果をTreeView.Nodes.Addすることで一応実現できました。 ただこの方法だとツリーの展開状態と選択状態が復帰できません。 現時点ではTreeNodeと下のクラスが混在しているのですが、 TreeNode自体ではなく、TreeNodeから派生させたクラスを使うようにして そのクラスのDeserializeで展開状態とかを一旦内部フィールドに保存して、 TreeViewに追加した後に復帰させるしかないかなと思っているのですが もっと良い方法があるのでしょうか? [Serializable] public class TVKeyword : TreeNode { public TVKeyword() : base() { } protected TVKeyword(SerializationInfo serializationInfo, StreamingContext context) : base(serializationInfo, context) { } protected override void Deserialize(SerializationInfo serializationInfo, StreamingContext context) { base.Deserialize(serializationInfo, context); Keyword = serializationInfo.GetString("Keyword"); } protected override void Serialize(SerializationInfo si, StreamingContext context) { base.Serialize(si, context); si.AddValue("Keyword", Keyword); } public string Keyword { get; set; } }
678 :
677 :2008/01/31(木) 09:06:37
保存されたファイルを眺めていたら、 どうやら展開状態はそもそもシリアライズされていないように見えます。 派生クラスを作ることにしました。失礼しました。
679 :
643 :2008/01/31(木) 10:26:47
>>647-651 ここの回答者はOOPというものが全く分かっていないのか?
Graphicsクラスのインスタンスを使わないで、どうやってGraphicsクラスの
インスタンスメソッド(DrawImage)で描画しようとしているオブジェクトを保存するんだ?
>Graphicsクラスのインスタンスでは出来ないが、
>Graphicsには描画対象となるImageなりなんなりが必ずあるので、
>そっちの機能で保存すればOK
実際にコーディングしてみましたか?
どう考えても、Graphicsオブジェクトを作成するときに使っただけのImageオブジェクトが、
インスタンスメソッドであるDrawImageによって変更されているはずがない。
DrawImageの引数にImageオブジェクトが参照渡しで渡されているのならば別だがね。
だからこそ
>>643 のように質問しているわけなのだが。
てっきりGraphicsオブジェクトがメモリ上に保持しているGDIビットマップオブジェクトのハンドルを
取得して云々とかそういうアドバイスがくると思っていたのに、見当違いな回答しかこない。
挙げ句の果てに
>>650 のようなアホまで出る始末。分かってないのはどっちだと・・・
>>643 みたいなアホな質問してる割には偉そうだなw
>>680 >>643 の質問が低レベルなのは十分承知の上だよ。
でもそれにたいする回答者が見当違いのアホ回答をしてきたからこそ噛みついているわけで。
少なくともあいつらよりは分かっているつもりだが。
もしもGraphicsクラスを使わずに、かつImageオブジェクトで泥臭い全量ループすることなしに、
他のアプローチでもっと簡単に実現できる方法があるのであれば、是非ご教授願いたい。
>>679 ,681
心底意味が分からん。
ベースとなるBmp1から作ったGraphicsを使ってBmp2をDrawImageするだけじゃん。
何をぶち切れてるのか知らないけど、下のコードでtest.jpgは黒く塗り潰されたよ。 ImageもGraphicsも触ったのは初めてだけど、MSDNライブラリ見てったらすぐにサンプル見つかったよ。 Graphicsクラスの概要に「イメージ、ビットマップ、アイコン、およびメタファイルの操作」ってリンクがあるから そこの「方法 : 実行時にビットマップを作成する Image imageFile = Image.FromFile("sample.jpg"); Graphics newGraphics = Graphics.FromImage(imageFile); newGraphics.FillRectangle(new SolidBrush(Color.Black), 100, 50, 100, 100); newGraphics.Dispose(); imageFile.Save("test.jpg"); IDない板だし「は?」とかだけじゃ誰が何を言いたいのかさっぱりわからない。 はたから見てるとどういうやりとりなのか全くわからなかったから、スルーしてたんだよ。 ちゃんと誰で何を言いたいのかわかるようにしてたら、とっくに解決してたと思うけどね。
>>679 >>681 >どう考えても、Graphicsオブジェクトを作成するときに使っただけのImageオブジェクトが、
>インスタンスメソッドであるDrawImageによって変更されているはずがない。
何に怒ってるのかわけ分からん。
>>682 >ベースとなるBmp1から作ったGraphicsを使ってBmp2をDrawImageするだけじゃん。
だな。
Bitmap bmp1 = new Bitmap(filename1);
Bitmap bmp2 = new Bitmap(filename2);
using (Graphics g = Graphics.FromImage(bmp1))
{
g.DrawImage(bmp2, x, y);
}
これでbmp1の中身が変更されるはず。
bmp1.Save("check.bmp");
あたりで確認できるかな。
まあ今から棒グラフみたいなものを書きたかった、描画知識0の俺には ちょうどいい話題だったぜ。
ごめんなさいはマダー? (・∀・ ) っノシ凵 ⌒☆チンチン
質問がネタに見えて仕方が無い。質問主はこれ試してみろ。
>>683 >>685 Save()メソッドはデフォルト.png保存じゃなかったっけな?
using System.Drawing;
using System.Drawing.Imaging;
class Hoge{
static void Main(){
Image img1 = Image.FromFile("1.jpg");
Image img2 = Image.FromFile("2.jpg");
Graphics g = Graphics.FromImage(img1);
g.DrawImage(img2,100,100,200,200);
img1.Save("hoge.jpg",ImageFormat.Jpeg);
}
}
お前らの優しさは南半球まで響き渡るわ。
>>681 >Graphicsクラスを使わずに
なんか初め
>>643 から新しく条件加わってるけど、何でGraphicsクラス使ったらいけないんだ?
Graphicsクラスでやりたいことが楽にできるのに、わざわざ自分で新しく作る必要ないだろ?
691 :
651 :2008/01/31(木) 12:24:16
>>643 だからよう、Graphicsクラス自体は描画機能を持っているだけで、描画対象は別に必要なんだよ。
だから、描画対象となるオブジェクトを指定せずにGraphicsクラスのインスタンスを作成出来ないようになってるわけ。
Graphicsクラスのインスタンスメソッドを使用して実際に変更されるのは描画対象オブジェクトのほう。
>>688 指定した拡張子に対応するImageEncoderがあれば、自動的にその形式で保存されるはず。
>>679 こっちはコード書いたことあるからわかってんだよ
それで動かないってどんな糞コード書いたんだよ
晒してみろよ
アホすぎて生きてる価値ないんじゃね
なるほど、このスレでは横柄な態度で質問したほうが答えが付きやすいってことだな
>>681 > もしもGraphicsクラスを使わずに、かつImageオブジェクトで泥臭い全量ループすることなしに、
> 他のアプローチでもっと簡単に実現できる方法があるのであれば、是非ご教授願いたい。
bitmap
横レスだけど正直
>>643 の切れ方は意味がわからないな。
いきなり「オブジェクト指向が〜」とかキレてるのよんでリアルでコーヒー吹いちゃったよw
というか、適当にレスを拾い読みした感じでは、
>>643 はWinの描画の考え方っていうか
デバイスコンテキストって概念を知らないんだと思う。
まあ最近の.NET用の入門書はこのあたり解説してないのが多いと思うから無理もない。
たぶんさ、PC-98時代のビットマップスクリーンと同じ発想で Winのグラフィックも考えてるんだろうね。 だとしたら結構年長のオジサマなんだと思うよw
いやこれどうみてもガキだろ
>>679 の一番痛いところは
> Graphicsクラスのインスタンスを使わないで、どうやってGraphicsクラスの
> インスタンスメソッド(DrawImage)で描画しようとしているオブジェクトを保存するんだ?
ここ
描写しようとしているオブジェクトは Graphicsクラスのインスタンス となんら関係がない
勝手に持ってろって話
ここまで能無しだと釣りに思えるんだが・・・ 本気でこんな事言う人間が居るのか?
701 :
643 :2008/01/31(木) 13:16:43
ごめんなさい
それだけ?
703 :
643 :2008/01/31(木) 15:53:11
全面的に私が悪かったです。
これまでの暴言を心よりお詫び申し上げます。
何卒お許し下さい。
経緯及び結果を説明します。
>>617 =
>>643 =
>>646 =
>>648 です
流れとしては、1600*1200の画像から台形補正をするために、
1600*1ずつ切り取っていって、それを目的の等脚台形にするために横にのばして
貼り付けていくという手法を試みたのです。
画像処理は初めてだったので、
>>643 の質問をしてみました。
Graphicsクラスを使って実現するためには、Graphicsクラスのメンバ変数にImageオブジェクトが
格納されていなければならないと思いこんでいました。←勘違い
実際は、
Graphics newG= Graphics.FromImage(img);
この引数で渡されたImageオブジェクトをGraphicsオブジェクトがPrivate変数で保持していて、
それに対して処理を行っているということなんですね。
だから引数で渡されたオブジェクトそのものが変更されると。
値型との区別が付いていなかったようです。←低脳
ということで、結果としてはやりたいことができました。
以下にコードを記します。
704 :
643 :2008/01/31(木) 15:55:34
using System.Drawing; using System.Drawing.Imaging; class Hoge { static public void Main() { int newX = 3200; int newY = 3200; Image bmp = new Bitmap("input.jpg"); //画像読み込み[1600:1200] Image newbmp = new Bitmap(newX, newY); //編集後イメージ(等脚台形格納用) Image tmpbmp = new Bitmap(newX, bmp.Height); //編集作業用イメージ(台形格納用) RectangleF destRect = new RectangleF(0, 0, 0, 1); RectangleF srcRect = new RectangleF(0, 0, bmp.Width, 1); Graphics newG = Graphics.FromImage(newbmp); Graphics tmpG = Graphics.FromImage(bmp); Point[] pt = new[] { new Point(0, 0), new Point(newX, 0), new Point((newX + bmp.Width) / 2, newY) }; //等脚台形変換用平行四辺形の3頂点 //続く
705 :
643 :2008/01/31(木) 16:02:49
//続き int tan = (newX - bmp.Width) / bmp.Height; //台形積分計算用 //台形作成用ループ for (int i = 0; i <= bmp.Height; i++) { srcRect.Y = i; destRect.Y = i; destRect.X = newX - i * tan; //tmpbmpに貼り付けていく tmpG.DrawImage(bmp, destRect, srcRect, GraphicsUnit.Pixel); } //tmpbmpの保存 tmpbmp.Save("tmp.jpg", ImageFormat.Jpeg); //等脚台形に変換してnewbmpに格納 newG.DrawImage(tmpbmp, pt); //jpgで保存 newbmp.Save("output.jpg", ImageFormat.Jpeg); //終了処理 tmpG.Dispose(); newG.Dispose(); newbmp.Dispose(); tmpbmp.Dispose(); } }
706 :
643 :2008/01/31(木) 16:06:46
補足ですが、この台形補正では逆透視変換は実現できませんでした。 こんな単純なアルゴリズムで実現できるはずがないということにもっと早く気づくべきでしたかね。 結局OpenCVの力を借りて実現する方法にしたいと思います。 Cの勉強しなくては・・・ .NET脳の私には頭が痛いです。
本当に初心者な質問で恐縮なのですが…… Windowsアプリ(VC#2005)で、XMLとCSVから読み込んだデータをDataGridViewに表示させようとしています。 そのときのバインド方法なのですが、下記の2パターンの差がわかりません。 BindingSourceのデータソースとして(DataTableではなく)DataViewを使用するメリットって何かありますか? DataTable→DataView→BindingSource→DataGridView DataTable→BindingSource→DataGridView
DataTable.DefaultView以外のDataViewを使える
C#でスタック関係の直接操作ってできますか?
なんでスタックなんか弄りたいんだ?
関数のカリー化を実装したいとか
それならdelegateでいいだろ
714 :
710 :2008/01/31(木) 18:22:59
うまく説明できないのでまとめると
ウィルスチェックってどうなってるんだろう?
→全ファイル走査するにはどんなやり方がスマートなんだろう
→再帰処理を使って全部辿るのがベターらしい
→なんだか重くなる
(ここら辺から迷走気味)
→コールスタックとかを知る
→すたっくおーばーふろー・・?
(本格的に迷走)
→スタックを直接操作できればどうにかなるんじゃね?
こんな感じです
質問をするにもどう質問すればいいかわからず
>>710 のような具合で質問しました
再帰処理をほぐす、すなわち、 再帰処理で、保存・復帰してる情報(今探索してるフォルダの情報)を、 インスタンス変数にリストか何かで保持するようにして、そのリストで、 保存したり取り出したりして、本体はループになるように書き直す、 というのがだいたい定番。 ファイルシステムの場合、親フォルダを ".." で探せることを利用すれば、 そういう面倒なことをしなくてもうまくいくかもしれない。
吹いたw とりあえず重くなる原因を確認したほうが良いよ
再帰関数でローカルな変数が多すぎなら、 関数を何とかする手もある。
そもそも再帰の脱出条件ミスってて、無限に掘ってるかもしれんなw
>>715 つまり再帰処理を行う回数を最初に逆算しておくってこと、かな
ディレクトリの階層数があって更に木構造のように枝分かれしていくのを考えると
すごく大変そうですがちょっと調べつつがんばってみます・・・
>>716-718 しっかり終了はするんですが、時間が経つとだんだんと重たくなってきます
CPU使用率の方が、他アプリケーションをがんがん使うと結構きつくなったりするようです
お前のパソコンはウィルス検索中に他アプリケーションがんがん使ったら重たくならないか・・? うちのノートン先生は重たくなる
>>719 > つまり再帰処理を行う回数を最初に逆算しておくってこと、かな
「配列」じゃなくて「リスト」って書いた意味を汲んでくれないかな...
・探索中にサブディレクトリを見つけたら、現在の状態をスタックに積み上げて、 サブディレクトリの探索を開始する。 ・現在のディレクトリの探索が終了したら、スタックから状態をとってきて、 そのディレクトリの探索を再開する。 ・スタックが空になったら終了。 何も難しいことはない。
再帰をループにするときはスタックに変数を入れるんじゃなかったっけ。
Directory.GetFiles(@"c:\", "*.*", SearchOption.AllDirectories); とかじゃだめなのか?
あ、かぶった。
>>725 それだとXP以降のOSではシステムフォルダを検索しようとして権限がないので例外が発生する。
また拡張子のないファイルが取得出来ない。
コールスタックの知識自体に間違いがあると問題なのですが、
再帰呼び出しをするからスタックが溜まっていってしまうのであって
ループで何度も何度も呼び出す分には問題ないのでしょうか?
>>721 すみません調べてみます
>>723 やってることは同じなのは感覚として掴めました
しかし全然想像つかないです、じっくり考えてみます
>>725 調べていてDirectoryInfoとかそういうのは見つけました
.GetFiles()とかは使っていましたが引数渡すのは試してないです
ちょっとやりたいことがやられちゃう感じなので今回はパスでお願いします
関数を呼び出すたびに、その時点の実行状態がコールスタックに積み上げられる。 しかし、コールスタックは小さいから、すぐに溢れる。 だから、再帰呼び出しをループに展開する。 そのときには、もとと同じようにスタックを使って実装すると楽。
コールスタックについて学ぶのは良いことだけどさ、 たかがコールスタックが増えたごときで動作は遅くならん。 ましてやディレクトリの深さが 1000 や 2000 も無いかぎり溢れるなんて。
どうでもいいかもしれないけどファイル階層列挙場合はQueueの方が好きかなあ 並び的に
>>730 つまり関数の中で関数が呼ばれてその中で更に・・・みたいのだとあふれちゃうんですよね
スタックはC++でクラスを勉強する時にそういう構造を作ってみた記憶があるので
やってみようと思います
>>731 ですよね・・ちょっと1から作り直してみます
ありがとうございました、助かりました
それにしても良い子であった スタックの実装にArrayListを使ってくれればいいけど
Stack<T>でおk
.NETってどうしてもっさりなん?
メモリ大量に積んだvista使ってから言え! ってゲイツが言ってた
32bitCPUだといまのメモリで限界だろ(2GB)
つーか、スタックぐらい自分で作ればよくね?
Expression Treeって面白いな 時々話題になるT Multiply<T>(T left, T right)みたいなのも簡単に作れる
Mapが見当たらないので作ってしまったが,拡張性高いのはいいなC# static class Extension { public delegate Y MapFuncor<X, Y>(X item); public static IEnumerable<TDst> Map<TSource, TDst>(this IEnumerable<TSource> source, MapFuncor<TSource, TDst> functor) { foreach (TSource s in source) { yield return functor(s); } } }
Enumerable.Selectでいいだろ
.netもっさりとか言ってるやつはどんなボロいPC使ってるん?
.netもっさりって気分は分からんでもない。 結局は結構windowsのAPI使用することが多いし。 何のための.netなんか分からんときがある。
それでも楽じゃん。
>>745 Athlon64 3500+ですがもっさりです
それじゃあたりまえ。
どれ位のCPU使うともっさりしなくなりますか?
>>748 日ごろのメンテナンス次第でいくらでも遅くできるよ
Pen4とかでも、チューニング次第じゃそこそこ動くんじゃね?
今Core2Duoを買う金がないのでAthlon64 X2にでもしてみます。 あの重い2005が軽くなるなら。
メモリ搭載量の方が重要
今AMDは駄目だろ。
メモリ3G詰め込めばOK
2G積んでます。 それと2度目以降の起動はキャッシュが効いて速いです。 よく見ると2005自体にNTFS圧縮が掛けてあるみたいです。
常駐プロセスいくつあるよ?
>>756 安いのならコストパフォーマンス高いんじゃね?
15k以下のラインで
>>759 それやっても大して変化なかったです。
>>760 42個です。極力いらないものは切っています。
NTFS 圧縮のせいじゃね?
4万だせばX2 4000+でGeForce6150のケース付きが変えます。 メモリは別ですが今は5000円あればお釣りが来ますので。
>>763 わかりました。やはりNTFS圧縮のせいでもっさりなのかもしれません。
WordやExcelにもNTFS圧縮掛けていますがもっさりしませんけど。
あとC++Builder2007にも圧縮掛けてありますがもっさりしません。
中間ファイルに圧縮かかってたらもっさりしそう
CPU : pentium4 3ghz mem : 256*2 これでも十分。
>>767 えー
やっぱりNTFS圧縮のせいっぽいですね。
他に原因が思いつかない。
おまえらPC自作板かよ
今思い出しましたが2003の時はNTFS圧縮を掛けてなかったのでか もっさりしてませんでした。 さっそく圧縮を解除してみます。これでだめなら本格的にPCの交換を 考えます。
俺NTFS圧縮掛けてない ちなみにCドライブは80GB
>>762 常駐多すぎ
ノートンいれて起動時に30切るくらい、スタンドアロンで20弱くらいで
>>773 30個?どうやったらそんなに少なくなるんだろう。
WinampエージェントとかDaemon Toolsとか切るしかないか。
俺今3GBだけど起動直後で60個くらいあるわ・・・ しばらく前までは1GBで常駐プロセスとか気にしてたんだが・・・
60は多すぎ。
ちなみに仮想メモリは切ってある
変態的にカスタマイズし過ぎかと
>>774 デーモンとかwinampは関係ないだろ・・・切れよ・・・
msconfigして、スタートアップとサービスから マイクロソフトとセキュリティ関係のやつ全部とめて デーモンバスターいれて、不要なwindowsプロセスとめるといいよ
それくらいはやってるが
ituneHelperとかなめてるよな。
QuickTimeのおそろしさは異常
まったくだw
それ考えるとAcronis True ImageとDiskeeper2007入れてるのが 痛いかもなあ。 Acronis True Imageは定期的にバックアップ取るので仕方ないとして Diskeeperはバックグラウンドでデフラグするので止めた方がいいのかも。 でも何かやってる間はデフラグ止めてくれるんだけど。
>>784 QUick Time Alternative入れてます。
なんか話がスレとかなり違ってきている。
コーデックそのものがffdshowしか入れてないので・・・・って だいぶスレチになってきました。
こういう話なら敷居が低くなるから盛り上がる
うんこな話題にハエがよって来てるだけだろ
そのうんこをためらいなく踏み潰す
>>792 。かっこいー!
開発環境は「できるだけ」素のOSっぽくしときたいよな
まっさらなHDDにOSだけ入れればいいんじゃね?
でもそれだと不便だよ 最低限便利なファイラとか解凍ソフトが欲しい
おまえら学生とかアマグラマ?
cvsサーバーが必要だよな
Windows専用ソフトならWin標準GUI使って欲しい 正直.NET快適、Javaは起動以外快適、動作はもっさり .NETがもっさりするPC使ってみてえ Win98時代のが残ってるけどそっちはHDD小さすぎてなんもできないしな
日本語でおk
常駐起動時50くらいだしStylerとか入れてるがすいすい起動する ブートファイルデフラグを何回かやっていくと起動が目に見えて早くなることがあるから ブートファイルデフラグ→再起動繰り返しでちょくちょく様子みてる
803 :
デフォルトの名無しさん :2008/02/01(金) 11:10:58
.NET2.0のMDIアプリで親フォームと子フォームの両方にToolStripPanelを付けたのですが、 なぜか、この親子間でToolStripPanelのドッキングツールバーが移動できていまうのですが、 両者のツールバーは全く意味が違うツールバーなので移動できないようにしたいのですが、 どうすればよいでしょうか?
何故そんなことをする必要があるのかは抜きにして、 labelに表示してある文字列をstring型で再取得する方法ってあるのでしょうか?
label.Text
その方法だと表示してある文字列じゃなくて "label1"という文字列を取得してしまうのですが・・・やり方が悪いのかな
それはlabelにlabel1って入ってるんじゃないの
すみません、情報が小出しになってしまって。 DateTime nitiji = DateTime.now; label1.Text = nitiji.ToString("d"); これでlabel1に「2008/2/1」って表示されてるとしたら label1に表示されている"2008/2/1"ってのを 文字列で取得したいんです。(nitijiを使わずに) これがやりたいんですが、出来ますか?
いや、だからlabel1.Textだって
小出しにするやつは相手にしない
labelに表示するタイミングとlabelの文字列を取得するタイミングが
後者の方が早くなってしまっていたみたいです。
最初から正解を教えていただいていたのに申し訳ありませんでした。
>>805 さん、807さん、809-811さんありがとうございました。
人の悩み所って色々あってすごいね・・
最近C#を習い始めてまだよく分からないのですが、 学習本の中にはインターフェイスを定義するとき、 public interface Itest { … } と、インターフェイスの先頭にpublic修飾子を付けているものがあります。 本の中で詳しく解説されていないのでよく分からないのですが、 このpublicを付ける場合と付けない場合とでは、何か違いがあるのですか?
>>814 publicでアセンブル(DLL)の外部から使える。
何もつけない場合はinternalで内部のみで有効。
>>815 素早い解答有難う御座います。
なるほど、デフォルトではinternalとなるのですか。
分かりました。
挫折するタイプだな。
すみません。質問いいですか? サーバーに置いたC#のexeってそのままじゃクライアントから起動できないんですか? セキュリティ関係なんでしょうか。。。。 誰かお力をお貸しください
819 :
818 :2008/02/01(金) 19:22:40
すみません。ローカルサーバーです。 言葉が足りませんでした
サーバーソフトは?
どちら側のCPUを使って処理するかによるんじゃないの?
822 :
818 :2008/02/01(金) 19:26:58
んー、すみません・・・ 知識不足で理解できません・・・ \\hogehoge\\hore\foreって感じのパスになるんですが。 本当にお世話掛けます。すみません
823 :
818 :2008/02/01(金) 19:28:01
×\\hogehoge\\hore\fore ○\\hogehoge\hore\fore でした
パスとか何の役にも立たない情報を提供されてもw ちなみに hoge の次は fuga, piyo と続く。
825 :
818 :2008/02/01(金) 19:31:52
>>824 wすみません><
> fuga, piyo
これ信じていいんですか?
ここまでの情報で言うと おそらくSequrityExceptionが発生して終了かと
827 :
818 :2008/02/01(金) 19:34:34
>>826 会社でちょっとしたツール作ってるんですけど
会社で2chはまずいので自宅から書き込みです。
。。ですので詳細を説明する事ができないのが申し訳ないのですが・・・・
そもそもC#じゃなくても実行ファイルは・・・・・・・・・・・起動できるの? かなり危険だよね。
C#でサーバに置いたファイル、ということならクリックワンス使うのがいい気がするな
.net言語は一度中間言語に直してから必要な部分をそのつどコンパイラして実行しているわけですよね? これをサーバー側のpcのcpuで行ってデータだけをユーザー側に送るなら、サーバーのPCに対してユーザーにアクセス権?を与える必要があるんじゃないですか?
831 :
818 :2008/02/01(金) 19:39:38
>>828 !!
・・・・なるほど。そういうもんなんですかぁ・・・
こちらの住人さんがおっしゃるなら正しいと思います。(本気ですよ)
ありがとうございました。そしてお騒がせしました
>>831 いや、聞いているんですけどね・・・・・・・・・・・・・・・・
実行ファイルをを CGI に使うのはわりと普通だよ。
834 :
818 :2008/02/01(金) 19:42:43
> .net言語は一度中間言語に直してから必要な部分をそのつどコンパイラして実行しているわけですよね? なるほど!目からウロコです。そうですよね、JITコンパイルするのは サーバー側になってしまいますよね。 んー簡単に考えていた私が浅はかで恥ずかしいです><
クリックわんこで解決。
>>830 \\hoge~.exeでクリックすると実行されるFWはローカルじゃなかったかな
でもセキュリティ例外が出るので鯖での権限設定は必要だったかと
・・・あきらめてEXEばら撒いたので解決策はよくわからない^^
webブラウザが要求してプログラムを起動させるんですよね?
838 :
818 :2008/02/01(金) 19:47:36
すみません。会社から呼び出しが掛かってしまいました・・・・・・・ もし宜しければ色々と情報をお教えいただけると助かります。 クリックわんこも自分なりに調べてみますね ・・・・・・んでは行ってきますorz
839 :
818 :2008/02/01(金) 19:48:50
>>837 あ、すみません。サーバーフォルダのexeをショートカットで直に叩くつもりなんです
クリックわんこが気になる・・・・・・・・・・・・・
会社から2chで質問って・・ MSDNフォーラムにでも行っとけまじで。 つかその状態ならクリックワンス配信だろJK
たしかにClicOneceに可能性がある。 すごいなC#・・・・・・・・・・。
Func<>でパラメータにvoidを指定したいのですけどどうやるのでしょうか? voidってかいたらだめだといわれました.
何故コードとエラーメッセージを書けないのか、頭がおかしいのだろうか
>>844 読み取りも書き込みもできない型なんてあるだけ無駄だからコンパイラさんがエラー吐いてくれてるんだとおもえ
848 :
844 :2008/02/01(金) 21:02:23
Actionなんてのもあるのですね.これまで見たのがFuncだけだったのでこれしか知りませんでした. ありがとうございました.
Sequrity とか Onece とか……一体このスレはどうしちゃったんだ
Let's Engrish with me!
ク・・クナイフ
ホ・・ホングコング
キ・・キングコング
頭が不自由な奴らってのはどうして繰言が好きなんんだろね。 そういや知的障害の子とボケ老人も繰言ばっかり言ってるよなw
Engrishなのだろうかこれ…
エイゴリアン見ないと・・・
エイドリアン
繰言・・・クリゲン?
そんなちょっとしたツールで軽い気持ちでクリックワンスに手を出したら後悔するぞ
JITコンパイルも実行も全部ローカルだよ。 ってか適当なこと書きすぎだろ。 サーバに実行ファイルがある場合はイントラネットゾーンになって デフォルトの権限が弱くなるだけだ。
タスクトレイに登録されているアプリケーションまたはプロセスの一覧は取得できないのでしょうか? Process.GetProcess()や Process.MeinWindowHandleを試したのですがうまくいきませんでした ご存知の方おられましたらよろしくお願いいたします
「C#の絵本」ってどうなの?
865 :
デフォルトの名無しさん :2008/02/02(土) 03:23:10
>>864 >>C#を気軽に学べる一番やさしい解説書!
だってよ。
>>866 そうですか・・・(´・ω・`)
実行時にタスクトレイに常駐(ウィンドウなし)する
アプリケーションがあるのですが、プロセスを殺していいかどうかの判断ができないんですよね・・・
どうしたらいいんだろう
最近C#はじめてびっくり C++とか糞に見えてきた
>>868 んなこたあない
グラフィックはGDI+で遅いし.NETはなぜかもっさりする
C#でもポインタ使えば早いじゃん
C#最高、.NETがダメ
>>869 何故かもっさりって原理分かってれば当然かと。
>>872 JITコンパイル終わった後ももっさりするんだよ
吐くコードが糞なのか?
書くコードが糞
つまり糞を見て「なんでこんなに糞なの?」って考えてるようなもん
そしてそのうんこをひりだしたのが
>>873 自身ってわけだな
>>873 もっさりって言っても、Cのコードの2倍以内だろ?
もっさり感じるのは、やっぱGUIとか他の要因だと思われ。
WinForms以外で遅いなら書いた奴が糞だと考えざるを得ない
wpfももっさりしてる
直接Direct3D使うならC++とほとんど変わらないくらい速いのにな なんであんなに重くなるのか
WPFが重いのはポトペタ開発の支援にそこかしこでリフレクション使ってるからじゃないかな。 データベースの内容を表示して変更するだけみたいな、ちょこっとしたプログラムなら、 IDEでコントロール置いてプロパティ編集するだけで、ほとんどコード書かずに済んだのには感動した。
WPFはフリッカーフリーとかティアリングフリーとか 最悪の状況を回避が基本だからというのがあるんだろう 今までのWin32が持ちにくかったものだな 逆に言えばやっとではあるんだが・・・ つかWPF重くないと思うよ。実現している内容を考えるに
実行ファイルを起動するのは・・・・・・・・・・・・・・ 本当に大丈夫だろうね?
>>883 大抵の場合においてオーバースペックだから、formsの単純な代用にはならんのだよなあ。
>>884 レジストリ云々のメッセージが出てきた。
>>884 こんなところでわざわざ紹介するならせめてソースくらい付けろよ
まあ見るまでもなく想像つくし見ようと思えば見られるけど
>>884 ソース出せバカ。
出せないならC#スレに書くな。ボケ。
こんな素人丸出しの奴が作ったレジストリを触るプログラムなんて誰が動かすんだよw
WMEの接続人数を変えたい! │ ├ 1.PCを買い換える │ │ [まちがい] │ 確実な方法ではありますが、お金がかかるのが難点です。 │ それよりも別の手段を探してみませんか? │ ちょっとしたフリーウェアでなんとかなるかも? │ ↑ │ ココがポイント! │ └ 2.RegSeekerを使う [せいかい]
>>886 >オーバースペック
だったらDataGridViewとか無茶やコントロール生まれねえー!
日本語書けよ。 なんだその意味不明な一行レス
や→な タイポですたゴメンナサイ
そこ直してもやっぱり意味不明だと思いますがw こういう人が質問するとエスパー召喚質問になるんだろうねw
?複合コントロールとして肥大化しまくった最たるものだろ? オーバースペックならこんなもの生まれない。
WPFはかなりオーバースペックだが、Windows Formsはそこそこオーバースペック Formsに比べればWPFはよりオーバースペックで、何も矛盾することはない。
visualC#(Express)の、プロジェクトのプロパティ→リソースで画像ファイルを追加しました。 この画像リソースのアクセスレベルをpublicにするには、 Resources.Designer.csのコードを直接いじくるしかないのでしょうか?
>>898 えーと、WPFはプリミティブコントロールを現在の要求に合わせて
整理している感じなのが重要なんであって上位な複合コントロールが
たくさんあったりするわけじゃないぞ。つかその視点ならFormsに劣る
>>882 の1行目が理解出来なんだけど誰か解説頼む。
Assemblyは一旦AppDomainにロードされたらそのAppDomainがUnloadされない限り残る
あ、 >Assemblyは って分かりづらいな アセンブリは、と言い換えとこう
C#でWinAPIって使えないんですか?
.NETの色々あるクラスの定義を見たいけどどこにあるんでしょうか? あれ・・スレ違いでしょうか?
MSDN
>>908-909 えっと使い方というか各メンバ(メソッド)の説明はあるんですが
その実際のコードはあるのかなと思いまして質問しました
MSDNライブラリってそこまでしかないですよね?
VS2008で見れるようになったんじゃなかったっけ
Image.FromFile等でアニメーションGIFを読み込めますが 複数の画像とフレーム間の時間のデータからプログラム中で Imageを生成するにはどんな感じにすればいいのでしょうか?
GDI+じゃ無理 普通にタイマで描画してくんじゃ駄目なの?
SelectActiveFrame って使えないの?
既存のGIF画像になら使える
916 :
912 :2008/02/02(土) 23:54:37
アプリケーションからはアニメーションなImageは作れないんですか… 自分でアニメーションさせてみます。 ありがとうございました。
Win32のPtInRectと同等の機能を持つメソッドって.NETにありますか? 今探していますが見つかりません。 Rectangleのスタティックとしてあるのかと思ったらありませんでした。
gifはファイル構造が比較的単純だから自前でヘッダ書いてく手もあるけどね
>>917 〜〜と同等の機能じゃなくて言葉で機能を説明しろと
まあ普通にRectangleのインスタンスメソッドにあるけどな
サウンド関連で教えてください。 テキストボックスに入力を行った際、エンターキーを押すとシステム設定のエラー音が鳴ってしまいます。 これをプログラム上から鳴らなくするにはどうすればいいのでしょうか? winXP sp2 で VS2005です。
TextBox ビープ音
923 :
899 :2008/02/03(日) 01:46:57
自己解決しました。2008にはデザイナに項目が追加されてました。
課題終わらない\(^o^)/
>>924 先生は一人だがお前には俺らがついてる!
926 :
921 :2008/02/03(日) 02:18:03
ググって e.Handled = true; としてもやっぱりBeepは消えてくれません。
インテリセンスで拡張メソッドが候補に表示されるときは頭に「(拡張子)」と表示される しかしMSDNのメンバ一覧では「Extension のメソッド」として記載されてる しかしMSDNではその他の場合は全て「拡張メソッド」 なんだこれ
英語版使え
プログラムを発行する際に 特定のファイルも自動的にインストールされるようにするにはどこに置けば良いのか教えてください
C#の良書があったら教えてください
プロパティを使うと遅くなるから for文などの繰り返し処理の中では 使わない方がいいと聞いたんですが そういうもんなんですか?
プロパティの実装による コントロールのプロパティは中で色々やってて遅いのが多いかも フィールドの値を返すだけの単純なプロパティならインライン展開されてほとんど変わらん
933 :
931 :2008/02/03(日) 14:50:19
今実験してみたら300倍以上違ったwww 簡単な画像処理でテスト。 1: 12889msec 2: 38msec 1.プロパティ使いまくる場合 for (int y = 0; y < bmp.Height; y++){ for (int x = 0; x < bmp.Width; x++){ if (data[y * bmpData.Stride + x * 3] == Color.White.B){ data[y * bmpData.Stride + x * 3] = Color.Black.B; } } } 2.変数を使う場合 int w = bmp.Width; int h = bmp.Height; int yPos; byte white = Color.White.B; byte black = Color.Black.B; for (int y = 0; y < h; y++){ yPos = y * bmpData.Stride; for (int x = 0; x < w; x++){ if (data[yPos + x * 3] == white){ data[yPos + x * 3] = black; } } }
メンバ変数を直接使うのと プロパティを使うのとで 比較しないと。
Bitmap.Width/Heightは中でアンマネージ関数呼んでる Color.White.Bは新しいColor作成→値渡し→ビット演算 どっちも全然単純なプロパティじゃないの
bmp.Widthとbmp.Heightかな
>>933 その例が極端だとしてもこれはいいこと聞いた
定数クラスに新たに用意してそれでやってみる
は?
>>939 この話がわからない子は参加しなくていいんじゃないかな
荒れる流れストップ
>>938 が言ったことを咄嗟に
>>939 は想像出来なかった
また、他人に伝える意図でないものを
>>938 がレス内容に含めたというのにも問題がある
bmp.Width/Heightが Color.White.Bよりもネックになる理由がわかりません。 どうしてですか?
VBのForループなら
>>933 の前者でも結果あまり変わらなそうだ。
まあとにかく、速度が問題になる場面では可読性犠牲にしてでも(といってもそれで低下する可読性なんてほんの僅かだろうけど)
プロパティーをキャッシュして使った方がいいってことか。
>>942 Color.White.Bがネックにならないのは、コンパイラがそれをリテラルに
置き換えてるからだろうけど、どうしてコンパイラはColor.White.Bの値を
定数扱いしても大丈夫だと知ることができるんだろう・・・
> コンパイラがそれをリテラルに置き換えてるから 頭沸いてるんですか^^;
おまいら!もちつけ! /\⌒ヽペタン / /⌒)ノ ペタン ∧_∧ \ (( ∧_∧ (; ´Д`))' ))(・∀・ ;) / ⌒ノ ( ⌒ヽ⊂⌒ヽ .(O ノ ) ̄ ̄ ̄()__ ) )_)_) (;;;;;;;;;;;;;;;;;;;)(_(
WebBrowserって、MouseEnterのイベントをサポートしてないのか! なぜだ!?
それより困るのは、ArrayList.Countじゃね? ArrayListの実装って配列モドキのくせに CountにO(N)かかるんだけど・・・ 一度それでハマったことがある
は?
>>951 さすがにそれは嘘だろうと思ってソース見てみたら変数の内容返してたよ。
というわけで少なくとも最新版のArrayListではO(1)。
ソース公開便利だね!
>>953 そうなんだ
昔のArrayListで
while(al.count > 0){
・・・O(N)の処理
}
ってやったらやたら時間がかかって、
しばらく悩んでたらArrayList.countがO(N)で、O(N^2)になってたことがある
このときは死ねよと思ったが改善されたなら良かった
WebBrowserでMouseEnterを受け付ける方法ってありますか? もしくは、WebBrowserの親に通知する方法とか。
処理に時間のかかるプロパティは作るな!っていうMSのガイドラインがあるけど あんまり守られてないなw
それを肯定したらC#の存在意義がなくなる foreachもいらないLINQもいらないプロパティもデリゲートもいらない
>>956 根本的な疑問。
「作るな!」って宣言すれば、本質的に重い処理にならざるを得ないプロパティが
軽くなるの?w
>>957 むしろwhileがいらない子なんじゃないの
>プロパティだとなんとなくループ中に繰り返し呼び出してもOKかな?という感じがある むしろその感覚の方を修正すべきなのでは? だってそれは単なる願望であって、現実的な認識じゃないでしょ。
963 :
957 :2008/02/03(日) 16:48:02
とくに違いはないということでよろしいのでしょうか?(´・ω・`)
たしかに、プロパティにルーティンをかけるけど、 実際にどのレベルまで書いていいのかな?って悩む時はあるね。 基本的にメソッドと同じくらいの処理はかけるわけで。。。
get には return 文しか書けないよう、 set には1文しか書けないよう制限すればいいのに。
コントロールのプロパティは仕方ないとしても Bitmap.Widthはコスト無いと思うだろ普通
setだって、配列データをobjectとして渡して、中で分解して使うようにすれば、 実質複数の引数を渡してるのと同じことができるからな。 メソッドと変わりはあんまないような。 つまり、線引きの問題だよな。
>>965 本末転倒でしょそれは。
プロパティの目的はOOP的な思考モデルに実際のコーディングを近づけることにあるんであって、
処理の効率化のためではない。
素朴な疑問なんだけど MSのガイドラインに背いてまで、メソッドではなくプロパティで重い処理をしなければならない 本質的な理由にはどんなものがあるのかな
do-whileがあればいいのに
>>969 セッターでセットした時にクラス使用者には意識させず対象プロパティ以外の値を変更したいとき
今日の話は勉強になった。 次スレも期待
>>969 愚問だね。
その方がライブラリの使用者にとって直感的なインターフェイスだからでしょ。
基本的には、1つに対してのget,setのみの使用でしょう。
977 :
955 :2008/02/03(日) 17:18:56
978 :
955 :2008/02/03(日) 17:30:10
やっかいですね。 これはMFCのプログラミングになっちゃいます。 WM_NCMOUSELEAVEをC#側でdefineしないといけないってことか。
>>974 しかしプロパティの取得に時間がかかるのは直感的ではない、とw
980 :
955 :2008/02/03(日) 17:35:47
const int WM_CLOSE = 0x0010; const int WM_ENDSESSION = 0x16; const int WM_SYSCOMMAND = 0x112; const int SC_CLOSE = 0xF060; のリストが掲載されているWebページってありますか? もちろん今自分で探していますけど。。。
素直にWindows SDK入れとけよ
983 :
955 :2008/02/03(日) 17:38:40
984 :
955 :2008/02/03(日) 17:41:04
>>982 winuser.hにありました。
#define WM_NCMOUSELEAVE 0x02A2
誠にありがとうございます。
985 :
955 :2008/02/03(日) 17:45:38
986 :
955 :2008/02/03(日) 17:52:10
WebBrowserだと、WndProcにWM_MOUSELEAVEのイベントがこないですね。。。 それ以外だと来ますが。 Console出力をして確認して気づきました。 一難さってまた一難。
ここはお前の日記帳じゃない
俺は応援してるよ
>>985 新スレ立てるなら関連スレもはれよ。
中途半端な仕事しやがって。
990 :
955 :2008/02/03(日) 18:07:48
単にWebBrowserでマウスイベントを検出したいだけなんですけどね。 こんなに苦労をするとは予想外でした。
Document.Bodyのイベントを使うのはダメなのか?
中身がHTMLDocumentじゃなかったら使えないだろ。
Application.AddMessageFilterで横どる。色々応用きくからこの際 覚えとけ
TrackMouseEventで始めないと メッセージすら生成されないと思うのだが
995 :
955 :2008/02/04(月) 08:44:44
>>991 さん
htmldoc.Body.MouseLeave += new HtmlElementEventHandler(Body_MouseLeave);
htmldoc.Body.MouseEnter += new HtmlElementEventHandler(Body_MouseEnter);
で、無事にイベントを得ることができました!
素人なもんで、まさかBodyにイベントをデリゲートできるとは思いませんでした。
ありがとうございました!!!
みなさん、ありがとうっ!!!!
でりげーとって何だかよくからない
関数ポインタみたいなもん
オブジェクトの内部状態も保持するからクロージャっぽい場合も+
うめ
ぼし
1001 :
1001 :
Over 1000 Thread このスレッドは1000を超えました。 もう書けないので、新しいスレッドを立ててくださいです。。。