[表示 : 全て 最新50 1-99 101- 201- 301- 401- 501- 601- 701- 801- 901- 2chのread.cgiへ]
Update time : 08/16 23:53 / Filesize : 244 KB / Number-of Response : 980
[このスレッドの書き込みを削除する]
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧] [類似スレッド一覧]


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

C#, C♯, C#相談室 Part46



1 名前:デフォルトの名無しさん [2008/04/22(火) 00:31:59 ]
(#゚ー゚)つ < C#、.NETの話題はこちらでどうぞ。
c++厨の嵐はスルー汁。

前スレ
C#, C♯, C#相談室 Part45
pc11.2ch.net/test/read.cgi/tech/1200911737/

その他テンプレ>>2-5くらい

830 名前:828 mailto:sage [2008/06/10(火) 12:45:29 ]
やっぱり駄目ですよね。
コレでは排他処理の意味をなさない。

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


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

832 名前:デフォルトの名無しさん mailto:sage [2008/06/10(火) 21:51:45 ]
何が入ってるか分からないから
保持しても意味がないものが入ってるかもしれないから

833 名前:デフォルトの名無しさん mailto:sage [2008/06/10(火) 22:53:07 ]
あまり納得できんが、そういうことなんだと納得しておきます。

834 名前:デフォルトの名無しさん [2008/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 名前:デフォルトの名無しさん mailto:sage [2008/06/10(火) 23:19:11 ]
ストアドプロシージャです。

836 名前:デフォルトの名無しさん mailto:sage [2008/06/10(火) 23:21:23 ]
リンクの冒険

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

838 名前:デフォルトの名無しさん mailto:sage [2008/06/10(火) 23:40:52 ]
>>836
えーと……ゼルダの伝説?

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

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



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

840 名前:デフォルトの名無しさん mailto:sage [2008/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 名前:デフォルトの名無しさん mailto:sage [2008/06/11(水) 21:21:57 ]
そこにはExcelがインストールされていないなんてオチじゃないよな。

「00024500-0000-0000-C000-000000000046 80040154」でググって
最初に出てきたところに書いてあった事例がまさにそうだっただけだけど。
forums.msdn.microsoft.com/en-us/netfxbcl/thread/5a338c18-b2e5-44b5-b15a-530d99a34656/

842 名前:840 mailto:sage [2008/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 名前:デフォルトの名無しさん mailto:sage [2008/06/11(水) 21:31:00 ]
>>842
そりゃ、できんわな。それができたら、みんなExcel買ってくれなくなってMSが困っちゃう。

844 名前:デフォルトの名無しさん mailto:sage [2008/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 名前:デフォルトの名無しさん mailto:sage [2008/06/11(水) 21:43:55 ]
>>842
だって、そのExcelファイルの操作って、
Excelが持っている機能を呼び出しているだけだ。
普段目にするUIはExcelの1つの顔にすぎない。

846 名前:デフォルトの名無しさん mailto:sage [2008/06/11(水) 21:59:28 ]
>>844
YES

847 名前:デフォルトの名無しさん mailto:sage [2008/06/11(水) 22:01:05 ]
解放忘れとかやりまくってそうだな

848 名前:デフォルトの名無しさん mailto:sage [2008/06/11(水) 22:10:55 ]
こんなこと言ってる奴がまともに作れてるわけないだろ

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



849 名前:デフォルトの名無しさん mailto:sage [2008/06/11(水) 22:15:41 ]
WSHのVBSとか呼び出すのが楽だよ

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

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


851 名前:デフォルトの名無しさん mailto:sage [2008/06/11(水) 22:40:52 ]
YES

852 名前:デフォルトの名無しさん mailto:sage [2008/06/11(水) 22:42:04 ]
あんたは質問を有料にしたいわ

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

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

855 名前:デフォルトの名無しさん mailto:sage [2008/06/12(木) 00:37:53 ]
カルチャによって変わるよ。

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

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

857 名前:デフォルトの名無しさん mailto:sage [2008/06/12(木) 01:11:03 ]
>>856
>>855の最後の行を読んで下さい><

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

858 名前:デフォルトの名無しさん mailto:sage [2008/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 名前:デフォルトの名無しさん mailto:sage [2008/06/12(木) 01:17:26 ]
>>857
なるほどありがとうございました!
yyyyでも和暦だと20とかになるんですね。
DateTimeFormatInfo.InvariantInfoで解決しました。

860 名前:デフォルトの名無しさん mailto:sage [2008/06/12(木) 01:18:12 ]
>>858
ありがとうございました。勉強してみます。

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

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

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

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

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

863 名前:デフォルトの名無しさん mailto:sage [2008/06/12(木) 11:38:41 ]
全部IDisposable無用

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

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

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


865 名前:862 mailto:sage [2008/06/12(木) 12:58:06 ]
>>863-864
ありがとうございます。

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

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

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

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

867 名前:デフォルトの名無しさん mailto:sage [2008/06/12(木) 14:22:22 ]
質問
RichTextBoxに画像を挿入したいんですが、無理?

868 名前:デフォルトの名無しさん mailto:sage [2008/06/12(木) 14:27:55 ]
とりあえずクリップボード越しなら可能



869 名前:デフォルトの名無しさん mailto:sage [2008/06/12(木) 14:35:42 ]
>>868
サンプルコード貼ってある所知りませんか?

870 名前:デフォルトの名無しさん mailto:sage [2008/06/12(木) 14:41:09 ]
検索エンジン様が知ってることを知ってる

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

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

873 名前:デフォルトの名無しさん mailto:sage [2008/06/12(木) 23:10:28 ]
C#でデストラクタ?

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

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

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

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

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

878 名前:デフォルトの名無しさん mailto:sage [2008/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 名前:デフォルトの名無しさん mailto:sage [2008/06/13(金) 00:03:21 ]
パフォーマンスとかメモリとかやたら気にする奴が
こういうでたらめやって事態を悪化させやがるんだよな…

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


880 名前:デフォルトの名無しさん mailto:sage [2008/06/13(金) 00:05:54 ]
余計な一言はいいから、ね

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

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

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


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

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

886 名前:デフォルトの名無しさん mailto:sage [2008/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 名前:デフォルトの名無しさん mailto:sage [2008/06/13(金) 21:34:01 ]
ttp://unicode.org/Public/UNIDATA/EastAsianWidth.txt

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

888 名前:デフォルトの名無しさん mailto:sage [2008/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 名前:デフォルトの名無しさん mailto:sage [2008/06/15(日) 14:35:46 ]
インストーラーの起動条件でJ#2.0再配布パッケージを
必須にする方法教えて下さい。

890 名前:デフォルトの名無しさん mailto:sage [2008/06/15(日) 15:12:29 ]
スレ違い

891 名前:デフォルトの名無しさん mailto:sage [2008/06/15(日) 17:16:12 ]
いや 殆どC#で一部だけJ#使ってるんすよ…

892 名前:デフォルトの名無しさん mailto:sage [2008/06/15(日) 17:17:38 ]
いや、その理屈はおかしいだろ…

893 名前:デフォルトの名無しさん mailto:sage [2008/06/15(日) 20:01:44 ]
その発想はなかったわ
ってかVSスレで聞いたら?

894 名前:デフォルトの名無しさん mailto:sage [2008/06/15(日) 20:03:22 ]
ほい 逝ってきます。
すまぬかった

895 名前:デフォルトの名無しさん mailto:sage [2008/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 名前:デフォルトの名無しさん mailto:sage [2008/06/16(月) 13:04:03 ]
普通にgetItemコレクション作ってforeachでList<int>にAddしてけばよくね?

897 名前:デフォルトの名無しさん mailto:sage [2008/06/16(月) 13:09:34 ]
デリゲートの引数にコレクション渡してAddしてもらえば?

898 名前:デフォルトの名無しさん mailto:sage [2008/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 名前:デフォルトの名無しさん mailto:sage [2008/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 名前:デフォルトの名無しさん mailto:sage [2008/06/16(月) 19:01:37 ]
>>897の考え方が一番正当でしょ
コレクションをそのまま渡すんじゃなくて,値を登録するためだけのクラスを作って引数に渡す

901 名前:900 mailto:sage [2008/06/16(月) 19:05:54 ]
考え方は,ってだけだよ
マルチキャストは使うのはあんまり良くないかも

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


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

904 名前:デフォルトの名無しさん mailto:sage [2008/06/17(火) 01:32:33 ]
いません

905 名前:デフォルトの名無しさん mailto:sage [2008/06/17(火) 02:39:48 ]
そうか。だよなー。

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

907 名前:デフォルトの名無しさん mailto:sage [2008/06/17(火) 03:09:54 ]
その方法を知りたいな

908 名前:デフォルトの名無しさん mailto:sage [2008/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 mailto:sage [2008/06/17(火) 03:29:53 ]
>あとはExecutionContextの実装もちゃんとやっておくとベター。

SynchronizationContextの間違い。すまそ。
msdn.microsoft.com/ja-jp/library/system.threading.synchronizationcontext.aspx

910 名前:デフォルトの名無しさん mailto:sage [2008/06/17(火) 03:31:08 ]
ぐあ
909==908ね。

911 名前:908 mailto:sage [2008/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 名前:デフォルトの名無しさん mailto:sage [2008/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 名前:デフォルトの名無しさん mailto:sage [2008/06/17(火) 04:24:01 ]
>>912
>おkな理由を教えてもらえると嬉しいな。

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

914 名前:デフォルトの名無しさん mailto:sage [2008/06/17(火) 10:36:47 ]
たとえばNetworkStreamのBeginReadでAsyncCallbackを指定したとする。

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

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

915 名前:デフォルトの名無しさん mailto:sage [2008/06/17(火) 10:42:52 ]
例外を補足できない?

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

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

917 名前:デフォルトの名無しさん [2008/06/18(水) 10:06:15 ]
xmlファイルからデータを取得する方法について教えてください。

下記のxmlファイルtest1.xmlを作成しました。
test1.xml
 <?xml version="1.0" encoding="utf-8" ?>
  <Items>
   <Item ID="001">
    <Name>aaaa</Name><Age>10</Age>
   </Item>
   <Item ID="002">
    <Name>bbb</Name><Age>20</Age>
  </Item>
 </Items>

test1.xmlのデータを下記のプログラムで読み込みました。
001  XmlDocument xmlDoc = new XmlDocument();
002  xmlDoc.Load("c:\\test1.xml");
003
004  string wID = "002";
005  XmlNode xmlNode = xmlDoc.SelectSingleNode("//Items/Item[@ID='" + wID + "']");
006  string wName = xmlNode.SelectSingleNode("//Name").InnerXml;
007  string wAge = xmlNode.SelectSingleNode("//Item/Age").InnerXml;

私の予想ではwNameには"bbb"、wAgeには"20"が入ると思っていたのですが
実際にはwNameには"aaa"、wAgeには"10"が入ります。

プログラムの005行目の処理でxmlNodeには確かに<Name>bbb</Name><Age>20</Age>が抽出されています。
006-007行目で、そこから更に//Nameを抽出したのにwNameに"bbb"が入らず"aaa"が入ってしまうのは何故ですか?

また,このような絞込みっぽい処理を行うには、どのようにすれば良いでしょうか。

918 名前:デフォルトの名無しさん mailto:sage [2008/06/18(水) 10:10:56 ]
そこで // 使っちゃ駄目だろ



919 名前:917 mailto:sage [2008/06/18(水) 10:17:43 ]
>>918
Σ(゚д゚lll)
//はずしたら上手くいきました。

なぜこういう事になるのか勉強して出直してきます。
ありがとうございました。

920 名前:デフォルトの名無しさん mailto:sage [2008/06/18(水) 19:16:35 ]
javaばっかりでいつも不思議に思っているんですが、
キーワードでas base isとかがかぶったらどういう回避方法があるんでしょうか。


921 名前:デフォルトの名無しさん mailto:sage [2008/06/18(水) 19:21:07 ]
何を言いたいのか良く分からん

922 名前:デフォルトの名無しさん mailto:sage [2008/06/18(水) 19:28:48 ]
@as @base @is

923 名前:デフォルトの名無しさん mailto:sage [2008/06/18(水) 19:36:16 ]
ソース上で既に使っていて、キーワードとかぶっているときはどうなるんでしょうか。
またソースに手を入れて変更しないとダメなんでしょうか。

924 名前:デフォルトの名無しさん mailto:sage [2008/06/18(水) 19:51:53 ]
1.0から3.0までで変数名に使えないキーワードは増えてなかったと思うが

925 名前:デフォルトの名無しさん mailto:sage [2008/06/18(水) 20:38:42 ]
c, javaのソースからc#に移植というか少し手を入れるときキーワードの問題が発生しませんか?
特にc#は独自のキーワード名が多いみたいですけど。


926 名前:デフォルトの名無しさん mailto:sage [2008/06/18(水) 20:41:35 ]
勝手な拡張もいいんですけど、もとのソースの関数名がas, in, baseとかだとどうするんでしょうか?
関数名のAPIの方を変更できないし泣きませんか?
そうするとC#で作る気力も無くなるんですけど。

927 名前:デフォルトの名無しさん mailto:sage [2008/06/18(水) 20:43:58 ]
C#はjavaじゃないから嫌いだとか
子供に生まれてこなくて良かったとか言い出す奴らは
来てもらわなくてもいいよ


928 名前:デフォルトの名無しさん mailto:sage [2008/06/18(水) 20:48:49 ]
いや、そういうことじゃないんですけど。
まともにプログラミングの話を出来ないなら、別にいいですよ。
噂どおり、C#の人はC++厨房と変わらないようですねw



929 名前:デフォルトの名無しさん mailto:sage [2008/06/18(水) 20:53:56 ]
asとかを使いたければ@asとしてくれ
他言語からの移植なんてそう簡単にはいかんよ

930 名前:デフォルトの名無しさん mailto:sage [2008/06/18(水) 20:54:39 ]
typedefとか#defineが欲しいといいたいのかな?泥沼だと思うがね。
同じ言語の世代間の違いならコンパイルオプションや
pragmaのようなコンパイル指令で逃げるのだろうけど、
他言語からの場合は良識に任せるしかないな。
移植を前提にしたコードでbaseとかinとかselfとか変数に
使ってたらそういう名前を使った奴がアホだろ。







[ 続きを読む ] / [ 携帯版 ]

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

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