C♯相談室 Part16

このエントリーをはてなブックマークに追加
1名無しさん♯

(#゚ー゚)つ < C#、.NETの話題はこちらでどうぞ。


過去スレは>>2-5あたり。

関連リンク
http://onigiri.s3.xrea.com:8080/csharp/index.php?%5B%5B%A5%EA%A5%F3%A5%AF%5D%5D
2名無しさん♯:04/06/15 20:05
C#のお勧めの参考書があれば教えてください。

いまはnagadon氏のメルマガバックナンバで勉強中です。
Webからhtmlを取得するのにこのような方法を取ってますが、何度も繰り返していると
「WebResponse res = req.GetResponse() as HttpWebResponse;」の箇所で何故か
”メモリが不足しています”というcatchできない例外が発生してしまいます。
メモリや不要リソースは意識してDispose()やnullしてるので、例外発生時でも余裕で700MBほど空いています。
一度に接続しているのは1本のみで、1本読み終わって次に移るようにしています。

色んなサイトのサンプル(@IT、Space仮面、緑単車等)で試して今は"as"でやってますが、
「HttpWebRequest req = WebRequest.Create(url) as HttpWebRequest;」を
「HttpWebRequest req = (HttpWebRequest)WebRequest.Create(url);」でやっていたときでも同じでした。

解決策のヒントだけでもおながいします。

// 最低限で書きましたが、実際にはそれぞれの処理でtry&catchしてます。
private void gethtml(string url, ArrayList htmlbuff) {
  ArrayList txt = new ArrayList();
  HttpWebRequest req = WebRequest.Create(url) as HttpWebRequest;
  webreq.KeepAlive = true;
  webreq.Timeout = 30 * 1000;
  WebResponse res = req.GetResponse() as HttpWebResponse;
  System.IO.StreamReader rd = new StreamReader(res.GetResponseStream(),
              System.Text.Encoding.GetEncoding("euc-jp"));
  while(true) {
    string str = rd.ReadLine();
    if(str == null) break;
    htmlbuff.Add(str);
  }
  rd.Close();
  res.Close();
}
54:04/06/16 00:47
あ、「private void gethtml(string url, ref ArrayList htmlbuff) 」のref書き忘れてました。
実際にはrefついてます。
前スレに100件以上のフィールドがうんたらって話がありましたけど、
私の環境は2003なのに、100件以上のフィールドを持つテーブルを使用したところ
コマンド文の自動生成のところでエラーが出ました。
クエリビルダで数を減らしたところ、正常に各コマンドが生成されてました。

これは一体なぜですか?
>>4
再現しないなぁ……。
84:04/06/16 10:25
取り込みルーチンをThreadでやってるせいなんでしょうか。

1)ArrayListに10個ほどのURLを入れる
2)読み込み用スレッドを起動
3)スレッド内で>>4のような方法で読み込み
4)全部読んだらスレッドを終了
5スレッドの終了を確認 (全て読み込み成功)

6)またArrayListに10個ほどのURLを入れる
7)読み込み用スレッドを起動
8)スレッド内で>>4のような方法で読み込み
9)ここでreq.GetResponse()で「メモリ不足」例外が発生
10)でも、例外を無視して”継続”を押すと何事も無かったかのように以後は正常に動作 (全て読み込み成功)

11)更にまた1〜を行っても、もう例外はでない

・・・というような感じで「メモリ不足」が発生するのは2回目のスレッド起動の1回目の
req.GetResponse()だけなんです。1回目や3回目以降のスレッド起動では発生しません。

しかもreq.GetResponse()で発生してるにもかかわらず、何故かエラーの内容が
「メモリ不足/System.Drwaing.dll」なので原因の特定もできずにまいってます。
94:04/06/17 00:53
もしかしたらVS.NET20003のバグかもしれません。
Debugだと確実に再現するんですが、Releaseだと何の問題もありませんでした。
>>9
VC++ での話だけれども
バッファあふれのあるプログラムで Debug だと実行時エラーになるけれども
Release では実行時にエラーが出ないことがあったよ
>>10
その辺もチェックしてみます。
ありがとうございます。
12デフォルトの名無しさん:04/06/17 20:25
アプリケーションのセットアップを作成して
デスクトップにショートカットを作成したのですが、
作成したショートカットにファイルをドラッグしても
禁止マークが出てしまいます。
ダブルクリックしてアプリケーションの起動は普通に
出来るのですが、原因が良くわかりません。
インストールしたアプリケーションより直接
ショートカットを作成した場合は普通にドラッグして
ファイルを渡すことが出来ます。

作成手順は
ファイルシステムの「ユーザのデスクトップ」に
ショートカットを作成し、以下のように設定しました。
Name:アプリ名
Arguments:(空欄)
Description:(空欄)
Folder:ユーザーのデスクトップ
Icon:(アイコン)
ShowCmd:vsdscNormal
Target:プライマリ出力
Transitive:False
WorkingFolder:アプリケーション フォルダ

です。

どこが問題なのか指摘していただければ幸いです。
よろしくお願いいたします。
C#でUPnP使いたい時に参考になるリソース教えてください
14デフォルトの名無しさん:04/06/17 23:09
dobonで以下の記事を発見して、アプリケーションに関連
づけられている動詞の取得を試しているのですが
どうもデフォルトで起動する動詞が出ない気がします。
あと、動詞をコンテキストメニューのように日本語化
したいのですがそれもいまいち解りません。
もしご存知の方がおられましたらお教えください。
宜しくお願いいたします。

ttp://dobon.net/vb/dotnet/process/getverbs.html

>>14
自力でレジストリを参照するしか無いっぽいよ。
因みにProcessStartInfo.Verbsはアルファベット順に並ぶだけ。
ProcessStartInfo.Verbは自分で設定する用(デフォルトは空文字列)。
Anders Hejlsberg - Programming data in C# 3.0
http://channel9.msdn.com/ShowPost.aspx?PostID=10276

"On of the things that we are trying to think about deeply in C# 3.0 is this big gap
that I still see between general purpose languages and databases...
Anyone who's building an enterprise app is using both worlds...
There's certainly a lot of progress we can make by truly marrying these worlds...
It's nothing but mismatch. We gotta do away with that."


Xen(,Cω)取り込んで、Xen自身は陽の目を見ない、あるいはF#的な扱いってことかな?


しーふぐり?
18デフォルトの名無しさん:04/06/18 09:01
(,Cω)
19デフォルトの名無しさん:04/06/18 18:44
質問です。
C#で、SQL文でウェブサービスを使ってDataSetを取ってきてるのですが、
その最中に、
スレッド '<名前がありません>' コード 0 (0x0) で終了しました。
という文が、出力欄に出てきます。
データ量の多いものだと、4回くらい出てきます。
これが時間のかかる原因だと思っているのですが、
このメッセージの意味は何なのでしょうか?

よろしくお願いします。
20デフォルトの名無しさん:04/06/18 19:21
初心者というか今から始める入門者です。
 オセロや将棋や囲碁を自分のPCで一からプログラムしたいのですがお勧めの
書籍&ソフトを教えてください
>>20
必要なソフト:Windows
本:「馬鹿でも分る日本語入門」

以上
22:04/06/18 19:59
ASP.NETで、CAB圧縮/解凍を行いたいのですが、いいコンポーネントは
ないですか。
>19
それは単に内部で起動されたスレッドの終了時
メッセージでは?

Webサービスは基本的に遅いね。
なので多少の遅さには目を瞑ってSOAPの相互運用性を
生かしたいときに粒度の大きいメソッドで作るのがコツ。
現場でもJavaとの相互運用案件ばっかりだしな。

DataSetなんて、ほとんど.NET前提なんだから
ASP.NET経由のリモーティングでもいいような気が
するよ。

>22
前スレ685
>20
二人用の将棋ゲームなら簡単だな
画面描画が中心だ

コンピュータと対戦できるようにするなら
大変そうだな
26デフォルトの名無しさん:04/06/18 20:49
27デフォルトの名無しさん:04/06/18 22:26
streamreaderを使ってウェブを読み取ろうとするとたまに
データが欠落することがあるんですが下のコードって間違ってますか?

WebResponse response = request.GetResponse();
Stream recieveStream = response.GetResponseStream();
Encoding encode = Encoding.GetEncoding("EUC-JP");
StreamReader sr = new StreamReader(recieveStream, encode);
StringBuilder data = new StringBuilder();

int bufSize = 1024;
char[] buf = new char[bufSize];
int count = sr.Read(buf,0,bufSize);

while(count>0)
{
data.Append(buf);
count = sr.Read(buf,0,bufSize);
}
sr.Close();
recieveStream.Close();
response.Close();
28デフォルトの名無しさん:04/06/18 23:07
C#でWinアプリを作成しています。
PictureBox上にマウス動作で描画するアプリなのですが、
そのままではPictureBoxがフォーカスを受け取らないので
カーソルキーでの操作等を実装しようとしたとき、ほかのコン
トロールに制御を奪われ困っています。
マウスでクリックしたとき強制的にフォーカスを移動したりした
のですが、スマートクライアントにするとエラーが出ます。
できればタブキーでフォーカスを受け取るコントロールにしたい
のですがどのようにすればよいのでしょうか。
アドバイスよろしくお願いいたします。
29最凶VB厨房:04/06/18 23:36
>>27
たまにか?毎回最後欠落するだろ。
簡単にやるならsr.ReatToEndだったか忘れたが、それ使え。
>>29
Reatしてもいいですか?
31最凶VB厨房:04/06/19 00:14
ワロタ。ReadToEndね
>>28
FormのKeypreviewプロパティを使えばどうですか?
33デフォルトの名無しさん:04/06/19 13:18
>>29

27でつ。.net FWのヘルプにはstreamreader.readtoendはあんまり信頼性
がないからなるべく使わないでね、的なことが書いてあったのでreadでいったん
ですが、、、、

参考までに>>27のコードはどこがタコなんでしょう。
とりあえずきちんとゲットできているように思えるときもあるんですが
34デフォルトの名無しさん:04/06/19 13:18
クリックとかのイベント時に音を鳴らしたいのですが、どうすればよいでしょう?
お願いします。
>>33
Streamから直接Readするってのは?
バイト配列を一旦MemoryStreamに納めて、後で文字列にエンコード。
//過去ログにサンプルコードがあったはずだがみつかんない……
36デフォルトの名無しさん:04/06/19 14:10
>>35
今はこんな風にしてますがこれだと何の問題もありません。

MemoryStream ms = new MemoryStream();
int count;
while((count = recieveStream.Read(buf,0,bufSize)) > 0)
{
ms.Write(buf,0,count);
}

buf = ms.ToArray();
string data = encode.GetString(buf);

27のコードはなんかおかしいんだすかね、、、、
多分だけど、途中でエンコードが入ってしまうのがまずいんだと思う。
半端な長さまでダウンロード・バッファリングしたところでエンコードが発生するからじゃないかな。
同期で読むときは漏れはいつもこうしてる。
もちろんtry/catchも入れてるが。

ArrayList buff = new ArrayList();
HttpWebRequest req = (HttpWebRequest)HttpWebRequest.Create(url);
WebResponse res = (WebResponse)req.GetResponse();
System.IO.Stream s = res.GetResponseStream();
System.IO.StreamReader r = new System.IO.StreamReader(s, System.Text.Encoding.GetEncoding("euc-jp"));
while(true) {
string str = r.ReadLine();
if(str == null) break;
buff.Add(str);
}
r.Close();
s.Close();
res.Close();
>>34
MMControl
40デフォルトの名無しさん:04/06/19 16:06
これだけ言わせてくれ


「Unicode逝ってよし!」


41デフォルトの名無しさん:04/06/19 16:23
ListBoxにおいて、MouseWheelイベントを使って、独自のスクロールを
させたいのですが、何もしなくてもWheelで動いてしまうため、
動きがバッティングしてしまいます。
Wheelを完全に横取りするにはどうすればよいでしょうか。
宜しくお願いいたします。
>>41
hook
43デフォルトの名無しさん:04/06/19 16:53
早速の返事ありがとうございます。

キーワードより以下のページを見つけました。
http://support.microsoft.com/default.aspx?scid=kb;ja;318804

色々試して見ます。
4441:04/06/19 19:34
うーむ、難しいっす
Javaみたいにメソッドとかを非推奨に指定して
そのメソッド呼び出しを含むコードをコンパイルすると
warningが出るようにする方法ってないでしょうか?
>>45
Obsolete Attribute使えばいいんじゃないかな。
47デフォルトの名無しさん:04/06/20 03:26
C#のプロパティって結局メソッドとあまり変わらないじゃん?
Java派の俺から見たら混乱を生むだけのゴミに過ぎん。
なんか痛い人が...
Javaのget/setって結局プロパティとあまり変わらないじゃん?
C#派の俺から見たら混乱を生むだけのゴミに過ぎん。
50デフォルトの名無しさん:04/06/20 07:24
sageて書き込んでは説得力無し。
5145:04/06/20 13:08
>>46
こいつを探してたんです。
ありがたいです。
>>50
ageてる方が厨房。
FontクラスのインスタンスからToString()で文字列形式に変換したのですが、
この変換後の文字列を再びFontクラスのインスタンスに戻すことはできますか?

つまりこういうことです
  Font → string → Font
なぜこんなことをやっているかというと、XMLにシリアライズするときに
Fontをダイレクトにシリアライズできないのでいったん文字列を
経由するというわけです。
ヘルプを読んでもこの逆方向のメソッドが見あたりません・・・
よい手だてがありましたら教えて頂けると幸いです。
よろしくお願いいたします。
>53
カスタムシリアライゼーションやるんでしょ?じぶんでFontつくればいいじゃない
>>54
そうです。
仕方ないので、フォント名、色、サイズについて抽出して
保存することにしました。
書式に関しては使うつもりはないので。

Colorについても同様の現象で困ってるのですが、
Color.Nameで抽出した文字列からColor型のインスタンスにすることは
できないのでしょうか?
Fontと違って構造体だからコンストラクタもついてないんですよね・・・
Colorに関してはColorTranslator.FromHtml(string)
でいけました。
Fontなんてよく使うクラスがシリアライズできないなんて
不便ですね・・・
FontConverterクラスで
基本的にこの辺の奴はTypeConverterを使うのが簡単。
スクロールバーをクリックしたときのイベントハンドラって
存在しないんでしょうか。

ttp://dobon.net/vb/dotnet/control/firescrollevent.html
これを試してみましたが、フォーム上のパネルの
スクロールバーをクリックしても何の通知も来ませんでした。
(フォームのスクロールバーのみ可?)
>>59
>  スクロールバーをクリックしても何の通知も来ませんでした。
Formの子クラスでWndProcをオーバーライドしてない?
メッセージを受け取るコントロールでオーバーライドしないと駄目だよ。
その場合なら
public class ScrollPanel : Panel {
   protected override void WndProc(ref Message m) {...}
}
ScrollPanel panel1 = new ScrollPanel();
//以下略
6159:04/06/20 22:55
>>60
早いレスをありがとうございます。いけました。
C♯って、かゆところへ変に手が届かない場面が多々で
先行き不安です。
EmEditor のように JavaScript や VBScript を使うことは可能でしょうか?
Microsoft.JScript を試してみましたがなんか違うような・・・。
があ、何がやりたいんだ???
>>61
そういうのは特殊だからな。
嫌ならスクロールバー単体を自前で貼り付けろ。
単なるクリックならコントロールでイベント発生させなくても
MouseDownで座標チェックすればいいんじゃ?
66デフォルトの名無しさん:04/06/21 11:57
vb6で使ってたOcxをC#でも使って見ようと思って乗せて見たんですが、
Ocxのあるメソッドを使うとSystem.NullReferenceExceptionが発生します。

最初はエラーすら出なかったんですが、try/catch をつけたら例外出してる所を
見つけました。が、なんでSystem.NullReferenceExceptionなのかがわかりません。

そのメソッドに渡してる変数の中身は、デバッグウィンドウで確認しましたが
空ではありませんでした。

Ocxの使用はC#で何か特に注意事項ってあるんでしょうか?
>>66 これ?
スレッド: VB6.0で作成したユーザーコントロールについて
http://www.gdncom.jp/general/bbs/ShowPost.aspx?PostID=10836
>そういうのは特殊
スクロールバーのクリックを取得するのって特殊かなあ。
それよりスクロールバーコントロールを貼りつける方がよほど特殊かと。
バーの描画やスクロール位置も全部自前で行わないといけなくなるし、
パネルの右下が
  V               V
>□    ではなく    >    とか    >V    
になるんじゃない?
実用上は問題ないかもしれないけどスマートじゃないなあ。

>MouseDownで座標チェックすれば
MouseDownはクライアント領域上でないと発生しないから、
スクロールバーのクリックは検知できないよ。
.NETがラップしてない部分をDllImportで書いてゴリっちゃうのは難しくないが、
将来的に互換性が不安。
多分当分は大丈夫だと思うけど。
LonghornでWinFXになっても、Win32APIのDLLはManagedのラッパとして残るだろうから。
二度手間でパフォーマンス低下は当然だが。
7162:04/06/21 17:19
>>63
EmEditor のようなことがしたいのです。
たとえば、文字列操作など
>>71
WSHとかを使うのなら、アセンブリをCOMに登録するのが基本。
ttp://www.microsoft.com/japan/msdn/library/default.asp?url=/japan/msdn/library/ja/cpguide/html/cpconExposingNETFrameworkComponentsToCOM.asp

簡単な物なら自前でインタプリタそのものを作ってみても良いかもしれんけどね。
73デフォルトの名無しさん:04/06/21 19:13
単刀直入に聞こう。
C#でネトゲを作ることはできるか?
おまえならできる。
>>68
MouseDownをoverride
>>73
DirectX使えるんだからできるでしょ。
>>73
単刀直入に言おう。
お前にはできん。
俺が10年は保証する。
タイプライブラリを公開してないDLLから取得できる
生のCOMインタフェースポインタを触る必要がある場合
どうするのがいいんでしょう
>>78
リフレクションかレイトバインド。
VB.NETの方が扱いが楽。
>>79
回答ありがとうございます
ええとそれはDispatchインタフェースの場合の話でしょうか?
私が想定しているのは、(Extended)MAPIでして
Dispatchじゃなくてtypesafeなインタフェースポインタが取れるんですが
typelibはないんです。
同じ話になりますか?
>>81
あ、実はそこは調べて発見したのですが

オープンソースでないのでちょっと不安というのと
私の環境ではエラーになっちゃうみたいで……
mscorlibのバージョン違いなのかなと思われるんですが
何度もすいません。C#でUPnPを使うサンプル等あれば教えてください。
IntelのUPnP SDKあたりをみてみては?
85デフォルトの名無しさん:04/06/22 09:25
分数や循環小数を結構正確に扱うクラスまたは構造体を作ろうと考えています。
クラスと構造体、どちらで作ったほうがいいでしょうか?
意味的には値型の方が相応しいだろうね。
派生させる必要がない限り構造体の方が良いんじゃないかな。
メモリはガベコレが解放するけど、GDIリソースは自前で解放するルールみたいですが、
Brushを解放しないままアプリが落ちちゃった場合、リソースは解放されますか?
また、staticでBrushを保持して、Disposeなしでアプリ終了したときはどうですか?
>>87
ランタイム終了時にきちんと開放されるから心配するな。

> メモリはガベコレが解放するけど、GDIリソースは自前で解放するルール

これはあくまでアプリを長期起動したり、リソースの確保が頻繁な場合の話。
>>87
APIなどでOSのリソースを直接使用した場合はOSの仕様で決まる。
NT系OSなら大丈夫だ。9x系は怪しそう。
>>89
でもストリームは自分で閉じなきゃダメでしょ?
StreamReaderとか。
覚えても反復しないとすぐ忘れてしまう。
皆さん物覚えがいいですね
>>91
年ですね。引退を考えた方がいいかも。
93和田:04/06/22 12:10
プログラミングなんて所詮暗記力が命だからな
>>91
体に痛みを与えると記憶力が上がる。
ストレッチをしながら本やドキュメントを読むと
もしかしたらスっと頭に入る、かも。
ストレッチといっても激痛を感じる程にやるんだぞ。
試してみることを勧める。
95和田:04/06/22 12:12
>>94はおれ
96デフォルトの名無しさん:04/06/22 14:13
ListViewについて教えてください。

あるArrayListの内容を1データずつ取り出してListViewItemを作成して、
ListViewに入れたとします。
ListViewからSelectedItemsで取り出したものとArrayListのデータを
結び付けるにはどうすればよいのでしょうか?
選択されたものをArrayListから消したいんです。
>>96
ArrayListの中に入ってるデータのクラスに依るけど。

一番手っ取り早いのは、各ListViewItemのTagプロパティにそれぞれのArrayListから取り出したデータを入れとくことだ。
こうしとけば、
foreach (ListViewItem item in listView.SelectedItems)
   arrayList.Remove(item.Tag);
だけで済む。
98デフォルトの名無しさん:04/06/22 16:54
プログラムのX印を普通に押したときの終了処理と、VSStudioの■の停止ボタン押したときの終了処理って
何が違うんでしょか?

デバッグ中、■ボタンならエラーがでらんのですが、フォームのXで終了するとエラーが出ます。
なして?
>>98
強制終了させてる
>>90でもストリームは自分で閉じなきゃダメでしょ?
>>89が言ってる意味では別に駄目じゃない、別の意味で普通は駄目だけど。
「ストリームは自分で閉じなきゃダメ」の意味を取り違えてないかい?
>>98そりゃあんたのプログラムに問題があるからだろう。
>>87
最終的には普通OSがちゃんと開放するし、
Disposeがある奴は標準のクラスならFinalizeで開放されるから、
普通は大丈夫。普通はね。
103デフォルトの名無しさん:04/06/22 23:18
>>98VSStudioってなんじゃらけ?
何が違うってか、全然違う。
ハンドルが足りなくなったときにGCしてくれるかというと
んなことはないので結局ダメだよ
>>104そういう意味ではもちろん駄目なんだが、
今の話はアプリが終了した場合の話だから、
こちらの意味では別に大丈夫なんでないの?
C#の普及は進んできてるようですが、実行速度とかはどうなんでしょうか
単純に実行速度自体は思ったより早い。
WindowsForm関連は遅い。
ってのが何となくの印象。
JAVAよりは早いな
初回起動時は致命的に遅いけど、後は普通。
初回起動時の重たさもJAVAの重さに比べれば許せないほどじゃない。
Socketクラスでホストの移行を処理するにはどうすればいいんだ。
DirectPlayならHostMigrateイベントを処理して終了なんだがなぁ。
起動と終了は遅いね。

実行中の速度に不満を感じたことはない。
++コンパイラのノウハウが継承されてるんだろうからそれなりに最適化はされてるんだと思う。

メモリは新しいものを無尽蔵に使っていくみたいだから、メモリ周りに関してはその場その場で
やり繰りしている++よりは速いかもしれない。
ただしメモリに余裕のある環境だけね。メモリ少ないと頻繁にGC発生して遅くなるかも。
112デフォルトの名無しさん:04/06/23 09:35
例えばほかのプロセスをアクセス禁止にしてFileStream開いて、閉じ忘れると、GCが開放するまでほかのプロセスが開けなくなるし、
GCがいつ開放するかはわからない。ただ必ず開放されることは確か。
それはGCとはまた別のネタだな。ってか相談しろ。
> 112
そういう時のための IDisposable(と言語組み込みの using (...) { ... } pattern)

# IDisposable を実装する場合は ttp://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpgenref/html/cpconfinalizedispose.asp この辺りを参考に…
# ただ IDisposable を実装しても、そいつを複数箇所から参照してる場合は『誰が責任持ってツブすのか』という問題は結局 programmer の責任なんだけど

>111

領域取得に関しては Generation 0 heap が尽きていなければ、通常の malloc よか速い…とかなんとか MSDN のどっかに書いてあったよーな記憶があります(単に使えるとこを頭から切り出してるだけですから)

GCに関しては頑張って実装してるような印象です。あまり酷い目にあったことが無いからなのかもしれませんが。
GC 便利なんだけど、確かに C++ のときより激しく .Close() とか .Dispose() とか書かされてるな・・・
116デフォルトの名無しさん:04/06/23 19:38
C#.NET でのデバッグについて質問です.
デバッグ中のアプリのどのオブジェクトがどれだけメモリを使って
いるかを一覧でみるような事はできないでしょうか?

OutOfMemory Exception が出るのですが,一体どのオブジェクトが
メモリを食っているのかがわからなくて困っています.

よろしくお願いします.
使用メモリが1GBくらいになると問答無用で
OutOfMemoryException出たような気がするけど、
それとは違うの?



>>116
CLR Profiler
119デフォルトの名無しさん:04/06/23 21:46
あんまりWindows環境開発経験ない漏れが質問です。
フォームの継承って多用しても問題ないの?

なんか隣の香具師がフォーム継承したらフリーズするってぶつぶつ言ってんだけど。

明日までに似たようなフォームを持つシステム10本くらい作れって言われたんだけど
いっこいっこフォームつくるのめんどいから継承しちゃいたいのさー。
あんま考えずにやって問題ない?

間抜けな質問ならごめんよ。
>>119
フォームに限らず継承するつもりのクラスはある程度考える必要があるべ。

単にコントロールの配置が同じフォームの派生クラスを作る、
というならあんまりエラーは起きないと思う、
>>117
stringやEncode.GetBytesを多用するループを書いたら、あっという間にメモリリークしたよ。
使い終わった変数にnullを代入しても同じ。
さんざん悩んだ挙句、null後にGC.Collectしてみたら嘘のようにエラーは無くなった。
メモリリーク?
メモリ枯渇じゃなくて?
>>121具体的にどんなプログラム?
>>121
メモリリークじゃなくて単に新しい領域を食いまくってるだけでしょ?
.NETだとnullしたって枯渇してない限りはどんどん新しいとこ使いまくるわけだから。

メモリリークっていうのはメモリが確保されたまま、そのアプリを終了しても
永遠に開放されない場合のことをいうのであって、いつかは開放されるのなら
それはメモリリークではない。

そいつをアプリAとして、もう一つGC.Collect()するだけのアプリBを作ってみ。
「メモリ確認→アプリA実行→メモリ確認→アプリA終了→メモリ確認→アプリB実行→メモリ確認」
これで開放されてるならそれはメモリリークとは呼ばない。
>メモリリークっていうのはメモリが確保されたまま、そのアプリを終了しても
>永遠に開放されない場合のことをいうのであって、いつかは開放されるのなら
>それはメモリリークではない。
無意味な定義だなこれ
>>120
レスさんくす。

となりのやつのフリーズするソースを見てみた。
基本フォームにコンボボックスが3つある。
3つのコンボに対応してるオブジェクトがインスタンス時にDBから値をとってきてるらしい。
3つのオブジェクトは基本クラスのコンストラクタでインスタンスしてる。

それをフォームロードで連結してるだけなんだけど、実際にフリーズしてる・・。

なんだろ、そいつのマシンのスペックの問題かな?
>126
それは本当に"フォームの継承"が問題なの?
複数のフォームから同時に処理にいってデッドロックしてるとか、
継承元にある(protected staticな)共有オブジェクトを継承先でも使って状態を破壊してるとか。


>>127
継承先では何もしてないっぽい。
見てみると、継承ピッカー?なるもので、VSから派生フォームを自動的に作ってるみたいなんだけど。
その時点でフリーズしちゃってるみたい。
ローカルのプロジェクトフォルダにCSファイルは出来てるらしい。

基本クラスのイベントとかが怪しいなーと思ってるんだけど。

基本クラスのフォームロードイベントとか、ちゃんと正常に動くのかな?
PropetyGrid
>>126
スレッド考慮してないからでねーの?
131129:04/06/24 10:16
失礼しました。

PropertyGridをUIに使ったアプリを作っています。
PropertyGridで操作するオブジェクトのプロパティがStructまたは
オブジェクトの配列の場合、値の変更がキャンセルされてしまいます。

ただ普通にstruct Pointなどへの設定は有効ですのでstructの定義もしくは
使用するTypeConvertorに一工夫必要なのだと思うのですが。
どなたが情報をお持ちではないでしょうか?


132129:04/06/24 10:18
あげ忘れてた…
サンプルです。

public class Test
{
public Test()
{
}

//反映される
public Test1 t1
{
get { return _t1; }
set { _t1 = value; }
}
Test1 _t1= new Test1();
//反映されない
public Test2 t2
{
get { return _t2; }
set { _t2 = value; }
}
Test2 _t2;
}

133129:04/06/24 10:18
つづき
[TypeConverter(typeof(ExpandableObjectConverter))]
public class Test1
{
public string t1
{
get {return _t1;}
set { _t1 = value; }
}
string _t1;
}

[TypeConverter(typeof(ExpandableObjectConverter))]
public struct Test2
{
public string t2
{
get {return _t2;}
set { _t2 = value; }
}
string _t2;
}
>>130
すまぬ・・・漏れがスレッドをイマイチ理解してない。

そいつのソース貰って、基本クラスの
コンストラクタ内の処理・各イベントを全部コメントアウトしたらフリーズしなくなった。

フォームロードとかのイベントは、派生フォームでやればいいってことなのかな。
でもそれじゃ意味ないよね・・。
モーダルフォームについて質問させてください。

メインのフォーム(A)から、Bフォームをモーダルで表示させ、

dlgA DlgB = new dlgB();
DlgB.ShowDialog();

Bフォームで何らかの処理が行われたときに、Cフォームを処理選択用にモーダル表示します。

dlgA DlgC = new dlgC();
DlgC.ShowDialog();

で、Cフォームに「終了」「キャンセル」のようなボタンを配置し、「終了」が押された時、Cフォームで
Close();を行うとBフォームも終了してAフォームまで戻ってしまいます。

処理としては、Cフォームのみ消して、Bフォームに処理を戻したいのですが、なんか処理の仕方を
間違えておりますでしょうか?

 よろしくお願いいたします。
136130:04/06/24 10:30
んー、派生フォームの方にイベントなど書いてコンパイルしたら動いた。

けど・・・。
派生フォームをVSから表示(デザイン画面)するとフリーズする。
実行は出来るのに、なんでだろ。
これじゃ編集できねーいw
>134
コンストラクタでDBを見に行っているせいで継承元と派生側と二重にDBアクセスして
コンストラクタで例外飛んじゃってるとか?

>135
普通は勝手に他のフォームを閉じたりはしませんが。
書かれているコードもよくわからないし
(型はdlgAではなくdlgBとかdlgCでないの?)
そもそもデバッガで追っかければわかる内容では?
>136
デザイン時にもインスタンス化の処理は走るから、Component.DesigneModeを参照して
デザイン時はDB処理をしないようにすればよいのでは?
>>133
TypeConvertorを継承してTest2StructConvertorとでも作って
ExpandableObjectConverterの代わりに与えれば可能だとは思うが、
もっと簡単なやり方があったらごめん。
140130:04/06/24 10:45
>>137
レスありがとねー。感謝。
ちょっと流れをまとめてみる。
考え違いあったらつっこんでください。

1.基本クラスで、コントロールの配置をしている。(コンボ3つ)
2.基本クラスで、各コンボのイベントプロシジャを定義。(イベントハンドラに追加)
3.派生クラスで、コンボ3つに対応する3のオブジェクトをインスタンス。DB接続しデータ取得。
4.派生クラス、Form_Loadイベントで、オブジェクトとコンボを関連づける。

これでやってみて、コンパイルし実行も成功。
しかし、デザイン画面で派生フォームを編集しようとするとフリーズ。開かない。

2.でイベントハンドラに追加せずに、派生クラスでイベントハンドラに追加。
これだとデザイン画面でも開ける。

んー。イベントプロシジャの定義は基本クラスでやって良いけど、ハンドラに追加は派生クラスじゃないと
だめってことかな。

長文ごめん。
141135:04/06/24 10:56
試しに、Form ABCだけの単純なコード書いたらちゃんと動作しました。

そんなトリッキーな事やった覚えはないんですが・・もう一度ソース見直して、
報告いたします。
>139
サンクス。
何の型に対して、どのメソッドをオーバーライドしてやればよい?
よくサンプルとかに出てくるstringに対する変換は非展開時の表示・編集用だよね…
>>131
ExpandableObjectConverter内のConvertFromメソッドが、
受け取ったパラメータのプロパティを直接弄ってるのが原因と見た。

ExpandableObjectConverterを継承したTest2Converterクラスを作って、
bool CanConvertFrom(ITypeDescriptorContext, Type)
objectConvertFrom(ITypeDescriptorContext, CultureInfo, object)
object ConvertTo(ITypeDescriptorContext, CultureInfo, object, Type)
辺りをオーバーライドしてやればいける。
ヘルプの「型コンバータの実装」参照。

……残った問題は、各プロパティをグリッド上で編集しても即座には反映されないって事だ。
(ex.)
+Test2  hoge
  t2    hoge    //ここをfooに書き換えてもTest2のhogeが書き換えられない。Test2にフォーカスを当てた時に書き換えられる。
                //実際のTest2オブジェクトのプロパティは書き換えられているんだが。
144143:04/06/24 11:42
速攻で訂正。
//私こそヘルプを良く読め。

オーバーライドするのは
object ConvertTo(ITypeDescriptorContext, CultureInfo, object, Type)
bool GetCreateInstanceSupported(ITypeDescriptorContext)
object CreateInstance(ITypeDescriptorContext, IDictionary)
だ。
>>143
ポイントはCreateInstance()とConvertToでのInstanceDescriptorに対する処理みたいですね。

英語だと割とマンマの内容の記事を見つけました。
ttp://www.morganskinner.com/Articles/AStructTypeConverter/
今googleのキャッシュでしか読めませんが。
byte[0],byte[1]をushortに型変換するとか
ushortを型変換してbyte配列に入れるとか
出来る関数ってのはBASEライブラリにはないでしょうか?
>>146
BitConverter
>>146
System.BitConverter
なぜかBitConverterは影が薄いよなぁ。
>>147-148
さんくす
・必要な場面が微妙
・自前で関数書くのも大した手間じゃない

からなー。
//BitConverter.IsLittleEndianは(自前で関数書くときも)重要だが
C#って
クラス名(文字列)からインスタンスって生成できますか?

Hoge createInstance(string className)

というメソッドが有って
こいつに"Hoge"とか"ExtendHoge"とか文字列を渡すと
対応したクラスのインスタンスを返すことってできますか?
>>140
構成ファイルに接続文字列出してたりしてんじゃないの?
基底のフォームが例外で落ちてるってのがいかにもありがち。
ってかそういう突っ込みあるのに確認してないのか?

ちなみに、デザイナで表示してるフォーム自身は完全に動作してなくても
デザイナで表示は出来たりするが、その継承元はちゃんと動作して無いと
駄目な用に思う(なんか、そんな感じに動いてるっぽい)。
だから、デザイナで表示してるフォーム自身が例外はいてるときは
デザイナ自体はちゃんと動いたりする。
※結局、デザイン時に例外はくようなフォームは作るなってこった。
>>152ActivatorとかTypeとか調べろ。
>>152
書き込みに使ってるキーワードだけで、山のように見つかったぞ。
2ちゃんに書き込む時間があったらぐぐった方が早いのくらい知っとけカスが。

カスでも分かる一例
ttp://dobon.net/vb/dotnet/programing/createinstancefromstring.html
C#やる前に言語の特徴の一覧ぐらい見ないのか?
158デフォルトの名無しさん:04/06/25 23:03
IEの標準の接続設定で自動構成スクリプトを使用している場合の
プロキシを取得したいのですが何かいい方法はないでしょうか?
System.Net.WebProxy.GetDefaultProxy()を使っても自動構成スクリプト
を使用している場合、プロキシを取得できないみたいなのですが……。
159152:04/06/26 09:25
>>154
>>155
サンクス次からはちゃんと調べるYO
160デフォルトの名無しさん:04/06/26 09:56
クラス名・メソッド名・変数名に2バイト文字使えること最近知ったんだけど、2バイト文字にすると何か問題ありますか?
かっこ悪い
162デフォルトの名無しさん:04/06/26 09:59
オープンソースであなたが使う2バイト文字がうまく表示できない人に見てもらわない限り大丈夫じゃん?
そもそも文字コードがUTF16で管理される以上、2バイト文字という表現っておかしいよな。
164デフォルトの名無しさん:04/06/26 10:44
>>163
ああ、そうだった
165デフォルトの名無しさん:04/06/26 11:46
ttp://bunzin.s33.xrea.com/cgi-bin/up/img/amf1048.gif
C#をインスコしたら、上のようなダイアログがでてきて起動できない・・・orz
環境は
Windows2000
pentiumIII600
メモリ:514MB
で、インスコしたのは、Visual C#.net Standard version2003 アカデミック
です。
なにか、対策はありませんか??
>>165
それまで割れ物のVS.NET使ってたろ。
167165:04/06/26 12:25
いえ、それまでは、VS.netC++のアカデミックつかってますた・・・。それも購入したやつです。
原因がわからんヽ(`Д´)ノ
adminで入れてないとか?
169165:04/06/26 12:39
Administratorでインスコして、Administratorで起動したんですがうまくいきませんですた・・・。
.netとframeworkをアニンスコして再インスコしてみます。
成功しても失敗して報告しますんで・・・よろしく・・・orz
>>160
IME立ち上げるのが面倒。
>>160
スペースでなにか問題起こさなかったっけ?
172165:04/06/26 14:40
だめだ。なおらん!!でも、ダイアログを表示したままならソフトが動くみたいだから、しばらくそれでやってみようかしら(´・ω・`)
.NET Frameworkにコンパイラ付いてるんで、
これだけでもプログラム開発できるみたいね。
SDKを入れると何がインストールされるん?
>>173
ライブラリとか
>>174
てことは、フレームワークだけだと利用できるクラスに制限があるってことか。
ありがと。
176デフォルトの名無しさん:04/06/26 18:44
enumに対するXMLドキュメントってどう書けばいいんですか?
enumの定義とは無関係にlistでちまちま書かないと駄目なんですかね。
>>175
制限ないし。
>>176
VSのインテリセンスに有効な書き方は以下の通り。

///<summary>何らかの状態</summary>
public enum Hoge {
   ///<summary>状態A</summary>
   StateA,
   ///<summary>状態B</summary>
   StateB
}
>>178
ありがとうございます。その情報ってどこに載ってますか?
このあたりを一通り読んでみたんですけど・・・
http://www.microsoft.com/japan/msdn/library/default.asp?url=/japan/msdn/library/ja/csref/html/vcwlkxmldocumentationtutorial.asp
>>179
手探り(きっぱり

//ちょっと必要があったので以前全部調べたんだ。
//メソッド以外はほぼsummaryだけっぽい。
その辺は結局手探りのが早いよねえ
///とタイプしてみればとりあえずわかるし
プロジェクト全体に対するコメントも付けられそうなんだけどよく分からない。
>>>181
"/// " の自動補完ってちょっと異常だよな
始めて知ったときは笑いがとまんなかった
double hoge; /// <何?>なんとかかんとか</何?>
「何?」の部分を何にしたら良いのか分からんが、
この形式でインテリセンス働かせる方法無い?

///<summary>なんとかかんとか</summary>
double hoge;

だと上手くいくのは知っているけど、変数宣言で二行取るのは醜いしさ
>>184
うちはC++のころは

/*
コメント。
↓の説明とか
*/
int m_nValue;

とか書いてたから醜いとは思わないけれど、でもそれぐらいの柔軟さはあってもいい気がする。
属性の記述の仕方にあわせてるんだろうか。
.NETFW2.0ではドキュメント(特に見てくれ)周りも改善されるのかな。
それともNDocに丸投げしちゃうのかね。
187デフォルトの名無しさん:04/06/26 23:48
http://s03.2log.net/home/nsharp/archives/blog31.html

MVPを名乗ってるのが(♯さんじゃなくてリンク先の方が)こんないい加減なこと書いてていいのか?
晒し上げるならこっちだろ。
ttp://blogs.users.gr.jp/hidori/archive/2004/06/26/3331.aspx
monoの開発者がSSCLIの中見ても平気なのかね…
Shared Sourceなライセンスだと汚染が起こる気がするんだが。
なんだかなあ・・・。
191デフォルトの名無しさん:04/06/27 03:17
string型のasciiエンコード文字列を、JISエンコード文字列に直す方法を教えてください。
自作の複数のプロパティをグループ化する方法ってありますか?
例えばフォームのサイズプロパティはwidthとheightとあるけど
sizeのところで両方指定もできるし、展開して個々に指定もできる。
>192
Sizeはグループ化してるわけではなく、フォームのWidthとHeightはフォームが持ってる
Sizeへのエイリアスみたいなもので、WidthとHeight自体にはBrowsable(false)がついてるのではと言って見る。
public class Form
{
Size _size;
public Size Size
{
get { return _size; }
set { _size = value; }
}
[Browsable(false)]
public int Height
{
get { return _size.Height; }
set { _size.Height = value; }
}
[Browsable(false)]
public int Width
{
get { return _size.Width; }
set { _size.Width = value; }
}
}
こんな感じ?
自作classを展開指定ならExpandObjectConverter属性をつける。
structを展開したいのなら>139,143-145あたり参照。
>>191
.NET Frameworkではstring型はUnicodeなわけで、
string型のASCIIエンコード文字列だのJISエンコード文字列だのはあり得ない。

バイト配列を変換したいならEncoding.ConvertとかEncoding.GetBytesとか。
ascii charset文字列を...なら分からんでもないけど
PropertyGridの話が出たので便乗ですが、

あるプロパティの値が変更されたとき、
ある他のプロパティの表示/非表示や変更可能/不可能を切り替えることはできますか?
>>196
少し頑張れば可能。

The Code Project - Unleash PropertyGrid with Dynamic Properties and Globalization - C# Programming
http://www.codeproject.com/csharp/DzDynamicProperties.asp
198192:04/06/27 12:49
>193
thx
こちらの思い通りにできました。
MySqlを使いたいのだけど、OleDbConnectionに渡す接続
文字列ってなにを渡せばよいのでしょうか。
MDBの場合だと、
"Provider=MIcrosoft.Jet.OLEDB.4.0;Data Source=mdbファイル名"
っていうのを書籍でみたのですが、
MySqlの場合はどうしたらよいのでしょうか。
いろいろ検索してみましたがわかりませんでした。
なんか根本から勘違いしてる?
使うOLEDBプロバイダがMySQL用のものならそのOLEDBプロバイダ用の接続文字列、
OLE-ODBC(って今も使うのかな?)だったらODBC用の接続文字列、では?
201199:04/06/27 19:30
>200
レスありがとうございます。
せっかく回答いただきましたが、私の知識が乏しすぎて、
さっぱり理解できませんでした。
どこぞで勉強しなおしてくることにします。
勉強になるサイトまたは書籍などあれば教えていただけると
助かります。
>>197
ありがとうございます。
少しというかかなりがんばらないといけないようですね・・・。

PropertyGridは手軽に使えるのはいいんですがこういう痒いところには手が届かないんでしょうか。
PropertyGrid使うのやめてちゃんとGUI作ったほうがよさそうですね。
「VB MySQL」とか「ADO MySQL」で検索したらすぐに出てきたぞ。
204199:04/06/27 23:19
>203
検索すると、java+MySqlの情報がたくさんあるのですが、
C#からMySqlを使用するような情報がみつからないんです。
java+MySqlは過去にやったことがあるのですが、DB接続部分は
サンプルからぱくってましたから理解できてません。
この当りを応用すればうまくできるのかなあ。
C#の話じゃなさそうだし、たぶんよく知られていることかもしれないけど、
forやwhileの条件式って、ループのたびに計算される?

while(i < GetSomething()){
// 何かの処理
}

public int GetSomething(){
// 結構面倒な処理だけど、返る値は最初の1回目以降は同一
}

上の式を何百、何千回と回すんだったら下のように書き直した方が、
オーバーヘッドは少なくて済むかな?
それともこの辺りはコンパイラが最適化してくれて、
手作業で小細工しなくてもよかったりするんだろうか。

j = GetSomething();
while(i < j){ ... }
>>206
自分で試そうね。

for (int i = 0; i < GetSomething(); i++) {...}

int GetSomething() {
   System.Console.Write(".");
   return 10;
}
>>207の例では毎回関数が実行されるが、
毎回実行する必要がないときはJITで最適化される事になっている。
むしろ、小細工してコンパイラを出し抜くな、よけい遅くなる、と言うことになっている。
しかし現状の実装では理想に追いつけてない。

int GetSomething() {
   int a = 0;
   for (int i = 0; i < 100; i++)
      a++;
   return 100;
}
って毎回実行する必要の全くない関数でも毎回実行されてるし。
これが完全に最適化される日が来るのかな……。
それを最適化できるような機能を実装する意味が分からない。
そう?
「計算結構長くなるなー、関数にくくり出しちゃえ」とかってそれなりにあると思うけど。
その上で>>208なんだし。
212デフォルトの名無しさん:04/06/28 12:15
>211
それは最適化ではなく設計の範疇だと思うんだけど。
>211

『毎回評価される』という言語仕様は変わらないんだから、素直に中間変数取るのがこの場合は自然な気がする…(C,C# 的思考に毒されてるだけなのかもしれない)

inlining が効果的な場合はキチンと inline して JIT する機能は機能で必要なんだけど、ここでそれに頼るのはワシ的には微妙に違和感があります。
STL とか使っていて

for (std::vector<foo>::const_iterator it (bar.begin ()), it_end (bar.end ()) ; it != it_end ; ++it) { ... }

なんて書き方してるしなぁ…(勿論 std::vector 程度じゃ bar.end () を条件のトコに生で書いても大差ないと思うけど)

確か std::foreach の中身では同じ様な書き方してた記憶がある…

# C# な話でなくてスマヌ…
え、毎回呼ばれないのでしょう。
大きいメソッドだと呼ばれちゃうのかな?
http://www.microsoft.com/japan/msdn/net/general/dotnetperftechs.asp
>215
JITが呼び出し先を静的に評価できない可能性があると判断したら
呼び出しのまま残る(というか残ってくれないと困る)のでは?
1) 32 IL instruction 以下
2) flow 解析は限定されてる

の二つの制約から実際に inlining されるのはかなり単純なものに限定されている気はする…( get { return foo_ ; } みたいな奴とかかな?)

勿論 216 で言及されてるいる様に静的に評価出来ないとか(virtual になってるとか)副作用があるとかだと、残っててもらわないと inlining の有無で結果が違うという具合の悪いことに…

# de-virtualizing なんていう optimization も世の中には存在するけどもささささ…まだ一般的じゃないよなぁ(?)
218デフォルトの名無しさん:04/06/28 14:09
使われてないインスタンスを特定することってできますか?
XXXUser(アカウント用)クラスのインスタンスを、ユーザーがデータを入力するたびに新しく作りたいんですが、
ユーザーが使わなくなったアカウントを逐次的に削除したいんです。
>218

それは GCの神しか知らない情報… instance が消える timing は不定なのが GC ある世界の掟ですが…
220デフォルトの名無しさん:04/06/28 14:34
テキストボックス等に繋げられたDBのフィールド名を知る術ってありますか?
221199:04/06/28 20:55
>205
どうもありがとう。
探してみます。
222206:04/06/28 21:40
いろんな人の話が聞けてためになったよ。ありがとう。
簡易に試したところでは、差がほとんどなかったり、
30%〜40%の違いが出たりとまちまちだった。
>>206 の前者のようなパターンを、コンパイラが
「戻り値は一定だからここの呼び出しは省ける」とかいった
おせっかいは焼かないんだね。
単純なことでも人の手で速度アップを図れるところはあると。
223206:04/06/28 21:53
今、>>215 のMSのサイトを読んでたらこんなのがあった。

 for(int i = 0; i < myArray.length; i++){}

 int l = myArray.length;
 for(int i = 0; i < l; i++){}

 コンパイラはおそらく myArray の長さが一定であることを確認し、
 for ループの比較に定数を挿入するでしょう。

おー、ここまで見てくれるんだ。
ここでも「コンパイラを出し抜こうと考えるな」って言ってるね。
確かにint型など単純な値型ならLengthでもGetLength()でも差はなかったけど、
myArrayを自前の構造体(いろんなメンバが突っ込んである)で試したら
それなりの差は出た。
>222

強い最適化を施せば >209 みたいな奴を呼び出してても定数との比較に出来るとは思うけど、Just-In-Time compling だからあんまり頑張ると最初の1発目が遅くなってしまう…

実行時 profiling を使って、段階的に optimize level を強くする様な仕掛けを JIT compiler が実装してこない限りはつらそうだなぁ(そのうちやるとは思うけども)

mono project の JIT の optimize は何処までやってんだろうか?

# efficeon の CMS は4段ギアになってるなんて話もあったな… ttp://pc.watch.impress.co.jp/docs/2003/1104/kaigai041.htm
64bit化による高速化とアプリの64bit化における注意点(MYCOM PC WEB)
http://pcweb.mycom.co.jp/articles/2004/06/24/win64/

マネージコードなら 32bit環境だろうが、64bit環境だろうが x86だろうが
x86-64だろうが、Itaniumだろうが動くと思ってたんだけど・・・
俺の勘違い??

>>225
いや、Managedなら基本的に問題なく使えると書いてある。
ただ、x64だけ、とかいう風に制限を「かけることもできる」という話。
//Win32APIを使ったアプリのための制限とかそんなんかな。
227225:04/06/29 10:08
>>225
へんな文章書いてごめん。
たしかに問題なく使えると書いてあります。


http://pcweb.mycom.co.jp/photo/articles/2004/06/24/win64/images/016l.jpg
>32bit .NETコードはWOW64で実行
>64bit .NETコードはネイティブ環境で実行

僕が疑問に思ったのはマネージコードに32bit、64bitっていう区分けが可能なの?
とか、
おいおい、WOW64上で実行って事は普通の32bitアプリじゃねえか?
と思ったんですけど・・。いかがでしょうか?
ふーん。.NETは64ビット環境以降への布石でもあったって言うことかい?
>227

.NET Framework を立ち上げるスタブの部分は今のところ X86-32 のコードが入ってるから、立ち上げるところは WOW64 で
hosting 環境が出来てしまえば残りの MSIL の部分は host native 実行…って事なのかしらん?
C#(Windowsアプリケーション)とMVCの説明したHPとかないでしょうかー?
検索してもWEBアプリのサンプルばっかりなので。

Windowsアプリの開発ってあんまりやったことないんですが、画面にイベントハンドラとかプロシジャとか記述するんですよね?
MVCって考えはWindowsアプリにはないのでしょうか。

ちっと悩んでます。
>>227
IntPtrとかサイズが変わる。
>>228
常識。
233デフォルトの名無しさん:04/06/29 22:01
UTF8からUTF7への文字コードの変換はどうやったらいいでしょうか?
下のような使い方をしたいのですが・・

//引数1に対象文字列、2に変換前Encoding(UTF8)、3に変換後Encoding(UTF7)
public string (string text, Encoding encode, Encoding encode)
{
return text2;//戻り値はエンコード変換後の文字列
}
>>227
.NETアセンブリは、外見はPEフォーマットになっているんだけど、そのヘッダーに
マジックナンバーとして、どのコードなのかが書かれている。
dumpbin /headers で見てみ。
で、ネイティブなマネージコード、仮にPEヘッダーにPE32とかx86と書かれていても
64bit .NET frameworkでは、64bit用にコンパイルされて動作する。
もちろん、CCW、RCWとか使ってちゃだめよ。

あと、J#だけは、WOW64上の動作に限られる。
>>233
>  UTF8からUTF7への文字コードの変換はどうやったらいいでしょうか?

過去何度か出てるけど、string型はUnicode(UTF16)。
そんなメソッドに意味はない。

バイト配列が必要なときにSystem.Text.Encoding.GetBytes()とか使うといい。

あるいはもっと具体的な話をしてくれればほかの助言もできるかもしれないけど。
リフレクションで取得できるフィールドの一覧とか、
プロパティの一覧って必ず宣言した順番に並んでいるのでしょうか?
順番が保証されてるとかないですか?
>>236
何がやりたいの?
アンマネージコードにエクスポートしたいの?なら、LayoutKindがあるけど。
>>237
リフレクションで取得した一覧の順番に依存したコードがあるんで、
それを修正するための理由を探しているんです。
>238

順番を保障してないと考えるのが妥当だと思うけどなぁ…

# custom serialization が実装されているとかすると順番とかそんなの全く関係ないし…
そこらへんのこまい仕様決めてるものないんかい?
241165:04/06/30 14:27
このダイヤログを表示したままだとプロパティが使用できない・・・。
どうやら、VC#.netに問題があるのではなく、visual studioに問題があるみたいです。
アプリケーションの追加と削除に、Framework1.1とVC#.netを削除する部分があるんだけど、visual studioを削除する部分がないですよね。。。どこにある??
完全に削除して再インスコを試みたいです・・・orz
こういうのはあきらめてOSから再インスコするのが無難、というか結果的に一番早く解決する。

ウィザード系が走るときにオブジェクトの作成に失敗しましたと出て、コンポーネントの追加やら何やらが
できなくなった状態のがうちにも1台ある。
VS.NET自体は何度か再インスコしたが改善せず。
そのうちOSごとと思ってうっちゃってるけど。
あるアセンブリが別のアセンブリを参照している場合、
その参照される側が更新されると、動作に支障がなくても参照できなくなります。
厳密名とか署名とかいったことが行われている場合だけそうなるようです。
参照する側をいじるにしてもされる側をいじるにしても、
たとえばメジャーバージョンが変更されない限り参照しちゃえみたいな指令はできませんか?
>>243
遅延署名?
>243

[assembly: AssemblyVersion ("1.0.*")] とかやってない?

ttp://www.atmarkit.co.jp/fdotnet/technology/idnfw11_04/idnfw11_04_02.html の version redirect なんてのもあるにはあるけど…
246165:04/06/30 17:23
>>242
THX...
OS再セットします。。。私事ですが、家族共有PCだから、いつできるかな・・・orz

>>244
なぜにそこで遅延署名…
249デフォルトの名無しさん:04/07/01 10:36
string url;
HttpWebRequest req = WebRequest.Create(url) as HttpWebRequest ;
HttpWebResponse res = null ;
try
{
 res = req.GetResponse() as HttpWebResponse ;
 StreamReader reader = new StreamReader(res.GetResponseStream(),Encoding.GetEncoding("Shift-JIS")) ;
 textBox1.Text = reader.ReadToEnd() ;
 reader.Close() ;
}
catch
{
 textBox1.Text = "Not Found!";
}

こんな感じでWebページのソースファイルを取ってきたいのですが、
2chのスレッドのソースを取得するにはどうすればよいでしょうか?
url に http://pc5.2ch.net/test/read.cgi/tech/1087297504/ といれても Not Found になってしまうのですが。
req.UserAgentに適当な文字列を入れる
252デフォルトの名無しさん:04/07/01 13:17
ARGB を RGB に変換したいのですが、方法が見つかりません。

Alphaを無視するのではなく、Alphaが有効な状態での、
赤緑青の値を取得したいのです。
>>252
(゚д゚)ハァ?
>>252
背景の色は?
255252:04/07/01 15:01
例えば、
ColorFromArgb(255,Color.Red).ToArgb()
とすると、-65536 が返されます。

これを、255,0,0 に変換したいということです。
>Alphaを無視するのではなく、Alphaが有効な状態での、
>赤緑青の値を取得したいのです。

ここが禿しく意味不明なんだが。
Aが有効なRGBっていうと普通は合成先のRGBも必要だろ。

>>255を読む限りAを無視すればそれでいいじゃんって思うんだが?


byte r = System.Drawing.Color.FromArgb(255,Color.Red).R;
byte g = System.Drawing.Color.FromArgb(255,Color.Red).G;
byte b = System.Drawing.Color.FromArgb(255,Color.Red).B;
これで何か不都合でもあるのか?
俺にはなぜこんな人を相手にするのかがわからない。
>>252
言ってる意味がわからんのだが、
とりあえずRGB(0,0,0)かARGB(0,0,0,0)と合成してみれ。
それで気に入った色が出てこないんならもっぺん整理して出直せ。
良く考えると >>257 が一番マトモなこと言ってるね。
メシ食ってくる。
>>252の意味不明な返答を聞きたい
261デフォルトの名無しさん:04/07/02 23:32
ブラウザでコピーしたHtmlを
クリップボードで受け取ろうと思ったのですが
文字化けしてしまいます。
回避策はあるのでしょうか?

string dataHtml =
Clipboard.GetDataObject().GetData(DataFormats.Html,true) as string;
エンコードが合ってないのか・・・
>>261
http://santamartadotnet.hp.infoseek.co.jp/documents/dotnettips/tips015.html
文字コード変換で解決できると思う。
264261:04/07/03 16:30
>>261,262
参考URLを元に、こんな感じで全部試してみた。
foreach ( Encoding encoding in encodings ){
foreach (Encoding sourceEncoding in sourceEncodings){
byte[] buf = sourceEncoding.GetBytes(dataHtml);
Console.WriteLine( encoding.GetString(buf) );
}}

整理すると
一部の文字化けが解消するパターンはあったけど
完全には戻らなかった。...orz
//一部だけだが文字化けが解消したもの
byte[] bytes =Encoding.Default.GetBytes(dataHtml);
string data = Encoding.UTF8.GetString(bytes);
Console.WriteLine(data);
265デフォルトの名無しさん:04/07/03 22:16
.NET のガベージコレクタについて聞きたいのですが,

ある static なインスタンスの中で byte array の配列を用意して
(かなり大きな配列になる)使用しています.

次に,この配列の中身を削除して(例えば null を代入するなり)
GC.Collect() を呼んでも,その配列で使用していたであろうメモリ
が解放されない時があります.(される時もあるんです)

で,その状態で,再度同じ byte array に
ドカンと領域を取ると OutOfMemory 例外となってしまいます.
この時,最初に取得した byte array の分が正しく解放されて
いれば,OutOfMemory にはならないはずなのですが,どこからも
参照していない状態(null を代入するなりして)
どうしても解放されない時があります.

GC.Collect() を行なっても解放されていないメモリ領域が
存在して,かつ,そのメモリ領域が原因で OutOfMemory となるので
プログラム的にどのように対応すればよいのか困っています.

何か注意する点などアドバイスなど頂けませんでしょうか?
GC.Collect()って、「開放してもいいよ」って合図であって、
実際に開放されるタイミングはGCが決めるんじゃなかったっけ?
・再利用する可能性があるなら自前でメモリ管理する
・OutOfMemoryになるようなハードウェアは使わない
・そもそも設計がおかしい
・どこかで参照が残っている可能性がある
・GC.Collect(int)
268266:04/07/03 22:25
思いっきり勘違いしてたw
ttp://www.devdex.com/asp/message.asp?p=2911&r=4203037

.NET Framework 1.0 には large object heap の管理に bug が存在していた模様です。

もしかしたらこいつに引っかかってるのでは?
270265:04/07/03 22:33
みなさん,ありがとうございます.

>>266 そうでしたか.では GC.Collect 呼んでもガベージコレクションされる
とは限らないんですね.強制的にガベージコレクションを行なう方法
っていうのは用意されていないんでしょうか?

>>267 自前でのメモリ管理ってどのように行なうのでしょうか?
URL などの情報でもいいので教えていただけないでしょうか?
参照が残っている可能性ですが間違いなく null を代入しているの
ですが,それでは確実ではないでしょうか?
ハードウェアは換えられないし,設計がおかしい可能性も否定は
できませんが….

>> 269
情報ありがとうございます.ゆっくり目を通してみます.

よろしくお願いします.
>270
メモリ管理というのは必要量を最初に確保したまま開放せず、
使いまわせばということです。
可変長であればサイズ管理を追加してしまえばいいのでは。

クラスライブラリのメリットをスポイルしてしまいますが、システムが確保できないような
量を要求している以上仕方ない気もしますが…。

設計がおかしいとは、結局メモリ管理を見直すか、メモリ必要量を見直すしかないのでは?
ということで。

システムが確保できないような量を要求している
っつー点で破綻しているような。
GC.Collect()はパラメータなしだとGC.Collect(0)と同等じゃなかったっけ?
だから第二世代以降の変数は保持されたままになる。

全部開放したいならGC.Collect(2)にしなきゃダメ。
(2)はMaxGenerationだったかで値取得した方がいい。
うそをつけ。
すべてのジェネレーションのガベージ コレクションを強制的に実行します。
public static void Collect();

まあ、こんなものなので鵜呑みにせずちゃんと確認しろってこった。
ttp://www.atmarkit.co.jp/fdotnet/dotnettips/021gc/gc.html
ここの「より高度なガベージ・コレクションを行う」の実行結果を見る限りでは
ジェネレーション指定なしだと開放されずに残るっぽいが?
277276:04/07/04 01:44
あ、すまん、勘違いだわ。
278デフォルトの名無しさん:04/07/04 10:29
エラーコードについて質問です。

Win32 APIの、DdeConnectという関数をC#のPlatform Invokeで呼んでいます。
DdeGetLastErrorの戻り値によると、16390, 16394のエラーが出ているのですが
このエラーの意味を調べるにはどうすれば良いんでしょうか?

MSDNサイトを見ると、15999までのErrorしか記載されていませんでした。
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/debug/base/system_error_codes.asp

16000番以上のエラーコードが調べられるページやファイルがありましたら教えてください。

初歩的な質問かもしれませんが、よろしくおながいします。
図形の再描画について質問ですあ。
テキストボックスに数値を入れてボタンを押すと、計算をしてグラフを描画するプログラムを作ったのですが、
プログラムのウィンドウの上に他のウィンドウを重ねたりスクロールバーでスクロールさせてもどすと、
いままで隠れていた部分の「描画した線」が見えなくなってしまいます。
消えないようにするにはどうしたらよいのでしょうか?
>>279
Paintイベント・・・・・
>>278
ttp://www.google.co.jp/search?num=100&hl=ja&inlang=ja&ie=UTF-8&c2coff=1&q=ddegetlasterror+16390%7C4006%7C0x4006&lr=lang_ja
と16進でも検索しよう。
ここの一番上でエラーコードとそれの定数が分かる。あとはDdeGetLastErrorのMSDNの解説。

>>279
PictureBox.ImageなりForm.BackgroundImageなりのImageに対して描画する。
>279
入門スレで出直して来い
>>280
Piantイベントを試してみたのですが、

private void button1_Click_1(object sender, System.EventArgs e) 
{ 
  private void Form1_Paint(object sender, System.Windows.Forms.PaintEventArgs e) 
  { //演算、描画のコード 
  }
}

このような形にしてしまうとエラーがたくさん出てきてしまいます。
かといってpaintイベントをclickイベントの外に出すと、最初から決まっている線については描画できますが
計算によって求まる線については、まだテキストボックスに数値を入力してないということでプログラムが固まってしまいます。
どのようにすればよいのでしょうか・・・
( ゚Д゚)
>>283
イベントの下にイベントを置くという、C#のルールそのものを無視したやり方自体が間違っている。
C#というよりVisualC#の動作をちゃんと理解した方がいいよ。

> まだテキストボックスに数値を入力してないということでプログラムが固まってしまいます
だったら、先に値をチェックして関数を終了すればいい。
286デフォルトの名無しさん:04/07/04 14:43
textBox に文字入力した後Enterを押すと
ボーン てBeep音が出るのですが、
これを鳴らないようにするにはどうすれば良いのでしょうか?
>>286
KeyPressイベントでHandledをtrueにすれば出来たような気がする
>>281
BackgroundImageを利用するの好きだなー。
上からさらに描画したりして応用きくしね。
>279というか>283はあれなんで回答する気力もなくなるんだけど、
>285の
>イベントの下にイベントを置くという、
という表現もなんだかなぁと思う日曜の昼下がり。


>>285
「先に値をチェックして関数を終了」というのはどのようにすればよいのでしょうか?
291286:04/07/04 15:22
>>287
お〜出来ました!
どうもありがとうございます!!
>>290
いいから入門書を買ってこい。
>>292
すいません、それについては解決しました。実はこのスレには
http://pc5.2ch.net/test/read.cgi/tech/1083995297/
から誘導されてきたのですが(315が私です)、新たな質問は向こうのスレに書きましたので
よろしければご教授願います。ちなみに入門書は何冊か持ってます。
294デフォルトの名無しさん:04/07/04 16:34
StreamReader reader = new StreamReader();
のStreamReaderはnewしないと使えないのに、
NetworkStream stream = new TcpClient("hage.net",100).GetStream();
のNetworkStreamはnewしないで使えるのは何故なんですか?
>>293
だからなんでFormへの直接描画にこだわるのさ。

>>294
GetStreamメソッドの中でnewされてるんだろ。


//夏……。
the Spokeの発売は失敗だったのじゃないだろうか(w
PictureBoxに図形を描画するため、とりあえず
http://dobon.net/vb/dotnet/graphics/pictureboximageanddrawimage.html
ここのプログラムを実行してみたのですが、ボタンをクリックすると

'System.ArgumentNullException' のハンドルされていない例外が system.drawing.dll で発生しました。
追加情報 : 値を Null にすることはできません。

というメッセージが出てて、ソースコードの中の
Graphics g = Graphics.FromImage(PictureBox1.Image);
の行が緑色にマーキングされます。これってどういうことでしょうか?
もっとサンプルをよく読め。
何がnullなのか考えてみろ。
>>293
買ったなら読め。
300デフォルトの名無しさん:04/07/04 17:31
うちのモニター、1024*768が限界なんですが、1600*1400くらいにするプログラム教えてください。
301300:04/07/04 17:32
要するに、モニターに表示されるグラフィックのサイズを全部まとめて調整できないかな、と。
釣りかと思いきや意味不明だった、
>>300
別スレで答え出てただろうに。
>296
安くなったりして間口が広がればそこから入ってくるのは当然従来よりも
質の低いものの割合が増えるのは世の習い。
ある意味、金がかかることがユーザの平均的な質を維持してたんじゃないの?
>>290
「まだテキストボックスに数値を入力してないということで」が判明しているのでしょ?
なら、そうなっているかを調べればいい。
>>305
すいません。それについては解決できました。
そして今は>>293>>297の問題でつまずいております・・・
>>298
すいません。どうしても分かりません。これさえ分かれば全ての問題が連鎖的に解決し、
これ以上皆さんにご迷惑をかけることもないと思うのですが、教えてくださいませんでしょうか・・・?
絶対無理だからあきらめろ。
あきらめきれません。
>>307
何がnullか分からなかったらデバッガで追っかけてみろ。

それ以前に、文法を一通り学べ。
今のおまえじゃ連鎖的に解決なんか絶対しない。
入れ違いで申し訳ありませんが>>297は下地となる白いgif画像を用意したら解決しました。
世の中に絶対なんてありません。このまま一気に突き進みたいと思います。
やっぱりファイルを読み込んでるんだろうなー。
どぼんの中の人もわざわざ書いてあることを無視されて切ないだろうなー。
Form1のButtonAをクリックして、Form2をモーダルダイアログボックスとして表示します。
Form2には、textBoxとButtonOK、ButtonCancelが用意されていて、
ButtonCancelが押された場合は何もせず、閉じて、
ButtonOKが押された場合には、textBoxに入力された値を
Form1のhogeStrに保存して、閉じたいと思います。

分からないのは、どうやってForm1のhogeStrに代入するかです。教えてください。
問題は全て解決しました。ヒントをくれた皆様には感謝の言葉もございません。
くじけそうになったこともありましたが、あきらめずに頑張り続ければいつかきっと報われるということを学びました。
>>313
参考例として、コモンダイアログのOpenFileDialogで考えてみよう。

1)OpenFileDialogを初期化する(Filterの設定とかも含む
2)OpenFileDialog.ShowDialog()を実行する
3)ShowDialogの返り値がDialogResult.OKの場合、
 ダイアログでユーザが選択したファイル名が
 FileNameプロパティに入っている
316デフォルトの名無しさん:04/07/04 20:21
表示したウィンドウ全体に対して、
あらかじめ定めたテーブルにしたがって、
色を変換するという処理を行ないたいです。
例えば、フォームの中に画像を表示していたら、
画像を含めて表示したウィンドウ全体に
「白黒表示をする」とか「RGBを入れ替える」という処理をしたいのです。
317313:04/07/04 20:35
314は偽者です。こういうとき、ID表示板だったら、と思います。トリップつければ良かったんですけど。


>>315
Form1で、hogeStr = Form2.textBox.Text; とするということですか?

Form1からForm2のtextBoxが見えないのかと思い、 publicにしてみたけどだめでした。
既に閉じた後なのでForm2オブジェクト(?)が消えたんですか?

case DialogResult.OK:
MessageBox.Show(Form2.textBox.Text);break;

とやってみたところ、ビルドエラータスクに
「型or名前空間Form2が見つからない。ディレクティブorアセンブリ参照を使え」
と出ましたが、この意味すらわからないです。
318311=314:04/07/04 20:46
>>317
すいません。騙るつもりはなかったんですが、タイミングが悪かったです。
319313:04/07/04 20:53
>>318 こちらこそ、前後の流れを考えずスマソ orz

>>315 ヒント、Thanx!
ヘルプ見ながら考えていて、ついに分かりました。
---------Form1
Form2 f = new Form2();
if ( f.ShowDialog() == DialogResult.OK )
        MessageBox.Show(f.MAGE);
---------Form2
public string MAGE { get{ return textBox1.Text; } }

Form1で Form f と宣言していたために、ドツボにはまっていました。
>>317
ようは、こういう流れを再現できるようなForm2を作ればいいの。

Form2 d = new Form2;
if(d.ShowDialog(this) == DialogResult.OK){
MessageBox.Show(d.Atai)
}



で、Form2にある確定ボタンのイベントにて、

this.Atai = textBox.Text; // public string Atai;というメンバかプロパティを作っとく
this.DialogResult = DialogResult.OK;
this.Close();

直接TextBoxを参照するのは後々困るので、例はAtaiって変数に入れるようにしてみた。
うわかぶっちまった (´・ω・`)ホーケー
>>320
>  で、Form2にある確定ボタンのイベントにて、
>  
>  this.Atai = textBox.Text;  // public string Atai;というメンバかプロパティを作っとく
>  this.DialogResult = DialogResult.OK;
>  this.Close();

Close()しちゃ駄目ー。
DialogResultへの代入でメソッド終了。
あと>>319のようにプロパティが直接textBox.Textを参照するほうがスマートかな。

>>319
私もダイアログ間の値の受け渡しは初めえらく悩んだ記憶がある。
特にモードレスの。
//オブジェクト指向を全く理解してなかったからなー。
//クラスとインスタンスの違いすら……。
>>322
自動的にCloseしてくれるんすか。ありがとっす。

> あと>>319のようにプロパティが直接textBox.Textを参照するほうがスマートかな。

個人的には、ブラックボックス化するのがよりスマートかなと。
クライアントの要望で泣く泣くダイアログのデザインが変えなあかん場合、
場合によっちゃそれまで参照していたコントロールが変わるケースは多々あるわけで、
その場合に親ダイアログをすべて変更せなあかんのは死ねる……。
324デフォルトの名無しさん:04/07/04 23:34
OEの受信トレイとか送信トレイって、同じコントロール(ListView)ですよね。

同じの作りたいんですが、トレイごとにインスタンス作ったほうがいいんですか?
それとも、インスタンスは一つで、トレイ切り替え時にアイテムや表示項目を読み込んだほうがいいですか?
OEではどうなってるか、見当付きませんか?
>>323
>  >>322
>  自動的にCloseしてくれるんすか。ありがとっす。

違う違う。
ダイアログの場合、OKが押されても不可視にするだけでフォームは閉じないってこと(不可視化はset_DialogResultで行われる)
Closeしちゃったら自動的にオブジェクトが廃棄されちゃう。

>  個人的には、ブラックボックス化するのがよりスマートかなと。
>  クライアントの要望で泣く泣くダイアログのデザインが変えなあかん場合、
>  場合によっちゃそれまで参照していたコントロールが変わるケースは多々あるわけで、
>  その場合に親ダイアログをすべて変更せなあかんのは死ねる……。

この辺の感覚は流石に分からないな……。
個人的にはClickイベントの中を書き換えるかプロパティの中を書き換えるかで、
カプセル化として差はないと考えるけど。
//public string Text {get {return textBox.Text;}}
//の返すべき値がlistBox.SelectedItem.ToString()になったところで
//このプロパティの中だけ書き換えればダイアログ呼び出し元に変更はないし。

>>324
別々にインスタンスを持つほうが自然ではある。
>>324
Outlook Expressは、ひとつのウィンドウで表示項目によって分けている。
実際、ATLで書かれているんだけどね。spy++でじっくりと見てみ。
すみません。教えて下さい。

1.TcpListenerを使って通信をする時、AcceptTcpClient()で繋がった
 相手のIPとポートの取得方法がわかりません。
 TcpClient からは取得できないようなのですが、どうしたらいいのでしょうか?

2.ルーターがいる場合、ルーター側のグローバルIPってわかりませんか?

お願いします。

ソースコードの一部分だけコンパイラの警告を止めるって出来ますか?
推奨されないことをあえてやっているのですが、
エラーじゃなくて警告なのでコンパイルは通ってます。
ただ、その警告の量が多すぎて、必要な警告が見づらくなってきました。
警告を出すクラスは一つなので、そのクラスについてだけ警告やめて欲しいんです。
329デフォルトの名無しさん:04/07/05 00:49
byte[]型にされた文字列のエンコードを調べるにはどうしたらいいんでしょうか?
>328

現時点では、VC++ にある #pragma warning に相当するものが無いんすよね… orz

C# 2.0 には増えたみたいだけど(ttp://lab.msdn.microsoft.com/library/default.asp?url=/library/en-us/dv_csref/html/723493d5-9753-4cec-babb-54e2b8eb36b6.asp

# Generics と partial type と anonymous method(と iterator support)を早く使わせてくれ(笑)> MS
>329

一旦 byte [] 化されちゃったら、あとは中身を見て推論するしか手が無いのでは?

# nkf とか jcode.pl とかがやってる様に…
332デフォルトの名無しさん:04/07/05 01:04
>>328
同じ警告が大量発生するなら、
ソリューションエクスプローラのプロジェクトの「プロパティ」

構成プロパティ→ビルドで、特定の警告を表示しない、の項目で設定できます。
>>329
もちろん自前で判別。
//フレームワークで用意してくれても良いと思うんだけど。


というのもなんなので。
ttp://kasumi.sakura.ne.jp/~gm/gpj/index.shtml
こういうありがたいページがある。

>>328
その部分だけDLLにしとくとか……?
334329:04/07/05 02:00
>>331
>一旦byte[]化されちゃったら
文字列データの場合だと、判別する方法はあるんですか?

OEからJISエンコードで送ったメールを、自作POP3で受信すると、受け取ったメールが文字化けしてるので、直したいんです。
(ほかの文字コードで送られた場合も判別変換できたらいいな、と)
>>334
> 文字列データの場合だと、判別する方法はあるんですか?

文字列になったんだったらもうエンコードを気にする必要がなくなってるじゃないか。
336278:04/07/05 07:23
>>281
ありがとうございました!
エラーの内容がわかったので解決できそうな気がしてきました。
C#でDelphiのProcessMessagesのような処理を行うにはどうすればいいでしょうか。
重い計算をしていると、フォームのコントロールの描画がメチャクチャになるのを
直したいのですが・・・・

this.Refresh(); をはさんでみましたが、フォームそのものが一度フォーカスを失う
とその後は「応答なし」になってしまいます。
>>337
小細工してないで非同期で計算しろ
>>337
重い処理は別スレッドで。これ常識。
まえから思ってたが、このスレってダメな人が常駐してわざとダメな答え返してるね。
Application.DoEvents();
>>338>>339
まだよくわかりません。
>>340
ありがとうございました。バッチリです。
DoEvents()の副作用までわかってるんならいいんだけどね。
DoEventsはむしろ軽い処理の合間に入れるものだろ。

例えばWebからデータを拾ってくるときに相手サーバーの応答が遅かった場合なんかは
DoEvents入れたって応答なしになるぞ。
見ての通りのDel厨に、スレッド使えだの副作用覚えろだの無理言うなよ。
でもシリアライズとかデシリアライズしている時にDoEvents()挟むと、
統合環境から実行したら大丈夫だけどスタンドアロンでEXEを実行
するとランタイムエラー出ません?
346デフォルトの名無しさん:04/07/05 14:19
カスタムコントロール(WindowsForm)を作ろうと思って居ます

作りたい物
複数行(行数は可変でかなり横長)で
Excelのような縦横のスクロールバーを持つ物です

単純なコントロールならUserControl、Contorolどちらからでも一応作ることは出来ます

悩んでいる所はExcelのような奴です

ご存知のようにExcelは横スクロールバーをスライドさせると
列のタイトル(A,B,Cって奴)も一緒にスクロールしますが行タイトル(1,2,3って奴)は固定
縦スクロールバーをスライドさせると行のタイトルはスクロールしますが列のタイトルは固定

これをどの様に実装したらいいのか分かりません

普通にスクロールバーを使用すると、横にスライドすると行のタイトルもスクロールしてしまい
表示枠の外に出てしまいます。

何かアドバイスでも頂けないでしょうか

>346
釣られてしまたが、それがわからない人はカスタム作ろうと思わないほうがいいと思う
>>346
その辺を自動で簡単にやってくれる魔法は用意されていません。
そういう動作をさせるのに、数千行から数万行のコードを書いた経験があります。
やり方を聞かれても、やることが多すぎて答えるのに何日もかかります。
作るための知識もどこから得たのかわからないくらい広範に勉強しました。
参照URLも出せません。
あなたもがんばってください。
もしくは好みの市販コンポかエクセルを買ってください。
>>347さん>>348さん

レスありがとうございます

とても大変そうですが、時間だけは有るので
出来る所までやってみようと思います
ここは君の日記帳じゃないから@ITあたりでスレ立てて相手してくれる人探した方がいいよ。
351デフォルトの名無しさん:04/07/05 20:45
スレッドの使い方で悩んでいます。

メインの処理A ――□□□□………………☆☆☆―――
スレッド処理B ――――□□□□□□□□――――――

やりたいのは上の図のようなイメージです。
AからBのスレッドを開始させて、Bの終了後に☆を実行したいです。
どうやったらAを待機させられますか
いべんと
353デフォルトの名無しさん:04/07/05 22:03
>>325
> 違う違う。
> ダイアログの場合、OKが押されても不可視にするだけでフォームは閉じないってこと(不可視化はset_DialogResultで行われる)
> Closeしちゃったら自動的にオブジェクトが廃棄されちゃう。

俺もそう思ってたんだけど、どうやら違うみたいよ。
Form1 から Form2をShowDialog(Form1)で開いて Form2のボタンのイベントなんかで
.Close()かけても ちゃんとForm1からForm2のpublicなものは参照できる。

どうやらForm2.Dispose()かけるまで破棄されないみたい。
ヘルプ読むとCloseメソッドはフォームを破棄するように書いてあるとしか
読めないんだけどね。


> どうやらForm2.Dispose()かけるまで破棄されないみたい。

GC様に笑われるぞ。
つか俺が真っ先に笑ったが。
355デフォルトの名無しさん:04/07/05 22:13
353でつ、

俺の大きな勘違いでした。
Form2のButton.DialogResult にOK属性を設定していたので、
ボタンクリックとともにForm2.DialogResultに代入が起こり、それで
Form2からForm1に制御が戻って Form2.Button_Click イベントに
書いてあった Form2.Close()が単に実行されていないだけでした。
>>346
素直にExcelを貼り付けなさい。
>>351
JoinかManualResetEventあたりを使えば?
windowsアプリってMDI形式で作るのが一般的なのかな
SDIまんせー
特にタブブラウザなんかは芯でいいよ
>>340
おまえ、恥ずかしくないか…
>>345
シリアライズ、デシリアライズが具体的に何をさしてるのか分からんが、
普通に所謂シリアライズだとして、どうやって間にDoEventsをはさむんだ?
まさか、…
>>325
お前が間違ってるよ。
>>354
ちょっと意味が分からんが、
>>355
だまされてるよ、あんた。
>>354
そこでGCが出てくる時点で、多分おまいはちゃんと理解してない。
理解してるんなら意味不明なこと書くなよ…
>>325の後半は書いてること自体はそのとおりだと思うんだけど、
多分>>323
> あと>>319のようにプロパティが直接textBox.Textを参照するほうがスマートかな。
これの意味を取り違えただけだと思う。ってか俺も一瞬取り違えかけた。
※「プロパティが」直接参照するんじゃなくて「親フォームが」と思ったんじゃないかと
365デフォルトの名無しさん:04/07/06 00:55
367.999という、整数部3桁、小数部3桁の数字があるとして、
この数字の小数部を取り出したいんです。どうすればいいですか?
整数部を取り出すのはDecimalのメンバを探せばそれらしいのが見つかったんですが。
>>365
Mathとかにあると思うが、多分次は、
それが本当に小数点以下3桁か?と言う点にはまる。
>>366
Mathを探したんですけど見つかりませんでした。

普通は小数点をさがして、そこで切るとかするんでしょうか?
整数部がわかるならそれを引けばいいんじゃないの
>>361
いや、例えばBinaryFormatterを通して合計800MBほどのファイルになるデータ
のコンバートを行っているんだけど、当然Serialize()とDeserialize()メソッドを
呼び出すよね?

800MBほどになるとさすがに時間がかかるのでプログレス・バーなんかを付けて
みたんだけど、フォームそのものが一旦フォーカスを失うともう一度フォーカスを
当ててやってもプログレス・バーが固まってしまう。

そこで変換ループの中にDoEvents()を入れてやったわけですよ。すると、統合環境
から実行する分には何の問題も起きないのに、デスクトップからショートカットで起動
すると、FileStreamをClose()しようとする時に"System.Runtime.InteropServices.
SEHException"なんて例外が出るんですよ。いやはや困ってます。
>>365
浮動少数だと下手に演算すると誤差がでるかもしれんから、漏れは文字列に直してやってる。

float a = (float)367.999;
string b = a.ToString(@"F3");
int c = int.Parse(b.ToString().Substring(b.ToString().IndexOf(@".") + 1));

BCD演算ユニットとか変数を充実してくれよ
デシマルでも誤差は出ないのでは?
キャストだと誤差でるね。

float a = (float)367.999;
float b = (float)((int)a);
int c = (int)((float)((float)a - (float)b) * (float)1000.0);
374デフォルトの名無しさん:04/07/06 02:53
受信したメールの文字化けを直したいんですが。
文字コードを変更するには、必ずいったんbyte配列に直さないといけないんですか?
Encoding.Default.GetBytes(s);
の部分のエンコードを、Defaultにしても"shift_jis"にしても"utf-8"にしても正しく表示されるんですが、変換の方法としてはこれでいいんでしょうか?
(戻り値のstringはRichTextBox.Textに入れます。)

public string GetEnc(string s) //sは受信したJISエンコードのメール
{
byte[] bytes = Encoding.Default.GetBytes(s);
return Encoding.GetEncoding("iso-2022-jp").GetString(bytes);
}
369です。くそっ原因がわかった。
↓↓
Application.EnableVisualStyles();

こいつがすべての元凶ですた。XPスタイルをmanifestを作らずに済まそうと
思っていたのに、Application.DoEvents()と猛烈に相性が悪いだけでなくて
描画速度も大幅に遅くなる。ぐぐってみたら「不具合」の言葉が散在しています。

.NET FrameWork 2.0 では直っている事を強く期待しますぜ。
>373
プッ
>>370
参考になりました。ありがとうございます。
378デフォルトの名無しさん:04/07/06 08:26
>>373
フロートじゃなくてデシマルの話。
379デフォルトの名無しさん:04/07/06 08:52
プログラム初心者です。
C#で画像処理ボードを使って動画像のキャプチャーを行いたいと思っています。
大抵の商品は、MFC対応とはなっていますが、C#からでも動作可能でしょうか?
お勧めのボードなどありましたら、お教えください。
C#だからできないと言うことはないが、初心者にはできないな。
正確には、買ったボードの寿命までにはできない。
381373:04/07/06 09:44
一番単純でありがちな誤差の出る例を示しただけだが、何かおかしかったか?
「キャストだと誤差が出る」とは書いたが、「デシマルでも誤差が出る」とは書いてないだろ。
382デフォルトの名無しさん:04/07/06 10:16
C#でaxWebBrowser+mshtmlを使用してテキスト入力→submitを自動化しようとしています。
Yahooは普通に動くのですがGoogleが動きません。
NavigateComplete2イベント後のwww.google.co.jpのouterHTMLを見ると下記の通りで
ブラウザ→ソースで表示される物と違いBodyタグがありません。
何か原因分かる方いらっしゃいますでしょうか?
---------------------------------------------------------------
<HTML><HEAD><TITLE>Google</TITLE>
<META http-equiv=content-type content="text/html; charset=UTF-8">
<STYLE><!--
body,td,a,p,.h{font-family:arial,sans-serif;}
.h{font-size: 20px;}
.q{color:#0000cc;}
//-->
</STYLE>

<SCRIPT>
<!--
function sf(){document.f.q.focus();}
// -->
</SCRIPT>
</HEAD></HTML>
>>382
原因は分からないし、もう知ってるかもしれないけどとりあえずできている例

The Code Project - Microsoft Web Browser Automation using C# - C# Programming
http://www.codeproject.com/csharp/mshtml_automation.asp
384デフォルトの名無しさん:04/07/06 10:58
>>383
ありがとうございます、大変助かりました。
NavigateComplete2じゃ無くて、DocumentCompleteイベントを使用するんでした。
>381
必死なキャストっぷりを笑っただけですが?

そんな後だしじゃんけんするんならちゃんとどの部分でどのオーダーでの
誤差が生じるかくらいはレポートしてもらわないと。
>>381
float=浮動小数点なので、誤差が出るのは当たり前ってことでそ?
つまり、実際にベンチさせなくても分かる訳。

この意味が分からなければ、手計算でfloat型に変換してみるとイメージしやすいかも。
>>374
そもそも s はどうやって作ったの?メールのデータなら元はバイト列だったはずで、
それをなんらかの Encoding で string にしたんだろうから、そのときの Encoding を
使うのがまぁ妥当だと思うけど(←この場合 ASCII 推奨)。

iso-2022-jp に限定せずに一般論を言えば、コード不明のバイト列は string には
入らないので (string は常に unicode 文字列)、byte [] のまま持ち歩いて、
使われているエンコードにしたがって文字列化するのが正しい方法。
388デフォルトの名無しさん:04/07/06 15:56
C#でASPやってるんですが、戻るボタン押すとページ真っ白になります。
これはどう回避したらいいでしょう?
コンパイル時に参照するアセンブリを指定しないで、
あるコードに達したときに、そこからアセンブリへの参照を追加することはできますか?
>>389
System.Assembly.LoadFromでできるんじゃない?
System.Reflection.Assemblyだった
392デフォルトの名無しさん:04/07/07 00:07
C#でSQLサーバのmoney型の範囲にあるかどうか調べたいんですけど、
べた書きしか方法はないんでしょうか?
あと、あるテキストボックスに入力された数字が少数第4位まできちんと入力
されているかチェックしたいのです。どういった方法がありますか?
>374
そう、必ずしなくちゃならない。
最初はおそらく、エンコードされていない状態で、stringに入っていて、
それで、どんなエンコードでGetBytesしても正しく表示できるんだと思う。

>>393
>  最初はおそらく、エンコードされていない状態で、stringに入っていて、

果てしなく意味不明だな。
受け取ったbyte配列の各要素をそれぞれchar型にキャストしたchar配列でnew stringしてるってか?
>>393
ありえん…
396デフォルトの名無しさん:04/07/07 00:59
ああ、すいません。メールを受けてる部分のソースはこれです。
(長いので例外処理とかは削除してます。)
public string RETR(int number)
{

string temp;


command = "RETR "+number+"\r\n";
cmdbuffer = System.Text.Encoding.ASCII.GetBytes(command.ToCharArray());
networkStream.Write(cmdbuffer,0,cmdbuffer.Length);
temp = streamReader.ReadLine();

if(temp[0] != '-')
{
while(temp != ".")
{
response += temp + "\r\n";
temp = streamReader.ReadLine();
}
}
else
{
return temp;
}

return response;
}
>>394
ASCIIエンコーディングで入れてるかどっちかかな
ASCIIってバイトそのまま下位バイトにコピーしてるだけかな?
ひょっとして8ビット目は消える?ま、iso-2022-jpなら関係ないか。

>>393のは、デコードしない状態でそのままStringの下位バイトに入ってるんならってことかな。
それにしたところで、どんなエンコーディングでも復元できるわけがない。
たまたまShift_JISとUTF8でやったからだろ。
>>396
…やってること分かってんじゃん…
必ずByteに直すんでなくて初めからByteじゃねーか。
ま、それは分かってる事だが(手を出せない部分なのかと思った)。
StreamReader使わずにStreamそのまま使った方が素直な気がするが…
いや、違うか、ちょっと読み違えてた。
streamReaderをどうやって作ってるんだ?
ま、ASCIIにしてもUTF8にしてもShift_JISにしても結果は同じだが。
400デフォルトの名無しさん:04/07/07 01:19
StreamReaderは、

tcpClient = new TcpClient(server, port);
networkStream = tcpClient.GetStream();
streamReader = new StreamReader(tcpClient.GetStream());

こういう感じで作ってます。
それによってどんなエンコーディングで解釈されているか理解してる?
402デフォルトの名無しさん:04/07/07 01:22
してません。(自信を持って断言できます)
ヘルプぐらい読めやゴルア
てのは置いといて、まあ気持ち悪いからせいぜいASCIIで読み取って
ASCIIで戻す方法で今まで通りにやるか、
無駄がいやなら読み込みの処理自体Byteでやるかだな。
StraemReaderとかでやるよりもコード上はやや面倒になるかもしれんが。
実はASCII文字のみのメールで動作確認しているせいで同じ結果を出してたりして。
メールに日本語入ってるんか?
カスタム属性の使い道がいまいち思いつかんのだが...
>>404
いや、上にも書いてるけど、JISコードって言ってるから(ま、メールだからね)、
結局はASCIIにしてもUTF8にしてもShift_JISにしても「結果は同じ」になるわけで。
>>405
テラリウムで遊んでくればとりあえず感じはつかめる。
>>407
それは提供されてる属性の使い方の感じでないの?
# や、実はテラリウム触った事ないから全然知らないんだが。
>>405は、どういう時に自分で定義してうまく活用できるんだということのような。
>>408
テラリウムにはゲーム本体を動かしてるアセンブリと、
そのゲーム本体アセンブリが読み込むクラスの基本クラスの入ったアセンブリがあって、
その基本クラスの入ったアセンブリにカスタム属性が定義されてる。

で、この基本クラスの入ったアセンブリを使って
プレイヤーは派生クラスをつくってゲーム本体に読む込ませて遊ぶんだが、
このとき派生クラスとそのアセンブリの補足的な情報を得るために
ゲーム本体は派生クラスやアセンブリなどから設定されたカスタム属性を読み取ってる。
410405:04/07/07 03:09
>409
エクスプローラとか使っててファイルになんか印つけさせろとかそんな感じね

うーん継承とかとの使い分けが微妙だけど使い道あるかも
でもやはり動的生成がらみかな
>>409
なるほど、てか、いかにもって使い方ね。
>>408でこういうのを提供されてる属性の使い方って書いたんだけど、
考えてみれば、そりゃこういう風に活用するって参考にはなるね。
>>410
継承とかインターフェイスの実装で代用できるような使い方もあるけど、
それらとは違ってあらゆる要素に適用できるのも特徴かな。
そういえば属性で設定した値って、実行時に変えられたっけ?
変えられるかどうかはカスタム属性の定義しだいだっけ?


と、最近DllImportAttributeの値を実行時に変更できなくて面倒な思いをしたやつが言ってみる。
>412
なっとく。これはおもしろひ。
あとはGenericsさえ実装されればC#メインにしたいんだが...
416デフォルトの名無しさん:04/07/07 11:51
クラスのオブジェクトをメソッドに渡すときにrefをつけて渡すのとそのまま渡すのでは違いはあるのでしょうか?
もとから参照型なので違いはないように思うのですが。
>>416
参照のコピーを渡すか参照の参照を渡すか。
メソッド内でnewしたときとかでかわってくる。
418416:04/07/07 12:01
>>417
refで渡した参照をメソッド内でnewして別のアドレスを参照するようにしてしまうと
元のアドレスのオブジェクトが残ってしまうということですか?
>>416
void A(ref object x) { x = null; }
void B(object x) { x = null; }

object a = "abc";
object b = "def";
A( ref a);
B( b);

a は null になる。b は null にならない。
420デフォルトの名無しさん:04/07/07 16:05
TextBoxでテキストがCutされた時のイベントって、どうやったらいいんでしょうか。
TextBox.TextChangedイベントはあるんですけど、Cut限定じゃないんで、Pasteにも反応してしまいます。
>>420
マネージコードでやるのなら右クリックされたときのテキストを保存しておいて
次のTextChangedでテキストを比べて違っている部分がクリップボードの中身と一致すれば切り取られたってのは?

めんどくさそうだが。
422421:04/07/07 16:21
他にはテキストボックスのコンテキストメニューを自分で作成して監視するのと
KeyDownイベントでCtrl+Xを監視するのをするとか
c#勉強して、とりあえず簡単なプログラム作ったんですがいきなりつまづいてしまいました。
静的でないフィールド、メソッド、またはプロパティ 'test.x' で、オブジェクト参照が必要です。
と表示されてエラーが出ます。
public class test
{
  int x=100;
      public static void Start()
     {
      System.Console.WriteLine(x);
     }
      public static void Main(string[] args)
     {
      Start();
     }
}
>423
int x = 100;の前にもstatic
425420:04/07/07 18:00
>>421-422
面倒でも不備は無くしたいので、両方とも実装することにします。
どうもありがとうございました。
>>421>>422の片方でいいと
Application.IdleイベントでGC.Collect()っていいアイデアだと思わない?
このタイミングならウェイトが入っても問題ないし、
次のイベント発生時にもっともゴミの少ない状態になれる。
Windowsフォームアプリみたいなイベント駆動では必須かなとか思ってる。

ただし、連続してイベントが発生したとき、
イベント→アイドルなし→イベント、
という動作をしてくれると期待してるんだけど、
イベント→ビジーなのにアイドルイベント→イベント、
という動作をされたら逆効果だよね。
アイドルイベントの発生タイミングってどうやって調べる?
>427

多分 bad idea … profiling して GC が性能上の bottle-neck に本当になってるのを確認した上で、object pooling だとかの技法をつかっても駄目だったときなら OKなのかもしれないけども。

# GC.Collect () しちゃうとすべての object をナメる上に、thread も一時停止させられちゃうからなぁ…
# N88 basic の string の GC とかとはワケが違うから、.NET Framework の GC をもーすこし信用みるべし(笑)
>>427
それでいけるならFrameworkに組み込まれていると思われ…
430427:04/07/07 20:28
そういったデメリットがApplication.Idleのタイミングなら発生しても問題ないと思うんだけどな。
どこで起こるかわからないより、起こっても問題ないところで起こしてしまおうと。

で、WindowsアプリなのにConsoleアプリでビルドして、IdleでWriteLineしてみた。
フォーム上でマウスが動くたびに出力があった。
放置状態やメニューのポップアップ中などは出力がなかった。
この仕様なら俺的にはGOサインだなと思ったよ。
>>427
GCがアプリのスループットを悪化させているか
GCがアプリのレスポンスを悪化させているか
>>427の対策がそれらを改善するのか
を実際に検証しないと意味がないと思う。

2ch見てると.NETの中間コード・GCの遅さが必要以上に強調されすぎてるような気がするよ。
今現在のパフォーマンスの悪さは後付されたランタイムのロードと
Win32APIのラッパーであるWindows.Formsの遅さに起因していると思う。
>>431
禿同
漏れ的には、何らかのアクションが終了したタイミングで GC 走らせる方が好みだけど。
(重い処理の終了時にどさくさにまぎれて、とか)

キー操作やボタン等へのレスポンスは大切だから、ユーザがアクションを起こそうとした瞬間
(←もちろん予知できない)にGCが先んじて動いてユーザが待たされる、ってのは気に入らない。
>>433
だから妄想はいいから428,431を検証したのかと。
C#で大きいアプリ作ってないから分からないんだが、ガベコレでどのぐらい固まるんだい?
436デフォルトの名無しさん:04/07/07 23:15
C#でhttpファイル転送をするコードを書いたのですが…

private void hoge()
{
System.Net.HttpWebRequest webreq;
System.Net.HttpWebResponse webres;
//Webリクエストインスタンス生成
webreq = (System.Net.HttpWebRequest)System.Net.WebRequest.Create(@"http://hoge/hoge.CAB");
//認証の設定
webreq.Credentials = new System.Net.NetworkCredential("hoge, "hoge");
//HttpWebResponseの取得
webres = (System.Net.HttpWebResponse)webreq.GetResponse();
//応答データを受信するためのStreamを取得
br = new BinaryReader(webres.GetResponseStream());
//ファイルに書き込むためのFileStreamを作成
bw = new BinaryWriter(new FileStream("C:\hoge.CAB", FileMode.Create, FileAccess.Write));※1
// ファイルにサーバから取得したデータを書き込む
bw.Write(br.ReadBytes((int)webres.ContentLength), 0, (int)webres.ContentLength);※2
//閉じる
bw.Close();
br.Close();
}

↓;※1か;※2でこういうエラー(例外)が起きることがあって困っています。
きわめて稀に起きるのですが、何がまずくてどうすれば解決するのでしょうか?
教えてください

mscorlib:パス "C:\hoge.CAB" の一部が見つかりませんでした。
2004/07/06,23:30:35.913,0x00f3ff03,0x00000002,0x668,0x32c, at System.IO.__Error.WinIOError(Int32 errorCode, String str)
at System.IO.FileStream..ctor(String path, FileMode mode, FileAccess access, FileShare share, Int32 bufferSize, Boolean useAsync, String msgPath, Boolean bFromProxy)
at System.IO.FileStream..ctor(String path, FileMode mode, FileAccess access)
at RmAAIpAprInfLst0.CApproval.CApproval_Load(Object sender, EventArgs e)
あのね、GCを実行したとき参照が残ってるオブジェクトはどうなるか分かってるかい?
>>428>>431の立場は俺とは逆だな。
GCがボトルネックやら関わるっていう状況は経験がないか、認識したことがない。
GCってたまにCollect()してあげないとスワップしてもどんどんメモリ消費してる。
俺のところでは百メガ超えてまだがんばってるので、
GCが”起こる”ことがボトルネックではなく、
”起こらない”ことがシステム全体をパフォーマンスダウンさせてる。
だから一つアクション起こし終えたらなるべくCollect()させることにした。
もちろん、Collect後に続いて何もしなくていいようなケースで。
何かさせる前にメモリ不足でモタつくくらいなら、させた後に解放でモタついた方が、
ユーザーにストレスを与えない作りに出来ると思う。
思う。
440428 ◆Qgg7HIarPg :04/07/07 23:31
>438

後学のため、どういう状況でそうなるのかチョット知りたい気もする… > heap が大きくなりすぎる

# Gen 2 とか large object heap に何か山盛り残ってるとかそういうことなんだろうか?
441438:04/07/07 23:40
特別なことさせてるつもりもないのでどういう状況かも説明出来ないよ。
起動して、ドキュメントを扱って、保存して、別のドキュメントも読み込んで、
その繰り返しというだけのつもりだが、どうせ参照が残ってるとか言われるんだろうな。
GC.Collect()でガクっと減るから残ってはいない。
>>437
どうなるの?
世代がシフトするかなと思うけどそれって好都合。
勝手に発動するGCにはかかりにくく、GCしたいときにかかる。
>>436
typo じゃないとするなら、C:\\hoge.CAB って書いてないため、
Cドライブのカレントディレクトリが使えない状況のときエラーになってるんだと思う。
C++の__FILE__や__LINE__みたいな指定はC#ではどうやればいいのでしょうか?
出来ませんorz
環境:CPU AthlonXP3000+ MEM:512MB(テスト中は大きなスワップ無し)
テスト内容:GC.Collect()の空実行10000回の実行時間。

テスト結果
フォーム一枚+ボタン数個の場合:1432ms
フォーム一枚+ボタン数個+objectインスタンス10000個+その参照を保持した配列の場合:4066ms

>>438の言うようにメモリぎりぎりの状態でCollectで100MB稼げるなら効果はありそう。
GC.Collectのオーバーヘッドもそれほど大きくは無い。
ただ個人的にGCで100MB減るような現象は見たことが無く、メモリに余裕がある場合にも効果はない。
さらにApplication.IdleでCollectするテクニックが横行した場合、
複数のアプリケーションで頻繁にCollectされるのでそのオーバーヘッドは無視できないものとなる。
なので.NET製アプリケーションの作法としては行儀のいいやり方とはいえないと思う。
結論:IdleでCollectは楽しすぎ。
ところでApplication.Idleって非アクティブ状態でも0.1秒間隔で
発生するんだけど、いったいなにが起ってるんだろう。
448427:04/07/08 01:56
テスト中だけど、今のところIdleでGCやらせても問題ない気がする。(憶測)

>>447
Idleイベントで何させてるかで、何度もIdleイベントが呼ばれる。(危険)
最初、Idleの度にフォームのテキストを書き換えたらそうなって困った。
Consoleに書き出せばフォームにイベントが起こらないので、
毎回GCしても非アクティブ時にはイベント発生しなくなる。

だから>>446の、
>複数のアプリケーションで頻繁にCollectされる
という状況にはならないんじゃないかな。
449428 ◆Qgg7HIarPg :04/07/08 02:22
>441

うーむ、20Kbytes 以上のデカい instance が悪さしてるんだろうか?

>446

ワシも見たこと無いですねぇ>GC.Collect () でドカンと減る奴
Form.Closingで、ドキュメントを保存するかどうか確認させているのですが、
アプリ終了前にWindows自体シャットダウンをされたとき、
確認ダイアログとともに「応答なし?秒で閉じます」的なダイアログが出てしまいます。
これはどうやって回避するんですか?
>>448
一般的には問題なさげなタイミングのようだけど、
ことネットワーク関連アプリの場合は、UI処理が終わって idle が発生するときは
UI操作によって動き始めたワーカスレッドがまさに全力で処理中だったりするので、
なんか最悪のタイミングなような気がする。
>>450
ドキュメントのSessionEnding イベントの解説を参考にして、WM_QUERYENDSESSION
をトラップしてそこで処理する。
>>433みたいに、突然モタモタする事ってよくあるけど、
これってGCが発動したからじゃなくて、GC終えてもまだメモリ不足でスワップしたからだよ。
GCはいつ起こったか気がつかないほどスマートな仕事してるから、
while内みたいなループ部分で呼ばない限り、パフォーマンスダウンを実感できない。
GCってメモリ再配置までやるの?
それとも未使用状態にもどすだけ?
無駄にGC呼ぶとCPUの一次二次キャッシュが吹き飛びそうだな
なるほど、キャッシュがあるからGC速いのか。
>457

それもあるけど、速さの主たる理由ではないと思う…
459デフォルトの名無しさん:04/07/08 18:05
質問があります。
Form2からForm1のコントロールを操作するのに、Form1のコントロールの
可視性をPublicにしても良いのでしょうか?
460フェルト:04/07/08 18:18
パソコンのゴミ箱アイコンで、ゴミ箱を空にするを選択したら、Dd121を削除できませんって出ます。
Dd121ってなんですか?
461フェルト:04/07/08 18:19
書き込むところを間違えました
>>459
状況によるけど、BeginInvokeかな。
>>459
コントロールのフィールドに限っては、Publicに変更でも別に良いと思う。
オブジェクト指向の完璧主義者なら、コントロールのスコープはPrivateのままで、
コントロールにアクセスするにはプロパティを作成して内部でアクセスするけど、
それだと余りにもプロパティーの数が増えすぎてソースは長くなるし、読みづらく
なるので、オブジェクト指向の完璧主義者でもないなら手っ取り早くPublicで良いのではと思う。
VB.NETなら直接コントロールにアクセ可能だしね。
464 ◆Qgg7HIarPg :04/07/08 22:50
# C# に限った話ではないケドも…

ttp://msdn.microsoft.com/netframework/downloads/updates/sptechpreview/default.aspx

.NET Framework 1.0SP3 & 1.1SP1 technical preview … 正式 release は何時頃になんだろなぁ…
1.0なんてもうイラネ
>>462
…うーん、状況によるってもちょっとそれは出てこん…
>>464
Windows XP SP2 と同時期かと。
XP SP2 RC版で既に .NET Framework 1.1 SP1 が入っていたので、一緒に試しているけど、
Visual Studio .NET 2003 でいじっている分には、今のところ、問題ないです。
468デフォルトの名無しさん:04/07/09 12:45
タイマで1msec単位でイベント発生できますが、
もう3桁こまかくμsec単位でイベントを制御したいときはどうしたらいいですか?
Windowsはそんな高精度に動作できない
そんな高精度タイマが使えたら携帯電話にすら.NETがのってるだろうな。
471468:04/07/09 13:04
Windowsからは制御できませんか…
わかりました。

>>471
一応、単なる高精度カウンタだったらQueryPerformanceCounter()なるAPIがあるよと言っておこう。
まぁ、多分あなたがやりたいことにはあんまり役に立たないと思うが…参考までに一応な。
ハードウェアクロックが8192Hzとすると
...123マイクロ秒
最強の時計はな、太陽系と、それに含まれる星の公転、時点速度を割り出してエミュレート。
そこから地球上の時間を割り出すんだよ。
>>474
知ったかぶりと言うよりは、子供の戯れ言レベルのアホだな。
Application.Run(Form)はForm.ShowDialog()に比べて何か特別なことしてるの?
先生!>>476にツッコんでいいのかどうか微妙です!
初めての人には優しくしてあげなさい。
479デフォルトの名無しさん:04/07/09 14:22
ASPから他のEXEにデータを渡したいのですが、どういう方法があるのでしょうか?

今は毎回
StartInfo.Arguments
を与えた上で
Start();
させてるのですが、常駐しているexeに渡すいい方法はないでしょうか?
>>479
Winに特化した方法としては、EXE 側が COM サーバになって COM オブジェクト経由で渡す。
一般的な方法としては、何かプロトコルを考えてソケットやネームドパイプで渡す。
481476:04/07/09 14:40
どこが変?
Application.RunをShowDialogに変えても動作したんだけどどうなのよ?
483479:04/07/09 15:21
れすありがとうございます。

なんかCOMサーバーとか難しそうですね…

どうしようかな… がんばるか…
>479 .NETリモーティングとか使えへんの?
485デフォルトの名無しさん:04/07/09 16:26
Form間の値の受け渡しについて教えてくだされ。
FormHogeからFormFugaを呼び出すとすると、
ShowDialog(this)みたいに呼び出しているんだから
FormFugaからFormHogeの変数(private/public)にはアクセスできるはず。

で、どんな風にして値を読めば良いの?
>>485
FormHoge.ShowDialog(FormFuga)としたとき、
FormFugaのOwnerプロパティにFormHogeの参照が入ってる。

>  FormFugaからFormHogeの変数(private/public)にはアクセスできるはず。
いやprivateは無理だろ。
アクセスできなければエラーが出るからまずはアクセスしてみれ。
エラー内容聞いてから一緒に考えようじゃないか。
>>468
Win32APIのtimeSetEventは試した?
それがアプリレベルで一番精度が高いんじゃない。
メディアプレイヤーのバーを出さないで、
指定した音楽ファイルを再生する方法を教えてください。
BGMみたいなものをつけたいです。
また、再生が終了したことを検地する方法も教えてください
490485:04/07/09 17:30
>>486
じゃあ、HogeからFugaの値を読むためだけに、
特定の変数をpublicにしないといけないってこと?
なんでもオープンな体質はOO的にはよくないって聞いたけど…
>>490
他のオブジェクトにprivateメンバまで見せる方がよっぽど「オープン」じゃないか?
というか設計が変だ。

前もやったがOpenFileDialogを例にしよう。

OpenFileDialog dialog = new OpenFileDialog(); //そのオブジェクトに必須のデータはコンストラクタで設定する
dialog.Filter = "すべてのファイル|*.*";      //オブジェクトの処理に使う各種データをプロパティに書き込む
if (dialog.ShowDialog(this) == DialogResult.OK) { //ダイアログを開く
   filename = dialog.FileName;   //必要なデータをダイアログのプロパティから読み込む
}
>>489
BGMのような扱いをするならメディアプレイヤーでなくてManaged DirectXを使うのが一番簡単じゃない?

>>490
internalにするとか。
>>492
BGMというか、ボタンを押した時にサウンドを鳴らすようなことがしたいんです。
C#標準では無い機能なんですかねぇ?
検索しても余り出てこないし、これだけのためにDirectXの勉強なんてできません
>>493
確か.NET Framework2.0でサウンド処理も追加されるはずだがね。

Managed DirectXでサウンドを再生するのに勉強と言うほどのこともない。
再生・停止するだけならAudioVideoクラスでほとんど手間なく実装できる。
//ボリュームの指定にちょっとはまったけどな。
>>493
メディアプレイヤーを表示しないようにする。
DirectXなら
Microsoft.DirectX.AudioVideoPlayback.Audio hoge = new Microsoft.DirectX.AudioVideoPlayback.Audio("hoge.wav");
hoge.Play();
.NET 2.0なら
System.Windows.Forms.SoundPlayer hoge = new System.Windows.Forms.SoundPlayer("hoge.wav");
hoge.Play();
半角・全角を判断する方法は
char ch = '半角文字か全角文字(一文字です)'
byte[] byt = Encoding.Default.GetBytes(ch.ToString());
で、byt.Length が 2 だったら全角
というような判断でいいですかね。
もっと良さそうな方法があれば教えてください
>>496
文字コードを見ればいいんじゃない?
もしくは、強引だけどlstrlenを呼び出してきて、1なら半角、2なら全角。
HailStormって今どうなってるの?
最近あまり話を聞かないんだけど。
検索で見つかるのは2001年の情報ばっかり。
>>498
正式名称は.NET My Servicesで、
ttp://itpro.nikkeibp.co.jp/free/NBY/NEWS/20030320/1/
こういうことらしい。
500デフォルトの名無しさん:04/07/09 23:42
500get!
じゃなくて、
ループの中で、
Console.Writeline(hoge[i]);
ってやると
hoge[i]
hoge[i+1]
って表示されますが、これを改行なしで
hogehage
にするにはどうすればいいでしょうか?
>>500
WriteLineじゃなくてWrite
なんか逝っちゃった質問ばっかだ…
503デフォルトの名無しさん:04/07/10 00:23
theSpoke効果だなw
504479:04/07/10 00:25
噂のthespoke買ったものです。

100010010110101...
といった二進数をそのままバイナリファイルとして保存するにはどうすればいいのでしょうか?
BinaryWriteというのはどうつかえばいいんですか?
>>504
まずその二進数とやらを何の型で保持してるかが問題だ。
504は混乱した。
507504:04/07/10 00:58
とりあえずStringでもってます。
同時にchar[i]で一文字ずつのもあります。

>>507
例えばConvert.ToByteとBinaryWriter.Write

問題は一番最後の桁、これが8ビットに足りない場合だな。
どう処理するかによって適当にビットシフトだ。

//ってことが分かるくらいならそもそも聞かないかもなーw

try&errorで経験を積み重ねていこうや。
509504:04/07/10 01:56
FileStream fs = new FileStream(@"c:\tete.bin",FileMode.CreateNew);
BinaryWriter bw = new BinaryWriter(fs);

なんちゃらかんちゃら

bw.Flush();
bw.Close();

でいけました。 ありがとうございました。
水平/垂直帰線割り込みってある?
>>510
そりゃC#じゃなく
>>511
こっちのスレで聞いてみるとか。

Managed DirectX vol.2
http://pc5.2ch.net/test/read.cgi/tech/1061285378/l50
513512:04/07/10 03:01
>>511じゃなくて>>510だった。
>509

折角構文にあるんだから

using (BinaryWriter bw = new BinaryWriter (File.Open (@"foo.bin", FileMode.Create)))
{
// ... Do what you want...
}

するのが美しいかと…本質的ではないのだが…
timerって割り込み?それともイベント?
割り込みとイベントをどういう意味で書いてるんだよ?
ついでにtimerって何のことを言ってるんだよ?
wm_timerイベント
>>515
がんばっても答えようがないほどあいまいは質問だな。
ちなみにWM_TIMERは割り込みでもイベントでもなく、整数。
( ゚д゚)ポカーン
520デフォルトの名無しさん:04/07/10 10:34
>>518
まぁ、整数は整数なわけだが、「メッセージ」ぐらいにしておいてやれよ。
>>517は自分で「イベント」と言ってるけれど。
522デフォルトの名無しさん:04/07/10 10:38
>>517
> wm_timerイベント

そんなものはない。
イベントというならTimer.Tickイベントだろ。
theSpoke発売&夏到来ということで、
これから1〜2ヶ月をがんばって乗り切りましょう。>ALL
>>524
なぜここでお前が仕切っているのか知らんが、
がんばって乗り切るというのは、これからうじゃうじゃ湧いてくるであろう厨房の対策か?
それなら俺はごめんだな。
そう。お前みたいな奴の対策だよ
>>524-527
失せろ
>>527
バイバイ!(w
>524はとばされた
>525はとばされた
>526はとばされた
>527はこんらんしている
>529はふしぎなおどりをおどった!
>529はしんでしまった!
へんじがない。
532529:04/07/10 13:52
>529はいきかえった!
しかし >529 のようすがへんだ。
そういえば、ここはペットセメタリー・・・・
初めまして〜質問してもいいでしょうか・・・

VisualStudio.NETでWindowsフォームのアプリを作っています。
TreeNodeクラスを継承し、1つだけプロパティを追加した
CustomTreeNodeクラスなるものを作りました。

ある処理で、TreeNodeオブジェクトを受け取る場面があるのですが、
その受け取ったTreeNodeオブジェクトの内容を全てコピーした
CustomTreeNodeオブジェクトを作成することは可能でしょうか?
535デフォルトの名無しさん:04/07/10 15:58
>>534
簡単には、できない。

なんと>529の中身はミミックだった!
536534:04/07/10 16:08
>>535
明示的にキャストするとできるのかなぁと思ったのですが、
実行時にエラーになりました・・・

あれ〜親子関係にある場合は、キャストできるんじゃなかったっけ???
わからん・・・・
>>536
子は親の情報に加えて自分独自の情報をもっている。
子から親へのキャストは独自の情報を捨てればいいが、
親から子へのキャストで独自の情報はどう処理すればいい?

だから(実は)子だけど親の型の参照で保持されていたものをキャストすれば
当然問題なく子にキャストできる。
しかし親の型で参照された親の型のオブジェクトは子の型にはキャストできない。
TreeNodeでしかないものをどうやってCustomTreeNodeにするんだボケ
キャストできるのはTreeNodeの振りしたCustomTreeNode以上のものだ
539534:04/07/10 16:27
>>537、538

大変勉強になりました!どうもです!
using(hogehogehogehoge)
{
   foobar.foo();
   ...
}
っていう書き方を見かけるんだけど、どういう使い方をする構文なの?
マイクソ公認のVisualC#本読んだけどほとんど説明なかったんで、さくっと説明きぼん
>>540
using (Font MyFont = new Font("Arial", 10.0f), MyFont2 = new Font("Arial", 10.0f)) {
   //use MyFont and MyFont2
}

try {
   Font MyFont = new Font("Arial", 10.0f), MyFont2 = new Font("Arial", 10.0f));
   //use MyFont and MyFont2
}
catch (Exception ex) {
   throw ex;
}
finally {
   MyFont.Dispose();
}
と等価。
宣言されるオブジェクトはIDisposableを実装する必要あり。

しかしエラー処理に結局try-catchを使うならついでにfinallyも実装してやればいいからなぁ。
私はファイル処理なんかだとusingよりtry-catch-finally派だな。
あ、やべ。
Font MyFont = null;
try {
   MyFont = new Font("Arial", 10.0f), MyFont2 = new Font("Arial", 10.0f));
   //use MyFont and MyFont2
}
catch (Exception ex) {
   throw ex;
}
finally {
   if (MyFont != null)
      MyFont.Dispose();
}
だな。
usingを使うと、抜ける時にDisposeメソッドが呼ばれるってのがミソなんじゃないの?

>>541が等価なコードを示してるとおりで、try-catch使うよりもスッキリとしたコードに
仕上がってるよね。
Dispose される順番とかを厳密解釈すると…

using (Font MyFont = new Font ("Arial", 10.f), MyFont2 = new Font ("Arial", 10.0f)) {
// Using MyFont, MyFont2
}



{
Font MyFont ;
try {
MyFont = new Font ("Arial", 10.0f) ;
Font MyFont2 ;
try {
MyFont2 = new Font ("Arial", 10.0f) ;
// Using MyFont, MyFont2
}
finally {
IDisposable d = MyFont2 as IDisposable ;
if (d != null)
d.Dispose () ;
}
}
finally {
IDisposable d = MyFont as IDisposable ;
if (d != null)
d.Dispose () ;
}
}

…なげぇ…素直に using (...) {} すべし。
細かい子というようだが...
FONTで例やってるがFONTごときほっとけと思うんですが
>>545
ふぉんとにな。
ついでに言っておくと勝手にキャッチするような迷惑な事はされない。
メモ。マネージドのアセンブリをリソースとして他のアセンブリに格納する。

まず参照されるdll。
[DllPart.cs] csc /t:library /out:DllPart.dll DllPart.cs
using System;
using System.Reflection;
[assembly: AssemblyKeyFile("DllPart.snk")]  //sn.exeで作ったキーペアファイル。使いたいのに意味がない(詳しくは後述
namespace Test {
   public class DllPart {
      public string Name {get {return name;} set {name = value;}}
      private string name;
      public void SetId(int id) {
         this.id = id;
      }
      public int GetId() {
         return id;
      }
      private int id;
   }
}
で、DllPart.dllを参照する本体。実際には例外処理を入れるべき。
[MainPart.cs] csc /t:exe /res:DllPart.dll
using System;
using System.Reflection;
using System.IO;
namespace Test {
   public class MainPart {
      public static void Main() {
         Assembly assembly = null;
         using (Stream stream = Assembly.GetExecutingAssembly().GetManifestResourceStream("DllPart.dll")) {
            byte[] bytes = new byte[(int)stream.Length];
            stream.Read(bytes, 0, bytes.Length);
            assembly = Assembly.Load(bytes);
         }
         Type type = assembly.GetType("Test.DllPart");
         object dllpart = Activator.CreateInstance(type);
         PropertyInfo nameInfo = type.GetProperty("Name");
         nameInfo.SetValue(dllpart, "Test.", null);
         string name = nameInfo.GetValue(dllpart, null) as string;
         Console.WriteLine(name);
         MethodInfo setIdInfo = type.GetMethod("SetId");
         setIdInfo.Invoke(dllpart, new object[]{1});
         MethodInfo getIdInfo = type.GetMethod("GetId");
         int id = (int)getIdInfo.Invoke(dllpart, null);
         Console.WriteLine(id);
      }
   }
}
/r:DllPart.dllしてやればコード内でdllpartをDllPart型にキャストしてやれるじゃん? と思うのだが、
(コンパイルは通るが)なぜか実行時エラーがでてしまう。厳密名まで同じだってのに。
これでは使い勝手が悪いのでプロクシクラスを作って多少の楽を。
namespace Test {
   public class ProxyObject {
      private object obj;
      private Type type;
      public ProxyObject(Type type) {
         this.type = type;
         obj = Activator.CreateInstance(type);
      }
      public object this[string memberName] {
         get {
            return type.GetProperty(memberName).GetValue(obj, null);
         }
         set {
            type.GetProperty(memberName).SetValue(obj, value, null);
         }
      }
      public object Invoke(string methodName, params object[] arguments) {
         MethodInfo method = type.GetMethod(methodName);
         return method.Invoke(obj, arguments);
      }
   }
}
アクセサのパラメータがmemberInfoなのはFieldの可能性も考慮に入れて。
上のコードでは省略。
ProxyObjectを使って書き直したMainPart。
namespace Test {
   public class MainPart {
      public static void Main() {
         Assembly assembly = null;
         using (Stream stream = Assembly.GetExecutingAssembly().GetManifestResourceStream("DllPart.dll")) {
            byte[] bytes = new byte[(int)stream.Length];
            stream.Read(bytes, 0, bytes.Length);
            assembly = Assembly.Load(bytes);
         }
         Type type = assembly.GetType("Test.DllPart");
         ProxyObject proxy = new ProxyObject(type);
         proxy["Name"] = ".tseT";
         Console.WriteLine(proxy["Name"]);
         proxy.Invoke("SetId", 2);
         id = (int)proxy.Invoke("GetId");
         Console.WriteLine(id);
      }
   }
}

なんとかコード内で直接DllPart型を使えるようにならないものかなぁ……。
実行時エラーってやっぱりInvalidCastException?
厳密名なしでも駄目なんだよね?(って最初に試してるだろうけど)
VBでやれっていう神の啓示か…
554デフォルトの名無しさん:04/07/10 21:35
bool型の変数を一発で反転させる方法ってありますか?

今は 
if(b)
b=false;
else
b=true
ってやってるのですが。もっとスマートな方法無いですか?
b = ~b;
はコンパイラに怒られます
>>554
>  bool型の変数を一発で反転させる方法ってありますか?
b = !b;

>>552
> 実行時エラーってやっぱりInvalidCastException?
そう。
> 厳密名なしでも駄目なんだよね?(って最初に試してるだろうけど)
駄目だね。

これさえ解決すればちょっと便利になるのになぁ。
関係ないが、InvalidCastExceptionとか、
もっと詳細な追加情報くれって思わん?
http://www.gotdotnet.com/japan/student/column/firststep/firststep11.aspx
↑これの通りやっているんですが、うまくいきません。
VisibleChangedが2回されるからか、scoreが+2されます。

http://do.sakura.ne.jp/~junkroom/cgi-bin/megabbs/readres.cgi?bo=lounge&vi=1003826049&rs=77&re=78&fi=no
↑レス77目が、メインとなるForm8、78がユーザーコントロールのMoleです。
>534
CustomTreeNodeクラスにTreeNodeクラスからの、
暗黙の型変換演算子を宣言すればいいのではないかと思う。
implicitを調べてみて。
>>558
そういうことじゃない。
560デフォルトの名無しさん:04/07/11 00:53
nullについて質問です。
Platform Invokeで呼び出したいWin32APIが以下のようになっています。

HDDEDATA DdeClientTransaction(LPBYTE pData,
DWORD cbData, HCONV hConv, HSZ hszItem,UINT wFmt,
UINT wType, DWORD dwTimeout, LPDWORD pdwResult);

下のように1番目の引数(LPBYTE pData)をSystem.Byteで
定義した場合には、呼び出し時にpDataにnullを渡せません。
[DllImport("User32.dll")]
public static extern IntPtr DdeClientTransaction(
ref Byte pData, UInt32 cbData, IntPtr hConv, IntPtr hszItem,
UInt32 wFmt, UInt32 wType, UInt32 dwTimeout, ref UInt32 pdwResult);

1番目の引数に、nullを渡すにはどのようにすればよいのでしょうか?
よろしくお願いします。。
>>560
IntPtr.ZeroがNULLポインタだからして、0を渡してやればいいんではないかい。
//XTYP_EXECUTEかXTYP_POKE以外の時は無視されるだけだと思うけど。
>>555
そういうことやったことは無いから適当な意見なんだけど、
namespace変えるのはどうよ?寝るけど。
>>560
そもそもバイト列のポインタに対してref Byteで宣言するのが正しいの?
System.Byteは1バイトのデータしか持たない気がするんだけど。

>559
え?TreeNodeからCustomTreeNodeへ変換できれば簡単じゃないかな?
だけど、書いてから調べたけどimplicitじゃ無理ですね。
>>558
じゃあその演算子の中身のコードの例を示してくれ。
その過程で気づくだろう。
自分はバカかと。アホかと。
>>562
そ、それをやると…何が変わるんだ…?
http://pc5.2ch.net/test/read.cgi/tech/1089284784/242より来ました

http://www.gotdotnet.com/japan/student/column/firststep/firststep12.aspx
「残り時間を表示するユーザーコントロール」ができません。
Startメソッドをpublicに修正し、
スタートボタンのクリックイベントハンドラで
this.lastTimer1.Start(10);
と記述したんですが、ずっと「残り10秒」なままです。
どう書けば作動してくれるんでしょうか?
>>561
ガッ
Dotfuscatorは無料版だと貧弱だし、高機能版は高価すぎる。
海外製のオブファスケータはいろいろあるけど、どれもとんでもなく高価だ。
体験版を試しても、マトモに動かないものとかあるのに、製品は数十万円とか。
とても購入意欲は湧かないので自前でどうにかしようと思っている。
アルゴリズムはそれほど難しくなさそうだけど、アセンブリのいじり方がわからない。
Reflectionで様々な情報が取得出来るけど、情報を書き換えるにはどうするの?
ildasm.exe
日本の尖閣諸島付近には、
イラクに匹敵する世界第2位の量の石油が眠っている。
そしてその資産はなんと、640兆円にもなる
 (日本の年間国家予算は約80兆円なので8年分に相当)

        ミ     ∧_∧
        ⊂ヾ(・∀・ )  ヘェーヘェーヘェーヘェーヘェ
        ∩ ゝヽ ⊂_ノヽ 

だが、その資源が日本政府のせいで全て水の泡になりそうだ

えぇ━━(゚Д゚;)━━━!!!!!

詳しくわ↓
http://mobius1.nobody.jp/
http://blog.livedoor.jp/team_lifeline/

>>571
すれ違い宣伝だが、600兆も本当にあれば、借金の半分は減らせるねぇ。うん。
ま、戦争などで輸入ができなくなったときのために「貯蔵」したいのか
単に中国が怖いのかだ
>>566
いや、別アセンブリで同namespaceってのが同居できると気持ち悪いな、と思って。
厳密名が被る可能性があるような気が。まあ適当に言ってるだけなんだけど。
厳密名ってそういう意味だっけ?
575573:04/07/11 16:03
あ、言葉間違えてるねすまん。普通に名前って書きたかった。
576573:04/07/11 16:13
バージョンが違うけどインタフェースが同じアセンブリを2つ同時にとか。
typeがstringから生成出来るし、名前が被るとどうなるのかなあと思って。
まあ知らないことに適当に口を挟んでも馬鹿にされるだけだね。ここらでやめとく。
まあ、別のクラスの名前がかぶるのは基本的に不要な混乱をもたらす
可能性があるので、止めた方がいい、というのはそうだと思うんだが…
# ちなみに同じ名前空間が別のアセンブリというのは、標準ライブラリでさえある。

問題は今回の話とつながらないってことだ。
578573:04/07/11 21:50
> # ちなみに同じ名前空間が別のアセンブリというのは、標準ライブラリでさえある。

だとしたら本当に話がつながらなくて申し訳ないんだけど、
これは本当なの?俺が馬鹿なのかな?参考のために教えて欲しい。

SystemとSystem.Reflectionは名前空間違うって認識で合ってる?それとも俺馬鹿?
>>478
>> # ちなみに同じ名前空間が別のアセンブリというのは、標準ライブラリでさえある。
> これは本当なの?
本当。
例えばわかりやすいのはSystem名前空間。
System名前空間直下の型なんかは、いろんなアセンブリに存在してる。
※念のため、もちろん同じ名前のクラスじゃないよ。誤解を招いてたらスマン。
580573:04/07/11 23:28
> System名前空間直下の型なんかは、いろんなアセンブリに存在してる。

System.DesignがSystem.Design.dllに入ってるよ、って言ってるならやっぱおかしい。
System.Designは名前空間であって型じゃないよ。

System.ArrayがSystem.dll以外に入ってるってなら合ってるけどマジで?
つーか>>550-551のnamespace別々にして試してみない?とりあえず。
俺会社に行かないと環境無い。
>System.DesignがSystem.Design.dllに入ってるよ、って言ってるならやっぱおかしい。
だからSystem名前空間「直下」の型って書いてるだろうに、ちゃんと読めってか確認してみたら?

>つーか>>550-551のnamespace別々にして試してみない?
だから、全然関係ないの。
っていうか、どれとどれの名前空間を変えろって言ってるのかよく分かんらんけどね。

大体元の問題は、同じアセンブリ(って化クラスと)認識されるはずなのに、
別物と認識されてキャストできないって言ってるんだ。
問題は「同じクラスなのに同じと認識されない」事。
名前空間を変えるって方向が理解できないってことが分かるだろ。
ついでだ、
>System.ArrayがSystem.dll以外に入ってるってなら合ってるけどマジで?
そこまで言ってるんなら、System.Arrayがどこに入ってるか一回確認してみろよ。
>>580
うだうだ言ってないで会社行ったらオブジェクトブラウザでも見てみれば?
584581:04/07/12 00:23
>>581の最初のは俺の読み違いだった。
俺が名前空間を型だと勘違いしてるんじゃないかって思われたわけね?
# まあ、そんな勘違いは最初からしとらんが。
585573:04/07/12 00:40
試せない状況でうだうだ言ってごめん。
そもそも俺が疑問を持った経緯を書いてないのが悪かった。

同じnamespaceでclass名が重複したらコンパイルエラーになるよね。
俺はそもそも同じnamespaceでアセンブリが分けられるとは思ってなかったんだけど、
静的に参照しているならアセンブリが分かれててもコンパイルは通せて、
型が保証されるのは納得できるのよ。

で、動的にロードすると同じclass名とかもうどうしようも無いから、
そもそも同じnamespaceが許されてないんじゃない?と思った。
いやもう馬鹿でいいけど、ごめんよ。明日自分で試して納得するよ。
>>585
それは逆。
名前空間、クラス名が別のアセンブリで重複するとき怒られるのは
静的に参照してる場合の話(コンパイル時の話)。
動的にロードした場合は問題ない(扱う側で注意は要るけど)。
※念のため、もちろん別クラスとして認識される。

静的に参照したアセンブリと動的にリソースからロードしたアセンブリが
同じと認識されないのはどういうことだってのが問題。
587573:04/07/12 10:00
>>586
あー、一晩寝たら少し話が見えてきた。
実装をすげ替えるんだったらinterface経由でやればいいんじゃないの?
一応以下は会社で試して、動いたよ。まだ勘違いしてたらすまん。

//InterfacePart.cs
//csc /t:library /out:InterfacePart.dll InterfacePart.cs
namespace Test
{
public interface IDllPart
{
string Name { get; set; }
void SetId(int id);
int GetId();
}
}
588573:04/07/12 10:00
//DllPart.cs
//csc /t:library /res:InterfacePart.dll /out:DllPart.dll DllPart.cs
namespace Test
{
public class DllPart : IDllPart
{
public string Name {get {return name;} set {name = value;}}
private string name;
public void SetId(int id)
{
this.id = id;
}
public int GetId()
{
return id;
}
private int id;
}
}
589573:04/07/12 10:01
あー読みにくいねすまん。
//MainPart.cs
//csc /t:exe /r:InterfacePart.dll /res:DllPart.dll MainPart.cs
namespace Test
{
public class MainPart
{
public static void Main()
{
Assembly assembly = null;
using (Stream stream = Assembly.GetExecutingAssembly().GetManifestResourceStream("DllPart.dll"))
{
byte[] bytes = new byte[(int)stream.Length];
stream.Read(bytes, 0, bytes.Length);
assembly = Assembly.Load(bytes);
}
Type type = assembly.GetType("Test.DllPart");
object o = Activator.CreateInstance(type);
IDllPart dllpart = o as IDllPart;
dllpart.Name = "Test.";
dllpart.SetId(1);
Console.WriteLine(dllpart.Name);
Console.WriteLine(dllpart.GetId());
}
}
}
うるさい
>>590
カルシウムは足りてるか?
錠剤じゃ吸収率がよくないそうだぞ。

>>587-589
これはこれで面白い結果だが。
//いまいち言葉にしにくいので考察はパス。

しかしこの場合参照ファイルとしてInterfacePart.dllが必要なわけで、
アセンブリの格納としては意味が薄れてしまう……。
//InterfacePart.dllを作って参照するくらいなら初めからDllPart.dllを参照する。
//「実行時に参照ファイルが必要ない」が目指すところ。
//DllPart.dllをいじらない、ってのも必要か?
//ソースがあるならMainPartコンパイル時にDllPart.csも含めればいいんだし。
System.Windows.Forms.Keys.Clearはウチのキーボードにないのですが、
何をするキーだと思えばいいですか?
>>592
そのまんま、クリアするキーらしい。
テキストボックスやら電卓の計算結果やら。
Windowsでは一般的ではない、と思う。(というか有効な(日本製)アプリってあるのか?)
AppleのキーボードにESCのそばにあるとかなんとか。
リッチエディットのデフォルトショートカットにCtrl + Clearが載ってる
>>591
そんなに条件厳しかったのね。
マネージドじゃちょっと思いつかないなあ。
http://www.microsoft.com/japan/msdn/net/general/persistappsettnet.asp
ここを参考にとりあえず、フォームのLocationを
Closingイベント時にXMLで保存しようとしたのですが、
どうも上手くいかず、空のファイルが出来るだけです。
疲れたよ・・・

ヒント教えて
>>596
独り言で済まされたくないのならもうちょっと文章を考えるべきだと思う。

XmlSerializerのシリアライズとデシリアライズをきっちり勉強しろ、としか。
>>596
具体的にどのようなコードを書いて上手く行かなかったのか全く記述なし、
そもそも質問する態度がなってない、
もうぬるぽ。
599560:04/07/12 18:42
>>561
>>563
解決しました。ありがとうございました。
IntPtr.Zeroは便利そうなので乱用してみます

>>599
どう解決したのか書こうよ。
601デフォルトの名無しさん:04/07/15 00:45
>>600
600を取ったおまえをガメラは許さない。
602152:04/07/15 01:57
C#の参照ってC++の参照とほぼ同じなのでしょうか?

呼び出し元の変数の内容を書き換える場合はどうすれば良いのでしょうか?
呼び出し元のvalueをクラス hoge内部で書き換えたい場合は
ポインタを使用するしかないのでしょうか?

    private void button2_Click(object sender, System.EventArgs e)
    {
      bool value = false;
      Hoge foo = new Hoge(value);
      foo.getStatus();

      if (value) MessageBox.Show(this,"ok");
    }

    public class Hoge
    {

      private bool hoge;
      public Hoge(bool value)
      {

        hoge = value;
        hoge = true;
      }

      public void getStatus()
      {
        if (hoge) MessageBox.Show("");
      }

    }
603152:04/07/15 01:59
あ、refを使用した場合でも書き換わりませんでした
>>602
「参照」ならC++のように呼び出しもとの値を書き換えられる。
605602:04/07/15 02:04
>>604
サンクスです
いろいろと実験したら
クラスで包んでやればできました。

boolとかintの場合はなんかクラスで包んでやらないといけないのですね
んなこたない。

public class Hoge {
  public static void Main(){
    int x = 100, y = 200;
    System.Console.WriteLine("x = " + x + "   y = " + y);
    swap(ref x, ref y);
    System.Console.WriteLine("x = " + x + "   y = " + y);
  }
  static void swap(ref int a, ref int b){
    int tmp = a; a = b; b = tmp;
  }
}
607602:04/07/15 02:13
>>606
すんません
ちょっとサンプルが悪かったです


    private void button2_Click(object sender, System.EventArgs e)
    {
      // 初期値でfalse
      bool value = false;
      Hoge foo = new Hoge(value);
      
      // クラスHoge内部でvalueの値を書き換えたい!
      foo.updateStatus();
    1  
      if (value) MessageBox.Show(this,"ok");

    public class Hoge
    {

      private bool hoge;
      public Hoge(bool value)
      {
        hoge = value;
      }
  
      public void updateStatus()
      {
        hoge = true;
      }
    }
>>602
おまいはいったい何がしたい?
クラスとかインスタンスとかいうもののイメージが理解できてるか?
この例なら返り値を取らせればいいとおもうけどね。
610602:04/07/15 02:20
要するになにがしたいかというと
デザインパターンでいうObserverのような機能を実現したいのです

もうちょっと自分でやってみます
>>607
少なくとも、そのコードではhogeに渡しているのは valueのコピーであって参照ではない。
ある変数と同じオブジェクトを別のクラス内で参照しておきたいと言う事なら、
object型などの参照型にアップキャストして保持しとくしかない。
使う時にダウンキャストしないといけなくなるので今一だが。
# まあ、ラッパークラス作ってもいいんだけど。

しかしながら、
if (value) MessageBox.Show(this,"ok");
のところを、
if (foo.value) MessageBox.Show(this,"ok");
みたいな形では駄目なのかを考えた方がいい。
# valueはprivateだなんて突っ込みは不要。
そもそもboolを持たせといてObserverってのがよくわからんな。
Observerパターン?
>>607のコードがいまいちピンとこないんだが…
615602:04/07/15 02:31
ユーザーコントロールでテキストボックスを拡張した物を作りました
EditBoxという名前とします

フォーム上に30個ぐらいEditBoxを配置するとします
このときにEditBoxに呼び出し元のフォームを知らせます

どれか一つでもテキストボックスの値が変更された場合は
呼び出し元のフォームの更新フラグを更新します
# コントロールの数が増えたり減ったりすることがあるので
# 戻り値で受け取るのはミスが増えるのでやりたくないんです

こうすれば
呼び出しもとのフォームは個々のコントロールの更新未更新を考えずに
画面の内容の更新をしることができると思うんです
こういうのを考えているんですが
javaだとできるんですがC#だとうまくいきません

>>615
フォームにフラグ更新メソッド作っておいて、
そのEditBoxとやらに呼ばせれば?
そもそも親フォームの更新フラグの存在をEditBoxが知っていることが間違ってる。
いや親フォームの存在すら知るべきではない
「Observerのような機能」じゃなくて「Observerの機能」を持たせればいいと思います。
619602:04/07/15 02:43
>>613
Observerだとメソッドをたたくじゃやないですか
そうじゃなくて更新フラグとかで通知だけしたいなと思ったんです

boolじゃなくてsetUpdateFlag()
とかのほうがスマートなんだろうか・・・

>>612
参照型として保持しておけば(・∀・)イイ!!んですね
プリミティブ型のラッパークラスは標準では用意されてないんですね
ありがとうございました

>>614
たぶんうまく伝わってませんすみません

>>616
そうですねラッパークラスを作るより
その方が早そうですね

>>618
その方向でやってみます

>>617
Observerにしてしまえば親フォームでコントロールの更新状況などを
考えなくて良いのは便利だと思うのですがどうでしょう?
単一の部品としではなくフレームワークとして考えてですが

とりあえず眠くなってきたので
みなさんのアドバイスを元に起きたらいろいろと試してみてみます
なんかできそうな気がしてきた
なんでJavaで出来てC#で出来ない?
大体フラグ更新という考え方(最初の考え方)だと
Observerのようにならないってのは分かるか?
# それでいいなら別にいいんだけど、そりゃObserverとは言わないだろ。

やり方なんていくらでもあって、EditBoxの既存のイベントを利用する、
独自のイベントを追加して利用する、更新通知メソッドをフォームに用意して
呼び出す、同じようなもんだがフラグプロパティをフォームに用意する、
更新通知デリゲートを渡してフォームに通知する(こりゃイベントとあまり変わらんが)、
なんて辺りがざっと考えられるが。
あと、もしフラグ更新でやるとしたら、そのフラグは
通知側が持つんじゃなくて通知される側の参照経由でセットするのが普通。
て結局は>>620と同じようになるけどな。
C#製アプリに.NET製言語のマクロ機能を搭載しようと思ったらどうすればいいんでしょう。
>>622
完全な独自実装ではなく.NETの機能を使って、例えばC#でマクロ書かせるとして、
document.new();
で、コンパイルエラー出さないためには、
using MyApp;
public class MyMacro
{
public MyMacro()
{
document.new();
}
}
最低でもこれだけ必要で、
ユーザーにとってはマクロなんて気軽なものじゃなくて完全に.NETプログラミング。
それでもかまわないならコンパイラ起動だけすればいい。
document.new();だけで動作できるVSA関連の機能は、
.NET 2.0 betaではobsoleteになってて将来使えなくなる。
ホストアプリと連携できなきゃ意味無いんじゃないの。
.NETでCOMサーバみたいなのって書けるのかね。
625デフォルトの名無しさん:04/07/15 12:02
HTMLのテーブルの値って簡単に取得する方法ありますか?
<td>hoge</td>
htmlはstring変数に取得したのでhogeの部分を取得したい。
正規表現
VSAはobsoleteだからナシとして、コンパイラでやる例を書いておく。
MyApp.exeにBaseMacroクラスを作り、そのメンバとしてホスト連携部を用意しとく。
ユーザーのマクロはBaseMacroを継承したクラスでを書かせる。
using MyApp;
public class MyMacro : BaseMacro
{
}
MyApp.exeを参照させてDLLをコンパイルする。
作成したDLLを動的に呼び出す。
これでstaticの値が連携部になる。
628デフォルトの名無しさん:04/07/15 12:11
>>626
もうちょっと具体的に教えてよ。
正規表現でhogeの部分を取得するのは、どういう風に書くの?
>>628
ここはC#相談室
正規表現
http://pc5.2ch.net/test/read.cgi/tech/1062152374/
頭から尻尾まで人に聞いてると成長できないぞ。
質問するのは頭と尻尾だけだ。
C#の正規表現めんどくさいね。
いちいち変数宣言してプロパティセットしてメソッド呼んでとか。
ループの内部で呼ぶとパフォーマンス落ちるから
前もって別の場所で初期化しておかないといけなかったり。
スクリプト言語みたいにもっとお手軽に使えないのかね。
633デフォルトの名無しさん:04/07/15 12:38
じゅうぶんお手軽だと思うんだけどなぁ。
あんまり色んな言語いじったことが無いからかも知れんけど。
言語組み込みの正規表現じゃなく、クラスライブラリなのでしょうがない。
お手軽だからこそスクリプト言語
データグリッドの使い方を教えてください。
検索してもデータベースサーバからごにょごにょすることばかりなのです。
ngen /delete * /show するつもりが、
誤って ngen /delete * してしまいました…_| ̄|○
ネイティブキャッシュを初期状態に戻す方法はないですか?
.NET Frameworkを入れなおすとか・・・
入れなおします…(ノ∀`)
今オリジナルメーラーを作ってます。
添付ファイルを表示するListViewにファイルをドラッグアンドドロップするとそのまま
添付ファイルとして送信できるようにしたいのです。

ListViewのlist_temp_DragEnterイベントを使ってDoDragDropメソッドを実行し、
とりあえず、DragDropEffects.Copyにしています。
この後、list_temp_DragDropイベントが実行されて、ファイル名を取得・・と考えていたのですが、
なぜかlist_temp_DragDropイベントが連続して起こります。

どうしてでしょうか。質問が下手ですみません。
>>640
DragEnterイベント内でDoDragDropやっちゃ駄目。
DoDragDropは自分コントロールからよそにドラッグドロップさせるためのメソッド。
(MouseDownイベントで実行させるのが普通)

DragEnterでは受け取ったDragEventArgsのEffectプロパティを操作するだけでいい。

void listView1_DragEnter(object sender, DragEventArgs e) {
   if (//e.Dataが要求する型だった) {
      e.Effect = DragDropEffects.Copy;
   }
}
「Windows フォーム デザイナで生成されたコード 」の中のあるコントロールの座標値を
変更した後、デザイン画面を見たらそのコントロールが消えてしまいました。
このコントロールを復活させる事はできないのでしょうか?
643デフォルトの名無しさん:04/07/16 17:36
SOAPっていうのでさ、情報を取得するプログラムを書いてみたんだが、
FWで接続を許可しないといつまで経っても接続できないだろ?
もしくは、ケーブルが抜けていたらいつまで経っても接続できないだろ?

「接続できない」ことを検出して、ダイアログボックスを表示したいんだが、
どうやって検出するんだ?教えてくれ。
>>642
プロパティをいじる。それで駄目なら作り直し。
645643:04/07/16 17:52
御免、例外投げていてくれた。

Thread使っていたからか、「異常終了」にならなかったから気付かなかった。
>>641
ありがとうございます!
解決できました!
647646:04/07/16 18:02
ついでに質問です。
メールの添付ファイルに使う場合、ドロップしたDataObject型を何に変換させるのがよいでしょうか。
ファイル名と、フルパスさえ取得できればいいと思っています。

FileInfo型にできればよいのですが・・。
>>647
いや普通DataFormats.FileDropのみ受け取るようにするんじゃないだろうか。
649デフォルトの名無しさん:04/07/16 18:27
メインウィンドウから新しいウィンドウを呼び出して
setting sw = new setting();
this.Enabled = false;
sw.Show();
両者でstringをやりとりしたいのですがどうしたらいいですか?
Form1のテキストボックスに、
swのopenfileダイアログで選んだファイル名を入れたいです。
650646:04/07/16 18:31
>>647
FileDropがいまいちわかりませぬ・・。
調べてきます!

>>649
Show()ってことはモードレス? モーダルなら>>315なんだけど。

C#的にはイベントで通知、かな。
あとはForm1に
public void ChangeTextBox1(string text) {
   textBox1.Text = text;
}
とかいといてswで実行するか。
652649:04/07/16 18:39
レスありがとうございます。

>>あとはForm1に 〜〜 とかいといてswで実行するか。
ってのはどういうことなんでしょうか?

swから
Form1.ChangeTextBox1(openFileDialog1.FileName);
とすると、
静的でないフィールド、メソッド、またはプロパティ '温度計.Form1.ChangeTextBox1(string)' で、オブジェクト参照が必要です。

となってしまいます。

>>652
オブジェクト指向は理解できてるかな、と。

form1でsettingクラスのインスタンスswを作成して、sw.Ownerに自分自身の参照thisを入れる。
//OwnerだとForm型であとでキャストする必要があるからForm1型の別プロパティを作ってもいいけど。
//スマートなのはOwnerプロパティを隠蔽することかな。

sw側からは自身のOwnerプロパティ越しにform1のパブリックメソッドを操作する。
通常OwnerプロパティはForm型なのでForm1型にキャストする必要がある。
//Ownerプロパティのnullチェックもやっておくと多い日も安心。
654646:04/07/16 18:59
646です。
おかげさまでドラッグアンドドロップからのメール添付できました!
大変ありがとうございました。


ListViewにアイコンが表示できますが、メール添付するファイルの拡張子にあわせてアイコン表示なんて事も簡単にできるのでしょうか?
ヒントいただけると幸いです。
普通のコントロールで、値が変更されたら〜する、って処理をする場合には、
OnTextChanged += new TextChangeDelegate( this.hoge );
みたいにイベント使うデソ。

同じノリで、
setting.cs で

 public delegate void SetFileNameDelegate(string filename);
 public SetFileNameDelegate OnFileSelected;

と delegate を宣言して、Form1 の方には
void SetFileName(string s) { this.textBox.text = s; } を追加、その上で

setting sw = new setting();
sw.OnFileSelected = new setting.SetFileNameDelegate( this.SetFileName );
sw.show();

sw ではファイル名の選択が済んだ段階で this.OnFileSelected(s); として呼び出す。

>>654
ttp://santamartadotnet.hp.infoseek.co.jp/documents/dotnettips/tips021.html
Win32API使わないと実装できないんじゃないかな。

>>655
デリゲートを使うならこの場合eventを使った方が自然。
657646:04/07/16 19:20
>>656
おおお!これでいけそうです!多謝!
.NET 2.0 なら
Icon.ExtractAssociatedIcon()
でいけますよ。
659658:04/07/16 19:31
あー、でも exe からアイコン数を取得ってできませんね_| ̄|○
660649:04/07/16 20:26
owner 等のキーワードでぐぐってみてやっとわかりました。

フィールドって初めて知りました…orzがんがります
ありがとうございました。
フィールドを使うところあったっけ……?
662649:04/07/16 20:45
http://dobon.net/vb/dotnet/form/accessanotherformdata.html
の下の方を見たんですが…

フィールドつかわなくてもできた…んですか… orz
やってみよっと。
ああいや、そういう意味なら問題ない。
フィールドをパブリックフィールドととってしまっただけ。
dataAdapterで複数のselectを一度に実行したくて
string sqlStr= "select a from b;" + "select c from d";
と繋げて実行したのですが、
「コマンドの後に文字があるぞ!」って怒られてしまいます。
どなたかアドバイスをお願いします。。。
初心者丸出しですみません。
WinAPI使わないと実装できないことがあるわけ?
どとねとふれーむわーくの意味ないじゃん!
>>665
遅っ
本命はWinFXだし。
ということは今のどとねと環境での開発は
FXまでの予行演習みたいなものか。
うーんでもやっぱしAPI新しくすることと
どとねと構想とあまし関係ないっつぅか
やっぱどとねとてその存在意義がよくわかんねぇ
DLLひとまとめにしたようなもんか?
>>664
あんた、T-SQLを勉強した方がいいぞ。
671602:04/07/17 03:30
602ですが
参照型でいったらできました
ありがとうございました

#refと参照型は違うんですね
672デフォルトの名無しさん:04/07/17 10:33
WSE2.0を使ってみたんですが、クライアントとサーバの
システム時間が5分ぐらいずれているとエラーとなってしまいます。
エラー:Message Expired

WSE1.0ではRequestSoapContext.Timestamp.Ttlの値を0にすれば
よかったんですが、WSE2.0にはそのようなプロパティが存在しません。。

上記エラーを回避するには、WSE2.0に対してどのような設定を
すればよろしいでしょうか。
>>672
参考になりそうなのはこれかなー。
ttp://www.gdncom.jp/general/bbs/ShowPost.aspx?PostID=12825
674デフォルトの名無しさん:04/07/17 11:35
C#のWindowsフォームアプリから、外部コマンドを実行するにはどうしたらいいですか?
System.Diagnostics.Process
676デフォルトの名無しさん:04/07/17 12:13
>>675
ありがとん!
Visual C#で作ったアプリをPocket PCで動かすことは出来ますか?
678デフォルトの名無しさん:04/07/17 15:23
VC++かC#で、IEのツールバー(googleToolbarのようなものを想像してください)を作りたいのですが、
作成方法を解説しているサイトをご存知ありませんか?
>>678
The Code Project - Extending Explorer with Band Objects using .NET and Windows Forms - C# Programming
http://www.codeproject.com/csharp/dotnetbandobjects.asp
682677:04/07/17 17:51
よろしこおながいします。
C#かDelphiで彼女を作りたいんです。
作成方法を解説しているサイトをご存知ありませんか?
あ、最低で柴崎コウさん、堀江由衣さんくらいの彼女が作りたいんです。
C#かDelphiで無理ならC++かVHDLでも問題ありません。
> C#かDelphiで彼女を作りたいんです。

1.C#かDelphiのプログラムが動かず悩んでいる、柴崎コウか堀江由衣くらいの女の子を捜す。
2.答えてあげる。
3.ヽ(゚∀゚)ノヤッター!!
>>684
漏れはその手で会社の後輩をゲトしようと思って、かなりいい線まで逝ったと思うのだが
ある日彼女の妊娠が発覚(入社1ヶ月目でオメデタ3ヶ月)、そのまま退社された orz
687677:04/07/17 18:38
Pocket PC(Windows CE)上で、.NET Frameworkが動いていれば実行できて、
Visual C#は、Visual Studio .NETのなかに付属している。で、合っていますか?
勘違いしているようでしたら教えてください。失礼します。
>>687
普通にC#で作ったWindowsFormアプリは動かない。
PocketPC向けに.NETCompactFrameworkで作ったアプリはPocketPCのAPIをP/Invokeで呼び出していなければ
大体のものはWindowsXPとかで動く。
689677:04/07/17 22:24
>>688
レスありがとうございます。取っ掛かりができました。助かりました。
ブラウザ(AxWebBrowser)上のリンクにマウスが乗ったとき、
どのようにすればステータスバーにURLを表示できますでしょうか、、、
タイミングなどよくわかりません・・・
>>690
StatusTextChangeイベント
>>691
正気?
テキストボックス等を以下のように
TextBox[] txtaaaaa = new TextBox[10];
コントロールの配列として扱う方法と、普通にtxtaaaaa1.txtと扱う方法を
1つのプログラムで混ぜていいのですか?
>>693
別に言語仕様上何の問題もない。
コードが読みやすければそれでいい。
混合させれば場面によっては可読性を損なうだろうし、場面によってはよりわかりやすくなることもある。
複数人でコードを扱う場合は多くの場合好まれないだろう。
まあコントロールの配列はコントロールを動的に作成する以外必要性少ないが。
>>694
特に問題はないんですね。
ありがとうございます。
696デフォルトの名無しさん:04/07/19 13:56
ほかのアプリケーションを操作する方法って、どんなのがありますか?

キーストロークを送信したりできないのでしょうか?

> キーストロークを送信したりできないのでしょうか?

今んとこ、APIを呼び出すしかない。
SendKeys.Send()
699デフォルトの名無しさん:04/07/19 23:25
Buttonの宣言位置なんですが、
public class MainForm : System.Windows.Forms.Form
{
  private System.Windows.Forms.Button button1;

  public MainForm()
  {
    InitializeComponent();
  }
}
なら普通に動くんですが、下のだと動きません。
public class MainForm : System.Windows.Forms.Form
{

  public MainForm()
  {
    System.Windows.Forms.Button button1;
    InitializeComponent();
  }
}
一応はButtonのインスタンス(button1)を初期化するInitializeComponent()の前でbutton1を宣言してるんですが、
InitializeComponent()内で、button1の定義が無いとエラーが出ます。
(InitializeComponent()内で、button1 = new Button()やってます)
MainForm()内の、button1宣言文とInitializeComponent()の呼び出し順ってどうなってるんでしょうか?
>>699
ttp://black.sakura.ne.jp/~third/programming/cs/cs.html
この辺で一から勉強し直した方がよくないか。

簡単に言えば、
クラスのメンバとして宣言された変数はオブジェクトが破棄されるときに破棄される。
あるメソッド内で宣言された変数はそのメソッドから抜けるときに破棄される。
また、別のメソッドを呼んだとき、
呼出先メソッドでは呼出元メソッドのローカル変数は扱えない。
701699:04/07/19 23:54
あの、それじゃあこの場合で普通に動くんですが、
public class MainForm : System.Windows.Forms.Form
{
  public MainForm()
  {
    InitializeComponent();
  }
  System.Windows.Forms.Button button1;
}

button1を初期化するInitializeComponent()の後にbutton1を宣言してもOKなのはなんででしょう?
>701
入門書読んでからこい
ヒント
スコープ
メンバ
> button1を初期化するInitializeComponent()の後にbutton1を宣言してもOKなのはなんででしょう?

後じゃないしなあ。
入門書に書いてあるかどうかも不安なレベルだ。
704699:04/07/20 00:13
あー、なんか分かりました。
public MainForm()
{
  InitializeComponent(new Button());
}

private void InitializeComponent(Button button1)
{
  button1.Location = new System.Drawing.Point(40, 104);
  button1.Name = "button1";
  button1.TabIndex = 0;
  button1.Text = "button1";
}
これなら動きました。
何がわかったのか書いてみな。
大事なとこだ
CommandBarとかDocking Windowとか作りたいんだけど、無理?
海外のコンポーネントだとソースコードがないのが多い・・・_| ̄|○
>>705
あんた親切だなあ。
708699:04/07/20 00:22
button1はInitializeComponent()で初期化するにはクラスのメンバーである必要があるけど、
上の駄目な例だと、MainForm()のローカル変数として宣言してたってことですよね。

で、InitializeComponent()にとって、MainForm()のローカル変数button1はスコープ外だと。
>>706
.NET Framework 2.0でToolStripやらRaftingContainerやらが増えてるが。

ttp://www.google.co.jp/search?q=cache:dobon.net/vb/dotnet/links/coolbar.html
にCommandBarコンポーネントがいくつか紹介されてる。
はずれでもないが、オブジェクトのライフサイクルについても考察せよ
711699:04/07/20 00:26
↓こんな感じでやってたと。
public void Test()
{
  int a = 0;
}

public void Test2()
{
  a=1;
}
>>708
書いていること自体は間違いではないが、まだまだ周りは
「分かってんのかな?」という感想だと思う。

button2を押したら、button1.Textを書き換えるとかはどうする?
>>711
そういう例だと、引数で渡さずにTest()とTest2()で同じaという変数を扱う、
って話をクリアして欲しい。
>699  MainForm()内の、button1宣言文とInitializeComponent()の呼び出し順ってどうなってるんでしょうか?

この時点でおまいはクラスのことを何も分かってないことがわかってしまう
分かってから自分がどれだけばかたりな質問をしたか分かるぞ
責めてるんじゃないが。ある意味その新鮮さがうらやましい
このスレってこんなに親切だったっけ?
あんまり親切すぎるの反対。
そだね。入門スレに帰れ!
717699:04/07/20 00:55
>>712
>>704のだと、InitializeComponent()の中でbutton2を作って初期化しないと駄目ですね。
InitializeComponent(Button button1)
{
  button1 = new Button();
  Button button2 = new Button();
  button2.Text = "button2";
  button2.Click += new EventHandler(button2_Click);
}

private void button2_Click(object s,EventArgs e)
{
  button1.Text = "書き換え後のテキスト";
}

いまオブジェクトのライフサイクルってのを調べてます。
718699:04/07/20 01:00
ああ、すいません。
ふらっとC#ってスレがあるので、今後はそっちをメインに利用します。
699のC#ライフに幸あれかし。
うむ、好感の持てるお人だった。
でも>>717は無茶苦茶だ。
後輩が>717のようなソースを持ってきてキラキラした目をしながら「先輩何とか動きました」といってきたらどうする?
>>721
>どうする?
困る。
>722
いや,そのまっすぐな目で見つめられたらおまえは
まあ717はコンパイル通らないから問題ないが。
……いや、button1がフィールドにもある可能性もあるか。

目を逸らしつつ入門書を差し出すかな。
725699:04/07/20 01:21
あぁすいません。
>>717のInitializeComponentは、
public MainForm()
{
  InitilaizeComponent(new Button());
}
って感じで呼び出してます。
とりあえず動作するのは確認してたので・・・というか気になって戻ってきましたw
726699:04/07/20 01:24
あああ、テストしたのと書き込んだの違った・・・
727699:04/07/20 01:28
 ∧||∧
(  ⌒ ヽbutton1はInitializeComponent()のローカル変数だから
 ∪  ノ     button2_Click()からはbutton1.Textにアクセスできないや。
  ∪∪      さっき出たネタなのに。
>727
心配するな。








それ以上に突込みどころ満載のソースだから
729699:04/07/20 01:35
やっぱり、VS.NETのデザイナーで生成されるソース使ったほうがいいんですか?
雛形どおり使うのって凄い抵抗あるんですが・・・とにかく変えたい症候群で。
>>729
まずはエディタとcsc.exeとコマンドプロンプトから始めるのを勧めるな。
全ての基本はHello worldだ。

自分がそういうレベルの質問してるという自覚はあるよな?
壮大な釣りの予感
732699:04/07/20 01:49
先月からcsc,nmake→SharpDevelopでやってたんですが、
theSpokeの激安VS.NET買っちゃったので使いたいんです(;´Д`)

レベルについては自覚してます。
>>729
> とにかく変えたい症候群で。

どうやら学生のようだが、プロになったらそんなポリシーなど三秒で駆逐されるから、
今のうちに変えたい症候群を楽しんでおこうね。
734デフォルトの名無しさん:04/07/20 10:15
というか、雛形どおりにやってたら楽だが、理解も応用もできなくなるからな。
変えたいというか、自分で最初から構築したいんだろう。いいことだよ。
改善はいいが改悪は止めてくれ
byte[] hogehoge = new byte[10 * 1024 * 1024];
って感じで大きめの領域を確保して、使い終わったら早めに片づけておきたいんだけど
C++のdelete[] に相当するものってないの?
>>736
ぬるぽGC
ファイル→新規→プロジェクト→C#と巡っても、「Windows Control Library」が無いんですが…。
ちなみにVisual C# .NET 2003 使ってます。
もし私の環境で"WCL"が使えないなら、どうにかして使えるようにする方法はありませんか?
MSのサイトにそのためのプラグインか何かが公開されているとか、
SharpDevelopならば使えるとか、
空のプロジェクトにごにょごにょファイルを追加すればそれ相当になるとか。
739デフォルトの名無しさん:04/07/20 13:40
ヽ(`Д´)ノ ウリャアage
>>738
ごにょごにょすればできるよ。
試してないけどそれっぽいツールもある。
オレはそれを知らずにごにょごにょしてしまった。
>>738
これ?
> ■ Visual C#.NET Standard で DLLをビルドする方法。
>
> (1)普通にプロジェクトを作る
> (2)プロジェクトを保存したフォルダの「プロジェクト名.csproj」をテキストエディタで開く
> (3)Settings要素の OutputType属性を "Library"に書き換える
>
> これでビルドするときに Main()がなくても怒られない。
ちょっと教えて下さい。

Cで記述されたDLLから、大量のコールバックを呼び出す必要があるのですが、
DLL内の初期化関数呼び出し時に、利用しそうなコールバック関数を一気に登録しておき、
必要に応じて、該当コールバック関数をコールする。

と言う事は可能なのでしょうか?

あと、コールバック用に作成したデリゲートのライフタイムは
どのへんに依存するのでしょうか?

どこかに、「コールバック登録したデリゲートが勝手に破棄されないようにする」
というような、記述を見た気がするのですが、何処で見たのか・・・
OpenFileDialog ofd = new OpenFileDialog();
if (ofd.ShowDialog() == DialogResult.OK)

でファイル開くダイアログを出して、.lnkファイルをダブルクリックすると
リンク先のフォルダへ行かず、リンクファイルを開いて終わってしまいました。
FileDialog.DereferenceLinksプロパティをいじっても変わりません。
なんとかなりませんか?
>>743
・FileNameがDereferenceLinksに関わらず.lnkを取得
・.NET Frameworks 2.0βだとDereferenceLinks=trueでリンク先フォルダの選択画面になる

バグか未実装のようだな。
//コモンコントロールなのに……。
>>742
delegateもCLR的には単なるObjectなんだから、
そのポインタをpinしておけばいいのですよ。
つかMC++経由だったらそんなにトリッキーなことにはならんと思うが。
どこで聞いたらいいのか迷ったので…スレ違いだったら誘導してもらえると助かります。

System.Net.HttpWebRequest/HttpWebResponse クラスを使って
簡易HTTPクライアントを作成しているのですが、IEが吐いたクッキーを食わせる方法がわかりません。

hoge.hoge.tldサーバ -[Cookie]-> IE ([email protected][x].txt に出力されている)

この状態で、自作プログラムから hoge.hoge.tld 上のリソースにアクセスする際に
IEで受け取ったクッキーを食わせたいんです。

ぐぐったところ
クッキー受け取り->そのクッキーを送出
というものは見つかったのですが、試しにその通りにやっても
期待通りの(クッキーが受け入れられた)動作は得られませんでした。

どなたかご教示いただけませんでしょうか?
>>746
せめてアドレスくらい書いてくれよー。
748746:04/07/20 20:42
>>747
Amazon.co.jpのトップページでやってみてます。IEでアクセスすると、

こんにちは、hogehogeさん。おすすめ商品を〜

となるんですが、HttpWebResponseで取得すると

こんにちは。おすすめ商品を〜

となり、Cookieが受理されていないようです。
アプリケーション自身が入ってるフォルダを調べるのはどうするんだった?
>>749
Path.GetDirectory(Application.ExcutablePath);

Path.GetDirectory(GetType().Assembly.Location);

でどうでしょうか?
751746:04/07/20 21:37
追記です。
request.CookieContainer.SetCookies(request.Address,"session-id-time=xxxx,session-id=xxxx…");
というふうに、Cookieファイルの内容を直接記述したら受理されました。
プロクシの設定みたいに、デフォルトの値を取得できないもんでしょうか?

>>749
Application.ExecutablePath でアプリケーションのフルパス(x:\hoge\hogehoge\foo.exe)
Application.StartupPath で実行パス(y:\foo\bar)

>>751
ファイルから読み込んでSetCookiesしてやればいいんじゃない?
HttpWebRequestでやる以上IEとは関係ないんだし。
デフォルトの値って何よ。
>>750-751
StartupPathだとなぜか一つ上のフォルダが出てきた・・・
Path.GetDirectoryName(GetType().Assembly.Location);でいけますた。
754746:04/07/20 22:33
>>752
デフォルトって言い方は変でしたね。
プロクシについては GetDefaultProxy()で取得できてたので、
同じように取得できないかな、と思ったのですが。

ファイルから読み込むしかないかな…
レジストリ検索したら、
HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders\Cookies
にフルパスを格納した値があったので、試しにこれでやってみたいと思います。
>>754
もっとエレガントに、
Environment.GetFolderPath(Environment.SpecialFolder.Cookies)
Environment.UserName
756746:04/07/20 22:41
>>755
_| ̄|○

迅速かつエレガントなレスthxです。

>>753
見当違いでした(´・ω・`)sry
757746:04/07/20 23:27
駄目だ、ディレクトリまでは簡単に取得できるけど
肝心のファイル名が一意に特定できない

foo.bar.hoge.ne.jpの場合、
...\Cookies\ユーザ名@foo.bar.hoge.ne[n].txt
になる、と思ってたらそうでもなく、
ディレクトリによっても左右されるみたいですね…

Cookiesディレクトリの*.txtを片っ端から走査して、
3行目のドメイン指定(?)が一致するものを探すしかない気がします。
index.datがくさい気がするんですが、ぐぐってもよくわからないし。


連続書き込みで申し訳ない。>ALL
>>757
ググってみたけど、そこまでベタにやるならおとなしく
InternetGetCookie と InternetSetCookie を使うのがいいんじゃない?
759746:04/07/21 00:38
>>758 さんに頂いたキーワードで検索したところ、ズバリなページを発見。
http://www.rendelmann.info/blog/default.aspx?date=2003-12-12#abd99bcd5-7088-4d46-801e-c0fe622dc2e5
ここのRetrieve〜関数をいじって(そのままだとエラーが出た)

   [DllImport("wininet.dll", CharSet=CharSet.Auto , SetLastError=true)]
   public static extern bool InternetGetCookie (string url, string name, StringBuilder data, ref int dataSize);

   private static string GetIECookiesForUrl(string url)
   {
       StringBuilder cookieHeader = new StringBuilder(new String(' ', 256), 256);
       int datasize = cookieHeader.Length;
       if (!InternetGetCookie(url, null, cookieHeader, ref datasize))
       {
           if (datasize < 0)
               return String.Empty;
           cookieHeader = new StringBuilder(datasize); // resize with new datasize
           InternetGetCookie(url, null, cookieHeader, ref datasize);
       }
       return System.Text.RegularExpressions.Regex.Replace(cookieHeader.ToString(),";",",");
   }

       // クッキーを食わせる ( HttpWebRequest request )
       request.CookieContainer = new System.Net.CookieContainer();
       request.CookieContainer.SetCookies(request.Address,GetIECookiesForUrl(request.Address.ToString()));

のようにしたところ、ちゃんとCookieが受理されました。
アドバイスを下さった皆さん、ありがとうございました。
>759

ttp://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpguide/html/cpconplatforminvokedatatypes.asp

P/Invoke するときに、LPSTR とか LPCSTR が来るところは System.String でも System.StringBuilder でも大丈夫なんだ…知らなかった orz

# 確かに、StringBuilder でないと微妙に具合悪いよなぁ…
LPSTRにSystem.Stringは変なような。ああ、書き換わっても反映されないだけか。
.NET2.0は1.0時代のコードをコチョコチョっと
書き直す程度ビルドできるものなんだろうか。

嫌々使っていたソースの無いサードパーティ部品をやめて
2.0で増えたネイティブコントロールを使いたいんだけど、
あんまり修正部分が広いとしんどい。
>>762
Ruby や perl で変換プログラムを書いたら。
ふと気づいたんだがみんなツールバーの画像とかどうしてる?
エレメンツのシェイプとか使って描いてる。
>764
まんどくせから全部■
漢だ… > 766
768デフォルトの名無しさん:04/07/22 00:30
>762
英語版のお試し版ならダウンロードしてインストールできるでそ
ツールバーの画像探したけど16色のしかなかったよ(;つД`)
どっかXP風なアイコン無料で公開してるとこない?
770KazMAX ◆CaGD7FUGns :04/07/22 01:05
>>769
http://kde-look.org/
このへんで探してみるとか。
system32\SHELL32.dll
あたりのリソースを無断使用するとか。
>>769
GlyphsXP
>>772はshell32.dllに入ってるものだけだった
できればウィンドウ関係のアイコンが欲しいがみつからない・・・
自分で作るしかないのかなー・・・
>>762
全くと言っていいほどコード書き直す必要ないはずなんだけど。
2.0でgenerics期待したんだけどなー
だけど?
>>745
callback関数の一括登録できました。

遅ればせながら、ありがとうございました。



778デフォルトの名無しさん:04/07/22 16:58
>>771

system32\SHELL32.dll のリソースを見てみました。

ツールバーの画像はアルファ付きBMPらしいのですが
リソースのBMPにはアルファ情報は入っていないみたいです。
カラーキーで背景色を抜いただけではかなり変な表示になってしまいます。
アルファ情報はどこにあるんでしょうか???

・・・・・・って完璧にスレ違いだったスマソ
779デフォルトの名無しさん:04/07/22 18:35
C#って言語仕様としてアスペクト指向をサポートしてますか?
そのあたりを解説したサイトがあれば教えてください。
780デフォルトの名無しさん:04/07/22 20:28
theSpoke効果
DirectXのプロジェクトが「アセンブリが見つからん」と言われて作成できない。
解決策を教えてくれ
>>781
C#板のみ入れた?
>>782
いや、、VisualStudioのセットで入っていてそのままSDKをインストールしたのだが、、

え、もしかして、単体じゃないと駄目なのか?だとしても何か解決方法があるんでしょ?
>>783
C#版だと問題で、全部入りは問題なかったはずだが。

Managed DirectX vol.2
http://pc5.2ch.net/test/read.cgi/tech/1061285378/
の前スレで
VC#.NET 2003 Standardを購入してインストールしたのですが、
試しにビルドした空のアプリ(画面・コマンドラインとも)を
デバッグ実行すると、戻ってこなくなります。
DirectX 9.0 SDKのC#サンプルも同様に戻ってこなくなります。

.NET FrameWorkの問題でしょうか?
環境はAthronXP、Windows2000Professional、
常駐APはNortonの防火壁とアンチウィルスです。
戻ってこないってのはどういうことを言っているのかね。
787785:04/07/23 10:29
当該プログラムのプロセスだけが残った状態になります。
C#開発環境はプロセスが反応を返さないのでフリーズします。
DirectXのサンプルブラウザはフリーズはしませんが。
>>781
そういうのは、まずオブジェクトブラウザを見直す。
WinXP ProにVS入れて使ってたとき、
>785に似た現象が出たことある。Norton IS & Antivirusも入れてた。

・F5(開始)でビルドするとVSがフリーズする。
・でもアプリのプロセスは存在する。
・EXE自体は正常にできてる。

VSを強制終了させてexeを直接起動すると
それは問題なく動いたんだよね。

F5(開始)でやるんじゃなくて、
メインメニュー → ビルド → HOGEのビルド
からビルドしてexeを直接起動することで対処してたけど、
いい加減面倒なのでOSごと再インストールしたら直った。

全く同じコードがF5(開始)でビルド&起動できたね。

移行した環境がWin2003Ent + Norton IS + AVGと全然違うし、
他で再現性を試したわけじゃないから
この現象が環境依存なのかどうかはハッキリ言えないけど。
790785:04/07/24 02:07
>>788
オブジェクトブラウザ以前に、
インストール>とりあえず空のプロジェクトを作る>デバッグ実行>フリーズなもので…。

>>789
どうも環境依存ぽいです。
C#のアンインストーラもスクリプトを設定中に止まってしまうので
アンインストールもできない…。
状況としては同じで、EXEファイルはできてるんですよね。
>>785
ひょっとしてNIS/NAVにてVSが必要とするスクリプトを弾いてしまってませんかね。
NISとNAVを止めておいて実行したらどうなりましょう?
792785:04/07/24 12:12
>>786,788,789,791

ご協力ありがとう御座いました。
一先ず解決しました。
.NETインストール時に追加したIISが原因だったようで、アンインストールしたら正常化しました。
とりあえずウェブサービスを利用する予定はないので、これで良しとします。
つい昨日の事だけど、俺の開発マシン、ノートン先生が devenv.exe を
違法なスクリプトとして排除してました。
ソリューションの新規作成が出けんつーの!
ノートンをぬっころせ
795デフォルトの名無しさん:04/07/24 17:03
C++なんかでプログラムを作るときは大抵、main関数で変数を宣言して、
関数の引数に値やポインタを渡すと思うのですが、
C#では classのなかでグローバル(?)に宣言して 使うのと、
Mainの関数で宣言して渡すのとどちらが よろしいとされていますか?
case by case
グローバルにする「必要」がなければローカル。
ってかmainから関数に渡す引数を何でグローバルにする必要がある?
# 本当に必要のある変数は別よ、>>795はそういう意味では言ってないと思うので。
798デフォルトの名無しさん:04/07/24 22:39
自分自身のインスタンスを参照する場合は this を
使えば良いですけど、自分自身のクラスをこのように
具体的な名前を書かずに指定することはできないん
でしょうかね。

これができると、singletonの実装とかタイプセーフ
enumとかの実装などなどで使いたいんだけど。

インスタンスと違って特定できるんだから名前を
そのまま書けばいいじゃないってのは言う人が
いるだろうけど、ある意味便利だと思われ。

799798:04/07/24 22:40
補足すると、自分自身のクラスと同じ型の戻り値を
返すときなどで、一般的な書き方が出来て可読性が
多少良くなるかなというイメージです。
確かにね、欲しいと思う事はよくある。
下手に言語仕様を膨らませないためだとは思うんだけどね…
ま、俺の場合は自分自身の型を返す場合と言うよりは、
他のクラスでも同様の記述を行う場合があるようなときかな。
リフレクションじゃだめなの?
全く代用にならん。
もちろん場合によっては使えない事もないけど。
>>803
どうしてリフレクションじゃダメなんだ?
代用にならない例を教えてくれ。
>>804
例を見れば分かるけど、求められているのはコンパイル時に解決しうる静的なもの。
よりスマートなコードを作りたいわけだ。

で、リフレクションはもともと動的にあれこれするものだし。

//そんなに出番のない余計な実装(言語の無闇な複雑化)という感じはする。
class foo : IClonable {
:
public foo Clone () { ... }
public object IClonable.Clone () { return this.Clone () ; }
:
}

みたいな奴を書くとき、

public thisclass Clone () {...}

とか書けると、class 名を書き換えたりしたときにちょっとだけラクできる…って事なのかしらん…

# STL とかは typedef で逃げてるかな
クラス名なんて変えないし
808デフォルトの名無しさん:04/07/26 01:50
フォームから別のフォームを開いた場合、最初のフォームを閉じると、呼び出された新フォームも閉じますよね。
最初のフォームを閉じた際に、開いた新フォームをメインフォームとして使うにはどうしたらいいんでしょうか?
ApplicationCOntextを引数にとるApplication.Runを使って開始。
メインフォームを変える際にApplicationContextのプロパティを変更。
810808:04/07/26 02:41
>>809
できました。ありがとうございます。
そういう時に、
Form1 firstForm = new Form1();
firstForm.ShowDialog();
Form2 mainForm = new Form2();
Application.Run(mainForm)

とやる俺はヘタレですか?
書いててふと思ったのですが

  // 読み取り中
  intdata;
  while (-1 != (data = readStream.ReadByte()))
  {
    writeStream.WriteByte((byte)data);
  }

これ遅いですか?
ループ内でキャストしない方法を考えて見ると良いかも。
814812:04/07/26 12:25
原因はキャストか
MSIL だとチェックが入ってたような気がするけど、それが遅いのかな?

回避策……「BinaryReader で ReadByte、末尾は例外待ち」しか考え付かない

バイナリじゃなかったら StreamWriter.ReadToEnd とか使えるけど (確かそっちの方が速かった)
流されるデータがバイナリの場合があるので、Stream じゃないと変な変換入りそうで
こうするんだよ。
const int buffer_size = 1024*1024; // 1Mバイト
byte [] buffer = new byte [buffer_size];
int got;
do {
 got = iStream.Read(buffer, 0, buffer_size);
 oStream.Write(buffer, 0, got);
} while (got != 0);
>>815
ごめん、最後まで Stream.Write の 3 番目の引数に気づかなかった
普段 Stream なんて使わないから_| ̄|○
817デフォルトの名無しさん:04/07/26 23:52
1Mものバッファを使わないでくれ…
ちなみに2〜8Kくらいが速度的にベストなバッファサイズ。
大きすぎると逆に遅くなる。
819 ◆FLAlLDIW4w :04/07/27 00:35
> 一行で素敵な人生を送れます。
>
> MyLife.Idle += new EventHandler(TieUpLooseEnds);
>>818
C# だとそうなんだ。
C++ で大きい(数M〜2G程度)ファイルのコピーのときにはハードディスクの
内部バッファ(512K程度が多い?)あたりを指定するのが一番速かったけど。
メニューに CTRL-ALT-A のような、Ctrl キーと ALT キーを同時に押すことを
あらわすショートカットキーを指定するにはどうすればよいのでしょうか?

System.Windows.Forms.Shortcut 列挙体に定義がない。ということは WinForm アプリでは
Ctrl-Alt-A とかいうショートカットキーは定義できない?
Alt 単独の場合も数字(ALT-0 から ALT-9 まで)しかなく ALT-X とかを定義できないようなのですが..

C# というか WinForm の話なので、スレ違いならご指摘ください。
>>821
Altを含む、またはF10を含むキーの場合(はShortcutでいいか)、
ProcessCmdKeyをオーバーライドしてWM_SYSKEYDOWNを受け取ったときに動作を実装。
メニュー項目には\tの後にショートカット文字を手書き。
>>822
Alt-X は自分で実装ということですね。
Ctrl-Alt は SYSKEYDOWN にならないので、そちらは WM_KEYDOWN を使う。と。

なんでこんな中途半端なんだろう。

で、ctrl-alt はヨーロッパではアクセント付文字の入力にも使うので、RigthAlt と
Ctrl-LeftALt を別処理しなきゃいけないのだが、このへんの情報をもしお持ちなら..

Win32/MFC だとアクセラレータがこの処理をやってくれるんだけど、WinForm のメッセージ
ポンプに TranslateAccelarator を押し込むことってできましたっけ?
>>823
そっち方面には全く詳しくないので何とも言えないけど、
.NET Frameworkと簡単なP/Invokeで済ますなら
メッセージ/イベントを捕まえたときにGetKeyState関数でチェックするとか?
825デフォルトの名無しさん:04/07/27 15:51
C# + .NET Framework で作成するアプリケーションで作成する
アプリケーションで,そのアプリケーションを
タスクマネージャや,その他のランチャソフトから終了しようと
した場合に,それを感知する事はできますか?

自分のアプリケーションの中からの終了の時の処理と
外から終了させられる時の処理を変更させたいのですが….
for(int i=0; i< array.Length; i++) array[i] = i;
みたいなことをforeachで書き換えられますか?
Formの上にPanelを上下に2つおいてSplitterでサイズ変更
できるようにしたいんだけどうまくいかない・・・
上のPanelのDockをFillにしたいんだけど、どうすればいい?
>>827
そんなあなたにSplitContainer。

てのはおいといて、何がどううまくいかないのかさっぱり分からないのだけれど?
>>828
サイズ変更が出来ない。
DockがFillでサイズ変更・・・?
>>830
>  DockがFillでサイズ変更・・・?
それは問題ない。

>>829
その説明でどう理解しろと言うのだろう……?
とりあえずまっとうに動くサンプルコード。
Splitterの大抵の問題はControlにAddする順番か。
下のコードもAddRangeの配列の順番を変えると……。

public class Hoge : Form {
   public static void Main() {Application.Run(new Hoge());}
   public Hoge() {
      Panel p = new Panel();
      Panel q = new Panel();
      Splitter s = new Splitter();
      p.BackgroundImage = Image.FromFile("a.bmp");
      q.BackgroundImage = Image.FromFile("b.bmp");
      p.Dock = DockStyle.Fill;
      q.Dock = DockStyle.Top;
      s.Dock = DockStyle.Top;
      s.BorderStyle = BorderStyle.Fixed3D;
      Controls.AddRange(new Control[]{s, q, p});
   }
}
あー、DockStyleはご要望だとBottomになるか。
>>827
1. Panelを下に配置。DockをBottom
2. Splitterを配置。 DockをBottom
3. Panelを上に配置。DockをFill

順番が肝心。後でもできるがややこしくなったりしてしまう。
>>831-833
うまく動きますた。サンクス!
835 ◆FLAlLDIW4w :04/07/27 21:50
コントロールの位置関係は、Controlsの末尾から先頭に向かって順番に描画される
イメージさえ持っておけば全てが分かる。

領域が重なったコントロール同士は、
より先頭に近いほうがより手前に見える。

同じDockプロパティを持つコントロール同士は、
より末尾に近いほうがより外側に配置される。

DockStyle.Fillスタイルを持つコントロールより先頭側には、
DockStyle.None以外のスタイルを持つコントロールを置いてはいけない。
836デフォルトの名無しさん:04/07/27 22:09
自らのインスタンスをコピーする機能を実装する場合に
ICloneableインターフェイスをもつ形で明示的にclone()
を実装すると戻り値の型がObject型になり、使用する側で
キャストをかける必要があったりするわけだけど、なんか
他に良い方法は無いんでしょうかね。

VBなら別名としてICloneableのclone()をもちつつ、これを
別のclone()メソッドから呼ぶ方法があるみたいだけど、
C#でスマートな方法が無いものでしょうかね。
>>836
えーと、明示的なインターフェースの実装っていうと
public class A : ICloneable {
   object ICloneable.Clone() {...}
   public A Clone() {...}
}
みたいのを指すと思うんだけどそういうことじゃないの?
838デフォルトの名無しさん:04/07/27 22:27
普通にCloneメソッドも書けばいいだけ。
C#の明示実装はクラスのパブリックなインターフェイスからは消えるから、
名前を変えたりする必要なし。
StringCollectionなんかは最大限に使ってるね。
IListやらの返値・パラメータがobjectのを全部stringにしたメソッド・インデクサ。
840836:04/07/27 23:25
>>837,838
明示実装すれば同名のメソッドが共存できるのを
すっかり見落としていました。

どうもありがd
>>835
>>831のソースと思いっきり矛盾しているように見えるんだが。
>>841
どこが?
Controls.AddRange(new Control[]{s, q, p});
DockがFillのpを最後に置いてるから矛盾はしてないと思うが
> DockStyle.Fillスタイルを持つコントロールより先頭側には、
> DockStyle.None以外のスタイルを持つコントロールを置いてはいけない。



> DockがFillのpを最後に置いてるから矛盾はしてないと思うが

は明らかに矛盾しているように見えるんだが。
試してないんだが>>831のコードは本当に期待した通りに動くのか?
844843:04/07/28 00:31
ごめん勘違いスマソ逝ってきます
画面のプロパティで、画面のデザインのフォントをデフォルトのやつから変えているのですが、
作ったアプリケーションの中にあるTreeViewやListviewのフォントは
ちゃんとそのフォントで表示されるのですが、
途中で出すダイアログの中にあるラベルやComboBoxの文字だけは
デフォルト?のフォントのままで指定したフォントになりません。

指定したフォントにするには、どうすればよいのでしょうか?
>>845
ComboBox.Fontプロパティは?
>>846
ComboBoxを直接フォームに貼り付けたときは、
ちゃんと指定したフォントになるのですが、
ダイアログとか、ツールバーに乗せたComboBoxではだめなのです。

何かの設定をすると、いちいち全てのFontプロパティを設定しなくても、
指定したフォントになるんじゃないかと思うんですが・・・
848821:04/07/28 02:53
>>824
ご協力ありがとうございました。
そのあと調べましたが、MS としてはショートカットキーの組み合わせを絞る方針みたい。
ctrl-alt が Right-ALT にぶつかる問題が大きいのと、Ctrl や ALt とかが特定の
キーボード実装を前提にしているから。らしい。Java はどうやっているんだっけ。

こんなところ「だけ」抽象化されてもなぁ。
折角 TranslateAccelarator の内部で処理しているんだから、その機構を公開して
もらわないと。

VS, Office など MS 製品も ctrl-alt の組み合わせは多用しているのだが、MFC から
.NET に移行する際にどのように変更するのだろうか。
849821:04/07/28 02:57
>>824 に追伸
>メッセージ/イベントを捕まえたときにGetKeyState関数でチェックするとか?

それだけでは判断できないんです。
現在のキーレイアウトが Right-ALT をサポートしているかどうかの情報を
入手しないと判定できない。
公開 API には存在せず、TranslateAccelarator の内部で処理している。
あのー >>825 はスルーなんでしょうか?
851デフォルトの名無しさん:04/07/28 06:17
Processとかで外部アプリ起動させたりする場合、ファイルパスとかに全角の特殊記号(【】)とかが入ってる場合に
エラーとか出ませんか?俺は出てるんですが、これはどうすれば回避できるんでしょうか?
852851:04/07/28 06:29
ちがった。特殊記号じゃなくて、空白スペースでした。
「"」で囲めば?
>>851
そんなことは全くないが。

そもそもなんてエラーなのさ。
どんなコードなのさ。
>>850
「自分のアプリケーションの中からの終了処理」って自分で書いてるんだから、
その場合だけフラグでも立ててやればいいんじゃない?

具体的には、「閉じる」「終了」等のメニューやボタンで自分で終了するとき、
および WndProc で WM_SYSCOMMAND 捕まえて SC_CLOSE で閉じられるとき、
とか。
856デフォルトの名無しさん:04/07/28 12:11
if ($hoge =~ /[^a-zA-Z0-9.]/)
# Perlで「hogeにa-zA-Z0-9.以外の文字が含まれていたら」の意味

これをC#で書くにはどうしたらいいですか?
正規表現クラスを見ても複雑すぎてよく分からない。
if (Regex.IsMatch(hoge, "[^a-zA-Z0-9.]"))

言うほど複雑でもないけどね。
RegexIsMatchに該当するページが見つかりませんでした。
"regexismatch"を含むページは見つかりませんでした。

検索のヒント
- キーワードに誤字・脱字がないか確かめてください。
- 違うキーワードを使ってみてください。
- より一般的な言葉を使ってみてください。
859デフォルトの名無しさん:04/07/28 12:25
モーダルダイアログを表示し、textBoxになにかを入力させて、OKを押すと閉じるように成っています。
OKボタンを押した時に、textBoxの内容が正しいかどうかを検証する処理を入れました。
でも、OKボタンには DialogResultが設定されているので、
OKボタンのClickされたときの関数を通ると、フォームが閉じられてしまいます。
エラーのあるときは、フォームを閉じないようにするにはどうしたらいいんですか?
>>858 「.」が抜けているぞ。
>>858
○ Regex.IsMatch
× RegexIsMatch
目が悪くて文字が読みにくいなら、コピペしたほうがいいよ。
>>858
>  RegexIsMatchに該当するページが見つかりませんでした。
いつのまにC#は素性の知れない関数を扱えるようになったんだ?
ttp://www.google.co.jp/search?num=100&lr=lang_ja&oe=utf8&ie=shift_jis&q=Regex.IsMatch

>>859
正しくなかったときはDialogResultを設定しなけりゃ良いんじゃ?
859
DialogResult を None にしておいて、
Click のハンドラでエラーが無いときだけ this.DialogResult = DialogResult.OK; とでもしてみては?