ふらっとC♯, C#(初 ..
[2ch|▼Menu]
809:デフォルトの名無しさん
07/09/21 23:48:58
>>805
でもVB.NETのソースとか結構読むことあるし

810:デフォルトの名無しさん
07/09/21 23:49:23
foreach( Hage hage in Hoge.Hages){}みたいな感じで使う
HageCollectionクラスを作る必要ができました。

上の方で「なんでList<T>から継承するの? 馬鹿?」みたいな話がありましたが
ICollection<T>とかIList<T>とかから継承して、全部自分で実装するべきなんですか?

List<T>を継承して動作変えたいところだけnewで隠蔽するんじゃ駄目ですか?
(sealedなクラスで他の用途は無いんですが)

811:デフォルトの名無しさん
07/09/21 23:51:59
アンダースコアを付けるのは、 皆がやっているわけではないのですね。

「C#におけるメンバは」 宣言時にアクセス修飾子を省略するとprivateになる、 という理解でよいのでしょうか。

812:デフォルトの名無しさん
07/09/21 23:52:33
Collection<T>使えよ

813:デフォルトの名無しさん
07/09/21 23:55:38
List<T>(たぶん派生したものも同じ)オブジェクトって
publicメンバとして公開してはいけないことになってたような
List<T>はパフォーマンスが目的であってカスタマイズできないからCollection<T>を使えと
MSDNのどっかに書いてあった覚えがある

814:デフォルトの名無しさん
07/09/22 00:00:06
SortとかForEachとかFindとかがList<T>にしかないのが気に食わんけどな
3.5は遠い

815:デフォルトの名無しさん
07/09/22 00:00:43
全部自分で実装するったってList<Hoge>をメンバに持って
そのメソッドを呼び出すだけ
動作変えたいなら変えればいいし
なんでわざわざ制限が多くてわかりにくい継承を使いたがるのかわからん

816:デフォルトの名無しさん
07/09/22 00:01:03
>>810
お作法的にはダメだろうね。

でも所詮一人で書いてるコードで自分で自分の罠に落ちない自信が持てるなら
別にかまわんでしょ。

817:デフォルトの名無しさん
07/09/22 00:01:07
>>811
残念ながら間違い

818:デフォルトの名無しさん
07/09/22 00:18:27
>>817
C#の言語仕様はもっと複雑なのですね。

皆さんありがとうございました。

819:デフォルトの名無しさん
07/09/22 00:28:42
インラインアセンブラが使え無い言語は
基本的に劣っていると考えたい・・・


820:デフォルトの名無しさん
07/09/22 00:29:17
ILGeneratorがあるじゃないか

821:デフォルトの名無しさん
07/09/22 00:31:50
メンバはprivateになるさ

822:デフォルトの名無しさん
07/09/22 00:39:51
VB6からC#へ移行時の質門です。
VB6である行範囲をコピーして別の行範囲にコピーしたいのです。
***VB6のコード:***
Dim oExcel As Excel.Application
Set oExcel = CreateObject("Excel.Application")

oExcel.Workbooks.Open FileName:="C:\TEST\TEST.xls"
oExcel.Application.Sheets("TEST").Select
oExcel.Application.Rows("1:42").Copy oExcel.Application.Rows("43:84")

をC#で置き換えしようと思い以下のように書きましたが
シートの選択の記述が分からなかったのでとりあえずActiveSheetにして
みました。
Excel.ApplicationClass oExcel = new Excel.ApplicationClass();
Excel._Workbook oWB;
oWB = (Excel._Workbook)(oExcel.Workbooks.Open(@"C:\TEST\TEST.xls",
Missing.Value, Missing.Value, Missing.Value, Missing.Value,
Missing.Value, Missing.Value, Missing.Value, Missing.Value,
Missing.Value, Missing.Value, Missing.Value, Missing.Value));
oSheet = (Excel._Worksheet)oWB.ActiveSheet; シート選択わからなかったのでとりあえず
  oExcel.Application.Rows.Copy["1:42"] oExcel.Application.Rows["43:84"]???ここがよく分からない
しかし上記コードでは行範囲コピーでエラーが発生してうまくいきません。
Excel8.0 Object Libraryを参照設定しています。どなたか教えて下さい。

823:デフォルトの名無しさん
07/09/22 00:45:16
>>810
勘違いしてそうだけど継承するのは全然構わないよ、MSのサンプルコードでもやってるし。
ただ、動作を変えるのならnewで隠さず名前も変えろってだけの話。

824:デフォルトの名無しさん
07/09/22 00:49:00
>>811
いい

825:デフォルトの名無しさん
07/09/22 02:00:21
>>819
インラインアセンブラは、言語じゃなくコンパイラの仕様だろ


826:デフォルトの名無しさん
07/09/22 02:52:57
Dは言語仕様にx86アセンブリを含んでるけどな

827:デフォルトの名無しさん
07/09/22 05:39:55
>>800
お前のせいでUFOに誘拐されたアメリカ人の証言が頭の中で舞ってしまったじゃないか

828:デフォルトの名無しさん
07/09/22 11:18:08
Imageクラス(というかGDI+)についての質問です。
あるファイルなりメモリ上のデータなりを、Imageクラスでデコードできるかどうか、を知る方法はないでしょうか。
現在はtryブロック内でImage.From*を使い、例外が発生するかどうかで判断しているのですが、いちいちImageクラスのインスタンスが生成されたり例外が発生したりするので無駄が多いように思いまして……

829:デフォルトの名無しさん
07/09/22 14:12:16
それしかない

830:デフォルトの名無しさん
07/09/22 14:18:19
自力でヘッダ解析するしかないんじゃないかな

831:デフォルトの名無しさん
07/09/22 15:42:53
>>822
((Excel.Range)oExcel.Application.Rows["1:42", Missing.Value]).Copy(oExcel.Application.Rows["43:84", Missing.Value]);
コンパイルエラーと実行時エラーくらいはっきり区別しようよ

832:デフォルトの名無しさん
07/09/22 16:31:50
エクセル操作する部分だけvb.netでライブラリ化した方がいいんじゃない?
>>831に書いてあるような調子のコードってメンテ不能じゃないか?

833:デフォルトの名無しさん
07/09/22 17:46:09
質問です。
Windowsのアドレス帳ファイル(.wab)のバイナリデータを読み込みたいと思っています。
バイナリデータの仕様はどこかで公開されているのでしょうか?
特定のライブラリやAPIがあるようでしたらばそれでもOKです。

834:デフォルトの名無しさん
07/09/22 17:54:56
この辺?

FILE: Windows Address Book (WAB) Documentation
URLリンク(support.microsoft.com)

MSDN Online Web & Internet Samples - WAB Property Inspector Tool
URLリンク(msdn.microsoft.com)

835:833
07/09/22 18:11:32
>>834
ありがとうございます。
軽く目を通したんですが、MS系の開発は初めてで解読できませんでした。
諦めてCSVでエクスポートする方法を提案したいかと思います。

836:デフォルトの名無しさん
07/09/22 19:49:14
どんだけあきらめいいんだよw

837:833
07/09/22 19:53:17
自分、専門はJavaなんでMSDNを読んでいると眩暈がw
そもそも簡単ならやってくれる?程度の優先度低い話なんですよ

838:デフォルトの名無しさん
07/09/22 22:00:38
>>831
ありがとうございます。
もっと勉強します。

>>832
VBの方がやはりいいのでしょうか?
C#からExcelを扱うのは一般ではあまりやらないのでしょうか?

839:デフォルトの名無しさん
07/09/22 22:12:23
VB.NETでもやっぱり面倒だよ
たくさんExcelを操作するコードを書くならVBAのマクロを生成して
それを呼び出すという手もある

840:デフォルトの名無しさん
07/09/22 22:13:52
>>838
エクセルの操縦に限れば遥かに楽だね。
エクセルの設計のいい加減さと、VB.NETの旧VBを引きずってるいい加減さが
親和的なんだよね。

841:デフォルトの名無しさん
07/09/22 22:35:52
List とかジェネリッククラスを継承した場合って、Add とかのメソッドの override が
出来ないのね。知らんかった。
どうしてできないの?

842:デフォルトの名無しさん
07/09/22 22:40:21
委譲するべきだから
ほぼありとあらゆる場合に継承はするべきじゃない

843:デフォルトの名無しさん
07/09/22 22:50:09
.NETではオーバーライドを許可するメソッドは
テンプレートパターンのためのもののみに限定する方針みたいだね
むしろオーバーライドできないのが普通
Collection<T>にはカスタマイズ目的でオーバーライドさせるためのメソッドがあるよ

844:デフォルトの名無しさん
07/09/22 22:50:44
virtualにするとパフォーマンスが落ちるしな

845:デフォルトの名無しさん
07/09/22 22:50:53
C#のフリーコンパイラでお勧めのものを教えてくださいおっ
[条件]
・.NET FRAMEWORK 1.1でコンパイルできるもの
・デバッガ付
・VSに似ているもの


846:デフォルトの名無しさん
07/09/22 22:52:45
なにいってんだこいつ

847:デフォルトの名無しさん
07/09/22 22:54:16
「どんなにくだらないC#プログラミングに関する発言でも誰かが優しくレスをしてくれるスレッド」です。

848:デフォルトの名無しさん
07/09/22 22:55:55
>>845
Visual C# 2005 Express Edition
SharpDevelop

849:デフォルトの名無しさん
07/09/22 22:57:04
>>848

ありがとうございます。
早速さがしてみます。

850:デフォルトの名無しさん
07/09/22 23:49:17
>>840
vb.net使っても開放忘れるとかなりシステムが不安定になったりする。

VBAかVB6のほうがよい。

851:デフォルトの名無しさん
07/09/22 23:56:06
null代入じゃなくてcom開放ね。
上のコードだと、oExcel,oWB,oSheetもちゃんと開放しないといけない。


おまけ。
oExcel.Application.Sheets["TEST"].Select

852:デフォルトの名無しさん
07/09/23 00:00:46
なんかちゃんとラップしないと使い物にならなさそうだな

853:デフォルトの名無しさん
07/09/23 00:02:27
うん。だからあまり使われてない。

854:デフォルトの名無しさん
07/09/23 00:10:12
誰かがラッパー作ってそうだけど見つからないな
中途半端にできるからダメなのか

855:デフォルトの名無しさん
07/09/23 00:17:22
>>850
それ逆だよw
VB6からのエクセルのオートメーション操作は問題多すぎだった。

っていうか、VBAって何を言ってるんだw

856:デフォルトの名無しさん
07/09/23 00:25:46
>>850
そうなのか俺はラッキーだったのか.

VBAでできるものはVBAで。

857:デフォルトの名無しさん
07/09/23 00:25:46
だいぶ飛び飛びだが.NETからExcel/Wordを使う場合の話題はこの辺でされていた。
VB.NET質問スレ スレリンク(tech板:10-38番)


858:デフォルトの名無しさん
07/09/23 00:29:59
じゃあWSHで

859:デフォルトの名無しさん
07/09/23 00:31:03
C#はoperator overloadができるようですが、
「同じオブジェクトを指しているかどうか調べる」には obj1 == obj2 ではダメな場合があるって事ですか?
あと、オブジェクトを特定のブロック内で「確実に」破棄させる(C++のスタックに置いたオブジェクトのように)には、
usingを使えば問題ないのでしょうか。それともtry...finallyでDisposeさせるのでしょうか。

860:デフォルトの名無しさん
07/09/23 00:33:03
はい
条件付はい

861:デフォルトの名無しさん
07/09/23 00:34:50
>>859
==がoverrideされた典型的な例がStringクラス。
imutableクラス以外で==のoverrideはあまり見たことがない。

862:デフォルトの名無しさん
07/09/23 00:35:35
後者はいいえだな

863:デフォルトの名無しさん
07/09/23 00:44:20
オブジェクトの破棄と呼んでいるものは2つの意味を持ってて、
オブジェクトの終了コードの実行とオブジェクトが占有している領域の開放。
C#では領域の開放はあくまでもGCが行う。

864:デフォルトの名無しさん
07/09/23 00:48:05
usingで問題ない
なんだったらコンストラクタを潰して
匿名メソッドでコードブロックを引数にとらないと使えない形にして、
コードブロック終了後Disposeとかすればもっと確実かな

865:デフォルトの名無しさん
07/09/23 10:37:56
基本的に放置するしかないよ
Disposeはあくまでメンバに持ってるアンマネージリソースを開放するためのチャンス

866:デフォルトの名無しさん
07/09/23 11:10:02
StringDictionaryってKeyで指定してValue取り出せないの?
foreach使って取り出す以外使えない?

867:デフォルトの名無しさん
07/09/23 11:14:37
インデクサ使え

868:デフォルトの名無しさん
07/09/23 12:09:20
>StringDictionaryってKeyで指定してValue取り出せないの?
>foreach使って取り出す以外使えない?

どうしてその疑問に行き当たったのか不思議だw


869:デフォルトの名無しさん
07/09/23 12:40:20
>>866
まずはMSDNライブラリくらい見てみたら?
URLリンク(msdn2.microsoft.com)(VS.80).aspx

870:デフォルトの名無しさん
07/09/23 14:28:46
インデクサはItemプロパティで説明されてるから見つけにくいのかもしれんね。
演算子のoverloadもop_Equality のような名前になっている。

871:デフォルトの名無しさん
07/09/23 15:40:12
C#に限った説明じゃないからな

872:デフォルトの名無しさん
07/09/23 16:18:31
ただ、それってDictionaryとかでも一緒じゃん。
なにも考えずに使ったら使えたってなりそうじゃん。


873:デフォルトの名無しさん
07/09/23 16:28:38
なんでインデクサがわからないような人がStringDictionaryのようなマイナーなものを使うに至ったのか気になる
Tips系のサイトで見つけたならそこに使い方も書いてあるはず
もし.NET 2.0ならDictionary<String>が使えるから存在価値は無いね

874:デフォルトの名無しさん
07/09/23 21:35:22
略語に関する質問です。

・CIL⊃MSIL? CIL≒MSIL?
・CLS⊃CLI?

(CLT+CLS+MSIL+JIT)→CLI→CLR≒.net Framework→.NET言語⊃C#?

うち、CLT、MSILおよびCLIから先はMicrosoftが作った用語で合ってますか?

875:デフォルトの名無しさん
07/09/23 21:39:37
CLRはMSによるCLIの実装だったかな

876:デフォルトの名無しさん
07/09/23 22:01:08
>>874
MSILはCILに若干の拡張を加えたもの

877:デフォルトの名無しさん
07/09/24 02:06:43
StringDictionaryよりDictionary<string,string>の方が1.5倍強処理早いね

878:デフォルトの名無しさん
07/09/24 03:00:46
やっぱそうなんか。
StringCollectionよりList<string>の方が速いのは知ってたが

879:デフォルトの名無しさん
07/09/24 03:05:48
StringDictionaryは大小文字を区別しないとかカルチャ意識するとかそういう比較をしてたと思う。

880:デフォルトの名無しさん
07/09/24 03:06:51
C#はパクり元のDelphiみたいに、動的配列や集合型はないの?

881:デフォルトの名無しさん
07/09/24 03:09:58
>>880
そういう質問をするときはまずDelphiの動的配列や集合型の説明をするのが礼儀だよ。

882:デフォルトの名無しさん
07/09/24 03:10:00
パクり元・・・

883:デフォルトの名無しさん
07/09/24 03:11:03
パクリもなにも同じヘジたんだしな。

884:デフォルトの名無しさん
07/09/24 08:56:21
PictureBox ってフォーカスが移動しないのでしょうか?
ボタンなどはフォーカスが移動すると、ボタンの表面に点線が引かれ
フォーカスがある状態になります。
PictureBox にもフォーカスを移動させるにはどうしたらよいでしょうか?

885:デフォルトの名無しさん
07/09/24 09:08:36
フォーカスってのはキーボード入力受付を意味するもんで、絵が入力受け取ってもねぇ?

886:デフォルトの名無しさん
07/09/24 10:21:39
>>885
複数の絵を表示したいので、PictureBox で→を押したら次の絵に進みたいのです。

887:デフォルトの名無しさん
07/09/24 11:14:02
>>886
不可視のコントロール置いて代わりにすれば?

888:デフォルトの名無しさん
07/09/24 11:25:59
>>887
なるほど。
不可視のコントロールをおいて、そこの KeyDown イベントで PictureBox を制御すると。
ところで不可視のコントロールって何を使えばよいのでしょうか?
TextBox.Visible = false;
てな感じかな?

889:デフォルトの名無しさん
07/09/24 11:27:57
form.KeyPreview = true
にして親フォームでキー見たら?

890:デフォルトの名無しさん
07/09/24 11:30:32
カスタムコントロールでSetStyle(ControlStyles.Selectable, true)として
OnPaintを自分で実装したら?
たかが画像一枚描画するだけでしょ

891:デフォルトの名無しさん
07/09/24 11:53:20
どもです。
不可視のほうも、form.KeyPreview = true の方もうまくいきました!
もうちょっと実装を進めて、良いほうを最終的に使いたいと思います。


892:デフォルトの名無しさん
07/09/24 13:10:16
どこからも使われてないprivateメソッドが存在しても、コンパイラは警告も何も言わないんですが、
C#ではprivateメソッドにクラス外からアクセスすることができるって事ですか?
それとも、ただコンパイラが頭悪いだけですか?
C#作った人が前の会社で作った、Pascal風の言語のコンパイラでは、ちゃんと教えてくれるんですが。

893:デフォルトの名無しさん
07/09/24 13:12:59
>>892
リフレクションを使えば、privateメンバにもアクセスできる。

894:デフォルトの名無しさん
07/09/24 13:18:41
クラス外からリフレクションで触られるのはさすがに考慮しなくていいだろうけど
クラス内からリフレクションで触ってるってこともありうる

895:デフォルトの名無しさん
07/09/24 15:13:45
FxCopを使う。いろいろ出すぎてわけわからなくなるけど。

896:デフォルトの名無しさん
07/09/24 16:09:11
ShouldSerializePropertyはprivateが多かったべかな

まあなんにしろFxCopの役割やわなあそれ

897:896
07/09/24 16:13:30
これじゃ分かりにくいべさ。
privateで外部から触られる→ShouldSerializeProperty

898:デフォルトの名無しさん
07/09/24 16:30:00
FormにTextBoxを配置しているのですが、Formの空いた部分をクリックすると
TextBoxの方にフォーカスが行ってしまいます。
普通にFormにもフォーカスを当てたいのですがどのようにすればよいのでしょうか。
MouseDownイベントでFocus()メソッドを呼んでも結果は同じでした。

899:デフォルトの名無しさん
07/09/24 17:15:05
>>898の考える、フォームにフォーカスが当たっている状態、ってどんな状態だ?

900:898
07/09/24 17:52:30
>>899
とりあえずキー入力がFormの方に行く状態と考えてます。

901:デフォルトの名無しさん
07/09/24 20:29:11
>>839
サンプルコードがあるHPとかありまつか?

902:デフォルトの名無しさん
07/09/24 20:37:14
>>どこからも使われてないprivateメソッドが存在してもコンパイラは警告も何も言わないんですが、

そんなことでいちいち報告されたらたまらん。


903:デフォルトの名無しさん
07/09/24 20:42:04
>>892
蛇足な機能はちゃんと削除したという報告ですか
ごくろうさん

904:デフォルトの名無しさん
07/09/24 20:42:30
>>902
それはあんたの発想の方が変だw
もしくは余程物を知らないか

905:デフォルトの名無しさん
07/09/24 20:46:39
どうでもいいと思う俺は技術者に向いてないんだろうか

906:デフォルトの名無しさん
07/09/24 20:59:17
>>904
いつどのようなときにひつようなの?
ひらがなでしつれいします。

907:デフォルトの名無しさん
07/09/24 21:10:26
かいとうがないようだ。
論破!

908:デフォルトの名無しさん
07/09/24 21:11:42
>>892
それがコンパイラの仕事かどうかはしらんがReSharperで警告してくれるよ。
VisualStudioのアドインね。

909:デフォルトの名無しさん
07/09/25 11:25:40
どう考えても意図的に外してるだろ
中の人が何考えて外したのかは知らんが

910:デフォルトの名無しさん
07/09/25 21:16:15
oExcel = new Excel.Application();
// 指定したファイルをオープン
oWorkbook = (Excel.Workbook)(oExcel.Workbooks.Open(@"C:\AAA\AAA.xls,
Missing.Value, Missing.Value, Missing.Value, Missing.Value,
Missing.Value, Missing.Value, Missing.Value, Missing.Value,
Missing.Value, Missing.Value, Missing.Value, Missing.Value));
oSheet = (Excel.Worksheet)oWorkbook.ActiveSheet;
oRange = ((Excel.Range)oExcel.Application.Rows["1:42", Missing.Value]);
oRange.Copy(oExcel.Application.Rows["43:81", Missing.Value]);
oRange1 = (Excel.Range)oSheet.Cells[8, 1];
oRange1.Value ="aaa";
oExcel.DisplayAlerts = false;
oExcel.ActiveWorkbook.SaveAs(strFileName, Missing.Value, Missing.Value, Missing.Value,
Missing.Value, Missing.Value, Excel.XlSaveAsAccessMode.xlNoChange,
Missing.Value, Missing.Value, Missing.Value, Missing.Value);
oExcel.DisplayAlerts = true; //元に戻す
System.Runtime.InteropServices.Marshal.IsComObject(oRange); //oRangeの解放
System.Runtime.InteropServices.Marshal.IsComObject(oRange1); //oRange1の解放
System.Runtime.InteropServices.Marshal.IsComObject(oSheet); //oSheetの解放
System.Runtime.InteropServices.Marshal.IsComObject(oWorkbook); //oWorkbookの解放
oExcel.ActiveWorkbook.Saved = true;
oExcel.Quit(); //Excelを終了する
System.Runtime.InteropServices.Marshal.IsComObject(oExcel); //oExcel を解放
GC.Collect();
上記コードでExcelのプロセスが残ってしまいます。EXE終了するとプロセスは消えます。
COMは解放していると思うのですが・・・どなたか教えて下さい。

911:デフォルトの名無しさん
07/09/25 21:20:05
nullに代入してないぞ!!!
どこかの馬鹿がnull代入必要ないとか逝ってたけど嘘だぞ。

912:デフォルトの名無しさん
07/09/25 21:22:32
nullに → nullを

913:910
07/09/25 21:23:25
>>911
回答ありがとうございます。
最後のところ
System.Runtime.InteropServices.Marshal.IsComObject(oExcel); //oExcel を解放
oExcel = null;
GC.Collect();
としたのですがやはり同じ現象でした。

914:デフォルトの名無しさん
07/09/25 21:24:42
IsComObjectって何だよw
いや「どこかの馬鹿」が言ったのはReleaseComObjectなんてイラネ、でしょ。

しかし、ほとんど嫌がらせに近いコードだな

915:デフォルトの名無しさん
07/09/25 21:24:46
oRange
oRange1
oWorkbook

916:デフォルトの名無しさん
07/09/25 21:26:17
null代入は関係ないだろ常識的に考えて……

>oRange = ((Excel.Range)oExcel.Application.Rows["1:42", Missing.Value]);
とか
>oExcel.ActiveWorkbook.SaveAs(...
あたりに問題ありそう。変数にうけないとまずくない? Excel使ったことないけど。



917:デフォルトの名無しさん
07/09/25 21:28:45
IsComObject?

918:デフォルトの名無しさん
07/09/25 21:28:50
>>916

>GC.Collect();
は無視か?

俺の言ってる馬鹿ってのは…

919:デフォルトの名無しさん
07/09/25 21:32:30
>>911&>>918のことだろ。知ってるよ!


920:デフォルトの名無しさん
07/09/25 21:34:27
URLリンク(blogs.wankuma.com)

921:デフォルトの名無しさん
07/09/25 21:37:32
だからReleaseComObjectなんて要らないってw

922:デフォルトの名無しさん
07/09/25 21:38:24
/// <summary>
/// COM オブジェクトへの参照を解放するプロシージャ(既存のファイルを開く場合も共用)
/// </summary>
/// <param name="objCom"></param>
private void MRComObject(ref object objCom)
{
//COM オブジェクトの使用後、明示的に COM オブジェクトへの参照を解放する
try
{
//提供されたランタイム呼び出し可能ラッパーの参照カウントをデクリメント
if (objCom != null && System.Runtime.InteropServices.Marshal.IsComObject(objCom))
{
int i;
do
{
i = System.Runtime.InteropServices.Marshal.ReleaseComObject(objCom);
}
while (i > 0);
}
}
finally
{
objCom = null;
}
}
上記のメソッドをURLリンク(hanatyan.sakura.ne.jp)(VB版)を見てC#に置き換えたのですが
MRComObject(ref oSheet);とするとオブジェクトの変換ができない旨のエラーが発生します。
VBと違ってC#のobject型は何でも受けることができないのでしょうか?

923:デフォルトの名無しさん
07/09/25 21:42:28
>>914
すみません。
System.Runtime.InteropServices.Marshal.ReleaseComObjectの間違いでした。
でも上記に修正しても駄目でした。

924:デフォルトの名無しさん
07/09/25 21:43:08
ref のせい。いらん。
あと2.0以降ならわざわざループせんでもFinalReleaseComObjectがある。

925:デフォルトの名無しさん
07/09/25 21:44:15
>>921
試してないだろ?

926:デフォルトの名無しさん
07/09/25 21:47:09
>>923
>>920
つまり
URLリンク(jeanne.wankuma.com)


927:デフォルトの名無しさん
07/09/25 21:47:11
EXEを終了させればEXCELのプロセスが消えるのなら大筋は間違ってないと思う。
ファイナライザがあるオブジェクトの場合、
参照が消えてもGC.Collect()1回で回収されるわけではなく大体2〜3回後くらいになる。
目安として、1回目でファイナライザの実行予定としてリストされ、
2回目でファイナライザ実行、3回目でメモリ回収。

928:デフォルトの名無しさん
07/09/25 22:05:17
>>923
FinalReleaseComObjectにしたらいけたよ。

929:デフォルトの名無しさん
07/09/25 22:07:45
>>924
VBの場合Private Sub MRComObject(ByRef objCom As Object)なんですが
参照渡しじゃなくてもいいのでしょうか?


930:デフォルトの名無しさん
07/09/25 22:08:28
でもFinalReleaseComObjectは使っていいのかな?

他のアプリから使っていても大丈夫か?

931:デフォルトの名無しさん
07/09/25 22:12:03
>>928
FinalReleaseComObjectですか!ありがとうございます!

932:デフォルトの名無しさん
07/09/25 22:17:26
>>930
問題ない。
RCWからの参照をきるだけだから。
COMオブジェクトの管理する参照カウンタとは別。

933:デフォルトの名無しさん
07/09/25 22:21:35
>>930
RCWの参照カウンタはCOMの参照カウンタとはべつものなのでその心配はない。
このソースだとoExcel.Application.ほにゃららを無駄に何度も呼んでるから、
ApplicationオブジェクトのRCWのカウンタが1より大きく増えてる可能性があるな。

つかReleaseComObjectを使うなら中間で取得したCOMオブジェクトは全部変数に入れとけ。
こういう書き方をすると捕捉出来ないオブジェクトが無駄に増えてるぞ。
>oRange.Copy(oExcel.Application.Rows["43:81", Missing.Value]); 




934:デフォルトの名無しさん
07/09/25 22:26:59
oRange.Copy(..) はobjectを返すのでちゃんと変数で受けて
あとでReleaseComObjectする必要があるのはわかるか?


935:デフォルトの名無しさん
07/09/25 22:35:10
しかしまあしみじみ.NETでOfficeオートメーションなんかするもんじゃないと思うな

プロセス分けてそっちでやらすか

936:デフォルトの名無しさん
07/09/25 22:35:51
だからReleaseComObjectなんていらんて。
実際やってみりゃ分かると思うが。

937:デフォルトの名無しさん
07/09/25 22:39:49
>>934
すみません。どうしてオブジェクトを返す事が分かったのでしょうか?
私はどんなオブジェクトが返る事が分かりませんでしたし、どんな
オブジェクトかも分かりません(;;)

938:デフォルトの名無しさん
07/09/25 22:46:11
↓null代入とかReleaseComObject要/不要の議論禁止

939:デフォルトの名無しさん
07/09/25 22:48:40
>>937
ならExcelのオブジェクトモデルが分かってないってことで、
それじゃお話にならんのじゃないかい?

940:デフォルトの名無しさん
07/09/25 22:55:55
正直この話はまたかという感じで飽きたな。
VB.NETにCOM専用の参照カウンタGCを搭載すれば問題の大半は解決すると思うのだが。

941:デフォルトの名無しさん
07/09/25 23:11:19
>>939
すみません。VB6のときはあまり気にせずともできてしまったので・・・
オブジェクトはRangeが返ってくるのでしょうか?

942:デフォルトの名無しさん
07/09/25 23:19:22
>>920
むしろこっち。
URLリンク(blogs.wankuma.com)

943:デフォルトの名無しさん
07/09/25 23:20:06
>>941
URLリンク(msdn2.microsoft.com)(VS.80).aspx

944:デフォルトの名無しさん
07/09/25 23:30:41
>>936またおまえか

945:デフォルトの名無しさん
07/09/25 23:32:59
>>926
もうちょっときれいに書けないか?

946:デフォルトの名無しさん
07/09/26 01:01:37
>>910
Excel11 のタイプリブを使ったので若干OpenとSaveAsの引数が増えてる。
ファイル名や範囲もいじってるので注意されたし。
string strFileName = @"D:\AAA\AAA2.xls";
Excel.Application oExcel = new Excel.Application();
//oExcel.Visible = true;
Excel.Workbooks oWorkbooks = oExcel.Workbooks;
Excel.Workbook oWorkbook = oWorkbooks.Open(@"D:\AAA\AAA.xls", 
    Missing.Value, Missing.Value, Missing.Value, Missing.Value, 
    Missing.Value, Missing.Value, Missing.Value, Missing.Value, 
    Missing.Value, Missing.Value, Missing.Value, Missing.Value, 
    Missing.Value, Missing.Value);
Excel.Sheets oSheets = oWorkbook.Worksheets;
Excel.Worksheet oSheet = (Excel.Worksheet) oSheets[1];
Excel.Range oRange0 = oSheet.Rows;
Excel.Range oRange = (Excel.Range) oRange0["1:1", Missing.Value];
Excel.Range oRange2 = (Excel.Range) oRange0["5:5", Missing.Value];
oRange.Copy(oRange2);
Excel.Range oRange3 = oSheet.Cells;
Excel.Range oRange1 = (Excel.Range) oRange3[8, 1];
oRange1.set_Value(Excel.XlRangeValueDataType.xlRangeValueDefault, "aaa"); 
続く


947:946
07/09/26 01:02:46
続き
oExcel.DisplayAlerts = false; 
oWorkbook.SaveAs(strFileName, Missing.Value, Missing.Value, Missing.Value, 
    Missing.Value, Missing.Value, Excel.XlSaveAsAccessMode.xlNoChange, 
    Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value);
oExcel.DisplayAlerts = true; //元に戻す 
oWorkbook.Saved = true;
//oWorkbook.Close(false, Missing.Value, Missing.Value);
//oWorkbooks.Close();
oExcel.Quit(); //Excelを終了する 
Marshal.ReleaseComObject(oRange0);
Marshal.ReleaseComObject(oRange); //oRangeの解放 
Marshal.ReleaseComObject(oRange1); //oRange1の解放 
Marshal.ReleaseComObject(oRange2);
Marshal.ReleaseComObject(oRange3);
Marshal.ReleaseComObject(oSheet); //oSheetの解放 
Marshal.ReleaseComObject(oSheets);
Marshal.ReleaseComObject(oWorkbook); //oWorkbookの解放 
Marshal.ReleaseComObject(oWorkbooks);
Marshal.ReleaseComObject(oExcel); //oExcel を解放 


948:946
07/09/26 01:13:16
oRange.Copy(oRange2) はobjectで実体はboolを
戻してるようなのでReleaseComObjectは不要だった。
もれなくReleaseComObjectするのはたいていのことではない。
あきらめてGCに任せるのもひとつの方法だと考えよう。
VB6ではなぜ出来る限り早くEXCELを開放してしまわないといけなかったか、
.NETではそれが必ずしも重要ではなくなったかの理由は以下を参照されたし。
スレリンク(tech板:37-38番)


949:デフォルトの名無しさん
07/09/26 08:17:10
前々からこれも疑問でしょうがないんだが、
>oExcel.Quit(); //Excelを終了する

これって、まあもちろんエクセルの使われ方にもよるんだけど
ほとんどの場合、ユーザーの使い勝手の観点から言えば不要じゃないだろうか。

というか、こんなことするから「プロセスが残る」なんて問題が起こるんじゃん。

俺はこの手のコード見るたびに、世の中手を動かしてコピペするだけで
頭を使わない馬鹿が多いんだな、と思っちゃうよ。

950:デフォルトの名無しさん
07/09/26 11:07:33
>>934
> oRange.Copy(..) はobjectを返すのでちゃんと変数で受けて
> あとでReleaseComObjectする必要があるのはわかるか?

試しに
ojject oTest;

oTest = oRange.Copy(..) としてみましたが
voidが返ってくる旨のエラーメッセージが出るのですが・・・


951:デフォルトの名無しさん
07/09/26 11:12:24
>>946
ご教授ありがとうございます。サンプル例まで提示して頂いて感謝します。



952:デフォルトの名無しさん
07/09/26 11:32:16
>>950
Excelのversionの違いかもしれんね。
boxingされたSystem.Bool、処理に成功するとTrueが戻ってるよ。
msdnでもobjectが戻ってくることになっている。ただし内容の説明がない。
URLリンク(msdn2.microsoft.com)(VS.80).aspx


953:デフォルトの名無しさん
07/09/26 11:42:03
>>952
回答ありがとうございます。色々難しいですね。

954:デフォルトの名無しさん
07/09/26 12:08:22
>>949
使ったことがないのがみえみえじゃん(笑

Officeのオートメーションは操作自動化のためのインターフェイスで、
手で操作するのと同じことがCOM経由で出来るというもの。
マクロのようにApplication#Visible = trueの表示状態で使うのが本来の使い方なのだと思う。
つまり立ち上げたExcelは別途ユーザーに閉じさせる前提で起動したままにしておくということ。
ただ現実の使われ方はOffice文書を作ったり印刷させたりするため
非表示のまま使用することがほとんどであり、
ユーザーのニーズにOfficeのオートメーションの仕組みがあっていないといえる。


955:デフォルトの名無しさん
07/09/26 12:09:04
お触り禁止

956:デフォルトの名無しさん
07/09/26 12:21:02
>>954
>ただ現実の使われ方はOffice文書を作ったり印刷させたりするため
>非表示のまま使用することがほとんどであり、

なるほど確かにそういう使い方なら意味はある。というか必須だね。
ただそういう使い方が「ほとんど」かどうかは疑問だけど。

957:デフォルトの名無しさん
07/09/26 12:24:23
コメントに文句言ってるのかと思った。
ソースと同内容のコメントは余計だよなあ

958:デフォルトの名無しさん
07/09/26 12:53:25
>>954
本来はという話ならVBAマクロやVSTOのように、
EXCELやWORDの機能を拡張するためのオートメーションなんだろう。
アプリケーションからEXCELを呼び出すのは方向が逆。

959:デフォルトの名無しさん
07/09/26 13:59:47
>>956てか最初からそういう前提の話しかしてないだろ

960:デフォルトの名無しさん
07/09/26 22:46:47
非表示だと動かない機能があって…


961:デフォルトの名無しさん
07/09/26 22:52:03
どんな昨日だよwExcelにそんなの無いだろ

962:デフォルトの名無しさん
07/09/26 23:08:02
あるよ

963:デフォルトの名無しさん
07/09/26 23:11:40
どの機能?

964:デフォルトの名無しさん
07/09/26 23:17:23
プレビュー?

965:デフォルトの名無しさん
07/09/27 22:28:06
非表示でもフォーカス当てたり、アクティブに出来るの?
sendkeys使える?

966:デフォルトの名無しさん
07/09/27 22:50:04
>>965
フォーカス、アクティブ、sendkeysってどういうときに使うの?

967:デフォルトの名無しさん
07/09/27 23:22:38
もうやめとけってw

昔VB6とかからエクセル操作する場合には、操作する対象のオブジェクトは
かならず表示状態にして、かつアクティブにすべし、みたいなことが
「おまじない」的に推奨されてたから、それをいまだに信じている人がいるんだよたぶん。

某花ちゃんなんたらってサイトとか見てみるといいよ。

968:デフォルトの名無しさん
07/09/27 23:37:36
>>967
ド素人にVB6でExcel操作させると、画面のリフレッシュとかプログレスバーの表示なんて処理を考えずに作るから
固まってるかどうか判別しにくくなるだろうから表示状態にするのは正解かもね
.netでも非表示にさせると偉い目にあいそう

969:デフォルトの名無しさん
07/09/28 00:28:17
office2007ってファイル出力にXMLが選択できるそうだが
中身解析すれば手軽に直接ファイル生成ができると思っておk?

970:デフォルトの名無しさん
07/09/28 00:54:57
仕様が公開されてるでそ

971:デフォルトの名無しさん
07/09/28 01:11:52
おkじゃない


972:デフォルトの名無しさん
07/09/28 01:16:45
XPSのこと?あれは複雑っぽいな。

973:デフォルトの名無しさん
07/09/28 03:11:54
xml+圧縮かかってたような

974:デフォルトの名無しさん
07/09/28 11:34:10
Office Open XMLだろ
ほんとにただのXML

975:デフォルトの名無しさん
07/09/28 12:12:01
ただじゃないxmlてどんなん?

976:デフォルトの名無しさん
07/09/28 13:40:48
docxやxlsx

977:デフォルトの名無しさん
07/09/28 14:17:55
Panelコントロールについての質問なんですが、
AutoScrollをtrueにしたPanelをDock.FillでFormに置き、
Panel.ClientSizeChangedでサイズを変更するようにした幅がPanelClientSize.Widthな
コントロールをPanelの中に置いたのですが、Formを最大化後に元に戻すと
ちゃんとClientSizeChangedが発生し、コントロールのサイズも変わってるにもかかわらず
横スクロールバーが表示されてしまいます。
コントロールのLeftは0で、横にスクロールしてもWidthがPanelのサイズをオーバーしてる
とは思えません。
WndProc()でWM_RESTOREを拾ってリサイズしても変わりませんでした。

このPanelの横スクロールバーを消すにはどうしたらいいでしょうか?

978:デフォルトの名無しさん
07/09/28 19:50:42
class MyClass : IMyInterface
とするとき、

object obj = new MyClass();
MyClass my = (MyClass)obj;



IMyInterface interface = new MyClass();
MyClass my = (MyClass)interface;

って速度変わらないですかね?

979:デフォルトの名無しさん
07/09/28 19:50:46
で、結局どうなんよ
直接ファイル生成できそう?
それとも無理?
2007使ってる香具師回答きぼんぬ

980:デフォルトの名無しさん
07/09/28 19:58:55
速度気にするんなら通常のキャストじゃなくて as キャストだろ

981:デフォルトの名無しさん
07/09/28 20:03:10
>>980
asって値型だと型が合致しなかった場合はdefault(struct)になるんですかね?

982:デフォルトの名無しさん
07/09/28 20:33:06
ならない。
Nullableな値型ならnullが返される。非Nullableな値型ならコンパイルエラー。

983:デフォルトの名無しさん
07/09/28 20:45:28
>>979
Office System 互換機能パックで 2003でもいけた。 hoge.xmlで保存してちょ。
<?xml version="1.0"?>
<?mso-application progid="Excel.Sheet"?>
<Workbook xmlns="urn:schemas-microsoft-com:office:spreadsheet"
 xmlns:o="urn:schemas-microsoft-com:office:office"
 xmlns:x="urn:schemas-microsoft-com:office:excel"
 xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet"
 xmlns:html="URLリンク(www.w3.org)
 <Worksheet ss:Name="XmlSheet">
  <Table>
   <Row>
    <Cell><Data ss:Type="Number">1</Data></Cell>
    <Cell><Data ss:Type="Number">2</Data></Cell>
   </Row>
   <Row ss:Index="3">
    <Cell><Data ss:Type="String">aaa</Data></Cell>
    <Cell><Data ss:Type="String">bbb</Data></Cell>
   </Row>
  </Table>
 </Worksheet>
</Workbook>


984:983
07/09/28 20:47:53
あらかじめExcelで雛形作っておいて部分的に書き換えるのがよさそう。
テンプレートエンジンがあれば使えそうだ。

985:デフォルトの名無しさん
07/09/28 22:33:34
つかただのxmlスプレッドシートで事足りんじゃねーの?

986:デフォルトの名無しさん
07/09/28 22:35:01
っていうよりただのxmlスプレッドシート?
互換パックすらいらないんじゃ…


987:デフォルトの名無しさん
07/09/28 22:35:42
>>986

988:デフォルトの名無しさん
07/09/28 23:11:50
>>980
as キャストの方が早いの?

989:デフォルトの名無しさん
07/09/29 00:43:12
次スレ余路。

990:デフォルトの名無しさん
07/09/29 02:08:18
>988
asの方が早いし型が違う場合に例外が飛ばずにnullが返る。
キャストで型が違って例外が飛ぶと結構重いし。
でも、ダウンキャストしなくても済むようにインターフェースを作る方がいいんじゃない?

991:デフォルトの名無しさん
07/09/29 02:51:50
>>980があほなんだろ。


992:デフォルトの名無しさん
07/09/29 02:54:15
>asの方が早いし型が違う場合に例外が飛ばずにnullが返る。
asのが早いってそんな違いがあるの?
例外とぶって飛ばなきゃ使う側でNullReference〜になるかチェックが必要になるわけで
正しい型が入っているはず、という状況なら普通のキャストの方がまだ望ましい動きじゃないかい?


993:デフォルトの名無しさん
07/09/29 03:28:45
>992
正しい型が必ず入ってる場面ではチェックは不要なんだからasの方が速いのでasを使う。
違う型のものが入ってるかもしれない場面でダウンキャストするってのは何か作りがおかしいので考慮する必要ってあんまりないと思うよ。

994:デフォルトの名無しさん
07/09/29 03:41:11
msdnをみるとis演算子の分asの方が命令数が多いように見える。
>as 演算子はキャストと似ていますが、変換エラーの時に、
>例外を発生せずに null を返す点が異なります。次に式の形式を示します。
>expression as type
>これは、次と同じ意味になります。
>expression is type ? (type)expression : (type)null


995:994
07/09/29 03:59:31
IL上は1命令違うだけで差はなかった。
IL_0002:  isinst     A
IL_0002:  castclass  A

996:デフォルトの名無しさん
07/09/29 04:09:22
結局asは早くも遅くもないのか

997:デフォルトの名無しさん
07/09/29 04:15:58
じゃあ、Delphiのasはキャストより速いの?遅いの?

998:デフォルトの名無しさん
07/09/29 06:59:24
>違う型のものが入ってるかもしれない場面でダウンキャストするってのは
>何か作りがおかしいので考慮する必要ってあんまりないと思うよ。

だからこそキャストで例外になるようにするんじゃねーかよ。
まあNull参照例外でも似たようなもんではあるけど、
キャスト例外のがまし。


999:デフォルトの名無しさん
07/09/29 07:00:16
>正しい型が必ず入ってる場面ではチェックは不要なんだからasの方が速いのでasを使う。

asの方が早いってのは思い込みじゃねーのか?といってる。


1000:デフォルトの名無しさん
07/09/29 07:08:03
is演算子が面白い。
o is CLASS1 が o as CLASS1 != null と同じコードを吐いている。

1001:1001
Over 1000 Thread
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。


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

4623日前に更新/255 KB
担当:undef