09/11/18 23:56:27
このスレッドは
「どんなにくだらないC#プログラミングに関する発言でも誰かが優しくレスをしてくれるスレッド」です。
ほかのスレッドでは恐ろしくて書き込めないような低レベル、もしくは質問者自身なんだか意味がよく分からない質問など、
勇気をもって書き込んでください。
内容に応じて、他スレ・他板へ行くことを勧められる、あるいは誘導される場合がありますがご了承下さい。
>>980を踏んだ人は新スレを建てて下さい。
>>980が無理な場合、話し合って新スレを建てる人を決めて下さい。
前スレ
ふらっとC#,C♯,C#(初心者用) Part47
スレリンク(tech板)
2:デフォルトの名無しさん
09/11/18 23:56:43
-----関連スレ
C#, C♯, C#相談室 Part55
スレリンク(tech板)
WPF(XAML,XBAP,.NET3.5)GUIプログラミング Part4
スレリンク(tech板)
----参考サイト
URLリンク(www.google.co.jp)
URLリンク(msdn.microsoft.com)
URLリンク(homepage3.nifty.com)
URLリンク(www.atmarkit.co.jp)
URLリンク(dobon.net)
URLリンク(jeanne.wankuma.com)
URLリンク(www.labasp.net)
3:デフォルトの名無しさん
09/11/19 00:10:27
zip解凍を下記コードでしているのですが、
ClickOnesで発行しインストールしたPCの中で一台だけ例外で動作しません。
VisualStudioから「デバックを開始」だと正常に動きます。
動かないOSはXPです。(他のXP機やVista・7は動作します。)
Shell32は参照設定してローカルコピーもしてます。
try {
Shell32.ShellClass s32 = new Shell32.ShellClass();
Shell32.Folder zip = s32.NameSpace(filename);
Shell32.Folder zipex = s32.NameSpace(dir);
Shell32.FolderItems zipItem = zip.Items();
zipex.CopyHere(zipItem, 20);
}
catch (Exception e) {
MessageBox.Show(e.ToString());
}
<例外の内容>
System.InvalidCastException: 型 'Shell32.ShellClass'のCOMオブジェクトを
インターフェイス型'Shell32.IShellDispatch5'にキャスト出来ません。
IID '{866738b9-6cf2-・・・略}'が指定されたインターフェイスのCOMコンポーネント上でのQueryInterface 呼び出しのときに
次のエラーが発生したため、この操作に失敗しました:
インターフェイスがサポートされていません(HRESULTからの例外:0x80004002
(E NOINTERFACE))。
場所 Shell32.ShellClass.NameSpace(Object vDir)
エスパーな内容で申し訳ありませんが、宜しくお願いします。
4:デフォルトの名無しさん
09/11/19 00:11:30
前スレ950です
>>前991
確かに、1/3で呼ばれることも有りますね…
幸い除外値は1つなのですが、他に方法ありますか?
5:デフォルトの名無しさん
09/11/19 00:15:24
よっぽど極端な場合なら
int[] 全ての許容値 = {…};
result = 全ての許容値[random.Next(0, 全ての許容値.Length)];
6:デフォルトの名無しさん
09/11/19 01:26:52
>>3
URLリンク(msdn.microsoft.com)(VS.85).aspx
IShellDispatch5 は、Vista 以降に追加されたインターフェース
XPからは使えないわな。
bin以下に interopなんたらって生成されてない?
されてるなら、そいつはdllコピーを見に行かずPCにインストールされてるdllを見にいく。
動作しているXPのマシンはたぶんXPでも動作するようなパッチがあたってんじゃね?
MSUpdateでとりあえず全部最新にしてみたら?
7:デフォルトの名無しさん
09/11/19 08:29:54
>>4
結果をずらせばいい。
2~8の乱数で除外値5の場合、
2~7の乱数を発生させて、結果が5以上なら+1する。
一般化すると・・・
min~max-1の範囲で乱数発生
結果がexclusion以上の場合は+1する。
これだと乱数発生は一回ですむし、ループもいらない。
8:デフォルトの名無しさん
09/11/19 08:51:50
Visual C# 2008 Express Edition で勉強中です
全国の市町村検索データベースを作成しようと思っています
(漢字、よみがなであいまい検索できるようにしたいと思っています)
全国の市町村の数くらいなら、テンプレートの「データセット」でも大丈夫でしょうか?
またはSQLiteを使った方がいいでしょうか?
それとも他にいい方法がありますでしょうか?
初心者すぎて、入り口が広すぎで検索しても絞り込めないです
お知恵をお貸し下さい
9:デフォルトの名無しさん
09/11/19 09:23:17
>>8
せめてDB使ったほうがいいんじゃないかな?
10:デフォルトの名無しさん
09/11/19 10:39:56
Graphics#DrawString() を使って縦書き描画をすると、
ローマ数字が90度回転して描画されてしまうのですが、
どうしたら良いでしょうか?
[ソース]
Graphics g = pictureBox1.CreateGraphics();
String drawString = "あいうえおⅠⅡⅢ";
Font fnt = new Font("@MS ゴシック", 16, FontStyle.Bold);
StringFormat sf = new StringFormat();
sf.FormatFlags = StringFormatFlags.DirectionVertical;
g.DrawString(drawString, fnt, Brushes.Black, 0.0F, 0.0F, sf);
fnt.Dispose();
g.Dispose();
11:3
09/11/19 12:20:05
>>6
>bin以下に interopなんたらって生成されてない?
されてましたorz
DotNetZip Libraryを使ってみる事にします。
回答ありがとうございました!
12:3
09/11/19 14:00:41
ウィンドウに関連付けられたテキストを取得したいのですが、
取得するテキストサイズが分からない場合どうすればいいのでしょうか。
あらかじめ大きめにサイズを指定しておくしか無いですか。
現在は下記のようにしていますが、途中までしか取得できません。
byte[] buf = new byte[255];
StringBuilder sb = new StringBuilder();
sb.Length = 255;
SendMessage(hWnd, WM_GETTEXT, 255, sb);
13:デフォルトの名無しさん
09/11/19 14:03:52
WM_GETTEXTは見つけられて何で気付かないのかねぇ
14:3
09/11/19 14:23:44
>>13
ありがとうございます!
WM_GETTEXTLENGTHで取得出来そうです。
15:デフォルトの名無しさん
09/11/19 15:20:04
そもそも3の質問は解決してるんだから
同じ人って主張する必要ないんじゃない?w
16:デフォルトの名無しさん
09/11/19 15:41:02
>>15
恥ずかしながら名前の消し忘れです。
>>12を書き込んでから赤面しましたが、
書いてしまったので質問中は統一しました><
17:8
09/11/19 18:18:22
>>9
いろいろ調べて、敷居を低くしました(涙
・System.Data.SQLiteでデーベース構築
・PupSQLiteで市町村データベースインポート
後は検索するコードをがんばればいけると思っています
まぁすんなりはいかないと思いますが、その時はみなさんのお力を貸して下さい
18:デフォルトの名無しさん
09/11/19 19:07:08
>>17
イイヨイイヨー
頑張れ
19:デフォルトの名無しさん
09/11/19 19:24:51
ComboBoxのDatasourceにDataTableをぶち込んだ後に、Datasourceから値を取得したらArrayになります。
ここからLINQで操作したいのですがいい方法ないでしょうか?
20:デフォルトの名無しさん
09/11/19 20:09:46
datasourceから取り出すときにキャスト
21:デフォルトの名無しさん
09/11/19 20:48:11
まえスレ>>998
できるよ。
22:デフォルトの名無しさん
09/11/19 22:02:17
タブコントロールを使ってるんですが
デフォルトがだっさくてしょうがない
外見変える方法はないですか?
23:デフォルトの名無しさん
09/11/19 22:07:10
自分で描画すればー
検索キーワードはオーナードローとカスタムドローでどうぞ
24:デフォルトの名無しさん
09/11/19 22:09:22
WPFならコード書かずに見た目変え放題
25:デフォルトの名無しさん
09/11/19 22:10:32
>>24
XAML弄るのはコード書かないとは言えない気がするぜ
ハードル的な意味で
26:デフォルトの名無しさん
09/11/19 22:15:28
Expression Blendと格闘中
変え放題ねぇ、いつになったらできるようになるんだろう
27:デフォルトの名無しさん
09/11/19 22:16:28
プログラマならXAMLは手書きから入った方が理解しやすいと思うよ
28:デフォルトの名無しさん
09/11/19 22:34:53
ありがとうございました
29:デフォルトの名無しさん
09/11/19 22:35:16
C#のMSDNみても情報量膨大すぎて何からはじめればいいかわからん。
C#初めてなんだけどまずMSDNのどのページを見ればいいの?
30:デフォルトの名無しさん
09/11/19 22:44:30
C#の言語仕様についてなら・・・
MSDNのC#プログラミングガイド
URLリンク(msdn.microsoft.com)
MSDNでもいいけど↓なんかもお勧め
URLリンク(www.atmarkit.co.jp)
31:デフォルトの名無しさん
09/11/19 22:49:31
将来的な需要を言うとC++とC#だとどっちが良いのかな?
32:デフォルトの名無しさん
09/11/19 22:50:43
C++じゃねえかなあ
個人的にはC#のが好きだが
33:デフォルトの名無しさん
09/11/19 22:51:56
だよね・・・C++を学ぶなら先にC#学んでおいた方がいいかな?
34:デフォルトの名無しさん
09/11/19 23:05:25
設定を効率よく保存する方法ってどんなのがありますか?
バイナリやテキスト(.iniなど)などが主流だとは思うんですけどね
35:デフォルトの名無しさん
09/11/19 23:08:13
将来的な需要ならC#だろ
36:デフォルトの名無しさん
09/11/19 23:09:51
アプリケーション設定かXmlSeriarizer
37:デフォルトの名無しさん
09/11/19 23:10:46
>>34
どの観点から見て効率よくなのかが分からない
プログラム的にはシリアライズしてファイルに書き出した方が楽だろうけど
人間がそれを読むのはテキストや設定ファイルに比べれば多少面倒臭い
38:デフォルトの名無しさん
09/11/19 23:13:48
バイナリとテキストってそれ以外になにがあるっちゅーねんってつっこみはおいといて、
C#でやるならxmlが主流ですよ。
>>31
Windows上でアプリケーション書くだけっていうならC#じゃないのかねぇ。
言語学ぶだけならC#先でもC++先でもどっちでもいいけど
VC++は色々ややこしいからやめといた方がいいと個人的には思う
39:デフォルトの名無しさん
09/11/19 23:15:38
もうヘッダ眺めただけで拒絶反応でるくらいC++嫌いになった
40:デフォルトの名無しさん
09/11/19 23:21:30
今のC++は変態的なテンプレートプログラミング言語って感じがするなぁ
大人しくC#から入った方が幸せじゃね?
41:デフォルトの名無しさん
09/11/19 23:24:11
構造体が嫌いでxmlよりini使ってるんだけど
実際どうなのかな?
42:デフォルトの名無しさん
09/11/19 23:26:38
>>41
読み書きって自前で実装してるの?
43:デフォルトの名無しさん
09/11/19 23:27:10
構造体とXMLに何の関係があるのかも分からんし
どうなの?って何聞いてるんだか意味不明だよ
44:デフォルトの名無しさん
09/11/19 23:29:53
わかりません
45:デフォルトの名無しさん
09/11/19 23:33:23
iniはフラットな構造だけど
xmlは階層構造してる(=構造体)ってことじゃないかね?
どうなのかなって言われても時代遅れですとしか。
46:デフォルトの名無しさん
09/11/19 23:40:04
>>45
iniも一応階層構造だし、むしろシンプルな構造体はiniに近いでしょ
47:デフォルトの名無しさん
09/11/19 23:42:36
じゃあマークアップ言語が嫌いってことか
WPFとか駄目なんかな
48:デフォルトの名無しさん
09/11/19 23:43:28
>>10
"@MS ゴシック" を
"MS ゴシック" にする
49:デフォルトの名無しさん
09/11/19 23:47:28
すいません質問させてください。
以下のようなプログラムを動かした場合に、Main()の中の
①を②に書き換えても(どちらでも)問題なく動作します。
Func()内部で生成されるインスタンスArrayListのスコープを考えると
①の書き方が正しいのでしょうか?
そもそも②では
Func()から復帰するときに復帰値をコピーしようとして
復帰値をコピーする受け皿インスタンスが無い。→例外!
みたいな動作かと思っていました。
②にしたとき、al = b.Func();の行で何が起こっているのでしょうか?
解かりにくい説明かもしれませんが、よろしくお願いします。
class aaa {
public static void Main() {
①ArrayList al = new ArrayList(); //②ArrayList al;
bbb b = new bbb();
al = b.Func();
foreach (string s in al) Console.WriteLine(s);
}
}
class bbb {
public ArrayList Func() {
ArrayList al = new ArrayList();
al.Add("111");
al.Add("222");
return al;
}
}
50:デフォルトの名無しさん
09/11/19 23:56:23
newされた参照型のオブジェクトはどこかになんとなく存在してて、
常にそのオブジェクトの電話番号でやり取りするの
変数に入ってるのもメソッドの引数も戻り値も全て実体ではなくて電話番号
51:デフォルトの名無しさん
09/11/19 23:59:32
受け皿インスタンってなんだよw
52:デフォルトの名無しさん
09/11/20 00:06:14
参照型について勉強しましょう
どんな本やサイトにも説明があります
ここでちょっと聞いて解るようなものではありません
53:49
09/11/20 00:22:42
どうも回答ありがとうございます。
>>50
なるほど、newしたインスタンスのスコープを勘違いしていました。
メソッド内で生成したものでも、メソッド復帰時に解放される
わけではないのですね。
null指定したりGCで殺されるまでnewで生成されたインスタンスは生きつづける、
と理解できました。
>>51
いや~、Cだと関数呼び出しで構造体受け渡すとコピーが発生するじゃないですか?
そういうイメージなのかと勘違いしていました。
>>52
ポインタ参照だと理解しています。
54:デフォルトの名無しさん
09/11/20 00:24:34
参照型なんて余裕
URLリンク(msdn.microsoft.com)
下のほうにある図みりゃおk
55:デフォルトの名無しさん
09/11/20 00:28:54
>>53
null指定したり~~行き続ける
いくらなんでも使用中に勝手に殺されたら嫌過ぎるだろwwwwwwww
つかいものになんねぇよwwwwwwwww
56:デフォルトの名無しさん
09/11/20 00:53:47
null代入しても消えません
使われなくなったらそのうちいつのまにか消えてます
57:デフォルトの名無しさん
09/11/20 03:42:22
int a;
double b=2.32;
a=(int)b; //a=bはダメ
みたいに(int)をつけなきゃいけなくなってるのは
int型やdouble型にimplicitだかが定義されていなくて
explicitだけオーバーロードされてるから
ってあってますか?
でもMSDNのdouble構造体ってとこみたら
演算子のオーバーロードにexplicit書いてないけど
何か特殊な方法でやってるわけじゃないよね?
58:デフォルトの名無しさん
09/11/20 05:50:33
組み込み型とか配列は特殊で、機能がILや言語レベルで実装されていたりする
59:デフォルトの名無しさん
09/11/20 09:22:30
システムの機能に任意のタイミングで
SQL鯖2008のバックアップを出来るようにしてほしいと言われたんだけど
どれでいこうか迷ってる
①マネージメントスタジオを直で使わせる
②osqlのバッチを用意して使わせる
③2のバッチをPGからキック
④PGから直でバックアップSQL実行
⑤SQLDMOを使う
他にもありそうですが、皆さんどのような方法で実装していますか?
あと皆トランザクションをある程度の量で切り捨てなければいけないような環境だとどうしてるんだろう・・・
60:デフォルトの名無しさん
09/11/20 09:39:53
Microsoft SQL Server 総合スレ 7
スレリンク(db板)l50
61:デフォルトの名無しさん
09/11/20 10:06:02
>>60
サンクス
すれ違いごめ
そっちで聞いてきます。
62:デフォルトの名無しさん
09/11/20 11:43:31
リストビューでカラムを適用したアイテムのtextをカラムの長さに合わせて自動で折り返して
欲しいのですが、これはラベルワープtrueではだめなのでしょうか?。
自分で長さに合わせて改行しないとだめですか?。
63:デフォルトの名無しさん
09/11/20 11:56:17
改行を入れても改行されませんよ
フフンw
64:デフォルトの名無しさん
09/11/20 12:10:09
高さの計算とかめんどくさいだろうしオーナードロ-とかでやるのも厳しいからやろうとしたこともないが
DataGridViewで代用してるなぁ…
65:デフォルトの名無しさん
09/11/20 12:29:35
ラベルワープって何だよ
66:デフォルトの名無しさん
09/11/20 12:34:12
ワードラップだろ
67:デフォルトの名無しさん
09/11/20 12:54:43
(Keys.G | Keys.Alt)をXmlSerializerでシリアライズすると
<Keys>LButton RButton Cancel MButton XButton1 XButton2 A B C D E F G Alt</Keys>
こうなるんですけど、
なんで
<Keys>G Alt</Keys>
こうならないのか意味がわかりません
誰か助けてください
68:デフォルトの名無しさん
09/11/20 13:00:31
FlagsAttributeがついてるせいで内部で少しややこしい処理をしている
デシリアライズすれば元に戻るから気にするな
69:デフォルトの名無しさん
09/11/20 13:06:59
ありがとうございます!!
ファイルの中身がめちゃくちゃになってたからびっくりして質問しちゃいました
助かりました!!
70:デフォルトの名無しさん
09/11/20 14:07:35
>>57
それはintとdoubleに互換性が無いから。
それぞれ用途が違い内部表現も違うので、相互に変換する場合には明示的に変換処理が必要。
C#の場合はキャストまたはas構文を使う。
intとdoubleに関しては組み込み型なのでキャストで十分。
IEEE754 で調べてごらん。
71:デフォルトの名無しさん
09/11/20 14:14:36
すいませんListViewで垂直スクロールバーが出ているかどうか知りたいんですが
何か方法はありませんか?
72:デフォルトの名無しさん
09/11/20 14:24:09
ListViewを継承したクラスを作って
protectedなメソッド調べてごらん。
73:デフォルトの名無しさん
09/11/20 14:25:43
>>21
ありがとです。
だったらスマートフォン買うときはWindowsMobile機にしよっと。
74:デフォルトの名無しさん
09/11/20 15:48:46
C#の配列って
C言語の配列と違って
メモリ上に物理的に連続してないの?
C言語なら
405FAC40にa[0]があったら
405FAC44にa[1]があって
・・・・AC48にa[2]、というふうに
連続してたけどC#は違う?
75:デフォルトの名無しさん
09/11/20 15:51:27
違う。
stackalloc使いなさい。
76:デフォルトの名無しさん
09/11/20 15:53:44
もしくはfixed
77:デフォルトの名無しさん
09/11/20 16:05:49
へぇ。C#の配列ってめちゃくちゃに並んでるんだ?C言語と比べて効率悪そうだね。
78:デフォルトの名無しさん
09/11/20 16:08:40
連続してる。だからunsafeでポインタが使える。
ただし配列全体は固定されていない。移動することがある。
79:デフォルトの名無しさん
09/11/20 16:11:52
それはガベージコレクタが勝手にやってるんでしょ?
C#の参照型はポインタ型と違って直接アドレスを表示できないけど
例えば
405FAC40にa[0]があったら
405FAC44にa[1]があって
・・・・AC48にa[2]、というふうにならんでたのがガベージコレクタが勝手にコンパクションを実行して
638AC044にa[0]
638AC048にa[1]
・・・・C04Bにa[2]
みたいになっちゃうってことでいいの?
80:デフォルトの名無しさん
09/11/20 16:17:29
それを知って一体何する気なんだろう・・・・
あ、いや 気になることってあるもんね
81:デフォルトの名無しさん
09/11/20 16:20:13
効率の観点から言ったら内部では連続してるんじゃねえかなぁ
それを前提にしてはいけないんだろうが
82:デフォルトの名無しさん
09/11/20 16:33:52
おれも連続しているとは思う
どうせアドレスなんか使わないけど
83:デフォルトの名無しさん
09/11/20 16:43:55
データがそこに直接あるのではなくてJPがあるんじゃないの
84:デフォルトの名無しさん
09/11/20 16:44:14
C#(CLR)の配列は本質的にはgcnewなので、連続はしている。
79のいうように、知らない間にアドレスが変わってる、なんてことはありうる。
そういうことをやってもらうためのガベージコレクションでもあるわけで。
85:デフォルトの名無しさん
09/11/20 16:50:28
参照は移動しても大丈夫。
ポインタはそうはいかない。
配列全体は連続してる。
86:デフォルトの名無しさん
09/11/20 19:37:27
そんな事より>>1よ、ちょいと聞いてくれよ。スレとあんま関係ないけどさ。
昨日、近所のメモリ内行ったんです。メモリ内。
そしたらなんかインスタンスがめちゃくちゃいっぱいで座れないんです。
で、よく見たらなんか垂れ幕下がってて、ジェネレート2、とか書いてあるんです。
もうね、アホかと。馬鹿かと。
お前らな、ジェネレート2如きで普段来てないメモリに来てんじゃねーよ、ボケが。
ジェネレート2だよ、ジェネレート2。
なんかダイナミック変数とかもいるし。ダイナミック配列でメモリか。おめでてーな。
よーしパパ逆参照しちゃうぞー、とか言ってるの。もう見てらんない。
お前らな、ガベージコレクションやるからその席空けろと。
メモリ内ってのはな、もっと殺伐としてるべきなんだよ。
隣のアドレスに座った奴といつ喧嘩が始まってもおかしくない、
刺すか刺されるか、そんな雰囲気がいいんじゃねーか。女子供は、すっこんでろ。
87:デフォルトの名無しさん
09/11/20 19:42:53
garbage collector in real-life
88:デフォルトの名無しさん
09/11/20 22:13:01
ホームページビルダーみたいなエディタをC#で
作ってみたいなー
89:デフォルトの名無しさん
09/11/20 22:14:59
ホームページビルダー懐かしいな
今はWikiみたいに簡単に自分のページを作れるけど
ページビルダーみたいなのっていまだに売れてるんだろうか
90:デフォルトの名無しさん
09/11/20 22:15:12
ここはお前の日記帳じゃねえんだ
91:デフォルトの名無しさん
09/11/20 22:16:06
WPFのRichTextBoxで作ったFlowDocumentをXHTMLに変換すれば楽勝
92:デフォルトの名無しさん
09/11/20 22:41:40
>>87
パソコンがなくなった。どうしてくれる
93:デフォルトの名無しさん
09/11/20 22:42:48
友達いない奴はみんなGCに回収されるんですね
94:デフォルトの名無しさん
09/11/20 22:47:40
明示的にDispose()実行するまではまだなんとかなる。早まるな。
95:デフォルトの名無しさん
09/11/20 22:50:34
つまりガベージコレクションは俺たちの社会の縮図だったわけか・・・
96:デフォルトの名無しさん
09/11/20 23:06:14
気付かないのか?
お前達はusingステートメントで初期化されていたことに…
97:デフォルトの名無しさん
09/11/20 23:28:32
さてと、米にバルス!
98:97
09/11/20 23:29:13
ごばく
すまそ
99:デフォルトの名無しさん
09/11/20 23:29:28
ラピュタは2ちゃんの鯖を落とす程度の能力か
100:デフォルトの名無しさん
09/11/21 02:36:28
ガベージコレクションってメモリの管理だけをする道具
っていう認識でいいの?
101:デフォルトの名無しさん
09/11/21 02:44:45
>>100
それじゃあメモリアロケーターだ。
ガベージコレクションはインスタンスの寿命を管理するシステムのこと。
102:デフォルトの名無しさん
09/11/21 02:51:06
じゃあ構造体はインスタンスじゃないから
ガベージコレクションに管理されないの?
103:デフォルトの名無しさん
09/11/21 03:16:18
インスマウス
104:デフォルトの名無しさん
09/11/21 03:22:29
邪神崇拝者の来る場所じゃないぞ
105:デフォルトの名無しさん
09/11/21 06:07:27
WinXP Pro SP3、VS2008, .Net 3.5 C#で開発を行っております。
以下のコードを実行したところ、System.Runtime.Remoting.RemotingExceptionが出てきたり、出てこなかったりするケースがあって困っております。
Exceptionのメッセージは以下の通りです。
オブジェクト '○○' が切断されたか、サーバーに存在しません。
どなたかもしよろしければ、原因・対策などご教示いただければ幸いです。
よろしくお願いします。
//コード
private HogeHogeHoge x = null;
private AppDomain hostedAppDomain = null;
//初期化
private void Init() {
AppDomainSetup setup = new AppDomainSetup();
setup.ApplicationBase = AppDomain.CurrentDomain.BaseDirectory.ToString();
Evidence evidence = new Evidence();
evidence.AddHost(new Zone(SecurityZone.MyComputer));
hostedAppDomain = AppDomain.CreateDomain("XXX", evidence, setup);
x = hostedAppDomain.CreateInstanceAndUnwrap("HogeHoge", "HogeHogeHoge") as HogeHogeHoge;
}
//終了
private void Exit() {
if (x != null) {
// xの終了処理 ここでSystem.Runtime.Remoting.RemotingException
x.Disose();
}
AppDomain.Unload(hostedAppDomain);
}
106:デフォルトの名無しさん
09/11/21 08:46:14
Exitが2回呼ばれているんじゃ?
107:デフォルトの名無しさん
09/11/21 09:06:38
>>102
構造体はスタックに確保されるからGCで管理はされない。
108:デフォルトの名無しさん
09/11/21 12:34:53
え?
109:デフォルトの名無しさん
09/11/21 13:25:46
「え?」とか「は?」とかバカじゃないの、もうちょっと何か書こうよ。
クラスのメンバーに構造体がある場合や、Boxingされたケースとか、
例外はあるが基本的に言ってることは正しいと思うけど。
110:デフォルトの名無しさん
09/11/21 13:47:38
今回初めて印刷のロジックを作ることになりました。
「PageSettings.HardMarginX」と「MarginBounds.X」
のちがいは何でしょうか?
実行して値を表示させたとき、
「MarginBounds.X」 = 100、
「PageSettings.HardMarginX」= 13
となりました。
どちらも印刷可能範囲の左上端を示していると思いきや全く異なる値でした。
どういうちがいがあるのか、
ご存知の方、教えてください…!
111:デフォルトの名無しさん
09/11/21 13:50:16
マージンは印刷しないサイズ、ハードマージンは印刷できないサイズ
ハードマージンは見なくて大丈夫だと思う
112:デフォルトの名無しさん
09/11/21 14:14:08
>>111 さんありがとうございます。
今作成中のアプリケーションは、
全国の何ヵ所かの家庭や店舗で利用してもらおうとしており、
それぞれの家庭や店舗のプリンタの機種が様々なのですが、
どんな機種でも、おおよそ決まった位置に明細を印刷しようと思っています。
この場合もマージンで問題ないでしょうか。
たびたびの質問で恐縮ですが、よろしくお願いします。
113:デフォルトの名無しさん
09/11/21 14:53:53
>>112
印刷は所詮はアナログの世界なので、どうしても狂うことが出てくる。
オフセット(マージン)、縮尺は、ある程度印刷時に変えられるように作っておいたほうがいいよ。
114:デフォルトの名無しさん
09/11/21 15:22:26
>>113
だから、前にもこのスレあたりで書いたと思ったが、そんな訳がないだろう、ってw
プリンタの実装がそんないい加減なものならどうして葉書の郵便番号なんか
ちゃんと枠内に印刷できるんだ。
テキトーなこと言う奴が多すぎるな。
115:デフォルトの名無しさん
09/11/21 15:30:58
つーか、フチなし印刷できるプリンタ、できないプリンタでハードマージンは違うだろよ。
調整機能は必須。
116:デフォルトの名無しさん
09/11/21 15:35:52
>>115
だから、そういうテキトーなことを言わないこと。
葉書印刷ソフトだけでも世の中にいろいろあるが、そんな「調整機能」が
付いたソフトは見たことがない。
そんな泥臭い作業を人間様に任せるようなダメ設計になってるのなら
windowsもページプリンタもこんなに普及してねえよ。
117:デフォルトの名無しさん
09/11/21 15:37:16
これがゆとりってやつか・・・。
118:デフォルトの名無しさん
09/11/21 15:39:18
URLリンク(www.yomiuri.co.jp)
> 「筆まめ」の「印刷位置微調整」機能
>
> 筆まめ19など、はがき作成ソフトには印刷位置をミリ単位で微調整する機能が備わっている。
> 筆まめの場合は、ファイルメニューの「印刷位置微調整」から利用する
> 郵便番号の位置だけを微調整する機能もある。
119:デフォルトの名無しさん
09/11/21 15:42:31
>>116
____
/ \ /\ キリッ
. / (ー) (ー)\
/ ⌒(__人__)⌒ \ <そんな「調整機能」が
| |r┬-| | 付いたソフトは見たことがない。
\ `ー'´ /
ノ \
/´ ヽ
| l \
ヽ -一''''''"~~``'ー--、 -一'''''''ー-、.
ヽ ____(⌒)(⌒)⌒) ) (⌒_(⌒)⌒)⌒))
____
/_ノ ヽ、_\
ミ ミ ミ o゚((●)) ((●))゚o ミ ミ ミ <.だっておwww
/⌒)⌒)⌒. ::::::⌒(__人__)⌒:::\ /⌒)⌒)⌒)
| / / / |r┬-| | (⌒)/ / / //
| :::::::::::(⌒) | | | / ゝ :::::::::::/
| ノ | | | \ / ) /
ヽ / `ー'´ ヽ / /
| | l||l 从人 l||l l||l 从人 l||l バ
ヽ -一''''''"~~``'ー--、 -一'''''''ー-、 ン
ヽ ____(⌒)(⌒)⌒) ) (⌒_(⌒)⌒)⌒)) バ
ン
120:デフォルトの名無しさん
09/11/21 15:44:45
>>118
それは古い精度の悪いプリンタ(現実にはあまりないが)を使っている人を
想定した「念のための機能」であって、>>115が主張するように必須の機能なんかじゃない。
通常はそんな馬鹿げたことをしなくても、少なくともmmオーダーの精度で
正確に位置決めされた印刷が行えるようになっている。
っていうか、印刷のコード書いたことがない馬鹿は黙っていた方がいいよ。
121:デフォルトの名無しさん
09/11/21 15:47:42
で? ユーザーがどんなプリンタを使ってるのか特定できない以上、>>118みたいな
調整機能は必須だろ?
122:デフォルトの名無しさん
09/11/21 15:47:56
というか、.NETだとそのためのプロパティがHardMarginX,HardMarginYなんだよ。
これで用紙の左上とプリンタの印刷可能領域(印刷時のハードウエア座標の原点)
のズレが取得できるようになっている。
123:デフォルトの名無しさん
09/11/21 15:47:58
>そんな「調整機能」が付いたソフトは見たことがない。
124:デフォルトの名無しさん
09/11/21 15:48:17
プリンターの印刷可能領域に左右されずに、
用紙の左上から決まった場所に印刷するには、
例えば(100-ハードマージンX,200-ハードマージンY)
とすべきですか?それとも
例えば(100-マージンX,200-マージンY)
とすべきですか?
マージンはプログラム上で何も設定していません。
よろしくお願いいたします。
125:デフォルトの名無しさん
09/11/21 15:49:55
>>121
だから、現実問題としてはそんなプリンタは市場にほとんど存在してない。
紙送りの精度が悪いので有名だったHPの10年前の製品だって、そんな機能が
必要になるほどズレたりはしない。
126:デフォルトの名無しさん
09/11/21 15:53:50
まー、そう思うなら調整機能付けなきゃいいだけだわな。
実際、有名どころの年賀状印刷ソフトにはついてるし、俺もあとで修正するのは面倒だから、
そういう機能を付けるけど。
127:デフォルトの名無しさん
09/11/21 15:56:59
>>124
用紙の、の場合は、マージンは使わない。
ハードマージンの分を含むか含まないかは、試してみてくれ
128:デフォルトの名無しさん
09/11/21 15:57:55
HTMLエディタを作る場合の内部的なデータの持ち方は
どんなのがいいでしょう?
129:デフォルトの名無しさん
09/11/21 15:58:37
機能によって違うんじゃね?
130:デフォルトの名無しさん
09/11/21 16:01:19
データ実体はHTML&CSSだろうな
131:デフォルトの名無しさん
09/11/21 16:33:34
プリンタによって1ページに収まったり収まらなかったりするんだから、
その手の調整機能は普通いるんじゃないの?
132:デフォルトの名無しさん
09/11/21 16:36:11
____
/ \ /\ キリッ
. / (ー) (ー)\
/ ⌒(__人__)⌒ \ <そんな「調整機能」が
| |r┬-| | 付いたソフトは見たことがない。
\ `ー'´ /
ノ \
/´ ヽ
| l \
ヽ -一''''''"~~``'ー--、 -一'''''''ー-、.
ヽ ____(⌒)(⌒)⌒) ) (⌒_(⌒)⌒)⌒))
133:デフォルトの名無しさん
09/11/21 16:46:33
どうでもいいが、幼稚な奴が多いのな。
俺は馬鹿な奴は嫌いじゃないが、幼稚な奴とコミュニケーションができない
真性ヲタはどうしようもないクズだと思ってる。
134:デフォルトの名無しさん
09/11/21 16:51:07
揚げ足取りで勝った気になる困ったちゃんは少なからずいるものだ
135:デフォルトの名無しさん
09/11/21 16:51:24
>>133
お前みたいな幼稚なレスしかしない奴もクズだけどな
136:デフォルトの名無しさん
09/11/21 16:52:58
僕.NEET
喧嘩はやめて
137:デフォルトの名無しさん
09/11/21 16:54:41
みんなゴメン。
138:デフォルトの名無しさん
09/11/21 17:04:54
>>133
俺も幼稚な奴は嫌いだけど論理的じゃない奴も嫌い
前2行をどう呼んだら3行目に繋がるんだ?
139:デフォルトの名無しさん
09/11/21 17:27:04
幼稚な奴は小学校からやり直した方がいいな。
年賀状印刷ソフトに調整機能なんてついてない! とか言い張って、
ソースが提示されてるのに、現実問題としてそんなプリンタはほとんどない! か。
ほんと、テキトーなことを言う奴が多いなw
140:デフォルトの名無しさん
09/11/21 17:30:18
プリンタはアナログの世界で動く機械であって、
必ずしもアプリ側で指定した内容でずれなく印刷できる保証がどこにもない。
で、プリンタドライバのユーリティーでもある程度調整は効くだろうけど、
それで無理なような突っ込んだ内容はアプリ側でもある程度対応できるようにしておくべきだろう、という話。
必要だと思わないならやらなきゃいいだけさ。
別にスレが荒れるような内容じゃない。
141:デフォルトの名無しさん
09/11/21 17:36:06
>>114 と >>116 が釣り師ということで。この話題終了。
142:デフォルトの名無しさん
09/11/21 17:44:15
マージンは余白で、
ハードマージンは常用プリンターの印刷可能開始位置だよね。
ところで、
マージンの値をページ設定ダイアログから指定していないときは、
C♯上のマージンの初期値はいくらになるの?
143:デフォルトの名無しさん
09/11/21 17:46:21
>>140-141
無知無能なくせにしつこいなお前さん。
本当にプログラマか?
っていうか、君(ら)は今までプリンタ使ったことないのかね。
1万前後で買えるキャノンやエプソンの最下位グレードのインクジェットだって
位置決めの問題なんかないんだよ。
そんなことは例えばワードで葉書印刷をしたってわかるし、
自分でコードを書いて印刷されたものを物理的に測定したって分かる。
馬鹿な癖に頭の中だけで考えているからそういうとんでもない勘違いをすることになる。
144:デフォルトの名無しさん
09/11/21 17:57:38
俺、キヤノンiP3100の付属CD印刷ソフト使ってるけど、微調整しなきゃズレるぞ?
145:デフォルトの名無しさん
09/11/21 18:04:32
>>144
俺もそれ使ってるけど微調整したことない
なんでクエスチョンマークをつけるんだ?
146:デフォルトの名無しさん
09/11/21 18:06:08
同じプリンタで同じように印刷すれば、そりゃ、位置はズレないだろうよ。
ズレるようなら、それは不良品。
そんな話をしてるんじゃなくて、違うプリンタで位置がズレるか、って話。
印字位置の調整機能を持ったソフトなんて、それほど山のようにあるだろ?
もう釣りはいいから、さっさと死ねよ。
147:デフォルトの名無しさん
09/11/21 18:09:13
>>145
微調整したことない?
妙だな、CDのメーカーによって変更しなきゃいけないのに
ああ、気にしてないってだけか
148:デフォルトの名無しさん
09/11/21 18:11:53
>>146
だから、プリンタの違いによる物理座標の違いを補正できないような糞設計には、
プリンタ側もウィンドウズ側もなってはいないの。
何度も言うように、.NETでも2.0以降はHardMarginX、HardMarginYプロパティが
ちゃんと容易されていて、必要ならこういう差異をちゃんと補正できるようになっているんだよ。
ウダウダ言ってないで実際コード書いてみれば分かるから。
プリンタぐらい持ってるでしょ。
149:デフォルトの名無しさん
09/11/21 18:13:10
同人でズレてるのは見かけるな。
150:デフォルトの名無しさん
09/11/21 18:16:41
フォントなんて3だか9だかの倍数じゃないと、メーカーによって大きさがバラバラだったよね。
151:デフォルトの名無しさん
09/11/21 18:17:45
なら、年賀状印刷ソフト会社にでも教えてやれよ。「調整機能は不要です!」って。
152:デフォルトの名無しさん
09/11/21 18:27:13
>>142
ですが、ご存知の方、教えてください…
(>_<)。
153:デフォルトの名無しさん
09/11/21 18:29:39
「同じように印刷すれば、どのプリンタでも印字位置はズレない」
こんな命題が成り立つわけないのは自明だろ。全メーカーの全プリンタで検証して
はじめて成り立つわけだし。
俺はそんな検証したくないし、そもそも、位置ズレに悩まされたこともあるから、
調整機能を付けるよ。
154:デフォルトの名無しさん
09/11/21 18:29:50
>>152
やってみればいいじゃん。
155:デフォルトの名無しさん
09/11/21 18:42:50
万人が使えるUIなら当然微調整機能くらいは付けるわな
156:デフォルトの名無しさん
09/11/21 18:43:42
このどうでもいい議論いつまで続くんだろう
157:デフォルトの名無しさん
09/11/21 18:44:37
C#でグローバルIPを取得するにはどうすればいいですか?
158:デフォルトの名無しさん
09/11/21 18:46:26
>>157
ルータに問い合わせるかリモホを表示するサイトにアクセスして
その結果を利用するか
159:デフォルトの名無しさん
09/11/21 18:46:52
>>157
なんのグローバルIPをどんなアプリから取得したいんだよ?
LAN 内からルーターのグローバルIPが取りたい、ってことなら、UPnP か、
いったん外部にアクセスしてそっちからもらうか、だな。
160:デフォルトの名無しさん
09/11/21 18:48:32
>>158,159
ルータに問い合わせるって簡単に出来ますか?
リモホを返すページ作ってアクセスさせてみます
161:デフォルトの名無しさん
09/11/21 18:52:13
perl だけど、サンプルあったぞ。
URLリンク(hydro.energy.kyoto-u.ac.jp)
162:デフォルトの名無しさん
09/11/21 18:54:43
あ、SSI使えたので流用しようかと思いましたが、
ありがとうございます。使わさせて頂きます。
163:デフォルトの名無しさん
09/11/21 19:53:58
デリゲートはメソッドをカプセル化する型
164:デフォルトの名無しさん
09/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:デフォルトの名無しさん
09/11/22 01:17:08
>>164
メール送受信関係はWindowsのアキレス腱。
だって、元々SMTPはメールサーバー同士でメールをやり取りするためのプロトコルだぞ。
メールサーバーをローカルに立てているWindows機なんてそこらにはないだろ?
ってことで、メール送信に関しては失敗したときの動作を必ず決めておくべき。
質問の答えだが、別にVistaだから使えないってことはない。
クライアントマシンの環境次第。例えばオレのマシンじゃ動かない。
166:164
09/11/22 01:34:04
言葉足らずでした。
自分の場合、どの環境からも送信出来るようにと思い、
YahooやGoogleのフリーメールをsmtp経由で送信しているのですが、
それでもそんなものなんでしょうかね?
167:デフォルトの名無しさん
09/11/22 01:47:03
>>166
だから、クライアントマシンの環境次第だと言ってるじゃないか。察してくれよ。
ちなみに今時SMTPの標準のポートが空いてるプロバイダなんてまずねーよ。
168:デフォルトの名無しさん
09/11/22 07:02:38
FillRectangleメソッドではRectangleFを指定できるのに、
DrawRectangleメソッドではなぜRectangleFが指定できず、Rectangleしか指定できないのでしょうか?
floatのX,Y,Width,Heightを直接記述するとデバッグでエラーにならないのだから---
RectangleFが指定できたらいいのですが・・・・・できますでしょうか。
ご存知の方よろしくお願いいたします。
169:デフォルトの名無しさん
09/11/22 09:05:49
言われてMSDN見てみた。ホントに一貫性無いな・・・なんでだろ。
Graphics..::.DrawRectangle メソッド (Pen, Single, Single, Single, Single)
あるから出来ないわけないよね。
Graphics..::.DrawRectangles メソッド (Pen, array<RectangleF>[]()[])
に食わせるか、ラップ関数作って食わせるか。
170:デフォルトの名無しさん
09/11/22 09:16:37
>>164
とりあえずエラーの場所だけ書かれてもな
171:デフォルトの名無しさん
09/11/22 11:07:51
C#はCと違って文字列はアドレスはないの?
char *P="もじれつれつ";
みたいなことできない?
172:デフォルトの名無しさん
09/11/22 11:09:56
うん。
173:デフォルトの名無しさん
09/11/22 11:13:21
そうなんだ。不便だのぉ
174:デフォルトの名無しさん
09/11/22 11:17:12
ポインタ管理しなくていいから楽でいいじゃん
175:デフォルトの名無しさん
09/11/22 11:21:37
>>171
ポインタは無いけど、イテレータ(Enumerator)ならあるよ。
ただし、string自体がimmutableなので、読み取り専用になるけど
176:デフォルトの名無しさん
09/11/22 11:21:39
GCって何ですか
177:デフォルトの名無しさん
09/11/22 11:22:43
ググレ
178:デフォルトの名無しさん
09/11/22 11:29:40
エンスーな写真月刊誌
179:デフォルトの名無しさん
09/11/22 12:10:22
C#は、他プロセスにアタッチして、
そのプロセスが持つフォームのタイトルテキストを変更するような
プログラムを作成出来ますか?
180:デフォルトの名無しさん
09/11/22 12:13:32
うん
大抵はDllImport祭りになるけど
181:デフォルトの名無しさん
09/11/22 12:14:59
XPでVistaのガジェットのようにデスクトップに表示するアプリを作りたいのですが
どのようにすればいいのでしょうか
182:デフォルトの名無しさん
09/11/22 12:30:24
作ればいいと思うよ
183:デフォルトの名無しさん
09/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:デフォルトの名無しさん
09/11/22 13:05:34
string や int の性的メソッドを調べてみるべし
185:デフォルトの名無しさん
09/11/22 13:14:19
>>183
Splitかければいい。というか、こんなのは基本だろ?
分割できなかったときは、たぶんこの場合はnullを返すよりは例外を出したほうがいいだろうな。
186:デフォルトの名無しさん
09/11/22 13:16:33
>>183
URLリンク(www.atmarkit.co.jp)
187:デフォルトの名無しさん
09/11/22 13:26:37
unsafeでポインタ使えるから色々試してみるのも面白いよ
splitより簡単にできることはないけど
188:デフォルトの名無しさん
09/11/22 13:33:31
実はただの分割じゃなく数式の解析が目的でしたとかなー
189:デフォルトの名無しさん
09/11/22 13:39:55
>>71で、「ListViewで垂直スクロールバーが出ているかどうか知りたいんですが」ってカキコしたんだが
スルーされてしまったけど、やはり無理?
190:デフォルトの名無しさん
09/11/22 13:45:34
それが人に物を聞く態度か?
191:デフォルトの名無しさん
09/11/22 13:54:07
教えてくれたらロリ画像だします・・・
192:デフォルトの名無しさん
09/11/22 14:02:55
そうしたら通報します・・・
193:デフォルトの名無しさん
09/11/22 14:05:16
>>189
ClientRectangleの外にItem(かSubItem)が存在するかどうかで判定するとか。
…泥臭いやり方だなw
194:デフォルトの名無しさん
09/11/22 14:28:01
>>193
どうもです。ListViewをOwnerDrawしている状態で、ヘッダーの長さを水平スクロールバーの出ない長さに調整したいのですが
縦スクロールバーを考慮いてその分ヘッダの長さを短くすると、バーが出ない時に白く残っちゃうんですよね
これを何とか消したいんですが他のアプローチ考えてみます
195:デフォルトの名無しさん
09/11/22 14:31:55
>>189
ListViewのカスタムコントロール作ったことあるが、そのときはGetScrollBarInfoでやった
表示/非表示を知りたかったわけじゃなく、縦横それぞれのスクロールバーの
自動表示をコントロールしたくて実装した副産物
初心者スレでAPI薦めるってどうよって思ったが、正直ほかの方法は知らない
196:デフォルトの名無しさん
09/11/22 15:01:46
>>195
ありがとうございます。一応サンプル有ったからこれからテストしてみようと思います
URLリンク(www.pinvoke.net)
197:デフォルトの名無しさん
09/11/22 16:32:01
PrintDocumentにて、商品明細書を作成しています。、A4縦の単表に100ほどの項目名称や金額をDrawStringメソッドやDrawRectangleメソッドを併用して記述しているのですが、プレビューが出るのに15秒かかってしまいます
(>_<;)。
項目数が多い場合、これくらい時間がかかるものなのでしょうか…。
皆様はどのような工夫をして、レスポンスを上げていますか?
よろしくお願いします。
198:デフォルトの名無しさん
09/11/22 16:35:50
どのようにしているからレスポンスが遅いのかが分かりません。
各処理の区切りごとに時間を計測してどのボトルネックになている部分をまず探してみてはどうでしょう?
例えばDBからデータの取得が遅いとか色々あると思います。
199:デフォルトの名無しさん
09/11/22 16:37:15
15秒は遅いな
単票なら座標計算に手間取る事は無いだろうから、データ取得あたりで時間掛かってないか見てみた方がいい
200:デフォルトの名無しさん
09/11/22 17:05:30
>>199
ありがとうございます。
データは、今は直接、DrawStringメソッド内に文字列を指定しています。
DrawStringメソッドにて文字列の右揃えや左揃えを細かく指定し、さらに背景にFillRectangleでグレーの網掛けも随所に入れています。
DrawStringメソッドと
DrawRectangleメソッド、
FillRectangleメソッドを
1つの関数に定義して、100項目ほどの文字列の描画について、全てその関数で行う形にしています。
いい方法と思いましたが、項目定義が増えるほど一気に重たくなりました
(T_T;)。
DrawStringメソッドの中でPointのみを指定し、Rectangleを使わないようにした方が軽いかもしるません。
これから随所を削りながら試験してみます。
もし、何かコツなどのご意見がありましたらぜひ教えてくださいっ…!!
201:デフォルトの名無しさん
09/11/22 17:11:35
>>200
どちらかっつーと、データをレンダリングするのより
データを取ってくるのに時間が掛かってるんじゃないかと思うが。
コードの断片ごとに掛かってる時間を計測して、標準出力に出して眺めてごらんよ。
202:デフォルトの名無しさん
09/11/22 17:11:39
たかだか100項目程度のそれで15秒もかかるとは思えない
生で書き込んでるんだったら 適当に文字を置換して晒してみれば?
座標計算の所が気になると言えば気になるけど
203:デフォルトの名無しさん
09/11/22 17:20:59
PDFにしないからだよ
204:デフォルトの名無しさん
09/11/22 17:23:46
>>203 え?
205:デフォルトの名無しさん
09/11/22 17:35:35
>>200
半分の50項目だったら何秒?
半分コメントアウトして試してみて
206:デフォルトの名無しさん
09/11/22 18:04:12
ListViewの話ですが、スクロールバーの検出に成功してカラムの調整まで成功しました
が、水平スクロールバーの再描画というか消えるところまでは出来ませんでした
もう少し頑張ってみます
207:デフォルトの名無しさん
09/11/22 18:41:52
配列と列挙型ってどう違う?
いやまぁ違うところは違うけどさ。
列挙型でできることって配列使っても簡単に同じことできね?
列挙型の存在価値がわからんがなんのためにあるの?
208:デフォルトの名無しさん
09/11/22 18:43:33
全く違うだろう
というかどういうのをして同じことって言うの?
209:デフォルトの名無しさん
09/11/22 18:46:00
配列だと代入できんじゃん
わざわざラップクラス作る?
そのほうが無駄な手間だ
210:デフォルトの名無しさん
09/11/22 18:50:29
>>207, 209
?????
何を言ってるんだ???
211:デフォルトの名無しさん
09/11/22 18:51:44
>>209は>>207に向けてるんだと思う。
212:デフォルトの名無しさん
09/11/22 18:51:55
もう一度教科書読むことを勧める
213:デフォルトの名無しさん
09/11/22 18:53:36
>>211
それはそれでイミフだ
>>207のイミフな発言をどう解釈して>>209の回答になったのかも非常に気になる
214:デフォルトの名無しさん
09/11/22 18:53:38
>>206
194を読まずにレスしたからGetScrollBarInfoっていったけど
本来の目的は横スクロールバーの表示抑制なんじゃないの?
そうであるならイベントハンドラでカラムサイズを調整すれば済むと思うけどダメだった?
215:デフォルトの名無しさん
09/11/22 18:55:58
>>207
列挙型で出来ることを配列で簡単に実現してるケースを知りたいわ
enum Color { Red, Blue, Green };
=
String[] color = {"Red", "Blue", "Green"};
とでも思ってるんだろうか・・・
216:デフォルトの名無しさん
09/11/22 18:56:05
string[] 時間={"あさ","ひる","よる"}
enum 時間 {あさ,ひる,よる}
Now=時間[1];
if(ひるなら)
ほにゃらら
if(Now==時間.ひる)
ほにゃらら
これは何がどうちがうの?
217:デフォルトの名無しさん
09/11/22 18:56:40
>>214
カラムサイズ調整までは何の問題もないけど、リストにロード直後だと再描画してくれませんでした
カラム調整は確認したから大丈夫ですよ
218:デフォルトの名無しさん
09/11/22 19:00:04
>>216
なんで自分で調べないの?
219:デフォルトの名無しさん
09/11/22 19:00:11
>>216
列挙体を関数の引数にした場合、列挙体以外の値以外入ってくる余地無くなるよね
これだけでも全然違うと理解できないかな?
220:デフォルトの名無しさん
09/11/22 19:01:56
>>216
ぜんぜん違うだろ。
時間[1]っての見てだれが"ひる"だってわかんだよ。
それに Now に "まよなか" ってまちがって入れちゃった場合だれが気付いてくれるんだ?
もし時間の種類に "ひづけへんこうせんをこえるまではよるのつもりでいます" なんて長いパターン入れたら
比較に時間かかるわ無駄なメモリ使うわでもったいないよな。
221:デフォルトの名無しさん
09/11/22 19:05:30
>>220
突っ込み所はそこなのか?
>>216は上ではNowに時間[1]ってのを代入してて、下じゃ比較してるだけなんだぞ
222:デフォルトの名無しさん
09/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:デフォルトの名無しさん
09/11/22 19:11:46
お前ら釣りに優しいなw
enum使ってくる時点で初めてではないだろ
224:デフォルトの名無しさん
09/11/22 19:15:19
経験者があの質問するのは釣りでも無理だろ・・・
225:デフォルトの名無しさん
09/11/22 19:17:23
時間.ひる == "ひる" だと思ってるのか?もしかすると。
226:デフォルトの名無しさん
09/11/22 19:20:27
>>205
レスの流れからして、読み込み済みデータで描画して何秒なら分かるが。
227:デフォルトの名無しさん
09/11/22 19:21:06
>>217
いや、なんというかアプローチの仕方が違うんじゃないかなって思ってさ
最初は縦スクロールの表示判定だったけど、その真意は横いっぱいに
表示したカラムのせいでアイテム数が増えて縦スクロールが出ると
結果的に横スクロールバーも出るっていう話ではないの?
そうであるなら、例えば縦スクロールバーのみ出しっぱなしにすれば
処理はシンプルになると思うし、縦スクロールバー隠しておくつもりなら
横スクロールバーは出ないようにしてしまったほうが、カラム調節で
チラツキの押さえ込みと格闘するより楽なんじゃないかなぁと・・・
228:デフォルトの名無しさん
09/11/22 19:26:39
enumすら説明出来ないクズスレ
229:デフォルトの名無しさん
09/11/22 19:29:37
>>226
半分の印刷で、時間が半分になるのか1/4になるのか、まさかの1/9になるのか
と言うことの確認。つまり二重ループ三重ループの疑い。
230:デフォルトの名無しさん
09/11/22 19:35:20
1/9ってなんだオレ…三重なら1/8だorz
231:デフォルトの名無しさん
09/11/22 19:56:13
なんでいちいちちょっとしたことするだけなのに
Mainを意味のないクラスで囲まなければならないんだ!不便!
232:デフォルトの名無しさん
09/11/22 19:58:46
>>205
50項目のときは5秒でした。
サブルーチンの中で
※背景の塗りつぶしが必要ならFillRectangleを実行する。
※文字列を囲むならばDrawRectangleを実行する。
※文字列については常にRectangle構造体の中で水平垂直位置をパラメーターから与える
…これを150項目分行うようにしています。
項目が増えれば増えるほど、倍以上に遅くなっています。
FontなどのオブジェクトのDisposeが足りないのかなと思って直しましたが、結果はやはり15秒弱です。
233:デフォルトの名無しさん
09/11/22 19:59:52
Font?
一項目ごとにフォント読み込んだりしてない?
234:デフォルトの名無しさん
09/11/22 20:06:57
>>231
そこまで考えてるのになんで
ちょっとしたことするだけなのに Main なんて意味のないメソッドで囲まなければならないんだ!不便!
まで発想が飛ばないのかねぇ。
235:デフォルトの名無しさん
09/11/22 20:08:29
どう見ても>>231はわかってる奴の発想だな
>>209にはとても及ばない
236:デフォルトの名無しさん
09/11/22 20:16:45
>>181
237:デフォルトの名無しさん
09/11/22 20:24:43
>>229
え、多重ループの疑いがあったとして項目数減らしても計算量は線形でしか減らないキガス・・・
ああ、そもそもルーチンを何回も何回も呼び出している疑いか。あるね、そんな事。
238:デフォルトの名無しさん
09/11/22 20:25:44
>>227
用途は趣味で作っているメディアプレーヤーだから、1行の時もあれば100行近い場合もあるんですよ
で、曲名のカラムを調整して縦スクロールバーが無い時はいっぱいまでカラムを延ばして
バーが出たらバーの分だけ曲名を縮める。
そうしないと縦スクロールバーが無いとOwnerDrawしたカラムヘッダーの最後が真っ白けになっちまうし、
逆に縦スクロールバーが出ている時に伸ばしたら横スクロールバーが出るのがちょっとウザイ
現状、調整後に横スクロールバーが残っても、縦または横にスクロールした瞬間に消えるんですけどね
239:デフォルトの名無しさん
09/11/22 20:29:26
一回5secとして三回回って15sec。項目半分に減らして2.5secとして三回回って7.5sec。
減らした比率でしか計算量は減らないから、237は勘違い。
240:デフォルトの名無しさん
09/11/22 20:30:52
>>235
しかしながらC++とかに慣れてるとは・・・とてもじゃないが思いにくい
不便とかを超えてもう当たり前になっている所だからぶっちゃけどうでもいい
そして、そんな一か所がなんだってんだ もっといろいろあるだろう orz
241:デフォルトの名無しさん
09/11/22 20:34:40
>>232
1/3だと微妙だけど二重ループの可能性は高いな
ありそうなのは、
項目1つ目の場合は1つ目を描画し、2つ目の時は1つ目と2つ目を描画し…のパターンと
項目1つ描画するつもりが全項目描画している関数を呼び出している…のパターン
242:デフォルトの名無しさん
09/11/22 20:36:07
>>232
disposeしたところでGCに回収してもらわないと意味がない
そんで強制的に回収させてたら余計に遅くなるんではないかと・・・
メモリがないわけではないんなら
ところで150項目てあるけどループ回数は何回?
単純に150?
それとも違う?
1項目は そのサブルーチンを何回使う?
フォントはでいるだけ使いまわしてる?
(例えば明細用を最初に定義して使いまわす)
243:デフォルトの名無しさん
09/11/22 21:04:27
描画するデータをその都度どこかから持ってきてるとかかな
244:デフォルトの名無しさん
09/11/22 21:09:01
スタティック変数使って、何回通ったか数えてみてから考えても良いかも
245:241
09/11/22 21:12:26
オレ算数できてなかったorz
1/3の数の描画で1/3の時間だったら、1項目の描画の途中で変に遅い部分があると言うだけだな
246:デフォルトの名無しさん
09/11/22 21:16:24
>>238
それなら、縦スクロールバーは常に出しっぱなしにして、
横スクロールバーは常に非表示にしておけば一番スッキリするんじゃないの?
少なくともカラムの幅に関係なく横スクロールバーは出ないようにしてしまえば
かなり問題は簡単になると思うんだがなぁ
247:デフォルトの名無しさん
09/11/22 21:16:57
>>232
さっきから埒が明かないな。ソースコードさらしたほうが早いんじゃね?
おそらく相当ひどい実装になってるんじゃないかと予想。
248:デフォルトの名無しさん
09/11/22 21:55:21
>>246
どうもListViewでは、スクロールバー自動と無ししか選択できないみたいです
ShowScrollBarをテストしてみたんですが、無効化されるようですね
他にやり方有りましたら教えていただけませんか?
249:デフォルトの名無しさん
09/11/22 22:01:17
FontオブジェクトやRectangleオブジェクトを生成するのって
そんなに負荷がかかるものなのですか?
明朝体やゴシックが入り混じっているときも、
変更があるときだけ生成し直すのが良策なのかな。
250:デフォルトの名無しさん
09/11/22 22:03:28
Fontはアンマネージリソース抱えてるので特に生成が重い類
Rectangleは構造体だからほとんどノーコストで作れる
251:デフォルトの名無しさん
09/11/22 22:10:22
>>250
アンマネージリソース…?
はじめて聞いた。
クグルとするか
(>_<;)。
252:デフォルトの名無しさん
09/11/22 22:20:52
Fontを150回作るだけで何秒もかかるものでもないんだから、気にするだけ無意味
253:デフォルトの名無しさん
09/11/22 22:22:20
原因でないのは間違いないが普通は避ける
254:デフォルトの名無しさん
09/11/22 22:31:43
>>232
一度FillRectangle、DrawRectangle、DrawStringを全部外して時間を計測してみて
それで1,2秒になるならそのどれが遅いかをどれか一つだけ描画するようにして試して
さっぱり速くならないなら、描画処理以前の問題と言うことで。
255:デフォルトの名無しさん
09/11/22 22:53:47
問題の切り分け方から説明しないといけないのか
言語以前の問題では?
256:デフォルトの名無しさん
09/11/22 22:56:53
>>181
257:デフォルトの名無しさん
09/11/22 23:02:23
>>256
あれ、単なる非矩形ウィンドウだろ。
258:デフォルトの名無しさん
09/11/22 23:06:31
form.FormBorderStyle = FormBorderStyle.None;
form.ShowInTaskbar = false;
はい終わり
259:デフォルトの名無しさん
09/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:デフォルトの名無しさん
09/11/22 23:27:12
>>255
まぁ初心者スレだから・・・・
荒れているC#相談室では叩かれるかもしれんがw
261:デフォルトの名無しさん
09/11/22 23:31:29
>>258
それでWin+Dの時はどうなるのか分かる?w
262:デフォルトの名無しさん
09/11/22 23:39:45
そんな後出し言われてもなぁ・・・。
263:デフォルトの名無しさん
09/11/22 23:44:25
いやガジェットのようにって書いたじゃん・・・
264:デフォルトの名無しさん
09/11/22 23:58:18
でも、Win+D のときの話なんてひとつも書いてないじゃん。
ガジェットのように、なら、JavaScript で実装できること、とかも条件になんの?
265:デフォルトの名無しさん
09/11/23 00:08:19
火病った
きもちわるい
266:デフォルトの名無しさん
09/11/23 00:11:07
>>264
C#スレでJavaScriptとは?
Vistaは使ってなくて、お聞きしたいのですがガジェットはWin+Dでデスクトップから見えなくなる、
つまりWindowStateはMinimizedになるのですか?
267:デフォルトの名無しさん
09/11/23 00:18:11
>>264
いい加減にしろオマエの知識じゃ無理
268:デフォルトの名無しさん
09/11/23 00:37:34
ネイティブC++のDLLを作成→C++/CLIでラップ→C#で参照しています。
ネイティブDLLに含まれる列挙型AをC#で変数宣言しようとすると、
"'AI.Schedule' はアクセスできない保護レベルになっています。"とエラーになります。
これを何とかC#上で利用できるようにする方法はないでしょうか?
269:デフォルトの名無しさん
09/11/23 00:40:21
そのAをどのように宣言しているのか・・・
270:デフォルトの名無しさん
09/11/23 00:47:16
ネイティブの型はC#では扱えない
271:デフォルトの名無しさん
09/11/23 01:00:21
>269
enum A{A1,A2,A3...}; このようなかんじです。
>270
やっぱりそうなりますね。C++/CLIで対応する列挙型を宣言し、
キャストして使うことにします。ありがとうございました。
272:デフォルトの名無しさん
09/11/23 01:34:30
aの文字列の中に、bの文字列が何回入っているか調べて
intで回数を返すメソッドはどうやって作るんですか?
273:デフォルトの名無しさん
09/11/23 02:04:49
string A = "こんにちはああこんにちはあははこんにちは" ;
string[] kugiri = { "こんにちは" };
int i = (A.Split(kugiri, StringSplitOptions.None).Length-1); //3
一例
274:デフォルトの名無しさん
09/11/23 02:31:56
a = "abaababa"
b = "aba"
の結果は普通に3でいいのか?
275:デフォルトの名無しさん
09/11/23 02:36:20
>>273
あー、配列で区切って長さを取得してるんですね。
とても参考になりました。ありがとうございます。
>>274
そうですね。
276:デフォルトの名無しさん
09/11/23 08:40:20
>>272の見てて思いだしたけど
もしString.IndexOf()使って処理する場合は気をつけた方がいいかもね。
URLリンク(blogs.wankuma.com)
URLリンク(d.hatena.ne.jp)
277:デフォルトの名無しさん
09/11/23 08:45:58
>>276
こっちのが良い
URLリンク(d.hatena.ne.jp)
278:デフォルトの名無しさん
09/11/23 08:49:45
>>275
>>273のやり方では>>274は2になるのに気づいているか?
279:デフォルトの名無しさん
09/11/23 10:30:19
FxCop使ってないと絶対気付かんわな
280:デフォルトの名無しさん
09/11/23 10:58:45
>>277
デフォルトのIndexOfはなんであんな変な結果になるんだろな
281:デフォルトの名無しさん
09/11/23 11:05:30
String.ToLowerとかもカレントカルチャで動くから、そうおかしな琴ではないだろう
282:デフォルトの名無しさん
09/11/23 11:08:38
MS自身がおかしな挙動だと思ってるからFxCopで警告出たりするんだろう
283:デフォルトの名無しさん
09/11/23 11:09:00
Console.WriteLine( "AA".IndexOf("〇A") ); // 0
Console.WriteLine( "〇A〇A".IndexOf("AA") ); // 1
これは「〇」がなかったことにされるってことなのかね?
やっぱりよくわかんない・・・
284:デフォルトの名無しさん
09/11/23 11:11:27
うおーうおー
なんで同じことをするのにいくつもやり方があるんだよおおおおおおおおお
285:デフォルトの名無しさん
09/11/23 11:13:53
>>283
それはUnicodeの規格がおかしいのを忠実に実装したらそうなってるだけ
286:デフォルトの名無しさん
09/11/23 11:15:06
>>284
それぞれに顕著な差(状況毎の性能差とか)があればいいんだけど
そんなでもないときは叫びたくもなるわなw
287:デフォルトの名無しさん
09/11/23 11:15:57
>>285
なるほど。実装がおかしいんじゃなくて規格がおかしいのか。
ありがとう!
288:デフォルトの名無しさん
09/11/23 11:21:15
これって最初からそろってるものが高性能すぎて自分で文法を覚えたりクラス作る必要ないね。
最初からそろってるフォーム等のクラスや構造体の使い方覚えるだけで十分そうだ。
289:デフォルトの名無しさん
09/11/23 11:27:14
>>288
いや文法は覚えないと書けないだろw
あと、ポトペタで書く分にはそれでいいかもしれないけど
ちょっと何かしようと思うとすぐクラス書きたくなると思うよ。
290:デフォルトの名無しさん
09/11/23 11:37:00
>>288
そうでもあるし、そうでもない。
またフォームのような基礎的な部品も時々アーキテクチャーが変わったりするから
(System.Windows.Forms→Windows Presentation Foundation)
いつまでも同じ部品を使い続ける、という方針はあまりお勧めできない。
クラスにせよメソッドにせよコードの仕切りに過ぎないので、
分ける必要のないコード量なら分けなくても別にいいし、
分けるべきだと判断すれば分ければいい。
291:デフォルトの名無しさん
09/11/23 11:48:10
>>288
やればわかるけどそれで出来ることには限界があるよ
もっとも、教科書に載ってるようなアルゴリズムの実装なんかは
ほとんどしなくてよくなったとは思う
292:デフォルトの名無しさん
09/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:デフォルトの名無しさん
09/11/23 11:50:47
そんなものはありません
func3を別のクラスに移してください
294:デフォルトの名無しさん
09/11/23 11:50:51
同一クラスの中で把握しきれないようなのならクラスの分割を考えた方がいいんじゃないか
295:デフォルトの名無しさん
09/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:デフォルトの名無しさん
09/11/23 11:55:05
×移譲
◯委譲
でした・・・
297:デフォルトの名無しさん
09/11/23 11:58:07
基本的にはない。クロージャ使うとか、そういうテクニックはあるけど。
298:デフォルトの名無しさん
09/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:デフォルトの名無しさん
09/11/23 12:12:32
委譲の変形パターンだな
300:デフォルトの名無しさん
09/11/23 12:42:21
それ int x; 大丈夫なのか?と思ったら、ラムダ式における変数のスコープって
いう新しい規則で保証されてるのか・・・やっぱラムダ式は敵だ。
301:デフォルトの名無しさん
09/11/23 12:48:25
クロージャはその場限りのコールバックとして使うだけならきちんと理解して使えば全く問題ない
>>298みたいにローカル変数の寿命が延びるような使い方はあんまりよろしくない
302:デフォルトの名無しさん
09/11/23 13:25:33
オブジェクトが生存する限り生存するという、インスタンス変数と
たいして変わんないものなんだけどなぁ。
303:デフォルトの名無しさん
09/11/23 13:32:23
スタックがそのまんま残るとでも思ってるんじゃね
304:デフォルトの名無しさん
09/11/23 13:33:14
クロージャは、俺にとってはあれば便利だけど、なけりゃないで困らない、
ってレベルだなぁ。
305:デフォルトの名無しさん
09/11/23 15:01:57
スレッド活用しようとすると無ければ困る。
306:デフォルトの名無しさん
09/11/23 15:25:11
>>259
色々ありがとうございました。原因がわかりましたので仮の修正で一応動き出しました
原因はItem追加をDrawItemで検出していたんですが、この時はBeginUpdateと
EndUpdateの間である為、数値的にはカラムもクライアント領域の大きさも変更されているのに
描画が更新されないことでした。仮の処理ですがタイマー起動してEndUpdate後にカラムを弄ると
水平スクロールバーを消すことが出来ました
まだ、不具合があるから色々煮詰めないと行けないけど何とかなりそうです
307:デフォルトの名無しさん
09/11/23 15:33:40
研究室の先輩から引き継いだC#のプログラムがあるんですが、当方はQtでC++しか触ったことがありません。
それでこのプログラムを簡単にC++に変換できるのでしょうか?
それとも諦めてC#を覚えた方がいいでしょうか?
308:デフォルトの名無しさん
09/11/23 15:34:42
あきらめた方がいい。
309:デフォルトの名無しさん
09/11/23 15:36:03
C++/QtからC#/WinForms or WPF・・・
簡単にはいかないけど
プログラムが綺麗に作られてるならクラス設計とかはそのまんま引っ越せるとは思う。
310:デフォルトの名無しさん
09/11/23 15:36:52
そういえばQt#ってあったな
今回の話とは一切関係ないだろうけど
311:デフォルトの名無しさん
09/11/23 15:36:59
研究室ならどうせ中身はほとんどベターCだろ
GUI周りだけちょっと練習すれば十分
312:デフォルトの名無しさん
09/11/23 15:59:39
まて、本人がC++の人でソースはC#だ。
313:デフォルトの名無しさん
09/11/23 16:01:05
実際、C++はアセンブラ扱いだから、C#のほうが楽だよ。
314:デフォルトの名無しさん
09/11/23 16:02:26
何を言っているんだ
315:デフォルトの名無しさん
09/11/23 16:28:56
>>306
よかったね
質問と関係ないけど、タイマー使うよりメッセージ投げた方がスッキリするよ
const int LVEX_COLUMNRESIZE = WM_APP + 1; // 独自のメッセージ定義
PostMessage(this.Handle, LVEX_COLUMNRESIZE, 0, 0);
316:デフォルトの名無しさん
09/11/23 16:34:13
・研究室の先輩から引き継いだC#のプログラム
・当方はQtでC++しか触ったことがない
という状況で
A.簡単にC++に変換できるのでしょうか?
B.それとも諦めてC#を覚えた方がいいでしょうか?
という質問に、
C#を覚えた方が楽と薦めてみたんだが・・・どっか勘違いしてるかな?
317:デフォルトの名無しさん
09/11/23 16:35:19
C++がアセンブラ扱いってのが問題発言だろ。
318:デフォルトの名無しさん
09/11/23 16:36:56
C++やっててJavaもやったことあるならすんなりいけるけど
C++だけだとちょっとはまるかもね。
移植するにしてもC#の知識は必要になるから、そのままC#覚えたほうが早そう。
319:デフォルトの名無しさん
09/11/23 16:39:36
覚えたほうが早いに1票
320:デフォルトの名無しさん
09/11/23 16:47:30
>>315
WinForm的にはBeginInvokeだろう
321:デフォルトの名無しさん
09/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:デフォルトの名無しさん
09/11/23 17:03:10
制御のモデルを変える。
メッセージに描画させればいい。
323:デフォルトの名無しさん
09/11/23 17:03:30
固有メッセージ追加とかカスタマイズ用のメソッドとかインターフェースとか
そういうのを追加する。
細かいところのやり方はいろいろだけど。
324:デフォルトの名無しさん
09/11/23 17:04:46
それが一般的な機能なら、クラス側に機能(インターフェイス)を持たせちゃうな。
で。Twitter 用のクラスでは何もしない、と。
特殊な機能なら、UI 側での判定もありじゃない?
325:デフォルトの名無しさん
09/11/23 17:07:56
>>320
同期処理かつメインスレッドが所有するListViewを処理するのに
わざわざ非同期のBeginInvokeはねえよw
EndUpdateまで待つためにlockかWaitHandleまで必要になるぞ
326:デフォルトの名無しさん
09/11/23 17:09:30
>>321
Decorator パターンで考える。
Decorate する必要がない時は空の ConcreteDacorator で代用。
327:デフォルトの名無しさん
09/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:デフォルトの名無しさん
09/11/23 17:13:32
そういうクラスを考えるのは楽しいんだけどさ。
あんまり役に立たないよね。
329:307
09/11/23 17:13:43
とりあえずC#をボチボチ勉強します。
330:デフォルトの名無しさん
09/11/23 17:15:23
>>326
すまん、空の ConcreteDacorator で代用する必要はないか。
ConcreteComponent をそのまま使えばいいんだ。
・・・ってもう解決しそうだから、どうでもいいか
331:デフォルトの名無しさん
09/11/23 17:15:31
>>323
各システム固有の何かをする、ってメソッドを追加する、みたいな解釈でしょうか?
なるほど・・・
>>324
抽象クラスにメソッドを持たせるということですよね。
この場合、特殊な機能が少ないうちは良さそうなんですが、
増えていくと抽象クラスが煩雑になりそうで・・・
#そもそもそんなに特殊機能がばらばらなのを抽象化して良いのか?って問題もあるけど。
>>326
Decoratorパターンを良く理解していないので調べてみます。
デザインパターンちゃんと勉強しないといけないなぁ・・・
332:デフォルトの名無しさん
09/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:デフォルトの名無しさん
09/11/23 17:16:53
>>328
switch とか if 連打の方がわかりやすかったり工数少なかったりするよなw
334:デフォルトの名無しさん
09/11/23 17:19:50
初心者程抽象化したがるからなぁ
335:デフォルトの名無しさん
09/11/23 17:19:58
そこまで拡張する必要性に迫られたことないし
336:デフォルトの名無しさん
09/11/23 17:21:09
この場合の正しい解は、画面側で"is"使ってインスタンス判定、固有の処理をするだよ。
337:デフォルトの名無しさん
09/11/23 17:21:59
仕事がありません
誰か下さい
338:デフォルトの名無しさん
09/11/23 17:24:22
俺の仕事をあげようか
給料は俺がもらっとくけど
339:デフォルトの名無しさん
09/11/23 17:26:25
うーん、何が正しいんだかよくわからなくなってきました・・・
設計難しいなぁ。
泥臭く書くだけならいくらでもできるんだけど
綺麗に書くとなるとさーっぱりだ・・・
こういう場合に >>336 みたいに「こういう場合はこれが正しい」って断言出来るようになるには
どんだけ経験つめばいいんでしょうね。
340:デフォルトの名無しさん
09/11/23 17:27:58
断言したいだけなら、今すぐにもできるだろw
341:デフォルトの名無しさん
09/11/23 17:32:01
>>336 は馬鹿すぎだろいくらなんでも。
オブジェクト指向言語使ってる意味ないよ。
Twitterがverupして機能増えた・・・なんて時に改修場所がいたるところにちらばるでしょ、それじゃ。
ちゅーことで断言するやつは疑ってかかった方がいいんじゃないかと思う。