ふらっとC♯(Part5) ..
[2ch|▼Menu]
199:デフォルトの名無しさん
04/07/31 19:54
>>198
自分で作って確かめろ、タコ

200:デフォルトの名無しさん
04/07/31 20:58
>ちょっと無理っぽいが、通るのか?
なんで?

201:198
04/08/01 09:38
>199
GDIはBitbltで
GDI+はGraphics.DrawImageで
確かめて良いですか?

202:デフォルトの名無しさん
04/08/01 11:55
GDI+は長角まで待つべし

203:デフォルトの名無しさん
04/08/01 12:31
リフレクションを使ってラムダ式を動的に作りたいのですが、
参考になるHPや良い方法があったら教えてください。
例えば、正規分布関数のクラスが、以下のように存在していて
public class DistributionFunctions
{
 public static dobule Normal( double x , double a , double v )
 {
  return 1.0 / Math.Sqrt( 2 * Math.PI * v ) * Math.Exp( -(x-a)*(x-a)/( 2 * v ) ) ;
 }
 ...
}

やりたい事は、
delegate double DoubleToDoubleDelegate( double x ) ;
public class DistributionDelegates
{
 static DoubleToDoubleDelegate MakeNormal( double a , double v )
 {
  ここに手際よく大量生産できるコード
 }
}

使い方は
void hogehogeMethod()
{
 DoubleToDoubleDelegate df = MakeNormal( 0.0 , 1.0 ) ;
 y = df( 0.0 ) ;// ここで y = Normal( x , 0.0 , 1.0 ) が呼び出される
}


204:デフォルトの名無しさん
04/08/01 16:03
>>203
よくわからんけど、こんなこと↓がしたいの?

using System;
public class DistributionFunctions {
double a;
double v;
public DistributionFunctions(double x, double y){
a = x;
v = y;
}
public double Normal( double x )
{
return 1.0 / Math.Sqrt( 2 * Math.PI * v ) * Math.Exp( -(x-a)*(x-a)/( 2 * v ) ) ;
}
}
delegate double DoubleToDoubleDelegate( double x );
class Hoge {
static DoubleToDoubleDelegate MakeNormal( double a , double v ) {
//ここに手際よく大量生産できるコード
DistributionFunctions f = new DistributionFunctions(a, v);
return new DoubleToDoubleDelegate(f.Normal);
}
static void Main() {
DoubleToDoubleDelegate df = MakeNormal( 0.0 , 1.0 ) ;
double y = df( 0.0 ) ;// ここで y = Normal( x , 0.0 , 1.0 ) が呼び出される
Console.WriteLine("y = {0}", y);
}
}

205:204
04/08/01 16:27
public class DistributionFunctions {

の{の前に全角スペースが入ってた。。。鬱

206:デフォルトの名無しさん
04/08/01 16:28
C#でGDIをつかうすべはあるのか?APIの直たたきならGDIをつかえる?

207:デフォルトの名無しさん
04/08/01 18:33
>>204
方法は問わないんですが、そうです、そんな感じです。
そこで、関数の引数を確保するクラスを作る必要がありますよね。
関数の数が多くて、これを全部自動生成してしまいたいんです。


208:204
04/08/01 20:00
>>207
> そこで、関数の引数を確保するクラスを作る必要がありますよね。
> 関数の数が多くて、これを全部自動生成してしまいたいんです。
204の例を使っても、好きなだけ関数は作れるけど。。。↓こういうことではない?

static void Main()
{
double d1 = 1.0; // 数字は適当
double d2 = 1.0; // 数字は適当
DoubleToDoubleDelegate[,] df = new DoubleToDoubleDelegate[10,10];
for(int i=0; i < 10; i++, d1 += 0.2){
for(int j=0; j < 10; j++, d2 += 0.2){
df[i,j] = MakeNormal( d1, d2);
}
}
for(int i=0; i < 10; i++){
for(int j=0; j < 10; j++){
double y = df[i,j]( 0.0 ) ;
Console.WriteLine("y = {0}", y);
}
}
}


209:デフォルトの名無しさん
04/08/01 21:52
>>208
ども、お手数掛けてすみません。
対象となる関数は、正規分布関数のようにパラメータ二つだけとは限りませんし、
今後、多変数に対応するにあたって、このまま場当なやり方で行きますとプログラムの保守が危機的になると考え
第一段階として、現在はC#のソースコードを自動生成するプログラムを作って対応しています。
しかし、これも必ずしも良い方法とも言えず、もっと効率的にプログラムできる方法として、
色々探している内にリフレクションという物を使ってみようかと考えていました。
さっそく始めてみたのですが、これがチュートリアルの良いページがなかなか見つからなくて・・・・

ちなみに僕自身、ここに書き込む前に色々考えたのですが、
一般的なC#の構文を使った範囲内ではおそらく良い解決方法はないだろうというのが結論でした。


210:デフォルトの名無しさん
04/08/01 22:20
はじめまして、
C#でデータベースに関することを勉強しています。
ボタンを押すとアクセスに「123」というデータを追加するプログラムを書いています。
壁にぶつかりましたので、ご指導していただけませんか。

odbcDataAdapter1などの設定し、以下のボタンの内容を書きました。

odbcConnection1.Open();
odbcDataAdapter1.InsertCommand.Parameters["@ab"].Value="123";
odbcDataAdapter1.InsertCommand.ExecuteNonQuery();
odbcDataAdapter1.Fill(dataSet11);
odbcConnection1.Close();

すると
'System.IndexOutOfRangeException' のハンドルされていない例外が
system.data.dll で発生しました。


211:デフォルトの名無しさん
04/08/01 22:24
> 対象となる関数は、正規分布関数のようにパラメータ二つだけとは限りませんし、
> 今後、多変数に対応するにあたって、このまま場当なやり方で行きますとプログラムの保守が危機的になると考え
> 第一段階として、現在はC#のソースコードを自動生成するプログラムを作って対応しています。
これが結構まっとうな方法な気もしますが。。。

もしかして、パラメータが変わるだけではなく、どんな関数を作るかは
あらかじめ決まってない、ってことですか?
C++でいえば、boost::lambdaみたいなことをしたいのかなぁ?

> しかし、これも必ずしも良い方法とも言えず、もっと効率的にプログラムできる方法として、
> 色々探している内にリフレクションという物を使ってみようかと考えていました。
リフレクションで出来るかどうかはわかりませんが、一応参考に。

URLリンク(members.jcom.home.ne.jp)
URLリンク(www.microsoft.com)

212:デフォルトの名無しさん
04/08/01 23:01
>>210
ここにある例が参考になりませんかね。
URLリンク(www.microsoft.com)

213:デフォルトの名無しさん
04/08/02 08:36
普通に IDbCommand.ExecuteNonquery() はダメなの?

214:デフォルトの名無しさん
04/08/03 21:03
プログラムの構造をどうしたらいいのかが分かりません。
例えば、オセロプログラムを考えるとします。
オセロのマスの部分にButtonから継承したクラスMasuを使います。
Masuを8*8個集めた配列をBoardとします。
オセロゲーム ━ Board (集約する)━ Masu という風になっていますが、
Masuがクリックされた時に 隣のマスをひっくり返すかどうか走査するとしても、
Masuからは隣のMasuなんて分かりませんよね?
だからBoardに頼んで調べてもらいたいわけですが
どうやったらそうできるのかがわからないです。どうしたらいいのですか?

215:デフォルトの名無しさん
04/08/03 21:07
X 配列Board
O クラスBoard

でした

216:デフォルトの名無しさん
04/08/03 21:43
>>214
Masu に必要な機能は、
・そのマスの内容を保持
・画面に描画する
・クリックされたことを、Board に通知する
の3つでいいんじゃない?

ひっくり返すのは、Board でやればいい。

217:デフォルトの名無しさん
04/08/03 23:21
>>216
その三番目のboardに通知する方法が分からんですよ。

218:デフォルトの名無しさん
04/08/03 23:32
>>217
Clickイベント。

219:デフォルトの名無しさん
04/08/03 23:51
>>217
boardのメソッドの引数に自分を渡せばいい。

220:デフォルトの名無しさん
04/08/04 00:18
>214
もっと
PlayerとかTurnMasterとかJudgeとかつくれや。Masuはいらん

221:デフォルトの名無しさん
04/08/04 00:53
>>220
高度すぎ。質問者をみて答えてやれよ。

222:デフォルトの名無しさん
04/08/04 00:56
>221
書き込んだ後そう思った.すいません。

Masu作るときにボードを引数で渡してそれ使う.それかイベント

223:デフォルトの名無しさん
04/08/04 23:39
こういうのってできるかな?
void Hoge( params object [] arg )

の ref バージョンで
void Hoge( ref object arg0 , ref object arg1 , ref object arg2 ... ) ;

の様な物。
必要個数分オーバーロードするしかないかな?

224:デフォルトの名無しさん
04/08/05 00:33
コントロールのクライアント領域について質問です。
以下のような Panel を継承したクラスをつくりました。

public class PanelEx : System.Windows.Forms.Panel
{
 public PanelEx() { }

 protected override void OnPaint(PaintEventArgs e)
 {
  base.OnPaint (e);

  Pen p = new Pen(Color.Black, 1);
  e.Graphics.DrawRectangle(p, this.ClientRectangle);
  p.Dispose();
 }
}

この PanelEX クラスのインスタンスを、普通に Form1 の
コンストラクタ内で生成したところ、画面には PanelEx の
左側と上側にしか線がひかれません。

なぜでしょうか?また、どうすればちゃんと矩形が描かれますか?

225:デフォルトの名無しさん
04/08/05 00:55
>>224
はみ出て見えないので矩形を小さく、例えば幅と高さを-1にしたりする。

226:224
04/08/05 01:29
>>225
ええええー。なぜそんな仕様になってるんでしょうか?

227:デフォルトの名無しさん
04/08/05 02:00
>>226
厨避けの為。

228:デフォルトの名無しさん
04/08/05 02:03
>>226
別におかしくないよ。

URLリンク(www.microsoft.com)

229:デフォルトの名無しさん
04/08/05 10:20
>>220
ウヒャー
220さんの高度な設計だと、どんな風になるんですか?
コードをつけながら説明してほしい・・・

230:デフォルトの名無しさん
04/08/05 19:29
>>229
高度
コード




!?

231:デフォルトの名無しさん
04/08/05 22:23
超基本で悪いんだけど、
int i = Console.Read();
Console.WriteLine(i);

これでたとえば「2」を入力すると出力が「50」なんてなるんですが、なぜなのでしょうか?

232:デフォルトの名無しさん
04/08/05 22:31
>>231
コンピュータの中では、「文字」ってのは一定のルールで数字の列に変換されて扱われてます。
このルールのことをエンコーディング、数字(の列)のことを文字コードと呼んだりします。
んで、文字の "2" に対応するコードが 50 (16進数で 0x32) なわけです。

ファイルやネットワーク等での読み書きは、byte の列を使って行われるのが基本で、
.Net Framework で文字列からこのバイト列に(またはその逆に)変換するには、
Encoding クラス(のインスタンス)を用います。

233:デフォルトの名無しさん
04/08/05 22:31
P.S.
"2"という文字列から、数字の 2 に変換するには、Int32.Parse() などを使います。

234:231
04/08/05 22:36
>>232
文字コードを実数値にしないといけないんですね。
丁寧な即レスありがとうございます。

235:デフォルトの名無しさん
04/08/06 00:26
久しぶりにきたが、なんだかいいスレになってるじゃねーか!

236:デフォルトの名無しさん
04/08/06 07:42
コンソールはほとんど勉強してなかったから試してみたんだけど

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

とすれば、そのまま表示できまっせ。MSDNだとintを返すことになってるから
まぎわらしいんだけどね。

237:デフォルトの名無しさん
04/08/06 07:43
こんにちは

今画像のサムネイル保存用に複数画像をまとめてひとつの
ファイルにしようとしています。
Aファイルサイズ・Aファイル・Bファイルサイズ・Bファイル・・・
みたいな感じ合成し、インデックスで呼び出そうかと思っています。
で、ふと思ったのですが、そういう複数のファイルをまとめてしまう
クラスって既にあったりするのでしょうか。
よろしければお教えください。よろしくお願いいたします。


238:デフォルトの名無しさん
04/08/06 09:33
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();

239:デフォルトの名無しさん
04/08/06 10:42
そうきましたか・・・

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

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

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

240:デフォルトの名無しさん
04/08/06 11:04
参照設定でvjslib.dll(Microsoft Visual J# .NET Class Library)を追加して、java.util.zipで

241:デフォルトの名無しさん
04/08/06 11:42
!!!
なるほど!
早速やってみます。

ありがとうございました!


242:デフォルトの名無しさん
04/08/06 23:07
DirectX 9.0 SDK (Summer 2004)の日本語ドキュメントをインストールしたんだが、
VS.NET2003に反映されないのです。
なんでなんでしょう・・・そういう方他にいますか?

243:最凶VB厨房
04/08/06 23:20
まずは再起動

244:242
04/08/06 23:24
>>243
再起動もしたんですがダメでした。

245:最凶VB厨房
04/08/06 23:28
SDK本体は入れてるのよな?
まっわからんけど

246:デフォルトの名無しさん
04/08/06 23:32
>>242
フィルタか?

247:242
04/08/06 23:52
英語版ヘルプははいってるんですが・・・
フィルタもなしになってます。
本来ならVS.NET起動時に「ヘルプを反映中・・」とかでますよね?

248:242
04/08/07 01:01
連結ヘルプ コレクション マネージャで更新できました。
お騒がせしました。(・∀・)

249:デフォルトの名無しさん
04/08/07 11:42
>>242
DirectX9 SDK Summer2004の日本語ドキュメントってもう出てたの?

250:デフォルトの名無しさん
04/08/07 11:51
>>249
変な書き方しちゃいましたね。
2004入れてから日本語ドキュメント入れたら〜でした。スマソ

251:デフォルトの名無しさん
04/08/07 13:25
外部プロセスに確保した領域を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));
  }
}

252:デフォルトの名無しさん
04/08/07 14:35
>>251
非Managedなプロセス空間にManagedな構造体を確保する意味がさっぱりわからないんだが。

URLリンク(dotnetjunkies.com)
とりあえず外部プロセスへのちょっかいの参照。

253:251
04/08/07 15:56
252さんアドバイスありがとうございます。
これをやりたい理由は、興味本位で出来るかどうか試したかっただけです。
とりあえず上のURLをよく読んで見ます。

254:デフォルトの名無しさん
04/08/07 18:02
おまいら、コールバックにデリゲートとインターフェースの
どっち使ってる?
JavaのGUIのリスナーみたいなケースなら、デリゲートの
方が何もしないメソッドまで記述しなくて済むし効率いいかな。

255:デフォルトの名無しさん
04/08/07 18:30
>>254
俺は Java 出身だから、ある程度一まとまりの処理をくっつけるならインターフェイス使っている
デリゲートは纏まり間が無くて、単体なら遣いやすいけど微妙

256:デフォルトの名無しさん
04/08/07 21:19
俺はデリゲート派

257:デフォルトの名無しさん
04/08/07 21:22
anonymous class は使えないが、anonymous delegate は使えるようになるので、
デリゲートにしておくのが無難なのでは。

258:デフォルトの名無しさん
04/08/07 23:45
非常に唐突な質問で申し訳ないが、C#で、というか.NET Frameworkで
各ドライブのボリュームラベルを取得するのってどうやるんだべさ?

なんかAPI叩くしかなかったら非常に鬱なので教えてエロイ人!

259:デフォルトの名無しさん
04/08/07 23:48
>>258
DriveInfo.VolumeLabel かな。
…… .NET Framework 2.0 だけど。

260:デフォルトの名無しさん
04/08/08 00:00
2.0で変更になったクラスの一覧ってないかな?

261:デフォルトの名無しさん
04/08/08 00:06
>>259
やっぱ2.0になっちまうのか・・・。
何故こんな基本的なもんが実装されてないんだと小一(ry

262:デフォルトの名無しさん
04/08/08 00:18
[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);

263:デフォルトの名無しさん
04/08/08 00:20
>>262
トンクスエロイ人!
やっぱこうやるか・・・。なんだかなぁ・・・

264:デフォルトの名無しさん
04/08/08 02:15
Socket.Selectで64を超えるソケットリストを渡すと範囲外エラーになるのですが、

この64という制限は何によってかかっているでしょうか。
100に変更したりとかできないでしょうか。

265:デフォルトの名無しさん
04/08/08 11:05
ボタンの配列(二次元)をクリックされた時に、何番のボタンがクリックされたかを調べるにはどうしたら良いですか?
MyButtons[,] = new Button[3,5];
のように宣言されていて、forの二重ループの中で初期化して
MyButtons[i,j].Click += new EventHandler(MyButtons_Click);
みたいにしてみましたが、MyButtons_Clickの引数には別に「MyButtonsの何番目か」は渡されません。
どうしたらいいんですか

266:デフォルトの名無しさん
04/08/08 11:11
>>265
ボタンの番号が固定のものなら、Button.Tag あたりに番号を押し込めておけば良いのでは?

267:デフォルトの名無しさん
04/08/08 11:22
自分が [2,1]だとしたら、[2,0]と[2,2]のボタンも操作したいんですよ。
なんとかなりませんかねえ

268:デフォルトの名無しさん
04/08/08 11:28
>>267
???
だからTagにint[]{2, 1}とかいれとけばいいんじゃないの?

それがまずいというのならもっとわかりやすく説明してくれないと何がなにやら。

269:デフォルトの名無しさん
04/08/08 11:34
>>268
あ、いま意味が分かりましたサンクス

270:デフォルトの名無しさん
04/08/08 12:19
>>264
普通に1000とかできるじゃん……と思ったら.NET Framework2.0だった。

1.1の制限のようだ。

271:デフォルトの名無しさん
04/08/08 12:27
>>264
OS の制限。WaitForMultipleObjects() できる最大数が64だから。
2.0 で表面的な制限は外れても、64を超えると効率は落ちる気がする。

272:デフォルトの名無しさん
04/08/08 13:46
簡単なベンチの結果、数が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は早い。
数が少ない時と多い時のスコアの分布とか。

273:デフォルトの名無しさん
04/08/08 13:50
DataGridで

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

こういう表の MNOとVWXだけ範囲指定させるみたいなことはできますか?

274:264
04/08/08 14:27
>>270-272
環境も書き忘れたのに本当にありがとうございます。
しかもWaitForMultipleObjectsとの関連、
ベンチまでしていただいてとても参考になりました。


275:デフォルトの名無しさん
04/08/09 00:29
クラスのオブジェクトをコピーしたいんだけどよくわからんです。
AObject obj1 = obj2.Clone();
ってすればいいんだろうけど、
Cloneを書くときにCのmemcpyみたいなことってできないんでしょうか?
それともいちいちフィールド一つずつ代入?


276:デフォルトの名無しさん
04/08/09 00:38
Object.MemberwiseClone()

277:275
04/08/09 15:39
>>276
さんきゅ。
それつかってICloneableを実装するのが流儀なのだな。

278:デフォルトの名無しさん
04/08/13 14:30
Point とかの Dispose できないヤツって、Dispose しなくていいの?

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

とかしても大丈夫?


279:デフォルトの名無しさん
04/08/13 15:17
>>278
int a = 0;
a = 1;
a = 2;

とやることにためらいを覚える?

280:デフォルトの名無しさん
04/08/14 04:46
char *p = malloc(100);
p = malloc(100);
p = malloc(100);

とやることにはためらいを覚える。


281:275
04/08/15 15:23
Pointとかは構造体だからOKってことだよね。
正しいクラスはDisposeを持つべきってことか?
自前のやつも?


282:デフォルトの名無しさん
04/08/15 15:30
>>281
もうちょっとGCを信用しようや。
Disposeが必要なのは基本的にUnmanagedなリソースを扱うクラスのみ。

283:デフォルトの名無しさん
04/08/15 16:19
GCはいいんだけど、自分で自由に解放できないのがいまいち

なんか「ゴミをゴミ箱に捨てると清掃員の仕事が減ってリストラされるから、ゴミは道に捨てるべき」とか言ってるみたい

284:デフォルトの名無しさん
04/08/15 17:21
>>283
でも
道に捨てない −> 清掃員の仕事が減ってリストラ −> ごみを捨て忘れても綺麗にならない
だから道に捨てるんだ。


285:デフォルトの名無しさん
04/08/15 17:44
環境は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++でスマートポインタを使っていると切に欲しくなる事があったりします。


286:デフォルトの名無しさん
04/08/15 20:23
Disposeしたところでメモリに対しては何も出来ないんだから意味なし。
まあ、>>285のように思う事はない事もない。

287:デフォルトの名無しさん
04/08/15 20:29
何らかのクリーンアップコードを実行したい場合なんかは、
Disposeを実装すべきである事が多い。
単に使用終了と言う意味合いだけなら、何もする必要なし。
※Dispose実装したところでする事は何もない。
メモリに関しちゃほっとけばいいってのがGCのある環境での基本。


288:デフォルトの名無しさん
04/08/15 20:30
using ステートメント(と IDisposable インタフェイス)ではどこがダメなの?

289:デフォルトの名無しさん
04/08/15 20:47
忘れる可能性があるから、強制できないから。
まあ、>>285の言うようなスマートポインタみたいな物っていっても、
結局直接参照しか扱えないため、包含するクラスは全部そのタイプにしなけりゃ
意味がなかったりして、結局大げさになりすぎてうまくいかないかな。
GCとは相性が悪いね。

290:デフォルトの名無しさん
04/08/17 19:02
MSNメッセンジャーでの「ほげほげがサインインしました」みたいなポップアップ
ダイアログを作りたいのだが,ここにいる諸氏ならばどのようにして実現するか,
意見をお聞きしたい.

291:デフォルトの名無しさん
04/08/17 19:45
出来合いのコンポーネントを使う。

292:デフォルトの名無しさん
04/08/17 20:47
>>290
他にもあるけど

窓の杜 - 【NEWS】米MS提供の.NET開発向けカスタムコントロール集「Visual Basic Power Pack」
URLリンク(www.forest.impress.co.jp)



293:290
04/08/17 21:46
>>292
激しく感謝.ありがとう.


294:デフォルトの名無しさん
04/08/18 18:19
ファイルの末尾数バイトを削除する簡単な方法ってありますか?
一度全て読み込んだ後削除して上書きしか思いつかなくて。。。

消した後、そのファイルに追加を行うので、
消したい部分のみ上書きする方法でもいいのですが。。。

295:デフォルトの名無しさん
04/08/18 18:37
簡単……ねぇ?
上書きなら難しいことでもないけど。

int b = 5;
FileStream fs = new FileStream("hoge.txt", FileMode.Open, FileAcceess.ReadWrite);
fs.Position = fs.Length - b;
StreamWriter sw = new StreamWriter(fs);
以下略

296:294
04/08/18 19:01
>>295
そっか TextWriter に、予め頭だししておいた Stream をぶち込めばよかったのか
ありがとうございますそれでいけそうです

297:デフォルトの名無しさん
04/08/19 16:55
>>295
そっか Mamko に、だしておいた Seishi をぶち込めばよかったのか
ありがとうございますそれで子供できそうです

298:デフォルトの名無しさん
04/08/19 16:57
つまらん

299:デフォルトの名無しさん
04/08/23 08:20
 C#で複数のマウスイベントを検出することは可能でしょうか?
USBマウスとUSBトラックボールをつなげています。こららの移動情報を個別に取得したいと思います。
どうすれば、よいでしょうか?宜しくお願いしまう。


300:デフォルトの名無しさん
04/08/23 08:25
>>299
.NET Frameworkのライブラリじゃ不可能。
Raw Input APIを使う必要がある。
参考:URLリンク(www.hatena.ne.jp)

301:デフォルトの名無しさん
04/08/23 11:16
意外にも、DirectInput じゃ区別できないのよね。

302:デフォルトの名無しさん
04/08/25 06:19
実行ファイルに関連付けられたアイコンをプログラムの中で
使用したいのですが、いい方法はないでしょうか。

なお、今のところ、同一のアイコンファイルを
コンパイルオプションの「/win32icon」、「/resource」の双方を
使って実行ファイルに取り込んでいます。


303:デフォルトの名無しさん
04/08/25 07:12
>>302
/win32icon は API の ExtractIcon/ExtractIconEx で取り出せる。

304:デフォルトの名無しさん
04/08/26 01:30
classとstructを簡単に見分ける方法ってある?
ライブラリのやつとかいちいちマニュアル見るの面倒なんだが。


305:デフォルトの名無しさん
04/08/26 02:15
>>304
VS使ってるならnewのインテリセンスとか。
あんまりclassかstructかを見分ける必要なぞ感じたことがないしな。

306:デフォルトの名無しさん
04/08/26 11:59
ListBoxを縦に二つに分けることはできないんでしょうか。
MultiColumnではなくて、ひとつの項目を二つの列に分けて表示したいんです。
具体的に何をしたいかというと、エラーの内容と発生時刻を表示したいんですが、
発生時刻を左側に、エラーの内容を右側にわけてリストボックスに表示したいんです。
日付は必ず1行ですがエラーの内容は複数行になる可能性があるので、
文字数揃えて表示・・とかよりも縦に二つに割れたら楽だと思うんですけど、どうやってやるのかさっぱりです。
ListBoxで実現するには、あるいはほかのコントロールで実現するにはどうすればいいんでしょうか。

307:デフォルトの名無しさん
04/08/26 12:13
>>306
ちゃんと読んではいないけどGoogleのイメージ検索で引っかかったこれはどうだろう。
URLリンク(www.codeproject.com)

//私ならListViewを使うかな……?

308:デフォルトの名無しさん
04/08/26 12:18
ぶっちゃけ自分で描画したほうが早い

309:デフォルトの名無しさん
04/08/26 14:53
>>308
めんどくさくね?

310:デフォルトの名無しさん
04/08/27 00:14
面倒くさいかどうかというのは実装の早さに関して考慮することじゃないような

311:304
04/08/27 00:43
>>305
そうか。
コピーするときにcloneがいるかとか
遅くなるのかとか、結構気になるんだが



312:デフォルトの名無しさん
04/08/27 03:39
チューンナップなぞ遅さが気になってからすればいいんですよ.

早過ぎる最適化は諸悪の(少なくとも大半の悪の)根源なり -- DEK

313:デフォルトの名無しさん
04/08/27 17:15
AxWebBrowser って ToolTip くっつけられないんだっけ?

314:313
04/08/27 17:16
くだらない質問なのにあげちゃった_| ̄|○

315:デフォルトの名無しさん
04/08/27 20:34
>>305
boxing と unboxing でドツボにはまるぞ。
値型と参照型の違いは押さえておいた方が良い。

316:デフォルトの名無しさん
04/08/27 21:08
だよね。
struct を lock () して排他したつもり、とか。

317:デフォルトの名無しさん
04/08/27 23:58
心配しなくてもできねーよ。

318:デフォルトの名無しさん
04/08/28 22:43
テキストボックスで HOME や END、あまつさえ SHIFT+HOME や SHIFT+END、
CTRL+Z や CTRL+C/V/X を実現するには自分でコードを書かないといけないのでしょうか?

319:デフォルトの名無しさん
04/08/28 22:47
>>318
まず試せ。

320:デフォルトの名無しさん
04/08/28 23:16
Windows.Formにプロパティを加えたんだけど、
デザイナのプロパティウィンドウには表示されませんね。

基底クラス(Windows.Form)に加えたプロパティは
派生クラス(Windows.Form)のデザイナに反映される
みたいだけど、自分自身ならなぜだめなのかなぁ。


321:デフォルトの名無しさん
04/08/28 23:51
>>320
まったく同じレスをどこかで見たなぁ。

322:デフォルトの名無しさん
04/08/29 12:53
>>321
俺も見た記憶があるので探してみた
スレリンク(tech板:294番)

323:306
04/08/29 14:08
>>307,308
遅ればせながら・・・
ListViewでいけました。
ありがとうございました。
詳細表示なんてさっぱり思い浮かびませんでした。

324:318
04/08/29 14:41
>>319
できました…。幻覚でも見ていたのかもしれません。
でも CTRL+A ってできないんですね。

325:デフォルトの名無しさん
04/08/30 17:43
1pxの点 . を任意の座標表示するにはどうしたら良いんでしょう?
1,1 - 1,2まで幅1の線を引くと、どうも2pxくらい線が引かれちゃうし
1,1 - 1,1にすると線ができないんです。

326:デフォルトの名無しさん
04/08/30 18:05
>>325
Bitmap に SetPixel で点を描いて、Graphics.DrawImage で画面に描写。

327:デフォルトの名無しさん
04/08/30 18:13
他には、
FillRectangle(DrawRectangleは不可)で幅・高さ1の四角を描画。
Graphics.GetHwndで取得したデバイスコンテキストにWin32APIのSetPixelで描画。

……元画像のビットマップを取得できるならBitmap.SetPixelが一番手っ取り早い/速いんだけどねー。

328:デフォルトの名無しさん
04/08/30 19:13
それ俺も気になって調べたんだけど
点を描画するGraphicsクラスのメソッドはないみたいなんだよね
結局SetPixelで妥協したけど、
Graphicsオブジェクトを使って描画を行うというルールから離れるからあんまりやりたくない

329:デフォルトの名無しさん
04/08/30 19:18
……327のGetHwndはGetHdcの間違い。
//user32.dllのAPIをまとめたクラスを最近作ってるからhwndまみれでつい。

330:デフォルトの名無しさん
04/08/31 00:59
>>328
Graphics はベクタ形式を含む一般的なグラフィックを扱うクラスだから、“点”という概念がないのよね。
数学的には、点は半径が無限小の円と等価な存在で、半径0の円は画面に表示できないから。

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

Graphics に元画像のビットマップを取得するメソッドがないのは、
将来的に(Avalon で)、OS 自体をベクタ画像ベースで動くものにするつもりでいるからじゃないかな。

331:デフォルトの名無しさん
04/09/05 13:36
>>330
目から鱗

332:デフォルトの名無しさん
04/09/08 21:18
URLリンク(www.atmarkit.co.jp)
の記事をみてSQL Server 2000を使ってみようと思い立ったんですが、
とりあえず URLリンク(www.microsoft.com) をインストールして
みたのですが、ヘルプをみても使い方がサッパリ分りません。
インストールするとタスクトレイにDBのアイコンがでますが、これのサービスをスタートしようとすると
エラー1069(ログオンに失敗したため、サービスを開始できませんでした)となってしまいます。
これってまず何をすればいいんでしょうか?

333:デフォルトの名無しさん
04/09/09 01:51
はじめまして。
URLリンク(mobiquitous.com)
これを使って、IEツールバーのボタンが押されたらあるページがIEに表示されるように
したいのですが、どうすればIEを操作できるのか見当がつきません。
何か関連ありそうなキーワードがあれば教えてください。よろしくお願いします。

334:デフォルトの名無しさん
04/09/09 12:55
>>333
Site もしくは Site の IServiceProvider 経由で IID_IWebBrowser もしくはIID_IWebBrowserAppを
得て Navigate すればいいんじゃない?

335:333
04/09/09 22:37
>>334
ありがとうございます。
調べてみます。


336:デフォルトの名無しさん
04/09/10 16:44:32
アプリケーションをフォームが非表示の状態で開始するにはどうやればいいか教えていただけますか?
Application.Run の前に CreateControl して Hide して、Visible を false にしてもなぜか表示されてしまいます・・・


337:デフォルトの名無しさん
04/09/10 17:01:55
>>336
URLリンク(www.microsoft.com)

個人的にはApplication.Run()でやることが多いけど。

338:デフォルトの名無しさん
04/09/10 21:30:59
>>337
これだと確かに表示はされないけれども、Load イベントも上がらないし・・・
普通の Win32 アプリでいう WS_VISIBLE でない状態でウィンドウそのものは作りたい、
というような状況なのです。CreateSuruct でも override してみるかなぁ。

339:デフォルトの名無しさん
04/09/10 21:56:22
CreateParams を override して WS_VISIBLE を落としてもダメ、
Form の Load イベントで this.Hide() しても this.Visible = false; してもダメ、
Application.Run を Form.ShowDialog にしてもダメ。
(関係ないけどRun の代わりに ShowDialog 使うと Dialog 終了後のメッセージが処理されないので
表示した NotifyIcon を Form が Close される前に消さないとゴミが残る・・・)

VisibleChanged イベントのハンドラで Hide すると何とか消えるけど、一瞬表示されるのでちらつきます。
タスクトレイにいきなり常駐するユーティリティとかどうやってみんな作ってるんだろう。

340:デフォルトの名無しさん
04/09/10 22:03:18
>>339
>  タスクトレイにいきなり常駐するユーティリティとかどうやってみんな作ってるんだろう。

NotifyIconとかを管理するクラスを作り、その中のContextMenuでフォームのShow/Hideを扱う。
メッセージループはApplication.Run()でメインウィンドウを持たせずに開始する。

341:デフォルトの名無しさん
04/09/10 22:46:49
>>340
できました!ありがとうございます。

342:デフォルトの名無しさん
04/09/17 11:41:58
パフォーマンスを計るのにスレッド単位でCPUのTickTimeを取得したいのですが、
(Sleep中または別スレッドが走っている時はカウントしない)
そういうクラス知っている人いますか?


343:デフォルトの名無しさん
04/09/17 11:48:25
Type.InvokeMemberからBindingFlags.GetPropertyでプロパティを取得する時、
返り値がobject配列なのですが、どうすれば各要素にアクセス可能になるでしょうか。
単に返り値をobjectとして取得することはできたのですが、その後が分かりません・・

344:デフォルトの名無しさん
04/09/17 11:50:48
>>343
言ってる意味がよくわからない。
もうちょっと具体的に。

345:デフォルトの名無しさん
04/09/17 12:07:17
ごめんなさい、分かっちゃった。
こうしたかっただけです。

obj = type.InvokeMember("array", BindingFlags.GetProperty, null, doc, new object[] {2});
* これで二番目の要素をゲット

お騒がせしました。

346:デフォルトの名無しさん
04/09/17 14:41:43
bmp=new Bitmap(filename);
これをdisposeせずに、また
bmp=new Bitmap(filename2);
を呼び出したらメモリー減って行きますか?
それとも、同じ変数のメモリー番地に上書きされるだけですか?

347:デフォルトの名無しさん
04/09/17 14:45:31
>>346
もちろん新しいメモリが確保される。
インスタンスのサイズが違うかも知れないのに上書きしちゃまずいだろ。

348:デフォルトの名無しさん
04/09/17 14:47:10
って、参照先じゃなくて変数そのもののアドレスか?
それなら上書きされるが。
つかそんなことに頭を悩ます意味は全くないが。
あとそれとDisposeとは何の関係もない。

349:デフォルトの名無しさん
04/09/17 14:58:36
bmpの中にある画像データを替えたかっただけなんです。
>って、参照先じゃなくて変数そのもののアドレスか?
>それなら上書きされるが。
という事は、前の画像データが消えて新しい画像データに上書きされるって事ですよね?

350:デフォルトの名無しさん
04/09/17 15:08:05
> という事は、前の画像データが消えて新しい画像データに上書きされるって事ですよね?

画像データとか言わずBitmapインスタンスと言おうな、こういう場合。

まあ、そんな感じ。
細かく言うなら、「変数が示す参照先が書き変わる」。
変数が、古いインスタンスを丸めてポイして、新しいインスタンスにべったりくっつくわけだ。

//丸めてポイされたインスタンスはいずれGCが片づける。

351:346
04/09/17 15:10:47
なるほど、色々ありがd。

352:デフォルトの名無しさん
04/09/17 15:16:45
>>346微妙に誤解してないか?
>>350の書いてる内容は間違っちゃいないんだけど、
読み方によっては>>346が誤解してしまうように思う。

依然
>という事は、前の画像データが消えて新しい画像データに上書きされるって事ですよね?
のように言ってるからね…
まあ画像データが上書きされるってのを、プログラム上からはというか、
プログラムでの操作上はそのように見えるってだけの意味で言ってるのなら大丈夫かもしれんが…

353:デフォルトの名無しさん
04/09/17 21:16:06
>>346
上書きはされないよ。例えば、

Bitmap bmp = Bitmap(file1);
aForm.BackgroundImage = bmp;

なんてしておいて、後で
bmp = Bitmap(file2)
なんてやってもフォームの背景は変わらない。

前の画像は前の画像、新しい画像は新しい画像、お互いなんの関係もない。

354:デフォルトの名無しさん
04/09/17 21:48:51
プロパティに設定するときはインスタンスのコピーをとってるんだろうか

355:デフォルトの名無しさん
04/09/17 22:26:56
>>354
とってないよ。だから Dispose なんかしちゃだめだよ。

356:デフォルトの名無しさん
04/09/17 23:38:22
Disposeは微妙な存在。

357:デフォルトの名無しさん
04/09/18 10:40:22
>>342 の続きなんですが、スレッドがSleep等で停止したり、再開したりする時に
コールバックもしくはなんだかの形でフックを掛けることはできないか知っている人いませんか?

358:在日参政権反対
04/09/18 12:36:45
>357
単純にメソッド余分じゃ駄目なの?他のスレッドに何かさせたいんでしょうか?ならイベントとか?

359:デフォルトの名無しさん
04/09/18 13:51:36
>>358
システム側でスレッドが切り替えられたときにも引っ掛けないとパフォーマンスが計れないです。


360:在日参政権反対
04/09/18 14:13:26
パフォーマンスカウンターオブジェクトのスレッド実行時間では?

361:デフォルトの名無しさん
04/09/23 02:34:14
はじめまして。
プログラミング自体初心者なのですが、
VisualStudioC#で作ったプログラムの
テキストボックスの中でバックスペースが効きません。
これってなんとかならないものでしょうか。


362:デフォルトの名無しさん
04/09/23 02:40:37
Ctrl+H

363:デフォルトの名無しさん
04/09/23 15:42:18
前の文字を消すための代替方法を探しているのではなくて、
テキストボックスでバックスペースキーを認識する方法を探しています。



364:デフォルトの名無しさん
04/09/23 15:48:46
と言われても私の周辺では普通に有効だし。
コード上で変なことをしてるかキーボード補助系のなんかのアプリを使ってるか、果てしなく環境依存な話になるし。
そもそもTextBoxはWindowsの標準エディットコントロールをラップしてるだけだしなぁ。

365:教えてください
04/09/24 08:46:54
C#初学者です。
ナンバーズ予想ソフトをVC#で作りたいと思っています。
Winアプリで、ナンバーズとか株の最新データを取得してくるソフトが
ありますが、あれってどのような仕組みでやっているのですか?
何か参考になるサイトや書籍などあれば教えてください。

366:デフォルトの名無しさん
04/09/24 11:16:52
>>365

1.サイトからHTML(など?)をダウンロードする
2.ダウンロードしたHTML(など?)からナンバーズのデータを取得
3.取得したデータから、予想する

大雑把にこんな感じでやればいいのでは。

367:在日外国人参政権反対
04/09/24 11:32:46
ナンバー図は知らんが、株はサイトと直接ソケット接続してデータやり取りするものもあった希ガス.

368:365
04/09/24 12:59:54
>366
ということは、まずHTMLのソースを元に配列化して、データを取得するということでしょうか?

取得の仕方だけが分からないんで・・・

369:デフォルトの名無しさん
04/09/24 13:03:00
まずデータがどこにどういう状態/形式でおかれているか、によって話は全く違った方向に転がっていくだろう。

370:366
04/09/24 15:17:28
>>368
それは各自の工夫です。そんな甘いものではないはず。

まあヒントを。HTMLをダウンロードすることを前提に話すけど。
ダウンロードしたHTMLのうち、必要なデータがある場所というのはサイトの構成が変わらなければいつも同じなはず。
そういうのを、文字列の検索とか正規表現とかで探し出す。
運よく取得するサイトがXHTMLになっている場合は、System.Xml名前空間を駆使すれば楽になるかもしれない。

371:在日外国人参政権反対
04/09/24 15:55:14
>365
何がわからないのか明確にしる
ソースの場所
ソースの形式
そのソースの取得方
プログラムの書き方
全部

372:デフォルトの名無しさん
04/09/24 19:47:18
HttpWebRequest

373:デフォルトの名無しさん
04/09/25 14:06:36
ネットワークゲームを作る際に、通信に最初(ログイン)から最後(ログオフ)まで
BinaryFormatter もしくは SopaFormatter にてシリアル化したオブジェクトのみを使用する事に問題点はありますか?

374:デフォルトの名無しさん
04/09/29 00:02:22
>>373
なんか問題があったときにスニファで見てもよくわからないとかが
ありそうなので、おいらは使わない
Soapはしらないけど、効率わるいんじゃないの?

375:デフォルトの名無しさん
04/10/02 10:37:47
値型のnewってヒープを食わないんですよね?デフォルトのコンストラクタが呼ばれるだけで。
同じ変数に2回以上newした場合はどうなんでしょう。
ループの中で構造体とかを初期化したいがためにnewでクリアしようとするのは
問題ないんでしょうか?
すごく抵抗を覚えるんですが・・・

・パターン1
A a = new A();
for (int i = 0; i < 10000; i++)
{
a = new A();
// 以降Aを設定する処理
}

・パターン2
for (int i = 0; i < 10000; i++)
{
A a = new A();
// 以降Aを設定する処理
}

・パターン3
A a = new A();
for (int i = 0; i < 10000; i++)
{
// 自力で初期化
a.xx = "";
// 以降Aを設定する処理
}
パフォーマンス的には3が一番いいような気がしていますが。
構造体を再度初期化する方法ってnew以外にあるんでしょうか?


376:デフォルトの名無しさん
04/10/02 11:03:46
>>375
ボクシングされなければ、既に在る領域をコンストラクタで初期化しているだけのような気もする
……中を見てみないとどうにもいえないけど

不安ならば、パターン3の拡張として、
A に SetData みたいなメソッドを作り、そこで一気に値を変更してみればいかがか?

377:デフォルトの名無しさん
04/10/02 11:21:45
>>375
> パフォーマンス的には3が一番いいような気がしていますが。
少なくとも速度的には一番悪い。
1と2では差は無し。意味的に大した違いも無し(aの寿命だけ。実質的な動作は同じ)

> 構造体を再度初期化する方法ってnew以外にあるんでしょうか?
static readonlyなEmptyフィールドを用意するとか。
意味的にはnew()するのと変わりませんよ?

> ループの中で構造体とかを初期化したいがためにnewでクリアしようとするのは
> 問題ないんでしょうか?
> すごく抵抗を覚えるんですが・・・
そんなことよりも、初期値を指定しないで初期化する構造体の方に抵抗を覚えるな。


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

5311日前に更新/230 KB
担当:undef