C#, C♯, C#相談室 Pa ..
[2ch|▼Menu]
720:デフォルトの名無しさん
08/06/05 13:52:18
>>719
こういうこと?
streamReader.BaseStream.Seek(0, SeekOrigin.Begin);


721:デフォルトの名無しさん
08/06/05 13:54:51
>>712
アウトラインのことなら、編集 - アウトラインで

722:719
08/06/05 14:00:03
>>720
おお!!出来ました!助かりました!
ありがとうございます!


723:デフォルトの名無しさん
08/06/05 14:16:28
優先度の問題。
そんな細かい話を気にする必要があることだってあるが、
現実には引っかかるのはもっと別のところであることがほとんど。
もっと気をつけるべきとこは他にいっぱいある。
ってだけの話、無意味とは言わん。


724:デフォルトの名無しさん
08/06/05 14:19:08
だろうね。 大概解ってるだろ。
俺、>709って初見じゃないもん。 定期的に湧く厨だと思った。

725:デフォルトの名無しさん
08/06/05 14:19:37
条件分岐の効率なんて、文字列処理一発でも挟まれば全く無意味。
だから処理効率より設計の方を重視する方がいい、ほとんどの場合は。


726:デフォルトの名無しさん
08/06/05 14:24:24
>>724
誰かさんはこの程度でベンチテスト毎回やるんだと言ってるから相当優先度が高いんだろ
解ってるとは思えん

727:デフォルトの名無しさん
08/06/05 14:29:50
次のようにXMLファイルを読み込もうとしてるのですが、
どうやら読み込みに失敗している環境があるらしいのです。
if (File.Exists(Directory.GetCurrentDirectory() + "\\" + "data.xml") == true)
{
 Type[] et = new Type[] { typeof(Data) };
 System.Xml.Serialization.XmlSerializer serializer = new System.Xml.Serialization.XmlSerializer(typeof(ArrayList), et);
 using (System.IO.FileStream fs = new System.IO.FileStream(Directory.GetCurrentDirectory() + "\\" + "data.xml", System.IO.FileMode.Open))
 {
  DataList = (ArrayList)serializer.Deserialize(fs);
 }
}
そこでまず、本当にXMLファイルの読み込みに失敗しているのかメッセージボックスでチェックしたいのですが、
try
{
 using (System.IO.FileStream fs = new System.IO.FileStream(Directory.GetCurrentDirectory() + "\\" + "data.xml", System.IO.FileMode.Open))
 {
  DataList = (ArrayList)serializer.Deserialize(fs);
 }
}
catch
{
MessageBox("読み込み失敗");
}
こんな風に書いちゃってもいいのでしょうか?

728:デフォルトの名無しさん
08/06/05 14:32:37
その時も文字列処理を引き合いに出してたな。
だいたい、その辺りにC#の用途の向き不向きボーダーラインがあるんかな。
More Effective C++みたいなイメージでは不毛と。

729:デフォルトの名無しさん
08/06/05 15:00:24
>>727
肝心の例外情報握り潰したら話にならんだろ
つか今時CurrentDirectoryかよ

730:デフォルトの名無しさん
08/06/05 15:02:22
>729は catch の後ろに何もない事を言っている様だ。
try .. catchのヘルプに戻ろう。

731:デフォルトの名無しさん
08/06/05 15:35:17
CurrentDirectoryの何が悪いのかわからん。
まさかレジストリやマイドキュメントに保存するのか?W

732:デフォルトの名無しさん
08/06/05 15:39:09
カレントにするやつは無知か手抜きだろ

733:デフォルトの名無しさん
08/06/05 15:46:27
exeのフォルダならともかく、
カレントは起動方法によって変わるから問題だろ
元々そういう仕様なら関係ないけど

734:デフォルトの名無しさん
08/06/05 15:46:32
カレントディレクトリがショートカットとかで変更されたらどうするんだ?

735:デフォルトの名無しさん
08/06/05 15:49:56
俺の負けだ。 言わせてくれ。
そこは

   throw; //スルー

だろ。
俺は敗者だ。 だけどなんかスッキリした。

質問者おいてこぼりだが、確かに>728の模範解答は期待。

736:727
08/06/05 15:54:41
聞きたいのはCurrentDirectoryのところではなく、
usingステートメントをtryで囲んでもいいのかな?と思ったのです。

読み込み失敗時の例外情報はヘルプでFileStreamを調べたのですが例外の種類がわかりませんでした。
例外の種類はどうやって調べたらいいんでしょうか?

737:デフォルトの名無しさん
08/06/05 16:00:52
起きえる例外がわからなければSystem.Exceptionで受ければいいだろ。
起きる例外はMSDNに載ってると思うけど。

738:デフォルトの名無しさん
08/06/05 16:13:54
MSDNでFileStream コンストラクタ (String, FileMode)を引いたら例外の種類が書かれていました。
try
{
 using (System.IO.FileStream fs = new System.IO.FileStream(Directory.GetCurrentDirectory() + "\\" + "data.xml", System.IO.FileMode.Open))
 {
  DataList = (ArrayList)serializer.Deserialize(fs);
 }
}
catch(System.Exception e)
{
 MessageBox(e.ToString());
}
としましたが、usingをtryで囲ってもいいのかが知りたいです。


739:デフォルトの名無しさん
08/06/05 16:15:36
どうして駄目だと思った?

740:727
08/06/05 16:31:25
>>739
usingステートメントって例外が起きた時にステートメント内のdisposeを保証してくれるんですよね。
なのでtry句が複雑にネストしてしまう気がしたからです。
例外が自分の環境でも再現出来ればいいのですが、
他人の環境なので再現できないので、メッセージボックスを仕組んで原因を調べようかなと思いました。

741:デフォルトの名無しさん
08/06/05 16:43:55
try句が複雑にネストしてしまう、の意味が分からない。

742:デフォルトの名無しさん
08/06/05 16:45:18
usingをtry-finallyに展開してみる。
try { 
 readonly System.IO.FileStream fs = new System.IO.FileStream("data.xml", System.IO.FileMode.Open);
 try { DataList = (ArrayList)serializer.Deserialize(fs); }
 finally { fs.Dispose(); }
} catch(System.Exception e) { 
 MessageBox(e.ToString()); 
} 
usingではcatchしてないからDeserializeで例外が起きた場合は外側のtry-catchブロックが補足する。
問題になるとすればcatchの段階でまだ開いている状態のfsにアクセスしたい場合。
Deserializeとfs.Dispose()の両方で例外が起きた場合。
こういったことが気になるなら、usingを使わずtry-catch-finally構造に変える。

743:デフォルトの名無しさん
08/06/05 16:50:38
蒸し返してすまんが、CurrentDirectoryでひとこと。
コンソールアプリならカレントディレクトリは普通に使う。
GUIの場合は意味がない。
exeのあるディレクトリがカレントディレクトリであると考えているなら明らかに間違い。

Directory.GetCurrentDirectory() + "\\" + "data.xml", 
この部分は余計。相対パスならカレントからの相対パスになるので
"data.xml"
だけでで十分。

744:727
08/06/05 17:04:26
>>742
分かりやすい説明ありがとうございました。

>>743
参考になりました。ありがとうございます。

745:デフォルトの名無しさん
08/06/05 17:21:07
>>742
>Deserializeとfs.Dispose()の両方で例外が起きた場合。
キャッチされるのは後からの例外の方だったよね?

746:デフォルトの名無しさん
08/06/05 20:00:17
質問させていただきます。
フォーム上に画像を表示するプログラムを書きたいのですが、
イベントとして、フォームが表示されたと同時に描画したいのです。
このような場合、イベントはどのように記述すればよいのでしょうか。
もしくは、イベントを使わない方法があればそちらもご教授ください。

747:デフォルトの名無しさん
08/06/05 21:01:16
GUIのプログラムの中で
GUIとは何の関係もないオブジェクトAが居ますが
デバッグ用途でGUIのとあるメッセージウィンドウに文字列を出力させたいとします。
オブジェクトAのようなGUIに無関係なオブジェクトが大量に居るような場面で
それらの出力文字列をGUIのとあるメッセージウィンドウに文字列を出力させたいわけですが。
どうやってそのオブジェクト達とメッセージウィンドウ間をインターフェイスさせればよいでしょうか?
Qtをちょこっと触ったことがあるのですが、その場合はsignal/slot機構を使って、わりと簡単に実現できたのですが
C#の場合はsignal/slotの代わりにeventを使うことになるかと思います。
eventの型となるdelegateをどこで宣言するかなぁ〜と考えるのですが、
どこにも宣言したくありません。
どうすればいいですか?


748:デフォルトの名無しさん
08/06/05 21:50:02
メッセージ表示するもしくは通知するTraceListenerでも作ればいいんでない?


749:デフォルトの名無しさん
08/06/05 22:16:43
>>735ってどういう意味?

750:デフォルトの名無しさん
08/06/05 23:15:02
>>743
逆に言えば、カレントディレクトリがexeのあるディレクトリであることを
プログラム側で保障すれば問題ないということでもある

まあ、その場合でも相対パス使うだろうから、
Directory.GetCurrentDirectory()は不要だけどな

751:デフォルトの名無しさん
08/06/05 23:18:57
>>750
Open/Saveダイアログを使うとカレントディレクトリが動いたりしなかったっけ。
以前はまった記憶がある。

752:デフォルトの名無しさん
08/06/05 23:37:16
ていうか、おまいらデリゲート使うときに毎回宣言してるの?
自分はDelegate<Result,Param1>とか宣言しといて全部それつかってる。
おかげでFuncとどう整合性とろうか思案中だがなぁorz

753:デフォルトの名無しさん
08/06/05 23:42:08
イベントハンドラはEventHandler<TEventArgs>使え

754:デフォルトの名無しさん
08/06/05 23:59:49
outやrefに対応できないんだよな…


755:デフォルトの名無しさん
08/06/06 00:05:31
class Reference<T> { public T Value { get; set; } }
こんなの作っとけば

756:750
08/06/06 00:07:58
>>751
確かに、FileDialog使うときは

RestoreDirectory = true

にしないとまずいな
てか、既定値がfalseとかありえん

757:デフォルトの名無しさん
08/06/06 00:48:22
>>755
世の中そうもいかんこともあるのよ。
リモーティングとか。


758:デフォルトの名無しさん
08/06/06 01:29:58
>>752
まさにこういう使い方をするために、宣言時に識別子を省略出来たらいいのに。

759:デフォルトの名無しさん
08/06/06 04:03:17
>>754
それは知恵が足りないだけ。
できるよ。

760:デフォルトの名無しさん
08/06/06 07:08:25
マルチプルアイコンを含むIconインスタンスから、各アイコンを取得したいのですが、
どうすればよいのでしょうか。

761:760
08/06/06 07:46:58
自己解決しました。
Icon.Save()でバイナリデータを得て、それを分割した上でIconコンストラクタに与えればいいですね。
もっとスマートな方法がありそうな気もしますが、とりあえずそれでいきます。

762:デフォルトの名無しさん
08/06/06 09:30:47
コンストラクタでSize指定だけはできる

763:747
08/06/06 12:09:04
>>753
>>イベントハンドラはEventHandler<TEventArgs>使え

どうもです。
こういうのがあるんですね。
ただこれだとEventArgsカスタムクラスをどこかで定義しなければならないです。
EventArgsカスタムクラスに依存するのがなんだかシャクなんで。

たとえば
talkerインターフェイスを用意するとして

interface ITalkter{
        public delegate void printf(string fmt,prams object[] args);
}

こういうことができたら、
ITalkerを継承したクラスを作ってしまえばそれでOKなんですけど
ITalkerインターフェイスに依存するのは納得できるんで。
ただ、interfaceでは型宣言出来ないらしく。。。
なんで出来ないんだろう。。。。
ちなみにtalkerは大量に居ます。
listenerは1個だけっていう想定。

何かいい方法はありませんか。


764:747
08/06/06 12:19:13
もしくは
public event void delegate(object sender,params object[] arg) printf;
のような感じで
名無しの型を宣言すると同時に変数定義みたいなことができたらそれだけでいいですね。
こういうことって可能なんでしょうか?


765:デフォルトの名無しさん
08/06/06 12:25:10
interface ITalkter{
 string PrintString{ get; }
}

こうとか

interface ITalkter{
 void Print(Action<string> print);
}

こうとか

interface ITalker{
void Print(IListener listener);
}

こうとかじゃだめなの?

766:デフォルトの名無しさん
08/06/06 12:46:17
DebugListener/TraceListenerで十分だと思うけど。

767:デフォルトの名無しさん
08/06/06 13:27:34
>>763
talkerの役割がよくわからないな。
実際に表示する部分なのか、それともメッセージを発行する元なのか?
それからdelegateをeventと1対1で作らなければいけないとか思ってないか?

768:デフォルトの名無しさん
08/06/06 14:49:41
>>761
P/InvokeでExtractIconExとか。

769:デフォルトの名無しさん
08/06/06 17:41:02
EventHandler<TEventArgs>を使いたくないのだったら、普通にAction<T>でも使うってのは?
オブジェクトAの中に
public event Action<string, object> printf;
を実装する。

これならカスタムクラス使わんで済むでしょ。

770:デフォルトの名無しさん
08/06/06 23:54:33
>>747>>764
デリゲートを使うにはデリゲート型が事前に作成されている必要がある
また、匿名メソッドやラムダ式を使った場合でも、型が自動的に作成されることはない

なので、君がやりたいと考えていること(デリゲートを使用して云々)は恐らく不可能

まあ、本来の目的からすると、出力タイミングをGUI側で制御するなら>>765
オブジェクト側で制御するなら

interface ITalker {
  void SetPrintCallback(Action<string> print);
}

もしくは

interface ITalker {
  void SetListener(IListener listener);
}


>>769
void (object sender, T e) where T : EventArgs

に合致しないデリゲートをイベントにするのはやめれ
# MSのガイドラインなんて知らん、というなら止めはしないが

さらに言うと、
・デリゲート型の名前のサフィックスは EventHandler
・第2パラメータの型(上記 T)の名前のサフィックスは EventArgs
・2つのパラメータ名は上記の通り(sender, e)

771:デフォルトの名無しさん
08/06/07 00:33:51
正直msのガイドラインなんか知ったこっちゃ無い


772:デフォルトの名無しさん
08/06/07 00:55:01
なら使うな

773:デフォルトの名無しさん
08/06/07 06:58:46
ここはCompact Frameworkの質問はおk?

774:デフォルトの名無しさん
08/06/07 07:01:03
だから使わないんだって

775:デフォルトの名無しさん
08/06/07 07:01:24
C#にからめればOK

776:デフォルトの名無しさん
08/06/07 07:03:46
Compact FrameworkでWindows Mobile用2chブラウザを作ってるんだが、
スレ一覧にListViewを使ってるんだ。
ListViewItemCollectionにAddRangeが無くてforeachでスレデータ回してアイテム作ってAddさせてるんだが
どうにも低速なんだ。
AddRangeの代わりになるものは回してAdd以外ないだろうか。

777:デフォルトの名無しさん
08/06/07 07:19:17
BeginUpdateやってる?

778:デフォルトの名無しさん
08/06/07 07:20:04
>>777
やってる。

779:デフォルトの名無しさん
08/06/07 07:53:10
ListViewへの追加はPCでもかなり遅いからなあ
1000件くらいになりそうなときはVirtualModeにしてるけど、Compactじゃ使えないのか

780:デフォルトの名無しさん
08/06/07 07:55:15
>>779
2chの板のスレ一覧データだし、700項目くらいPCでやった場合ドパァッって表示されるんだがなあ。
VirtualはCFからは使えないな。

781:デフォルトの名無しさん
08/06/07 08:36:09
自分で擬似的なものを描画するのが一番速いのかな

782:デフォルトの名無しさん
08/06/07 08:56:03
MSのガイドライン無視したクラスライブラリって見てて恥ずかしい

783:デフォルトの名無しさん
08/06/07 09:15:58
Formの上でGridクラス作ったが、20万件でも一瞬で追加・表示されるようになった(´・ω・`)

784:デフォルトの名無しさん
08/06/07 09:17:25
ListViewってMSの中の底辺プログラマが作ったんだろうか

785:デフォルトの名無しさん
08/06/07 11:12:31
作ったのがだいぶ昔のことで、
ここまで大量のデータが取り扱われるとは考えられなかったからだと思う。

786:デフォルトの名無しさん
08/06/07 11:29:20
描いた円を上キーでジャンプさせるにはどうすればいい?

787:デフォルトの名無しさん
08/06/07 11:41:02
意味が分かりませんがKeyDownイベントでそういう処理書けばいいんじゃないでしょうか

788:デフォルトの名無しさん
08/06/07 11:54:23
いや、そのKeyDownの中身が分からなくって

789:デフォルトの名無しさん
08/06/07 11:56:34
KeyDownイベントの中身で円を描く場所を変えて描画処理に投げる

790:デフォルトの名無しさん
08/06/07 11:56:35
円をどうやって描いてるかジャンプってどういう意味なのか分からなくって

791:デフォルトの名無しさん
08/06/07 11:58:45
プログラミングが下手な人って質問も下手だよね

792:デフォルトの名無しさん
08/06/07 12:00:20
ダブルバッファにしろよ
画面ちらつくぞ

793:デフォルトの名無しさん
08/06/07 12:20:11
上向きの初速を与えて、一定の下向きの加速度を受けながら運動するようにしたい。
例えば、20進んで一瞬停止して、15進んで一瞬停止して、の繰り返しでいいのか

794:デフォルトの名無しさん
08/06/07 12:26:27
v = v0 + gt と言う式を当てはめれば良いだけじゃん

795:デフォルトの名無しさん
08/06/07 12:32:28
↑アホ

796:デフォルトの名無しさん
08/06/07 12:37:46
tをどうすれば?

797:デフォルトの名無しさん
08/06/07 12:40:12
タイマーでも使ってろ

798:デフォルトの名無しさん
08/06/07 12:48:39
変数tを入れれば位置まで出せる公式があったろ
リアルにやるならtをタイマーを使って現実時間とぴったり合わせりゃいい

799:デフォルトの名無しさん
08/06/07 14:58:07
加速度を9.8/sずつ減らせばいいんでね?

800:デフォルトの名無しさん
08/06/07 15:15:33
p0 : 初期位置
v0 : 初期速度
g : 重力加速度(約-9.8)
p(t) : 初期時刻からの経過時間tの時の位置

p(t) = p0 + v0*t + 0.5*g*t*t

801:デフォルトの名無しさん
08/06/07 15:23:50
つかいつの間に重力加速度の話になったんだ

802:デフォルトの名無しさん
08/06/07 15:44:46
>>800
それをwhileに入れれば出来そうだけど、ジャンプ中も左右移動したい

803:デフォルトの名無しさん
08/06/07 15:46:52
なんかこのスレ方向性分かんなくなってきたなw


804:デフォルトの名無しさん
08/06/07 15:55:23
ジャンプ中左右移動したいなら

new Timer( () =>
{
 位置更新
 描画
});

void KeyDown(...)
{
switch(key)
case ←:
   左にちょっとずらす
...
}
こんな感じで出来るのかな
普通は
while(true)
{
入力ゲット
 位置更新
 描画
 時間が来るのを待つ
}
こんな感じなのかな
よく知らん

805:デフォルトの名無しさん
08/06/07 16:46:12
>>802
物理的に表現したいならこんな感じです

a:加速度 v:速度 p:位置 dt:微小時間
とすると、こういう微分方程式が成り立ちます

v(t)/dt = a
p(t)/dt = v(t)

dtはゲームなら1フレームの時間(約16.7ms)と考えるのが普通です
この式を例えば前進差分(ぐぐってね)で微分項を近似するとこうなります

( v(t+dt) - v(t) ) / dt = a
( p(t+dt) - p(t) ) / dt = v(t)

t+dt時間における速度と位置を知りたいので式を変形します

v(t+dt) = dt * a + v(t)
p(t+dt) = dt * v(t) + p(t)

この式をゲームのプログラムなんかではこう表現します

void Update( float dt )
{
 velocity += dt * acceleration;
 position += dt * velocity;
}

で、左右移動したいとき、というのは速度に値が加えられている状態なんで、
velocityに対して基本速度を加えておけばOKです


806:デフォルトの名無しさん
08/06/07 16:51:23
って書き終わって凄く後悔した
スレ違いにもほどが

807:デフォルトの名無しさん
08/06/07 19:23:48
>805はY方向だけなので、Xは別にしないとだめだぞ。
横への移動を表す加速がY方向へは関係しないとき、XとYは独立して扱えるからよい子のみんなは気をつけよう。

808:デフォルトの名無しさん
08/06/07 19:40:07
気をつけるまでも無く自明だと思うのですが!

809:デフォルトの名無しさん
08/06/07 21:07:23
型を書いてないからアレだけど
ベクトル型を使うのが普通なんで

810:デフォルトの名無しさん
08/06/08 10:51:16
過疎

811:デフォルトの名無しさん
08/06/08 11:54:09
IDEの使い方に関するおすすめの書籍は?

812:デフォルトの名無しさん
08/06/08 17:17:44
ListViewで特定のカラムだけ非表示にすることは出来ますか?
リストには追加するのに非表示にするという、一見無意味な操作なのですがそうしたいのです。

813:デフォルトの名無しさん
08/06/08 18:36:00
>>812
ListViewのColumnHeaderで特定のカラムだけWidth=0にすることが出来ませんか?
リストには追加するのに非表示にするという、一見無意味な操作なのですがそうしたければそうすることもできるでしょう。

814:デフォルトの名無しさん
08/06/08 19:05:09
>>813
非表示にしたいカラムだけ幅調整不可って出来ますか?
Widthを0にしただけでは幅調整されて見えてしまうので・・・。

815:デフォルトの名無しさん
08/06/08 20:00:43
ListViewItemから派生させたクラスで持つようにして
そのオブジェクトをListViewに追加すれば?

816:デフォルトの名無しさん
08/06/08 20:12:26
つかTagで十分だろ

817:デフォルトの名無しさん
08/06/08 21:27:03
>>815
なるほど。ありがとうございます。
>>816
Tagは使ったこと無いので調べてきます。
ListViewの方ではなくListViewItemの方ですよね?

818:デフォルトの名無しさん
08/06/08 22:33:03
ColumnResizingとかそんな感じのイベントあるから、
そこで非表示にしたいカラムが幅調整されそうになったら制限すればいい。

819:デフォルトの名無しさん
08/06/08 22:34:14
>>818
なるほどありがとうございます。
Tagを使ったものがまさに用途にあった使い方でした。

820:デフォルトの名無しさん
08/06/09 10:09:01
スレリンク(tech板)

821:デフォルトの名無しさん
08/06/09 12:07:21
メソッド呼び出し中にキー入力を受け取るにはどうすればいいですか?

822:デフォルトの名無しさん
08/06/09 12:16:03
>>821

メソッド呼び出しを別スレッドにして、メインスレッドでキー入力を
待てばいいんじゃない? 全然はずしてたらご免。

823:デフォルトの名無しさん
08/06/09 12:17:01
モードレスダイヤログ?

全然外してるかも。

824:あにす ◆sGTL1yK0.6
08/06/09 18:46:26
DoEvents()?
外してるかな…。

825:デフォルトの名無しさん
08/06/10 05:54:09
>>702
for (int i=0; i<1000; i++) Hoge((a) => a + 1);
のようなコードは次にように最適化されるようだ。
HogeDelegate f = null;
for (int i=0; i<1000; i++) {
 if (f == null) { f = (a) => a + 1; }
 Hoge(f);
}

826:デフォルトの名無しさん
08/06/10 06:30:01
>>825
ということは>>702はデマってことか

827:デフォルトの名無しさん
08/06/10 07:01:43
デマというかもうちょい境界線が上なんだろうな。

828:デフォルトの名無しさん
08/06/10 11:32:48
質問
以下のようにListのSyncRootで排他処理を行っている最中に
Listの実体を入れ替えた場合、
この排他でLock開放待ちをしていたほかのスレッドはどうなるのでしょうか?
lock (((ICollection)(mylist).SyncRoot)[

if(xxx){
mylist = new List();
}
}


829:デフォルトの名無しさん
08/06/10 12:23:17
とりあえずそんなキモいことするな

mylistの置き換えより先に別スレッドがmylist.SyncRoot取得してたら古い方でロック待ちするし
置き換え後にSyncRoot取得したら新しい方でロック待ちする
古い方でロック待ちに入ったらロック取得したスレッドのlockステートメント終了でロックに入る
新しい方ならロックされてないから待たないでそのままロック取得するだろう

830:828
08/06/10 12:45:29
やっぱり駄目ですよね。
コレでは排他処理の意味をなさない。

わかりました!!有難う御座います。


831:デフォルトの名無しさん
08/06/10 21:33:47
ListViewのTagで思い出したが、なんでシリアル化してもTagは保持されないのですか?

832:デフォルトの名無しさん
08/06/10 21:51:45
何が入ってるか分からないから
保持しても意味がないものが入ってるかもしれないから

833:デフォルトの名無しさん
08/06/10 22:53:07
あまり納得できんが、そういうことなんだと納得しておきます。

834:デフォルトの名無しさん
08/06/10 23:06:12
ADO.NET 2.0で、System.Data.SqlClientを使って、バッチ処理ってどうやんのが普通なの?
なんかSqlCommandSetってのが昔はあったらしいけど、今は隠されてしまったみたいだし、
ていうか、
var cmd = new System.Data.SqlClient.SqlCommand();
cmd.CommandText = "begin transaction;" +
"insert into t values(1,2,3);" +
"insert into t values(2,3,4);" +
....
"commit transaction;";
みたいにカンマで区切っただけのSQL文でも一応できたみたいなんだけど、
C#/ADO.NET2.0/SQL Serverでほかの人はどういう風にバッチ処理してるのか知りたいです。

835:デフォルトの名無しさん
08/06/10 23:19:11
ストアドプロシージャです。

836:デフォルトの名無しさん
08/06/10 23:21:23
リンクの冒険

837:デフォルトの名無しさん
08/06/10 23:30:44
>>835
お返事ありがとうございます。
ところで、クライアント側でユーザーが複数項目を選んで、
編集して、それで更新みたいな処理の流れだと、可変引数が
使えないストアドでは対応しきれないのでわないでしょうか?

838:デフォルトの名無しさん
08/06/10 23:40:52
>>836
えーと……ゼルダの伝説?

それはともかく、C#のバージョンが分からんが3.0ならLINQがおすすめ
GUIでD&Dするだけでエンティティクラスが作れて、デフォルトでトランザクション処理

LINQ to SQLがSQL Server限定なのがあれだけど

839:デフォルトの名無しさん
08/06/11 14:58:07
>>837
「バッチ処理のパラメータを格納しておくテーブル」を作るという手もある。
そのテーブルにINSERTしてからバッチ用のストアドプロシージャを起動して、
ストアドの中でテーブルを読み込んで、それを元に処理を行う。
結果のサマリーも格納するようにすれば、バッチ処理の履歴も兼ねることができる。

840:デフォルトの名無しさん
08/06/11 20:40:20
C#中でエクセルのファイルを開こうとすると、下記のエラーが発生します。
ちなみに.NET Framework 2.0を使っています。

System.Runtime.InteropServices.COMExeption(0x80040154):CLSID{00024500-0000-0000-C000-000000000046}を含むコンポーネントのCOMクラスファクトリを取得中に、次のエラーが発生しました。:80040154
3台あるPC(XP)で1台で起こりますがその原因が分かっておりません。
作成したプロジェクトのbin\release以下には3個のCOMと関係がありそうなDLLがあります。
・Interop.Excel.dll
・Interop.Microsoft.Office.Core.dll
・Interop.VBIDE.dll
これら3個を
C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\RegAsm.exe
を使って登録しても結果は同じです。
どういった原因が考えられるでしょうか?



841:デフォルトの名無しさん
08/06/11 21:21:57
そこにはExcelがインストールされていないなんてオチじゃないよな。

「00024500-0000-0000-C000-000000000046 80040154」でググって
最初に出てきたところに書いてあった事例がまさにそうだっただけだけど。
URLリンク(forums.msdn.microsoft.com)

842:840
08/06/11 21:26:24
確認させていただきたいのですが、
Excelがインストールされていない環境では、COMを通じたエクセルファイルの操作というのはやはり出来ないものでしょうか?
というのは、
動作確認をした3台のうち
1台にだけExcelをインストールしていたつもりだったのですが、実際には2台にインストールされており、
上記の
System.Runtime.InteropServices.COMExeption(0x80040154):CLSID{00024500-0000-0000-C000-000000000046}を含むコンポーネントのCOMクラスファクトリを取得中に、次のエラーが発生しました。:80040154
このエラーはエクセルがインストールされていないパソコンでだけ起こっていました。
レジストリのCLSIDに無理やりエクセルを登録たところエラーが変わって
System.IO.FileNotFoundException: CLSID {00024500-0000-0000-C000-000000000046} を含むコンポーネントの COM クラス ファクトリを取得中に、次のエラーが発生しました: 80070002。
   場所 NFSAutoGui.Tettou.product(String path)
こういうことになってしまいました。
FileNotFoundExceptionってようするにExcel.exeが見つかりませんよ、ということかと思いますが。

ということで
Excel.exeがインストールされていない状態では、COMを通じたエクセルファイルの操作というのはやはり出来ないものでしょうか?


843:デフォルトの名無しさん
08/06/11 21:31:00
>>842
そりゃ、できんわな。それができたら、みんなExcel買ってくれなくなってMSが困っちゃう。

844:デフォルトの名無しさん
08/06/11 21:36:37
>>841
>>843
どうも。。。
インストールしてないつもりのPCで動いたと思ってたんで動くかと思っていました。
アホ過ぎ。

ところで
Excelのバージョン10が開発マシンに入っております。
COMの参照設定で、Microsoft Excel 10.0 Object Library のバージョン1.4を設定しているのですが、
これで配布した場合って、Excelのバージョン10.0が入っていないと動かないんですかね?
Excel 2007しか入っていないようなPCでは動かないんですか?


845:デフォルトの名無しさん
08/06/11 21:43:55
>>842
だって、そのExcelファイルの操作って、
Excelが持っている機能を呼び出しているだけだ。
普段目にするUIはExcelの1つの顔にすぎない。

846:デフォルトの名無しさん
08/06/11 21:59:28
>>844
YES

847:デフォルトの名無しさん
08/06/11 22:01:05
解放忘れとかやりまくってそうだな

848:デフォルトの名無しさん
08/06/11 22:10:55
こんなこと言ってる奴がまともに作れてるわけないだろ

でバージョン依存したくないならせめてVB.NETにしとけ

849:デフォルトの名無しさん
08/06/11 22:15:41
WSHのVBSとか呼び出すのが楽だよ

850:デフォルトの名無しさん
08/06/11 22:19:02
>>845
そういうことですね。
>>846
了解しました。
>>847
一応タスクマネージャのプロセスタブにEXCELは居ないので大丈夫かと...

ところで、
開発マシンにEXCEL10しか入っていませんが、
その他のバージョンのEXCELも扱いたい場合に必要になってくるのが
PIAとかいうものなのでしょうか?


851:デフォルトの名無しさん
08/06/11 22:40:52
YES

852:デフォルトの名無しさん
08/06/11 22:42:04
あんたは質問を有料にしたいわ

853:デフォルトの名無しさん
08/06/11 23:58:05
DateTime型のToString()の書式設定はどんな環境の場合に変わるんでしょうか?
たとえば("d")ならカルチャによって変わりますが、
カスタム書式の("yyyy/MM/dd")も環境によって変わるようです。
どんな環境で変わるんでしょうか??

854:デフォルトの名無しさん
08/06/12 00:37:13
>>853
質問の意味がよくわからないけど「カルチャが異なる環境で変わる」ということが聞きたいのかな。
CurrentThreadのCurrentCultureとかCurrentUICultureとかを色々変えながら動かしてみると
わかりやすいかもしれない。
わかりにくいかもしれない。

855:デフォルトの名無しさん
08/06/12 00:37:53
カルチャによって変わるよ。

"/" はカルチャ依存の日付区切り文字だし、
この世には和暦とかヒジュラ暦とかあるだろ。

856:デフォルトの名無しさん
08/06/12 00:47:15
>>854-855
ありがとうございます。
"/"はカルチャ依存なのですね。
カスタム書式なら"/"も表示してくれると思っていたのですが、それすらも期待してはいけないのですね。
自分の環境では再現できない&相手の環境がよくわからないので質問しました。
では"yyyyMMdd"ならどの環境でも期待通り"20080612"になることを前提にしていいのでしょうか?

857:デフォルトの名無しさん
08/06/12 01:11:03
>>856
>>855の最後の行を読んで下さい><

DateTimeFormatInfo.InvariantInfoわたしとけばいいよ。

858:デフォルトの名無しさん
08/06/12 01:17:15
>>856
CultureInfo ci = new CultureInfo("ja-JP", true);
ci.DateTimeFormat.Calendar = new JapaneseCalendar();
Thread.CurrentThread.CurrentCulture = ci;

Console.WriteLine(DateTime.Now.ToString("yyyyMMdd")); // 200612
Console.WriteLine(DateTime.Now.ToString("yyyyMMdd", DateTimeFormatInfo.InvariantInfo)); // 20080612

859:デフォルトの名無しさん
08/06/12 01:17:26
>>857
なるほどありがとうございました!
yyyyでも和暦だと20とかになるんですね。
DateTimeFormatInfo.InvariantInfoで解決しました。

860:デフォルトの名無しさん
08/06/12 01:18:12
>>858
ありがとうございました。勉強してみます。

861:デフォルトの名無しさん
08/06/12 04:18:07
Compact FrameworkのWebBrowserでDocumentTextにHTML設定するとプログレスバーが出てくるのが嫌なんだけど
非表示にする方法はあるだろうか?
それともHtmlView.dllをラップしたほうが賢明だろうか

862:デフォルトの名無しさん
08/06/12 11:14:25
できるだけメモリ使用量を減らすため、
IDisposableを実装したほうが良いクラスの判断でまよっています。

クラスA DataSetをプロパティとして保持
クラスB stringをプロパティとして保持
クラスC byte配列をプロパティとして保持

クラスAはDisposeメソッドを用意してデストラクタから呼び出していますが、
クラスBとCもDisposeを用意したほうが良いでしょうか?

また、stringやbyte配列はDisposeメソッドがないので、どうやってメモリを解放するのかもわからないです。

863:デフォルトの名無しさん
08/06/12 11:38:41
全部IDisposable無用

864:デフォルトの名無しさん
08/06/12 11:48:12
Disposeを実装するのは、自前でネイティブリソースを扱う時か
Disposeを持つクラスをメンバとして持つ時だけで良い。

それ以外ではメモリの開放はGCにまかせた方が一般的にパフォーマンスは高い。
なんとなくメモリは少ないほうがいいよね的な考えしかないなら逆効果にしかならんよ。

性能を犠牲にしてでもどうしても局所的にワーキングセットの縮小をせまられるのなら
参照をnullにしてGC.Collectを呼び出す。


865:862
08/06/12 12:58:06
>>863-864
ありがとうございます。

なるほど、ではどうしても実装するならクラスAだけで
良いのですね。

Webアプリなのですが、特定のページにアクセスが集中し
使用メモリが大きくなってしまうので、できるだけ解放できるところは
解放したかったのです。

処理終了時にGC.Collectを呼び出すことにします。

866:デフォルトの名無しさん
08/06/12 13:22:05
GCでオブジェクトが回収されるときの動作は
1 デストラクタ(ファイナライザ)があればそれを実行する
2 メモリの回収
Disposeは1を代行するもので、メモリの回収はあくまでもGCが行う。

867:デフォルトの名無しさん
08/06/12 14:22:22
質問
RichTextBoxに画像を挿入したいんですが、無理?

868:デフォルトの名無しさん
08/06/12 14:27:55
とりあえずクリップボード越しなら可能

869:デフォルトの名無しさん
08/06/12 14:35:42
>>868
サンプルコード貼ってある所知りませんか?

870:デフォルトの名無しさん
08/06/12 14:41:09
検索エンジン様が知ってることを知ってる

871:862
08/06/12 17:31:00
>>866
ありがとうございます!
だいぶ勘違いしていました。
デストラクタでDispose呼んでも意味ないのですね。

872:デフォルトの名無しさん
08/06/12 23:05:15
え、デストラクタとGCは関係ないんだと思ってた…。
じゃあデストラクタが実行されるタイミングってスコープを抜けた瞬間とは限らないの?

873:デフォルトの名無しさん
08/06/12 23:10:28
C#でデストラクタ?

874:デフォルトの名無しさん
08/06/12 23:13:38
>>872
全然関係ない。スコープと一致させたいときにはusingを使わないといけない。
逆に言えばそれがIDisposeとusingの存在意義。

>>873
まあC# 1.0のころはデストラクタって言っていたはずだし、いいじゃないか。

875:デフォルトの名無しさん
08/06/12 23:16:20
DisposeとGCも全く関係ないよ
種も仕掛けもない本当にただの普通のメソッド

876:デフォルトの名無しさん
08/06/12 23:18:11
あ、そっか。C#はデストラクタなんてほとんど書かないや。

877:デフォルトの名無しさん
08/06/12 23:20:35
本当にどうしてもどうしても必要な場合でなければむしろ書いてはいけない

878:デフォルトの名無しさん
08/06/12 23:56:46
IDisposeを実装するときの基本パターン

class DispBase : IDisposable {
 ~DispBase() { Dispose(false); }
 public void Dispose() { Dispose(true); System.GC.SuppressFinalize(this); }
 public virtual void Dispose(bool disposing) {
  if (disposing) { }
 }
}

GCとの関係といえばこの命令だけ。
System.GC.SuppressFinalize(this);
後片付けが終わったからファイナライザは呼び出さなくていいとGCに指示している。
これでファイナライザは呼び出されなくなる。

879:デフォルトの名無しさん
08/06/13 00:03:21
パフォーマンスとかメモリとかやたら気にする奴が
こういうでたらめやって事態を悪化させやがるんだよな…

GC呼ぶなんてやめとけよ、特にWebではな…


880:デフォルトの名無しさん
08/06/13 00:05:54
余計な一言はいいから、ね

881:デフォルトの名無しさん
08/06/13 00:07:23
いつでも回収できるメモリは空いていると同じということを理解できるまでには修行が必要じゃて
セッションにでっかいオブジェクトの参照抱え込んだままで、GC.Collect呼びまくるとかやってそう

882:デフォルトの名無しさん
08/06/13 00:08:02
これくらい言っとけばたまたま見かけて疑問を持つ奴が増えて好都合

883:デフォルトの名無しさん
08/06/13 00:12:21
そういやあれ不思議なんだよな。
メモリとか異様に気にするのにセッションとかは湯水のように平気で使うのな。


884:デフォルトの名無しさん
08/06/13 00:21:12
結局、明確にスコープ抜けたときにリソースを即座に解放して欲しいという場合で複数から参照されてる場合には参照カウント的なものが必要になるんだ世根(´・ω・`)

885:デフォルトの名無しさん
08/06/13 00:27:41
COM InteropのRCWがそういう具合になってますね。
もう少しスマートにできなかったものか。

886:デフォルトの名無しさん
08/06/13 18:37:51
ファイル書き込みじのフォーマットのことですが。
下記プログラムを実行すると。
=====================
static void Main(string[] args)
{
    StreamWriter sw = new StreamWriter("test.txt",false,Encoding.GetEncoding(932));
    sw.WriteLine("{0,10} => {1}","ABCD",1234);
    sw.WriteLine("{0,10} => {1}","あいうえ",1234);
    sw.Close();
}
=====================
結果として
=====================
      ABCD => 1234
      あいうえ => 1234
=====================
こういった出力になります。
説明を添えると、
ABCDの前に半角スペース文字6文字
あいうえの前に半角スペース文字6文字。
という出力結果になります。

理想としては、
ABCDとあいうえの右端をそろえたいので
あいうえの前に半角スペース文字2文字が入って欲しいのです。(あいうえは8文字とみなす。)

そのようなことは可能でしょうか?
どのようにすれば可能でしょうか?



887:デフォルトの名無しさん
08/06/13 21:34:01
URLリンク(unicode.org)

ここに、UnicodeにおけるCJKの表示幅の規定があるから、
適当に文字列の表示幅を計算して残りを埋めれば良い

888:デフォルトの名無しさん
08/06/14 06:42:57
>>886
つまり、いわゆる全角文字を半角文字2文字分として処理したいってことか?
Encoding.GetByteCount()で、各文字コードにおけるバイト数が得られるから、
Shift-JISにおけるバイト数を使ってスペースの文字数を計算すればいいだろう。
こんな感じで。

Encoding sjisEnc = Encoding.GetEncoding(932);
string text = "あいうえ";
string space = new String(' ', 10 - sjisEnc.GetByteCount(text));
Console.WriteLine("{0}{1} => {2}", space, text, 1234);

889:デフォルトの名無しさん
08/06/15 14:35:46
インストーラーの起動条件でJ#2.0再配布パッケージを
必須にする方法教えて下さい。

890:デフォルトの名無しさん
08/06/15 15:12:29
スレ違い

891:デフォルトの名無しさん
08/06/15 17:16:12
いや 殆どC#で一部だけJ#使ってるんすよ…

892:デフォルトの名無しさん
08/06/15 17:17:38
いや、その理屈はおかしいだろ…

893:デフォルトの名無しさん
08/06/15 20:01:44
その発想はなかったわ
ってかVSスレで聞いたら?

894:デフォルトの名無しさん
08/06/15 20:03:22
ほい 逝ってきます。
すまぬかった

895:デフォルトの名無しさん
08/06/16 12:56:58
delegateを使用して(使用しなくても同様のことができればいいのですが・・・)

using System;
using System.Collections.Generic;

delegate int getItem();

class DelegateTest
{
public static void Main()
{
List<int> liList = new List<int>();
getItem a = new getItem(A);
a += new getItem(B);
a += new getItem(C);

liList.Add(a());
}

static void A(){return 1;}
static void B(){return 2;}
static void C(){return 3;}
}

この様なプログラムを走らせてliListに[1,2,3]が入って欲しいのです。
(当然ながらというか、)実際には[3]しかはいりません。
マルチキャストデリゲートにしたのは実行したいメソッドの数が実行時にしか分からず
できればif文分岐を少なくしたいと思ったからなのですが、
やはりメソッドを一つ一つ実行しなければ無理でしょうか?
もしくはメソッドの戻り値をリストにして、そのリストを次のメソッドの引数をリストにして、最後にaddrangeでしょうか?
何か上手いテクニックがあれば、どなたかご教授下さい。


896:デフォルトの名無しさん
08/06/16 13:04:03
普通にgetItemコレクション作ってforeachでList<int>にAddしてけばよくね?

897:デフォルトの名無しさん
08/06/16 13:09:34
デリゲートの引数にコレクション渡してAddしてもらえば?

898:デフォルトの名無しさん
08/06/16 14:14:43
>>895
複数の、戻り値を持つデリゲートを一括で管理したい場合は、
マルチキャスト- ではなく、デリゲートのコレクション/リスト などを使う

例えば、こんなふうに

var funcs = new List<Func<int>> { A, B, C };
var values = funcs.Select(f => f()).ToList();

あと、A,B,Cはvoidじゃなくてintな

>>897
それだと、仕様外の操作(複数追加、Insert、Clear、etc.)まで出来てしまうのであまり良くない
自分しか触らないから何でもいいっていうなら構わないけど

899:デフォルトの名無しさん
08/06/16 15:34:56
add/remove付きのイベントにしてしまえばマルティキャストっぽく見せられるかも
List<getItem> evlist = new List<getItem>();
public event getItem ItemsEvent {
  add { evlist.Add(value); }
  remove { evlist.Remove(value); }
}

this.ItemsEvent += () => 1;
this.ItemsEvent += () => 2;
this.ItemsEvent += () => 3;
evlist.Select(f => f()).ToList();

900:デフォルトの名無しさん
08/06/16 19:01:37
>>897の考え方が一番正当でしょ
コレクションをそのまま渡すんじゃなくて,値を登録するためだけのクラスを作って引数に渡す

901:900
08/06/16 19:05:54
考え方は,ってだけだよ
マルチキャストは使うのはあんまり良くないかも

902:895
08/06/16 20:14:14
皆さんレスありがとうございます。
とりあえずはコレクションを引数に渡すやり方で実装できました。
ラムダ式を使った方法を教えてくださった898,899さんのやり方は
ちょっと理解ができませんでした・・・申し訳ありません。
デリゲートのコレクションは使ったことがないので勉強してみたいと思います。


903:デフォルトの名無しさん
08/06/17 01:28:26
ITfMessagePump(TSFのInterface)をC# Formアプリで使ってる人いる?
メッセージループが競合してどうすりゃいいか、分からんのだが・・・。

904:デフォルトの名無しさん
08/06/17 01:32:33
いません

905:デフォルトの名無しさん
08/06/17 02:39:48
そうか。だよなー。

906:デフォルトの名無しさん
08/06/17 02:53:11
>>903
ご想像通りメッセージループを自前のものに置き換えるしかない。

907:デフォルトの名無しさん
08/06/17 03:09:54
その方法を知りたいな

908:デフォルトの名無しさん
08/06/17 03:26:33
>>907
メッセージディスパッチャに関してはP/Invokeで動くというか、
普通にITfMessagePump::GetMessage[A,W]でメッセージ取ってきて
P/InvokeでDispatchMessageすればおk。
必要ならWinFormのApplicationクラスのソースでも眺めて見れ。
折角公開されたんだし。WPFももう公開されたんだっけ?
WPFアプリケーションでWinFormsを併用するときのドキュメントも参考になるかも。

というかメッセージディスパッチャにWPFのApplicationクラスを使いつつ
WinFormsを表示するのが楽かもしれんな。XP以降専用になっちまうが。

あとはExecutionContextの実装もちゃんとやっておくとベター。

909:907
08/06/17 03:29:53
>あとはExecutionContextの実装もちゃんとやっておくとベター。

SynchronizationContextの間違い。すまそ。
URLリンク(msdn.microsoft.com)

910:デフォルトの名無しさん
08/06/17 03:31:08
ぐあ
909==908ね。

911:908
08/06/17 04:00:28
実際試してみた。WPFのApplicationクラスでWinForms。
一応動くことは動くみたい。
この方法ならWPFのSynchronizationContextが使われるので
SynchronizationContextはそのままでOK、なはず。
---------------
// PresentationFramework.dll
// System.Windows.Forms.dll
// WindowsBase.dll
using System;
static class Program
{
  [STAThread]static void Main(){ new CustomApplication().Run(); }
}
public class CustomApplication : System.Windows.Application
{
  protected override void OnStartup(System.Windows.StartupEventArgs e)
  {
    base.OnStartup(e);

    var form = new System.Windows.Forms.Form()
    {
      Width = 640,
      Height = 480,
      Text = "Test Window",
    };
    form.Disposed += (_o, _e) => this.Shutdown();
    form.Show();
  }
}

912:デフォルトの名無しさん
08/06/17 04:03:10
>>908
ありがと。
Application.csは見ていて、FPushMessageLoopでGetMessageWしてるのは確認したんだが、
ThreadContextの処理と整合性を取りつつも、
ITfMessagePump::GetMessageする確実な手段が分からなくてね。

ThreadContext周りの処理はinternal/privateがひしめいていて、
うかつに手を出せないし、お手上げ状態。

WPFは要件的に採用は厳しいかな。

いずれにせよ、overrideなり、Filter的なものでGetMessegeを自前の処理を行う仕組みはなさそうだね。

>普通にITfMessagePump::GetMessage[A,W]でメッセージ取ってきて
>P/InvokeでDispatchMessageすればおk。
おkな理由を教えてもらえると嬉しいな。

913:デフォルトの名無しさん
08/06/17 04:24:01
>>912
>おkな理由を教えてもらえると嬉しいな。

PresentationFramework.dllが中でやっていることがまさにそれだから、で説明になる?
System.Windows.Threading.Dispatcher.PushFrameImplおよび
System.Windows.Threading.Dispatcher.GetMessageと全く同じことをすれば動く。
で、納得してもらえるんだろうか……

914:デフォルトの名無しさん
08/06/17 10:36:47
たとえばNetworkStreamのBeginReadでAsyncCallbackを指定したとする。

このコールバック中にEndReadで例外が発生したらアプリが強制終了してしまう。

この例外をメインスレッド、少なくとも呼び出したスレッドで処理するにはどうすればよろしいでしょうか?

915:デフォルトの名無しさん
08/06/17 10:42:52
例外を補足できない?

916:デフォルトの名無しさん
08/06/17 14:27:34
>>914
Windowsアプリなら、Control.BeginInvokeでEndRead呼べば
発生する例外もメインスレッドの管轄になるはず
ただ、例外チェインの最後のエラーしか取れないかも

コンソールアプリならしらね


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

4197日前に更新/244 KB
担当:undef