トップページ⇒tech
1001コメント344KB

ふらっとC♯(Part5)

■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさんNGNG
このスレッドは

「どんなにくだらないC#プログラミングに関する発言でも誰かが優しくレスをしてくれるスレッド」です。

ほかのスレッドでは恐ろしくて書き込めないような低レベル、もしくは質問者自身なんだか意味がよく分からない質問など、
勇気をもって書き込んでください。

少しずつC#プログラマを名乗るものが現れました。みなさん一緒に勉強しましょう。

前スレッドはこちら
http://pc2.2ch.net/test/read.cgi/tech/1059028988/l50 (Part4)
http://pc2.2ch.net/test/read.cgi/tech/1047210828/l50 (Part3)
http://pc2.2ch.net/test/read.cgi/tech/1035895873/l50 (Part2)
http://pc2.2ch.net/test/read.cgi/tech/1023766485/l50
0232デフォルトの名無しさんNGNG
>>231
コンピュータの中では、「文字」ってのは一定のルールで数字の列に変換されて扱われてます。
このルールのことをエンコーディング、数字(の列)のことを文字コードと呼んだりします。
んで、文字の "2" に対応するコードが 50 (16進数で 0x32) なわけです。

ファイルやネットワーク等での読み書きは、byte の列を使って行われるのが基本で、
.Net Framework で文字列からこのバイト列に(またはその逆に)変換するには、
Encoding クラス(のインスタンス)を用います。
0233デフォルトの名無しさんNGNG
P.S.
"2"という文字列から、数字の 2 に変換するには、Int32.Parse() などを使います。
0234231NGNG
>>232
文字コードを実数値にしないといけないんですね。
丁寧な即レスありがとうございます。
0235デフォルトの名無しさんNGNG
久しぶりにきたが、なんだかいいスレになってるじゃねーか!
0236デフォルトの名無しさんNGNG
コンソールはほとんど勉強してなかったから試してみたんだけど

char c = (char)Console.Read();

とすれば、そのまま表示できまっせ。MSDNだとintを返すことになってるから
まぎわらしいんだけどね。
0237デフォルトの名無しさんNGNG
こんにちは

今画像のサムネイル保存用に複数画像をまとめてひとつの
ファイルにしようとしています。
Aファイルサイズ・Aファイル・Bファイルサイズ・Bファイル・・・
みたいな感じ合成し、インデックスで呼び出そうかと思っています。
で、ふと思ったのですが、そういう複数のファイルをまとめてしまう
クラスって既にあったりするのでしょうか。
よろしければお教えください。よろしくお願いいたします。
0238デフォルトの名無しさんNGNG
Bitmap imageA = new Bitmap("A.bmp");
Bitmap imageB = new Bitmap("B.bmp");
Bitmap imageC = new Bitmap("C.bmp");

Bitmap bmp = new Bitmap(300, 100);
Graphics g = Graphics.FromImage(bmp);
g.DrawImage(imageA, 0, 0);
g.DrawImage(imageB, 100, 0);
g.DrawImage(imageC, 200, 0);
g.Dispose();
bmp.Save("ABC.bmp");
bmp.Dispose();

imageA.Dispose();
imageB.Dispose();
imageC.Dispose();
0239デフォルトの名無しさんNGNG
そうきましたか・・・

Hash的に名前で簡単にストリームを取り出せるような
仕組みが既存クラスにないかなーとか思っていたのでした。

やはり頑張って自分で実装してみます。

ありがとうございました。
0240デフォルトの名無しさんNGNG
参照設定でvjslib.dll(Microsoft Visual J# .NET Class Library)を追加して、java.util.zipで
0241デフォルトの名無しさんNGNG
!!!
なるほど!
早速やってみます。

ありがとうございました!
0242デフォルトの名無しさんNGNG
DirectX 9.0 SDK (Summer 2004)の日本語ドキュメントをインストールしたんだが、
VS.NET2003に反映されないのです。
なんでなんでしょう・・・そういう方他にいますか?
0243最凶VB厨房NGNG
まずは再起動
0244242NGNG
>>243
再起動もしたんですがダメでした。
0245最凶VB厨房NGNG
SDK本体は入れてるのよな?
まっわからんけど
0246デフォルトの名無しさんNGNG
>>242
フィルタか?
0247242NGNG
英語版ヘルプははいってるんですが・・・
フィルタもなしになってます。
本来ならVS.NET起動時に「ヘルプを反映中・・」とかでますよね?
0248242NGNG
連結ヘルプ コレクション マネージャで更新できました。
お騒がせしました。(・∀・)
0249デフォルトの名無しさんNGNG
>>242
DirectX9 SDK Summer2004の日本語ドキュメントってもう出てたの?
0250デフォルトの名無しさんNGNG
>>249
変な書き方しちゃいましたね。
2004入れてから日本語ドキュメント入れたら〜でした。スマソ
0251デフォルトの名無しさんNGNG
外部プロセスに確保した領域をPtrToStructureすると例外が発生するのは何故でしょうか。どうかご教授お願いします。
using HANDLE=System.IntPtr;using LPVOID=System.IntPtr;using SIZE_T=System.UInt32;using DWORD=System.UInt32;
class CMyApp:System.Windows.Forms.Form
{
  [System.Runtime.InteropServices.DllImportAttribute("kernel32")]
  static extern LPVOID VirtualAllocEx(HANDLE hProcess,LPVOID lpAddress,SIZE_T dwSize,DWORD flAllocationType,DWORD flProtect);
  DWORD PAGE_READWRITE=0x04;
  DWORD MEM_COMMIT=  0x1000;
  static void Main()
  {
    System.Windows.Forms.Application.Run(new CMyApp());
  }
  CMyApp()
  {
    this.Click+=new System.EventHandler(OnClick);
  }
  void OnClick(object sender,System.EventArgs e)
  {
    LPVOID 自分側の領域=VirtualAllocEx(System.Diagnostics.Process.GetCurrentProcess().Handle,(LPVOID)0,(DWORD)System.Runtime.InteropServices.Marshal.SizeOf(typeof(System.TimeSpan)),MEM_COMMIT,PAGE_READWRITE);
    LPVOID 他人側の領域=new LPVOID();
    foreach(System.Diagnostics.Process inc in System.Diagnostics.Process.GetProcesses())
      if("Explorer"==inc.ProcessName)
        他人側の領域=VirtualAllocEx(inc.Handle,(LPVOID)0,(DWORD)System.Runtime.InteropServices.Marshal.SizeOf(typeof(System.TimeSpan)),MEM_COMMIT,PAGE_READWRITE);

    System.Runtime.InteropServices.Marshal.PtrToStructure(自分側の領域,typeof(System.TimeSpan));//自分側の領域では例外は発生しない

    System.Windows.Forms.MessageBox.Show("次で例外発生");
    System.Runtime.InteropServices.Marshal.PtrToStructure(他人側の領域,typeof(System.TimeSpan));
  }
}
0252デフォルトの名無しさんNGNG
>>251
非Managedなプロセス空間にManagedな構造体を確保する意味がさっぱりわからないんだが。

ttp://dotnetjunkies.com/WebLog/chris.taylor/archive/2004/05/31/14828.aspx
とりあえず外部プロセスへのちょっかいの参照。
0253251NGNG
252さんアドバイスありがとうございます。
これをやりたい理由は、興味本位で出来るかどうか試したかっただけです。
とりあえず上のURLをよく読んで見ます。
0254デフォルトの名無しさんNGNG
おまいら、コールバックにデリゲートとインターフェースの
どっち使ってる?
JavaのGUIのリスナーみたいなケースなら、デリゲートの
方が何もしないメソッドまで記述しなくて済むし効率いいかな。
0255デフォルトの名無しさんNGNG
>>254
俺は Java 出身だから、ある程度一まとまりの処理をくっつけるならインターフェイス使っている
デリゲートは纏まり間が無くて、単体なら遣いやすいけど微妙
0256デフォルトの名無しさんNGNG
俺はデリゲート派
0257デフォルトの名無しさんNGNG
anonymous class は使えないが、anonymous delegate は使えるようになるので、
デリゲートにしておくのが無難なのでは。
0258デフォルトの名無しさんNGNG
非常に唐突な質問で申し訳ないが、C#で、というか.NET Frameworkで
各ドライブのボリュームラベルを取得するのってどうやるんだべさ?

なんかAPI叩くしかなかったら非常に鬱なので教えてエロイ人!
0259デフォルトの名無しさんNGNG
>>258
DriveInfo.VolumeLabel かな。
…… .NET Framework 2.0 だけど。
0260デフォルトの名無しさんNGNG
2.0で変更になったクラスの一覧ってないかな?
0261デフォルトの名無しさんNGNG
>>259
やっぱ2.0になっちまうのか・・・。
何故こんな基本的なもんが実装されてないんだと小一(ry
0262デフォルトの名無しさんNGNG
[DllImport("Kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)]
extern static bool GetVolumeInformation(
string RootPathName,
StringBuilder VolumeNameBuffer,
int VolumeNameSize,
out uint VolumeSerialNumber,
out uint MaximumComponentLength,
out uint FileSystemFlags,
StringBuilder FileSystemNameBuffer,
int nFileSystemNameSize);
0263デフォルトの名無しさんNGNG
>>262
トンクスエロイ人!
やっぱこうやるか・・・。なんだかなぁ・・・
0264デフォルトの名無しさんNGNG
Socket.Selectで64を超えるソケットリストを渡すと範囲外エラーになるのですが、

この64という制限は何によってかかっているでしょうか。
100に変更したりとかできないでしょうか。
0265デフォルトの名無しさんNGNG
ボタンの配列(二次元)をクリックされた時に、何番のボタンがクリックされたかを調べるにはどうしたら良いですか?
MyButtons[,] = new Button[3,5];
のように宣言されていて、forの二重ループの中で初期化して
MyButtons[i,j].Click += new EventHandler(MyButtons_Click);
みたいにしてみましたが、MyButtons_Clickの引数には別に「MyButtonsの何番目か」は渡されません。
どうしたらいいんですか
0266デフォルトの名無しさんNGNG
>>265
ボタンの番号が固定のものなら、Button.Tag あたりに番号を押し込めておけば良いのでは?
0267デフォルトの名無しさんNGNG
自分が [2,1]だとしたら、[2,0]と[2,2]のボタンも操作したいんですよ。
なんとかなりませんかねえ
0268デフォルトの名無しさんNGNG
>>267
???
だからTagにint[]{2, 1}とかいれとけばいいんじゃないの?

それがまずいというのならもっとわかりやすく説明してくれないと何がなにやら。
0269デフォルトの名無しさんNGNG
>>268
あ、いま意味が分かりましたサンクス
0270デフォルトの名無しさんNGNG
>>264
普通に1000とかできるじゃん……と思ったら.NET Framework2.0だった。

1.1の制限のようだ。
0271デフォルトの名無しさんNGNG
>>264
OS の制限。WaitForMultipleObjects() できる最大数が64だから。
2.0 で表面的な制限は外れても、64を超えると効率は落ちる気がする。
0272デフォルトの名無しさんNGNG
簡単なベンチの結果、数が25以上になった辺りから緩やかに効率が落ちていった。
でも64周辺の境界は見あたらなかった。

ついでに1.0/1.1/2.0bも比較してみた。(スコアは低い方が優秀)
10でスコア 410 / 370 / 250
25でスコア 320 / 300 / 230
40でスコア 325 / 320 / 250
64でスコア 370 / 370 / 300

有意の差があるね。
1.1までとは違う機構を利用してたりするんじゃないかってくらい2.0は早い。
数が少ない時と多い時のスコアの分布とか。
0273デフォルトの名無しさんNGNG
DataGridで

ABC | DEF | GHI
JKL | MNO | PQR
STU | VWX | YZA
BCD | EFG | HIJ

こういう表の MNOとVWXだけ範囲指定させるみたいなことはできますか?
0274264NGNG
>>270-272
環境も書き忘れたのに本当にありがとうございます。
しかもWaitForMultipleObjectsとの関連、
ベンチまでしていただいてとても参考になりました。
0275デフォルトの名無しさんNGNG
クラスのオブジェクトをコピーしたいんだけどよくわからんです。
AObject obj1 = obj2.Clone();
ってすればいいんだろうけど、
Cloneを書くときにCのmemcpyみたいなことってできないんでしょうか?
それともいちいちフィールド一つずつ代入?
0276デフォルトの名無しさんNGNG
Object.MemberwiseClone()
0277275NGNG
>>276
さんきゅ。
それつかってICloneableを実装するのが流儀なのだな。
0278デフォルトの名無しさんNGNG
Point とかの Dispose できないヤツって、Dispose しなくていいの?

Point aaa = new Point(0,0);
aaa = new Point(1,1);
aaa = new Point(2,2)

とかしても大丈夫?
0279デフォルトの名無しさんNGNG
>>278
int a = 0;
a = 1;
a = 2;

とやることにためらいを覚える?
0280デフォルトの名無しさんNGNG
char *p = malloc(100);
p = malloc(100);
p = malloc(100);

とやることにはためらいを覚える。
0281275NGNG
Pointとかは構造体だからOKってことだよね。
正しいクラスはDisposeを持つべきってことか?
自前のやつも?
0282デフォルトの名無しさんNGNG
>>281
もうちょっとGCを信用しようや。
Disposeが必要なのは基本的にUnmanagedなリソースを扱うクラスのみ。
0283デフォルトの名無しさんNGNG
GCはいいんだけど、自分で自由に解放できないのがいまいち

なんか「ゴミをゴミ箱に捨てると清掃員の仕事が減ってリストラされるから、ゴミは道に捨てるべき」とか言ってるみたい
0284デフォルトの名無しさんNGNG
>>283
でも
道に捨てない −> 清掃員の仕事が減ってリストラ −> ごみを捨て忘れても綺麗にならない
だから道に捨てるんだ。
0285デフォルトの名無しさんNGNG
環境はVS2003です。

ツール(T)→webページのビルドコメント(B)
でドキュメントを作成したところ、「コード要素ページ operator + が不完全です。 」というエラーが取り除けなくて困っています。
だれか理由が分る人いますか?

以下問題のコードです。

/// <summary>テスト</summary>
public class Test
{
/// <summary>足し算</summary>
/// <param name="a">引数その1</param>
/// <param name="b">引数その2</param>
/// <returns>結果</returns>
public static Test operator + ( Test a , Test b ) { return null ; }
}

>>282
Unmanagedというより、IO関連とかメモリーと連携するわけにはいかないオブジェクトが実装する必要があるのでは?
OSのリソースはメモリーのようにいつでも解放できるリソースばかりではありませんから、そのようなリソースを握るオブジェクトには必然的に必要になります。
参照先がなくなった瞬間に即時開放されるタイプのクラスが定義できると、こんな面倒な事をしなくてすむんですが……
と、C++でスマートポインタを使っていると切に欲しくなる事があったりします。
0286デフォルトの名無しさんNGNG
Disposeしたところでメモリに対しては何も出来ないんだから意味なし。
まあ、>>285のように思う事はない事もない。
0287デフォルトの名無しさんNGNG
何らかのクリーンアップコードを実行したい場合なんかは、
Disposeを実装すべきである事が多い。
単に使用終了と言う意味合いだけなら、何もする必要なし。
※Dispose実装したところでする事は何もない。
メモリに関しちゃほっとけばいいってのがGCのある環境での基本。
0288デフォルトの名無しさんNGNG
using ステートメント(と IDisposable インタフェイス)ではどこがダメなの?
0289デフォルトの名無しさんNGNG
忘れる可能性があるから、強制できないから。
まあ、>>285の言うようなスマートポインタみたいな物っていっても、
結局直接参照しか扱えないため、包含するクラスは全部そのタイプにしなけりゃ
意味がなかったりして、結局大げさになりすぎてうまくいかないかな。
GCとは相性が悪いね。
0290デフォルトの名無しさんNGNG
MSNメッセンジャーでの「ほげほげがサインインしました」みたいなポップアップ
ダイアログを作りたいのだが,ここにいる諸氏ならばどのようにして実現するか,
意見をお聞きしたい.
0291デフォルトの名無しさんNGNG
出来合いのコンポーネントを使う。
0292デフォルトの名無しさんNGNG
>>290
他にもあるけど

窓の杜 - 【NEWS】米MS提供の.NET開発向けカスタムコントロール集「Visual Basic Power Pack」
http://www.forest.impress.co.jp/article/2004/06/24/vbpowerpack.html

0293290NGNG
>>292
激しく感謝.ありがとう.
0294デフォルトの名無しさんNGNG
ファイルの末尾数バイトを削除する簡単な方法ってありますか?
一度全て読み込んだ後削除して上書きしか思いつかなくて。。。

消した後、そのファイルに追加を行うので、
消したい部分のみ上書きする方法でもいいのですが。。。
0295デフォルトの名無しさんNGNG
簡単……ねぇ?
上書きなら難しいことでもないけど。

int b = 5;
FileStream fs = new FileStream("hoge.txt", FileMode.Open, FileAcceess.ReadWrite);
fs.Position = fs.Length - b;
StreamWriter sw = new StreamWriter(fs);
以下略
0296294NGNG
>>295
そっか TextWriter に、予め頭だししておいた Stream をぶち込めばよかったのか
ありがとうございますそれでいけそうです
0297デフォルトの名無しさんNGNG
>>295
そっか Mamko に、だしておいた Seishi をぶち込めばよかったのか
ありがとうございますそれで子供できそうです
0298デフォルトの名無しさんNGNG
つまらん
0299デフォルトの名無しさんNGNG
 C#で複数のマウスイベントを検出することは可能でしょうか?
USBマウスとUSBトラックボールをつなげています。こららの移動情報を個別に取得したいと思います。
どうすれば、よいでしょうか?宜しくお願いしまう。
0300デフォルトの名無しさんNGNG
>>299
.NET Frameworkのライブラリじゃ不可能。
Raw Input APIを使う必要がある。
参考:ttp://www.hatena.ne.jp/1085972533
0301デフォルトの名無しさんNGNG
意外にも、DirectInput じゃ区別できないのよね。
0302デフォルトの名無しさんNGNG
実行ファイルに関連付けられたアイコンをプログラムの中で
使用したいのですが、いい方法はないでしょうか。

なお、今のところ、同一のアイコンファイルを
コンパイルオプションの「/win32icon」、「/resource」の双方を
使って実行ファイルに取り込んでいます。
0303デフォルトの名無しさんNGNG
>>302
/win32icon は API の ExtractIcon/ExtractIconEx で取り出せる。
0304デフォルトの名無しさんNGNG
classとstructを簡単に見分ける方法ってある?
ライブラリのやつとかいちいちマニュアル見るの面倒なんだが。
0305デフォルトの名無しさんNGNG
>>304
VS使ってるならnewのインテリセンスとか。
あんまりclassかstructかを見分ける必要なぞ感じたことがないしな。
0306デフォルトの名無しさんNGNG
ListBoxを縦に二つに分けることはできないんでしょうか。
MultiColumnではなくて、ひとつの項目を二つの列に分けて表示したいんです。
具体的に何をしたいかというと、エラーの内容と発生時刻を表示したいんですが、
発生時刻を左側に、エラーの内容を右側にわけてリストボックスに表示したいんです。
日付は必ず1行ですがエラーの内容は複数行になる可能性があるので、
文字数揃えて表示・・とかよりも縦に二つに割れたら楽だと思うんですけど、どうやってやるのかさっぱりです。
ListBoxで実現するには、あるいはほかのコントロールで実現するにはどうすればいいんでしょうか。
0307デフォルトの名無しさんNGNG
>>306
ちゃんと読んではいないけどGoogleのイメージ検索で引っかかったこれはどうだろう。
ttp://www.codeproject.com/cs/combobox/resizablelistbox.asp

//私ならListViewを使うかな……?
0308デフォルトの名無しさんNGNG
ぶっちゃけ自分で描画したほうが早い
0309デフォルトの名無しさんNGNG
>>308
めんどくさくね?
0310デフォルトの名無しさんNGNG
面倒くさいかどうかというのは実装の早さに関して考慮することじゃないような
0311304NGNG
>>305
そうか。
コピーするときにcloneがいるかとか
遅くなるのかとか、結構気になるんだが

0312デフォルトの名無しさんNGNG
チューンナップなぞ遅さが気になってからすればいいんですよ.

早過ぎる最適化は諸悪の(少なくとも大半の悪の)根源なり -- DEK
0313デフォルトの名無しさんNGNG
AxWebBrowser って ToolTip くっつけられないんだっけ?
0314313NGNG
くだらない質問なのにあげちゃった_| ̄|○
0315デフォルトの名無しさんNGNG
>>305
boxing と unboxing でドツボにはまるぞ。
値型と参照型の違いは押さえておいた方が良い。
0316デフォルトの名無しさんNGNG
だよね。
struct を lock () して排他したつもり、とか。
0317デフォルトの名無しさんNGNG
心配しなくてもできねーよ。
0318デフォルトの名無しさんNGNG
テキストボックスで HOME や END、あまつさえ SHIFT+HOME や SHIFT+END、
CTRL+Z や CTRL+C/V/X を実現するには自分でコードを書かないといけないのでしょうか?
0319デフォルトの名無しさんNGNG
>>318
まず試せ。
0320デフォルトの名無しさんNGNG
Windows.Formにプロパティを加えたんだけど、
デザイナのプロパティウィンドウには表示されませんね。

基底クラス(Windows.Form)に加えたプロパティは
派生クラス(Windows.Form)のデザイナに反映される
みたいだけど、自分自身ならなぜだめなのかなぁ。
0321デフォルトの名無しさんNGNG
>>320
まったく同じレスをどこかで見たなぁ。
0322デフォルトの名無しさんNGNG
>>321
俺も見た記憶があるので探してみた
http://pc5.2ch.net/test/read.cgi/tech/1045307942/294
0323306NGNG
>>307,308
遅ればせながら・・・
ListViewでいけました。
ありがとうございました。
詳細表示なんてさっぱり思い浮かびませんでした。
0324318NGNG
>>319
できました…。幻覚でも見ていたのかもしれません。
でも CTRL+A ってできないんですね。
0325デフォルトの名無しさんNGNG
1pxの点 . を任意の座標表示するにはどうしたら良いんでしょう?
1,1 - 1,2まで幅1の線を引くと、どうも2pxくらい線が引かれちゃうし
1,1 - 1,1にすると線ができないんです。
0326デフォルトの名無しさんNGNG
>>325
Bitmap に SetPixel で点を描いて、Graphics.DrawImage で画面に描写。
0327デフォルトの名無しさんNGNG
他には、
FillRectangle(DrawRectangleは不可)で幅・高さ1の四角を描画。
Graphics.GetHwndで取得したデバイスコンテキストにWin32APIのSetPixelで描画。

……元画像のビットマップを取得できるならBitmap.SetPixelが一番手っ取り早い/速いんだけどねー。
0328デフォルトの名無しさんNGNG
それ俺も気になって調べたんだけど
点を描画するGraphicsクラスのメソッドはないみたいなんだよね
結局SetPixelで妥協したけど、
Graphicsオブジェクトを使って描画を行うというルールから離れるからあんまりやりたくない
0329デフォルトの名無しさんNGNG
……327のGetHwndはGetHdcの間違い。
//user32.dllのAPIをまとめたクラスを最近作ってるからhwndまみれでつい。
0330デフォルトの名無しさんNGNG
>>328
Graphics はベクタ形式を含む一般的なグラフィックを扱うクラスだから、“点”という概念がないのよね。
数学的には、点は半径が無限小の円と等価な存在で、半径0の円は画面に表示できないから。

点、というか、ピクセル単位の処理がしたければビットマップを使えと。

Graphics に元画像のビットマップを取得するメソッドがないのは、
将来的に(Avalon で)、OS 自体をベクタ画像ベースで動くものにするつもりでいるからじゃないかな。
0331デフォルトの名無しさんNGNG
>>330
目から鱗
■ このスレッドは過去ログ倉庫に格納されています