ふらっとC#,C♯,C#(初心者用) Part23at TECH
ふらっとC#,C♯,C#(初心者用) Part23 - 暇つぶし2ch369:デフォルトの名無しさん
08/01/20 21:06:34
>>366
だからグローバルちゃうよ、って364はいってるんだと思いますが。。
ひょっとして(案外よくいるんだが)Cとかのファイルスコープの概念を知らないの?

370:デフォルトの名無しさん
08/01/20 21:09:20
メンバ変数にもアクセス修飾子とかあるから一概には言えないんじゃない。

371:デフォルトの名無しさん
08/01/20 21:18:41
>>366
メンバ変数のスコープは各オブジェクト内で完結
ただしstaticなメンバの場合はどこからでもアクセスできる

372:デフォルトの名無しさん
08/01/20 21:22:57
うん?

373:デフォルトの名無しさん
08/01/20 21:28:30
>>368-371
クラス=ファイル
メンバ=staticグローバル変数
みたいなもんなのかな?

>>369
知ってますよ
でも、案外ファイルの中でも色んな関数から参照されてると
訳分かんなくなりませんか?

374:デフォルトの名無しさん
08/01/20 21:28:49
オブジェクト指向の基本は自分で身につけないと
こんなとこでのやりとりでは理解できるはずがない。

375:デフォルトの名無しさん
08/01/20 21:29:54
あとよくわかんないのはメンバ関数って
インスタンスの分だけ関数が複製されるんですか?
その意味がよくわかんなくて

376:デフォルトの名無しさん
08/01/20 21:30:08
>>373
>クラス=ファイル
>メンバ=staticグローバル変数
>みたいなもんなのかな?

悪いけど全然違う
だから真面目に基本から勉強しろと。
C++も使ったことないの?

377:デフォルトの名無しさん
08/01/20 21:56:18
>>375
されない

378:デフォルトの名無しさん
08/01/20 21:56:26
オブジェクト指向について解説してるウェブページでも適当に探して読んでみるべき。

379:デフォルトの名無しさん
08/01/21 00:10:53
>>375
staticをつけないとインスタンスごとに複製される


380:デフォルトの名無しさん
08/01/21 00:36:05
嘘を教えるな

381:デフォルトの名無しさん
08/01/21 01:23:20
ワロタ

382:デフォルトの名無しさん
08/01/21 08:57:03
LinkLabelについて質問です。
配列でLinkLabelを可変で作成しているのですが、クリックしたときの処理で不明な点があります。
linklabel[i]で複数作成して、クリック時のイベントは一括で一つで処理したいのですが、押されたlinklabal対応させる方法がわかりません。
x = 選択したlinklabelのテキスト みたいな感じにしたいのですが、よい方法はないでしょうか?
buttonだとselectとか使うみたいなんですがlinklabelの場合がわかりませんでした。
あらかじめlinklabel1みたいに作っている方法なら載っているサイトが見つかったのですがこの方法のやつが見つかりません。

383:デフォルトの名無しさん
08/01/21 09:13:50
sender

384:デフォルトの名無しさん
08/01/21 09:23:53
>>382
デザイナで一個置いてイベント設定してdesigner.cs見てみるといいんじゃないか?

385:382
08/01/21 10:37:11
>>383-384さんありがとうございました
x = ((System.Windows.Forms.LinkLabel) sender).Text;としたところ上手くいきました

参考サイト
URLリンク(dobon.net)

386:デフォルトの名無しさん
08/01/21 13:47:00
NotifyIcon.Textにセットするために、文字列が64文字を超える場合は64文字までに切りたいのですが
string.Remove(64)
string.Substring(0,64)
のどちらも64文字未満だと例外が起きるようです。
いちいち文字数のチェックをしないでも、一発で切ってくれるメソッドはないのでしょうか?

387:デフォルトの名無しさん
08/01/21 13:53:06
「いちいち文字数のチェックをしないでも、一発で切ってくれるメソッド」
が存在したとしても、それは内部で長さをチェックしている。

ゆえに自分で作ればよい

388:386
08/01/21 14:02:26
>>387
ということはやっぱりないんですね。
例外が起きると言うことは内部でもチェックしているはずなので
二重チェックになるのが嫌だっただけです。
拡張メソッドを作ることにしました。ありがとうございました。

389:デフォルトの名無しさん
08/01/21 14:07:55
そんなことに拡張メソッド使うな

390:デフォルトの名無しさん
08/01/21 18:26:42
Language Integrated Queryを「統合言語クエリ」と訳すのって変じゃね?
「言語統合クエリ」ならわかるけど

391:デフォルトの名無しさん
08/01/21 18:33:02
LINQってリンキューって読んでるけどあってる?

392:デフォルトの名無しさん
08/01/21 18:34:32
オレはリンク

393:デフォルトの名無しさん
08/01/21 18:46:31
try中に意図的にcatchに移動してほしくて
無理やり0除算発生するようにしてるんだが
もっとスマートな方法はないですか?

394:デフォルトの名無しさん
08/01/21 18:47:40
それ最悪の書き方

395:デフォルトの名無しさん
08/01/21 18:47:56
何か throw しろ。

396:デフォルトの名無しさん
08/01/21 18:49:46
if (flag) throw new GotoCatchException<int>();
else throw new GotoCatchException<String>();

397:デフォルトの名無しさん
08/01/21 18:52:22
そもそも意図的にcatchに移したい処理なんて
設計に問題があるだろ

398:デフォルトの名無しさん
08/01/21 19:02:25
たぶん発想が逆立ちしてるんだろうね。
本来例外処理の外に置くべき処理をcatchの中に書いちゃってる、
なんてオチだと推測する。

399:デフォルトの名無しさん
08/01/21 20:55:41
変数が使われてなかったりするとエラー一覧ウィンドウで「警告」で表示されますが
「メッセージ」も文法的な間違いを発見すると表示されるのですか?

400:デフォルトの名無しさん
08/01/21 21:13:57
メッセージって""内のメッセージか?
警告と並列で括弧でくくってある意味がわからん

401:デフォルトの名無しさん
08/01/21 21:53:03
エラー一覧のウインドウに並んでる
[エラー] [警告] [メッセージ]
のことだろう。
俺もまだ見たことないな。

402:デフォルトの名無しさん
08/01/21 22:52:07
例外の使い方だけど

try
処理1
処理2
catch(ex1)
エラー1
catch(ex2)
エラー2
catch()
想定外エラー

で処理1と2は戻り値無しでNG時にex1とex2をthrowする
って使い方は邪道?
例外は関数エラーに使うべきじゃなかたりする?

403:デフォルトの名無しさん
08/01/21 22:57:22
そうやって使わないで何に使う

404:デフォルトの名無しさん
08/01/21 22:58:44
むしろそれ以外の使い方があったら教えてほしい。

405:デフォルトの名無しさん
08/01/21 23:22:08
それ以外の使い方したら読みにくいだけだろw

406:デフォルトの名無しさん
08/01/21 23:30:16
想定外の例外を握りつぶすのがいいかどうかは賛否の分かれるところじゃなかろうか

407:デフォルトの名無しさん
08/01/22 02:27:48
C#ってスクリプト言語くらい気楽に使えるようにならないの。
いちいちコンパイルとかウザいし。

408:デフォルトの名無しさん
08/01/22 02:35:52
>>397
そうでもないキガす。
とりあえず例外処理に関してテスト条件なんて作らずに
投げたらどうなるんだか見てみたいなんて話はあるかも
しれない。 これはテストをはしょるズボラな俺だけか。

409:デフォルトの名無しさん
08/01/22 06:50:59
JavaScript書き出された文字列を取得
する方法はありませんか。

ブラウザコンポーネントで例えば
document.write("abc")と書かれていれば
このabcを取得したいとのですが。

410:デフォルトの名無しさん
08/01/22 08:47:29
>>400,401
[エラー] [警告] [メッセージ]の[メッセージ]の項目です。
ASPでweb.config内でカスタムセクションを追加した時に、
「属性○○のスキーマ情報が見つかりませんでした」と[メッセージ]でエラー一覧に表示されました。
でも問題なく動作してるのでそのまま続けてみます。
ありがとうございました。

411:デフォルトの名無しさん
08/01/22 08:48:26
>>409
document.body.innerText
つーかおもっくそスレ違い

412:デフォルトの名無しさん
08/01/22 09:52:11
>>407
ソースコードから実行てのはふつーにできるから調べてみれば?
使い物になるかは別だが。


413:デフォルトの名無しさん
08/01/22 18:24:43
CSVの質問です。

//string FileName = "二バイト文字テスト";
Response.AddHeader("Content-Disposition", "attachment;filename=" + HttpUtility.UrlEncode(str.ToString() + ".csv"));

上記のようにファイル名が2バイトになっても正常に「開く」「ダウンロード」「キャンセル」
のダイアログが出るようにしています。

ダウンロードした場合は日本語が含まれたファイル名でダウンロードできます。
「開く」をクリックした場合、エンコードされたファイル名で開こうとしてしまいます。

解決方法はありますか?
よろしくお願いします。

414:デフォルトの名無しさん
08/01/22 18:26:53
あげてしまった・・・

補足で、開くを選択した場合エラーになります
エンコードされたファイル名を開こうとするためです。

415:デフォルトの名無しさん
08/01/22 20:04:33
誰かが作ったクラスライブラリを利用する時は、exeと一緒にそのdllも付けなきゃならないの?
C/C++のスタティックリンクライブラリみたいにexeファイルに組み込むことできないのかな?

416:デフォルトの名無しさん
08/01/22 20:06:44
ilmerge

署名されてたら無理だけど

417:デフォルトの名無しさん
08/01/22 20:43:44
>>416
thx

418:デフォルトの名無しさん
08/01/22 22:48:44
文字列を表示するときに文字の間隔を標準
(Graphics.DrawString で表示されるときの文字間隔)
より1ドットずつ狭めて表示したいと思います。

思いついたのは ExtTextOut を使用する方法ですが、
それ以外の方法(できれば p/invoke を使わなくていいような)
があったら教えてください。


419:デフォルトの名無しさん
08/01/22 22:55:21
Frameworkで定義されているコンストラクタを持たないクラスを使用したい場合、
どのようにすれば使えるのでしょうか?

仮に、public sealed class ModelBoneというコンストラクタが無くプロパティのみを持つ
クラスのインスタンスをローカルで一時使用したいとします。

ModelBone bone = new ModelBone(); としても
'Microsoft.Xna.Framework.Graphics.ModelBone' のコンストラクタが定義されていません'
のエラーが表示されてインスタンスを作成できません。


420:デフォルトの名無しさん
08/01/22 22:57:21
無理
他にインスタンスを取得する方法が用意されてるはずだからそれに従う

421:420
08/01/22 23:02:25
ちょっと見てみたけど、ModelBoneに関してはContentManager.Loadで
モデルと一緒に読み込むしかないんじゃないかな

422:デフォルトの名無しさん
08/01/22 23:03:23
>>418
一文字ずつMeasureCharacterRangesで測ってRectangleF作って
DrawStringすりゃいいんじゃね


423:デフォルトの名無しさん
08/01/22 23:22:23
>407
Windows PowerShell使えよ。

424:419
08/01/23 00:37:32
>>420
やはりインスタンスは作成できないのですか・・・。
このクラスが持つプロパティを自前クラスの関数の引数で使用したくなり、
Frameworkのクラスからインスタンスを作成できない場合
全く同じプロパティとコンストラクタを持つクラスを改めて
定義しなければならないからどうしたものかと悩んでいました。

とりあえず出来ないことが分ったので、他の方法を検討してみます。
ありがとうございました。

425:デフォルトの名無しさん
08/01/23 01:15:38
>>423
ぜんぜん手軽じゃないじゃん。

426:デフォルトの名無しさん
08/01/23 06:25:57
>>420
拡張メソッド使っても無理?

427:デフォルトの名無しさん
08/01/23 07:40:21
そもそも、勝手にインスタンスを作られると不都合だから、わざわざコンストラクタを定義してないわけだ。

428:デフォルトの名無しさん
08/01/23 09:20:32
>>426
拡張メソッドにどんな幻想を持ってるんだ

429:デフォルトの名無しさん
08/01/23 10:19:50
>>428
なんでもできるはず

430:デフォルトの名無しさん
08/01/23 10:28:13
拡張メソッドのおかげで魔法使いにならずにすみました

431:デフォルトの名無しさん
08/01/23 10:38:00
formA、formB、formCがあり、
A→B、A→Cと呼び出すとします。
formBで取得したテキストボックスの値を、formCで参照したいときはどのようにしたらよいでしょうか?

432:デフォルトの名無しさん
08/01/23 10:39:45
formAがformBから値を取得してformCに渡せばいい

433:デフォルトの名無しさん
08/01/23 10:45:53
渡すときはどうしたらいいでしょうか?
FORMC fc = new FORMC(/*取得した値*/);
でしたっけ?

434:デフォルトの名無しさん
08/01/23 11:08:35
コンストラクタでもプロパティでもお好きなように


435:デフォルトの名無しさん
08/01/23 11:13:26
ところで、そのformB、formCはそれぞれ、formAからShowDialog()で呼んでいるのですが、その場合も
>>434さんの言うとおりでいいのでしょうか?

436:デフォルトの名無しさん
08/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で定義されているメソッドをコール;
}
みたいな感じにしたいのですが、何から手をつけていいのかわからなくて困っています。

よろしくお願いします。

437:デフォルトの名無しさん
08/01/23 11:17:55
お前は何を言ってるんだ
ShowDialog()で呼ぼうとコンストラクタには関係ないだろう

438:デフォルトの名無しさん
08/01/23 11:41:18
>>436
I1 i1 = new I1();
I2 i2 = new I2();
↑      ↑
ここ  と  ここ を

よーく見比べてみよう

439:デフォルトの名無しさん
08/01/23 12:56:15
印刷で困っています。
ツールボックスから印刷プレビューのダイアログ(PrintPreviewDialog)をそのまま利用しています。

プレビューでは,意図した画像が正しく表示されるのですが実際に印刷すると一ページだけ
真っ黒に印刷されてしまいます。
これを解決するためにはどこを調べなければならないでしょうか。

440:デフォルトの名無しさん
08/01/23 13:10:23
他のソフトから印刷してみてどう?

441:436
08/01/23 13:10:57
>>438さん
れすありがとうござます。

見比べて見たのですが、やはりinterface同士でなにがおこっているのか理解出来ません

new Interface();
という構文自体が何をしているのかわからないのですが、
もう少しヒントいただけないでしょうか?

442:デフォルトの名無しさん
08/01/23 13:26:54
>>441
よく見ろ。newしているほうはインターフェイスではないはず。

443:デフォルトの名無しさん
08/01/23 13:38:08
>>440さん
お返事ありがとうございます。
ほかの印刷ソフトでは正常でした。
PrintDocumentのデータはどのタイミングで破棄されるようになっているんでしょうか?
何度やっても再現してしまいます。。。

444:436
08/01/23 13:40:26
何度見てもinterfaceです。
そのインターフェースの定義を見ると
[Guid("hoge")]
[CoClass(typeof(I2cls))]
public interface I2 : I4
{
}

とかになっていてどうも思っている異常に複雑そうなのであきらめます。
ありがとうございました。

445:デフォルトの名無しさん
08/01/23 13:45:19
C#のGetFilesのメソッドについて質問なんですが
複数の拡張子(この場合jpg、gif、png、bmp)で
絞り込むのはどう書いたらいいんでしょう?

446:デフォルトの名無しさん
08/01/23 13:46:47
>>445
Path.GetExtensionすりゃいいじゃん

447:デフォルトの名無しさん
08/01/23 14:13:02
>>444
CoClass属性のが実体クラス。

448:デフォルトの名無しさん
08/01/23 15:50:08
>>445
C#の、ってここはC#スレだ、決まってんだろ、ハゲ
第一C#の、じゃなくて.net frameworkの、だろ、ハゲ
それにクラス名まで、書けや、ハゲ

Directory.GetFilesならsearchPatternとるオーバーロードがあるっしょ

449:デフォルトの名無しさん
08/01/23 16:20:38
ツンデレの>>448に萌えた

450:デフォルトの名無しさん
08/01/23 17:48:10
>>448
揚げ足とるな。ばか!!!!!!!!!!!!!!

451:デフォルトの名無しさん
08/01/23 17:50:18
>>450は騙り?

452:デフォルトの名無しさん
08/01/23 18:47:52
トランザクションオブジェクトつくって
INSERTとかUPDATEとかしたあと
コミットもロールバックもしないとどうなりまつか?

453:デフォルトの名無しさん
08/01/23 19:40:34
コネクション閉じる時点でロールバック。
だったと思うけどプロバイダに依存しそう。
ものによっては保留状態になるかも。
いや、手動トランザクションなら保留はないかな?


454:デフォルトの名無しさん
08/01/23 20:36:10
>>453
トンクス
SQL Serverだとそんな感じみたいでつね

455:デフォルトの名無しさん
08/01/23 23:26:09
TabControlのTabPageにいくつかTextBoxとRichTextBoxを配置しました。
あるタイミングで,Text

456:デフォルトの名無しさん
08/01/23 23:31:33
すいません,誤って途中のものを書き込んでしまいました。

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;
}
}

457:デフォルトの名無しさん
08/01/23 23:56:04
>>456

・まず直接フォームのリッチテキストのフィールドで同じことをしてどうなるか
 確認しよう。

・ブレークポイントの使い方を覚えよう。

・こんなくだらないことでいちいち悩んでるようなら、君才能ないのかも

458:デフォルトの名無しさん
08/01/24 00:10:40
RichTextBox rtb = new RichTextBox();
こうしてから、
if(ctrl.GetType().Equals(rtb.GetType()))
こう判定して、
rtb = (RichTextBox)ctrl;
こうやってしまうところに並々ならぬ才能を感じた。


向いてないよ、やっぱり。

459:デフォルトの名無しさん
08/01/24 00:19:16
なれてないだけ

as null

460:456
08/01/24 00:24:57
>>458さん
ご指導ありがとうございます。
勉強になります。

>>459さん
nullなんですね。
ありがとうございます。

デバッガの使い方も分からず,すいません。
ブレークポイントを指定してBorderStyleを見てみるとちゃんとFixedSingle
になっていました。
RichTextBoxはFixedSingleにしても表示が変わりませんでした。
もしかして,そういうものなんですかね。

461:デフォルトの名無しさん
08/01/24 00:47:41
if(ctrl is TextBox)
って,できるんですね...orz

462:デフォルトの名無しさん
08/01/24 01:10:50
キャストするならctrl as TextBoxとしてnullかどうか見た方がいい。

463:デフォルトの名無しさん
08/01/24 01:12:35
>>462
ありがとうございます。
459さんのヒントを頂き,そのようにしました。
型判定について全く無知でした。。。

464:デフォルトの名無しさん
08/01/24 13:11:02
検討違いなこと言っていたらすみません

public static void func(string str1, string str2, bool flag){
 処理
}
このような文字列を2つと論理型で1つを引数とする関数を再帰的に呼び出す部分なのですが
今現在作成中のプログラムの中で、この関数による処理がほぼ全てのようなものです

なのでこの再帰的にこの関数を呼び出すという部分について何か最適化の方法がないかと探しています

関数内の処理はforeachと.NET内のクラスを利用したものでほぼ埋まっているため
そちらに関しては最適化はやりようがないかなと思っています

それではよろしくお願いします

465:デフォルトの名無しさん
08/01/24 13:21:53
>>464
プログラムの概要を教えてもらえんとなんともなぁ
そもそも本当に再帰が必要なのかもわからないし

466:デフォルトの名無しさん
08/01/24 13:42:20
>>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ディレクトリをサブフォルダ内等一切合財移動させるという感じです


467:デフォルトの名無しさん
08/01/24 14:49:16
最適化する意味はどこにもないな。
せいぜい再帰やめることで万が一のStackOverflowを回避するぐらい。

468:デフォルトの名無しさん
08/01/24 15:06:46
再帰させる必要ないでしょ。
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

469:デフォルトの名無しさん
08/01/24 16:22:56
なんでVBなんだよ。死ぬほど読みにくいわ
466は書くと長いって書いてるんだから
全部のファイルじゃなくて、何か条件付けがあるんだろ

470:デフォルトの名無しさん
08/01/24 16:49:37
手元のマシンには、VBしか入っていないからVBで答えたまで。
なんか条件付けがあるというのならなぜその条件を説明しない。
その条件をこっちで考えろってか?
全部のファイルじゃない?
「一切合財移動させる」と書いてあるだろ。

471:デフォルトの名無しさん
08/01/24 16:53:22
.netじゃフォルダ移動したら、その下にあるのも一緒に移動しないの?

472:デフォルトの名無しさん
08/01/24 18:08:56
>>470
スレタイ読んでくれよ・・・

473:デフォルトの名無しさん
08/01/24 19:24:41
 C++の頃に、switch文を嫌ってポリモーフィックを使って対応していた場合(GoFのstateやTemplete Method系?)、
C#にそのまま移植するとキャストやガベコレの為に返って処理が重たくなる事は有りませんか?

 これから具体例を用意しようと思いますが、2,3時間後になると思うので、
場合によるときは何処が焦点になるか、忠告頂けると助かります。
ちなみにC# 2.0です。ジェネリックの恩恵を受けれると嬉しいのですが。


474:デフォルトの名無しさん
08/01/24 19:34:38
参照型→参照型のキャストは無問題
参照型→値型はボクシングが入って遅くなる
void Hoge<T> where T : IHogeHoge (T value) { ... }
こうすればボクシングは回避できて、インターフェイスメンバも使える
メソッドが一つならインターフェイスじゃなくてデリゲートを使うのも流行り

475:474
08/01/24 19:35:30
間違えた
値型→参照型はボクシングが入って遅くなる

476:デフォルトの名無しさん
08/01/24 19:35:38
そこが処理のボトルネックになってるかどうかがまず問題だろ

477:デフォルトの名無しさん
08/01/24 19:45:25
>476 swichを使いたがる人に人的な問題が有るだけなので、ネックにならない事がわかればすっきりできます。

>474さんのおかげで解決ですけど、私も興味が有るので、もうちょっと面白い話がを集めたいんですけどスレ違ですかね。

私が今書き出したサンプルはデリゲートの方がスマートっぽいので練り直さないと。
void Hoge<T> where T : IHogeHoge (T value) { ... } を有効利用したサンプルを書けてないと足下をすくわれそうだし。


478:デフォルトの名無しさん
08/01/24 20:00:11
手段と目的を履き違えていないか?

479:477
08/01/24 20:07:17
>478
そうですね。 「参照型→参照型のキャストは無問題 」の理由は解ってないし。
>where T : IHogeHoge (T value) { ... }  は自分の件では要らない事が、返事を書いてから気づきました。

未だベンチテストとかできる状態では無いのでボトルネックの洗い出しはできません。

 目安としてはポリモーフィックされたupdate()関数は一秒間に180回ぐらい行われて、 satateが切り替わるのは2,3秒に一回あるか無いかです。
それでupdate()関数内に switchが有るのは嫌だなと思う次第です。

480:デフォルトの名無しさん
08/01/24 20:42:01
C# を使うことそれ自体がボトルネックだとおもいまーす

481:デフォルトの名無しさん
08/01/24 20:53:24
switch使ったっていいと思うが
Enumってswitch用じゃね?

482:デフォルトの名無しさん
08/01/24 21:11:10
問題のサンプルソースできた。
100行ある。ここに貼るとしたらどうしたら良い?

483:デフォルトの名無しさん
08/01/24 21:27:57
(´・ω・`)しらんがな

484:デフォルトの名無しさん
08/01/24 21:30:45
お好きにどうぞ
URLリンク(zero0.x0.com)

485:デフォルトの名無しさん
08/01/24 21:32:37
URLリンク(www.uploda.net)
オリジナルのファイル名でDLすると良いみたい。

かなり汚いけど、これのswitch版を作ってみる。

486:デフォルトの名無しさん
08/01/24 21:32:53
一秒間に180回なら全く気にする必要ないだろ

487:デフォルトの名無しさん
08/01/24 21:44:26
stringの連結とかやってる時点で無意味だろ

488:デフォルトの名無しさん
08/01/24 21:52:36
switch有りのソース
URLリンク(www.uploda.net)

結果
switch無し 117261
switch有り 114267

switchの方が良かった。\(^o^)/
 おまえらさー、 これ信じて本当に大丈夫?

>487 良い事言った。

489:デフォルトの名無しさん
08/01/24 21:57:23
テキスト連結を削除して試したら両方15ms以下で終わったよ

490:デフォルトの名無しさん
08/01/24 22:03:37
>489
LinkedListの大きさを20000にして、string xをint xにして只の足し算にした。

switch無し 35928
switch 21836

C#のキャストってやっぱり痛いんだな。

491:デフォルトの名無しさん
08/01/24 22:33:24
インライン展開されてるみたい
[MethodImpl(MethodImplOptions.NoInlining)]をswitch版のupdateに付けてみ

492:デフォルトの名無しさん
08/01/24 22:51:29
つけては見ましたけど、特に変わらなかったです。 21600ぐらい。
---------
using System.Runtime.CompilerServices;
--中略---
 [MethodImpl(MethodImplOptions.NoInlining)]
 public void update()
 {
  switch (this.state)
-----

UMLやDPを使って設計した方が遅くなるってのはC#ユーザーなら通らされる道なんでしょうね。
キャストやガベコレの世界ってこうなっちゃうんだな。 UMLは概念?だかで実装はswitch。

493:デフォルトの名無しさん
08/01/24 23:10:11
間違えた
インライン展開抑制でこっちで効果があったのはFunc1updateとFunc2updateの方。差がかなり小さくなった。
まあつきつめたらswitchの方が速いのは当たり前だけどそんなことに意味があるかどうかの方が大事

494:デフォルトの名無しさん
08/01/24 23:42:57
そりゃそんな感じの作りならswitchのが効率いいだろうし
3パターンじゃなおさらswitch有利だろうけど
だからどうしたってレベルの話だな。

そのレベルでパフォーマンス重視ならC#なんざ使うのが間違い。
まあ大抵はこんなレベルの差はどうでもいい。
普通は処理そのものがもっとずっと重いしな。


495:デフォルトの名無しさん
08/01/24 23:53:04
でどこでキャストとガベコレが関係してるわけ?

496:デフォルトの名無しさん
08/01/24 23:56:41
まったく関係ないw
switchの方が最適化されて有利っていうだけのこと

497:464
08/01/24 23:57:54
レスくださった方、ありがとうございます

最適化の意味がないというのがいまいちピンと来ませんでしたが
少し説明不足なところがありました。
関数内の処理をどうこうしたいのではなく、関数に引数を渡す部分に関して
何か速度を上げるのに繋がる手法のようなものがあれば・・・と思ってのことでした
なので検討違いかもしれないと今でも思っていますorz

再帰処理がいらないという意見がありましたが、私自身の力量ではこれで全力でして
これ自体アドバイス貰いながらの完成だったりします。
どんどんと階層を深く辿るにはどうしてもこれ以外の方法が思いつきませんでした

498:デフォルトの名無しさん
08/01/25 00:02:47
>494
>普通は処理そのものがもっとずっと重いしな。

テキスト連結
117261-114267= 2994
足し算
35928- 21836= 14092
そうですね。

>495
 どう関係しているか解らないので、適当です。
C++のポインタとキャストならこうは成らないのでは?

 switch無しは、何回キャストしているか把握してないし。 ガベコレとauto pointerを勘違いしているかも、
>495が関係ないと言うなら、もっとましなソースになるかもしれませんね。


499:498
08/01/25 00:05:31
>496 今見た。

500:デフォルトの名無しさん
08/01/25 00:06:08
>>497
>最適化の意味がない
どう見てもディスクIOの方が圧倒的に重いからじゃね

501:497
08/01/25 00:12:12
>>500
なるほど、確かにorz
少しでもと思ったんですが厳しそうですね
ありがとうございました

502:デフォルトの名無しさん
08/01/25 00:17:10
>>501
IOって面で工夫するとしたら
文字列で渡さずにDirectoryInfoを渡すようにしたらいいのでは

503:デフォルトの名無しさん
08/01/25 01:31:02
インラインとか書かれてるのをみると
脳内で淫乱に変換される漏れの頭を何とかしてください

504:デフォルトの名無しさん
08/01/25 04:51:44
PropertyGridで、uint型の配列を展開したとき、数値を16進数で表示するには
どうしたらいいのでしょうか。

505:デフォルトの名無しさん
08/01/25 07:57:25
頑張るのならば ArrayConverter を真似して実装してから
uint[] 型のプロパティに TypeConverter 属性で実装したのをつける
ArrayConverter の内部クラスが private なので面倒

頑張らないのならば
[TypeConverter(tyeof(UInt32HexConverter))]
struct UInt32Hex{
 public uint Value;
}
とでもして Uint32HexConverter をお手軽に実装してから
UInt32Hex の配列を使う

506:504
08/01/25 09:13:17
>>505
ありがとうございます。
とりあえず、頑張らない方向でやってみます…。

507:デフォルトの名無しさん
08/01/25 09:57:14
がんばろうぜ…






いやまあどうでもいいんだけど

508:デフォルトの名無しさん
08/01/25 10:17:29
XMLコメントを書くと
メソッド自体とパラメータのコメントはカーソルを合わせたり、Ctrl+K,Pとかすれば表示されますが
戻り値の/// <returns>xxxx</returns>に書いたものは
どうすれば表示されるのでしょうか?

あとデバッガでメソッドの戻り値が何になったのかを
そのメソッド内で見ることは出来ないのでしょうか?
バージョンは2008です

509:デフォルトの名無しさん
08/01/25 11:33:12
>>323
VC# 2008 Express使ってて思ったのは、
クイックウォッチが使えないこと。

ブレークポイントからステップインして処理を追っていくときに、
その時点における式の評価ができるのは結構便利なんだよな。
それ以外では全く不満はないので、それだけの為にVS2005Proに戻そうとまでは思わんね。

VS2008Pro、アップグレード版の値段によっては購入を検討する。

510:デフォルトの名無しさん
08/01/25 11:52:13
前を使ってないからクイックウォッチってのがわからないけど、
文面からイミディエイトウインドウのような気がする。
?を最初につけてメソッドとか記述すれば結果がみれるし、フィールドに代入も出来る

初期状態では確かメニューにないから、ユーザー設定から追加。

511:デフォルトの名無しさん
08/01/25 11:56:44
式を評価するだけならウォッチ式でできるよ
2008では演算子の上にマウスカーソルを置くと評価した結果が表示されるようになってる

512:デフォルトの名無しさん
08/01/25 12:27:59
>>510
なるほど、イミディエイトウインドウで自作式を評価できるのか。
今まであんまり使ったこと無かったもんで知らなかった。
それならクイックウォッチいらないかもね。

>>511
それはソースに記述してある式の評価でしょ?
それは当然できる。
俺が言ってたのは、ソースに記述してない評価式のこと。


513:デフォルトの名無しさん
08/01/25 12:46:42
>>512
ウォッチウインドウにある空の行をダブルクリックして式を入力するだけ

514:デフォルトの名無しさん
08/01/25 13:14:35
.netだから出来るんだろうけど、
最初にイミディエイトウインドウを知ったときには感動した

ドキュメント見て、実際の動作確認をしたくなったら
参照さえしてあれば、そのままF10(ステップオーバー)だけ押せば
ソースコードに全くないクラスでもそのまま試せるし、IntelliSense効くし
ちょっとしたことなら確認用のプログラム書かなくてもいいんだよな
テストしたいクラスがあったときもイミディエイトウインドウから実行できるし
ブレイクポイント設定しておけばちゃんと止まるし

515:デフォルトの名無しさん
08/01/25 15:36:46
>>502
DirectoryInfoとFileInfoにして色々試してみました
大きなディレクトリを移動させる際の重さがなくなったのですが、移動スピード(?)というか処理にかかる時間が延びてしまったようです

まだ色々試している段階なのですが、これは良くも悪くも安定したということか・・

何はともあれ新しい可能性です、もう少し試行錯誤していこうと思います
ありがとうございました

516:デフォルトの名無しさん
08/01/25 16:32:16
DataGridView 内のセルにて
長い文字列を入力した時に折り返すようにしたいのですが
どのように設定すれば良いのでしょうか?
WrapMode を True に設定したら全角文字は上手く折り返されるんですが
スペースを含まない半角文字はセルから溢れてしまい、困ってます。

517:デフォルトの名無しさん
08/01/25 23:56:07
今データベースを使用するアプリケーションを書いているのですが、
SQL文が非常に長くて可読性が悪いので文を分割しようと考えてます。
この場合、

string query = "select hoge, fuga, hage from test"
+ " where hage = 1 ・・・";

見たいな書き方しますか?それともStringBuilderを使ってApendしていきますか?
どう書くのが一般的なんでしょうか?

518:デフォルトの名無しさん
08/01/26 00:28:05
多いのは単に+で連結じゃないかね?
俺は@でヒアドキュメントもどきが好きだが。


519:デフォルトの名無しさん
08/01/26 00:29:32
ループ等の中にないならstringで連結してもいいんじゃね
それか余所においとくかリソースにつっこむか

520:デフォルトの名無しさん
08/01/26 00:36:50
リテラルの+はコンパイル時に解決されるからStringBuilderなんて使うと余計に遅くなるよ。

521:デフォルトの名無しさん
08/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("取得開始");
}




522:デフォルトの名無しさん
08/01/26 00:51:25
>>521
いや、日本語書けよw
君はエスパーかもしれんが、ここ読んでるキミ以外の人間はエスパーじゃないんだけど。

523:デフォルトの名無しさん
08/01/26 00:57:03
ぼくはエスパーです
どちらでも好きなほうにどうぞ

524:デフォルトの名無しさん
08/01/26 01:08:10
>>521
ベストアンサー

 すべて


525:デフォルトの名無しさん
08/01/26 02:33:53
PropertyGridのような折り畳み・展開可能なGrid(複数カラム保持)を作成したいのですが、
参考になるURL・方法を知っている方教えていただけますか?
こんな感じを想定しています。
ColA   |ColB |ColC
-NodeA |    |
 -NodeC|     |
+NodeB |     |

526:デフォルトの名無しさん
08/01/26 02:42:09
>>525
URLリンク(www.codeproject.com)

527:デフォルトの名無しさん
08/01/26 03:05:21
>>526
ありがとうございます。
コード参考にして作ります。

528:デフォルトの名無しさん
08/01/26 05:13:40
if(dir.Attributes == FileAttributes.ReadOnly)
{
 dir.Attributes = dir.Attributes & ~FileAttributes.ReadOnly;
}
dirはDirectoryInfoです

これで読み取り属性なら読み取り属性を解除するということになっているでしょうか?

529:デフォルトの名無しさん
08/01/26 06:39:01
if ((dir.Attributes & FileAttributes.ReadOnly) != 0)
とでもしておかないと、読み取り専用以外の属性を併せ持つディレクトリを漏らす。

530:デフォルトの名無しさん
08/01/26 06:45:14
ディレクトリには必ずディレクトリ属性がついているから、>>528のやり方では絶対に条件が成り立たないな。

531:デフォルトの名無しさん
08/01/26 07:22:43
>>529
ありがとうございます
流石に単純すぎて自分のものはいぶかしんでいたんですが
読み取り専用なだけ、という場合しか考慮されていなかったんですね、助かりました

>>530
DirectoryAttributes的なものでもあるんでしょうか?
一応こちらの環境では(読み取り専用にチェック入れただけのディレクトリに対しては)できましたが

532:デフォルトの名無しさん
08/01/26 07:25:26
あれ>>529がいけそうになさそうな・・

533:デフォルトの名無しさん
08/01/26 07:35:47
状況によって消えたり消えなかったり、読み取り属性だけころっとかわったりorz

もうちょっと試行錯誤してきます、すみません

534:508
08/01/26 07:50:21
>>508
やっぱりどちらも無理なんでしょうか?

535:デフォルトの名無しさん
08/01/26 07:57:37
>>534
どっちも必要ないから無理じゃない?

536:デフォルトの名無しさん
08/01/26 09:32:29
>>534
メソッドの戻り値はreturnの部分にブレークポイント仕掛ければ分かるよ

537:デフォルトの名無しさん
08/01/26 11:43:12
>>518,519,520 さんありがとうございました。

>>518 @使ったヒアドキュメントもどき私も使っています。
>>520 コンパイル時に解決してくれんですね。安心して+で連結できます。

538:デフォルトの名無しさん
08/01/26 13:22:07
form1、form2、form3があり、
form1からボタンのイベントでダイアログ形式でform2を開き、そこに値(TextBox)を入力します
そのあと、okでform1に戻り、今度は別のボタンのイベントでform3を開き、そこでSaveFileDialogを開きます
このときSaveFileDialogのFileName先ほどのTextBoxの値を入れたいのですがどうしたらよいでしょう?



539:デフォルトの名無しさん
08/01/26 13:28:42
form2にそのテキストボックスの値を取得するプロパティを定義する
form2を表示して,okで戻った後にform1のコードからそのプロパティを通して値を取得して
form1のフィールドに入れとく
form3を開く前にプロパティとかコンストラクタとかでその値をform3に渡す

540:デフォルトの名無しさん
08/01/26 13:29:50
SaveFileDialogのヘルプ見れば一発でわかりそうなもんだが
一体なにがわからんの?
もしかしてform1からform3にファイル名を渡す方法?

そんなもん、form3を開く時にファイル名を渡すなりなんなり、自分で考えろ。

541:デフォルトの名無しさん
08/01/26 13:32:21
>>539
すみません
実際のコードで簡単に書いていただけないでしょうか?

542:デフォルトの名無しさん
08/01/26 13:40:58
>>540
お前初心者スレからでてったほうがいいと思うぞ

543:デフォルトの名無しさん
08/01/26 13:41:36
>>541
基礎からやり直せ
そのレスで確信したが全くわかってないだろ

544:デフォルトの名無しさん
08/01/26 13:43:43
>>540
具体的に言えばそうです
ただそのform3のsavefiledialogのFileNameプロパティに名前を設定するとき、
sfd.Filename = の後にどうやったらform2のテキストボックスの値を参照できるのかがしりたいです

545:デフォルトの名無しさん
08/01/26 13:44:07
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を表示
 }

546:デフォルトの名無しさん
08/01/26 13:44:30
>>544
クラスの基礎だけでいいからどっかの解説ページを読むんだ

ここで一時凌ぎすべきじゃない項目だぞ

547:デフォルトの名無しさん
08/01/26 14:09:30
>>545
型 'System.Windows.Forms.TextBox' を型 'string' に暗黙的に変換できません
AD_Adjust.textBox1' はアクセスできない保護レベルになっています。

ってエラーが出てしまいました



548:デフォルトの名無しさん
08/01/26 14:17:41
>>547
>>546

やる気あんのか屑

549:デフォルトの名無しさん
08/01/26 14:20:15
>>542
ロクにマニュアルも見ず、自分で試してみることもしないのは
初心者以前。

>>544
だから、
form2のテキストボックスの値を参照できるように、プロパティなり
メソッドの引数なりで自分で参照できるように作るんだよ。

550:デフォルトの名無しさん
08/01/26 14:21:24
↑ごめんなさい、解決です

551:719
08/01/26 14:29:25
>>719です。
もう一度起動してWINXPを起動したのですが今度は正常に読み込みました。
が・・・
起動しても何か処理が重い・・・(普段なら10秒もすれば起動して処理が終わるのに・・・)
それで色々作業中にまたまた急に電源が切れました。。
そう、719を書き込んだときとまったく同じ症状で
で、「これはウィルスだな。」と思い、そうと決まれば駆除しかない!
そう思って俺の計算では成功する予定でした。(←馬鹿
しかしその結果、ウィルスチェッカー中に電源が落ちてしまいます。
(ちなみにしばらく時間を置いてから起動すれば立ち上がるみたいなんです。)
で3回程度試したんですが・・・必ずチェック数が1万を越える前に電源が落ちます。
ウィルスチェックしていない間は落ちることがないのでまず電源アダプタとかでは無いはずなんですが・・・
ニコニコにウィルスでも混入したのかな・・・?(←先にチェックして来い
というわけでちょっとニコニコに何か手がかりみたいなの無いか見てきます。

552:デフォルトの名無しさん
08/01/26 18:09:08
(´・ω・`)知らんがな

553:デフォルトの名無しさん
08/01/26 18:48:10
>>719の頭ん中にもウィスル湧いてんじゃねw

554:デフォルトの名無しさん
08/01/26 19:20:38
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:デフォルトの名無しさん
08/01/26 19:25:58
Point[] p = new Point[4];
for(int i = 0; i < 4; i++){
 p[i] = new Point(i, i);
}

556:デフォルトの名無しさん
08/01/26 19:26:31
Point は構造体だから配列つくっちゃったら
要素ごとに new する必要なんてない
なので new は最初の1個だけでよい

557:デフォルトの名無しさん
08/01/26 19:28:33
Point[] p = { new Point(0, 0), new Point(1, 1), new Point(2, 2), new Point(3, 3) };

558:デフォルトの名無しさん
08/01/26 19:31:07
C#でさぁWindowsのAPIを利用するのは.netのコンセプトに反してるよね?


559:デフォルトの名無しさん
08/01/26 19:32:24
それがいやなら .net 側で API 用意してくれ!

560:554
08/01/26 19:33:30
>>555 (;´Д`)却下
>>556 (゚д゚)ハァ?
>>557 (´∀` )採用!!

561:デフォルトの名無しさん
08/01/26 19:34:50
構造体の概念を全く理解してないでよくPointクラスを使用できるね。
掛け算の概念を知らないで九九をひたすら暗記している家の息子みたいなもんだ。

562:デフォルトの名無しさん
08/01/26 19:36:01
for を却下して new を羅列してる方を採用って・・・
何がやりたいのか分からない。

563:デフォルトの名無しさん
08/01/26 19:37:38
>>560
Point[] p = Enumerable.Range(0, 4).Select(i => new Point(i, i)).ToArray();

564:デフォルトの名無しさん
08/01/26 19:38:05
>>561


565:デフォルトの名無しさん
08/01/26 20:33:37
今までC/C++やってたんですが
最近C#やることになって勉強中です。
ものすごく親切な仕様という印象です。

566:デフォルトの名無しさん
08/01/26 20:51:14
文字列のn番目の文字だけを別の文字に変えたいときはどうしたら良いでしょうか?


567:デフォルトの名無しさん
08/01/26 20:56:55
文字列.replace(a,b);
a→b


568:デフォルトの名無しさん
08/01/26 20:58:55
>>554
Point[] p = new Dictionary<int, int> { { 0, 0 }, { 1, 1 }, { 2, 2 }, { 3, 3 } }.Select(xy=>new Point(xy.Key, xy.Value)).ToArray();

569:デフォルトの名無しさん
08/01/26 21:15:55
一旦ToCharArray()で文字配列にしていじった後にnewし直す。とか

570:デフォルトの名無しさん
08/01/26 21:32:19
>>566
StringBuilderならインデクサ経由で変更できるよ。

571:デフォルトの名無しさん
08/01/26 21:33:07
>>565
親切っていうよりガチガチに制限かけまくってるだけ

572:デフォルトの名無しさん
08/01/26 21:51:04
画像処理のラスター処理関連の質問です。

画面上に何か図形を2つ書いて(例えば10角形2つ)を書いて
その図形の重なった部分の面積を求めるっていうとき
どうやればできますか?



573:デフォルトの名無しさん
08/01/26 21:54:17
三角形9つにずつ分解して、重なり部分81箇所の面積の和をとる。
幾何学の問題。

574:デフォルトの名無しさん
08/01/26 21:54:58
9じゃねえわ。8x8=64

575:デフォルトの名無しさん
08/01/26 21:57:56
重なり部分をどう求めるの?

576:デフォルトの名無しさん
08/01/26 22:06:03
>>572
紙と鉛筆で「ry)っていうときの」アルゴリズム書ける人か書けない人かで分岐。
書ける人ならとりあえずアルゴリズム書いて晒してみると親切な人がC#での書き方のヒントくれるかも。
書けない人は……ライブラリ探すところから始める? ちなみに.NET標準にはないよ。

まあ標準ではなくてもGeometryクラスを流用すればできるかもしれんが。
URLリンク(d.hatena.ne.jp)

577:デフォルトの名無しさん
08/01/26 22:12:22
>>572みたいな問題って意外と難しいんじゃないの?
いつでも代数的に解ける図形が与えられるとは限らないし。
だからモンテカルロ法みたいなのがあるわけじゃないの?

つーか、>>572は図形がどういうデータ構造で与えられるかをまず提示しなきゃ
話にならないね。

578:デフォルトの名無しさん
08/01/26 22:18:36
>>576も言ってるけどWPF使えば超簡単にできるよ

579:578
08/01/26 22:19:29
>>576が言ってるのは違うGeometryだったな

580:572
08/01/26 22:24:03
図形の形状は不定です。
C言語上でやったときは
メモリデバイスコンテキスト上に図形を描画して
それぞれ配列に格納して論理演算で求めてました
↓みたいなかんじ

■■■■■■
■□□□□■
■□□□□■
■■■■■■
■■■■■■
■■■■■■

■■■■■■
■■■□□■
■■■□□■
■■■□□■
■■■□□■
■■■■■■

重なり部分
■■■■■■
■■■□□■
■■■□□■
■■■■■■
■■■■■■
■■■■■■

C#だとメモリデバイスコンテキストに相当するものが
あるのかよくわからないので聞いてみました
WPFというのでできるんですか
調べてみます

581:576
08/01/26 22:25:14
>>578
WPFのGeometry.GetAreaでいけそだね。
だとしたら「標準にはない」は嘘になる。サンクス

582:デフォルトの名無しさん
08/01/26 22:43:15
>>580
メモリデバイスコンテキストに相当するものならSystem.Drawing以下にあるかな。
GraphicsPathからRegion作って残りとIntersectして共通領域のRegionを作る。
できたRegionをGraphics.Clipにセットして適当に塗りつぶして塗りつぶし色でピクセル数え上げか。
それでいいならできなくはないと思う。

WPFはSystem.Drawing以下のとは別の描画ライブラリ。

583:572
08/01/26 22:50:39
>>582

URLリンク(dobon.net)

↑のHPのやり方ですか?
キーワードでググってみたら出てきました。
とりあえずこのやり方でやってみます。
ありがとうございました。


584:566
08/01/26 23:35:17
>>570
ありがとう

585:デフォルトの名無しさん
08/01/26 23:37:28
フォントの名前からフォントファイルの名前を取得する方法ってありますか?

"MS ゴシック"->"MSGOTHIC.TTC" みたいな感じで。

586:デフォルトの名無しさん
08/01/26 23:51:31
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Fonts

587:デフォルトの名無しさん
08/01/27 01:41:37
以下のような任意の2つのRectがあって、

□□□□□□□□□
□□□□□□□□□ Rect1
□□□□□□□□□

         □□□□
         □□□□ Rect2
         □□□□

これを次のようにマージするには、空白部分をどうやって補完すればいいんでしょ。

□□□□□□□□□
□□□□□□□□□
□□□□□□□□□ Region1(=Rect1+Rect2+補完部分)
         □□□
         □□□□
         □□□□
         □□□□



588:デフォルトの名無しさん
08/01/27 01:45:08
まず間違いなく必要なのは
「次のように」
の部分を厳密に定義することじゃないだろうか。

589:デフォルトの名無しさん
08/01/27 01:46:26
書き込んでから閃いた。

Rect1のBottomをRect2のTopの位置まで下げ、新しいRect1とする。
Rect2のTopをRect1のBottomまで上げ、新しいRect2とする。

次に、新しいRect1とRect2の重なりを>>583のHPのやり方で求めると、
これが補完部分になる。

より簡単で、いろんな場合に使える方法がありましたら教えてください。

590:デフォルトの名無しさん
08/01/27 01:56:32
矩形同士の重なりなんてRectangle.Intersectでいいだろ

591:デフォルトの名無しさん
08/01/27 03:09:06
menustripをウインドウの上に固定するにはどうしたらいい?
今は大きい画像を読み込んで↓の方にスクロールさせると
menustripが消えてしまう

592:デフォルトの名無しさん
08/01/27 03:11:36
>>591
画像を表示するパネルに一緒にMenuStripを乗っける馬鹿がいるか。

593:デフォルトの名無しさん
08/01/27 04:40:33
画像処理する時処理を少しでも軽くするため
ポインタ使おうかと思うんですが
C#の流儀に反する?

594:デフォルトの名無しさん
08/01/27 09:04:16
反しない。普通にunsafeで使え。

595:デフォルトの名無しさん
08/01/27 09:06:05
>>593
不安ならPaint .NETのソースをunsafeでgrepしてみたら?

596:デフォルトの名無しさん
08/01/27 09:13:08
C#のエントリポイント、なにを書くところかさっぱりわからない

597:デフォルトの名無しさん
08/01/27 09:30:56
プログラムを開始してやりたいことを書けばいい。
イベントドリブンなプログラムなら、ハンドラを登録しまくれ。

598:デフォルトの名無しさん
08/01/27 09:36:39
とりあえず自動生成されたのを眺めていたけどクラス(デフォだとForm1)を呼び出して起動、みたいになってる様子

その呼び出されたクラス内のコンストラクタでハンドラだとかコモンコントロール?だとかを登録してる

599:デフォルトの名無しさん
08/01/27 09:42:15
enum型のToString()って独自定義出来ないものだろうか。
ComboBox.Itemsにするのに出し入れで変換するのが面倒くさいから日本語で要素を定義してみた。
IntelliSenseは特に問題ないけど違和感ありまくり

600:デフォルトの名無しさん
08/01/27 11:57:49
>>599
enumみたいな構造体を自分で定義すればいいのでは?

601:デフォルトの名無しさん
08/01/27 13:28:42
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, }
こんな風にするとか

602:デフォルトの名無しさん
08/01/27 14:07:34
enum の要素に属性ってつけられたっけ

603:デフォルトの名無しさん
08/01/27 14:14:32
フィールド扱いだからAttributeTargets.Fieldで可

604:デフォルトの名無しさん
08/01/27 14:44:51
>>601
ぼやきのつもりで書いたのに、あっさりこんなコードが出てきて驚きました。
中程のreturnの行の真ん中のreturnだけ削除したと思います。
使い方にちょっと悩んだけど
初期設定で
ComboBox.Items.Add((EnumWrapper<MyEnum>)MyEnum.One);
使うときには
(MyEnum)(EnumWrapper<MyEnum>)ComboBox.SelectedItem
ですね。
ありがとうございました。

なんかC#ってなんでもできそうな気がしてきた。

605:デフォルトの名無しさん
08/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とか、あと何がありますか?

606:デフォルトの名無しさん
08/01/27 17:23:29
しるか。

607:デフォルトの名無しさん
08/01/27 17:38:34
>>605
構造体のnewでコピーは発生してない。

608:デフォルトの名無しさん
08/01/27 17:55:59
後者の方が最適化されやすい場合があるみたいだけど基本的にはほとんど変わらないみたい
Foo foo = new Foo { a=10, b=20, c=30 };はだいぶ遅い

609:デフォルトの名無しさん
08/01/27 18:03:13
C#わかんねーな。
>560は只の基地外だと思ってスルーしてたけど、
もしかして最適化狙いかと、勘ぐってしまう。

610:デフォルトの名無しさん
08/01/27 18:14:35
>>606>>607>>608
ありがとうございました

611:デフォルトの名無しさん
08/01/27 18:16:01
>>556は単に図形の頂点か何かを直接書きたかっただけだろ
たまたま規則性のある例を挙げたから誤解されただけで

612:デフォルトの名無しさん
08/01/27 18:18:20
>>608
確かにC#3.0のその構文のときはコピーが発生してるね。
妙なコードを吐いてる。構造体のときは要注意か。

613:デフォルトの名無しさん
08/01/27 18:58:07
Foo temp = new Foo();
temp.a = 10;
temp.b = 20;
temp.c = 30;
Foo foo = temp;

になるんだっけ。

614:デフォルトの名無しさん
08/01/27 19:03:26
>>613
それがなぜかスタック3つも使ってる。
Foo temp1 = new Foo(); 
Foo temp2 = temp1; 
temp2.a = 10; 
temp2.b = 20; 
temp2.c = 30; 
Foo foo = temp2; 

クラスだと2つなのだが。

615:デフォルトの名無しさん
08/01/27 19:05:12
それって何が嬉しいんだろう。
クラスの場合も良く分かんないんだけど。

616:デフォルトの名無しさん
08/01/27 19:12:46
>611
ありがとう。質問するときの参考になった。

617:デフォルトの名無しさん
08/01/27 19:17:31
800*600の画像があったとします。
逆透視変換のためにその画像を上辺900、下辺800、高さ1000の等脚台形に変換したいのですが、
.NETのクラスを使って簡単な方法があれば教えていただきたいです。
OpenCVのアフィン変換とかになるんですかねやっぱり。


618:デフォルトの名無しさん
08/01/27 19:34:15
>>614
初期化をatomicにするためじゃないかな。
URLリンク(d.hatena.ne.jp)
URLリンク(community.bartdesmet.net)

619:デフォルトの名無しさん
08/01/27 19:45:36
atomicってなにwww
下の方読んで何となくわかったけど。

620:デフォルトの名無しさん
08/01/27 20:37:41
同期のためか。
もう>>608みたいな書き方するときはパフォーマンスなんて気にするな、
ってことかな。

621:デフォルトの名無しさん
08/01/27 21:05:59
>>617
うまく計算してWPFの3D機能でやるとか
ピクセルロックして頑張るとか

622:デフォルトの名無しさん
08/01/27 22:46:20
初歩の初歩だとは思うのですが
ラベルやテキストボックスの文字列をセンターでそろえるというのはどうすればいいのでしょうか?
ググってもなにやらコードを書く必要があるような記述ばかりなんですが、プログラムから制御を
行わないとできないのでしょうか?

623:デフォルトの名無しさん
08/01/27 22:53:38
VS使えばいいと思うよ

624:デフォルトの名無しさん
08/01/28 01:41:41
へたな本読みながら一つずつ機能を知っていくより
Visual C# Express Editionと、それと一緒に入ってくるMSDNドキュメント
見ながら遊んでる方がずっとコントロール廻りは理解できるよ

625:デフォルトの名無しさん
08/01/28 01:49:40
VS6.0からVS2008に移った俺はMSDNの進化に感動した

626:デフォルトの名無しさん
08/01/28 02:20:44
>>622
フォームデザイナ上で、
複数コントロールを選択した状態で
ツールバー>書式>整列

最初に選択したコントロールを基準に整列してくれる。

627:デフォルトの名無しさん
08/01/28 17:57:40
2001のMSDNはウンコだったが2005あたりからようやくマシになった

628:デフォルトの名無しさん
08/01/28 23:06:23
>>627
通信回線が発達してオンラインがまともに使えるようになってから
かなり使えるようになったと感じる


629:デフォルトの名無しさん
08/01/28 23:16:14
いやローカルにインストールするライブラリのこと>>625は言ってるんだと思いますが。。

630:デフォルトの名無しさん
08/01/28 23:19:36
オンラインなんてレスポンスが悪すぎて使ってられない

631:デフォルトの名無しさん
08/01/28 23:52:21
おまけにブックマークしといても数ヶ月でリンク切れになるしねw

632:デフォルトの名無しさん
08/01/29 01:17:42
MSは何故C#の匿名メソッドをレキシカルクロージャーにしなかったの?
理由分かる人いたら教えて。

633:デフォルトの名無しさん
08/01/29 06:54:59
プログラマが選択できるようにしてあるし

634:デフォルトの名無しさん
08/01/29 09:54:01
VC#であるプログラムを作っていて、アイコンを埋め込みたいと思いました。
そこから少し話は反れて飛びます

ソリューショネクスプローラのResources以下にicoファイルを入れ
Form.Icon = ((System.Drawing.Icon)(resources.GetObject("アイコンファイル名")));
↑このようにするとアイコンをセット出来るのではという結論に至りました

しかしコンパイルは通るもののデバッグになるとこの記述の部分でエラーが出ます

'System.Resources.MissingManifestResourceException' のハンドルされていない例外が mscorlib.dll で発生しました。

エラーはこの通りです
見たところ、アイコンファイル自体みつけられてないのか・・?と思いましたがアイコンファイル名はいくら確認しても正しいです
何が間違っているのでしょうか?


635:デフォルトの名無しさん
08/01/29 10:12:26
ああ、大間違いだよ

636:デフォルトの名無しさん
08/01/29 15:24:23
違うよー

637:デフォルトの名無しさん
08/01/29 16:12:32
よく覚えてないけどソリューションエクスプローラにぶちこんだら相対指定で使えるだろうに

638:デフォルトの名無しさん
08/01/29 16:38:20
System.Collections.Generic.List#Add が

  System.ArgumentOutOfRangeException: 容量が現在のサイズより小さい値です。

なんて投げてくるんですが、これって .NET Framework のバグですか?

639:デフォルトの名無しさん
08/01/29 16:41:24
あーごめん。3秒で疑問が氷解。複数スレッドが一度に Add しようとしてました。すみません。

640:デフォルトの名無しさん
08/01/29 16:49:24
>.NET Framework のバグですか?

これって見る度ネタなのかどうか理解に困る

641:デフォルトの名無しさん
08/01/29 16:56:09
大抵はそれを本気で言ってるし言う奴は低レベルと相場が決まってる

642:デフォルトの名無しさん
08/01/29 17:01:58
いや、今日初めて言ってみて、初めて言う輩の気分がわかったwwww
マルチスレッド関係はやっぱ鬼門だわ……

643:デフォルトの名無しさん
08/01/29 18:19:57
画像処理関連で質問です。
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するという操作を全量に対して行うしかないですか?

644:デフォルトの名無しさん
08/01/29 18:23:14
>GetPixelしてSetPixelするという操作を全量に対して行うしかないですか?
それでもいいし
bmp1のGraphicsを取得してそれでbmp2をDrawImageしてもいいよ

645:デフォルトの名無しさん
08/01/29 18:48:46
そしてIndexedなBitmapという落ち

646:643
08/01/29 18:56:08
>>644
ありがとうございます。
追記になりますが、その画像をjpegで保存したいと思っています。
描画にGraphicsクラスを使ったことはありますが、描画した画像を保存したことがありません。

DrawImageして出来上がったGraphicsクラスのインスタンスを使って
画像保存をすることはできますか?

647:デフォルトの名無しさん
08/01/29 19:01:30
>>646
Image.Save

648:デフォルトの名無しさん
08/01/29 19:19:09
>>647
は?

649:デフォルトの名無しさん
08/01/29 19:51:18
は?じゃないが

650:デフォルトの名無しさん
08/01/29 19:57:34
>>648
知らないならレスすんな

651:デフォルトの名無しさん
08/01/29 20:20:33
Graphicsクラスのインスタンスでは出来ないが、Graphicsには描画対象となるImageなりなんなりが必ずあるので、そっちの機能で保存すればOK

652:デフォルトの名無しさん
08/01/29 21:41:01
pictureboxより大きい画像を表示したばあい、スクロールバーを自動で表示したいけど無理ですか?

653:デフォルトの名無しさん
08/01/29 21:42:04
Panelに入れればいいだろ

654:デフォルトの名無しさん
08/01/29 22:19:46
kami

655:デフォルトの名無しさん
08/01/30 09:47:31
どーんと行こうや

656:デフォルトの名無しさん
08/01/30 10:13:51
こんにちは

ToolStripMenuItemのAllowDropをtrueにしてもOnDragEnterのイベントがきません

MenuTripだと正常にイベントがきます

何かご存知な方がいましたら
教えて頂けると助かります。

よろしくお願いいたします。

657:デフォルトの名無しさん
08/01/30 13:22:37
自分でイベント追加したら?

658:656
08/01/30 13:52:55
デリケートでイベントを追加しましたが
うまくいきません

開発環境はvs2005、vistaです

659:デフォルトの名無しさん
08/01/30 14:09:18
似たような質問どっかで見たな。ここか前スレだったかなー

660:デフォルトの名無しさん
08/01/30 17:07:19
前スレ945ぐらいかな


661:デフォルトの名無しさん
08/01/30 17:43:09
ユーザーコントロール作ってみた
で、完成度が高くなったので
コントロールライブラリにしようと思ってDLL作ったんだが
このDLLの使い方がわからない漏れはどうしたらいいですか?

662:デフォルトの名無しさん
08/01/30 18:06:19
完成度低いから心配いらないよ

663:デフォルトの名無しさん
08/01/30 18:50:37
我々の社会って連呼かよ
中国って何回言った? 死ねや

664:デフォルトの名無しさん
08/01/30 18:51:01
誤爆スマソ

665:デフォルトの名無しさん
08/01/30 21:00:37
プログラマにもネトウヨ君っているんだね
まあ近頃は一口にプログラっていっても知的水準はいろいろだからなw

666:デフォルトの名無しさん
08/01/30 21:05:35
プログラマ(笑

667:デフォルトの名無しさん
08/01/30 21:10:34
>>665
>>663をネトウヨって言ってる時点でチョンか学生だな

668:デフォルトの名無しさん
08/01/30 21:19:22
うんチョンで学生でいいよ別に。
で「チョン」って何ですか?
ネトウヨ君の仲間うちで通じる「ヲタ用語」みたいなもの?w

669:デフォルトの名無しさん
08/01/30 21:26:07
他所でやれ

670:デフォルトの名無しさん
08/01/30 21:30:06
PGはリベラル派が多いんだろうな。

671:デフォルトの名無しさん
08/01/30 21:39:32
「PG」だと微妙かもなw

672:デフォルトの名無しさん
08/01/30 21:42:32
>>665は例の餃子たべちゃったんだよ。
そっとしといてやろう……( -人-)

673:デフォルトの名無しさん
08/01/30 22:12:15
餃子とか右翼の話は他でやれよ
スレタイ読めないバカども

674:デフォルトの名無しさん
08/01/31 01:36:36
フォームの位置とか状態(最大化、最小化とか)を次回起動時に復元しようと
プロパティのApplicationSettingsからLocation, ClientSize, WindowStateを保存するようにしたんだが
なんか挙動がおかしい。
最大化ボタン押しても最大化しなくて何故か位置が変わったり。
なんでだろう。

675:デフォルトの名無しさん
08/01/31 01:46:31
なんでだろうね。

676:656
08/01/31 02:04:44
前スレ945とは症状が違うようです。
ファイルのドラッグ&ドロップなら私の環境でも問題ありません。

Googleで探してますが、なかなかヒントが見つかりません。

677:デフォルトの名無しさん
08/01/31 08:20:44
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
08/01/31 09:06:37
保存されたファイルを眺めていたら、
どうやら展開状態はそもそもシリアライズされていないように見えます。
派生クラスを作ることにしました。失礼しました。

679:643
08/01/31 10:26:47
>>647-651

ここの回答者はOOPというものが全く分かっていないのか?
Graphicsクラスのインスタンスを使わないで、どうやってGraphicsクラスの
インスタンスメソッド(DrawImage)で描画しようとしているオブジェクトを保存するんだ?

>Graphicsクラスのインスタンスでは出来ないが、
>Graphicsには描画対象となるImageなりなんなりが必ずあるので、
>そっちの機能で保存すればOK

実際にコーディングしてみましたか?
どう考えても、Graphicsオブジェクトを作成するときに使っただけのImageオブジェクトが、
インスタンスメソッドであるDrawImageによって変更されているはずがない。
DrawImageの引数にImageオブジェクトが参照渡しで渡されているのならば別だがね。

だからこそ>>643のように質問しているわけなのだが。

てっきりGraphicsオブジェクトがメモリ上に保持しているGDIビットマップオブジェクトのハンドルを
取得して云々とかそういうアドバイスがくると思っていたのに、見当違いな回答しかこない。
挙げ句の果てに>>650のようなアホまで出る始末。分かってないのはどっちだと・・・

680:デフォルトの名無しさん
08/01/31 10:40:53
>>643みたいなアホな質問してる割には偉そうだなw

681:デフォルトの名無しさん
08/01/31 10:47:10
>>680

>>643の質問が低レベルなのは十分承知の上だよ。
でもそれにたいする回答者が見当違いのアホ回答をしてきたからこそ噛みついているわけで。
少なくともあいつらよりは分かっているつもりだが。

もしもGraphicsクラスを使わずに、かつImageオブジェクトで泥臭い全量ループすることなしに、
他のアプローチでもっと簡単に実現できる方法があるのであれば、是非ご教授願いたい。

682:デフォルトの名無しさん
08/01/31 10:55:08
>>679,681
心底意味が分からん。
ベースとなるBmp1から作ったGraphicsを使ってBmp2をDrawImageするだけじゃん。

683:デフォルトの名無しさん
08/01/31 10:57:17
何をぶち切れてるのか知らないけど、下のコードで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ない板だし「は?」とかだけじゃ誰が何を言いたいのかさっぱりわからない。
はたから見てるとどういうやりとりなのか全くわからなかったから、スルーしてたんだよ。

ちゃんと誰で何を言いたいのかわかるようにしてたら、とっくに解決してたと思うけどね。

684:デフォルトの名無しさん
08/01/31 10:57:55
>>681
>>643の質問内容より十分理解できる回答を見当違いといっている時点で、低脳杉。

685:デフォルトの名無しさん
08/01/31 11:00:16
>>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");
あたりで確認できるかな。

686:デフォルトの名無しさん
08/01/31 11:16:39
まあ今から棒グラフみたいなものを書きたかった、描画知識0の俺には
ちょうどいい話題だったぜ。

687:デフォルトの名無しさん
08/01/31 11:27:55
ごめんなさいはマダー? (・∀・ ) っノシ凵 ⌒☆チンチン

688:デフォルトの名無しさん
08/01/31 11:30:33
質問がネタに見えて仕方が無い。質問主はこれ試してみろ。
>>683>>685Save()メソッドはデフォルト.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);
}
}

689:デフォルトの名無しさん
08/01/31 11:49:22
お前らの優しさは南半球まで響き渡るわ。

690:デフォルトの名無しさん
08/01/31 12:22:41
>>681
>Graphicsクラスを使わずに
なんか初め>>643から新しく条件加わってるけど、何でGraphicsクラス使ったらいけないんだ?
Graphicsクラスでやりたいことが楽にできるのに、わざわざ自分で新しく作る必要ないだろ?

691:651
08/01/31 12:24:16
>>643
だからよう、Graphicsクラス自体は描画機能を持っているだけで、描画対象は別に必要なんだよ。
だから、描画対象となるオブジェクトを指定せずにGraphicsクラスのインスタンスを作成出来ないようになってるわけ。
Graphicsクラスのインスタンスメソッドを使用して実際に変更されるのは描画対象オブジェクトのほう。

>>688
指定した拡張子に対応するImageEncoderがあれば、自動的にその形式で保存されるはず。

692:デフォルトの名無しさん
08/01/31 12:32:02
>>679
こっちはコード書いたことあるからわかってんだよ
それで動かないってどんな糞コード書いたんだよ
晒してみろよ
アホすぎて生きてる価値ないんじゃね

693:デフォルトの名無しさん
08/01/31 12:36:48
なるほど、このスレでは横柄な態度で質問したほうが答えが付きやすいってことだな

694:デフォルトの名無しさん
08/01/31 12:38:33
>>681
> もしもGraphicsクラスを使わずに、かつImageオブジェクトで泥臭い全量ループすることなしに、 
> 他のアプローチでもっと簡単に実現できる方法があるのであれば、是非ご教授願いたい。
bitmap

695:デフォルトの名無しさん
08/01/31 12:41:13
>>643にたいして>>644で答えが出ているというところが恐ろしい

696:デフォルトの名無しさん
08/01/31 12:42:27
横レスだけど正直>>643の切れ方は意味がわからないな。
いきなり「オブジェクト指向が~」とかキレてるのよんでリアルでコーヒー吹いちゃったよw

というか、適当にレスを拾い読みした感じでは、>>643はWinの描画の考え方っていうか
デバイスコンテキストって概念を知らないんだと思う。

まあ最近の.NET用の入門書はこのあたり解説してないのが多いと思うから無理もない。

697:デフォルトの名無しさん
08/01/31 12:45:06
たぶんさ、PC-98時代のビットマップスクリーンと同じ発想で
Winのグラフィックも考えてるんだろうね。
だとしたら結構年長のオジサマなんだと思うよw

698:デフォルトの名無しさん
08/01/31 12:47:58
いやこれどうみてもガキだろ

699:デフォルトの名無しさん
08/01/31 12:54:09
>>679の一番痛いところは
> Graphicsクラスのインスタンスを使わないで、どうやってGraphicsクラスの 
> インスタンスメソッド(DrawImage)で描画しようとしているオブジェクトを保存するんだ?
ここ
描写しようとしているオブジェクトは Graphicsクラスのインスタンス となんら関係がない
勝手に持ってろって話

700:デフォルトの名無しさん
08/01/31 12:57:59
ここまで能無しだと釣りに思えるんだが・・・
本気でこんな事言う人間が居るのか?

701:643
08/01/31 13:16:43
ごめんなさい

702:デフォルトの名無しさん
08/01/31 14:09:14
それだけ?

703:643
08/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
08/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
08/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
08/01/31 16:06:46
補足ですが、この台形補正では逆透視変換は実現できませんでした。
こんな単純なアルゴリズムで実現できるはずがないということにもっと早く気づくべきでしたかね。

結局OpenCVの力を借りて実現する方法にしたいと思います。
Cの勉強しなくては・・・
.NET脳の私には頭が痛いです。

707:デフォルトの名無しさん
08/01/31 16:27:03
     ,.――-、
     ヽ / ̄ ̄ ̄`ヽ、        勇者トンファーパーマン惨状
      | |  (・)。(・)|
      | |@_,.--、_,>         俺が着たからにはもう色々と駄目だ
      ヽヽ___ノ          
        /:::::::::::::::::l   /77
       /::::::::::i:i:::::::i,../ / | 
       l:::/::::::::i:i:::、:::/ / |  
       l;;ノ:::::::::::::::l l;.,.,.!  |  
        /::::::::::::::::l/ /  冂 
       /:::::::;へ:::::::l~   |ヌ|
      /:::::/´  ヽ:::l   .|ヌ|  
      .〔:::::l     l:::l   凵
      ヽ;;;>     \;;>

いろいろつっこみたいけど、とりあえず
URLリンク(www.google.co.jp)


708:デフォルトの名無しさん
08/01/31 16:47:03
本当に初心者な質問で恐縮なのですが……

Windowsアプリ(VC#2005)で、XMLとCSVから読み込んだデータをDataGridViewに表示させようとしています。
そのときのバインド方法なのですが、下記の2パターンの差がわかりません。
BindingSourceのデータソースとして(DataTableではなく)DataViewを使用するメリットって何かありますか?

DataTable→DataView→BindingSource→DataGridView
DataTable→BindingSource→DataGridView

709:デフォルトの名無しさん
08/01/31 17:06:44
DataTable.DefaultView以外のDataViewを使える

710:デフォルトの名無しさん
08/01/31 18:04:08
C#でスタック関係の直接操作ってできますか?

711:デフォルトの名無しさん
08/01/31 18:05:41
なんでスタックなんか弄りたいんだ?

712:デフォルトの名無しさん
08/01/31 18:17:07
関数のカリー化を実装したいとか

713:デフォルトの名無しさん
08/01/31 18:17:58
それならdelegateでいいだろ

714:710
08/01/31 18:22:59
うまく説明できないのでまとめると
ウィルスチェックってどうなってるんだろう?
→全ファイル走査するにはどんなやり方がスマートなんだろう
→再帰処理を使って全部辿るのがベターらしい
→なんだか重くなる
(ここら辺から迷走気味)
→コールスタックとかを知る
→すたっくおーばーふろー・・?
(本格的に迷走)
→スタックを直接操作できればどうにかなるんじゃね?

こんな感じです
質問をするにもどう質問すればいいかわからず>>710のような具合で質問しました

715:デフォルトの名無しさん
08/01/31 18:29:04
再帰処理をほぐす、すなわち、

再帰処理で、保存・復帰してる情報(今探索してるフォルダの情報)を、
インスタンス変数にリストか何かで保持するようにして、そのリストで、
保存したり取り出したりして、本体はループになるように書き直す、
というのがだいたい定番。

ファイルシステムの場合、親フォルダを ".." で探せることを利用すれば、
そういう面倒なことをしなくてもうまくいくかもしれない。

716:デフォルトの名無しさん
08/01/31 18:30:34
吹いたw

とりあえず重くなる原因を確認したほうが良いよ

717:デフォルトの名無しさん
08/01/31 18:30:59
再帰関数でローカルな変数が多すぎなら、
関数を何とかする手もある。

718:デフォルトの名無しさん
08/01/31 18:31:54
そもそも再帰の脱出条件ミスってて、無限に掘ってるかもしれんなw

719:デフォルトの名無しさん
08/01/31 18:35:02
>>715
つまり再帰処理を行う回数を最初に逆算しておくってこと、かな
ディレクトリの階層数があって更に木構造のように枝分かれしていくのを考えると
すごく大変そうですがちょっと調べつつがんばってみます・・・

>>716-718
しっかり終了はするんですが、時間が経つとだんだんと重たくなってきます
CPU使用率の方が、他アプリケーションをがんがん使うと結構きつくなったりするようです


720:デフォルトの名無しさん
08/01/31 18:36:50
お前のパソコンはウィルス検索中に他アプリケーションがんがん使ったら重たくならないか・・?

うちのノートン先生は重たくなる

721:デフォルトの名無しさん
08/01/31 18:39:22
>>719
> つまり再帰処理を行う回数を最初に逆算しておくってこと、かな

「配列」じゃなくて「リスト」って書いた意味を汲んでくれないかな...

722:デフォルトの名無しさん
08/01/31 18:42:53
>>709
なるほど! ありがとうございました。

723:デフォルトの名無しさん
08/01/31 18:44:13
・探索中にサブディレクトリを見つけたら、現在の状態をスタックに積み上げて、
 サブディレクトリの探索を開始する。
・現在のディレクトリの探索が終了したら、スタックから状態をとってきて、
 そのディレクトリの探索を再開する。
・スタックが空になったら終了。

何も難しいことはない。

724:デフォルトの名無しさん
08/01/31 18:48:28
再帰をループにするときはスタックに変数を入れるんじゃなかったっけ。

725:デフォルトの名無しさん
08/01/31 18:49:05
Directory.GetFiles(@"c:\", "*.*", SearchOption.AllDirectories);
とかじゃだめなのか?

726:デフォルトの名無しさん
08/01/31 18:49:13
あ、かぶった。

727:デフォルトの名無しさん
08/01/31 18:50:23
>>725
あんまり変なことを教えるなよ…

728:デフォルトの名無しさん
08/01/31 18:54:15
>>725
それだとXP以降のOSではシステムフォルダを検索しようとして権限がないので例外が発生する。
また拡張子のないファイルが取得出来ない。

729:デフォルトの名無しさん
08/01/31 18:57:45
コールスタックの知識自体に間違いがあると問題なのですが、
再帰呼び出しをするからスタックが溜まっていってしまうのであって
ループで何度も何度も呼び出す分には問題ないのでしょうか?

>>721
すみません調べてみます

>>723
やってることは同じなのは感覚として掴めました
しかし全然想像つかないです、じっくり考えてみます

>>725
調べていてDirectoryInfoとかそういうのは見つけました
.GetFiles()とかは使っていましたが引数渡すのは試してないです
ちょっとやりたいことがやられちゃう感じなので今回はパスでお願いします

730:デフォルトの名無しさん
08/01/31 19:02:47
関数を呼び出すたびに、その時点の実行状態がコールスタックに積み上げられる。
しかし、コールスタックは小さいから、すぐに溢れる。
だから、再帰呼び出しをループに展開する。
そのときには、もとと同じようにスタックを使って実装すると楽。

731:デフォルトの名無しさん
08/01/31 19:12:04
コールスタックについて学ぶのは良いことだけどさ、

たかがコールスタックが増えたごときで動作は遅くならん。
ましてやディレクトリの深さが 1000 や 2000 も無いかぎり溢れるなんて。

732:デフォルトの名無しさん
08/01/31 19:13:27
どうでもいいかもしれないけどファイル階層列挙場合はQueueの方が好きかなあ
並び的に

733:デフォルトの名無しさん
08/01/31 19:49:26
>>730
つまり関数の中で関数が呼ばれてその中で更に・・・みたいのだとあふれちゃうんですよね
スタックはC++でクラスを勉強する時にそういう構造を作ってみた記憶があるので
やってみようと思います

>>731
ですよね・・ちょっと1から作り直してみます

ありがとうございました、助かりました

734:デフォルトの名無しさん
08/01/31 19:56:24
それにしても良い子であった

スタックの実装にArrayListを使ってくれればいいけど

735:デフォルトの名無しさん
08/01/31 20:06:27
>>734
なんで”Array”Listなん?

736:デフォルトの名無しさん
08/01/31 20:16:56
Stack<T>でおk

737:デフォルトの名無しさん
08/01/31 20:39:51
.NETってどうしてもっさりなん?

738:デフォルトの名無しさん
08/01/31 20:59:41
メモリ大量に積んだvista使ってから言え!
ってゲイツが言ってた

739:デフォルトの名無しさん
08/01/31 21:02:21
32bitCPUだといまのメモリで限界だろ(2GB)

740:デフォルトの名無しさん
08/01/31 21:04:38
つーか、スタックぐらい自分で作ればよくね?

741:デフォルトの名無しさん
08/01/31 21:46:08
Expression Treeって面白いな
時々話題になるT Multiply<T>(T left, T right)みたいなのも簡単に作れる

742:デフォルトの名無しさん
08/01/31 21:57:21
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);
        }
    }
}

743:デフォルトの名無しさん
08/01/31 22:00:26
Enumerable.Selectでいいだろ

744:デフォルトの名無しさん
08/01/31 22:37:36
>>743いまわかた^p^

745:デフォルトの名無しさん
08/01/31 23:29:50
.netもっさりとか言ってるやつはどんなボロいPC使ってるん?

746:デフォルトの名無しさん
08/01/31 23:33:35
.netもっさりって気分は分からんでもない。
結局は結構windowsのAPI使用することが多いし。
何のための.netなんか分からんときがある。

747:デフォルトの名無しさん
08/01/31 23:36:31
それでも楽じゃん。

748:デフォルトの名無しさん
08/01/31 23:42:18
>>745
Athlon64 3500+ですがもっさりです

749:デフォルトの名無しさん
08/01/31 23:46:47
それじゃあたりまえ。

750:デフォルトの名無しさん
08/01/31 23:58:33
どれ位のCPU使うともっさりしなくなりますか?

751:デフォルトの名無しさん
08/02/01 00:04:34
>>750
ヅアルコア

752:デフォルトの名無しさん
08/02/01 00:06:00
>>748
日ごろのメンテナンス次第でいくらでも遅くできるよ

753:デフォルトの名無しさん
08/02/01 00:13:31
Pen4とかでも、チューニング次第じゃそこそこ動くんじゃね?

754:デフォルトの名無しさん
08/02/01 00:24:18
今Core2Duoを買う金がないのでAthlon64 X2にでもしてみます。
あの重い2005が軽くなるなら。

755:デフォルトの名無しさん
08/02/01 00:26:14
メモリ搭載量の方が重要

756:デフォルトの名無しさん
08/02/01 00:30:04
今AMDは駄目だろ。

757:デフォルトの名無しさん
08/02/01 00:30:50
メモリ3G詰め込めばOK

758:デフォルトの名無しさん
08/02/01 00:31:20
2G積んでます。
それと2度目以降の起動はキャッシュが効いて速いです。
よく見ると2005自体にNTFS圧縮が掛けてあるみたいです。

759:デフォルトの名無しさん
08/02/01 00:32:42
>>754
OS入れなおしだよ

760:デフォルトの名無しさん
08/02/01 00:32:50
常駐プロセスいくつあるよ?

761:デフォルトの名無しさん
08/02/01 00:33:28
>>756
安いのならコストパフォーマンス高いんじゃね?
15k以下のラインで

762:デフォルトの名無しさん
08/02/01 00:35:52
>>759
それやっても大して変化なかったです。
>>760
42個です。極力いらないものは切っています。


763:デフォルトの名無しさん
08/02/01 00:36:36
NTFS 圧縮のせいじゃね?

764:デフォルトの名無しさん
08/02/01 00:36:49
4万だせばX2 4000+でGeForce6150のケース付きが変えます。
メモリは別ですが今は5000円あればお釣りが来ますので。

765:デフォルトの名無しさん
08/02/01 00:37:53
>>763
わかりました。やはりNTFS圧縮のせいでもっさりなのかもしれません。
WordやExcelにもNTFS圧縮掛けていますがもっさりしませんけど。
あとC++Builder2007にも圧縮掛けてありますがもっさりしません。

766:デフォルトの名無しさん
08/02/01 00:38:19
中間ファイルに圧縮かかってたらもっさりしそう

767:デフォルトの名無しさん
08/02/01 00:38:44
CPU : pentium4 3ghz 
mem : 256*2

これでも十分。

768:デフォルトの名無しさん
08/02/01 00:39:52
>>764
4万出してそれはないわ。

769:デフォルトの名無しさん
08/02/01 00:40:09
>>767
えー
やっぱりNTFS圧縮のせいっぽいですね。
他に原因が思いつかない。

770:デフォルトの名無しさん
08/02/01 00:40:15
おまえらPC自作板かよ

771:デフォルトの名無しさん
08/02/01 00:41:44
今思い出しましたが2003の時はNTFS圧縮を掛けてなかったのでか
もっさりしてませんでした。
さっそく圧縮を解除してみます。これでだめなら本格的にPCの交換を
考えます。

772:デフォルトの名無しさん
08/02/01 00:42:56
俺NTFS圧縮掛けてない
ちなみにCドライブは80GB

773:デフォルトの名無しさん
08/02/01 00:51:56
>>762
常駐多すぎ
ノートンいれて起動時に30切るくらい、スタンドアロンで20弱くらいで

774:デフォルトの名無しさん
08/02/01 00:54:39
>>773
30個?どうやったらそんなに少なくなるんだろう。
WinampエージェントとかDaemon Toolsとか切るしかないか。

775:デフォルトの名無しさん
08/02/01 00:55:32
俺今3GBだけど起動直後で60個くらいあるわ・・・
しばらく前までは1GBで常駐プロセスとか気にしてたんだが・・・

776:デフォルトの名無しさん
08/02/01 00:56:42
60は多すぎ。

777:デフォルトの名無しさん
08/02/01 00:58:40
ちなみに仮想メモリは切ってある

778:デフォルトの名無しさん
08/02/01 00:59:39
変態的にカスタマイズし過ぎかと

779:デフォルトの名無しさん
08/02/01 00:59:55
>>774
デーモンとかwinampは関係ないだろ・・・切れよ・・・

780:デフォルトの名無しさん
08/02/01 01:01:19
>>779
切りますか・・・・

781:デフォルトの名無しさん
08/02/01 01:02:33
msconfigして、スタートアップとサービスから
マイクロソフトとセキュリティ関係のやつ全部とめて
デーモンバスターいれて、不要なwindowsプロセスとめるといいよ

782:デフォルトの名無しさん
08/02/01 01:03:08
それくらいはやってるが

783:デフォルトの名無しさん
08/02/01 01:03:48
ituneHelperとかなめてるよな。


784:デフォルトの名無しさん
08/02/01 01:04:24
QuickTimeのおそろしさは異常

785:デフォルトの名無しさん
08/02/01 01:05:14
まったくだw

786:デフォルトの名無しさん
08/02/01 01:06:03
それ考えるとAcronis True ImageとDiskeeper2007入れてるのが
痛いかもなあ。

Acronis True Imageは定期的にバックアップ取るので仕方ないとして
Diskeeperはバックグラウンドでデフラグするので止めた方がいいのかも。
でも何かやってる間はデフラグ止めてくれるんだけど。


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