[表示 : 全て 最新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くらい

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

803 名前:デフォルトの名無しさん mailto:sage [2008/06/07(土) 15:46:52 ]
なんかこのスレ方向性分かんなくなってきたなw


804 名前:デフォルトの名無しさん mailto:sage [2008/06/07(土) 15:55:23 ]
ジャンプ中左右移動したいなら

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

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

805 名前:デフォルトの名無しさん mailto:sage [2008/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 名前:デフォルトの名無しさん mailto:sage [2008/06/07(土) 16:51:23 ]
って書き終わって凄く後悔した
スレ違いにもほどが

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

808 名前:デフォルトの名無しさん mailto:sage [2008/06/07(土) 19:40:07 ]
気をつけるまでも無く自明だと思うのですが!

809 名前:デフォルトの名無しさん mailto:sage [2008/06/07(土) 21:07:23 ]
型を書いてないからアレだけど
ベクトル型を使うのが普通なんで

810 名前:デフォルトの名無しさん [2008/06/08(日) 10:51:16 ]
過疎



811 名前:デフォルトの名無しさん mailto:sage [2008/06/08(日) 11:54:09 ]
IDEの使い方に関するおすすめの書籍は?

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

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

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

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

816 名前:デフォルトの名無しさん mailto:sage [2008/06/08(日) 20:12:26 ]
つかTagで十分だろ

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

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

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

820 名前:デフォルトの名無しさん [2008/06/09(月) 10:09:01 ]
pc11.2ch.net/test/read.cgi/tech/1212972014/



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

822 名前:デフォルトの名無しさん [2008/06/09(月) 12:16:03 ]
>>821

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

823 名前:デフォルトの名無しさん mailto:sage [2008/06/09(月) 12:17:01 ]
モードレスダイヤログ?

全然外してるかも。

824 名前:あにす ◆sGTL1yK0.6 mailto:sage [2008/06/09(月) 18:46:26 ]
DoEvents()?
外してるかな…。

825 名前:デフォルトの名無しさん mailto:sage [2008/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 名前:デフォルトの名無しさん mailto:sage [2008/06/10(火) 06:30:01 ]
>>825
ということは>>702はデマってことか

827 名前:デフォルトの名無しさん mailto:sage [2008/06/10(火) 07:01:43 ]
デマというかもうちょい境界線が上なんだろうな。

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

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


829 名前:デフォルトの名無しさん mailto:sage [2008/06/10(火) 12:23:17 ]
とりあえずそんなキモいことするな

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

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さんのやり方は
ちょっと理解ができませんでした・・・申し訳ありません。
デリゲートのコレクションは使ったことがないので勉強してみたいと思います。







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

前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