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


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

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



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

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

前スレ
ふらっとC#,C♯,C#(初心者用) Part47
pc12.2ch.net/test/read.cgi/tech/1257067411/

116 名前:デフォルトの名無しさん mailto:sage [2009/11/21(土) 15:35:52 ]
>>115
だから、そういうテキトーなことを言わないこと。
葉書印刷ソフトだけでも世の中にいろいろあるが、そんな「調整機能」が
付いたソフトは見たことがない。

そんな泥臭い作業を人間様に任せるようなダメ設計になってるのなら
windowsもページプリンタもこんなに普及してねえよ。

117 名前:デフォルトの名無しさん mailto:sage [2009/11/21(土) 15:37:16 ]
これがゆとりってやつか・・・。

118 名前:デフォルトの名無しさん mailto:sage [2009/11/21(土) 15:39:18 ]
www.yomiuri.co.jp/net/qanda/qanda081215.htm

> 「筆まめ」の「印刷位置微調整」機能
>
> 筆まめ19など、はがき作成ソフトには印刷位置をミリ単位で微調整する機能が備わっている。
> 筆まめの場合は、ファイルメニューの「印刷位置微調整」から利用する
> 郵便番号の位置だけを微調整する機能もある。



119 名前:デフォルトの名無しさん mailto:sage [2009/11/21(土) 15:42:31 ]
>>116
         ____   
       / \  /\ キリッ
.     / (ー)  (ー)\      
    /   ⌒(__人__)⌒ \    <そんな「調整機能」が
    |      |r┬-|    |      付いたソフトは見たことがない。

     \     `ー'´   /
    ノ            \
  /´               ヽ              
 |    l              \
 ヽ    -一''''''"〜〜``'ー--、   -一'''''''ー-、.    
  ヽ ____(⌒)(⌒)⌒) )  (⌒_(⌒)⌒)⌒))


          ____
        /_ノ  ヽ、_\
 ミ ミ ミ  o゚((●)) ((●))゚o      ミ ミ ミ    <.だっておwww
/⌒)⌒)⌒. ::::::⌒(__人__)⌒:::\   /⌒)⌒)⌒)
| / / /      |r┬-|    | (⌒)/ / / //  
| :::::::::::(⌒)    | |  |   /  ゝ  :::::::::::/
|     ノ     | |  |   \  /  )  /  
ヽ    /      `ー'´      ヽ /    /     
 |    |   l||l 从人 l||l      l||l 从人 l||l   バ   
 ヽ    -一''''''"〜〜``'ー--、   -一'''''''ー-、 ン
  ヽ ____(⌒)(⌒)⌒) )  (⌒_(⌒)⌒)⌒)) バ
                             ン

120 名前:デフォルトの名無しさん mailto:sage [2009/11/21(土) 15:44:45 ]
>>118
それは古い精度の悪いプリンタ(現実にはあまりないが)を使っている人を
想定した「念のための機能」であって、>>115が主張するように必須の機能なんかじゃない。

通常はそんな馬鹿げたことをしなくても、少なくともmmオーダーの精度で
正確に位置決めされた印刷が行えるようになっている。

っていうか、印刷のコード書いたことがない馬鹿は黙っていた方がいいよ。

121 名前:デフォルトの名無しさん mailto:sage [2009/11/21(土) 15:47:42 ]
で? ユーザーがどんなプリンタを使ってるのか特定できない以上、>>118みたいな
調整機能は必須だろ?

122 名前:デフォルトの名無しさん mailto:sage [2009/11/21(土) 15:47:56 ]
というか、.NETだとそのためのプロパティがHardMarginX,HardMarginYなんだよ。
これで用紙の左上とプリンタの印刷可能領域(印刷時のハードウエア座標の原点)
のズレが取得できるようになっている。

123 名前:デフォルトの名無しさん mailto:sage [2009/11/21(土) 15:47:58 ]
>そんな「調整機能」が付いたソフトは見たことがない。

124 名前:デフォルトの名無しさん [2009/11/21(土) 15:48:17 ]
プリンターの印刷可能領域に左右されずに、
用紙の左上から決まった場所に印刷するには、
例えば(100-ハードマージンX,200-ハードマージンY)
とすべきですか?それとも
例えば(100-マージンX,200-マージンY)
とすべきですか?
マージンはプログラム上で何も設定していません。
よろしくお願いいたします。



125 名前:デフォルトの名無しさん mailto:sage [2009/11/21(土) 15:49:55 ]
>>121
だから、現実問題としてはそんなプリンタは市場にほとんど存在してない。
紙送りの精度が悪いので有名だったHPの10年前の製品だって、そんな機能が
必要になるほどズレたりはしない。

126 名前:デフォルトの名無しさん mailto:sage [2009/11/21(土) 15:53:50 ]
まー、そう思うなら調整機能付けなきゃいいだけだわな。

実際、有名どころの年賀状印刷ソフトにはついてるし、俺もあとで修正するのは面倒だから、
そういう機能を付けるけど。

127 名前:デフォルトの名無しさん mailto:sage [2009/11/21(土) 15:56:59 ]
>>124
用紙の、の場合は、マージンは使わない。
ハードマージンの分を含むか含まないかは、試してみてくれ

128 名前:デフォルトの名無しさん mailto:sage [2009/11/21(土) 15:57:55 ]
HTMLエディタを作る場合の内部的なデータの持ち方は
どんなのがいいでしょう?


129 名前:デフォルトの名無しさん mailto:sage [2009/11/21(土) 15:58:37 ]
機能によって違うんじゃね?

130 名前:デフォルトの名無しさん mailto:sage [2009/11/21(土) 16:01:19 ]
データ実体はHTML&CSSだろうな

131 名前:デフォルトの名無しさん mailto:sage [2009/11/21(土) 16:33:34 ]
プリンタによって1ページに収まったり収まらなかったりするんだから、
その手の調整機能は普通いるんじゃないの?


132 名前:デフォルトの名無しさん mailto:sage [2009/11/21(土) 16:36:11 ]
         ____   
       / \  /\ キリッ
.     / (ー)  (ー)\      
    /   ⌒(__人__)⌒ \    <そんな「調整機能」が
    |      |r┬-|    |      付いたソフトは見たことがない。
     \     `ー'´   /
    ノ            \
  /´               ヽ              
 |    l              \
 ヽ    -一''''''"〜〜``'ー--、   -一'''''''ー-、.    
  ヽ ____(⌒)(⌒)⌒) )  (⌒_(⌒)⌒)⌒))

133 名前:デフォルトの名無しさん mailto:sage [2009/11/21(土) 16:46:33 ]
どうでもいいが、幼稚な奴が多いのな。
俺は馬鹿な奴は嫌いじゃないが、幼稚な奴とコミュニケーションができない
真性ヲタはどうしようもないクズだと思ってる。

134 名前:デフォルトの名無しさん mailto:sage [2009/11/21(土) 16:51:07 ]
揚げ足取りで勝った気になる困ったちゃんは少なからずいるものだ



135 名前:デフォルトの名無しさん mailto:sage [2009/11/21(土) 16:51:24 ]
>>133
お前みたいな幼稚なレスしかしない奴もクズだけどな

136 名前:デフォルトの名無しさん mailto:sage [2009/11/21(土) 16:52:58 ]
僕.NEET
喧嘩はやめて

137 名前:デフォルトの名無しさん mailto:sage [2009/11/21(土) 16:54:41 ]
みんなゴメン。

138 名前:デフォルトの名無しさん mailto:sage [2009/11/21(土) 17:04:54 ]
>>133
俺も幼稚な奴は嫌いだけど論理的じゃない奴も嫌い
前2行をどう呼んだら3行目に繋がるんだ?

139 名前:デフォルトの名無しさん mailto:sage [2009/11/21(土) 17:27:04 ]
幼稚な奴は小学校からやり直した方がいいな。

年賀状印刷ソフトに調整機能なんてついてない! とか言い張って、
ソースが提示されてるのに、現実問題としてそんなプリンタはほとんどない! か。

ほんと、テキトーなことを言う奴が多いなw

140 名前:デフォルトの名無しさん mailto:sage [2009/11/21(土) 17:30:18 ]
プリンタはアナログの世界で動く機械であって、
必ずしもアプリ側で指定した内容でずれなく印刷できる保証がどこにもない。

で、プリンタドライバのユーリティーでもある程度調整は効くだろうけど、
それで無理なような突っ込んだ内容はアプリ側でもある程度対応できるようにしておくべきだろう、という話。
必要だと思わないならやらなきゃいいだけさ。
別にスレが荒れるような内容じゃない。

141 名前:デフォルトの名無しさん mailto:sage [2009/11/21(土) 17:36:06 ]
>>114>>116 が釣り師ということで。この話題終了。

142 名前:デフォルトの名無しさん [2009/11/21(土) 17:44:15 ]
マージンは余白で、
ハードマージンは常用プリンターの印刷可能開始位置だよね。
ところで、
マージンの値をページ設定ダイアログから指定していないときは、
C♯上のマージンの初期値はいくらになるの?

143 名前:デフォルトの名無しさん mailto:sage [2009/11/21(土) 17:46:21 ]
>>140-141
無知無能なくせにしつこいなお前さん。
本当にプログラマか?
っていうか、君(ら)は今までプリンタ使ったことないのかね。

1万前後で買えるキャノンやエプソンの最下位グレードのインクジェットだって
位置決めの問題なんかないんだよ。

そんなことは例えばワードで葉書印刷をしたってわかるし、
自分でコードを書いて印刷されたものを物理的に測定したって分かる。

馬鹿な癖に頭の中だけで考えているからそういうとんでもない勘違いをすることになる。

144 名前:デフォルトの名無しさん mailto:sage [2009/11/21(土) 17:57:38 ]
俺、キヤノンiP3100の付属CD印刷ソフト使ってるけど、微調整しなきゃズレるぞ?



145 名前:デフォルトの名無しさん mailto:sage [2009/11/21(土) 18:04:32 ]
>>144
俺もそれ使ってるけど微調整したことない

なんでクエスチョンマークをつけるんだ?

146 名前:デフォルトの名無しさん mailto:sage [2009/11/21(土) 18:06:08 ]
同じプリンタで同じように印刷すれば、そりゃ、位置はズレないだろうよ。
ズレるようなら、それは不良品。

そんな話をしてるんじゃなくて、違うプリンタで位置がズレるか、って話。
印字位置の調整機能を持ったソフトなんて、それほど山のようにあるだろ?

もう釣りはいいから、さっさと死ねよ。

147 名前:デフォルトの名無しさん mailto:sage [2009/11/21(土) 18:09:13 ]
>>145
微調整したことない?
妙だな、CDのメーカーによって変更しなきゃいけないのに
ああ、気にしてないってだけか

148 名前:デフォルトの名無しさん mailto:sage [2009/11/21(土) 18:11:53 ]
>>146
だから、プリンタの違いによる物理座標の違いを補正できないような糞設計には、
プリンタ側もウィンドウズ側もなってはいないの。

何度も言うように、.NETでも2.0以降はHardMarginX、HardMarginYプロパティが
ちゃんと容易されていて、必要ならこういう差異をちゃんと補正できるようになっているんだよ。
ウダウダ言ってないで実際コード書いてみれば分かるから。
プリンタぐらい持ってるでしょ。

149 名前:デフォルトの名無しさん mailto:sage [2009/11/21(土) 18:13:10 ]
同人でズレてるのは見かけるな。

150 名前:デフォルトの名無しさん mailto:sage [2009/11/21(土) 18:16:41 ]
フォントなんて3だか9だかの倍数じゃないと、メーカーによって大きさがバラバラだったよね。

151 名前:デフォルトの名無しさん mailto:sage [2009/11/21(土) 18:17:45 ]
なら、年賀状印刷ソフト会社にでも教えてやれよ。「調整機能は不要です!」って。

152 名前:デフォルトの名無しさん [2009/11/21(土) 18:27:13 ]
>>142
ですが、ご存知の方、教えてください…
(>_<)。

153 名前:デフォルトの名無しさん mailto:sage [2009/11/21(土) 18:29:39 ]
「同じように印刷すれば、どのプリンタでも印字位置はズレない」

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

俺はそんな検証したくないし、そもそも、位置ズレに悩まされたこともあるから、
調整機能を付けるよ。

154 名前:デフォルトの名無しさん mailto:sage [2009/11/21(土) 18:29:50 ]
>>152
やってみればいいじゃん。



155 名前:デフォルトの名無しさん mailto:sage [2009/11/21(土) 18:42:50 ]
万人が使えるUIなら当然微調整機能くらいは付けるわな

156 名前:デフォルトの名無しさん mailto:sage [2009/11/21(土) 18:43:42 ]
このどうでもいい議論いつまで続くんだろう

157 名前:デフォルトの名無しさん mailto:sage [2009/11/21(土) 18:44:37 ]
C#でグローバルIPを取得するにはどうすればいいですか?

158 名前:デフォルトの名無しさん mailto:sage [2009/11/21(土) 18:46:26 ]
>>157
ルータに問い合わせるかリモホを表示するサイトにアクセスして
その結果を利用するか

159 名前:デフォルトの名無しさん mailto:sage [2009/11/21(土) 18:46:52 ]
>>157
なんのグローバルIPをどんなアプリから取得したいんだよ?

LAN 内からルーターのグローバルIPが取りたい、ってことなら、UPnP か、
いったん外部にアクセスしてそっちからもらうか、だな。

160 名前:デフォルトの名無しさん mailto:sage [2009/11/21(土) 18:48:32 ]
>>158,159
ルータに問い合わせるって簡単に出来ますか?
リモホを返すページ作ってアクセスさせてみます

161 名前:デフォルトの名無しさん mailto:sage [2009/11/21(土) 18:52:13 ]
perl だけど、サンプルあったぞ。

hydro.energy.kyoto-u.ac.jp/~sekiyama/upnp/upnp-get-extaddr

162 名前:デフォルトの名無しさん mailto:sage [2009/11/21(土) 18:54:43 ]
あ、SSI使えたので流用しようかと思いましたが、
ありがとうございます。使わさせて頂きます。

163 名前:デフォルトの名無しさん mailto:sage [2009/11/21(土) 19:53:58 ]
デリゲートはメソッドをカプセル化する型

164 名前:デフォルトの名無しさん mailto:sage [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で使えないのですか?



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

ってことで、メール送信に関しては失敗したときの動作を必ず決めておくべき。
質問の答えだが、別にVistaだから使えないってことはない。
クライアントマシンの環境次第。例えばオレのマシンじゃ動かない。

166 名前:164 mailto:sage [2009/11/22(日) 01:34:04 ]
言葉足らずでした。
自分の場合、どの環境からも送信出来るようにと思い、
YahooやGoogleのフリーメールをsmtp経由で送信しているのですが、
それでもそんなものなんでしょうかね?

167 名前:デフォルトの名無しさん mailto:sage [2009/11/22(日) 01:47:03 ]
>>166
だから、クライアントマシンの環境次第だと言ってるじゃないか。察してくれよ。
ちなみに今時SMTPの標準のポートが空いてるプロバイダなんてまずねーよ。

168 名前:デフォルトの名無しさん [2009/11/22(日) 07:02:38 ]
FillRectangleメソッドではRectangleFを指定できるのに、
DrawRectangleメソッドではなぜRectangleFが指定できず、Rectangleしか指定できないのでしょうか?
floatのX,Y,Width,Heightを直接記述するとデバッグでエラーにならないのだから---
RectangleFが指定できたらいいのですが・・・・・できますでしょうか。
ご存知の方よろしくお願いいたします。

169 名前:デフォルトの名無しさん mailto:sage [2009/11/22(日) 09:05:49 ]
言われてMSDN見てみた。ホントに一貫性無いな・・・なんでだろ。
Graphics..::.DrawRectangle メソッド (Pen, Single, Single, Single, Single)
あるから出来ないわけないよね。
Graphics..::.DrawRectangles メソッド (Pen, array<RectangleF>[]()[])
に食わせるか、ラップ関数作って食わせるか。

170 名前:デフォルトの名無しさん mailto:sage [2009/11/22(日) 09:16:37 ]
>>164
とりあえずエラーの場所だけ書かれてもな

171 名前:デフォルトの名無しさん mailto:sage [2009/11/22(日) 11:07:51 ]
C#はCと違って文字列はアドレスはないの?

char *P="もじれつれつ";
みたいなことできない?

172 名前:デフォルトの名無しさん mailto:sage [2009/11/22(日) 11:09:56 ]
うん。

173 名前:デフォルトの名無しさん mailto:sage [2009/11/22(日) 11:13:21 ]
そうなんだ。不便だのぉ

174 名前:デフォルトの名無しさん mailto:sage [2009/11/22(日) 11:17:12 ]
ポインタ管理しなくていいから楽でいいじゃん



175 名前:デフォルトの名無しさん mailto:sage [2009/11/22(日) 11:21:37 ]
>>171
ポインタは無いけど、イテレータ(Enumerator)ならあるよ。
ただし、string自体がimmutableなので、読み取り専用になるけど

176 名前:デフォルトの名無しさん mailto:sage [2009/11/22(日) 11:21:39 ]
GCって何ですか

177 名前:デフォルトの名無しさん mailto:sage [2009/11/22(日) 11:22:43 ]
ググレ

178 名前:デフォルトの名無しさん mailto:sage [2009/11/22(日) 11:29:40 ]
エンスーな写真月刊誌

179 名前:デフォルトの名無しさん mailto:sage [2009/11/22(日) 12:10:22 ]
C#は、他プロセスにアタッチして、
そのプロセスが持つフォームのタイトルテキストを変更するような
プログラムを作成出来ますか?

180 名前:デフォルトの名無しさん mailto:sage [2009/11/22(日) 12:13:32 ]
うん
大抵はDllImport祭りになるけど

181 名前:デフォルトの名無しさん mailto:sage [2009/11/22(日) 12:14:59 ]
XPでVistaのガジェットのようにデスクトップに表示するアプリを作りたいのですが
どのようにすればいいのでしょうか

182 名前:デフォルトの名無しさん mailto:sage [2009/11/22(日) 12:30:24 ]
作ればいいと思うよ

183 名前:デフォルトの名無しさん mailto:sage [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が入る
ようなことがやりたいんだけど。

184 名前:デフォルトの名無しさん mailto:sage [2009/11/22(日) 13:05:34 ]
string や int の性的メソッドを調べてみるべし



185 名前:デフォルトの名無しさん mailto:sage [2009/11/22(日) 13:14:19 ]
>>183
Splitかければいい。というか、こんなのは基本だろ?
分割できなかったときは、たぶんこの場合はnullを返すよりは例外を出したほうがいいだろうな。

186 名前:デフォルトの名無しさん mailto:sage [2009/11/22(日) 13:16:33 ]
>>183
ttp://www.atmarkit.co.jp/fdotnet/dotnettips/317vbsplit/vbsplit.html

187 名前:デフォルトの名無しさん mailto:sage [2009/11/22(日) 13:26:37 ]
unsafeでポインタ使えるから色々試してみるのも面白いよ
splitより簡単にできることはないけど

188 名前:デフォルトの名無しさん mailto:sage [2009/11/22(日) 13:33:31 ]
実はただの分割じゃなく数式の解析が目的でしたとかなー

189 名前:デフォルトの名無しさん mailto:sage [2009/11/22(日) 13:39:55 ]
>>71で、「ListViewで垂直スクロールバーが出ているかどうか知りたいんですが」ってカキコしたんだが
スルーされてしまったけど、やはり無理?

190 名前:デフォルトの名無しさん mailto:sage [2009/11/22(日) 13:45:34 ]
それが人に物を聞く態度か?

191 名前:デフォルトの名無しさん mailto:sage [2009/11/22(日) 13:54:07 ]
教えてくれたらロリ画像だします・・・

192 名前:デフォルトの名無しさん mailto:sage [2009/11/22(日) 14:02:55 ]
そうしたら通報します・・・

193 名前:デフォルトの名無しさん mailto:sage [2009/11/22(日) 14:05:16 ]
>>189
ClientRectangleの外にItem(かSubItem)が存在するかどうかで判定するとか。
…泥臭いやり方だなw

194 名前:デフォルトの名無しさん mailto:sage [2009/11/22(日) 14:28:01 ]
>>193
どうもです。ListViewをOwnerDrawしている状態で、ヘッダーの長さを水平スクロールバーの出ない長さに調整したいのですが
縦スクロールバーを考慮いてその分ヘッダの長さを短くすると、バーが出ない時に白く残っちゃうんですよね
これを何とか消したいんですが他のアプローチ考えてみます



195 名前:デフォルトの名無しさん mailto:sage [2009/11/22(日) 14:31:55 ]
>>189
ListViewのカスタムコントロール作ったことあるが、そのときはGetScrollBarInfoでやった
表示/非表示を知りたかったわけじゃなく、縦横それぞれのスクロールバーの
自動表示をコントロールしたくて実装した副産物
初心者スレでAPI薦めるってどうよって思ったが、正直ほかの方法は知らない


196 名前:デフォルトの名無しさん mailto:sage [2009/11/22(日) 15:01:46 ]
>>195
ありがとうございます。一応サンプル有ったからこれからテストしてみようと思います
www.pinvoke.net/default.aspx/user32.getscrollbarinfo

197 名前:デフォルトの名無しさん [2009/11/22(日) 16:32:01 ]
PrintDocumentにて、商品明細書を作成しています。、A4縦の単表に100ほどの項目名称や金額をDrawStringメソッドやDrawRectangleメソッドを併用して記述しているのですが、プレビューが出るのに15秒かかってしまいます
(>_<;)。
項目数が多い場合、これくらい時間がかかるものなのでしょうか…。
皆様はどのような工夫をして、レスポンスを上げていますか?
よろしくお願いします。

198 名前:デフォルトの名無しさん mailto:sage [2009/11/22(日) 16:35:50 ]
どのようにしているからレスポンスが遅いのかが分かりません。

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

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



199 名前:デフォルトの名無しさん mailto:sage [2009/11/22(日) 16:37:15 ]
15秒は遅いな
単票なら座標計算に手間取る事は無いだろうから、データ取得あたりで時間掛かってないか見てみた方がいい

200 名前:デフォルトの名無しさん [2009/11/22(日) 17:05:30 ]
>>199
ありがとうございます。
データは、今は直接、DrawStringメソッド内に文字列を指定しています。

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

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

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

もし、何かコツなどのご意見がありましたらぜひ教えてくださいっ…!!

201 名前:デフォルトの名無しさん mailto:sage [2009/11/22(日) 17:11:35 ]
>>200
どちらかっつーと、データをレンダリングするのより
データを取ってくるのに時間が掛かってるんじゃないかと思うが。

コードの断片ごとに掛かってる時間を計測して、標準出力に出して眺めてごらんよ。

202 名前:デフォルトの名無しさん mailto:sage [2009/11/22(日) 17:11:39 ]
たかだか100項目程度のそれで15秒もかかるとは思えない

生で書き込んでるんだったら 適当に文字を置換して晒してみれば?
座標計算の所が気になると言えば気になるけど

203 名前:デフォルトの名無しさん mailto:sage [2009/11/22(日) 17:20:59 ]
PDFにしないからだよ

204 名前:デフォルトの名無しさん mailto:sage [2009/11/22(日) 17:23:46 ]
>>203 え?



205 名前:デフォルトの名無しさん mailto:sage [2009/11/22(日) 17:35:35 ]
>>200
半分の50項目だったら何秒?
半分コメントアウトして試してみて

206 名前:デフォルトの名無しさん mailto:sage [2009/11/22(日) 18:04:12 ]
ListViewの話ですが、スクロールバーの検出に成功してカラムの調整まで成功しました
が、水平スクロールバーの再描画というか消えるところまでは出来ませんでした
もう少し頑張ってみます

207 名前:デフォルトの名無しさん mailto:sage [2009/11/22(日) 18:41:52 ]
配列と列挙型ってどう違う?
いやまぁ違うところは違うけどさ。
列挙型でできることって配列使っても簡単に同じことできね?
列挙型の存在価値がわからんがなんのためにあるの?

208 名前:デフォルトの名無しさん mailto:sage [2009/11/22(日) 18:43:33 ]
全く違うだろう
というかどういうのをして同じことって言うの?

209 名前:デフォルトの名無しさん mailto:sage [2009/11/22(日) 18:46:00 ]
配列だと代入できんじゃん
わざわざラップクラス作る?
そのほうが無駄な手間だ

210 名前:デフォルトの名無しさん mailto:sage [2009/11/22(日) 18:50:29 ]
>>207, 209
?????
何を言ってるんだ???


211 名前:デフォルトの名無しさん mailto:sage [2009/11/22(日) 18:51:44 ]
>>209>>207に向けてるんだと思う。

212 名前:デフォルトの名無しさん mailto:sage [2009/11/22(日) 18:51:55 ]
もう一度教科書読むことを勧める


213 名前:デフォルトの名無しさん mailto:sage [2009/11/22(日) 18:53:36 ]
>>211
それはそれでイミフだ
>>207のイミフな発言をどう解釈して>>209の回答になったのかも非常に気になる

214 名前:デフォルトの名無しさん mailto:sage [2009/11/22(日) 18:53:38 ]
>>206
194を読まずにレスしたからGetScrollBarInfoっていったけど
本来の目的は横スクロールバーの表示抑制なんじゃないの?
そうであるならイベントハンドラでカラムサイズを調整すれば済むと思うけどダメだった?



215 名前:デフォルトの名無しさん mailto:sage [2009/11/22(日) 18:55:58 ]
>>207
列挙型で出来ることを配列で簡単に実現してるケースを知りたいわ
enum Color { Red, Blue, Green };

String[] color = {"Red", "Blue", "Green"};

とでも思ってるんだろうか・・・

216 名前:デフォルトの名無しさん mailto:sage [2009/11/22(日) 18:56:05 ]
string[] 時間={"あさ","ひる","よる"}
enum 時間 {あさ,ひる,よる}

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

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

これは何がどうちがうの?

217 名前:デフォルトの名無しさん mailto:sage [2009/11/22(日) 18:56:40 ]
>>214
カラムサイズ調整までは何の問題もないけど、リストにロード直後だと再描画してくれませんでした
カラム調整は確認したから大丈夫ですよ

218 名前:デフォルトの名無しさん mailto:sage [2009/11/22(日) 19:00:04 ]
>>216
なんで自分で調べないの?

219 名前:デフォルトの名無しさん mailto:sage [2009/11/22(日) 19:00:11 ]
>>216
列挙体を関数の引数にした場合、列挙体以外の値以外入ってくる余地無くなるよね
これだけでも全然違うと理解できないかな?

220 名前:デフォルトの名無しさん mailto:sage [2009/11/22(日) 19:01:56 ]
>>216
ぜんぜん違うだろ。

時間[1]っての見てだれが"ひる"だってわかんだよ。
それに Now に "まよなか" ってまちがって入れちゃった場合だれが気付いてくれるんだ?
もし時間の種類に "ひづけへんこうせんをこえるまではよるのつもりでいます" なんて長いパターン入れたら
比較に時間かかるわ無駄なメモリ使うわでもったいないよな。


221 名前:デフォルトの名無しさん mailto:sage [2009/11/22(日) 19:05:30 ]
>>220
突っ込み所はそこなのか?
>>216は上ではNowに時間[1]ってのを代入してて、下じゃ比較してるだけなんだぞ

222 名前:デフォルトの名無しさん mailto:sage [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 とかが入っちゃって誤動作するのをコンパイルする段階で
見付けてくれるのよ。

223 名前:デフォルトの名無しさん mailto:sage [2009/11/22(日) 19:11:46 ]
お前ら釣りに優しいなw
enum使ってくる時点で初めてではないだろ


224 名前:デフォルトの名無しさん mailto:sage [2009/11/22(日) 19:15:19 ]
経験者があの質問するのは釣りでも無理だろ・・・



225 名前:デフォルトの名無しさん mailto:sage [2009/11/22(日) 19:17:23 ]
時間.ひる == "ひる" だと思ってるのか?もしかすると。

226 名前:デフォルトの名無しさん mailto:sage [2009/11/22(日) 19:20:27 ]
>>205
レスの流れからして、読み込み済みデータで描画して何秒なら分かるが。

227 名前:デフォルトの名無しさん mailto:sage [2009/11/22(日) 19:21:06 ]
>>217
いや、なんというかアプローチの仕方が違うんじゃないかなって思ってさ
最初は縦スクロールの表示判定だったけど、その真意は横いっぱいに
表示したカラムのせいでアイテム数が増えて縦スクロールが出ると
結果的に横スクロールバーも出るっていう話ではないの?
そうであるなら、例えば縦スクロールバーのみ出しっぱなしにすれば
処理はシンプルになると思うし、縦スクロールバー隠しておくつもりなら
横スクロールバーは出ないようにしてしまったほうが、カラム調節で
チラツキの押さえ込みと格闘するより楽なんじゃないかなぁと・・・

228 名前:デフォルトの名無しさん mailto:sage [2009/11/22(日) 19:26:39 ]
enumすら説明出来ないクズスレ

229 名前:デフォルトの名無しさん mailto:sage [2009/11/22(日) 19:29:37 ]
>>226
半分の印刷で、時間が半分になるのか1/4になるのか、まさかの1/9になるのか
と言うことの確認。つまり二重ループ三重ループの疑い。

230 名前:デフォルトの名無しさん mailto:sage [2009/11/22(日) 19:35:20 ]
1/9ってなんだオレ…三重なら1/8だorz

231 名前:デフォルトの名無しさん mailto:sage [2009/11/22(日) 19:56:13 ]
なんでいちいちちょっとしたことするだけなのに
Mainを意味のないクラスで囲まなければならないんだ!不便!

232 名前:デフォルトの名無しさん [2009/11/22(日) 19:58:46 ]
>>205
50項目のときは5秒でした。

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

項目が増えれば増えるほど、倍以上に遅くなっています。
FontなどのオブジェクトのDisposeが足りないのかなと思って直しましたが、結果はやはり15秒弱です。

233 名前:デフォルトの名無しさん mailto:sage [2009/11/22(日) 19:59:52 ]
Font?
一項目ごとにフォント読み込んだりしてない?

234 名前:デフォルトの名無しさん mailto:sage [2009/11/22(日) 20:06:57 ]
>>231
そこまで考えてるのになんで
ちょっとしたことするだけなのに Main なんて意味のないメソッドで囲まなければならないんだ!不便!
まで発想が飛ばないのかねぇ。



235 名前:デフォルトの名無しさん mailto:sage [2009/11/22(日) 20:08:29 ]
どう見ても>>231はわかってる奴の発想だな
>>209にはとても及ばない

236 名前:デフォルトの名無しさん mailto:sage [2009/11/22(日) 20:16:45 ]
>>181

237 名前:デフォルトの名無しさん mailto:sage [2009/11/22(日) 20:24:43 ]
>>229
え、多重ループの疑いがあったとして項目数減らしても計算量は線形でしか減らないキガス・・・
ああ、そもそもルーチンを何回も何回も呼び出している疑いか。あるね、そんな事。

238 名前:デフォルトの名無しさん mailto:sage [2009/11/22(日) 20:25:44 ]
>>227
用途は趣味で作っているメディアプレーヤーだから、1行の時もあれば100行近い場合もあるんですよ
で、曲名のカラムを調整して縦スクロールバーが無い時はいっぱいまでカラムを延ばして
バーが出たらバーの分だけ曲名を縮める。
そうしないと縦スクロールバーが無いとOwnerDrawしたカラムヘッダーの最後が真っ白けになっちまうし、
逆に縦スクロールバーが出ている時に伸ばしたら横スクロールバーが出るのがちょっとウザイ
現状、調整後に横スクロールバーが残っても、縦または横にスクロールした瞬間に消えるんですけどね

239 名前:デフォルトの名無しさん mailto:sage [2009/11/22(日) 20:29:26 ]
一回5secとして三回回って15sec。項目半分に減らして2.5secとして三回回って7.5sec。
減らした比率でしか計算量は減らないから、237は勘違い。

240 名前:デフォルトの名無しさん mailto:sage [2009/11/22(日) 20:30:52 ]
>>235
しかしながらC++とかに慣れてるとは・・・とてもじゃないが思いにくい
不便とかを超えてもう当たり前になっている所だからぶっちゃけどうでもいい
そして、そんな一か所がなんだってんだ もっといろいろあるだろう orz

241 名前:デフォルトの名無しさん mailto:sage [2009/11/22(日) 20:34:40 ]
>>232
1/3だと微妙だけど二重ループの可能性は高いな
ありそうなのは、
項目1つ目の場合は1つ目を描画し、2つ目の時は1つ目と2つ目を描画し…のパターンと
項目1つ描画するつもりが全項目描画している関数を呼び出している…のパターン

242 名前:デフォルトの名無しさん mailto:sage [2009/11/22(日) 20:36:07 ]
>>232
disposeしたところでGCに回収してもらわないと意味がない
そんで強制的に回収させてたら余計に遅くなるんではないかと・・・
メモリがないわけではないんなら

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

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

フォントはでいるだけ使いまわしてる?
(例えば明細用を最初に定義して使いまわす)

243 名前:デフォルトの名無しさん mailto:sage [2009/11/22(日) 21:04:27 ]
描画するデータをその都度どこかから持ってきてるとかかな

244 名前:デフォルトの名無しさん mailto:sage [2009/11/22(日) 21:09:01 ]
スタティック変数使って、何回通ったか数えてみてから考えても良いかも



245 名前:241 mailto:sage [2009/11/22(日) 21:12:26 ]
オレ算数できてなかったorz
1/3の数の描画で1/3の時間だったら、1項目の描画の途中で変に遅い部分があると言うだけだな

246 名前:デフォルトの名無しさん mailto:sage [2009/11/22(日) 21:16:24 ]
>>238
それなら、縦スクロールバーは常に出しっぱなしにして、
横スクロールバーは常に非表示にしておけば一番スッキリするんじゃないの?
少なくともカラムの幅に関係なく横スクロールバーは出ないようにしてしまえば
かなり問題は簡単になると思うんだがなぁ

247 名前:デフォルトの名無しさん mailto:sage [2009/11/22(日) 21:16:57 ]
>>232
さっきから埒が明かないな。ソースコードさらしたほうが早いんじゃね?
おそらく相当ひどい実装になってるんじゃないかと予想。

248 名前:デフォルトの名無しさん mailto:sage [2009/11/22(日) 21:55:21 ]
>>246
どうもListViewでは、スクロールバー自動と無ししか選択できないみたいです
ShowScrollBarをテストしてみたんですが、無効化されるようですね
他にやり方有りましたら教えていただけませんか?

249 名前:デフォルトの名無しさん [2009/11/22(日) 22:01:17 ]
FontオブジェクトやRectangleオブジェクトを生成するのって
そんなに負荷がかかるものなのですか?
明朝体やゴシックが入り混じっているときも、
変更があるときだけ生成し直すのが良策なのかな。

250 名前:デフォルトの名無しさん mailto:sage [2009/11/22(日) 22:03:28 ]
Fontはアンマネージリソース抱えてるので特に生成が重い類
Rectangleは構造体だからほとんどノーコストで作れる

251 名前:デフォルトの名無しさん [2009/11/22(日) 22:10:22 ]
>>250
アンマネージリソース…?
はじめて聞いた。
クグルとするか
(>_<;)。

252 名前:デフォルトの名無しさん mailto:sage [2009/11/22(日) 22:20:52 ]
Fontを150回作るだけで何秒もかかるものでもないんだから、気にするだけ無意味

253 名前:デフォルトの名無しさん mailto:sage [2009/11/22(日) 22:22:20 ]
原因でないのは間違いないが普通は避ける

254 名前:デフォルトの名無しさん mailto:sage [2009/11/22(日) 22:31:43 ]
>>232
一度FillRectangle、DrawRectangle、DrawStringを全部外して時間を計測してみて
それで1,2秒になるならそのどれが遅いかをどれか一つだけ描画するようにして試して
さっぱり速くならないなら、描画処理以前の問題と言うことで。



255 名前:デフォルトの名無しさん mailto:sage [2009/11/22(日) 22:53:47 ]
問題の切り分け方から説明しないといけないのか
言語以前の問題では?

256 名前:デフォルトの名無しさん mailto:sage [2009/11/22(日) 22:56:53 ]
>>181

257 名前:デフォルトの名無しさん mailto:sage [2009/11/22(日) 23:02:23 ]
>>256
あれ、単なる非矩形ウィンドウだろ。

258 名前:デフォルトの名無しさん mailto:sage [2009/11/22(日) 23:06:31 ]
form.FormBorderStyle = FormBorderStyle.None;
form.ShowInTaskbar = false;
はい終わり

259 名前:デフォルトの名無しさん mailto:sage [2009/11/22(日) 23:09:35 ]
>>248
ShowScrollBarするという基本的な方針は間違ってない
俺はこんな感じで制御してる(thisは独自のスクロールバークラス)
どうしても分からなければメアド晒せばソースあげるよ
protected void ShowScrollBar(bool show)
{
 if (show != this.Visible){NativeMethods.ShowScrollBar(this.Handle, this.Orientation, show);}
 if (show == true)
 {
  SCROLLINFO info = new SCROLLINFO();
  info.cbSize = Marshal.SizeOf(info);
  info.fMask = ScrollInfoFlags.RANGE | ScrollInfoFlags.PAGE;
  NativeMethods.GetScrollInfo(this.Handle, this.Orientation, ref info);
  this.Enabled = (info.nMax >= info.nPage);
 }
}

260 名前:デフォルトの名無しさん mailto:sage [2009/11/22(日) 23:27:12 ]
>>255
まぁ初心者スレだから・・・・

荒れているC#相談室では叩かれるかもしれんがw

261 名前:デフォルトの名無しさん mailto:sage [2009/11/22(日) 23:31:29 ]
>>258
それでWin+Dの時はどうなるのか分かる?w

262 名前:デフォルトの名無しさん mailto:sage [2009/11/22(日) 23:39:45 ]
そんな後出し言われてもなぁ・・・。

263 名前:デフォルトの名無しさん mailto:sage [2009/11/22(日) 23:44:25 ]
いやガジェットのようにって書いたじゃん・・・

264 名前:デフォルトの名無しさん mailto:sage [2009/11/22(日) 23:58:18 ]
でも、Win+D のときの話なんてひとつも書いてないじゃん。

ガジェットのように、なら、JavaScript で実装できること、とかも条件になんの?




265 名前:デフォルトの名無しさん mailto:sage [2009/11/23(月) 00:08:19 ]
火病った
きもちわるい

266 名前:デフォルトの名無しさん mailto:sage [2009/11/23(月) 00:11:07 ]
>>264
C#スレでJavaScriptとは?
Vistaは使ってなくて、お聞きしたいのですがガジェットはWin+Dでデスクトップから見えなくなる、
つまりWindowStateはMinimizedになるのですか?


267 名前:デフォルトの名無しさん mailto:sage [2009/11/23(月) 00:18:11 ]
>>264
いい加減にしろオマエの知識じゃ無理

268 名前:デフォルトの名無しさん mailto:sage [2009/11/23(月) 00:37:34 ]
ネイティブC++のDLLを作成→C++/CLIでラップ→C#で参照しています。
ネイティブDLLに含まれる列挙型AをC#で変数宣言しようとすると、
"'AI.Schedule' はアクセスできない保護レベルになっています。"とエラーになります。
これを何とかC#上で利用できるようにする方法はないでしょうか?

269 名前:デフォルトの名無しさん mailto:sage [2009/11/23(月) 00:40:21 ]
そのAをどのように宣言しているのか・・・

270 名前:デフォルトの名無しさん mailto:sage [2009/11/23(月) 00:47:16 ]
ネイティブの型はC#では扱えない

271 名前:デフォルトの名無しさん mailto:sage [2009/11/23(月) 01:00:21 ]
>269
enum A{A1,A2,A3...}; このようなかんじです。

>270
やっぱりそうなりますね。C++/CLIで対応する列挙型を宣言し、
キャストして使うことにします。ありがとうございました。

272 名前:デフォルトの名無しさん mailto:sage [2009/11/23(月) 01:34:30 ]
aの文字列の中に、bの文字列が何回入っているか調べて
intで回数を返すメソッドはどうやって作るんですか?

273 名前:デフォルトの名無しさん mailto:sage [2009/11/23(月) 02:04:49 ]
string A = "こんにちはああこんにちはあははこんにちは" ;
string[] kugiri = { "こんにちは" };
int i = (A.Split(kugiri, StringSplitOptions.None).Length-1); //3

一例

274 名前:デフォルトの名無しさん mailto:sage [2009/11/23(月) 02:31:56 ]
a = "abaababa"
b = "aba"

の結果は普通に3でいいのか?



275 名前:デフォルトの名無しさん mailto:sage [2009/11/23(月) 02:36:20 ]
>>273
あー、配列で区切って長さを取得してるんですね。
とても参考になりました。ありがとうございます。
>>274
そうですね。

276 名前:デフォルトの名無しさん mailto:sage [2009/11/23(月) 08:40:20 ]
>>272の見てて思いだしたけど
もしString.IndexOf()使って処理する場合は気をつけた方がいいかもね。

blogs.wankuma.com/naka/archive/2009/11/11/182901.aspx
d.hatena.ne.jp/siokoshou/20091112/p1

277 名前:デフォルトの名無しさん mailto:sage [2009/11/23(月) 08:45:58 ]
>>276
こっちのが良い
d.hatena.ne.jp/siokoshou/20091111#p1

278 名前:デフォルトの名無しさん mailto:sage [2009/11/23(月) 08:49:45 ]
>>275
>>273のやり方では>>274は2になるのに気づいているか?

279 名前:デフォルトの名無しさん mailto:sage [2009/11/23(月) 10:30:19 ]
FxCop使ってないと絶対気付かんわな

280 名前:デフォルトの名無しさん mailto:sage [2009/11/23(月) 10:58:45 ]
>>277
デフォルトのIndexOfはなんであんな変な結果になるんだろな


281 名前:デフォルトの名無しさん mailto:sage [2009/11/23(月) 11:05:30 ]
String.ToLowerとかもカレントカルチャで動くから、そうおかしな琴ではないだろう

282 名前:デフォルトの名無しさん mailto:sage [2009/11/23(月) 11:08:38 ]
MS自身がおかしな挙動だと思ってるからFxCopで警告出たりするんだろう

283 名前:デフォルトの名無しさん mailto:sage [2009/11/23(月) 11:09:00 ]
Console.WriteLine( "AA".IndexOf("〇A") ); // 0
Console.WriteLine( "〇A〇A".IndexOf("AA") ); // 1

これは「〇」がなかったことにされるってことなのかね?
やっぱりよくわかんない・・・

284 名前:デフォルトの名無しさん mailto:sage [2009/11/23(月) 11:11:27 ]
うおーうおー
なんで同じことをするのにいくつもやり方があるんだよおおおおおおおおお



285 名前:デフォルトの名無しさん mailto:sage [2009/11/23(月) 11:13:53 ]
>>283
それはUnicodeの規格がおかしいのを忠実に実装したらそうなってるだけ

286 名前:デフォルトの名無しさん mailto:sage [2009/11/23(月) 11:15:06 ]
>>284
それぞれに顕著な差(状況毎の性能差とか)があればいいんだけど
そんなでもないときは叫びたくもなるわなw


287 名前:デフォルトの名無しさん mailto:sage [2009/11/23(月) 11:15:57 ]
>>285
なるほど。実装がおかしいんじゃなくて規格がおかしいのか。
ありがとう!

288 名前:デフォルトの名無しさん mailto:sage [2009/11/23(月) 11:21:15 ]
これって最初からそろってるものが高性能すぎて自分で文法を覚えたりクラス作る必要ないね。
最初からそろってるフォーム等のクラスや構造体の使い方覚えるだけで十分そうだ。

289 名前:デフォルトの名無しさん mailto:sage [2009/11/23(月) 11:27:14 ]
>>288
いや文法は覚えないと書けないだろw

あと、ポトペタで書く分にはそれでいいかもしれないけど
ちょっと何かしようと思うとすぐクラス書きたくなると思うよ。

290 名前:デフォルトの名無しさん mailto:sage [2009/11/23(月) 11:37:00 ]
>>288
そうでもあるし、そうでもない。
またフォームのような基礎的な部品も時々アーキテクチャーが変わったりするから
(System.Windows.Forms→Windows Presentation Foundation)
いつまでも同じ部品を使い続ける、という方針はあまりお勧めできない。

クラスにせよメソッドにせよコードの仕切りに過ぎないので、
分ける必要のないコード量なら分けなくても別にいいし、
分けるべきだと判断すれば分ければいい。

291 名前:デフォルトの名無しさん mailto:sage [2009/11/23(月) 11:48:10 ]
>>288
やればわかるけどそれで出来ることには限界があるよ

もっとも、教科書に載ってるようなアルゴリズムの実装なんかは
ほとんどしなくてよくなったとは思う

292 名前:デフォルトの名無しさん mailto:sage [2009/11/23(月) 11:48:45 ]
ローカル変数とグローバル変数の中間みたいなのないの?

class Test{
private int x;

public void func1(){
}

public void func2(){
}

public void func3(){
}
}
func1とfunc2でxは共有したいけど
func3などそれ以外の部分でxを書き換えられなくない
みたいな。

293 名前:デフォルトの名無しさん mailto:sage [2009/11/23(月) 11:50:47 ]
そんなものはありません
func3を別のクラスに移してください

294 名前:デフォルトの名無しさん mailto:sage [2009/11/23(月) 11:50:51 ]
同一クラスの中で把握しきれないようなのならクラスの分割を考えた方がいいんじゃないか



295 名前:デフォルトの名無しさん mailto:sage [2009/11/23(月) 11:53:10 ]
>>292
なんでわけたいのかとか設計によるけど

■継承
class Test{
private int x;
public void func1(){}
....
}

class Test2 : Test {
public void func3(){}
}

とか

■移譲
class Test2 {
Test test = new Test();
public void func1() { test.func1();}
...
public void func3(){}
}

実装を見せたく無い場合は普通はクラスをわける設計になるはず

296 名前:デフォルトの名無しさん mailto:sage [2009/11/23(月) 11:55:05 ]
×移譲
◯委譲
でした・・・

297 名前:デフォルトの名無しさん mailto:sage [2009/11/23(月) 11:58:07 ]
基本的にはない。クロージャ使うとか、そういうテクニックはあるけど。

298 名前:デフォルトの名無しさん mailto:sage [2009/11/23(月) 12:01:37 ]
こういうことか
class Test {
public readonly Action func1, func2;
public Test() {
int x;
func1 = () => { Console.WriteLine(x); };
func2 = () => { MessageBox.Show(x.ToString()); };
}

public void func3(){ /*xは見えない*/ }
}
「こういうこともできる」というだけに留めておいてくれ
絶対使うな

299 名前:デフォルトの名無しさん mailto:sage [2009/11/23(月) 12:12:32 ]
委譲の変形パターンだな

300 名前:デフォルトの名無しさん mailto:sage [2009/11/23(月) 12:42:21 ]
それ int x; 大丈夫なのか?と思ったら、ラムダ式における変数のスコープって
いう新しい規則で保証されてるのか・・・やっぱラムダ式は敵だ。

301 名前:デフォルトの名無しさん mailto:sage [2009/11/23(月) 12:48:25 ]
クロージャはその場限りのコールバックとして使うだけならきちんと理解して使えば全く問題ない
>>298みたいにローカル変数の寿命が延びるような使い方はあんまりよろしくない

302 名前:デフォルトの名無しさん mailto:sage [2009/11/23(月) 13:25:33 ]
オブジェクトが生存する限り生存するという、インスタンス変数と
たいして変わんないものなんだけどなぁ。

303 名前:デフォルトの名無しさん mailto:sage [2009/11/23(月) 13:32:23 ]
スタックがそのまんま残るとでも思ってるんじゃね

304 名前:デフォルトの名無しさん mailto:sage [2009/11/23(月) 13:33:14 ]
クロージャは、俺にとってはあれば便利だけど、なけりゃないで困らない、
ってレベルだなぁ。



305 名前:デフォルトの名無しさん mailto:sage [2009/11/23(月) 15:01:57 ]
スレッド活用しようとすると無ければ困る。


306 名前:デフォルトの名無しさん mailto:sage [2009/11/23(月) 15:25:11 ]
>>259
色々ありがとうございました。原因がわかりましたので仮の修正で一応動き出しました
原因はItem追加をDrawItemで検出していたんですが、この時はBeginUpdateと
EndUpdateの間である為、数値的にはカラムもクライアント領域の大きさも変更されているのに
描画が更新されないことでした。仮の処理ですがタイマー起動してEndUpdate後にカラムを弄ると
水平スクロールバーを消すことが出来ました

まだ、不具合があるから色々煮詰めないと行けないけど何とかなりそうです

307 名前:デフォルトの名無しさん mailto:sage [2009/11/23(月) 15:33:40 ]
研究室の先輩から引き継いだC#のプログラムがあるんですが、当方はQtでC++しか触ったことがありません。
それでこのプログラムを簡単にC++に変換できるのでしょうか?
それとも諦めてC#を覚えた方がいいでしょうか?

308 名前:デフォルトの名無しさん mailto:sage [2009/11/23(月) 15:34:42 ]
あきらめた方がいい。

309 名前:デフォルトの名無しさん mailto:sage [2009/11/23(月) 15:36:03 ]
C++/QtからC#/WinForms or WPF・・・

簡単にはいかないけど
プログラムが綺麗に作られてるならクラス設計とかはそのまんま引っ越せるとは思う。

310 名前:デフォルトの名無しさん mailto:sage [2009/11/23(月) 15:36:52 ]
そういえばQt#ってあったな
今回の話とは一切関係ないだろうけど

311 名前:デフォルトの名無しさん mailto:sage [2009/11/23(月) 15:36:59 ]
研究室ならどうせ中身はほとんどベターCだろ
GUI周りだけちょっと練習すれば十分

312 名前:デフォルトの名無しさん mailto:sage [2009/11/23(月) 15:59:39 ]
まて、本人がC++の人でソースはC#だ。


313 名前:デフォルトの名無しさん mailto:sage [2009/11/23(月) 16:01:05 ]
実際、C++はアセンブラ扱いだから、C#のほうが楽だよ。

314 名前:デフォルトの名無しさん mailto:sage [2009/11/23(月) 16:02:26 ]
何を言っているんだ



315 名前:デフォルトの名無しさん mailto:sage [2009/11/23(月) 16:28:56 ]
>>306
よかったね
質問と関係ないけど、タイマー使うよりメッセージ投げた方がスッキリするよ
const int LVEX_COLUMNRESIZE = WM_APP + 1; // 独自のメッセージ定義
PostMessage(this.Handle, LVEX_COLUMNRESIZE, 0, 0);

316 名前:デフォルトの名無しさん mailto:sage [2009/11/23(月) 16:34:13 ]
・研究室の先輩から引き継いだC#のプログラム
・当方はQtでC++しか触ったことがない
という状況で
A.簡単にC++に変換できるのでしょうか?
B.それとも諦めてC#を覚えた方がいいでしょうか?
という質問に、
C#を覚えた方が楽と薦めてみたんだが・・・どっか勘違いしてるかな?

317 名前:デフォルトの名無しさん mailto:sage [2009/11/23(月) 16:35:19 ]
C++がアセンブラ扱いってのが問題発言だろ。


318 名前:デフォルトの名無しさん mailto:sage [2009/11/23(月) 16:36:56 ]
C++やっててJavaもやったことあるならすんなりいけるけど
C++だけだとちょっとはまるかもね。
移植するにしてもC#の知識は必要になるから、そのままC#覚えたほうが早そう。

319 名前:デフォルトの名無しさん [2009/11/23(月) 16:39:36 ]
覚えたほうが早いに1票

320 名前:デフォルトの名無しさん mailto:sage [2009/11/23(月) 16:47:30 ]
>>315
WinForm的にはBeginInvokeだろう

321 名前:デフォルトの名無しさん mailto:sage [2009/11/23(月) 16:58:10 ]
クラスの設計がよくわからなくなってきたので助けてください。

■前提
複数のミニブログ(例えばTwitterとはてなハイク)のタイムラインを一つのリストにまとめて表示する
プログラムを作るとします。
基本的な機能は一緒なので、最大公約数的な抽象クラスを作り、画面の方でも抽象クラスで提供
されているプロパティに従って最大公約数的な画面表示を行なっていました。

例)
名前 - メッセージ - 日付 - システム
-----------------------------
太郎 - ほげほげ - 12 days ago in Twitter
次郎 - ふがふが - 30 days ago in HatenaHaiku

■質問
ここで、各ミニブログ特有の機能も画面上に反映させたくなった場合、画面側の方で
例えば if(message is TwitterMessage)... else if (message is HatenaHaikuMessage)みたいに
どのサブクラスのインスタンスか一々調べて処理を書くしかないのでしょうか?

例) HatenaHaiku の場合、キーワードも表示されるようにする
名前 - メッセージ - 日付 - システム
-----------------------------
太郎 - ほげほげ - 12 days ago in Twitter
次郎 - [独り言] ふがふが - 30 days ago in HatenaHaiku


322 名前:デフォルトの名無しさん mailto:sage [2009/11/23(月) 17:03:10 ]
制御のモデルを変える。
メッセージに描画させればいい。

323 名前:デフォルトの名無しさん mailto:sage [2009/11/23(月) 17:03:30 ]
固有メッセージ追加とかカスタマイズ用のメソッドとかインターフェースとか
そういうのを追加する。
細かいところのやり方はいろいろだけど。

324 名前:デフォルトの名無しさん mailto:sage [2009/11/23(月) 17:04:46 ]
それが一般的な機能なら、クラス側に機能(インターフェイス)を持たせちゃうな。
で。Twitter 用のクラスでは何もしない、と。

特殊な機能なら、UI 側での判定もありじゃない?



325 名前:デフォルトの名無しさん mailto:sage [2009/11/23(月) 17:07:56 ]
>>320
同期処理かつメインスレッドが所有するListViewを処理するのに
わざわざ非同期のBeginInvokeはねえよw
EndUpdateまで待つためにlockかWaitHandleまで必要になるぞ

326 名前:デフォルトの名無しさん mailto:sage [2009/11/23(月) 17:09:30 ]
>>321
Decorator パターンで考える。
Decorate する必要がない時は空の ConcreteDacorator で代用。

327 名前:デフォルトの名無しさん mailto:sage [2009/11/23(月) 17:09:39 ]
>>322
なるほど、各メッセージ自身が自分自身の描画方法を知っている形にするってわけですね。
そういった場合でモデルと画面描画を分離させたい場合は間にもう1クラスぐらいかませるようなやり方で
良いでしょうか?

[データモデル]
MessageModel
+ Name : string
+ Message : string

TwitterMessageModel → MessageModel
+ HashCode : string
HatenaHaikuMessageModel → MessageModel
+ Keyword : string

[画面表示用のコンポーネント]
MessageComponent
+ Draw() : bool

TwitterMessageComponent → MessageComponent
- model : TwitterMessageComponent
HatenaHaikuComponent → MessageComponent
- model : HatenaHaikuMessageComponent


328 名前:デフォルトの名無しさん mailto:sage [2009/11/23(月) 17:13:32 ]
そういうクラスを考えるのは楽しいんだけどさ。
あんまり役に立たないよね。

329 名前:307 mailto:sage [2009/11/23(月) 17:13:43 ]
とりあえずC#をボチボチ勉強します。

330 名前:デフォルトの名無しさん mailto:sage [2009/11/23(月) 17:15:23 ]
>>326
すまん、空の ConcreteDacorator で代用する必要はないか。
ConcreteComponent をそのまま使えばいいんだ。

・・・ってもう解決しそうだから、どうでもいいか

331 名前:デフォルトの名無しさん mailto:sage [2009/11/23(月) 17:15:31 ]
>>323
各システム固有の何かをする、ってメソッドを追加する、みたいな解釈でしょうか?
なるほど・・・

>>324
抽象クラスにメソッドを持たせるということですよね。
この場合、特殊な機能が少ないうちは良さそうなんですが、
増えていくと抽象クラスが煩雑になりそうで・・・
#そもそもそんなに特殊機能がばらばらなのを抽象化して良いのか?って問題もあるけど。

>>326
Decoratorパターンを良く理解していないので調べてみます。
デザインパターンちゃんと勉強しないといけないなぁ・・・


332 名前:デフォルトの名無しさん mailto:sage [2009/11/23(月) 17:16:36 ]
interface IExtraMessageField
{
public ExtraMessageField Type { get; } // {Name,Message,Date,System}
public string Message { get; }
}

class TwitterMessage{
}

class HatenaHaikuMessage: IExtraMessageField
{
public ExtraMessageField { get{ return ExtraMessageField.Message; } }
public string Message { get{ return ''[' +Keyword+ ']; } }
}

333 名前:デフォルトの名無しさん mailto:sage [2009/11/23(月) 17:16:53 ]
>>328
switch とか if 連打の方がわかりやすかったり工数少なかったりするよなw


334 名前:デフォルトの名無しさん mailto:sage [2009/11/23(月) 17:19:50 ]
初心者程抽象化したがるからなぁ



335 名前:デフォルトの名無しさん mailto:sage [2009/11/23(月) 17:19:58 ]
そこまで拡張する必要性に迫られたことないし

336 名前:デフォルトの名無しさん mailto:sage [2009/11/23(月) 17:21:09 ]
この場合の正しい解は、画面側で"is"使ってインスタンス判定、固有の処理をするだよ。


337 名前:デフォルトの名無しさん mailto:sage [2009/11/23(月) 17:21:59 ]
仕事がありません
誰か下さい

338 名前:デフォルトの名無しさん mailto:sage [2009/11/23(月) 17:24:22 ]
俺の仕事をあげようか
給料は俺がもらっとくけど

339 名前:デフォルトの名無しさん mailto:sage [2009/11/23(月) 17:26:25 ]
うーん、何が正しいんだかよくわからなくなってきました・・・
設計難しいなぁ。

泥臭く書くだけならいくらでもできるんだけど
綺麗に書くとなるとさーっぱりだ・・・

こういう場合に >>336 みたいに「こういう場合はこれが正しい」って断言出来るようになるには
どんだけ経験つめばいいんでしょうね。

340 名前:デフォルトの名無しさん mailto:sage [2009/11/23(月) 17:27:58 ]
断言したいだけなら、今すぐにもできるだろw

341 名前:デフォルトの名無しさん mailto:sage [2009/11/23(月) 17:32:01 ]
>>336 は馬鹿すぎだろいくらなんでも。
オブジェクト指向言語使ってる意味ないよ。
Twitterがverupして機能増えた・・・なんて時に改修場所がいたるところにちらばるでしょ、それじゃ。

ちゅーことで断言するやつは疑ってかかった方がいいんじゃないかと思う。






[ 新着レスの取得/表示 (agate) ] / [ 携帯版 ]

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

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