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

ふらっとC#,C♯,C#(初心者用) Part48

■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん2009/11/18(水) 23:56:27
このスレッドは
「どんなにくだらないC#プログラミングに関する発言でも誰かが優しくレスをしてくれるスレッド」です。
ほかのスレッドでは恐ろしくて書き込めないような低レベル、もしくは質問者自身なんだか意味がよく分からない質問など、
勇気をもって書き込んでください。
内容に応じて、他スレ・他板へ行くことを勧められる、あるいは誘導される場合がありますがご了承下さい。

>>980を踏んだ人は新スレを建てて下さい。
>>980が無理な場合、話し合って新スレを建てる人を決めて下さい。

前スレ
ふらっとC#,C♯,C#(初心者用) Part47
http://pc12.2ch.net/test/read.cgi/tech/1257067411/
0153デフォルトの名無しさん2009/11/21(土) 18:29:39
「同じように印刷すれば、どのプリンタでも印字位置はズレない」

こんな命題が成り立つわけないのは自明だろ。全メーカーの全プリンタで検証して
はじめて成り立つわけだし。

俺はそんな検証したくないし、そもそも、位置ズレに悩まされたこともあるから、
調整機能を付けるよ。
0154デフォルトの名無しさん2009/11/21(土) 18:29:50
>>152
やってみればいいじゃん。
0155デフォルトの名無しさん2009/11/21(土) 18:42:50
万人が使えるUIなら当然微調整機能くらいは付けるわな
0156デフォルトの名無しさん2009/11/21(土) 18:43:42
このどうでもいい議論いつまで続くんだろう
0157デフォルトの名無しさん2009/11/21(土) 18:44:37
C#でグローバルIPを取得するにはどうすればいいですか?
0158デフォルトの名無しさん2009/11/21(土) 18:46:26
>>157
ルータに問い合わせるかリモホを表示するサイトにアクセスして
その結果を利用するか
0159デフォルトの名無しさん2009/11/21(土) 18:46:52
>>157
なんのグローバルIPをどんなアプリから取得したいんだよ?

LAN 内からルーターのグローバルIPが取りたい、ってことなら、UPnP か、
いったん外部にアクセスしてそっちからもらうか、だな。
0160デフォルトの名無しさん2009/11/21(土) 18:48:32
>>158,159
ルータに問い合わせるって簡単に出来ますか?
リモホを返すページ作ってアクセスさせてみます
0161デフォルトの名無しさん2009/11/21(土) 18:52:13
perl だけど、サンプルあったぞ。

http://hydro.energy.kyoto-u.ac.jp/~sekiyama/upnp/upnp-get-extaddr
0162デフォルトの名無しさん2009/11/21(土) 18:54:43
あ、SSI使えたので流用しようかと思いましたが、
ありがとうございます。使わさせて頂きます。
0163デフォルトの名無しさん2009/11/21(土) 19:53:58
デリゲートはメソッドをカプセル化する型
0164デフォルトの名無しさん2009/11/22(日) 01:10:28
SMTPClientを使ってメールを送るプログラムを作っていたのですが、
WinXPの自分のPCだと問題無く動作するのですが、
Vistaの友人のPCだと、

メールを送信できませんでした。
場所 System.Net.Mail.SmtpClient.Send(MailMessage message)
場所 ConnectForm.Sendmail_DoWork(Object sender, DoWorkEventArgs e)]

となり、詰まってます。smtpはVistaで使えないのですか?
0165デフォルトの名無しさん2009/11/22(日) 01:17:08
>>164
メール送受信関係はWindowsのアキレス腱。
だって、元々SMTPはメールサーバー同士でメールをやり取りするためのプロトコルだぞ。
メールサーバーをローカルに立てているWindows機なんてそこらにはないだろ?

ってことで、メール送信に関しては失敗したときの動作を必ず決めておくべき。
質問の答えだが、別にVistaだから使えないってことはない。
クライアントマシンの環境次第。例えばオレのマシンじゃ動かない。
01661642009/11/22(日) 01:34:04
言葉足らずでした。
自分の場合、どの環境からも送信出来るようにと思い、
YahooやGoogleのフリーメールをsmtp経由で送信しているのですが、
それでもそんなものなんでしょうかね?
0167デフォルトの名無しさん2009/11/22(日) 01:47:03
>>166
だから、クライアントマシンの環境次第だと言ってるじゃないか。察してくれよ。
ちなみに今時SMTPの標準のポートが空いてるプロバイダなんてまずねーよ。
0168デフォルトの名無しさん2009/11/22(日) 07:02:38
FillRectangleメソッドではRectangleFを指定できるのに、
DrawRectangleメソッドではなぜRectangleFが指定できず、Rectangleしか指定できないのでしょうか?
floatのX,Y,Width,Heightを直接記述するとデバッグでエラーにならないのだから---
RectangleFが指定できたらいいのですが・・・・・できますでしょうか。
ご存知の方よろしくお願いいたします。
0169デフォルトの名無しさん2009/11/22(日) 09:05:49
言われてMSDN見てみた。ホントに一貫性無いな・・・なんでだろ。
Graphics..::.DrawRectangle メソッド (Pen, Single, Single, Single, Single)
あるから出来ないわけないよね。
Graphics..::.DrawRectangles メソッド (Pen, array<RectangleF>[]()[])
に食わせるか、ラップ関数作って食わせるか。
0170デフォルトの名無しさん2009/11/22(日) 09:16:37
>>164
とりあえずエラーの場所だけ書かれてもな
0171デフォルトの名無しさん2009/11/22(日) 11:07:51
C#はCと違って文字列はアドレスはないの?

char *P="もじれつれつ";
みたいなことできない?
0172デフォルトの名無しさん2009/11/22(日) 11:09:56
うん。
0173デフォルトの名無しさん2009/11/22(日) 11:13:21
そうなんだ。不便だのぉ
0174デフォルトの名無しさん2009/11/22(日) 11:17:12
ポインタ管理しなくていいから楽でいいじゃん
0175デフォルトの名無しさん2009/11/22(日) 11:21:37
>>171
ポインタは無いけど、イテレータ(Enumerator)ならあるよ。
ただし、string自体がimmutableなので、読み取り専用になるけど
0176デフォルトの名無しさん2009/11/22(日) 11:21:39
GCって何ですか
0177デフォルトの名無しさん2009/11/22(日) 11:22:43
ググレ
0178デフォルトの名無しさん2009/11/22(日) 11:29:40
エンスーな写真月刊誌
0179デフォルトの名無しさん2009/11/22(日) 12:10:22
C#は、他プロセスにアタッチして、
そのプロセスが持つフォームのタイトルテキストを変更するような
プログラムを作成出来ますか?
0180デフォルトの名無しさん2009/11/22(日) 12:13:32
うん
大抵はDllImport祭りになるけど
0181デフォルトの名無しさん2009/11/22(日) 12:14:59
XPでVistaのガジェットのようにデスクトップに表示するアプリを作りたいのですが
どのようにすればいいのでしょうか
0182デフォルトの名無しさん2009/11/22(日) 12:30:24
作ればいいと思うよ
0183デフォルトの名無しさん2009/11/22(日) 13:03:14
文字列を区切って変数に代入するメソッドはどうすればいい?

class Test{
    public int x;
    public int y;
    public void func(string s){
    }
}

func("132/145")みたいに/で区切ると
x=132、y=145が入る
ようなことがやりたいんだけど。
0184デフォルトの名無しさん2009/11/22(日) 13:05:34
string や int の性的メソッドを調べてみるべし
0185デフォルトの名無しさん2009/11/22(日) 13:14:19
>>183
Splitかければいい。というか、こんなのは基本だろ?
分割できなかったときは、たぶんこの場合はnullを返すよりは例外を出したほうがいいだろうな。
0186デフォルトの名無しさん2009/11/22(日) 13:16:33
>>183
ttp://www.atmarkit.co.jp/fdotnet/dotnettips/317vbsplit/vbsplit.html
0187デフォルトの名無しさん2009/11/22(日) 13:26:37
unsafeでポインタ使えるから色々試してみるのも面白いよ
splitより簡単にできることはないけど
0188デフォルトの名無しさん2009/11/22(日) 13:33:31
実はただの分割じゃなく数式の解析が目的でしたとかなー
0189デフォルトの名無しさん2009/11/22(日) 13:39:55
>>71で、「ListViewで垂直スクロールバーが出ているかどうか知りたいんですが」ってカキコしたんだが
スルーされてしまったけど、やはり無理?
0190デフォルトの名無しさん2009/11/22(日) 13:45:34
それが人に物を聞く態度か?
0191デフォルトの名無しさん2009/11/22(日) 13:54:07
教えてくれたらロリ画像だします・・・
0192デフォルトの名無しさん2009/11/22(日) 14:02:55
そうしたら通報します・・・
0193デフォルトの名無しさん2009/11/22(日) 14:05:16
>>189
ClientRectangleの外にItem(かSubItem)が存在するかどうかで判定するとか。
…泥臭いやり方だなw
0194デフォルトの名無しさん2009/11/22(日) 14:28:01
>>193
どうもです。ListViewをOwnerDrawしている状態で、ヘッダーの長さを水平スクロールバーの出ない長さに調整したいのですが
縦スクロールバーを考慮いてその分ヘッダの長さを短くすると、バーが出ない時に白く残っちゃうんですよね
これを何とか消したいんですが他のアプローチ考えてみます
0195デフォルトの名無しさん2009/11/22(日) 14:31:55
>>189
ListViewのカスタムコントロール作ったことあるが、そのときはGetScrollBarInfoでやった
表示/非表示を知りたかったわけじゃなく、縦横それぞれのスクロールバーの
自動表示をコントロールしたくて実装した副産物
初心者スレでAPI薦めるってどうよって思ったが、正直ほかの方法は知らない
0196デフォルトの名無しさん2009/11/22(日) 15:01:46
>>195
ありがとうございます。一応サンプル有ったからこれからテストしてみようと思います
http://www.pinvoke.net/default.aspx/user32.getscrollbarinfo
0197デフォルトの名無しさん2009/11/22(日) 16:32:01
PrintDocumentにて、商品明細書を作成しています。、A4縦の単表に100ほどの項目名称や金額をDrawStringメソッドやDrawRectangleメソッドを併用して記述しているのですが、プレビューが出るのに15秒かかってしまいます
(>_<;)。
項目数が多い場合、これくらい時間がかかるものなのでしょうか…。
皆様はどのような工夫をして、レスポンスを上げていますか?
よろしくお願いします。
0198デフォルトの名無しさん2009/11/22(日) 16:35:50
どのようにしているからレスポンスが遅いのかが分かりません。

各処理の区切りごとに時間を計測してどのボトルネックになている部分をまず探してみてはどうでしょう?

例えばDBからデータの取得が遅いとか色々あると思います。

0199デフォルトの名無しさん2009/11/22(日) 16:37:15
15秒は遅いな
単票なら座標計算に手間取る事は無いだろうから、データ取得あたりで時間掛かってないか見てみた方がいい
0200デフォルトの名無しさん2009/11/22(日) 17:05:30
>>199
ありがとうございます。
データは、今は直接、DrawStringメソッド内に文字列を指定しています。

DrawStringメソッドにて文字列の右揃えや左揃えを細かく指定し、さらに背景にFillRectangleでグレーの網掛けも随所に入れています。
DrawStringメソッドと
DrawRectangleメソッド、
FillRectangleメソッドを
1つの関数に定義して、100項目ほどの文字列の描画について、全てその関数で行う形にしています。
いい方法と思いましたが、項目定義が増えるほど一気に重たくなりました
(T_T;)。

DrawStringメソッドの中でPointのみを指定し、Rectangleを使わないようにした方が軽いかもしるません。

これから随所を削りながら試験してみます。

もし、何かコツなどのご意見がありましたらぜひ教えてくださいっ…!!
0201デフォルトの名無しさん2009/11/22(日) 17:11:35
>>200
どちらかっつーと、データをレンダリングするのより
データを取ってくるのに時間が掛かってるんじゃないかと思うが。

コードの断片ごとに掛かってる時間を計測して、標準出力に出して眺めてごらんよ。
0202デフォルトの名無しさん2009/11/22(日) 17:11:39
たかだか100項目程度のそれで15秒もかかるとは思えない

生で書き込んでるんだったら 適当に文字を置換して晒してみれば?
座標計算の所が気になると言えば気になるけど
0203デフォルトの名無しさん2009/11/22(日) 17:20:59
PDFにしないからだよ
0204デフォルトの名無しさん2009/11/22(日) 17:23:46
>>203 え?
0205デフォルトの名無しさん2009/11/22(日) 17:35:35
>>200
半分の50項目だったら何秒?
半分コメントアウトして試してみて
0206デフォルトの名無しさん2009/11/22(日) 18:04:12
ListViewの話ですが、スクロールバーの検出に成功してカラムの調整まで成功しました
が、水平スクロールバーの再描画というか消えるところまでは出来ませんでした
もう少し頑張ってみます
0207デフォルトの名無しさん2009/11/22(日) 18:41:52
配列と列挙型ってどう違う?
いやまぁ違うところは違うけどさ。
列挙型でできることって配列使っても簡単に同じことできね?
列挙型の存在価値がわからんがなんのためにあるの?
0208デフォルトの名無しさん2009/11/22(日) 18:43:33
全く違うだろう
というかどういうのをして同じことって言うの?
0209デフォルトの名無しさん2009/11/22(日) 18:46:00
配列だと代入できんじゃん
わざわざラップクラス作る?
そのほうが無駄な手間だ
0210デフォルトの名無しさん2009/11/22(日) 18:50:29
>>207, 209
?????
何を言ってるんだ???
0211デフォルトの名無しさん2009/11/22(日) 18:51:44
>>209は>>207に向けてるんだと思う。
0212デフォルトの名無しさん2009/11/22(日) 18:51:55
もう一度教科書読むことを勧める
0213デフォルトの名無しさん2009/11/22(日) 18:53:36
>>211
それはそれでイミフだ
>>207のイミフな発言をどう解釈して>>209の回答になったのかも非常に気になる
0214デフォルトの名無しさん2009/11/22(日) 18:53:38
>>206
194を読まずにレスしたからGetScrollBarInfoっていったけど
本来の目的は横スクロールバーの表示抑制なんじゃないの?
そうであるならイベントハンドラでカラムサイズを調整すれば済むと思うけどダメだった?
0215デフォルトの名無しさん2009/11/22(日) 18:55:58
>>207
列挙型で出来ることを配列で簡単に実現してるケースを知りたいわ
enum Color { Red, Blue, Green };
=
String[] color = {"Red", "Blue", "Green"};

とでも思ってるんだろうか・・・
0216デフォルトの名無しさん2009/11/22(日) 18:56:05
string[] 時間={"あさ","ひる","よる"}
enum 時間 {あさ,ひる,よる}

Now=時間[1];
if(ひるなら)
ほにゃらら

if(Now==時間.ひる)
ほにゃらら

これは何がどうちがうの?
0217デフォルトの名無しさん2009/11/22(日) 18:56:40
>>214
カラムサイズ調整までは何の問題もないけど、リストにロード直後だと再描画してくれませんでした
カラム調整は確認したから大丈夫ですよ
0218デフォルトの名無しさん2009/11/22(日) 19:00:04
>>216
なんで自分で調べないの?
0219デフォルトの名無しさん2009/11/22(日) 19:00:11
>>216
列挙体を関数の引数にした場合、列挙体以外の値以外入ってくる余地無くなるよね
これだけでも全然違うと理解できないかな?
0220デフォルトの名無しさん2009/11/22(日) 19:01:56
>>216
ぜんぜん違うだろ。

時間[1]っての見てだれが"ひる"だってわかんだよ。
それに Now に "まよなか" ってまちがって入れちゃった場合だれが気付いてくれるんだ?
もし時間の種類に "ひづけへんこうせんをこえるまではよるのつもりでいます" なんて長いパターン入れたら
比較に時間かかるわ無駄なメモリ使うわでもったいないよな。
0221デフォルトの名無しさん2009/11/22(日) 19:05:30
>>220
突っ込み所はそこなのか?
>>216は上ではNowに時間[1]ってのを代入してて、下じゃ比較してるだけなんだぞ
0222デフォルトの名無しさん2009/11/22(日) 19:07:55
enum は定数のラベル
実態は 1 とか 2 とか 3 なわけよ。

プログラムを組むときって状態を管理することが多いんだけど(あさだったらXX、ひるだったらYYとか)
状態の数が3つとか4つなら文字列なんか使うより数字使った方がメモリが無駄にならないし
処理も速いよね。

でも 1 とか 2 とかをプログラム中に直接書くと、書いてる人が混乱しちゃうし間違いやすい。
一人で数百行ぐらいのコード書くならまだしも2人3人ぐらいでやってるとあっというまに破綻する。

で、その 1 とか 2 のマジックナンバーに名前を付けることにしたのが enum なわけだ。
C時代は enum の他に #define なんてのもあったけど。
enum のいいところは変数にあらかじめきめられた数字「しか」代入出来なくしてくれる作用があって、
1 とか 2 で管理してる場合に間違って 9 とかが入っちゃって誤動作するのをコンパイルする段階で
見付けてくれるのよ。
0223デフォルトの名無しさん2009/11/22(日) 19:11:46
お前ら釣りに優しいなw
enum使ってくる時点で初めてではないだろ
0224デフォルトの名無しさん2009/11/22(日) 19:15:19
経験者があの質問するのは釣りでも無理だろ・・・
0225デフォルトの名無しさん2009/11/22(日) 19:17:23
時間.ひる == "ひる" だと思ってるのか?もしかすると。
0226デフォルトの名無しさん2009/11/22(日) 19:20:27
>>205
レスの流れからして、読み込み済みデータで描画して何秒なら分かるが。
0227デフォルトの名無しさん2009/11/22(日) 19:21:06
>>217
いや、なんというかアプローチの仕方が違うんじゃないかなって思ってさ
最初は縦スクロールの表示判定だったけど、その真意は横いっぱいに
表示したカラムのせいでアイテム数が増えて縦スクロールが出ると
結果的に横スクロールバーも出るっていう話ではないの?
そうであるなら、例えば縦スクロールバーのみ出しっぱなしにすれば
処理はシンプルになると思うし、縦スクロールバー隠しておくつもりなら
横スクロールバーは出ないようにしてしまったほうが、カラム調節で
チラツキの押さえ込みと格闘するより楽なんじゃないかなぁと・・・
0228デフォルトの名無しさん2009/11/22(日) 19:26:39
enumすら説明出来ないクズスレ
0229デフォルトの名無しさん2009/11/22(日) 19:29:37
>>226
半分の印刷で、時間が半分になるのか1/4になるのか、まさかの1/9になるのか
と言うことの確認。つまり二重ループ三重ループの疑い。
0230デフォルトの名無しさん2009/11/22(日) 19:35:20
1/9ってなんだオレ…三重なら1/8だorz
0231デフォルトの名無しさん2009/11/22(日) 19:56:13
なんでいちいちちょっとしたことするだけなのに
Mainを意味のないクラスで囲まなければならないんだ!不便!
0232デフォルトの名無しさん2009/11/22(日) 19:58:46
>>205
50項目のときは5秒でした。

サブルーチンの中で
※背景の塗りつぶしが必要ならFillRectangleを実行する。
※文字列を囲むならばDrawRectangleを実行する。
※文字列については常にRectangle構造体の中で水平垂直位置をパラメーターから与える
…これを150項目分行うようにしています。

項目が増えれば増えるほど、倍以上に遅くなっています。
FontなどのオブジェクトのDisposeが足りないのかなと思って直しましたが、結果はやはり15秒弱です。
0233デフォルトの名無しさん2009/11/22(日) 19:59:52
Font?
一項目ごとにフォント読み込んだりしてない?
0234デフォルトの名無しさん2009/11/22(日) 20:06:57
>>231
そこまで考えてるのになんで
ちょっとしたことするだけなのに Main なんて意味のないメソッドで囲まなければならないんだ!不便!
まで発想が飛ばないのかねぇ。
0235デフォルトの名無しさん2009/11/22(日) 20:08:29
どう見ても>>231はわかってる奴の発想だな
>>209にはとても及ばない
0236デフォルトの名無しさん2009/11/22(日) 20:16:45
>>181
0237デフォルトの名無しさん2009/11/22(日) 20:24:43
>>229
え、多重ループの疑いがあったとして項目数減らしても計算量は線形でしか減らないキガス・・・
ああ、そもそもルーチンを何回も何回も呼び出している疑いか。あるね、そんな事。
0238デフォルトの名無しさん2009/11/22(日) 20:25:44
>>227
用途は趣味で作っているメディアプレーヤーだから、1行の時もあれば100行近い場合もあるんですよ
で、曲名のカラムを調整して縦スクロールバーが無い時はいっぱいまでカラムを延ばして
バーが出たらバーの分だけ曲名を縮める。
そうしないと縦スクロールバーが無いとOwnerDrawしたカラムヘッダーの最後が真っ白けになっちまうし、
逆に縦スクロールバーが出ている時に伸ばしたら横スクロールバーが出るのがちょっとウザイ
現状、調整後に横スクロールバーが残っても、縦または横にスクロールした瞬間に消えるんですけどね
0239デフォルトの名無しさん2009/11/22(日) 20:29:26
一回5secとして三回回って15sec。項目半分に減らして2.5secとして三回回って7.5sec。
減らした比率でしか計算量は減らないから、237は勘違い。
0240デフォルトの名無しさん2009/11/22(日) 20:30:52
>>235
しかしながらC++とかに慣れてるとは・・・とてもじゃないが思いにくい
不便とかを超えてもう当たり前になっている所だからぶっちゃけどうでもいい
そして、そんな一か所がなんだってんだ もっといろいろあるだろう orz
0241デフォルトの名無しさん2009/11/22(日) 20:34:40
>>232
1/3だと微妙だけど二重ループの可能性は高いな
ありそうなのは、
項目1つ目の場合は1つ目を描画し、2つ目の時は1つ目と2つ目を描画し…のパターンと
項目1つ描画するつもりが全項目描画している関数を呼び出している…のパターン
0242デフォルトの名無しさん2009/11/22(日) 20:36:07
>>232
disposeしたところでGCに回収してもらわないと意味がない
そんで強制的に回収させてたら余計に遅くなるんではないかと・・・
メモリがないわけではないんなら

ところで150項目てあるけどループ回数は何回?
単純に150?
それとも違う?

1項目は そのサブルーチンを何回使う?

フォントはでいるだけ使いまわしてる?
(例えば明細用を最初に定義して使いまわす)
0243デフォルトの名無しさん2009/11/22(日) 21:04:27
描画するデータをその都度どこかから持ってきてるとかかな
0244デフォルトの名無しさん2009/11/22(日) 21:09:01
スタティック変数使って、何回通ったか数えてみてから考えても良いかも
02452412009/11/22(日) 21:12:26
オレ算数できてなかったorz
1/3の数の描画で1/3の時間だったら、1項目の描画の途中で変に遅い部分があると言うだけだな
0246デフォルトの名無しさん2009/11/22(日) 21:16:24
>>238
それなら、縦スクロールバーは常に出しっぱなしにして、
横スクロールバーは常に非表示にしておけば一番スッキリするんじゃないの?
少なくともカラムの幅に関係なく横スクロールバーは出ないようにしてしまえば
かなり問題は簡単になると思うんだがなぁ
0247デフォルトの名無しさん2009/11/22(日) 21:16:57
>>232
さっきから埒が明かないな。ソースコードさらしたほうが早いんじゃね?
おそらく相当ひどい実装になってるんじゃないかと予想。
0248デフォルトの名無しさん2009/11/22(日) 21:55:21
>>246
どうもListViewでは、スクロールバー自動と無ししか選択できないみたいです
ShowScrollBarをテストしてみたんですが、無効化されるようですね
他にやり方有りましたら教えていただけませんか?
0249デフォルトの名無しさん2009/11/22(日) 22:01:17
FontオブジェクトやRectangleオブジェクトを生成するのって
そんなに負荷がかかるものなのですか?
明朝体やゴシックが入り混じっているときも、
変更があるときだけ生成し直すのが良策なのかな。
0250デフォルトの名無しさん2009/11/22(日) 22:03:28
Fontはアンマネージリソース抱えてるので特に生成が重い類
Rectangleは構造体だからほとんどノーコストで作れる
0251デフォルトの名無しさん2009/11/22(日) 22:10:22
>>250
アンマネージリソース…?
はじめて聞いた。
クグルとするか
(>_<;)。
0252デフォルトの名無しさん2009/11/22(日) 22:20:52
Fontを150回作るだけで何秒もかかるものでもないんだから、気にするだけ無意味
■ このスレッドは過去ログ倉庫に格納されています