1 :
名無しさん♯ :
2005/04/08(金) 22:50:09 BE:177748676-
2 :
名無しさん♯ :2005/04/08(金) 22:51:49 BE:63481853-
3 :
名無しさん♯ :2005/04/08(金) 22:52:49 BE:126963656-
4
5 :
デフォルトの名無しさん :2005/04/09(土) 14:54:30
C#で作ったコントロールをWebブラウザの中に表示したいのですが(デブロイメントの別ウインドウ表示だとちょっと使い勝手が悪いので)、 どのあたりにノウハウがあるか情報収集先を教えていただけませんでしょうか? Webサイトをいろいろ見た感じですと、ActiveXを使うとブラウザ内の表示できて、C#で作ったコントロールはActiveXにできそうな雰囲気がしています。 あと、ActiveXの初歩の初歩を勉強できるサイトとかあったら紹介してもらえると助かります。
ActiveX にしてもいいけど、ノータッチデプロイメントでもブラウザ内での表示は可能なはず。 <object classid="Filename.dll#Namespace.ClassName"></object> みたいな。
>>7 なんと!!
有難うございます、これぞ求めていたもの。
実行ファイルでXPスタイル適応する、というのは調べたら分かったのですが、 ライブラリの場合はどうしたらいいんですか? 実際にはexplorerにのっける自作toolbarのdllを考えています。
10 :
9 :2005/04/10(日) 00:02:58
manifestを参照したらいけました。スレ汚しスマソ
11 :
デフォルトの名無しさん :2005/04/10(日) 02:02:21
COMコンポーネントをVC#で使おうとしています。 int hoge(string,int,out int); というメソッドの第三番目の引数には何を渡せばイイのでしょうか? (int []を渡すとNGでした) VC++用ドキュメントではint *を渡すように書いてあります.
int a; hoge("hoge", 0, out a);
13 :
11 :2005/04/10(日) 11:00:51
VC++用のドキュメントでは 第二番目の引数はバッファのサイズ 第三番目の引数はバッファへのポインタ でメソッドhogeがバッファへ書き込むとあります。
14 :
11 :2005/04/10(日) 11:54:44
interop アセンブリを使用して簡単に出来ました. スレ汚しスンマソン
15 :
デフォルトの名無しさん :2005/04/10(日) 12:32:32
axwebbrowser(COM)コントロールでBeforeNavigate2イベントでe.headers調べても
Content-Type: application/x-www-form-urlencodedくらいしか見当たらないのですが
そのサイトに関連したcookie情報しらべるにはどうすればいいでしょうか
http://dobon.net/vb/dotnet/internet/usecookie.html ここ参考にしましたが、サーバーからかえってくるset-cookie情報しか取得できていません
>>15 AxWebBrowserとリンク先とが今一繋がらないが、
あるホストに関するクッキーが手に入ればいいの?
ブラウジングとは関係なく?
17 :
デフォルトの名無しさん :2005/04/10(日) 15:40:56
普段は駐留していてマシンをシャットダウンしようとすると、 シャットダウンを一旦止めてある処理を行い、 処理が終わったらマシンをシャットダウンするアプリを作ろうとしているのですが、 良い方法がわかりません。 なにが知りませんか?
>>17 Microsoft.Win32.SystemEventsクラスのイベントを使う
System.Windows.Forms以下のライブラリを使用したいのですが、 どうやって移植できるでしょうか? FedoraCore3,Mono1.0.6(rpmVer.)です。
21 :
デフォルトの名無しさん :2005/04/10(日) 23:11:06
1000 名前:デフォルトの名無しさん :2005/04/10(日) 22:40:54 1000ならチンコうp
22 :
デフォルトの名無しさん :2005/04/10(日) 23:15:23
はぁ?
23 :
デフォルトの名無しさん :2005/04/11(月) 00:14:51
明らかにスレちがいなんですけど、いつもC#プログラマとしてこのスレでお世話になっているので質問させてください。 現在、C#をメインに稚拙ながらソフトウェアを作っております。 ただ、一部のソフトウェアを共有言語ではなくWin32アセンブリとして作成したいので、もう1つの言語を習得しようと思っています。 つまり、セットアッププログラムなどの.netFrameworkに依存しないソフトウェアを作るためです。 やはりもっとも有力なのはC,C++なのですが、Delphi(Pascal)やrubyも検討しています。 C#やJavaは仮想マシンに依存しますし、VBはちょっと抵抗があります。 CやC++でしたらWindowsでそのまま動くソフトウェアを作れることはわかっているのですが、 DelphiやRubyなどはCなどと同様に仮想マシンなどに依存しないソフトウェアの開発はできるのでしょうか? また、Java&C#プログラマが乗り換えるとしたらC++、Delphi、Rubyのどれが良いでしょうか? 長文大変失礼します。
前略 そんなあなたにVBをお勧(後略
>>23 ランタイムやインタプリなしで動かすなら、DelphiかC/C++しかないんじゃね?
26 :
デフォルトの名無しさん :2005/04/11(月) 01:43:00
けど、C/C++にしたって完全にプラットホームに依存しなくて、商用に耐えうる アプリケーションを書くにはそうとう難しいぞ
27 :
23 :2005/04/11(月) 01:46:35
やっぱ商用アプリはDelphiですかねぇ? 早速、StandardをDLしてきまして使っています。 最初はHelloWorldすら苦労しました・・・ あれですねC#を見慣れた目には見づらいソースですw だけど手持ちの旧型マシンに移して実行してもふつうに動いているのは感激モノです。 う~ん、ずいぶん違う言語ですしねぇ・・・ C#ライクの言語はないものか(泣
28 :
デフォルトの名無しさん :2005/04/11(月) 02:10:51
C#ができるならオブジェクト指向言語はどれも簡単にできるでしょ? 漏れはC++屋だけど、JAVA、C#、Delphiくらい余裕ですよ
C#からC++は混乱するような気がしないでもない。 逆は楽かもしらんが。
>>29 おりもそう思う
Javaについてはデッドコピー疑惑になりそうなので混乱内と思う
慣れないうちはメモリ管理で混乱するだろうな。
メモリー管理というかプログラムスタイルがね・・・ C++って結構独自進化してるじゃん
33 :
23 :2005/04/11(月) 07:58:02
確かにC++は強力ですけどずいぶんと面倒ですよね、 仕方がないことなのですが、結構抵抗があります。 Pascalってずいぶん変わった言語だけどCよりも古いですし(少しだけ)期待しています。 Linuxへの移植も簡単ですしね。 いずれにしろ、C#単体では少し使いづらいのでDelphiかC++あたりをさわってみようと思います。
>>33 が本当にプログラマだとは俺には思えんのだが
セットアッププログラムってインストーラーのことかな? なら、C#のみでOKだけど。
36 :
デフォルトの名無しさん :2005/04/11(月) 17:55:34
値を確認しようと↓とやったんだけど、 Console.WriteLine( xmlReader.LocalName ); Console.WriteLine( xmlReader.Value ); やるたびに先にnodeが先にすすんじゃうんだけど、そういうもんなん? 下の場合だとnodeを進ませずに Console.WriteLine( xmlReader.LocalName ); Console.WriteLine( xmlReader.Value ); が全部同じ値になるようにするにはどうしたらいい??? XmlTextReader xmlReader = new XmlTextReader( xmlFileName); while( xmlReader.Read() ) { if( xmlReader.NodeType == XmlNodeType.Element ) { if( xmlReader.HasAttributes ) { Console.WriteLine( xmlReader.LocalName ); ←これやるたびに進む Console.WriteLine( xmlReader.Value ); ← Console.WriteLine( xmlReader.LocalName ); ←これやるたびに進む Console.WriteLine( xmlReader.Value ); ← Console.WriteLine( xmlReader.LocalName ); ←これやるたびに進む Console.WriteLine( xmlReader.Value ); ← } } }
>>36 いや進まないな。
3つずつ同じのが返ってきた。
//XmlNodeType.ElementのValueは必ず空文字だから意味ないんじゃ?
38 :
36 :2005/04/11(月) 18:36:28
補足っす、
Console.WriteLine( xmlReader.LocalName ); ←これやるたびに進む
Console.WriteLine( xmlReader.Value ); ←
Console.WriteLine( xmlReader.LocalName ); ←これやるたびに進む
Console.WriteLine( xmlReader.Value ); ←
Console.WriteLine( xmlReader.LocalName ); ←これやるたびに進む
Console.WriteLine( xmlReader.Value ); ←
int nnn = 0; ←ここにブレイク張って
マウスのカーソルをxmlReader.LocalNameにあてると、
出力されてるものよりも一個すすんだのがもどってきまつ。。。
さらに、ウォッチウィンドウにxmlReader.LocalNameをいれるだけで進みます。。。
これC#のバグなきがしてきた。。。
>>37 MoveToFirstAttribute()やるとちゃんとValueに値がいるからだいじょび!
>>38 > MoveToFirstAttribute()やるとちゃんとValueに値がいるからだいじょび!
って、実は
> Console.WriteLine( xmlReader.LocalName ); ←これやるたびに進む
> Console.WriteLine( xmlReader.Value ); ←
の間に入れてるとか言うオチじゃないだろな?
まさか、、MoveToFirstAttribute()ぬいてもすすんじゃうし、 ウォッチウィンドウにいれるだけですすむからなやんでるのですばい;;
読んでるファイル見せて-
進むってのも微妙だ。 実際にどんな結果が出るのかも書いてくれないか。
C#のバグと言ってしまうあたり駄目臭がプンプン。
ウォッチのどれかで進めちゃってるんじゃないのん?
45 :
デフォルトの名無しさん :2005/04/11(月) 23:53:56
WindowsXPってデフォで.NETアプリ動くのかしらん?
デフォで動くのはServer2003から
47 :
デフォルトの名無しさん :2005/04/12(火) 00:04:41
w160*h120サイズのImageListに様々なアスペクト比の画像を アスペクト比を保ったまま読み込みたいんですが、なにか簡便な 方法はありませんか? そのまま読み込むと4:3以外の画像は変にストレッチされてしまい うまい方法が思いつかないんですが。。
48 :
デフォルトの名無しさん :2005/04/12(火) 00:09:50
d = new ThreadMethodDelegate(send_data); d.BeginInvoke(str,null,null); というしょりをループさしているのですが、 send_dataは時間がかかるため、 10個以上のスレッドが同時に送信を開始してしまいます。 d.BeginInvokeする前にsend_dataがいくつ走っているかを調べるには どうしたらいいですか? send_dataのはじめに counterをインクリメントして、最期にデクリメントするしかないでしょうか?
C#を始めて一番驚いたことは.NET環境が意外と普及していないってこと。
俺は意外と普及してると思ったが
同じく。 結構C#とかVB.NETの案件増えてる C#使う必要ないだろ!っていうのも多々あるが。
( ´,_ゝ`)プッ
53 :
デフォルトの名無しさん :2005/04/12(火) 01:17:12
C#で作成されたアプリを使ってもらう際に何をインストールすればいいのかしん? .NET Frameworkなんてそっけない回答はやめてねん
他に何を入れろと。
55 :
23 :2005/04/12(火) 01:18:49
同上
何とかして困りごとを作りたいみたいだが インストールっつーてもWindowsUpdateなんだから説明も簡単だし、困ったことなんてないよ
58 :
36 :2005/04/12(火) 12:05:31
うーん、やっぱり理解不能なのでおせーてくだされ~! もしかしてそういうもんなのかもしれんしー while( xmlReader.Read() ) ←ここにブレイクをはってF10で進んでみて { if( xmlReader.NodeType == XmlNodeType.Element ) { Console.WriteLine( xmlReader.LocalName ); //Console.WriteLine( xmlReader.Value ); Console.WriteLine( xmlReader.LocalName ); //Console.WriteLine( xmlReader.Value ); Console.WriteLine( xmlReader.LocalName ); //Console.WriteLine( xmlReader.Value ); } } xmlReader.Close(); で上記のとこでブレイクはってF10でステップオーバーで進んでいくと 値がおかしい~ブレイクはらないと正しい値がでます。 出力は noteList note OpeExpr ってでる~
59 :
36 :2005/04/12(火) 12:06:04
んで、よませたxmlはこれ <sir version="2.0"> <Comp name="mydata" id="1" file="mydata.sc" line="0"> <noteList> <note key="accesskey"> <OpeExpr id="9" ope="LIST"> <exprPtrList> <Datastring id="10" string="Main"/> <Dataint id="11" int="0"/> <OpeExpr id="171" ope="LIST"> <exprPtrList> <Datastring id="12" string="CGI"/> <Dataint id="13" int="4"/> </exprPtrList> </OpeExpr> </exprPtrList> </OpeExpr> </note> </noteList> </Comp> </sir>
もしかしてウォッチに、ReadString()とかってはいってないか?w
C#を勉強中疑問に思ったんですが、 MSDNだとArrayListの要素全てを書き出すときに、 IEnumratorオブジェクトを下のように使っているんですが、 System.Collections.IEnumerator myEnumerator = myList.GetEnumerator(); while ( myEnumerator.MoveNext() ) Console.Write( "\t{0}", myEnumerator.Current ); for文つかってこんな感じで書くのは作法的によろしくないのですか? for(int i= 0;i<myArray.Count;i++) Console.Write("\t{0}",myArray[i]);
エレガントじゃない。 GetEnumeratorを自分で呼ぶのも。 foreachを使うのが基本。 でもforeachじゃ対応できないループも多いけどね。
64 :
62 :2005/04/12(火) 18:15:26
ではこんな風に書くのが一番いいんですね? ありがとうございました。 foreach(Object o in numArray) Console.Write("\t{0}",o.ToString());
65 :
デフォルトの名無しさん :2005/04/12(火) 18:40:16
string pathで与えられたpathがフォルダなのかファイルなのか スマートに判別するにはどうしたらいいですか? DirectoryInfoにしてExists調べるとするとファイルのときに例外が発生してしまうので… 最終的にはフォルダならその中の全ファイルをリストアップする予定です。
Directory.Exists/File.Existsメソッドとか。
Existsで例外投げられるか?
68 :
64 :2005/04/12(火) 19:35:19
>>66 さん
その方法でいけそうです。
DirectoryInfoにしなくても調べる方法があったんですね。
ありがとうございます。
>>67 さん
DirectoryInfo di = new DirectoryInfo(str);
でstrがファイルの時例外投げられます。
s-jisのTextファイルを1行ずつ読み込みたいのですが、 File.OpenTextはutf-8でしか使えないようで困っています。 File.OpenReadつかってバイナリ形式として読むしかないのでしょうか?
s-jisのTextファイルを1行ずつ読み込みたいのですが、 File.OpenTextはutf-8でしか使えないようで困っています。 File.OpenReadつかってバイナリ形式として読むしかないのでしょうか?
素直にStreamReaderのコンストラクタ使え。
StreamReaderのコンストラクタつかうんですね。 ちょっとMSDNよんできます。 ありがとうございました。
抽象イベントを発生させるメソッドを書いたところ、 コンパイルエラーが出てしまいます。 原因のわかる方、ご教授ください。 ちなみに、C#Builder使ってます。System.dllのバージョンは1.0.5000.0 コードはこんな感じです。 protected override void raise_Lost(object sender, System.EventArgs e) { if(this.Lost != null) ←この行と { this.Lost(sender, e);} ←この行 } public abstract event System.EventHandler Lost; エラーメッセージはこんな感じ。 error CS0079: イベント 'DXComponents.DXFont.Lost' は += または -= の左側にのみ表示されます。 試しに書いてみた下のコードは、コンパイル通りました。 protected void OnTest(object sender , System.EventArgs e) { if(this.Test != null) { this.Test(sender, e);} } public event System.EventHandler Test;
>>74 Buttonの派生クラスを書くときにさ、自分でthis.Click(this, EventArgs.Empty);とか呼んだりしないよね?
基底クラスのPerformClickメソッドとかあるよね?
>>74 上の例と下の例が微妙に違ってて参考にならん。
あと、何行目でコンパイルエラーになってるのか示してくれ。
77 :
デフォルトの名無しさん :2005/04/12(火) 23:44:19
contextmenu内に子メニューを2階層ほどつくりました。(親→子→子) しかしどのmenuitem をクリックしても一回目では 一番上の親メニューが消えません。二回目のクリックでやっと全部消えます。 一回で消えるようにするにはどうしたらよいでしょうか?
>>77 状況が掴めない。
どういうコードを書いたのかと併せてもう一度。
79 :
77 :2005/04/13(水) 00:05:14
単純化すると フォームの中にbuttonが有りまして button.ContextMenu = contextmenu1; contextmenu1.MenuItems.AddRange(new MenuItem[] { menuitem1, menuitem2} ); (親) menuitem1.Index = 0; menuitem1.MenuItems.AddRange(new System.Windows.Forms.MenuItem[] {menuitem3, menuitem4}); menuitem2.Index = 1; menuitem2.MenuItems.AddRange(new System.Windows.Forms.MenuItem[] {menuitem5, menuitem6}); (子) menuitem3.Index = 0; menuitem3.MenuItems.AddRange(new System.Windows.Forms.MenuItem[] {menuitem7, menuitem8}); menuitem4.Index = 1; menuitem4.MenuItems.AddRange(new System.Windows.Forms.MenuItem[] {menuitem9, menuitem10}); menuitem5~6も同じように子(12~14)を作る (孫) menuitem7.Index = 0; menuitem7.Text = "うんちゃら"; menuitem7.Click += new EventHandler(this.menuitem_Click); んでmenuitem8~menuitem14も同じ 何か変なことしてるでしょうか? それぞれの最下層のメニューアイテムはきちんと動作してます。 フォーカスをよそに移しても駄目でした。よろしくお願いします。
80 :
デフォルトの名無しさん :2005/04/13(水) 00:16:05
ドラッグされたファイルが画像がファイルかどうか判別する方法教えてください。 拡張子を見て =="jpeg"だとjpgとかJpeg jPegとかはじかれるし、 bmpとかgifも含めて対応しようとすると面倒臭すぎるので… Bitmap bmp = new Bitmap(ドラッグされたファイル) にして読めたら画像とかしかないんでしょうか?
81 :
74 :2005/04/13(水) 00:16:28
C#言語の仕様をよく読んだら書いてありました。 「イベントをフィールドのように使用するには、イベントがabstractまたはexternではないこと」(C#言語の仕様 10.7.1 より) なんてこった… それでもめげずに、10.7.2を呼んで書いてみたコードがこれ。 protected System.EventHandler GetTestEventHandler() {return this.Test;} protected void OnTest(object sender , System.EventArgs e) { System.EventHandler handler = this.GetTestEventHandler(); if(handler != null) { handler(sender, e);} } public event System.EventHandler Test; コンパイルは見事通りました。 が、ここまでして抽象イベントにこだわるべきか、大いに疑問です。
>>71 こんな感じでどぞ
System.IO.StreamReader sr = System.IO.File.OpenText( "ファイル名.txt" ) ;
↓
System.IO.StreamReader sr = new System.IO.StreamReader( "ファイル名.txt" , System.Text.Encoding.GetEncoding( "Shift-JIS" ) ) ;
>>80 あとはヘッダを頑張って解析するとか。
>>81 だからさ、基底クラスにイベントを実行するprotectedメソッドを作って、
派生クラスからはそれを呼ぶの。
>>82 .NETだと通るようだけど、Shift_JISはハイフンじゃなくてアンダースコアね。一応。
>>81 へぇー、参考になります、ケッタイな仕様ですね。
>>46 そのおかげで2003だけサービスパックが別なんだよね。
ちょっと微妙だと思った。
>>83 すみません。
>>81 のコード、抽象イベントになってない。
抽象イベントにしたら、やっぱり通りませんでした。
>基底クラスで~
もちろん、そうしてます。
その、「基底クラスのprotectedメソッド内で、イベントを実行する」
というのが、出来ないわけです。
public abstract class TestClass{
protected void OnTest(object sender , System.EventArgs e){
if(this.Test != null) ←この行と
{ this.Test(sender, e);} ←この行がエラー。
}
public abstract event System.EventHandler Test;
}
public class ChildClass : TestClass{
public void CallTestEvent(){
System.EventArgs e = new System.EventArgs();
this.OnTest(this, e);
}
private System.EventHandler m_Test;
public override event System.EventHandler Test{
add{ this.m_Test += value;}
remove{ this.m_Test -= value;}
}
}
>>86 今手元にコンパイラがないので実験できないのだけれど、もし
add remove 等を add ; remove ; とかやって中身を定義しないで置いたらどうなるのかちょっと興味。
ううん、イベントをabstractにする必然性がイマイチ。
virtualで事足りるような気がしてならない。
>>87 add または remove アクセサは本体を必要です。
interface にしたら避けられるかなと思ったけど、これもアウトだね。
90 :
77 :2005/04/13(水) 01:35:50
>>79 すんません、原因がわかりました。
button.ContextMenu = contextmenu1;
としておきながら
button.MouseUp += new MouseEventHandler(button_MouseUp);
→んでbutton_MouseUpでbutton.ContextMenu.Show
なんてやってましたorz
C# 言語の仕様 10.7 イベント
読み込んで見ました、 event に対してのアクセサは += -= のみで() 演算子?
は、何も指定しないときのみ限定でコンパイラがコードを自働生成くれる例外なんだ
普段使っている常識的使い方が例外の方だったのか。
見事に知っているつもりだったです、うーむ深い、今日はeventのいい勉強になりますた。
>>74 のその他色々の人
ttp://www.codeproject.com/csharp/csRemoteEvents1.asp?print=true abstract eventのサンプルとしてはこんなのかなぁ。
抽象クラスからは+=, -=だけできるようにして実装は完全に派生クラス任せ。
抽象クラスはノータッチですか。インターフェイスと区別が付かないよこれじゃ。
>>91 なんか解釈が違うな。
eventはデリゲートフィールドの(一種の)プロパティだよ。
add/removeを使わないevent宣言は、privateなデリゲートのフィールドとpublicなadd_/remove_メソッドの宣言とほぼ等価。
宣言したクラス内では当然デリゲートインスタンスに対して自由に操作できる。実行だけじゃなくて代入(+=じゃない=)とかも。
宣言したクラスの外では公開されているadd_/remove_しかできない。
「イベント」にできる操作はデリゲートの追加と削除だけ。 「イベントハンドラを保持しているデリゲート」に対しては何でもできる。 eventで直接イベント(+フィールド)定義すると、 定義したクラス内からは「イベントハンドラを保持するデリゲート」として見え、 その他のクラスからは「イベント」としてしか見えない。 自分でフィールド(デリゲートメンバ)を定義して、add、removeを書いた場合は、 それぞれ別のメンバとして定義しているんだから、それぞれの意味でアクセスできる。 ・m_Testになら何でもできる(protectedにはする必要があるが)。 ・Testはイベント名なので「イベント」としてしか見えない。 あたりまえの話。 でも普通は、親のOnTestを呼ぶとかのつくりにするだろ。
まあほとんどの場合抽象イベントなんて不要と思うが。
95 :
74 :2005/04/13(水) 10:28:44
>>92 サンプル、助かりました。
確かに、抽象イベントを呼び出すメソッドがないですね。
>>93 詳しい解説、ありがとうございます。
こんな感じなら出来るってことでしょうか。
親クラス{
protected abstract void OnTest(object sender, System.EventArgs e);
protected abstract event System.Eventhandler Test;
}
子クラス{
private event System.EventHandler m_Test;
protected override void OnTest(object sender, System.EventArgs e)
{m_Testに対してNullチェック+呼び出し}
protected override event System.EventHandler Test
{m_Testへのアクセサを定義}
}
>>93 で紹介してもらったサンプルもそうですが、
インターフェースと同じような感じになってしまった…
>>94 そのとおりかもしれません。
もう一度、抽象イベントにする必要があるかどうか、よく検討してみます。
一応、GDNJapanの掲示板(アドバンスド.NET)にも質問
してみました。
興味がある方は、覗いてみてください。
CLRについての質問なんですが、 デバッガ実装のためのデバッガプロトコル仕様は公開されていますか? Javaで言うとJava Debug Wire Protocolに相当するような仕様です。
>>96 まず、Java Debug Wire Protocolというのを説明してくれ、質問はそれからだ。
>>80 正規表現を使ってみた。
using System.Text.RegularExpressions;
bool isImageFile(string extension)
{
string pattern = @"^\.(jpe?g|bmp|gif)$";
//IgnoreCase オプションは大文字・小文字を区別しない
Regex reg = new Regex(pattern, RegexOptions.IgnoreCase);
Match m = reg.Match(extension);
if (m.Success) return true;
else return false;
}
ファイル名でもパスでも拡張子でも 何でも食べてくれるようにすると更によい。
>>98 98ではないが…
static readonly Regex regex = new Regex(@"\.(jpg|jpeg|bmp|gif|png)$",
RegexOptions.IgnoreCase | RegexOptions.Compiled);
bool IsImageFile(string path) {
return regex.IsMatch(path);
}
拡張子部分は適当にしてくれ
>>96 .NET SDKのTool Developers Guide\docsフォルダにDebugRef.docという中途半端なドキュが入ってる。
102 :
96 :2005/04/14(木) 21:08:58
>>101 こんな身近な所に求めていた資料があったとは気づきませんでした。
ども、ありがとうございます。
103 :
デフォルトの名無しさん :2005/04/14(木) 22:00:22
ArrayListに自作クラスFooを格納しているのですが ArrayListをシリアライズ/デシリアライズするには どうすればいいのかしら?
XmlSerializer? new XmlSerializer(typeof(ArrayList), new Type[]{typeof(Foo)});
105 :
デフォルトの名無しさん :2005/04/14(木) 22:26:30
2002を使っているんでXmlSerializerが使えません
使えるってばよ。 宇宙仮面に騙されたか?
>>103 [Serializable]
public class Fool : System.Runtime.Serialization.ISerializable
{
publicDateTimehoge1 ;
publicdoublehoge2 ;
Fool( System.Runtime.Serialization.SerializationInfo info, System.Runtime.Serialization.StreamingContext context )
{
hoge1 = (DateTime)info.GetValue( "hoge1" , typeof( DateTime ) ) ;
hoge2 = (double)info.GetValue( "hoge2" , typeof( double ) ) ;
}
void System.Runtime.Serialization.ISerializable.GetObjectData( System.Runtime.Serialization.SerializationInfo info, System.Runtime.Serialization.StreamingContext context )
{
info.AddValue( "hoge1" , hoge1 , typeof( DateTime ) ) ;
info.AddValue( "hoge2" , hoge2 , typeof( double ) ) ;
}
}
これに対して
IFormatter formatter = new System.Runtime.Serialization.Formatters.Binary.BinaryFormatter() ;
もしくは
IFormatter formatter = new System.Runtime.Serialization.Formatters.Soap.SoapFormatter() ;
System.IO.FileStream stream = new System.IO.FileStream( "ファイル名とか" , System.IO.FileMode.Create )
ArrayListlist = 適当に Fool をいれる
formatter.Serialize( stream , list ) ;
とします。
デシリアイズは formatter.Deserialize があります。
しまった、タブがペッチャンコ タブの位置は推定してくらはい
DataSetがよくわからないんだが、どこかお勧めを推薦してくれ
>>107 Serializable属性付けとけばISerialize実装しなくてもOKな場合も多いけどねー。
>>109 よくわからないと言うほど機能ないし。
今作ってるのではSerializable属性無くてもシリアル化できた。
112 :
デフォルトの名無しさん :2005/04/15(金) 01:40:47
VC#で作ったアプリってやたらメモリ食いませんか? 先日、測定器からのデータを解析等の処理をするものを 書いたのですが,10MB程度食っちゃって、 Excelよりメモリ使うんだねプゲラ なんて言われちゃいました。 アルゴリズムの実装の仕方が下手だからですかね?
.NETの起動に食われる。 起動後は関係なくなるので、タスクマネージャのメモリ使用量はあんまり意味をなさなくなる。 ということを今まで何度書いただろう。
どこかにC#に関するFAQがまとめて書いてるサイトでもありゃいいんだがな。
115 :
デフォルトの名無しさん :2005/04/15(金) 02:14:27
.NETの起動? どこかで聞きかじったんですかhw
117 :
デフォルトの名無しさん :2005/04/15(金) 06:35:07
XmlSerializerでシリアライズするときに インタフェースの明示的な実装を使っているとできないようなのですがそういうものなのでしょうか? コード例 public class StringArray : IList{ ArrayList _innerArray = new ArrayList(); [XmlArray("Items")][XmlArrayItem("Item",typeof(string))] public ArrayList InnerArray{ get{return _innerArray;} set{_innerArray = value;} } #region IListのスタブ形成 < :IListでTabキーを押してスタブ生成 //スタブを一部削ってインタフェースの明示的な実装を使ってみる int IList.Add(object value){ return Add((string) value); } public int Add(string value){ return _innerArray.Add(value); } //実行時にIListにはAdd(System.Object)が実装されていなければならない //とのランタイムエラーがでる。 public void Serialize(string filename){ ... XmlSerializerでシリアライズ } } 明示的な実装を使わないと普通にシリアライズできるのですが・・
>>112 多分煽りかとは思うが、メモリーの消費量が大きいのは、生成した大半のオブジェクトを参照にしてしまうタイプのOOPでは仕方がない、
Javaなどでもメモリー消費量の激しさは、C#と同様だ。
嫌ならC++でも使ってろって事。
最小化すればよろしい
OleDbConnectionで、Accessのmdbにアクセスするソフトをつくっているのだけど、 これって、AccessがインストールされてないPCでも動くの?
HttpWebRequest/HttpWebResponseを使ってインターネット上のリソースを取得しようとしています。 HttpWebResponse.GetResponseStreamで得たStreamに対してReadを使うとブロックしますが,これにタイムアウトを設けることは出来ないでしょうか?
BeginReadして、返値のIAsyncResultで.WaitHandle.WaitOne シグナルを受け取れなかったら強制的にClose
126 :
124 :2005/04/15(金) 21:26:46
>>125 う゛,こんなメソッドが。気付きませんでした。
早速試してみます。ありがとうございました。
念のためにヘルプを読み返したら、IAsyncResultの待機用オブジェクトのプロパティ名はAsyncWaitHandleだった。
128 :
124 :2005/04/15(金) 21:54:50
>>127 そのようですね。
レス頂いた後BeginReadについて調べ,IAsyncResult.AsyncWaitHandle.WaitOnceを使って
書き直したところ期待したとおりの結果を得ることが出来ました。
とても助かりました。
参考までに下に訂正後のサンプルを示します。
(System.Net.WebExceptionを投げるのは良くないのかもしれませんが)
IAsyncResult ar = res_stream.BeginRead(recv, 0, recv.Length, null, res);
if (!ar.AsyncWaitHandle.WaitOne(15000, false)) // 15sec
throw new System.Net.WebException("読み取りがタイムアウトしました");
int rbytes = res_stream.EndRead(ar);
ただしここでrecvはByte[],resはHttpWebResponse,res_streamはStream
129 :
デフォルトの名無しさん :2005/04/15(金) 22:00:44
C#で常駐アプリを作る方法はWin32APIのShell_NotifyIconを使うしかない? VS.NETで簡単に作れないかなぁ~
NotifyIconクラス
>>129 みたいのはMSDNで検索しないんだろうか。
132 :
デフォルトの名無しさん :2005/04/15(金) 22:53:59
Cで書かれたライブラリ(DLL)をC#で呼び出しています。 [DllImport("xxx.dll")] static extern IntPtr externMethod(string[] args); VisualStudio2003でデバッグ実行をすると普通に実行できるのですが、 できたexeを実行するとNullReferenceExceptionが上がってしまいます。 なにが問題なのか心当たりのある方はいないでしょうか?
path?
実行ファイルの隣にそのCのDLLを置いてあるため pathの問題ではないと思います。 デバッグ実行すると実行できて、デバッグなしで実行だとエラーが起こるのが不可解でして。。うーん
>>134 そういうのは大抵メモリアクセス違反してる。
string[] args が原因のような希ガス
137 :
デフォルトの名無しさん :2005/04/16(土) 00:05:18
MainFormクラスにすべて処理をすべて書いて MainFormクラスが1800行ってなんすか? これだからVB系のポトペタ環境はIYAなんだよね
「すべて処理をすべて書」かなきゃ良いだけの話だろ。 これだから馬鹿は嫌なんだよね。
うん? 道具を使いこなせないやつが道具が悪いと逆ギレてるって話?
140 :
デフォルトの名無しさん :2005/04/16(土) 00:27:31
しらねーよ おまいみたい腐れ部下なんだからhw
141 :
デフォルトの名無しさん :2005/04/16(土) 01:36:37
10000件データをDataGridに格納し表示する場合(WindowApp) データをもっとも早くメモリ上に構築でき、表示できる方法は以下のどれでしょうか? 1:DataTableにDataRowをAddする 2:DataTableにLoadDataRowする 3:DataTableなんてそもそも作らないで、DataSetにCSV形式のファイルを食わす 4:DataTableなんてそもそも作らないでXmlDataを食わす これのうちもっとも最速な呼び出しはどれなのでしょうか?それとも上記以外で で最速の方法があるのでしょうか?
142 :
デフォルトの名無しさん :2005/04/16(土) 01:47:17
DataGridより高速に格納し表示する新たにコントールを書く
143 :
デフォルトの名無しさん :2005/04/16(土) 13:22:41
コントールってなんですか?
音の響きからして東欧的なものだな。間違いない。
おまえらADO.NET詳しくないならそう言ってやれよ
各方式を比較したがいまいち満足いかないので他にありますかという 質問なら助言しても良いなと思った
>>145 カントール(Georg Cantor)だと突っ込んで欲しいのか?
クラスA,B,Cを次のように定義して、 public class A { [XmlArrayItem(typeof(C))] public B [] Ba = new B[10]; } public interface B { int a(); } public class C:B { public int a() { return 0; } } 次のコードを実行すると、 XmlSerializer sl = new XmlSerializer(typeof(A)); 次のようなエラーが出るのですが、 'System.InvalidOperationException' のハンドルされていない例外が system.xml.dll で発生しました。 追加情報 : 型 'A' を反映中にエラーが発生しました。 回避方法はありませんか? VS2003
> XmlArrayItemAttribute クラス > メモ インターフェイスまたはインターフェイスの配列を返す > フィールドまたはプロパティのシリアル化は、サポートされていません。 抽象クラスにする、XmlSerializerは諦めてSoapFormatterとか使う、自前でシリアライズ処理をガリガリ書く……。
152 :
デフォルトの名無しさん :2005/04/17(日) 15:07:00
axWebBrowserについて質問があります。 sleipnirなどのブラウザには検索ハイライト機能がついていて、 指定したキーワードの背景を黄色などにして目立つようにしていますが、 つまりはブラウザのHTMLを書き換えているということですよね? それをaxWebBrowserでやるにはどうしたらよいのでしょうか? axWebBrowserの何をreplaceしてやればよいのですか?
153 :
VCVSVC# :2005/04/17(日) 15:11:18
マジ質問です。 趣味でC#を始めまして、言語レベルは概ね習得できたのですが アプリケーションの書き方について質問。 FormにペタペタとPictureBoxやらTextBoxやらLabelやらを貼ってるんだけど こうするとFormクラスがデカクなっちゃいますよね VC++のときみたくDoc/View構造の良いサンプル無いですかね?
でかくても気にするな、IDEが勝手にやることだし・・・
たしかにDDXに相当する仕組みがないんだよなあ delegateとか使えばイイというのはわかるんだが
156 :
VCVSVC# :2005/04/17(日) 15:29:27
でかいって表現がよろしくなかったです。 Formクラスのコードの量です。 VC++の時はControllerとViewを CVeiwの派生クラスに書いて ModelはCDocumentクラスの派生クラスに書いて分離できて スマートだったんですけど、VC#は自前でMVCを実装するのなら 面倒だなと思っています。 簡単な決め打ち的なMVCなら書けるんですけど・・・
俺は最近はMVCやめて、ユーザーコントロールに対してペタペタ貼り付けて機能をまとめて、それをFormに貼り付ける方法をとってる。 この方が分離がいいので。
あと、これでやると最後に貼り付けたコントロールが突然消えてなくなる謎のバグも被害が小さくてすむのでいいです。
<<157はアスペクト指向を知らないようだが 経験で解ってるんだろうな。
>>152 書き換えたHTMLを表示すればいいんじゃね?
それかDOMつかってしこしこすればいいんじゃね?
Doc/Viewアーキテクチャってそんなに流行ってたの?
163 :
デフォルトの名無しさん :2005/04/17(日) 19:01:44
>>162 C#からから始めた新参者丸出しプゲラ
164 :
デフォルトの名無しさん :2005/04/17(日) 19:39:52
162じゃないけど、教えてください。 DocumentViewアーキテクチャを使って~というのはヒットするのですが DocumentViewアーキテクチャ自身についての解説は見当たらないです。 C#・Javaから始めた新参者なんでお願いします。
C#には、MD5クラスとかありますけど ファイルデータのMD5ハッシュ取得は 自前でやるべきなのでしょうか? それとも、うまい既存使い方があるのでしょうか?
MSDNを100000億回読め
Docment/View というよりMVCについて調べたほうがよいかと
すいません。 LAN内部のすべてのマシンのIPアドレスを取得したいのですが、どうやってやればいいのかいまいち検討がつきません。 すべてのIPアドレスにpingを送って帰ってきたものを今稼動しているマシン、としようとしたのですが、 とても現実的ではないと思いまして・・・。 よろしくお願いします。
>>165 using System;
using System.IO;
using System.Security.Cryptography;
class MainApp {
public static void Main(string[] args) {
if (args.Length != 1) {
Console.WriteLine("引数は1個");
return;
}
MD5 md5 = new MD5CryptoServiceProvider();
byte[] result = md5.ComputeHash(new FileStream(args[0], FileMode.Open));
foreach (byte i in result) {
Console.Write("{0,2:X2}", i);
}
Console.WriteLine();
}
}
>>161 ということは、いちどローカルに書き出して置換し
それを表示するということですか?
DOMはよくわからない……
171 :
デフォルトの名無しさん :2005/04/18(月) 05:59:28
>>169 これを参考に、TransformBlock、TransformFinalBlockで
進捗ゲージ表示もできそうですね
ありがとうございました
>>169 > Console.Write("{0,2:X2}", i);
こういう書式のサンプル集みたいのってありますかね?
MSDN見てもいまいちわからなかった。
>>172 緑のバイク
それでわからなかったら自分でMSDNの記述を片端から試していけ。
void ListViewSelectedIndexChanged(object sender, System.EventArgs e) { textBox.Text = listView.SelectedItems[0].Text; } ListViewにある項目が選択されたらその項目のTextを表示するんだが、 1回目はきちんと表示されても、2回目からはエラーが出る。 ただ、tryの中に入れてcatchには何も書かなければエラーは出ずちゃんと動くんだが。 これでいいんだろうか。
例外の内容は無視かよ。
>>174 catchしてメッセージをMessageBoxにでも投げて確認しとけ
tryするだけワラタ
「もしもし、エラーですよ」 「ええ、お構いなく」
Specified argument was out of the range of valid values. Parameter name: index 範囲外って言われても私が指定ミスしてるんじゃないんだから。 あーあ、やっぱりわからないからcatchで無視しとこ。
ふふっ。これでできちゃいました。私ってやっぱり天才 if(listSafeView.SelectedItems.Count == 1){ textSafeInput.Text = listSafeView.SelectedItems[0].Text; }
181 :
169 :2005/04/18(月) 18:47:05
>>172 MSDNライブラリ(ローカルのやつ)で探しました。普段C#を全く
触らないもんで。
>範囲外って言われても私が指定ミスしてるんじゃないんだから …
こうして負の遺産は増えていく
184 :
デフォルトの名無しさん :2005/04/19(火) 01:32:12
.NETアプリを作る場合C#よりC++を使うことのメリットってあるんですか? すなおにC#を使ったほうが楽そうですけど・・・ なぜにC++プロジェクトのWindowsフォームアプリケーションなんてあるんだ? > 2003
185 :
デフォルトの名無しさん :2005/04/19(火) 01:49:09
Win32 API のスレに書くべきかもしれないけど、C# だからここに書かせてね -------------- using System; using System.Text; using System.Runtime.InteropServices; namespace ConsoleApplication1 { class Class1 { [DllImport("kernel32.dll", SetLastError = true)] static extern bool GetVolumePathNameW( string lpszFileName, out StringBuilder lpszVolumePathName, uint cchBufferLength); // GetErrorMessage formats and returns an error message corresponding to the input errorCode. public unsafe static string GetErrorMessage(int errorCode) { // 略。 // FormatMessage() Win32 API を呼び出すだけ。 } 続く
186 :
デフォルトの名無しさん :2005/04/19(火) 01:52:33
>>184 ・C#言語を覚える必要が無い
・STLが使える
187 :
185 :2005/04/19(火) 01:55:58
/// <summary>アプリケーションのメイン エントリ ポイントです。</summary> [STAThread] static void Main() { string path = @"C:\ddrive\Tools"; StringBuilder volumePathName; bool GetVolumePathName_success = GetVolumePathNameW(path, out volumePathName, 1024); Console.Write(path + " → "); Console.WriteLine( GetVolumePathName_success ? volumePathName.ToString() : ("Failed : " + GetErrorMessage(Marshal.GetLastWin32Error())) ); } } } -------------- というコードで、ボリュームがマウントされているパスを取得しようとしました。 期待している答えは "c:\ddrive" なのですが、GetVolumePathNameW が、"|:" としか返してこなくて困ってます。 volumePathName の渡し方を StringBuilder じゃなくて string にしたり、out にしたり ref にしたりしたけど変わりません。 どこらへんがおかしいか、教えてください。 環境 : WinXP Pro sp2 + IE6 sp2 + VisualStudio2003 professional C:\ddrive に D: をマウントしています。
188 :
185 :2005/04/19(火) 03:00:42
自己解決しました。 まず、StringBuilder の渡し方は out でも ref でもなく、そのまま渡せばよかったです。 これをクリアしても、まだ望む答えが出てこなかったのだけど、これはCharSet をちゃんと指定してあげると解決しますた。 [DllImport("kernel32.dll", SetLastError = true, CharSet=System.Runtime.InteropServices.CharSet.Auto)] private static extern bool GetVolumePathNameW( string lpszFileName, StringBuilder lpszVolumePathName, uint cchBufferLength); というわけで、GetVolumePathName の記述は↑のようになりますた。
189 :
デフォルトの名無しさん :2005/04/19(火) 13:05:28
.net frameworkコンポーネントにWebブラウザが無いなんてJavaSwing以下だな。。。
そうですね
なければ自作。これ基本。
193 :
デフォルトの名無しさん :2005/04/19(火) 20:27:05
ノータッチデブロイメントならどこでも置けるような…
宇宙仮面さんのところはできてるから・・・ infoseekはOK?
197 :
名無しさん@編集中 :2005/04/19(火) 22:10:38
C♯の本で良本ないですか。大きい本屋がない田舎なもので ネット通販で買いたいけど、実物見ないで買うので不安です。 数冊教えてくれると助かります。
198 :
デフォルトの名無しさん :2005/04/19(火) 22:23:31
あるFormを外のクラスからストライプ表示させるように操作することってできますか? static void Blind(Form form);みたいにして実装はしたいのですが パワーポイントのブラインド効果のように
>>198 ストライプ表示やらパワーポイントのブラインド効果やら言われても良くわからん。
Googleで「パワーポイント ブラインド効果」の検索結果0件だし。
>>198 スプラッシュウインドウ?ってだけではなさそうだけど、
オーナードローでできるんじゃないの?
レスありがとうございます。 PowerPoint のアニメーションで開始にカテゴライズされているブラインドアニメーション って、わかりませんよね。 オーナードローじゃなくて外からユーティリティ関数で定義できたらいいなーと思ってみました。 例えば、Formがラスタするとか、風化してさらさらーと消えるとか。 やっぱり、できるのはフェードイン・アウトくらいなのかな
DirectX使うとか ウィンドウのスナップショットとって後は好きにいじれば
Regionプロパティを変化させてけばできないか?
WebServiceでサーバ側にファイルを書き込みたいのですが File.CreateFile("text.txt");が成功しません。どのようにしたらよいでしょうか?
それだけじゃコメントしようもない。
207 :
デフォルトの名無しさん :2005/04/20(水) 23:55:21
それだけじゃコメントできないような人には聞いていません 黙っててください
うほ・・ あおりはやめてください・・ 例えばこんな感じで [WebMethod] public void Upload(string title, byte[] bytes){ File.CreateFile(title).Write(bytes, 0, bytes.Length); } サーバー側にファイル作るのどうするのかな。と
CreateFile? 成功しません、ってことは何らかの例外なりエラーメッセージがあると思うんだが、それさえもないのだろうか。
>>206 207じゃないが、いままでもずっと見てきていて、いい加減腹がたってくるんだよ、答えなくていいから死ね
お前だろ延々とそんな回答にもヒントにもならないクソレス解し続ける蛸は
basp使え。
212 :
デフォルトの名無しさん :2005/04/21(木) 02:48:31
yada
213 :
デフォルトの名無しさん :2005/04/21(木) 03:01:40
>>205 ACL(アクセス制御リスト)じゃないっすか?
ファイル作成するフォルダのプロパティ→セキュリティで
ASPNET(IIS 5)とかNETWORKSERVICE(IIS 6)やら、
あるいはweb.config使って偽装(Impersonate)してれば
そのアカウントに書き込み権限つける、とか。
>>213 実に男らしい。
でもサイトの配色が微妙なので減点
C# で C++ の std::multimap に相当するクラスは無いですか? フリーソフトの undup みたいなもん作ってるのですが テーブルにファイルを登録するときに、そのファイルのファイルサイズと同じサイズのファイルの集合を得て、 その中から同じファイルを探すと言うことをしたいです。 今は、Hashtable[filesize] でArrayList を得てるけど、スマートじゃないなーと思うのです。
>>217 基本的にはそんなもの。
NameObjectCollectionBaseの派生クラスを自分で書く手もあるけれど、
けっこうなコード量が必要で、キーにはstringしか使えない難点もある。
コンテナ関係はもっと整備されないと厳しいね、それもジェネリックス実装後でないとライブラリが歪んでしまう。
.NET2.0にはNameValueCollectionのGenerics版が無いんだよねー。
OpenFileDialog.FileNameで取得したパスをTextBoxに入れて、 その値を書き出そうとしたのですが、出力されないのです・・・ こんな感じでテストしたんですが・・・ StreamWriter sw = File.CreateText(text); sw.Write("{0}", textBox.Text); sw.Close(); エンコーディングの問題? 特殊文字? セキュリティ? TextBoxにパスをDialogから読み込んだ後だと、 その後に設定したテキストも出力できず。 どなたか原因のわかる方いらっしゃりませんか?
例外は投げられてないんだね? サイズ0のファイルは作られてる? あとOpenFileDialogは普通既存ファイルを指定するのに使うわけだけど、CreateTextしちゃっていいの?
>>223 説明の仕方がまずかったのかもしれません。すみません。
Dialogで取得したパスをtextファイルへ書き込もうとすると、
IOException、ObjectDisposedException、NotSupportedExceptionとも、
Messageもはかず・・・サイズ0のファイルも作られていないようでして・・・
いや本当に説明の仕方がまずいよ。 結局例外は投げられてるの?
>>225 例外は投げられていないようなんですが・・・
ところで、 >OpenFileDialog.FileNameで取得したパスをTextBoxに入れて、 >その値を書き出そうとしたのですが、出力されないのです・・・ > >こんな感じでテストしたんですが・・・ >StreamWriter sw = File.CreateText(text); ↑ FileName = ファイルパスを TextBox に入れた後、いつ "text" に入れているの?
228 :
227 :2005/04/21(木) 21:44:15
あ~…… とりあえず、OpenFileDialog で選択したファイルパスを、別なファイルに書き出すという動作で OK? ってことは、なんとなく OpenFileDialog で選択したファイルのあるフォルダに、書き出し先のファイルがあるような気がする。
>>228 あーーーー
ありました。。。。。かなり凹みました。
なるほど、カレントディレクトリが・・・・はぁ~
すみません。ご迷惑をおかけしました。
230 :
205 :2005/04/21(木) 22:47:08
>>229 外野からすまんが、謝るよりまず先にお礼言えよ
特定のファイルを実行したり終了させたりしたいんですが 実行は System.Diagnostics.Process.Start で出来たんですが System.Diagnostics.Process.Startで実行したファイルを 終了させるにはどの関数使えていいのでしょうか?
Processインスタンスをnew。 StartInfoのFileNameに実行したいファイルを代入。 Startメソッドで起動。 CloseMainWindowメソッド/Killメソッドで終了。
ちょっと子ノードの数とかを知りたいので XmlTextReaderで読んだときに string strXml = xmlReader.ReadOuterXml(); で取得し、 byte[] bySource = Encoding.Unicode.GetBytes( strXml ); MemoryStream ms = new MemoryStream() ms.Write( bySource, 0, bySource.Length ); XPathDocument myXPathDoc = new XPathDocument( ms); ってやってるんだけど、 XPathDocument myXPathDoc = new XPathDocument( ms);で Exceptionはいてしまう。。。なんでー;; 最初からXPathDocument つかってよみこみたいんだけど 150MBぐらいのXmlだと落ちちゃう(速度おそい)のでXmlTextReaderつかってんだけど、 だれかおしえてくでー;; てか、XmlTextReaderで読んでる時に 子要素の数の取得できればそれでいいんだけど。。。
色々突っ込みたいところはあるが、 取りあえずXPathDocumentのコンストラクタをよく調べてみると良いよ。
238 :
217 :2005/04/22(金) 18:22:55
>>221 DataSet だと、確かに希望したことはできるのですが、
一つのファイルをつっこむたびに毎回 SELECT で表を走査するので遅くなってしまいました。
239 :
デフォルトの名無しさん :2005/04/23(土) 00:08:47
アンマネージコードをマネージコード化する方法が詳しく載っているサイトってどこかありますでしょうか Cで書かれたライブラリを使っていて、マネージコードにしたいんですけど アンマネージコードに対してマネージラッパーの正当性を確認する方法とか マネージコードについて いまいち勉強不足なのですが C#.Netにて Win32APIを[DllImport]使ってGUIコンポーネントを作成 > できたクラスはとりあえずマネージコード C#.Netにて CライブラリをWrapしてメソッド作ったらunsafeな公開メソッドになっちゃった> unsafeだよってメタ情報が書いてあるマネージコード C#.Netでプログラムを作ったらとりあえずマネージコードになる?
C#でアンマネージコードは書けないのでは
マネージラッパの正当性の確認ってのは難しいような。 表現手段がかなり幅広いから。 サイトか。 やっぱり基本はMSDNだね。解説にプラットフォーム呼び出しのチュートリアル、リファレンスにアンマネージコードとの相互運用。 @ITの.NET TIPSとか。 後半部分はその通り。 ちなみにDllImportは必ず完全に非unsafeなコンテキストで書けるよ。 IntPtrはすれすれだけどw一応unsafeではない。 CopyMemoryはunsafeで書くけどな。
MagicDockingでShowContentとHideContentで表示非表示を切り替えていると bottomに表示するように設定すると ステータスバーの下に表示されてしまいいます。 ステータスバーの上にはできないのですか
作った人に聞けよ
244 :
239 :2005/04/24(日) 11:05:16
245 :
デフォルトの名無しさん :2005/04/24(日) 11:23:27
よくVisualStudioなどで 自分のアプリ外でのファイル の変更があると 「xxxはこのエディタ以外で編集されましたが再度読み込みますか?」みたいなメッセージがでますけど このような機構はどのようにして実現するのがいいのでしょうか? 自分のアプリで登録した時点でのタイムスタンプを保存して 対象をポーリングしてるのでしょうか それとも便利な何かがある?
>>245 System.IO.FileSystemWatcherクラス。
ただし、Win9X系ではうまく動かないけど。
ノータッチデプロイメントでロード時間が長いので、せめてロード中の表示をしたいのですが、 たとえば、こういう事はできるのでしょうか? 1.dll をいくつかに分けて初期状態ではdllは読み込まずに手動で読み込み 2.どの程度読み込み終わったのか判定
248 :
デフォルトの名無しさん :2005/04/24(日) 12:51:49
ファイルの名前を変更したいのですが、 ファイルの中身を読み込んで新規ファイル名で保存 その後古いほうを削除するしかないんでしょうか? 直接リネームできると助かるのですが。
250 :
248 :2005/04/24(日) 12:56:37
即レス感謝。 Moveって移動と思い込んでましたが、よく見たら名前の変更に使えるんですね。
>>246 そもそもFileSystemWatcherの動作プラットフォームにWin9xが入っていないし。ReadDirectoryChangesWが呼ばれるんだと思う。
Win9xにも対応するならFindFirstChangeNotificationを使えばいいかと。
あめぞうをつぶしませんか?
253 :
245 :2005/04/24(日) 20:24:49
>>246 ,
>>251 ありがとうございます
うは、Win9xに対応してないとかってまったく気にしてなかった。
よく見ると下のプラットフォームのところに書いてあるのね
他に9xじゃ動かないメジャーなAPIってあるのかな
フォームのタイトルバーにあるアイコンを非表示にするにはどうすればいいのでしょうか。
FormBorderStyleを適当にいじればいけたような気がする。
256 :
デフォルトの名無しさん :2005/04/25(月) 00:22:46
なんていい加減な助言w
だってヘルプみればわかるし
ありがとうございました。 FormBorderStyleをFixedDialogにすることで解決しました。 今後は安易に質問せず、自分で解決できるよう努力します。
DShellFolderViewEventsの SelectionChangedを扱いたいんですが、 eventhandlerとかはどう記述したらいいんでしょうか。 ぐぐってもほとんどヒットしません。 shell32とshdocvwはインポートしてあります。
Process.Startとかで起動したプログラムそのもののプロセスIDってどうやって取得するんでしょうか?
クラスの情報を調べる方法を探しています。 継承元のクラス名やらはBaseTypeとかでわかるのですが、継承したインターフェイスクラスの事を調べる術がわかりません。 どなたかご存知ありませんか?
Type.GetInterfacesがあるだろ。
>>260 Process.Id……リファレンスを少しは見ろと。
それともなにか、Process.Start静的メソッドで起動して返値は捨ててるのか。
>>262 それはその「クラス名」を指定しないと取得できないんですが・・・・・
>>264 ん? GetInterfaceと勘違い?
foreach (Type interfaceType in typeof(Hoge).GetInterfaces()) {
Console.WriteLine(interfaceType.Name);
}
それともこういう事じゃないの?
HTMLを解析するのに便利で速くて格好いいクラスはありますか?
mshtm(ry
かっこよくはないだろう
269 :
デフォルトの名無しさん :2005/04/26(火) 00:15:00
非同期通信の勉強でSystem.Net.Socketを使ってファイルの送受信を書いてみたんですけど Threadを二つ使ってSend(...)、Receive(...)でやり取り 非同期メソッドBeginSend(...)、BeginReceive(...)でやり取り と二通り書いてみたら、Threadのほうが早かったのですがそういうもの? bufferサイズは1k,10kで //コードとしてはこんな感じで@非同期 public void receive(...){ ... clientSocket.BeginReceive( buffer, 0, buffer.Length, SocketFlags.None, new AsyncCallback(callback), null); } private void callback(IAsyncResult ar){ try{ bufferReceivedCount = clientSocket.EndReceive(ar); fileStream.Write(buffer, 0, bufferReceivedCount); } catch(Exception ex) {Trace.WriteLine(ex);} if(!clientSocket.Connected || timeout < 0) {//終了処理 return; } clientSocket.BeginReceive( buffer, 0, buffer.Length, SocketFlags.None, new AsyncCallback(callback), null); } //thread public receive(){ new Thread(new ThreadStart(){while(true){ clientSocket.Receive(....); ...}).Start();}}
270 :
デフォルトの名無しさん :2005/04/26(火) 01:37:10
よくメーラーとか、FTP ClientとかIEも パスワードを保存してくれますが、これってどうやってるんでしょうか? C# 暗号化 でググってもユーザーが入れたパスワードをキーに ファイルを暗号化して保存。 それを読み込むときもまたパスワードを入れてもらって ってやってますが、最初にあげたようなソフトはユーザーに何も聞かずに パスワードを保存してます。 暗号化に用いたであろうキーはどうやって安全に保存してるんでしょうか?
>>265 出来ました。ありがとうございます。
DLL内部をツリービューに表示して、選択されたクラスについての情報を表示しようと思ったんですが、
なぜか
AppDomain currentDomain = AppDomain.CurrentDomain;
currentDomain.TypeResolve += new ResolveEventHandler(MyResolver);
をやってから
Type t = Type.GetType(name,true);
しないとクラスの型が取得出来ませんでした。
これはなんでなんですかね?
しかも、
static Assembly MyResolver(object sender, ResolveEventArgs args)
{
return typeof(TextBox).Assembly;
}
という内容なんですが。TextBoxでなくとも正解の値が返ってくるんですよね。わけわかめ。。。。
プロセスの起動時に 起動したプロセスのIDが戻り値の中に含まれていますか? 含まれている場合戻り値取得方法についてお伺いしたいのですが どなたかご存知の方おられましたらアドバイスいただければと思います。
……戻り値の取得方法って……。 "hoge".Replace("o", "a")の戻り値をどうやって取得するか教えろってこと?
>>271 Type.GetTypeの解説を読むと何故AppDomain.TypeResolveが必要か分かる。
簡単に言えば、単純型名/名前空間付き型名でGetTypeした場合、mscorlib.dllと自分自身のアセンブリしか検索対象にしないから。
Type.GetTypeで任意のアセンブリ内のクラスの型情報を取得するには、アセンブリのバージョン情報などを含んだ完全限定名で指定する必要がある。
>TextBoxでなくとも正解の値が返ってくるんですよね。
これは要するにSystem.Windows.Forms.dllのアセンブリ情報が欲しいわけで、
それならTextBoxだろうがDataGridだろうが同じアセンブリだから。
Type.GetTypeするのがSystem.Drawing.PenだったらSystem.Drawing.dllのアセンブリ情報が必要になる。
まだはじめたばかりで諸先輩にとってはアホな質問だと思われるかもしれませんが private void button2_Click System.Diagnostics.Process A = System.Diagnostics.Process.Start("notepad"); System.Threading.Thread.Sleep(2000); A.Kill(); というのを作成したのですが private void button3_ClickでA.killをしたいのですが別の場所でもAのプロセスIDを保つにはどうしたらよいのでしょうか?
button2がどこで宣言されてるか、どこで初期化されてるか調べてみるといいよ。 #regionも開いて。
>>277 いや、命名を見れば275も明らかにVS使ってるからさ。
直接の解法を与えるのは好きじゃないし。
279 :
275 :2005/04/26(火) 12:15:53
いろいろと調べてみて System.Diagnostics.Process A; private void button2_Click System.Diagnostics.Process A = System.Diagnostics.Process.Start("notepad"); として private void button3_Click A.kill(); としてみましたが button3を押すと オブジェクト参照がオブジェクト インスタンスに設定されていません。 とエラーが出てうまくいきませんでした。 私にはまだまだ敷居が高いようでした。
>>279 おしいですな、スコープとか勉強しなおしたほうが...
System.Diagnostics.Process A; private void button2_Click A = System.Diagnostics.Process.Start("notepad"); として private void button3_Click A.kill(); すればよろし、ところでなんで {} と (object sender, 忘れた e ) が無いの?
通りすがりがまったくもっておバカな質問なんですが 上のProcess.Startの ("") の中にドライブ直下に置いてるアドレスを書いても なんだか起動しないんだが 別の指定方法とかるんですかね? 一応 c:\helloworld.txt と入れても(もちろん適当な文字をいれてファイルは作成してあります) 認識できないエスケープシーケンスです と出るんだが一応 c:\\helloworld.txt と¥を2つ入れると実行できた。 普通に c:\ で実行する方法あります?
ヘルプでC#プログラマーズリファレンス>C#のキーワード>型>参照型>stringを調べてみな。
284 :
282 :2005/04/26(火) 15:14:47
>>283 なるほど・・・・
@くっつけろってことね・・・・
C#やり始めて2ヶ月もたつのに
こんなこと聞いてるようじゃ人間失格だな
肉体労働にでも転職考えます。
285 :
moetan :2005/04/26(火) 15:57:38
>>285 そういうのはアンマネージ以外からはこれからも使えないと思う
287 :
moetan :2005/04/26(火) 16:11:59
>>286 さんくすこ
フック系はWinFXでマネージドから扱えるようになるんじゃないかなと期待。……先は遠いな。
のっとり万歳ですか、マネージドに入れるのはセキュリティー上ヤバイだろ
>>289 ハァ?
セキュリティ上何がやばいか言ってみ?
マネージドであることと関係ない件について
>>291 じゃあいまのWindowsも盗み放題なんだね!
みんなWindowsは危険極まりないぞ!
さっさと窓から投げ(ry
>>293 今まで知らなかったのか、実際そういうウイルス居るぞ
>>292 近年は成りすまし防止等も重要な事なのじゃよ、トップレベルウインドウに制限とかつけるようになってるだろ。
>>294 マネージドと関係あることをやっぱり説明できてない件について
むしろマネージドに入れたほうがセキュリティ上安全かもね
基本はアンマネージのまま放置、機能の自然消滅待ちでしょう 入れたら大穴になるんじゃないの
マネージドにすると大穴になると言う根拠は? フックが嫌いなのは分かったが、なんかマネージドに幻想持ってる?
>>298 別にフックは嫌いじゃないが、こういう物は基本的にOSの一部として動作すべきものだから、
デバイスドライバやその類のやり方で組まれるのが正しいと思うが根拠。
こんなえげつない物の取り込みはかなり嫌な感じがする。
289ではないが…。 それを防止するためにAssemblyのFullNameがあんなに長ったらしい ものになってるし署名機能が基盤に組み込まれているともいえる。 ただ明示的に指定して(つまりユーザーが確実に管理下における特殊な状況において) 技術的に出来ないわけでもないし、危険性も限定的にすればいいだけなので 追加されるかもしれない。 っていうかここまで書いて気づいた。DelaySign使えば今でもできるじゃん
あ、ごめん、勘違いしてた。そっちのフックか えーと、C++/CLIで出来るからいらないんじゃないかな
うあ、えーと、C++/CLIじゃなくてCLR Hostingのほうか・・・ ごめん、吊ってくる
303 :
デフォルトの名無しさん :2005/04/26(火) 22:14:11
すいません、質問をお願いします。 ファイルのアイコン、ファイルの種類(zipなど)、などの「全般」情報と タイトル、表題、作成者、カテゴリ、などの「概要」情報を取得するにはどのようにしたらよいのでしょうか?
>>303 >タイトル、表題、作成者、カテゴリ、などの「概要」情報
これ Explorer が独自に管理している情報じゃなかったっけ?
一部のファイルについては、いくつかの情報は自力で抜き出せるけど、
わけわかんなくなったら諦めた方が身の為かと思う
>>304 ,305
即レスありがとうございます
NTFSでマルチストリームで管理していたんですね>概要
試しにC#でfilename:stream名で実験したら失敗(当たり前か)
Shell32.dllは使いづらかったです。(いろいろいじってちょっと面白かった)
DSOFileは使えそうな感じ。割と簡単でした。
>>
ttp://hp.vector.co.jp/authors/VA016117/explorer1.html ファイル/フォルダの(Large/Small)アイコンを取得するところがうまくいきません。
(自分的にC++から.Netの世界に持っていくのはコストかかって辛い T-T)
HIMAGELISTってなんだろう・・
C++バリバリでシェルのアイコンとるサンプル作ってくれる御方いないかな。。
SHGetFileInfoにHIMAGELISTは出てこないと思うが。
309 :
デフォルトの名無しさん :2005/04/27(水) 00:06:49
private int _numberA; public int NumberA{ get{ return _numberA; } set{ if( value < 0) throw new ArgumentOutOfRangeException("負の値ではない数値が必要です。"); else _numberA = value; } } クラスの一部がこんな感じです。 ArgumentOutOfRangeExceptionのParamNameプロパティーをコンストラクタで設定したいのですが、プロパティーのときは何を設定すればよいのでしょうか。 [C#] public ArgumentOutOfRangeException( string paramName, object actualValue, string message );
まあただのハンドルで、ImageList_HOGEHOGEの各関数があるだけだがね。 SHGetFileInfoでアイコン取得するだけなら基本的に必要ないし。
>>311 そうですか、ありがとうございます
valueですか、そういえばそうですね
>>303-306 初めて知った、マルチストリーム
普通のエディタで開けますね、こっそりディレクトリみたい
TabPanelにControlを追加削除を何度も繰り返すと たまに、一切追加したオブジェクトが表示されないって 現象起きたことある人いませんか?
>>314 タブに対して優先順位を変えると良く起こるね
タブに限らないけど、修復方法のノウハウ誰か作ってくれないかな・・・・
>>315 とりあえず、コーディングガタガタでも無理矢理でもいいんですが
直す方法としてどんなことを試せばいいのか教えてもらえませんか?
チェックボックスのチェックを入れる白い部分の色を変えることって出来ますか? バックのカラーは変えれるみたいですがやはり中の白い部分は変えられないのでしょうか?
そう言うプロパティがないなら無理だろ。
>>316 直す方法は見つからない、プロパティーいじって復活したらラッキーといったところ。
標準のTabControlはいくらなんでもしょぼすぎだよね。
そうでもないよ、使い方を理解してないんじゃない?
バグ対策ですが、 TabPage コントロールに貼り付けたコントロールが全滅を食らわないようにするために 一旦 UserControl 上に全てのコントロールを貼り付けて、このコントロールを改めてTabPageに貼り付けるようにしている。 こうすればTabPageが壊れても、そこだけ作り直せばよいので被害が少なくて済みます。 UserControl 上で貼り付けたコントロールが消える時は、最後に貼り付けたコントロールもしくは最後にリネームしたコントロールからのようなので、 生贄用のコントロールとして、全ての配置が終わったあとに、表示内容の無い Lavel コントロールを一枚貼り付けています。
俺はなんとなく消えるのがうざいのでデザイン終わったら InitializeComponentの中身をコンストラクタにコピペして InitializeComponent自体消す。 でも以降デザイナで表示できなくなってしまう でもリソースとかあるとダメポ ・・・parcial typeマダー
324 :
デフォルトの名無しさん :2005/04/27(水) 22:11:56
Hashtable ht1,ht2 があって、ht1にあってht2にないキー また逆に、ht2にあってht1にないキーをリストアップするのに なにかスマートな方法ないですか?
ないのでforeachとContainsKeyで。
326 :
324 :2005/04/27(水) 22:43:47
地道にするしかないですか… ありがとでした。
複数のdllを一つに纏めたり、dll を exeの中に取り込んだりする方法ってありますでしょうか?
基本的にない。 応用的にリフレクションを使えば可能ではあるが恐らく貴方の望むモノではない。
329 :
デフォルトの名無しさん :2005/04/27(水) 23:34:52
susieプラグインでJPEGをBMPへ変換したいのですが、 以下の場合だとStretchDIBitsがエラーを返します。 どのあたりが間違っているか教えてもらいたいのですが、よろしくお願いします。 private const int DIB_RGB_COLORS = 0; // color table in RGBs private const int SRCCOPY = 0x00CC0020; // dest = source private const int GDI_ERROR = 0; [DllImport("ifjpeg.spi", EntryPoint="GetPicture",ExactSpelling=true , SetLastError=true)] private static extern int GetJPEGPicture( StringBuilder FileStr, int len, int flag,ref IntPtr pHBInfo,ref IntPtr FARPROC,int CallBack, int CallBackLong); public static extern int LocalFree(IntPtr MemHandle); [DllImport("kernel32.dll")] public static extern int LocalLock(IntPtr MemHandle); [DllImport("kernel32.dll")] public static extern int LocalUnlock(IntPtr MemHandle); [DllImport("kernel32.dll")]
330 :
デフォルトの名無しさん :2005/04/27(水) 23:36:15
つづき public static int DrawJPEG(StringBuilder PicFile,PictureBox ToDraw) { IntPtr BitMapInfo = IntPtr.Zero; IntPtr BitMapObj = IntPtr.Zero; IntPtr M_BMP; IntPtr M_Info; int ret; //画像展開 ret = GetJPEGPicture(PicFile, 0, 0,ref BitMapObj,ref BitMapInfo, 0, 0); if(ret != 0) return ret; //メモリーのロック M_BMP = (IntPtr)LocalLock(BitMapObj); M_Info = (IntPtr)LocalLock(BitMapInfo); //描画先をとりあえずピクチャーBOX Graphics g = ToDraw.CreateGraphics(); if(StretchDIBits(g.GetHdc(),0,0,100,300,0,0,100,30,M_BMP,M_Info,SRCCOPY,DIB_RGB_COLORS) == GDI_ERROR) return -1; ToDraw.Invalidate(); //メモリの開放 LocalUnlock(BitMapObj); LocalUnlock(BitMapInfo); LocalFree(BitMapObj); LocalFree(BitMapInfo); return 0; }
333 :
デフォルトの名無しさん :2005/04/28(木) 00:05:18
>>332 一番したがちょん切れていました。
[DllImport("kernel32.dll")]
public static extern uint GetLastError();
戻り値は”0”(GDI_ERROR)でした。
>>329 susieプラグイン使わなくても変換はできるが、それは駄目なのか?
そもそもGDI_ERRORの定義が #define GDI_ERROR (0xFFFFFFFFL) だったりするんだが。
336 :
デフォルトの名無しさん :2005/04/28(木) 00:29:55
>>334 いえ、それどころか大歓迎なのですが、
やり方がわからなかったものでsusieを弄ってました。
>>335 すみません、間違ってました。
MessageBox.Show(GetLastError().ToString());
とかやったらちゃんと127と出てきました。
どうもありがとうございます。
DllImportもsusieプラグインもいじれるのにjpeg<->bmpができないと言うのも珍しいな。 Image.FromFileで開いてSave(string, ImageFormat)するだけなのだが。
C++からの移行組みなんじゃないかな、オレもそういうの多いし
>>339 それは複数のモジュールから集めたメタデータを一つのアセンブリにするもの。
複数のアセンブリをどうこうするものじゃないし、
モジュールそのものをアセンブリに内蔵するわけでもない。
341 :
デフォルトの名無しさん :2005/04/28(木) 13:06:59
a=A b=B c=C… みたいにaによって一意にAが決まり、その逆も成り立つデータを扱っているのですが、 a→A A→a を扱うにはどうしたらいいですか? 普通に連想配列をひとつ使うと、 a→Aはいけますが、 A→aはできないですよね?
普通に連想配列をふたつ使えば?
343 :
341 :2005/04/28(木) 13:14:05
即レスありがとうございます。 連想配列 a,AってのとA,aってのを用意するのが普通なんですか。 参考になりました。ありがとうございます。 #素人孤独マだとなにが普通かがぜんぜんわからないので助かります。
>>341 作って公開してよ、このあたりの弱さは.NetFrameworkはかなり悲惨なので・・・・
グラフとか、同値とか順序集合とか半順序集合とかものすごく欲しいんですが、作ってる時間が無い。
345 :
341 :2005/04/28(木) 15:09:58
…よしやるぞ! といいたいところなんですが、 順序集合とかはじめて聞きましたよ… とりあえず連想配列を二つまとめたクラスでもw
>>344 そういうのを作るとしたら、どの言語を参考にすればいいの?
STLの~~は.NETにありますか、って質問は何度か目にしたな。 Javaのコンテナとかはどうなんだろう。
いま欲しいんだよね。
二つのstring[]比較してそれぞれに共通なもの、 片方にしかないものの抽出してくれるのも。
>>349 そいつはクラスじゃなくて静的メソッドがお似合いじゃないか?
List<string>ならFindAllメソッドで対応できそうだな。
反汎用的な機能をつけられても、逆に困る罠
でも集合演算なんかができると結構面白そうだ。
353 :
デフォルトの名無しさん :2005/04/28(木) 22:17:05
そのうちに推論エンジンも付けろとでも言い出しそうな奴が
>344 欲しい。けど Javaも似たようなものだと思うけど グラフとか、同値とか順序集合とか半順序集合がそろってるのって例えばなに? Hashtableあればどうとでもなる、というか他人のコードが読みやすい。ような気も 計算量の見積もりとか
>>321 お前が作ってるソフトがしょぼいだけ。
BackColor すらないんだぞ?
359 :
デフォルトの名無しさん :2005/04/28(木) 23:55:53
>>339 情報提供有難うございます、多分それで僕の望みは叶いそうな予感がします。
しかし、メチャクチャ難しいですね、良い書籍とかないですかね?
まだパラパラっと見ただけなのですが、といいますか吟味して読めるレベルではないといいますか、そんな状況なのですが、
VisualStudioから module を生成する方法・・・これはなさそうですね、どこかのディレクトリに中間ファイルとしてでものこっているといいのですが・・・
ともかく、dllかexeからmoduleファイルは生成する簡単な方法があったら、教えてください、無ければ頑張ります。
もう一つ、どこかのディレクトリにmoduleファイルが入っていないでしょうか、これは自分もこれから探してみます。
利用目的はノータッチ・デプロイメントで、ファイルを分割すると大抵の無料の貸しサイトでdllが読み込めない問題に対処するためです。
>>359 > VisualStudioから module を生成する方法・・・これはなさそうですね、どこかのディレクトリに中間ファイルとしてでものこっているといいのですが・・・
.netmoduleは中間ファイルじゃない。
> ともかく、dllかexeからmoduleファイルは生成する簡単な方法があったら、教えてください、無ければ頑張ります。
csc.exeでソースを/target:moduleをつけてコンパイルする。
既存アセンブリから作るのは無理。
> もう一つ、どこかのディレクトリにmoduleファイルが入っていないでしょうか、これは自分もこれから探してみます。
入ってない。
VSでは作成しないしできない。
> 利用目的はノータッチ・デプロイメントで、ファイルを分割すると大抵の無料の貸しサイトでdllが読み込めない問題に対処するためです。
ちなみにマルチモジュールアセンブリにしても、.netmoduleも実行時に必要だよ?
読み込めないかどうかは知らないけど。
361 :
デフォルトの名無しさん :2005/04/29(金) 00:24:37
自分で継承したコントロール 例えばMyButton (extends Button を簡単にマイユーザーコントロールに出す方法ってないですかね? XXX extends UserControlならXXXクラスはデザインビューにするだけで マイユーザーコントロールに追加されるのですが メニューの追加、から追加すると自分のプロジェクト内から参照できないので面倒です。 今のところ、一度extends UserControlでビルドして、デザインビューで開いた後 extends Buttonでコンパイルしなおして使っているのですが・・・
TabControl・・しょっぱいな BackColor実装されてないのか あるけど何も起こらないね タブの上にボタンを乗せたり タブの形を丸くしてみたり 選択中のタブの点線を消してみたりしたいんですけど、どうするのがいいんですかね
まともなTabControl機能が欲しい場合は独自実装するしかないからな。 "閉じる"ボタンすら付いてないって何だよそれ。
えーと、閉じるボタンというのはTabControlにデフォなのか? MDI兼用タブブラウザにはMDI由来の閉じるボタンが付いてたが、 使ってるタブ式エディタにもIrvineタブモードにも付いてないんだが。
367 :
349 :2005/04/29(金) 13:00:30
strin[]やめてArrayListにして 同じのが見つかるたびに両方から削除していって残ったものが違い ってことにしました。 >>TabControl 閉じるボタンって普通はないですけど、あるととても便利です。 まぁ慣れの問題でしょうけど。タブの右上に×マークがないと不安。
368 :
デフォルトの名無しさん :2005/04/29(金) 13:21:56
MessageBoxをShowした際に、指定した位置に表示するにはどうすればいいでしょうか? 親フォームの中央に出したいんですが、Show()の引数にもそれらしいものは見当たらないし・・・
>>368 無理。
自分で簡単なダイアログを作る。
370 :
デフォルトの名無しさん :2005/04/29(金) 19:47:46
unmanagedなライブラリのラッパを作っています。そのライブラリに、 //func_codeにより色々な処理をする。 int func(int func_code,void *param); という関数があります。 これをC#において、 int x=10; wrapped_func(FUNC_HOGE,ref x); みたいな呼び出し方がしたいのですが、ラッパー関数はどのように実装すればいいんでしょうか?
>>370 動作未確認
void wrapped_func( int func_code, ref int x )
{
unsafe
{
func( func_code, &x );
}
}
なんか間違っている気もするが。
372 :
370 :2005/04/29(金) 20:08:58
>>371 引数がintで固定されてればそれでもいいんですが、
func_codeによってWORDだったりBOOLだったり構造体だったりするんですよ。
とりあえず
public int wrapped_func(int code, ref int param);
public int wrapped_func(int code, ref short param);
って具合にparamの型によって関数をオーバーライドして対処してますが、
もしパラメータを複数取るような関数があったら型の組み合わせ爆発が起こりそうです。
System.Runtime.InteropServiceあたりを使ってどうにかなりそうな気もするんですが。
373 :
371 :2005/04/29(金) 20:12:23
>>372 func_code の仕様がよくわかんないけど、これじゃだめ?
void wrapped_func( int func_code, ref System.ValueType x )
{
unsafe
{
func( func_code, &x );
}
}
普通は(int func_code, IntPtr x)で宣言するものだが。 呼び出すコーディングがいささか面倒なのがネック。
375 :
370 :2005/04/29(金) 20:33:00
>>373 そのコードだと
> fixed ステートメントの初期化子内の fixed でないステートメントのアドレスのみを取得できます。
とのエラーが。
fixed(void* param=&val)
にすると、
> マネージ型 ('System.ValueType') の変数のアドレスまたはサイズを取得できません。
だそうです。
あと呼び出し元で
> 引数 '2' : 'ref ushort' から 'ref System.ValueType' に変換できません。
とのこと。
>>374 そう、面倒くさいんですよ。
今回は引数の型もたかだか10通り程度なので
>>372 で書いた方法で行こうと思います。
付き合ってくれてありがとう。
int 型から IntPtr を取得するのってどうやるんだっけ。
>>376 Marshal.AllocHGlobalで4バイト確保して、Marshal.WriteInt32。
使い終わったらMarshal.FreeHGlobal。
いっそunsafeにしてvoid*で宣言した方が手っ取り早いかもしれん。
>>377 Marshal 使うのか…気づかんかった。どうも。
alloc したら free でしょ
>>379 そりゃそうだ。AllocHGlobalしたのはGC管理外のメモリだから。
で、微妙なの思いついた。
[DllImport("hoge.dll")]
extern int func(int func_code, [In, Out, MarshalAs(UnmanagedType.AsAny)] object param);
渡す場合にボクシングしてobject型で渡すか、LayoutKind.Sequentialのclass(not struct)にする必要がある。
値型で渡してしまうと実行先で値が書き換えられてもこっちに反映されない、素敵バグの元。
382 :
デフォルトの名無しさん :2005/04/30(土) 02:17:49
クライアントとサーバで通信を行うプログラムを作成なのですが、お聞きしたいことがあります。 クライアントからコマンドを投げて、サーバから返事があります。 コマンドやサーバからの返事はテキストベースでのやりとりなので、NetworkStreamからStreamReaderやStreamWriterを作成しReadLine、WriteLineを使っています。 ただ、あるコマンドの場合は、その後続けてバイナリのデータをサーバ側に送る必要があります。 そのためその部分のみNetworkStreamのRead、Writeを直接使っています。 その際に、ソケットからストリームを再取得などしていません。 【こんな感じ↓】 サーバ側 TcpClient client; NetworkStream stream = client.GetStream(); StreamReader reader = new StreamReader( stream ); WtreamWriter writer = new StreamWriter( stream ); switch( reader.ReadLine() ) { case DATA: stream.Read( buf, 0, buf.Length ); writer.WriteLine( "OK" ); クライアント側 StreamReader reader = new StreamReader( stream ); WtreamWriter writer = new StreamWriter( stream ); byte[] data = new byte[1024]; writer.WriteLine( "DATA" ); writer.Flush(); stream.write( data, 0, data.Length ); こういうように、StreamReader/StreamWriterを利用しながら、その下の(?)ベースとなっているStream(この場合はNetworkStream)を直接さわっても問題ないのでしょうか。
今のプログラムで心配なら、全部バイナリで通信すれば良いんじゃない? と、昨日初めてHello WorldのMessageBox出した人が言ってみる。
>>382 自分はちょうど今HTTPを自分で扱うプログラムを組んでるところだったのでちょうどいいタイミングの質問だ。
HTTPはコマンドとヘッダがテキストで、その後にバイナリのデータが続くから、あなたの状況と同じじゃないかな。
んで、結論を言うと、問題なしです。
ストリームが
|テキストデータ|バイナリデータ|
って感じのストリームで、最初のテキストデータをStreamReaderで読めば、Streamのポジションはテキストデータの最後まで来るから、そこからStreamのReadメソッドを使えば、バイナリデータから読み始められる。
Writeのほうも同様だし、テキストとバイナリの順番が逆でもOK。
>>384 だめで~す
StreamReader は先読みを行ってますんで、バイナリデータまで問答無用に喰っちゃいます
全てバイナリで送信する (StreamReader を使用しない) か、
バイナリをエンコードして送る (Stream を使用しない) にして、どちらかに統一しないと
>>385 あ、ほんとだ。
おかしいなあ、あのときのプログラムがちゃんと動いてたのはなぜだろう。。。
387 :
デフォルトの名無しさん :2005/04/30(土) 15:35:47
string a = "abcdefghijklmnopqrstuvwxyz" string b = "opqrs" みたいなときに aにbが含まれるかどうかってどうやって調べますか? aの中にbが含まれるとしても一つしかないことはわかってます。
IndexOf
結婚
391 :
387 :2005/04/30(土) 15:47:19
なるほど!ありがとうございました^^ 現在計算機が作れるようになりました。 ここに住み着いていろいろと勉強させてもらいます。 これから、よろしくお願いいたします。
>>391 検索文字列が確定してるなら、Regexで検索したほうが処理速度は速い。
394 :
デフォルトの名無しさん :2005/04/30(土) 20:56:20
2度目の自動更新で、テキストボックスに T2005/04/30 19:53:11 となるようなものを作成しています。 どのようにすればよいのでしょうか? <META HTTP-EQUIV="Refresh" CONTENT="5">でリロードします。 下のようなコードを書いてみました。 private void Page_Load(object sender, System.EventArgs e) { if(IsPostBack==false) { TextBox1.Text="F"+System.DateTime.Now.ToString().ToString(); } else { TextBox1.Text="T"+System.DateTime.Now.ToString().ToString(); } }
>>393 意外。Regexてどんな実装なのかね。
IndexOfはBoyer-Moore法で検索してると思ってた。
>>395 charが16bitだから、スキップのテーブルがでかくなるからだと思う。
ベタサーチしてるのは。
ToString().ToString(); ???
398 :
デフォルトの名無しさん :2005/04/30(土) 22:27:42
>>397 TextBox1.Text="T"+System.DateTime.Now.ToString();
の間違いでした。
でもうまく動作しないのはなぜ?
>>398 なにがどのようにうまく動作しないのかさっぱりわからないし、
Webアプリなのかどうかすら明示されていない質問なので
答えられません
(多分Webアプリなんだろーけど)
401 :
デフォルトの名無しさん :2005/04/30(土) 22:43:24
ASP.NET WEBアプリケーションで作成しています。 ブラウザでみてから5秒後のの自動更新で、テキストボックスに T2005/04/30 19:53:11 となるようなものを作成していますが F2005/04/30 19:53:11 となってしまいます。なぜでしょうか?
たぶんDateの問題ぢゃないですね IsPostBack がどういう定義になってるのかわからんのですが
ん~? 401をみるとなんかIsPostBackの意味を逆に取ってないか……? ていうかRefreshさせたときにIsPostBackって有効だっけ?
404 :
デフォルトの名無しさん :2005/05/01(日) 00:04:57
>>403 >ていうかRefreshさせたときにIsPostBackって有効だっけ?
それが知りたい。
もしかしてダメなの
PostBackの前にブラウザのキャッシュを疑う俺は間違ってるんだろうか。
406 :
382です :2005/05/01(日) 01:59:56
>>383-386 ありがとうございます。
StreamReaderは先読みしちゃってるんですね…。
でも、とりあえず作ってみたプログラムは正常に動いていたみたいなんですよね…。
受信したバイト数が送信したものと同じだったので…。
でもたまたま、だったんですかね…。
ところで、C#のこういったネットワークプログラムの本でなにかイイの無いですかね。
407 :
デフォルトの名無しさん :2005/05/01(日) 05:51:37
VB6.0で作成した Project1.ocx(COM)を使用して C#にてプログラミングしています。 それをビルドすると 下記のようなファイルが作成されるのですが これは、どのような意味があるのでしょうか? 実行ファイルと同じ配下にコピーすれば 実行可能でした。 またローカルコピーをFalseにした場合は 下記ファイルができないみたいですが この場合はどのように すれば実行できるのでしょうか? また参考になるHP等があればご返答よろしくお願いします。 Interop.Project1.dll AxInterop.Project1.dll
>>407 COMのDLLを参照設定したときにできるDLLは、COMが公開しているコクラス/インターフェイス情報を.NETのアセンブリに翻訳したもの。
参照設定したときに、.NET SDKに含まれるtlbimp.exeを使って、自動的に/objディレクトリに作成される。
ローカルコピーのtrue/falseは単に/bin/Debug(あるいはRelease)にコピーするかどうか。
実装はCOMが提供し、COMとのやりとりはRCWという.NETの機能が管理し、クライアントはDLLを使ってメタデータを参照して実行する。
だから、メタデータ不要なレイトバインディングにはDLLは必要ない。C#でやるにはリフレクションベースのコーディングになって死ぬほど不便だが。
410 :
デフォルトの名無しさん :2005/05/02(月) 01:35:16
以下のようなフォームを作りたいと思っています。 1. 親フォーム(親アプリ)の常に前面にいるが、TopMostで最前面表示されているわけではない。 2. 親フォームを最小化した際には同時に最小化される。 要はVisualStudioの検索フォームのようなものです。 2は親フォームの最小化イベントと関連付けて以下略、なんですが、1はなかなか難しい気がします。 MDIウィンドウにすることも考えましたが、MDIだと子フォームが親フォームからはみでることができません。 親と子の状態を常時監視して、うまく配置してやるしかないんでしょうか?
.NET 1.1 SP1 でましたね
おそらくVS2002のことと勘違いしてると思われる。
ワラタ
VS2002 に SP を適用させたら Windows Update が出来なくなった
IEのLANの設定でプロクシ指定しているなら WinXPのSPのときと同じかも
ノータッチデブロイメントで作ったコントロールをIE上に配置して、 そのページをIEで印刷したいと思ったのですが、コントロールは中身無しの状態で印刷されてしまいます。 これをうまく印刷する方法はないでしょうか?
419 :
デフォルトの名無しさん :2005/05/03(火) 01:56:37
VS2002 を使いつづけてる人ってWAREZERですか?
420 :
382です :2005/05/03(火) 02:29:05
以前StreamReaderのことで質問した者です。 StreamReaderは先読みするとのことですが、その先読みはStreamReaderがインスタンス化されているだけで先読みしてしまうのでしょうか。 それとも、ReadLine等のメソッドを実行した時点で、そのときStream上にあるデータを先読みするのでしょうか。 つまり、ReadLineを実行した時点ではまだStream上にないデータについては先読みされないので、その後StreamReaderメソッドを実行する前であれば、NetworkStreamのメソッド(Read等)で読み込んでも大丈夫なんでしょうか?
>>420 せいぜい20行の簡単なコンソールプログラムで、そんなの確かめられるんだから、やってみたら?
>>420 MSDNにきちんと動作仕様書いてあるよ。一度見たほうがいいよ。
DataGridにデータを追加するとチラツキが起こって具合が悪いです。
WM_PAINTやSetStyleを変更しても起きてしまいます。そうゆう仕様という
ことであきらめるしかないのでしょうか?
WM_SETREDRAW
stringからenumに変換するにはどうすればいいでしょう? enum A { HOGE,HAGE } //enum to string string foo(A a) {return a.ToString();} //string to enum A bar(string s) { return A.Parse(s); //無理ぽ } switchかなんかで強引にやるべきなのか。
426 :
420です :2005/05/04(水) 02:43:27
>>421 実際にやってみるとうまくいくのですが、386のようにうまくいってしまう場合もあるようで…。
>>422 MSDNのリファレンス > クラスライブラリ には具体的にどの時点で先読みを行うのか、という箇所は見つけることが出来ませんでした…。
探し方が悪いのでしょうか…。
MSDNのどのあたりか、ヒントだけでももらえませんでしょうか
>>425 (A)TypeDescriptor.GetConverter(typeof(A)).ConvertFromString("HOGE")
こんな感じで変換はできる。
でも、switchで強引にやった方が速いんだけど。
>>425 >>427 いや、えーと、
return (A)Enum.Parse(typeof(A), value);
Enumクラスのメンバを一回見とくことをすすめる。ただ遅いけどな。
C#の変数を宣言するときは、頭にハンガリアン表記を着けてますか? HPで見たコーディング規約には、ハンガリアン表記はしない。と 書いていたんで、他の人はどうなのかと思って質問しました。
>>429 俺は付けてないよ。初めて触った言語がC#なもんでね。
インターフェースのIは使うけどね。
版画利アンは爆裂するだけで、いいことあまり無いからやってないな。 Cで書くときは今でもハンガリアンだけど
MSのコーディング規約にハンガリアン使うなとあったから使ってない。
規約に書いてるのは基本的に「外から見える」メンバだけだよ。 privateメンバについては定められていない。 実際mscorlib.dllのクラスを覗いてみればprivateメンバにm_プリフィクスとか普通に付いてる。ハンガリアンはあんまり見ないが。 privateメンバには、コントロールにだけは種類がすぐ分かるようにtxtとかlblとかプリフィクスつけることがある。
たしかに、UIコントロールにはプレフィックスつけるようにしてるな。
俺は大体VSのデフォルトの名前をそのまま使ってる
Form1最強伝説。
Form1はやばいだろw
Form1ワロタ さておき、コントロールの変数名はどうするか迷う。
>>439 俺は [クラス名の先頭を小文字にしたもの] + [通し番号] を変数名にしちゃう
GUI はあと付け的に考えてっから
俺だってさ、GUIはあと付け的に考えてっから、VSのデフォルト値のままなんだよなw Form1最強
442 :
440 :2005/05/04(水) 21:17:32
Form1 は変数名じゃなくてクラス名だw そこんとこよろしくw
書籍で見た C# コーディング規約で、定数が "全て大文字、 単語区切りはアンダースコア" となっていたけど、 納得いかない。漏れは Pascal 記法にしてる。 プロパティと命名規則を同じにすれば、 定数からプロパティへこっそり変えることもできるし。 誰か同士はいないか。
そういや定数使ってないなぁ
>>443 同じく。
ていうか全大文字はMSの勘違いじゃないかと疑っている。
だってInt32.MinValueを見れば明らかに他のと命名規則同じだもん。
446 :
443 :2005/05/05(木) 00:27:20
ありゃ、ほんとだ。 多分私もそれを読んで違和感を覚えたんだが、MSが定義した規約とごっちゃになってた。
>>443 俺も全部大文字はいやだったから
__(アンダーバー*2) + camelにしてたけど
なんかとかぶってるし見にくいから大文字にした。
449 :
デフォルトの名無しさん :2005/05/05(木) 01:58:56
変に変数名などに凝る奴に限って使えないんだよね 入社して3年も立つのにCOMサーバもかけない奴に 「メンバ変数には~をつけてください」 なんて言われても はぁ? って感じなんだけど。
俺も書けないが
普通かけない
453 :
デフォルトの名無しさん :2005/05/05(木) 17:38:41
低レベルな質問ですが #region,#endregion ←コイツら、なんて言うんですか?
ヘルプ見ろ。
>>452 俺の隣にいる野郎はエイリアン記法を使ってるに違いない。冗談はさておき、
最近のコーディングはIDEの専用エディタの使用を前提にしているので開発環境が
想定してる記法にしておいたほうが無難、C#ならMSのやり方にしとけば問題ないと思う。
ただC#とJavaでキャメルとパスカルの使い分けが微妙に違うので混乱する。
クラスは明確に定義されているし型やフォーカスの情報はIDEが教えてくれるから
ハンガリー記法はもはや不要。
正直 camel でも Pascal でもハンガリーでも別に良いんだけど、 同じプロジェクト内ではせめて統一して欲しいと思ってる …… IDE の自動補完があっても、一瞬戸惑うし
担当が好き勝手に名前付けるのはやだな privateならいいけど
メソッドって、camel と Pascal どっちが多いのかな。 おいらは Pascal 派だけど。
すいません。ちょっと教えてください。 WinForm の DataGrid でヘッダーカラムクリックした時のソート処理を フックすることってできますか? 具体的には DataGrid に明細行と合計行があってソートの条件に関係無く 常に合計行を最後の行に表示したい場合とかどうすればいい?
断然Pascal
>>458 privateはcamel、publicやprotectedはPascal ってしてる
>>461 俺もそうしてる。
当初はメソッド名はprivateでもcamelだったけど変えた。
463 :
462 :2005/05/06(金) 09:31:44
×当初はメソッド名はprivateでもcamelだったけど変えた。 ○当初はメソッド名はprivateでもPascalだったけど変えた。
464 :
デフォルトの名無しさん :2005/05/06(金) 16:29:32
画像をカジノなんかにある、スロットのように スクロールすることってできますか?
できるよ
466 :
デフォルトの名無しさん :2005/05/06(金) 16:38:08
エクスプローラーの切り取り後みたいな感じの処理って、どうやるんでしょ? ListViewItemにそういう処理ってありますか?
ん?アイテムを灰色にするってこと?
>>468 エクスプローラーで切り取り処理をやるとアイコンの色が半透明というか減色というか、
とりあえず色が変わってるので、そういう処理がListViewについてるのかなーと。
Layeredwindow
DESのCryptを.netでサクッとやる方法を教えてください。
System.Security.Cryptography.DESクラスとSystem.Security.Cryptography.CryptoStreamクラスでごにょごにょする。
473 :
デフォルトの名無しさん :2005/05/06(金) 22:06:32
javaやってて、これからC#をやろうと思いますが、間違えやすいポイントはありますか?
別に
OpenFileDialogを表示するとき位置やサイズを指定したいんですがどうすればいいでしょうか。
>>475 諦める。
Win32APIのGetOpenFileName関数とOPENFILENAME構造体を駆使すれば可能だと思うけど。
478 :
デフォルトの名無しさん :2005/05/07(土) 12:35:55
>>451 入社3年でそれだと、首にしてほしいんですけど・・・
Sealed にすると実行速度が速くなったりしますか?
>>479 仮想メソッドなしという前提でコンパイルされるから、若干速くなるらしい。
OK!Sealedにしまくるぜ
482 :
デフォルトの名無しさん :2005/05/07(土) 17:21:12
画像をカジノなんかにある、スロットのように スクロールすることってできますか? その場合、どの部分を操作したらいいでしょうか。
クライアント領域を目に優しい範囲でBtlする
484 :
デフォルトの名無しさん :2005/05/07(土) 21:29:16
コンソールを拡張するプログラムを作っています。 MSDN のサンプルを参考にして、自分の System.Console に バックグラウンドで実行させた CMD.EXE の出力を 表示させることができました: : : : string input = Console.ReadLine(); process.StandardInput.WriteLine(input); process.StandardInput.Close(); process.WaitForExit(); System.Console.WriteLine(process.StandardOutput.ReadToEnd()); しかし、(i) CMD.EXE が全て出力し終わらないと表示が始まらない上に、 (ii) process.StandardInput.Close() しないと途中で固まってしまいます。 この2点を何とかできないものでしょうか。
>>484 > (i) CMD.EXE が全て出力し終わらないと表示が始まらない
WaitForExit()してるんだから当然。
inputで起動したプログラムが実行されている間はWaitForExitで待機してる。
実行が完了してから=プロンプトに表示し終わってからReadしてるわけだ。
> (ii) process.StandardInput.Close() しないと途中で固まってしまいます。
普通にcmd.exeを起動してみる。
WaitForExit……無限に待機するのは分かるよね。
ユーザがexitを入力するまではcmd.exeは終了しないんだから。
その代わりになっているのがこの場合のStandardInput.Close。
これ以上入力されない=終了だから(動かしてるプロセスがなければだけど)。
だからStandardInput.Closeしなければ幾つでもコマンドは発行できるわけで。
その間WaitForExitと言われてもcmd.exeそのものは終了できない。
486 :
484 :2005/05/08(日) 01:13:22
>>485 ありがとうございます。
process.StandardInput.Close();
// process.WaitForExit();
としましたが、動作自体には変わりありませんでした。
最後に一気に表示するのではなく、例えば ping で一行一行
リアルタイムに表示されるようなものを考えています。そのようなことは不可能なのでしょうか。
ストリームの追加部分の差分のみを表示すればうまくいくと考えたのですが、
ストリームの末端にたどり着いたことを検地する手段が見つからず、結局
挫折してしまいました。
質問を重ねてしまい大変申し訳なく思っていますが、もしよろしければ
どうかご教授のほど願います。
>>486 ReadToEndも、ストリームがEOFになるまでブロックするんだが。
ReadLineで一行ずつ拾っていってやればいい。
ただ、StandardInputに書き込む事で起動した(cmd.exeが起動させた)プロセスが終了したかどうかの判断は多分できないので、
よく考えとくこと。
488 :
デフォルトの名無しさん :2005/05/08(日) 12:33:50
linkLabel1.LinkVisited = true; // URL表示 System.Diagnostics.Process.Start(this.linkLabel1.Text); としているのですが 'System.ComponentModel.Win32Exception' のハンドルされていない例外が system.dll で発生しました。 と出てIEが出てきません。 linklabelのtextにはhrrp://~から始まるアドレスを入れているので間違いはないと思います。 何が原因なのでしょうか?
確かにhrrp://なら例外が出るだろうが。 例外メッセージはそれだけ?
490 :
488 :2005/05/08(日) 13:15:37
関連づけ……? ファイルが見つかりませんかパラメータが間違ってますなら分かるんだが……。 スタート>ファイル名を指定して実行で直接URLを指定すればブラウザが開くよね? やはりlinkLabel1.Textが変なことになってるとしか考えられないな。 Process.Startする直前のlinkLabel1.Textの値をブレークポイントとかで確認してみたらどう?
492 :
484 :2005/05/08(日) 14:37:29
>>487 ReadLine を使用してとりあえず成功しました。仰られたとおり、終了がキャッチ
できないのと、 while(StandardOutput.Peek() != -1) で回しても出力が
一時停止した時点で終了してしまいました。 これを機にシステムの構造を見直してみます。
ありがとうございました。
>>490 標準のブラウザが見つからないってことじゃないのか?
タブブラウザとか入れて標準のブラウザの設定を変えた後にそのブラウザを削除したとか。
494 :
490 :2005/05/08(日) 16:45:40
>>491 >>493 レスありがとうございます。
以前にFireFoxを入れて削除した経緯がありまして
IEなどの標準ブラウザを指定してやったら
うまくいきました。
原因はC#ではなかったようです。
アドバイスありがとうございました。
P/Invoke で ImmSetCompositionWindow 呼び出して、Form に対して未変換文字の表示位置を Point にて設定しようとしたんですが、何故か Y 座標だけしか設定されなくて困っています 直後に ImmGetCompositionWindow 呼び出して逆取得したら、ちゃんと X, Y ともに設定されていたので P/Invoke の仕方そのものは間違っていないようなのですが、予想される問題点が分かる方、ご教授ください
>>495 COMPOSITIONFORM.dwStyleにCFS_POINTを設定してる?
> The coordinates (略) are subject to adjustment by the IME.
って書いてるけど。
//手元ではCFS_POINTでもいけてるしCFS_FORCE_POSITIONと実行結果が変わらないんだが……。
497 :
495 :2005/05/08(日) 20:38:39
>>496 はい。CFS_POINT = 2 は設定してあります
中身は↓なことやってます
=====
// WM_IME_STARTCOMPOSITION が送られてきたときに
CompositionForm cf = new CompositionForm();
cf.Style = CFS_POINT;
cf.Pos = CompositionPoint;
int hIMC = ImmGetContext(Owner.Handle); // Owner は Form クラスのインスタンス
ImmSetCompositionWindow(hIMC, ref cf);
// cf.Pos = Point.Empty; // 以下3行はチェック用
// ImmGetCompositionWindow(hIMC, ref cf);
// MessageBox.Show(cf.Pos.ToString());
ImmReleaseContext(Owner.Handle, hIMC);
498 :
495 :2005/05/08(日) 20:40:50
あ、ちなみに >何故か Y 座標だけしか設定されなくて っていうのは、Y 方向への調整は出来ても、右端が必ずフォームの左端に接してしまうという意味です
499 :
495 :2005/05/08(日) 20:45:35
>>498 『右端が左端』 じゃなくて 『左端が左端』 だなw
496の > The coordinates (略) are subject to adjustment by the IME. は読める? 「座標はIMEによる調節に従う」って書いてあるんだけどさ。 MSDNでCOMPOSITIONFORM構造体をチェックした?
501 :
495 :2005/05/08(日) 21:04:31
>>500 あ、チェックしました……が、なんか見落としている予感……
ちなみに、CFS_FORCE_POSITION 指定しても変わらなかったです
う~ん、再現しないから検証できないや。 ImmGetCompositionWindowで取得したCompositionFormをそのままImmSetCompositionWindowしても左に寄るの?
質問です。 Bitmap の PixelFormat を非 Format32bppArgb から Format32bppArgb に変換するには どうしたらよいでしょうか。 bitmap 変数に元の Bitmap が入っているとして、 Bitmap newBitmap = new Bitmap( bitmap.Width, bitmap.Height, PixelFormat.Format32bppArgb ); Graphics graphics = Graphics.FromImage( newBitmap ); graphics.DrawImageUnscaled( bitmap, 0, 0 ); graphics.Dispose(); Bitmap oldBitmap = bitmap; bitmap = newBitmap; oldBitmap.Dispose(); とすればやりたいことは実現できるのですが、もっとスマートなやり方は ないかと思い、質問させていただきました。
それが一番シンプルじゃね?
WndProc(ref Message m) で送られてくるm.Msgの 定数値はどうやって知ることができますか?
>>505 別名で定義されてるので、知る必要は無い。
えーと、例えば const int WM_HSCROLL = 0x114; のように定義して下のようにswitchで判別するという よく紹介されている方法がありますよね。 switch (m.Msg) { case WM_HSCROLL : // 処理 break; } で、この場合、 WM_HSCROLL が 0x114 であるということを知らないといけないわけですが、 その情報はどうやって得ればよいのかということです。 実は.netに識別子が用意されたりしているのでしょうか。
ぐぐればすぐ見つかるだろ。
まぁ、メッセージの名前で検索すれば出てきますけども、 だから検索すればいいじゃないかっていうのは釈然としませんねぇ。 定数の出所がわからないってそんな。
Platform SDK をダウンロードしてヘッダファイルを調べれ。
だが、アレさがすのめんどくさいよな。
そうでもない。
>>510 生Windows.hを見るしかないのかぁ…。ありがとう。
気が向いたらC#で定義し直すことにしよう。
textBox1.Textに 2005/05/09 12:34:56 という風にテキストで時間を入力しているのですが これをDateTimeなどに変換するのはどうすればいいのでしょうか? このようなレベルの低い質問で恐縮なのですが アドバイスいただければと思います。
DateTime.Parse
Windows インストーラ プロジェクトで デフォルトのインストール先を D:\MyApp のように C:ドライブ 以外に指定するにはどうすればよいのでしょう?
Cのときみたく、バイト配列に読み込んだデータを構造体ポインタ使ってアクセスすることって出来ないんですかね?
520 :
518 :2005/05/09(月) 20:48:24
>>519 サンクス
「ずばり」では、ないようですが参考にさせて頂きます
WIN32API.TXT とかってファイルがどこかに落ちてたような… そいつと.NET用のAPIViewer見たいの使えば楽
>>518 構造体がクラスインスタンスを含まないのならunsafeとfixedを使えば可能。
配列を扱うのが極めて面倒だが。
523 :
495 :2005/05/09(月) 23:53:29
レスが遅くなってすみません 原因が未だにわからないので、とりあえずこちらの (上手く動いていない) コードをあげてみます かなり汚いコードですが、どうかよろしくお願いいたします m(_ _)m tp://ranobe.sakuratan.com/up/updata/up36724.lzh
>>523 なんで CompositionForm の DWORD dwStyle が ulong == System.Int64 で宣言されてるんだ……。
そりゃ POINT ptCurrentPos の上位4バイト == ptCurrentPox.x が0で埋められるわ。
ついでに言っておくと、
・POINT構造体とSystem.Drawing.Point構造体は同じ構造だけど、
RECT構造体とSystem.Drawing.Rectangle構造体は別構造。
・ハンドルはSystem.IntPtrで宣言すべし。
・LogFontのStructLayout属性にCharSetの定義が抜けてる。
・CompositionForm.Styleとかは列挙体で宣言・定義した方が自然じゃない?
・ImmGetCompositionWindowの仮引数CompositionFormはrefよりoutの方が、
事前の初期化がいらないし入力が無意味であるとはっきりできる。
//ImmGetCompositionStringで取得できる文字列って必ずしもNULLターミネートされてないっぽいな……(w;;
おっと、ulongだからSystem.UInt64だったな。
すごい初心者な質問だと思うんですが 起動時にtextBox1にフォーカスした状態にするには どうすればよいのでしょうか? 3ヶ月もやっててこんなこと聞くのは恥ずかしいんですが よろしくお願いします。
>526 textBox1.Focus()
533 :
495 :2005/05/10(火) 18:00:29
>>524 >ulong
OTL
いろいろと有り難うございました m(_ _)m
何とかいけそうです
……IME のハンドル、ぐぐって見つかった GotDotNet の掲示板だと int でやってたもんで orz
DataGrid を継承したクラスで、CurrentCellChanged イベントに次のコントロールにフォーカスを移す処理をさせたいのだが、 protected override void OnCurrentCellChanged(EventArgs e) の中に this.TopLevelControl.SelectNextControl( this, true, true, true, true ); とか書いても、一瞬次のコントロールにフォーカスが移るのだがまたなぜかDataGridにフォーカスが戻ってくるんだけど、 原因/対処法分かる人いませんか?
>>531 タブオーダー設定して、最初のコントロールにフォーカスがくるってことで
十分だったからね。
質問です。 Windowsアプリ作成中なのですがSQLServerからDataSetを取得して、 そのテーブルにDataRowを追加するのですが、下のエラーがでます。 System.OverflowException: Int16 型の値が大きすぎるか、または小さすぎます。 値がInt16の範囲にあるかどうかを調べればいいのかと思うんですが、 将来的にテーブルのInt32に拡張される可能性があるんで、それでも稼動できるようにしたいんですが、 こういう場合の値のチェックの方法などはどうやっておけばいいんでしょうか? DataSetは SqlDataAdapter adp = new SqlDataAdapter( sql, con ); DataSet dataSet = new DataSet( table ); adp.FillSchema( dataSet, SchemaType.Source, parameterTableName ); adp.MissingSchemaAction = MissingSchemaAction.AddWithKey; adp.Fill( dataSet, parameterTableName ); DataRow changeRow = dataSet.Tables[ tablename ].NewRow(); changeRow[ columnName ] = 値; //ここでエラー dataSet.Tables[ tablename ].Rows.Add( changeRow );
>>536 される可能性があるって言うか現在既にInt16に入りきらない数値を入れようとしてるんだろ?
Stringクラスのエイリアスであるstringの存在理由がまるっきり分からないのだが誰か教えてくれ
慣習。以上でも以下でもない。 System.String s; string s; どっちでもいいよ。 nullableの?も中身はジェネリクス System.Nullable<int> n; int? n; これもどっちでもいいよ。
540 :
デフォルトの名無しさん :2005/05/11(水) 12:40:06
PictureBoxの中で画像をスロットのようにスクロールすることはできますでしょうか? できるとすれば、どのようなメソッドがありますか?
>>540 がんばって自前で描画。タイマつかうとか。
質問お願いします。 ShowDialogでフォームを新しく開くんですが、 きちんとモーダルにならず、呼び出し元フォームをクリックすると そのまま切り替わってしまいます。 form.ShowDialog(this)で呼び出すと、前面表示にはなるんですが、 やっぱり呼び出し元を選択できてしまいます。 ボタンやコントロールのイベントから呼び出すとokなんですが、 メソッド内から呼び出す場合はモーダルにはならないんでしょうか。 色々調べたけども情報見つからず、、初心者ですいませんがお願いします。
情報不足なのでもっと詳しく。 再現コードが書けるならそれが一番良いが。
>>542 親 Form を作ったスレッドとは別のスレッドから ShowDialog するとそうなります
頑張って親 Form のスレッドが ShowDialog するように改造してくださいな
>>542 だけで、別スレッドから呼び出してるってのを思いつくのってすげえな
>>545 >ボタンやコントロールのイベントから呼び出すとok
ここからです
多分別スレッドから呼び出しているで FA
非同期デリゲート使ってて気づいてない可能性もあり
547 :
542 :2005/05/11(水) 19:16:46
542です、FAがそのまま正解でした。 スレッドを詳しく知らないまま使ってたのが原因か。 ここから改造するのは骨が折れる。。(´Д`) しかし、皆さんさすがですね、こんなに早く解決すると思ってませんでした。 ありがとうございましたー。
Visual C#で TextBoxに入力される文字を バイト数で制限することって可能なんでしょうか?
できるよ。 やり方は…そのまんまだな>バイト数で制限
MaxLengthだったかに設定するだけだな。
>>547 this.Invoke(new MethodInvoker(form.ShowDialog));
とか強引にやってみる。
ちゃうわ、戻り値あるからそのままじゃダメか…
MaxLengthは文字数であってバイト数じゃないよ
文字数の倍がバイト数だから問題ないよ
もっとおいしそうな餌をくれYO
おっと・・・
Streamをコピーするには Readでbyte[]受け取ってWriteするしかないんですかね? めんどうじゃないですか?
事実上1文字2バイトなわけだが。
Shift-JISに変換してカウントすりゃいいんじゃねーの?
561 :
548 :2005/05/12(木) 10:08:50
>>548 自己解決しました。
TextChangedで
byte[] bTemp = System.Text.Encoding.Default.GetBytes ( TextBox1.Text );
int len = bTemp.Length;
// 40バイトに制限
if ( len > 40 )
{
TextBox1.Text = System.Text.Encoding.Default.GetString ( bTemp, 0, 40 );
// ↑で入力カーソルが先頭にいっちゃうので末尾にもっていく
TextBox1.Select ( TextBox1.Text.Length, 0 );
}
で出来ました(・∀・)
かまってくれた皆様サンクス。
>561 余計なお世話かもしれないけど、無条件に カーソルを末尾に飛ばすのは不味いんじゃないのかな? 末尾以外でのTextChangedでも後ろへ飛んでっちゃうし。
563 :
デフォルトの名無しさん :2005/05/12(木) 13:59:00
delegate void ThreadMethodDelegate(ArrayList files); ThreadMethodDelegate d ; private boid make_list() { ArrayList files = new ArrayList(); //送信ファイル一覧作成 //forループの中でファイルを順次読み出し、10MBになるごとにひとつのリストにして //送信スレッドにリストを渡す。 同時に複数のスレッドが送信する。 d = new ThreadMethodDelegate(send_files); d.BeginInvoke(files,null,null); } private void send_files(ArrayList files) { //送信処理。 } ってしてるのですが、送信処理すると同じファイルが何度も送られてしまいます。 リスト作成メソッドでd.Invokeする時点だと毎回望みどおりのリストを渡しているのですが、 send_filesスレッドの頭で受けたfilesを書き出すと同じリストを何度も受けているようです。 そのため、リストは渡しているはずなのに、送信されないファイルが多数出てます。 何を見直せばいいんでしょうか?
forループの中でどういうリストを作ってるんだ? そのリストはどうしてるんだ? そのコードだけみたらBeginInvokeは一度しか呼ばれてないようだがそれでいいのか?
565 :
563 :2005/05/12(木) 14:21:37
private boid make_list() { for(int i = 0 ; i < n; i++){ ArrayList files = new ArrayList(); files.Add(hoge[i]); if(10MB以下かどうかの判定){ d = new ThreadMethodDelegate(send_files); d.BeginInvoke(files,null,null); } } } 大まかな動作としてはこんな感じにしてます。 d.BeginInvokeにBreakPointでfilesをチェックしました。 よろしくお願いします。
566 :
563 :2005/05/12(木) 14:30:21
何度もすいません。 private boid make_list() { ArrayList files = new ArrayList(); for(int i = 0 ; i < n; i++){ files.Add(hoge[i]); if(10MB以下かどうかの判定){ d = new ThreadMethodDelegate(send_files); d.BeginInvoke(files,null,null); files.Clear(); が抜けてました。 } } } d.BeginInvokeした直後にリストをクリアして次のリストを作ってるのですが、 クリアした後でfilesの内容がsend_filesスレに伝わってるときもあるみたいです。 d.BeginInvokeした後、実際にsend_filesが"開始”したことを確認する方法ってあるのでしょうか?
567 :
548 :2005/05/12(木) 14:31:47
>>562 たしかに…‥
int sel = TextBox1.SelectionStart;
TextBox1.Text = System.Text.Encoding.Default.GetString ( bTemp, 0, 40 );
// ↑で入力カーソルが先頭にいっちゃうのでカーソル位置にもっていく
TextBox1.Select ( sel, 0 );
これで、それっぽくなりました。
>>566 files.Clear();
をけせ。BeginInvokeは非同期だ
send_filesとd.BeginInvokeとfile.Clear()は同時に実行されうる。
簡単に言えば、渡したものとそこでクリアしてるArrayListが同じもので、
それにたいして、send_filesとfiles.Clear()を同時に実行してるんだ
どうなるか、に関しては状況によって異なるんで分からんが、
クリアされてからfiles_sendが実行されるとか、files_send中にクリアされるとか
そんな感じになるだろ
569 :
563 :2005/05/12(木) 17:47:16
レスありがとうございます。 ArrayListは参照型だから参照元が書き換わると(files.Clear()されると) スレッド内でも変わってしまうって理解でいいですか? send_fileスレッドの頭で ArrayList files_ = (ArrayList)files.Clone(); としてみました。
つかループ毎にArrayListを宣言・初期化すればいいじゃん。
Windowsアプリを作る時に設定の保存って皆どうしてる? App.config使うと読む時は便利だけど書く時ってアプリ側から出来ないじゃん。アプリ閉じてる時にメモ帳で触るしかない。 何か共通で用意されてる方法ってあるんですか?昔のiniファイルの操作方法みたいに。 あるんだったら誰か教えて下さい。
シリアル化してる。
>>571 俺は設定を保存するXMLファイルを使ってる。
構成ファイルは俺は再コンパイルなしに定数的なものを書き換えるものとして使ってる。
どこに保存するかの問題もあるから共通の用意された方法はないんじゃね?
俺も独自のXMLに書いてる。 2.0からは.configにかけるらしいが。
575 :
デフォルトの名無しさん :2005/05/12(木) 21:58:38
>>571 俺は class Settingみたいなもんを作ってフィールドに設定
項目を保存してbinaryformatterでシリアライズしてるかなぁ。
個人別の設定はGetFolderPath(SpecialFolder.Personal)に
保存。
> ArrayListは参照型だから参照元が書き換わると(files.Clear()されると) > スレッド内でも変わってしまうって理解でいいですか? なーんか微妙に引っかかるな… 参照型って結局参照先に何かオブジェクトがあって、 変数とかはそれを指してるってことだぞ。 参照でオブジェクトをメソッドに渡すってことは、 こちらとメソッドの実行先で同じオブジェクトを操作してるんだから… スレッド内でも変わってしまうとかっていうよりも もともと同じ物を見てるんだから。
>>575 個人的にはXMLシリアライズの方が好み。
単に設定ファイルを手でいじれるからってだけだが。
XmlSerealizerは固まるからなぁ
579 :
デフォルトの名無しさん :2005/05/13(金) 00:30:54
>>577 ま、好みだね。
ただ、シリアル化したもんを変にいじって例外上がると
設定が全部吹っ飛んじゃうから、設定ファイルを手で書き換える
ことを考慮に入れるなら、シリアル化より伝統的なiniファイルのほうが
いいかなと思う。
そこでXmlTextReaderですよ
>>569 10MBのデータCloneなんてするな。Queue使ってなんちゃって排他制御じゃだめなのか?
public struct Data{public string FileName;public int FileSize;}
delegate void StartSend();
public class ListFactory{
StartSend startSend;Thread MakeSendListThread;Queue ListDataQue;Random rand;bool NowSend = true;
public ListFactory(){
this.MakeSendListThread = new Thread(new ThreadStart(MakeListData));
this.MakeSendListThread.Start();this.ListDataQue = new Queue(); rand = new Random();}
private void MakeListData(){
while(true){
if(NowSend || this.ListDataQue.Count == 0){
NowSend = true; Data data = new Data();
int size = rand.Next(1, 10000);data.FileName = "name" + size.ToString(); data.FileSize = size;
lock(ListDataQue)
this.ListDataQue.Enqueue(data);
if(this.ListDataQue.Count == 5){
startSend = new StartSend(SendList);
startSend.BeginInvoke(null,null);
this.NowSend = false;}}
else
Thread.Sleep(1000);}}
private void SendList(){
lock(ListDataQue){
for(; ListDataQue.Count > 0;){
Data data = (Data)ListDataQue.Dequeue();
Console.Write(data.FileName + ", ");}
Console.WriteLine();
this.NowSend = true;}}}}
書式の選択で整形してくれや。まぁ動くはず
583 :
563 :2005/05/13(金) 10:47:27
みなさんどうも、補足を。
>>570 forループの中でi=1~5でリスト1 2~40でリスト2… 見たいな感じなので
>>576 ありがとうございます。そのとおりですね。値型と参照型今後は心します。
>>581 コピーしてるArrayListは合計すると10MBになるファイルのフルパスしか入ってません。
c:\hoge.dat c:\hoge2.dat...とかの合計が10MBなのでArrayListの実態としては
多くてもfiles.count<=100のstringしか入れてません。
BitmapのPixelFormatを変換する関数はあるでしょうか? 最悪の場合自分で書いてもいいんだけど組み合わせ爆発が起こりそうなので できれば既存のものを使いたい……
ないと思うよ。 単純なのは新しくPixelFormat指定したBitmap作ってGraphics.DrawImageUnscaledすること。
586 :
571 :2005/05/14(土) 00:42:03
アプリの設定の話ですがXmlSerealizer使う事にしました。 これだとintはintのまま保存できるからStringを変換とかしなくていいから楽でいいや。 ありがとう。
The Knowledge Base (KB) Article You Requested Is Currently Not Available
エンタープライズなら使えるかもしれないけど スタンドアロンだとちょっとオーバースペックすぎな気がする
592 :
デフォルトの名無しさん :2005/05/15(日) 13:43:50
質問です! C#の勉強を兼ねて、仕事場の仲間内に配布できるようなテキスト入力支援 ツールを組んでみようかと思ってます。半分以上は趣味みたいなものです。 こういう目的で購入する場合、下記のパッケージで適切でしょうか? ・Visual C#.NET 2003 Standard 通常版 VisualStudioは10万以上するので趣味でかじるには、ちょっと手が出ません。 無料の環境もあるようですが、ヘルプの充実度など学習面で大きく差がある ようなら、上記のパッケージを2万円程度で買ってしまおうと思ってます。 アドバイスいただけたら助かります!
もうすぐ2005が出るからそれまでExpressのベータでいいじゃね? てか会社で買ってもらえないのか?
595 :
584 :2005/05/15(日) 17:40:18
Bitmap.Clone(Rectangle,Pixelformat)を使って解決しました。
>>592 とりあえずSDKでいじってみれば?
ヘルプは同じだし。
>>592 俺、ヤフオクで一万円のプロフェッショナル版を買ったよ。
やるだけだったらタダで出来る
Express Edition を拾ってくればいいのに
>>592 2005になって.NET Framework 2.0が~
とかいうのにこだわってないならそれでOK
601 :
デフォルトの名無しさん :2005/05/15(日) 22:34:40
あるクラスの中で 時間のかかる処理を別スレッドを使って 処理し、処理が終わったらイベントを通知したいんですが、 このイベントはクラスを作成したスレッド(メインスレッド)で実行 されるように保障するにはどうしたらよいでしょうか? class Worker { public void ProcessAsync() { Thread myThread = new Thread(new ThreadStart(TimeConsumingProcess)); myThread.Start(); } private void TimeConsumingProcess() { //時間のかかる処理 Thread.Sleep(2000); //処理終了の通知 ProcessAsyncComplete(this,EventArgs.Empty); } public event EventHandler ProcessAsyncComplete; } こうすると、ProcessAsyncCompleteはmyThread内で実行されてしまいますが こいつをWorkerクラスの呼び出し元のスレッドで実行するようにしたいのです。
メインスレッドがどこほっつきあるってるか分かれば、何とか解決できる というか、別スレッドからメインスレッドに通知、メインスレッドで対象のメソッドを実行してもらうようにするとか
>>601 メインスレッドがWindowを持ってるなら適当なコントロールのInvokeが楽。
604 :
デフォルトの名無しさん :2005/05/15(日) 23:01:28
>>602 >
> 別スレッドからメインスレッドに通知
これはどうしたら実現できるんでしょうか?
manualreseteventとか使うんでしょうか?
MSDNドキュメントをよんでもいまいちよくわからんのですが…
通知なら共有変数とか共有キューとか用意してやるべし Control 持ってるのなら Control のメッセージキューを使用 ⇒ つまり Control.Invoke した方が楽だけど
606 :
デフォルトの名無しさん :2005/05/15(日) 23:04:43
>>603 windowを持っていれば workerクラスにControl ownerあたりの
フィールドを持たせて、 Control.Invokeでいいんですが、
一応コンソールAPP等でも使えるような汎用的なものにしたいと
おもっているもんで、悩んでます…。
>>606 汎用性を考えるとキリが無いから、適当なところで区切った方が良いかと
ちなみに、方法は
1) ProcessAsyncComplete は別スレッドから呼び出されるモノと割り切る
2) Control を Worker に渡して、Worker 側が Control.Invoke
3) イベントを廃止して、Worker の進行状況をメインスレッドに監視させる
の3つが思いついた
608 :
デフォルトの名無しさん :2005/05/15(日) 23:21:35
>>607 そうですね…あんまり汎用性を突き詰めても仕方ないので。
「1) ProcessAsyncComplete は別スレッドから呼び出されるモノと割り切る 」
ことにして、同期処理はイベント通知を受けた側でControl.Invokeなりlockなりを
使って処理することにします。
609 :
607 :2005/05/15(日) 23:26:01
あ、もう一個方法があった 4) Worker で作成するスレッドの方をメインスレッドにする
時間のかかる処理をやってる最中に メインスレッドが何をしてるかに依る訳で。 つまりどうしてもメインスレッドに依存する →完全な汎用化なんて考え自体が無理。
>>608 汎用性なら…System.ComponentModel.ISynchronizeInvokeを
利用するのが普通。名前空間見て分かると思うが
コンポーネントの基幹部分の機能
System.Timers.Timerなんかがこの実装を使ってる
ってかWinformのInvokeはこれが元だ
public class Foo {
(...略)
private ISynchronizeInvoke synchronizingObject = null;
public ISynchronizeInvoke SynchronizingObject {
get { return this.sysnchronizingObject; }
set { this.synchronizingObject = value; }
}
public event EventHandler ProcessCompleted;
protected virtual void OnProcessCompleted(EventArgs e) {
if(ProcessCompleted!=null)ProcessCompleted(this, e);
}
private delegate void OnProcessCompletedInvoker(EventArgs e);
private void InvokeProcessCompleted(EventArgs e) {
if(this.SynchronizingObject!=null && this.SynchronizingObject.InvokeRequired) {
this.SynchronizingObject.Invoke(
new OnProcessCompletedInvoker(OnProcessCompleted),
new object[]{ e });
} else {
OnProcessCompleted(e);
}
}
}
612 :
611 :2005/05/16(月) 07:45:12
これで public void Start() { Thread thread = new Thread(new ThreadStart(this.DoProcess)); thread.Start(); } private void DoProcess() { ... this.InvokeProcessCompleted(EventArgs.Empty); //<-こんな感じ } とか使えばよい
613 :
611 :2005/05/16(月) 07:50:50
追記しておくが、一応これは最低限実装なので このFooをコンポーネント化とかするんならSynchronizingObjectプロパティを隠したり Designerをカスタマイズしたりしろよ。
614 :
デフォルトの名無しさん :2005/05/16(月) 13:03:25
RichTextBox で、以下のようなことは出来るのでしょうか。 * 何行/列表示可能か取得 * 現在のカーソル位置の取得/設定
>>614 > * 何行/列表示可能か取得
文字毎にフォントサイズが変えられるというのにどうやって求めろと?
> * 現在のカーソル位置の取得/設定
位置ってのは何文字目かってこと、それとも現在のカレットのPoint?
前者はほぼSelectionStartで代用可能。
後者はGetPositionFromCharIndexメソッド辺りを併用して。
.NET 1.1 TcpListner で待ち受け、TcpClientで通信する予定です。 TcpClientから接続元を知る事ができませんか? Socketを使えばできる事は知っているのですが、 Socketで書くのはメドーイ
TcpClientクラスのClientプロパティ(protected)があるから、 派生クラス作って接続元を返すプロパティーでもメソッドでも自分で作る。 俺にはこれぐらいしか思いつかなかった。
618 :
614 :2005/05/16(月) 20:59:30
>>615 > 文字毎にフォントサイズが変えられるというのにどうやって求めろと?
確かにまずい質問でした。
> 位置ってのは何文字目かってこと、それとも現在のカレットのPoint?
キャレットのほうです。試してみます。
ありがとうございました。
Socketでやれ。 既につながってるからそんなに面倒じゃない。 protectedだからTcpListnerを使うとClientプロパティが使えないし。
ああそうだ、TcpListener使うから派生クラス作っても駄目だ
結構、不便だよな。TcpListenerとTcpClient 俺も似たようなことがあって結局、Socketにした。
困ったときのリフレクション まあ素直に初めからSocket使う方が楽だけどな。
TcpListenerはAcceptSocketだけ使ってればそこそこ便利だと思うよ。後はNetworkStream使えば手軽に処理できるし。 TcpClientはサブクラスを作るなら無理なところだけSocket使えるから、そこそこ手軽だと思うよ。
624 :
デフォルトの名無しさん :2005/05/16(月) 23:41:04
入力されたデータが正の整数かどうか判別する方法はありますか? あるとすればどうやるのでしょう?
質問の意図が分からない。 if( data > 0 ) が答えだとしたらこのスレに来るのはまだ早い。
それぐらい自分で考えろと。
>>624 入力されたデータってのがよくわからんが、例えば 0100101011100101 っていうデータが正の整数かどうかを判別するってことか?
だったら無理だ。
「意味」までは判別できない。
入力された文字列を数値に変換して
>>625 でやればいいんじゃねーの?
ぷ
>>625 のやり方だと、整数かどうかは判断できないと思うが。
ヒント:自然数
Win32APIのGetStockObjectで得られるフォントをFontオブジェクトとして扱う方法はありますか。 固定幅フォントで描画する必要があり、 GetStockObjectのSYSTEM_FIXED_FONTで得られるフォントを使用しようとしたものの Font.FromHFontではTrueTypeではないというエラーが発生して使用できません。
文字通りTrueTypeフォントじゃないと無理なんだろ。GDI+の制限だ。 FixedSysはビットマップフォントだからな。 フォントファミリ名不明のまま固定幅フォントとなるとFont.FromLogFontメソッドかな。
どなたか下の宿題解いてくださいませんか??なんかもうさっぱりです。 今年こそは単位とりたいのですが自力でできる気がしないんです… OSはウィンドウズでコンパイラはシグウィンです。 ダミー節点を使わないリスト構造を用いて,挿入整列の プログラムを作成せよ ・リスト構造は,ポインタによるリンクリストを用いること ・整列前のリスト内の各要素,整列後のリスト内の各要素を 表示するようにすること よろしくお願いします。
スレ違いはスルー
しかも宿題スレとマルチしてるカスだな
Cygwinでcsc.exeうごくんかな
639 :
デフォルトの名無しさん :2005/05/18(水) 00:43:38
624です。 なんか、低レベルですみません。 なんか、言葉足らずですみません。 入力されたデータが 正の整数(負の数でもなく、少数でもなく、文字列でもなく、0でもなく、空白でもない) かどうか判別する方法はありますか? あるとすればどうやるのでしょう?
>>639 入力されたデータの「型」は???
// なんらかの数値の場合
if( x > 0 && Math.Round( x ) == x ) ...
// 文字列型の場合
int x = int.Parse( str );
あとは上記
641 :
640 :2005/05/18(水) 01:03:19
あ、だめだ、文字列型のときは double x = double.Parse( str ); が無難かな…
>>634 FromLogFontで固定幅フォントを得ることができました。
ありがとうございました。
Aspでデータグリッド内にデータグリッドを入れ込んだ時に、入れ込んだ側のデータグリッドのイベントって取得できないんでしょうか?
>>641 どうせ整数型が欲しいんだからint.Parseでいいよ。例外が出たらそれは整数じゃなかったってことだ。
>>639 で、入力されたデータというのがどこから入力されたどういう型なのかというのが分からないことには何とも言いようがないし。
例えば文字列で入力されたのを判断するとして、C#で扱える最大の数値型decimalの上限79,228,162,514,264,337,593,543,950,335を超える数字が入力された場合でも問題ないとするのかどうかとか。
それとも入力はobject型で、数字が並んだstring型は駄目なのか。
string型を判断するのならコンマはOKなのか。
前提条件が足りなさすぎる。
645 :
デフォルトの名無しさん :2005/05/18(水) 08:27:59
Windowsサービスとして作成したEXEファイルがあります。 直接起動されたときはサービスでなくいちWindowsアプリケーションとして動作 させたいのですが、EXEファイルが起動されたときに、Windowsサービスとして 起動されたのか、それとも直接起動されたのかをプログラム内部で判定する方法は ありませんか?
System.Environment.UserInteractiveとかどうなのかな。
>>646 UserInteractiveで判定できました。
ありがとうございました。
648 :
640 :2005/05/18(水) 16:31:31
>>644 int x = int.Parse( str ); を try ~ catch で囲むの?
ここで例外を使うのはどうかと思うんだがなあ…。不自然じゃないか?
ほとんどが非整数の入力の場合、ほとんどが「例外」扱いになるな。
>>648 確かに相応しくない例外の使い方だけど、使った方がナチュラルに書ける。
どのみちテキストボックス辺りからのユーザの入力をParseするならtry-catchは必須だし。
.NET 2.0でTryParseが増えるからそれでなんとか。
>ほとんどが非整数の入力の場合、ほとんどが「例外」扱いになるな。
で、その場合どう対策しろと?
//まあ私は正規表現でチェックするが。
650 :
C++に嫌気がさした :2005/05/18(水) 22:08:58
参照型のclassをreturnしちゃうと、非constな参照が返されて、フィールドに対する値の正当性が保たれないのですが...... 要素に対するアクセスをセッター、ゲッターだけに絞る事ってできないんですか? C++で書くと #include <iostream> struct A { int val; }; class B { A a; public: const A& Ref()const{ return a; } A Get()const{ return a; } void Set( int n ){ a.val = n; } }; int main() { B b; b.Set( 10 ); std::cout << b.Get().val << std::endl; //b.Get().val = 20;//コンパイルエラー std::cout << b.Get().val << std::endl; //b.Ref().val = 20;//コンパイルエラー std::cout << b.Get().val << std::endl; }
651 :
650 :2005/05/18(水) 22:14:05
日本語意味分からないですね(汗 参照型のclassを ↓ フィールドに持ってるインスタンスを の間違いです
現状、無理。 constの必要性は言語設計者らの間でも議論になったらしいけど。 //まあAがstructなら値のコピーになるので実質変更不可だ。
653 :
650 :2005/05/18(水) 22:26:58
Get()の方のメソッド(ディープコピー)もICloneableを継承しないとだめなんですか?
Aをラップしたクラスを返すとか
べつにconstなんていらないじゃん。 その先で値が変わったら その値を変えたやつが悪い。
その悪いやつを未然に防げた方が便利じゃん
ということでconstが生まれましたとさ。
659 :
デフォルトの名無しさん :2005/05/19(木) 15:55:04
C#で書かれたオープンソースソフトウェアで、初学者の手本になるような 設計・実装がされているものってありますか? もしオススメな物があれば参考にしたいので是非教えて下さい。
ライブラリ系じゃどっから読んだらいいかわからんのでは?
C#でコード公開というとTwintailだがどうだろうね。
なにが?
オープンソースなだけで手本にはならないと思うが。
以下のプログラムはコンパイルはできるんですがなぜか実行できません。 何ででしょうか? #include <stdio.h> #include <stdlib.h> typedef struct node *link; struct node {int item; link next;}; int main(int argc,char *argv[]) { struct node heada,headb; int i,N=atoi(argv[1]); link t,u,x,a = &heada,b; srand(1); for(i=0,t=a;i<N;i++){ t->next = malloc(sizeof *t); t = t->next; t->next = NULL; t->item = rand() % 1000; } b = &headb; b->next = NULL; for(t=a->next; t!=NULL;t=u){ u=t->next; for(x=b;x->next!=NULL;x=x->next) if(x->next->item > t->item) break; t->next = x->next; x->next = t; } }
csc.exeではコンパイルも不可能だな。
669 :
デフォルトの名無しさん :2005/05/19(木) 23:35:35
axWebBrowserについて質問させてください。 単純にaxWebBrowser組み込んだだけのページでブラウザ内のJavaアプレットが動作しません。 同じURLをIEで開くと普通に動作します。 何か設定をしてやらないといけないのでしょうか?
670 :
667 :2005/05/19(木) 23:37:41
言い忘れました。コンパイラはgccです。
>>669 appletタグじゃなくてobjectタグを使うしかない
672 :
デフォルトの名無しさん :2005/05/19(木) 23:43:13
>>671 即レスありがとうございます。
明日早速やってみます。
673 :
667 :2005/05/19(木) 23:43:51
すみません、タイトル見間違えてました。スレ違いでした。
674 :
デフォルトの名無しさん :2005/05/19(木) 23:53:10
675 :
デフォルトの名無しさん :2005/05/20(金) 03:04:17
676 :
デフォルトの名無しさん :2005/05/20(金) 03:18:34
677 :
デフォルトの名無しさん :2005/05/20(金) 11:05:01
C#で、テキストボックスの値を数値か文字かわかるようにして、 文字が入力されたらエラーメッセージを出すようにしたいのですが、 分かりません。教えてください。
>>677 TextChanged イベントでチェックすればいいんじゃね?
679 :
デフォルトの名無しさん :2005/05/20(金) 11:23:40
正規表現でも使えば? と書くとその使い方を(ryと返ってきそうでヤだな。
VCのテキストボックスには数値のみの入力のオプションがあったのに、 .netにはなんでついてないんだろうな。
682 :
デフォルトの名無しさん :2005/05/20(金) 12:39:29
そうなんです。数値のみの入力オプションがないため困っているんです。 正規表現を教えてください。お願いします。
数値のみ入力のコントロールなら、numericUpDownを使えばいいんじゃね?
684 :
デフォルトの名無しさん :2005/05/20(金) 13:01:02
>>683 ありがとうございます。
でも、numericUpDownだと矢印がついてしまうのです。
685 :
デフォルトの名無しさん :2005/05/20(金) 14:14:52
何か方法はないですかね?
あのな、「TextBoxの入力内容を制限する」なんてのはFAQなのな もうちょっと調べろ&フラットスレにでもいってろ
検索すれば見つかりそうではある。
688 :
デフォルトの名無しさん :2005/05/20(金) 14:59:59
例外について質問なのですが、以下のような使い方でいいのでしょうか? それともProcBの中にtry~catchを置くべきなのでしょうか? ProcA(){ try{ ProcB(filename); } catch(FileNotFoundException){ Console.WriteLine("ファイルは存在しません"); return; } ・・・略・・・ return; } ProcB(Strig filename) { XmlDocument xml = new XmlDocument(); xml.Load(filename); ・・・略・・・ }
689 :
デフォルトの名無しさん :2005/05/20(金) 15:07:48
>>688 時と場合によるので画一的には答えられない。
その例なら、ファイルが見つからないときにコンソールにメッセージを書くだけで済ませられる所でcatchする。
//勿論途中で一旦キャッチして再スローしてもいいわけだが。
>>690 ありがとうございます。
例えばProcBがライブラリの一関数として様々な箇所から呼ばれることを
想定した場合はどのようにするべきなのでしょうか?
692 :
デフォルトの名無しさん :2005/05/20(金) 15:34:52
>>691 ケースバイケース・・・設計者の気分しだい(w
それだけの情報じゃ答えられん気も。
基本的に、「ProcBの内部で何をやってるかはライブラリを利用する側には分からない」という前提で例外を設計すると良いですよ。
695 :
デフォルトの名無しさん :2005/05/20(金) 20:00:45
どっちにしろ ProcB 内で FileNotFoundException をスローするのは 作法上正しいとおもうよ。
こういうXMLをXmlTextWriterで書きたいんですが <element1(改行) (タブ)attribute1="value1"(改行) (タブ)attribute2="value2"(改行) /> xtw.WriteStartElement("element1"); xtw.WriteWhitespace("\r\n"); xtw.WriteAttributeString("attribute1", "", "value1"); (略) と書くと、WriteWhitespace("\r\n")がうまくいかないらしくて 属性部分が出力されません。 あと、タブの出力の仕方もよく分かりません。 WriteWhitespace("\t")みたいなのじゃ駄目みたいです。 xtw.WriteStartElement("element1\n"); と文字列中に改行を入れると一見イイのですが、 次の行に半角空白が1個出てしまいます。 どうするのがよいのでしょうか。
C#勉強中ですが、疑問がひとつ。 C#ではなんでグローバル変数のことを「フィールド」なんていうややこしい 言い方にしてるんでしょうか?
>>697 C# にグローバル変数は存在しません。出直してきなさい
699 :
デフォルトの名無しさん :2005/05/21(土) 00:49:26
ないことはありません。出直してきなさい
698じゃないが、697=699なの? どっちにしても荒れそうだ。
どっちでもいいが、使わないほうがいいってのが良く分からんのだよ・・・
>>702 class外の変数にアクセスしたら、そのclassが独立できないじゃないか。
>>702 697=699=702?
> 使わないほうがいいってのが良く分からんのだよ・・・
オブジェクト指向のカプセル化原則に反するからです。
複数のクラスから同じ変数(フィールド)をいじろうとすると、
発見しにくいバグの元になります。
705 :
704 :2005/05/21(土) 01:09:58
自分で書いていて文脈がつながらない文になった。 703が代弁しているからそれでいいや。
グローバル変数って死語だろ
ナウなヤングにバカ受け
>703-704 697,699とは別人の702だが。 うむ。勉強しなおしてくるよ・・・。
俺の言ってるのと違う話で代弁とか言われても困惑する。 バグの元とかいう次元じゃないつもりだ。
710 :
704 :2005/05/21(土) 01:26:23
オブジェクト指向の~ → バグの元 という流れより オブジェクト指向の~ → クラスの独立性が~ としたほうが自然だねってことで… あまり気にしないでください…
てかグローバル変数って何?そんなレベルの低そうなもの知らないんだけど
Simulaの効率性の悪さに嫌気がさしたBjarne Stroustrupは、やっぱ グローバル変数(つかstatic記憶クラスの変数)は必要だと 痛感したらしいけどね そんな彼も、C++のstatic変数の初期化順序の問題に頭を悩まされる ことになる