新すれオメ
武術の神と言われる亀仙人より強い天津飯でも歯が立たないドラムを瞬殺した悟空が8年修行して、 同じ位の強さのピッコロさんと二人がかりでやっと倒したラディッツと匹敵する戦闘力を持つ栽培マンを あっさり倒した天津飯・ピッコロ等が束になっても敵わないナッパを悠々倒した悟空の2倍以上強いベジータが かなりパワーアップしても全く相手にならない強さのリクームを一撃で倒した悟空が更にパワーアップしても、 それを半分の力で殺せるフリーザをあっという間にバラバラにして消した未来のトランクスでさえ仲間と束になっても 敵わない人造人間17・18号に匹敵する強さを持った神コロ様でも敵わない程に 生体エネルギーを吸って強くなったセルと互角の16号を大きく越える17号吸収態セルを子供扱い出来る 精神と時の部屋パワーアップ後のベジータと随分差がある悟空でも勝てない完全体セルを 一方的に痛めつけることが出来るブチ切れ悟飯をも越えたベジータが命を賭けても倒せなかった魔人ブウが 更に凶悪になったブウと互角以上の戦いをしたゴテンクスよりも強くなった悟飯でも全く歯が立たない ゴテンクス&ピッコロ吸収ブウが更に悟飯を吸収して強化しても全く歯が立たないC#が最強。
6 :
デフォルトの名無しさん :04/08/01 21:35
うめあげ
インデクサでアクセスする配列のサイズを得るには どうすればいいのよ?
だれかC#でVS.netのエディタのコピー作ってくれYO!
>>9 意味が分からないが単に配列のサイズを知りたいと解釈すると Array.Length
>>12 5万は高いだろ。しかも海外製だから設定ウィンドウも英語だろうし・・・
これはどうも質問者本人が気付いていないことも多いようですが、
質問の文章に第三者が問題を理解するのに十分な情報が含まれていないとことがしばしばあります.
このような状況で求められる極限的な推理を,私はしばしば「メタ推理」と読んでいます.
>>9 もうとてもとてもいい感じに足りてません.
C#の2chブラウザって、なにとなにですか?
twintail / twintail2 / Castella
>>15 なにとなにって質問の仕方からして
始めからtwintailとCastellaだって
知ってたんじゃねーか?
んじゃ、こんな感じで。 class indexer{ private int array[]; public int this[int i]{ get{ return array[i]; } set{ array[i] = value; } } } このとき、外部からarrayのサイズを知るにはどうしたらオケ? サイズを取得するにはそのためのコードを インデクサ側でそのつど用意する必要があるとか。 // class indexer内 public int GetArraySize(){ return array.Length; } // 外部クラス indexer idxr; : int arraySize = idxr.GetArraySize();
>>18 インデクサは結局配列を模することができるただの関数にほぼ
等しいんだからサイズなんて概念が存在しない配列のようにも
作りうるわけで、ということは用意する必要があるのではないかと
思うのだけれども、どうだろうか。
>>16 漏れがわざわざ比較表(仮仮仮)までいって見てきた
別アセンブリから指定のクラスをロードするのは Assembly.LoadFrom().GetType().InvokeMember() でコンストラクタ呼び出しという手順で良いんでしたっけ?
22 :
デフォルトの名無しさん :04/08/02 16:02
Graphics gForm = Graphics.FromHwnd(pictureBox1.Handle); IntPtr formHDC = gForm.GetHdc(); Bitmap bmp = new Bitmap(@"D:\1.JPG"); Graphics gBmp = Graphics.FromImage(bmp); IntPtr bmpHDC = gBmp.GetHdc(); API.BitBlt(formHDC, 0, 0, Width, Height, bmpHDC, 0, 0, 0x00CC0020); gBmp.ReleaseHdc(bmpHDC);gForm.ReleaseHdc(formHDC); Picturebox1に描画されないのはどこがいけないからなのですか?
追加 public class API { /// BitBlt [DllImport("gdi32.dll", ExactSpelling=true, SetLastError=true)] public static extern long BitBlt(IntPtr hObject, int nXDest, int nYDest, int nWidth, int nHeight, IntPtr hObjSource, int nXSrc, int nYSrc, int dwRop); } Width=200 ; Height=200;
>>22 BitBlt の戻り値はどうなってますか?
あとこれ描画されても(タイミング次第で)すぐ消えるとおもいますが、
その辺は承知ですよね。
戻り値を見たら、「9222812402616107009」って出てました。 >あとこれ描画されても(タイミング次第で)すぐ消えるとおもいますが 知らなかったです。 以前、VB6でAPIを使ってたのですがC#になってからはよくわかりません。 C#でうまく描画されるサンプルを見せていただけないでしょうか?
>C#でうまく描画されるサンプルを見せていただけないでしょうか? 必ず API でやる必要があるのですか? HDC を経由しなくて良いなら、 任意の時点で pictureBox1.BackgroundImage = new Bitmap(@"D:\1.JPG"); するとか、 Paintイベントのハンドラでe.Graphics.DrawImage(bmp, 0, 0, Width, Height); とか、 簡単なんですけど。
API でやる場合には、ソース側がBitmap から Graphics.FromImage して GetHDC したものだとダメなようで、 (多分 HDC が転送先と互換でないため) IntPtr hdcForm = e.Graphics.GetHdc(); IntPtr hdcBmp = API.CreateCompatibleDC(hdcForm); IntPtr hbmpOld = API.SelectObject(hdcBmp, bmp.GetHbitmap()); int result = API.BitBlt(hdcForm, 0, 0, 100, 100, hdcBmp, 0, 0, 0x00CC0020); API.DeleteObject( API.SelectObject(hdcBmp, hbmpOld) ); e.Graphics.ReleaseHdc(hdcForm); てな感じにC/C++でありがちなコードにすると上手く動くようです。
>>19 なるほど、そういったアクセサはやっぱり別途必要になるんだ。
答えてくれた人たち、ありがとう。
APIの定義はこんな感じです。 public class API { /// BitBlt [DllImport("gdi32.dll", ExactSpelling=true, SetLastError=true)] public static extern Int32 BitBlt(IntPtr hdcDst, int nXDest, int nYDest, int nWidth, int nHeight, IntPtr hdcSrc, int nXSrc, int nYSrc, int dwRop); /// SelectObject [DllImport("gdi32.dll", ExactSpelling=true, SetLastError=true)] public static extern IntPtr SelectObject(IntPtr hdc, IntPtr hObject); /// CreateCompatibleDC [DllImport("gdi32.dll", ExactSpelling=true, SetLastError=true)] public static extern IntPtr CreateCompatibleDC(IntPtr hdc); /// DeleteDC [DllImport("gdi32.dll", ExactSpelling=true, SetLastError=true)] public static extern Int32 DeleteDC(IntPtr hdc); [DllImport("gdi32.dll")] public static extern bool DeleteObject(IntPtr hObject); }
>>25 VBのPictureBoxは、それ自体がバッファリングしてるから表示できるんじゃなかったっけ?
ペトロ著、C#で作るプログラミングウィンドウズみてみれ
32 :
デフォルトの名無しさん :04/08/02 17:53
ペドロって、ジャングルの王者ターちゃんでしたっけ?
きもいよ
ASP.NETでIISにログオンするときの質問です。IE5.0だとユーザID、パスワードを入れなければ ログオンできないのですが、IE6.0にしたら何も入れない状態で3回繰り返すとログオンできてし まいます。ただIEのバージョンを変えただけなのですが、原因が全く分かりません。同じような 経験ある方いませんでしょうか?ソース内にブレイクポイントを入れているのですが、ログオン はIISが勝手にやってる処理のようです。
VC#において、Fontオブジェクトが等幅日本語フォントであるか調べ、 異なる場合はシステムデフォルトの等幅日本語フォントに差し替えたいのですが、 どのようにすればいいのでしょう? MSDNがJavaDocに比べて読みづらいので困ってます・・・。
JavaDocって読みやすいんだ
漏れもJavaDocの方が読みやすいなぁ
派生クラスのドキュメントに、親クラスのメンバが混じってるのが気に入らないんだけど、 差分だけ表示させる方法ってあったっけ?
2.0まで待て
> 派生クラスのドキュメントに、親クラスのメンバが混じってるのが気に入らないんだけど、 たしかに気に入らない
41 :
デフォルトの名無しさん :04/08/04 02:18
ボタン押したらTextの全テキストを選択するようにしたんだけど、選択できない。 private void button1_Click(object sender, System.EventArgs e) { this.textBox2.SelectAll(); } 間違えようの無いソースなんだけど・・・。 ちなみに、正規表現検索やったら、ちゃんとマッチするインデックスと長さは判定できてた。 なのに、選択だけできない。なして?
>>41 ボタンを押し終わった時のフォーカスの位置を確認すると…。
private void button1_Click(object sender, System.EventArgs e)
{
this.textBox2.Focus();
this.textBox2.SelectAll();
}
とか。
Focusちゅうか描画の問題ですよね.蛇足すまんそ
private void button1_Click(object sender, System.EventArgs e) { this.textBox2.SelectAll(); this.textBox2.Focus(); }
46 :
デフォルトの名無しさん :04/08/04 13:48
Image オブジェクトから一部を取り出して別の Image オブジェクトを 作成したいのですが,どのようにやればよいのでしょうか? 例えば 100 x 100 のサイズの Image オブジェクトから x1:30, y1:30, x2:10, x2:10 の範囲を別の Image オブジェクトとして 作成したい,といった事です. よろしくお願いします.
>>46 サイズだけ指定したBitmapオブジェクトを作る。
そのBitmapオブジェクトからGraphics.FromImageでGraphicsオブジェクトを得る。
Graphics.DrawImageで描画する。
49 :
デフォルトの名無しさん :04/08/04 15:41
参照型の変数についてです。 Image a; Image b; a = new Bitmap(...); b = new Bitmap(...); a = b; とやると a と b の内容は同じになりますよね? (同じオブジェクトを参照する事になるから) この時 a の内容を書きかえると b も同時に書きかわってしまいますよね? a に b の内容をコピーしたい時は a = new Bitmap(b) のようにする必要があると思うのですが 参照型の変数はこのように値をコピーする必要があるときは 代入だけではコピーにならないという事だと思うのですが 私の理解はあっていますか?
DeepCopy と ShallowCopy の違いは基本。 今しがた、2005beta1落としてきて使ってみてる。 2.0の売りはテンプレートなんだな。
「a=null;」してもbはnullにならない
52 :
デフォルトの名無しさん :04/08/04 20:23
どうしてならないのでしょうか?
51に「何を今更」と思ったら
>>52 みたいな人もいるのな。
参照型ってのは、要はメモリアドレスを指してるわけだ。
実際のオブジェクトが0x00004000からのメモリに入ってるとする。
参照型の変数aはこの0x00004000を保持してるわけだ。
b=aとやると、0x00004000がコピーされてbも0x00004000になる。
a=nullとすると、aが保持してる0x00004000はクリアされる。
でもbの0x00004000という数字は当然そのまま。
実際のオブジェクトにタッチできるってことだ。
nullの代入は実際のオブジェクトを破棄するんではなくて参照(の情報)を破棄するだけ、という結論だな。
まあきわめて単純化した話だがね。
ま、ぶっちゃけて言えば 「参照型の変数」ってのは「どのオブジェクトを指しているか」っていう情報を変数に格納しているんだ だから「a = b」と書けば「b がどれを指しているか」が a にコピーされるし、 「a = null」と書けば「null = 何も指していない」が a にコピーされる a が何を指しているかなんて b は知ったこっちゃ無いから、 「a = null」しても b は null にならない がきっとFA
>>49 のように聞いてくるやつで、
>>51 をみて当たり前と思うやつは
ちゃんと意味を理解できてる。
>>52 のように思うやつは、言葉として参照型はどうのと覚えていても、
意味は理解していない。
Javaの方がわかりやすいし優れているな
>905 言ってみて、冗談だよーとかいってみる余裕がおまえには足りない. いってみる ↓ 一瞬の空気を読む ↓ 反応する これがいろんな場面で必要なのよ. こんなの言ってみても兄弟で別に問題ないぞ
C++のfriendみたいなことC#で何かありませんか? internal使えって言われそうだけど、もうちょっと相手のクラスをしっかり限定できるのが欲しいのです。
>>58 設計を見直してみて、他のやり方で実現できないか探ってみてはいかがでしょう。
>>58 というかinternalは必然的に相手のクラスを限定できるわけで。
>>59 できたらとっくにやってるところ…。
publicで全てのメソッドを公開してるソースが既にあって
それを呼び出すクラスは自分の担当外じゃないので触れられないし、
でも、少しでもスコープを狭くしたいところ…
> 自分の担当外じゃないので ならば、君の担当だ。
63 :
デフォルトの名無しさん :04/08/05 11:41
private ArrayList picPaths; private string tt=""; ... private void button1_Click(object sender, System.EventArgs e) { tt=picPaths[1].ToString(); // ○ bool mainflg=true; while(mainflg) { tt=picPaths[1].ToString(); // × ×の所で、「オブジェクト参照がオブジェクトインスタンスに設定されていません。」 って出てきて終わってしまいます。 ちょうどwhileの所が境目みたいなのですが何が原因か分かりません。 分かる方教えてください。
>>63 これだけじゃわかんない。
とりあえずpicPathsとpicPaths[1]はどっちがnullなの?
whileのなかでpicPathsかpicPaths[1]がnullになるような操作してない?
whileを使う以上picPaths[1].ToString()が一回しか実行されて無いとも思えないけど。
private void Form3_Load(object sender, System.EventArgs e) { picPaths = new ArrayList(); GetAllFiles( Dir, ".jpg", ref picPaths); } private static void GetAllFiles(string folder, string searchPattern, ref ArrayList files) { string[] fs = System.IO.Directory.GetFiles(folder, searchPattern); files.AddRange(fs); } 追加分です。 ちなみに、上の○の所はうまく読込めてました。 NULLになるような事はしてないです。
自己解決?しました。 別のGraphicsオブジェクトのところで不具合があって、それが今回の×の所で エラーが起こってたようでした。
タブコントロールに配置したRichTextBoxの中身が 変更されていなければそのままタブを閉じて、 変更されていればAskSaveで処理をさせたいと思っています。 ビルド出来るんですが、処理をしようとすると if(rtb.Text != "") の部分でエラーが出てしまいます。 初歩的で申し訳ございませんが、ご指南頂けますでしょうか? private void mnuFileClose_click (object sender, System.EventArgs e) { TabPage tb = this.tabControl1.SelectedTab; RichTextBox rtb = tb.Tag as RichTextBox; if(rtb.Text != "") { if(!AskSave()) return; } this.tabControl1.TabPages.Remove( tb ); }
>>67 で、どういうエラーなのかね。
NullReferenceのように思えるけど。
rtbがnullになってないか?
>>68 すいません、NullReferenceでした。
どうすれば解決できますでしょうか?
>>69 まず最初に確認しなければいけないのは、
tb.Tag に、ちゃんと RichTextBox インスタンスへの参照が入っているかどうか
かな?
>>70 tb.Tagは未定義になってました。
tb自体はちゃんと参照できてたみたいです。
>>71 ……じゃあTagにRichTextBoxの参照を入れてなかったんだろう。
自動的に入るとか思ってないよな?
>>72 ごめんなさい、その辺りのことがまだよく理解できてません。
どういう風に入れるんですか?
>>73 いやまあそのまんまなんだが。
TabPage.ControlsにRichTextBoxをAddした時に、そのTabPageのTagにもそのRichTextBoxを代入する。
むしろTabPage.ControlsのなかでRichTextBoxの位置が決まってるなら
実際にRichTextBoxを使う時(上記のコードのような)に
RichTextBox rtb = tb.Controls[0] as RichTextBox;
みたいに決めうちでやってやるとか。
75 :
デフォルトの名無しさん :04/08/05 14:07
PictureBox にKeyDownイベントを追加させるにはどうしたら良いでしょうか?
>>74 あぁ!そういうことですね!
解りました、有難うございます。
>>76 >>74 と同じ事を言ったつもりが、全然違う意味で伝わっちゃったようでごめんなさいでし
訂正『tb.Tag に、ちゃんと RichTextBox インスタンスへの参照が入ってい“た”かどうか』
>>75 public class KeyOperatablePictureBox : PictureBox {
public new event KeyEventHandler KeyDown;
protected override bool ProcessCmdKey(ref Message m, Keys key) {
if (this.KeyDown != null) {
this.KeyDown(this, new KeyEventArgs(key));
return true;
}
return base.ProcessCmdKey(ref m, key);
}
}
こんなのを使えばKeyDownを使えるけど……。
もともとユーザ側の操作ではフォーカスを設定できないPictureBoxにKeyDownイベントはどうかなぁ。
PictureBoxにDrag & Dropとかだったらやりたい。 てゆうかイベントつけて欲しい。
81 :
デフォルトの名無しさん :04/08/05 17:11
プロパティの雷マークの頁でコードを挿入したあと、 private void Form1_KeyDown(object sender, System.Windows.Forms.KeyEventArgs e) { MessageBox.Show("aa"); } で実行して、フォーム上をキーで押しても反応しません。 何か抜けてるのでしょうか?
>>81 KeyDownは基本的にフォーカスを持ってるコントロールで発生する。
Formが子コントロールを持つ場合基本的にFormにフォーカスはいかない。
子コントロールを持つFormでForm自身にKeyDown/Up/Pressを受け取らせる場合Form.KeyPreviewをtrueにする。
>>81 フォームにコントロールが貼ってあるんでない?
KeyPreviewをtrueにしたら反応しました。
85 :
デフォルトの名無しさん :04/08/05 18:39
アクセスレベルについてです 1つの exe を作成する中でいろいろなクラスを作成すると思いますが それらのクラスのうちそのクラスの中でのみ使いたいメンバには private を ふってそれ以外はすべて internal にしようかと思っているのですが public を internal に変更するデメリットはありますか? その exe 内で定義されるメンバはその exe 以外のところから一切アクセス させたくないので public を internal にすればよいのか? という単純な 発想からなのですがいまいちこのあたりが理解できていせん...
OnPaintとPaintイベントはどう違うのでしょうか? どちらも再描画の際に呼び出されると本には載っていたのですが。
>>85 1つのexeで完結させるというその設計の上ではデメリットはないんじゃないの。
>>86 Paintイベントは外部からも利用できる
85 じゃないけど、外部から有用な部分を DLL として切り離すのと、 そのまま EXE の中に押し込めておくの、どちらがいいんでしょうか 切り離すとすると、DLL と EXE の比が 9:1 くらいになるんですが
>>86 (Windows から等の)描画要求があると、まず Control.OnPaint が呼び出されます。
OnPaint のデフォルトの処理内容は、
・まず Paint イベントを発生させる
・イベントがハンドルされなかった場合(ハンドラがない、e.cancel = true など) には、規定の描画処理を行う
というようなものです。
そうだったんだ・・・
>88 なにを重視するかによるんでは? 管理しやすさ、他での使いやすさ、実行性能などなど おりゃDLL派
>>91 現物は、今新し(ry スレでさっき上げたヤツ
自作スクリプトの実行部分が DLL にあって、EXE はファイルを読み込んで渡すだけ
スクリプト本体は文字列で渡せるし、うまくやれば別アプリに組み込めると思う
ただ、ファイルを読み込む部分は別のアプリに組み込む必要が無い
って感じ
二次元配列のソートってありますか?
それ、どういう並べ方? 一次元でソートして、二次元に並べなおすじゃだめなん?
95 :
デフォルトの名無しさん :04/08/06 12:35
「C#のインデクサには、staticキーワードが付けられません。」 だそうですが、何故なのでしょうか?
インデクサの宣言は…… 例) public int this[int index] {} あたりまえだ
staticなインデクサってのはいささか訳がわからなさすぎるな。 「こんなクラスならstaticインデクサがあっても」みたいな例が思いつかん。 なんかあるかな?
>>97 Color 構造体で named color をインデクサで扱えると便利だと思う。
NamedColors とかプロパティでコレクション返すのでも良いけど(コレ追加して欲しいぞ)。
>>98 いや、むしろそういうのは Color.ToColor(string name) とかで処理した方が良いと思う
インデクサはあくまで配列のインデックス、ついでに連想配列もできますってだけで、
便利だからって乱用しちゃ、何れ痛い目を見るんじゃないかな?
100レス直前に悪いんだけどさ インデクサって臭そうだよな
>>99 >Color.ToColor(string name) とかで・・・
それが既にあることは常識だと思ってマスタ(FromKnownColor / FromName)・・。
サーバ側では Color ってあんまり使わないからマイナーな存在?
漏れが言ってるのは、named color 全体を普通の配列として扱えるようにするようなケース。
「なんかあるかな」を受けてちょっと考えただけなので、あまり強く主張はしません。
>>101 FromName とかってなかったっけ?
ライブラリ手元にあるか分からん
だけど、名前付Color と Color は違うから、
あえてやるとすると NamedColor コレクションを作成する方が良いと思う
それならば NamedColor["blue"] とかしっくりくるし、
自分で名前付けることだって NamedColor["MainFormColor"] とかに代入すれば良いから便利だし
>>94 レスありがとう。
指定した列の順番で、行がソートされる感じ。
自分で作るしかない?
>>103 それは2次元とは言わないw
とりあえず汎用性に欠けるから、そういうメソッドは無いと思う
自分で作った方が早いよ
>>102 もちつけ。
FromName 等があることも、コレクションが良さげなことも既出
>>103 Array.Sort()の恩恵にすがるなら……
struct SORT_TBL{
public int pos; // テーブルの位置
public string atai; // 値
};
みたいなのを作って、
SORT_TBL tbl[] = new SORT_TBL[なんとかー];して、
作ったtbl[]に二次元テーブルの行位置と判定に使う値をぶちこんで、
tbl[]をArray.Sortするのだが、このときSortに引き渡すIComparer継承クラスのCompareは
パラメータのobjectをSORT_TBLにキャストしたときの内部値ataiで判定して、
ソートが終わったらtbl[]を先頭から読んでソート後の位置を調べつつ、新しいテーブルを作成。
仕上げに、新しいテーブルの内容を元のテーブルにCopyTo()して出来上がり。
自己満足気味に書いてみたが、たとえばこういう回りくどい方法もあるw
string型の "2004/08/06" を DateTime型に変換するにはどうすればよいのでしょうか?
DateTime.Parse
DateTime DT = DateTime.Parse( "2004/08/06"); ありがとうございます。できました。
>>110 Array.Sortの解説を読もうな。
113 :
デフォルトの名無しさん :04/08/06 19:21
インスタンスを作る際に、staticコンストラクタを使用する方法ってありますか?
>>113 > インスタンスを作る際に、staticコンストラクタを使用する方法ってありますか?
で、何がしたいんだ?
直接staticコンストラクタは呼び出せないはず。
他のクラスからFormのコントロールにどうやってアクセスすればよいのでしょうか?
その form への参照を何か変数(例えば a )に入れておいて、 a.comboBox とかそんな感じで。
コントロール、というかフィールドに直接アクセスするのは良くないと思います。
C#的オブジェクト指向としての最善はイベントで通知かな。 他のクラスはFormを知る必要が無くなる。
120 :
◆Niwa2ChL9M :04/08/08 02:57
すみません。初心者並の質問ですが教えてください。 C#(aspx)でWebファイルを作っているのですが、 DOSのhoge.batにキックしてさせたら、そのまま放置されてしまいます。 終了コード・戻り値等を使って、再度aspxに戻して処理させることは可能でしょうか。 言語にあまり携わっていないため、Web等でC言語の特性などを調べてみましたが、 Main()を使うのでは無いかというのは何となくわかってますが、使い方がよくわかっていません。 教えて頂けますでしょうか。
なにをしたいのかよくわからない。 DOSスレに行った方が良いかもしれない。
122 :
デフォルトの名無しさん :04/08/08 13:50
ある拡張子に関連付けされてるアプリケーション名を取得するにはどうしたらいいですか?
C#の初歩的な練習としてテトリスでも作ってみようと思うのですが、 参考になるサイトってないですか?
>>127 "the game of wahoo!"
スレッドからビットマップに描画を行い、 フォームのピクチャボックスのPaintイベントでそのビットマップを表示する、という処理を行っています。 しかし、「そのオブジェクトは使われています」というエラーが起こることがあります。 おそらく、ビットマップの読み込み中に、スレッド側がビットマップに対し書き込みを行っているからではないかと思っています。 そこでビットマップが読み込まれている時には書き込みを止めるようにしたいのですが、よい知恵はないでしょうか? MutexやMonitorを使ってみようと思うのですが、 スレッドが描画を行う際には Graphics g = Graphics.FromImage(bitmap); とグラフィックオブジェクトを取得しているのですが その後はその取得したグラフィックオブジェクトを使って描画してます。 なので、グラフィックオブジェクトを取得しようとビットマップにアクセスしたときに同期を取ることは出来るのですが、 その後の描画の時に、ピクチャボックスがビットマップを読み込んでいるかどうかわかりません。
132 :
デフォルトの名無しさん :04/08/08 22:36
ATLでCOMを作成し、それをC#から呼んでいます。 ATLをVSで開いて、実行ファイルでC#のEXEを指定し、 デバッグを始めたのですが、ブレイクがかかりません。 なぜなのでしょうか? 当該ATLが実際に動いていることは確認しています。 あと、両方ともDEBUGビルドしています。 お願いします。
全角英字が来たぞ...
すいません。 どうも、ATLで作成したDLLじゃなくて、 interop.xxx.dllと言うのが作られてこっちが呼ばれてるみたいです。 もう少し調べてみます。
136 :
デフォルトの名無しさん :04/08/09 13:07
string型,StringBuilder型の変数のアドレスを int型かIntPtr型にするにはどうすればよろしいですか?
>>136 Marshal.StringToCoTaskMemAutoなど。
>>132 VS.Net のプロジェクトの定義のデバッグのとこかどっかで、
「ネイティブデバッグを行う」みたいなのがあるから、チェック入れといて。
>>130 ワーカスレッドの方で invoke 使って、メイン(UI)スレッド側で pixtureBox の
プロパティにセットする関数を実行させるか、bitmap を共有したいなら同期
オブジェクトを使って、
Monitor.Enter(bitmap)
ワーカスレッド側なら bitmap に対する画処理/
UIスレッド側なら Paint イベントの処理
Monitor.Leave(bitmap)
等するか。
>130 クリティカルセクションでも使ってやればシンプルでいいんでないの?
>>137 ありがとう。
コピー先のアドレスではなく
Cでいうところの
char s[256];
char* p = &s[0];
みたいなものはないですか?
>>141 GCについて理解してこい、と。
いやそれ以前の問題か?
GCは独自にメモリを管理する。
不要になったメモリは破棄し、アクセスしやすいように並べ替える。
つまりメモリアドレスを取得してもその直後にその数値が意味をなさなくなる可能性もあるってことだ。
もちろんManagedの範囲内ではそれは全く問題ないようにデザインされてる。
で、何がしたいの?
>>142 親切にしてよ。
具体的にはこんなこと
[StructLayout(LayoutKind.Sequential)]
public struct BROWSEINFO
{
略
[MarshalAs(UnmanagedType.LPTStr)]
public string lParam;
//public int lParam;
略
}
BROWSEINFO bi = new BROWSEINFO();
bi.lParam = sbFolder.ToString();
本当は
sbFolderのint型のアドレスにしたいのだが。
コールバックの
BffCallbackProc(IntPtr hwnd, uint uMsg, int lParam, int lpData)
int lpData には正しいアドレスが入るわけだが、カッコ悪い。
>>141 byte [] 経由で標準のマーシャラーに任せればいいんじゃない?
>>142 話の流れに関係ないじゃん、意味無く荒らすだけなら氏ね低脳
>>145 具体的にはどうするの?
FolderBrowserDialogではなく、SHBrowseForFolderを使って、
最初に初期フォルダを指定して(lParam)そのフォルダを選択させたい。
IMallocインタフェースとBFFCALLBACKコールバックはなんとかなって、
動作していますが、文字列のアドレスがC#ではすっきりしないので
質問したわけです。
じつはC#のマーシャリングはかなり柔軟なので、LParam型をstringに指定できたりする。 コールバックメソッドのdataもstringとして宣言してやれば文字列のやりとりは解決。
>>147 141見たんで、byte [] のポインタを fixed で取って使えばいいじゃん、
と思ったんだけど、StringBuilder を渡すのが目的ってことですか。
単純に
[MarshalAs(UnmanagedType.LPTStr) ] lParam;
じゃなくて
[MarshalAs(UnmanagedType.AsAny) ] object lParam;
にすればいいんじゃない?
コールバックの方も同様に宣言しとけば、object で取れるから、
StringBuilder 渡したなら as StringBuilder するなりできるし。
>>148 ,149
Win32APIの定義にこだわるなら 137さんのようにするか、
149さんが言われるようにlParamを動的な型にすれば、
しっくりします。納得しました。
レス下さった方、ありがとう。
>>138 デバッガのタイプ=ネイティブのみ
でできました。
ありがとうございます。
すごく初歩的な質問で恐縮なんですが private void pictureBox1_Paint(object sender, PaintEventArgs e) { Graphics g = e.Graphics; g.Dispose(); } とやるとエラーが出てしまいます。 これがFormのPaintイベントならDispose()を実行してもエラーは出ません。 PaintEventArgsには一体何が格納されているのでしょうか?
>>152 一般論だけど、自分で作ったものじゃないものを勝手に Dispose しちゃダメ。
キミが作った Graphics を、誰かのコードに「ここに描いてね」ってことで渡したら、
勝手に Dispose されたりしたら嫌でしょ。
Winnanpみたいにスキンを使いたいんですが、どうしたらいいでしょうか?
>154 アメリカならドキュメントに消しちゃ駄目と書いてなかったといってMSを訴えられるかもしれないがここは日本です.
158 :
デフォルトの名無しさん :04/08/10 17:45
HSPとC#で同じフォントサイズで文字を描画させたら違うのはなぜですか? ちなみにHSPではフォントの大きさをドット数に比例した論理サイズで指定してあります。
159 :
デフォルトの名無しさん :04/08/10 20:06
突然なんですが…… 他人の漢字で関数を書くという奴を見て激しく憤慨していたのですが、 こんどは自分が、最近数学的なライブラリーを作っていて激しくギリシャ文字を使いたい衝動に駆られます 使ってもいいですか(汗 世界中がマルチバイト対応の時代がこないかな…… そんなことを思った人挙手(^^)/
>>159 他人を激しく憤慨させるつもりがあるなら書けば?
点を描画する関数はないのでしょうか?
162 :
デフォルトの名無しさん :04/08/10 20:51
unmanaged コードで作成した DLL を C# から呼びたいとおもっています. 通常の関数であれば問題なく呼べているのですが,コールバックを受け取る方法 がわかりません. コールバックはどのように受けとればよいんでしょうか?
>>161 Graphics.FillRectangleで代用?
>>162 そのコールバック関数と返値・仮引数を同じにしたデリゲート。
>>163 今はDrawRectangleでwidthとheightを1にして代用していますが、
かなり大量に描画する予定なので出来ればもっと簡単に処理出来るものはないかと思ったのですが・・・
BitmapクラスにはSetPixelというのもあるが、だめか?
>>164 Win32APIのSetPixel関数かな。
どのみちあんまり「簡単に」とは行かないような気がするけど。
Bitmapオブジェクトが取得できるならBitmap.SetPixelがベストだけれど。
C++のようなローカル変数のconstはどう書けばよいのでしょうか? private void timer1_Tick(object sender, System.EventArgs e) { string s = text1.text; // <- constにしたい。 // これ以降sを変更したくない。 おねがいします。
168 :
デフォルトの名無しさん :04/08/11 11:39
C# で PathAddBackslash() PathRemoveBackslash() に相当するものはありますか?
>>168 たぶん無いと思うけど、それくらいすぐ実装できそうだな。
>>167 readonlyじゃね?
…と思ったらローカル変数に使えなかったスマン。
>>167 private void timer1_Tick(object sender, System.EventArgs e)
{
string s = text1.text; // <- constにしたい。
// これ以降sを変更したくない。
if(s != text1.text){
MessageBox.Show("変更するなつってんだろゴルァ!!!!!!!!");
}
}
>>172 text1.textを変更しただけなのに文句言うなよ。
Monitorを使ってて不思議に思ったのですが private void button1_Click(object sender, System.EventArgs e) { Monitor.Enter(bitmap); //テキトーなビットマップをロック textBox1.Text = "適当に"; } のイベントを起こした後、 Monitor.Exitを実行していないのに private button2_Click(object sender, System.EventArgs e) { Monitor.Enter(bitmap); //同じビットマップでロックを取得 textBox1.Text = "これは表示されないはずなのに"; } ↑これが実行されてしまいます。 スレッドとイベントなら同期が取れるのですが・・・。
>>174 同一スレッドでEnterしてるからじゃない?
>>175 ありがとうございます。
MSDN読んでもピンとこなかったで助かりました。
>>174 Monitor も良いけど、
っていうか過去に Monitor つかえみたいなこと書いた気がするけど、C# なら
Monitor.Enter(obj)
try { ... }
finally { Monitor.Exit(obj); }
の簡易文法であるところの
lock(obj) { ... } も便利ですよ。
まあ、
>>174 みたいにブロックじゃない形で使いたい場合は仕方ないでしょ。
ブロックにできるのであれば普通lock使うけどね。
しかし一番の問題は、
>>174 がMonitorの用途を誤解しているようだと言う事…
まあ理解したんならいいんだけどね。
>>168 この流れで質問だけど、単純に『パス』って言った場合、最後に \ は付くの付かないの?
FontDialog にヒラギノ系フォントを表示させたいのですが 何かよい方法はないでしょうか FontDialog Show何タラプロパティ Allow何タラプロパティ すべて試してみたのですがだめでした。
>>179 質問の意味はよくわからんが、とりあえずPathクラスの各メソッドが返す文字列にバックスラッシュはつかんな。
>>158 GDIとGDI+では表示が異なるので仕様
while(true){ try{} catch{} finally{} } とリリースモードで実行するとfinally節が実行されません。 しかし int i= 0; while(i < 1) とやると(iの値は変化しないので事実上無限ループ) リリースモードでも問題なくfinally節が実行されます。 なぜwhile(true)だとfinallyが実行されないんでしょうか?
>183 optimizer が『while の中には実行しなければならないものは無い』と判断して 丸ごと消してしまったのでは?
>>183 finally節が実行されないことをどうやって確かめたの?
>>184 それはVisualStudioの設定なんでしょうか?
>>185 実際にはfinally節にMessageBoxを仕掛けて確かめました。
SharpDevelopだと同様のことをやってもちゃんとfinallyが実行されるので
やはりVisualStudioのリリースモードが何かをやってれるのだと思うのですが
>186 MessageBox 仕掛けてるのに無視ってのは optimize されたにしてもマズいよなぁ。 # もしかして optimizer の bug ?
>186 VC++6.0のときだけれど、同じようなのありますよ. アセンブラで見てもコードがない. デバッグだとある。最適化全部消して解決しました. Optimiseなんて信用してません.
ループを抜ける条件が無い時点でそんなコードを書いたり実行する機会は無いし、 どうでもいい。
>>188 やっぱり仕様なんですかね・・・
割り切ることにします。
情報ありがとうございました。
>>186 具体的にどんなコードなの?
ILDASMで見てもやっぱりfinally句はなくなってる?
VisualStudioとSharpDevelopで違うってのが釈然としないなあ。 コンパイルってどっちも結局CSCでやってんでしょ?
193 :
デフォルトの名無しさん :04/08/13 10:36
.GetHashCode()で得られる値というのは 何に活用するものなのでしょうか?
… Object.GetHashCodeのヘルプをみれ。
>>192 くっついてるコンパイルオプションの問題じゃね?
うーんでも最適化関連で生成コードが変わるようなオプションて 一つしかないような気がするしね… 例えばSharpDevelopがリリースビルドでも最適化を有効にしてないとかなら 分かるけど、そんなことはないような気がするし…
参照設定したDLLをEXEに埋め込む方法ってあるの?
>>197 自己解凍実行形式の圧縮ファイルを作れば
そ、それは…いいのかそれで?
これで、いいのだ!!!
EXEと一緒に配布するDLLを 他のプログラムからは参照させないようにしたいんだけど、できますか??
DLLファイルを分割して配布し実行時に結合してDLLとして使用する. できるかしらんが駄目?
別に分割せんでも暗号化しておいて実行時に複号とかのほうが。 まあ分割だろうが圧縮だろうが暗号化だろうが技術的には可能だけど、 C#でやることじゃあない気がするな。
205 :
デフォルトの名無しさん :04/08/13 22:06
頭の中でもぼんやりとしているので曖昧にしか書けないのですが, 全く同じ関数名の関数を持つ,2つのクラスがあります. これらを利用するコードはある条件をみて, その2つのクラスのどちらの関数を利用できるかを判断したいと思っています. 例えば ClassTestNo1, ClassTestNo2 とあり, それらの中でそれぞれ MethodTest という関数が定義されている時に, それを呼び出すコード は ClassTest.MethodTest(); のように呼び出したいのです.で,なんらかの条件による判断で, ClassTest が ClassTestNo1 なのか ClassTestNo2 なのかは 動的に決定したい,という事が行ないたいです.ただし, ClassTestNo1, ClassTestNo2 は Static で定義されているので, 利用する前に条件を見て,new すればいい,という事はできません. なにかアドバイスを頂けないでしょうか?
>>205 設計をやり直す。
てのはともかくとして、動的に判断する以上利用者側が判断用のboolをもってるんだろう?
ClassTest.MethodTest(bool)
にすればいいんでないの?
>>205 僕も最近それに近い事をしているので、どぞ
こんな雰囲気のコードでいけると思います。
object hoge = new ... ;
if( hoge.GetType().GetMethod( "MethodTest" ) == null )
{
ClassTestNo1();
}
else
{
ClassTestNo2();
}
とか、こんな感じ
GetMethod の戻り値オブジェクトにイカしたメソッドがいっぱいあります。
>>207 の続き
ん、205の用件とちょっとズレてる気がする
これは MethodTsetがあるかどうかで、呼び出す関数を決めてますが、
適当に変えてください、肝はGetMethod()なので、これでも十分と思ので。
>>208 うーん、うーむむGetMethodが肝なのか…?
>>205 これでOK?
if (ClassTest is ClassTestNo1)
{
}
マーカーインターフェースを利用する際によくやる手だけれども。
てか、呼び出す静的メソッドを切換えたいだけだろ? ClassTestからアクセスできる形で条件に合わせてデリゲートでも作っとくか、 呼び出された時点で条件判断して呼び出すメソッド変えたらいいんじゃないの? 2種類しかないなら、まあ後者のやり方でもいいかな。 デリゲート使う方が柔軟ではあるけど。
デザインパターン的には大体こんな感じかな? interface IClassTest { void MethodTest(); } class ClassTestNo1 : IClassTest { 略 } class ClassTestNo2 : IClassTest { 略 } class ClassTest{ public static IClassTest classTest; public static void MethodTest(){ classTest.MethodTest(); } } //呼び出し側 ClassTest.classTest = new ClassTestNo1(); ClassTest.MethodTest(); ClassTest.classTest = new ClassTestNo2(); ClassTest.MethodTest();
213 :
デフォルトの名無しさん :04/08/15 00:35
Cだと、入力された文字がアルファベットかどうか調べる場合 char c; if ( (c <= 'a' & c >= 'z') == (c <= 'A' && c >= 'Z') ) { 処理; } みたいな感じで切り分けられましたが、C#の場合はどうすればいいんでしょうか? 正規表現を使うしかないんでしょうか。。
>>214 stringの中だけで考えていたんですが、charを見てみると
IsLetter()のような便利な関数を発見しました。
ありがとうございます。
>>213 お前はヘルプというものを読んだことがあるか?
char.IsLetter(c);
うーん回答がずれてる希ガス
てかcharにキャストって出来ないと思うが…
charでは取得できてるんじゃないの?
その場合は、char.IsLetterとかでできんかいな?
あとどうでもいいが、
>>213 の条件はいったいなんだ?
ちなみにCでも普通は文字コードを直接条件に書くようなことはしない。
>>215 .NETはUnicodeだということを忘れずに。
Char.IsLetterは、例えばギリシャ文字のアルファベットもtrueを返す。
つーかお前らがこの条件見てなんとも思わないのが不思議だ > if ( (c <= 'a' & c >= 'z') == (c <= 'A' && c >= 'Z') ) これどういう意味よ?
>>221 ごめん、確かに
俺一生懸命この条件の真の意図を考えてたよ
プログラムが実行されているディレクトリを調べるにはどうしたらいいですか?
実行されているディレクトリとは、 カレントディレクトリ、EXEのあるフォルダ どっち? それともアプリケーションベース?
>EXEのあるフォルダ です。
>>222 おれも、実はすっごいひねくれてる条件で、
正しく動くのかと検証しかけたんだが…
> (c <= 'a' & c >= 'z')
&は誤植としてもこの時点でありえね〜って結論になった…
System.WIndows.Forms.Application.ExecutablePathだったかそんなの。
あ、フォルダだったか、それなら、System.IO.Pathだったか使って加工してくれ。 加工せんでも直接取れるプロパティもあったかも、ちょっと失念。
Application.StartupPathだね。
見つかりました。 有難うございます。
232 :
デフォルトの名無しさん :04/08/15 09:16
.NET2003のC#のフォームエディタでフォームをデザインしたけど それがどのようなプログラミングで再現されているのか知りたいのですが方法はありますか? たとえばJavaでいえば jPanel1.addComponent(jTextField1); jTextField1.setText("abcdef"); こんな感じの奴です。 おそらくInitializeComponent();あたりが怪しいと思うのですが・・・
>>232 InitializeComponent() のなかにある。
何が分からない?
234 :
デフォルトの名無しさん :04/08/15 09:54
>>233 .NET2003のソースエディタでは非表示になっていたから分かりませんでした。
今、別のテキストエディタで見たらちゃんと記載されてました。
天然モノでつか?
本物のバカ再来だな。
>>236 自己紹介板のリンク張った方が良いですか?
> それがどのようなプログラミングで再現されているのか 天然丸出しの文章だね、プッ
結局Genericsを正式につかえるようになるのはいつ頃になりそうなんでしょう? Whidbeyは2005年半ばになるらしいけれど、それまでは待ちたくない... どこかのサイトで.NET1.1でもC#用としてだけならGenerics使えるコンパイラがあるとかいてあったようなきもしましたが.
複数行可能・初期状態まっさらの TextBox に行を追加するのって TextBox.AppendText( text + "\n") で良いんだよな? 何で表示されないんだろ?
\nだけでよかったっけ? \r\nにしたらどうなる?
>>241 Line にはちゃんと別の行として反映されてる
けど表示がサパーリ
追加しても何も表示されないか、同じ行に書かれる
TextBox って、BeginUpdate みたいな機能ないよなぁ
なんでだろ
単にtextBox.ScrollBarsがScrollBars.Noneになってて見えないだけとか言わないよな?
>>243 Both で作ったし、そもそもデバッグ時に画面いっぱいに広げていたから多分違う
ちゃんと複数行になってる?
>>245 MultiLine は true
false でも変わらなかったが
TextBoxの大きさがないと見た
textBox1.AppendText("\r\n"); でできたんだけど
Environment.NewLine 使え。
まったくだ。
一旦削除して作り直したら同じコードでも上手くいった なんだったんだ一体?
基本はリビルド、それでだめなら消す
>251 それエディットこんティニューのバグでないの? >253の言われるとおり困ったらリビルド
ごめんもしかしたら別スレッドから書き込んでいたのが原因かもしんない
素朴な疑問、果たしてEnvironment.NewLineを使うべきなのか?
別スレッドからやったんかい!
>>256 ドキュメントには Environment.NewLineは "\r\n" で、Console.WriteLine等の WriteLine
メソッドで自動的に付加されるものであって、プラットフォーム毎のカスタマイズ対象だ、
としかかかれていなくて、Form (コントロール)類との関係が一切不明だものね。
そうそう、UIの部品の仕様とプラットフォーム標準の改行コードは、 同じと考えてよいのか(現状の環境ではそうだが)、独立した物ではないのかと。
多分別スレッドから AppendText やったからおかしかったんだと思う という事は今はたまたまできているだけで、いずれまた同じ結果になるということか この現象はコンポーネントを lock すれば回避できるんだっけか? よーわからん しかも別の部分で TreeView.BeginUpdate している箇所も、 同じ原因で弾かれたし OTL
lockの意味を考えればまず無駄という事が分かるだろう。 そういう場合はInvoke経由でコントロールを操作する。
>>262 あ、了解です
という事は、コンポーネントをラップするクラスを作ると良いかな?
Control.Invoke がコードの随所に分散するのは不味いだろうし
Textプロパティには 複数行テキスト ボックスのテキストの読み取り、または設定には、 Lines プロパティを使用します。 と書いてある…。 Linesプロパティには テキスト ボックス コントロールの Multiline プロパティが true に設定されているときに、 テキストに改行文字が表示されると、改行文字の後ろに続くテキストが配列内の新しい要素に追加されて、別の行に表示されます。 と書いてある。 改行文字の定義は\n単独が不可ってことは、Environment.NewLineしか思いつかない。
265 :
デフォルトの名無しさん :04/08/17 07:22
>>264 ControlChars.NewLine
どれでもいいけど統一しろよ…。
ControlCharsはMicrosoft.VisualBasic名前空間の中、 つまり過去のVBとの移植性のために存在してるものだから不適当だと思うが。 名前の意味も“エスケープキャラクタ”ってほどのものだろし。
すいません、色変換で下記のように30個以上のカラー リマップ テーブルを定義してい るのですが、もっと簡単に記述する方法はありますでしょうか。 最近C#を始めたのでまだ書き方よくわかりませんです。 System.Drawing.Imaging.ColorMap[] cms =new System.Drawing.Imaging.ColorMap[] { new System.Drawing.Imaging.ColorMap(), new System.Drawing.Imaging.ColorMap(), ・・・・・
>>268 //コードの最初
using System.Drawing.Imaging;
//定義部
ColorMap[] cms = new ColorMap[30];
for (int i = 0; i < cms.Length; i++)
cms[i] = new ColorMap();
//ふらっとスレの方がいいかもな。
>>269 ありがとうございます。利用させて貰います。
ところでふらっとスレとはどこでしょう・・・
透過色について質問があります。 新しく生成したBitmapはデフォルトで透明色になっています。 GetPixelでColorを取ると、A=0,R=0,G=0,B=0となってました。 しかし、new SolidBrush(Color.FromARGB(0, 0, 0, 0))で塗りつぶしても透明になってくれません。 何か考え違いをしているのでしょうか?
>>272 で、どこで透過色を使うの?
Color.A=0なブラシで塗りつぶしても意味無いのは確かだけどな。
//完全に透明な色を上から塗ってなんになる?
>>273 言われてみればそうですね・・・。
やりたかったことは、Bitmapをまっさらな状態に戻したかったんです。
今は
黒で塗りつぶし→MakeTransParent(Color.Black)とやっているのですが、
もっとスマートに出来ないものかと思いまして・・・
>>274 Graphics.Clear(Color)
276 :
デフォルトの名無しさん :04/08/18 00:12
ウィンドウの透明と描画の透明は別物なのでしょうか? またある色だけが透明なウィンドウにするのは可能なのでしょうか?
>>274 一部だけ透明にしたい、などの場合には
Graphics.CompositingMode = CompositingMode.SourceCopy;
した後、透明色で塗ればOK。
C#でbyte型の配列をごっそり確保してデータセグメントとして使い、 その領域に対してintやfloatのデータを書きこみたいのですが、 どうすればよいのでしょう? また、そのデータセグメントから、もとのint値やfloat値を取り出し たいのですが、どうすればよいのでしょうか?
C#ってメモリイメージ見れるんでしょうか?
メモリを直にいじるにはアンセーフコードを書かねばならん。
>>279 LayoutKind.Explicitの構造体を作ってFieldOffsetの指定をする。
>>279 こんな感じか。インデントは適当。
struct abc
{
public floatf;
public inti;
}
public unsafe static void test()
{
byte [] buffer = new byte[ sizeof(abc) ];
for (int i = 0; i < sizeof(abc) ; i++)
buffer[i] = 0;
fixed (byte* pBuffer = buffer)
{
abc* pa = (abc*) pBuffer;
pa->f = 1.0f;
pa->i = -1;
}
}
MemoryStreamとBinaryWriterで
まああんまりC#でやることではないわなぁ。
MSDNによると使い終わったGraphicsオブジェクトは破棄しましょう、とのことなので private void pictureBox1_Paint(object sender, System.Windows.Forms.PaintEventArgs e) { Graphics g = e.Graphics; //描画処理 g.Dispose(); } とやるとエラーが出て落ちてしまいます。 GraphicsオブジェクトはDisposeしてはいけないのですか?
>>286 自分で作成したもの以外は Dispose しちゃ駄目
つまりCreateGraphics()で取得したオブジェクト以外はDisposeせずに放っておけばよいのでしょうか? MSDNのサンプルでは、FormのPaintイベントでDisposeしてましたが、 FormのPaintイベントだとDisposeしてもいいみたいですね・・・
既出だったんですね・・・ 過去ログ全然読んでませんでした。 スミマセンでした。
C# では、ポインタのアドレスを加算したり減算したり、メモリの任意のアドレスに アクセスすることはできません。これにより、アプリケーションの信頼性が向上します。 また、C# ではメンバの絞り込みに使う C++ の演算子「::」、「.」、「->」などの区別が ありません。すべてドット( . )で表現します。 さらに、C++ は C 言語の拡張であったため、C 言語流に記述してオブジェクト指向 らしからぬプログラムを書くことができましたが、C# では必ずクラスを使うことが強制 されます。そして、C# ではオブジェクトに属さないグローバル関数だけのプログラム やグローバル変数の宣言が、構文上できなくなっています。
MainMenuの高さを知る方法ってある?
>>293 C# では必ずクラスを使うことが強制されます…
よくそういうことが大変重要な事のようにかかれるのを見かけるが、
結局のところ、オブジェクト指向らしい?プログラムを書くことを
強制すると言う意味では実質あまり意味はない。
>>292 System.Windows.Forms.SystemInformation.MenuHeight
タブで切り替えのできるメニュー型ランチャーでも 作ろうとおもたんですが微妙に難しいですね。 MDIで何とかできると思うんですが、メニューを 親ウィンドウに統合しないようにするのはできますか?
ぶっちゃけ、Menuとかコントロールとか全部自分で描画するようにすればあとあとらくできるよ。
>>296 全部描画ということはやはりCDI+の知識が必要になってくるわけですよね?
この際GDI+習得しちゃおうと思うんですが、入門的なことを書いてるサイトとかありますか?
コンポーネントとかは1から作ったことがないんで・・・
自分は本のほうがお勧めですが... サイトはわからんです.
70じゃない...orz
描画から全部自分でやるようなカスタムコントロール作る時は、 異形のものにならんよう気をつけなとね。 いわゆる、"Windows標準"に みんなが慣れてしまっているのは仕方ないことだから。
>>295 ToolBarを使ってメニューっぽく見せるとかは?
>>291 初心者も見てるスレだから、妙な釣りはやめて欲しい・・・
何でこんな独り言? とは思った
ToolbarやPanelなどのコントロールのソースコードは公開されてないのですか?
>>305 ILDASMとかで開けばどんな処理をしているかは見られる。
>>303 だって実際
>>283 でできてるじゃない。いくら MS のサイトに書かれているからって、
明らかに事実じゃないことをいきなり書くのはやはり混乱の元だと思う。
手持ちの資料にあるC#でのポインタの使い方。 Managed DirectX 9 - Graphics and Game Programming - Kick Startより抜粋。P145。 やっぱアンセーフコードなんで、オススメはしない。 ポインタを使う前後に、ロック、アンロックしてるね。 private unsafe void FillTextureUnsafe(Texture t, bool random) { SurfaceDescription s = t.GetLevelDescription(0); Random r = new Random(); uint *pData = (uint *)t.LockRectangle(0, LockFlags.None).InternalData.ToPointer(); for (int i = 0; i < s.Width; i++) { for (int j = 0; j < s.Height; j++) { if (random) { *pData = (uint)Color.FromArgb(r.Next(byte.MaxValue), r.Next(byte.MaxValue), r.Next(byte.MaxValue)).ToArgb(); } else { *pData = texColor++; if (texColor >= 0x00ffffff) texColor = 0; } pData++; } } t.UnlockRectangle(0); }
昨日Paintイベントについて伺ったものです。 過去ログを全て読んだのですが、 自分で作ったGraphicsオブジェクト以外は解放しちゃいけない、というのはわかったのですが、 何故なんでしょうか? PaintEventArgsにはClipRectangleとGraphicsぐらいしか入ってないのに・・・ Disposeされたときに呼ばれる System.Drawing.Graphics.EndContainer(GraphicsContainer container) が怪しいと思うのですが。 どなたかご意見、情報お持ちの方レスお願いします。
PaintEventArgsオブジェクトが他で使われるから。 例えばあなたが書いたイベントは次のように呼ばれているかも知れないだろ? Graphics g = CreateGraphics(); PaintEventArgs arg = new PaintEventArgs(g, this.Bounds); IntPtr dc = g.GetHdc(); ... if (this.Paint != null) //Paintイベントに何か入ってるか Paint(this, arg); g.ReleaseHdc(dc); //イベント先で実行されたメソッドでGraphicsがDispose()されてたらエラー g.Dispose();
>>310 現在の実装ではControl.WmPaint()の中で
PaintEventArgsインスタンスを作成して、
その後、OnPaintメソッドに渡してPaintイベント発生という
流れになっているわけだけれど、
Paintイベントから返ってきた後で
PaintEventArgs.Dispose()が呼び出されてる。
よってDispose()を二回呼び出していることになるわけで
それがおそらくエラーの原因。
>>311 >>312 お二方ともわかりやすい説明ありがとうございました。
今日一日悩みぬいたことが解決しました。
>>308 初心者相手にunsafeを教える方がどうかしてる。
別に初心者スレじゃないだろ
>>316 初心者も見ているからやめろと
>>302 が言っている。
それに対する反論だから初心者が前提に決まってる。
>>318 ありがとうございます。
がんばってみます。
>319 自分は仕組みが全部分からないと駄目なので読んでました. でも一度それやるとWindowsに何されてるかわから内というのがなくなるのでお勧めです.
>>320 その本ずっと気になってるんだけど流石に上下巻そろえる金はないし・・・で。
ウィンドウプロシージャとかメッセージループとかは解説されてるんでしょうか?
>>312 IDisposable.Disposeは複数回呼び出しても良いことが保障されている。
・・・あれ? ということはまたふりだしですか?_| ̄|○
>>322 それって、自分のクラスにDisposeを実装するときは、
一回しか呼ばれないことを仮定してはいけないってことですか・・・?
327 :
デフォルトの名無しさん :04/08/20 10:13
構造体の全てのメンバを任意の時点で全て初期化したい時は どのようにやればよいですか?
newする。 あるならEmptyフィールドとか使う。
329 :
デフォルトの名無しさん :04/08/20 11:07
C#のMDIウインドウのプログラムを作成しています。 タイトルバーとかサイズ変更の箇所をクリックしないと 背面のフォームがアクティブ(最前面)にならないのですが これはそういう仕様でしょうか? 作り方が間違っているでしょうか? 背面フォームのどこを触ってもアクティブになって欲しいんですが・・・。
>>324 フレームワーク側は単に Dispose するんじゃなくて、なにかしてるんでしょ。
>>311 を良く見るように。
GetDC / ReleaseHdc じゃなくて、BeginPaint / ReleaseHdc + EndPaint だろうけど。
>>330 ところどころでPaintイベントから返ってきたあとでPaintEventArgsのメソッドを呼び出してたり、
一つのPaintEventArgsを複数回のPaintイベントに渡してる箇所があるな。
C#は全然分からんが人生はDisposeしてみたいな。
>332 をガベコレ
332みたいのに嬉々としてレスする奴って、 普段技術的な話にはまったく参加できてない奴なんだろうな。
336とかね
>>335 誰かから参照されているいないとDisposeは無関係。
よって
>>335 は誰からも参照されていない。
338が参照しますた 随分遅れた夏が来た?
ム板っぽくていい。
PaintEventArgsにGraphicsとかClipRectangleとかをつめつめしてるのはControl.WndProcなんでしょうか? .NET Frameworkで実際どのような処理が行われているか、 ソースを見たりする方法はないんでしょうか?
ILDASM で逆アセして解析。
ILDASM で逆アセして解析できないアセンブリで、ソフトウェアを公開したいのですが、 どうやればいいしょうか??
多倍長クラスとか標準でついてたっけ?C#
>>345 > //「とか」って何さ。
彼女とかいるの?の「とか」だろ
347 :
デフォルトの名無しさん :04/08/21 14:23
XMLコメントの中で "<"をあらわすにはどうすればいいんでしょ? 行末の</Summary>に反応してしまうんですが・・・・
<
>>347 は「自分で調べる」=「人に聞く」価値観をもった厨房の典型例だな。
stringは値型ですか?参照型ですか?
>>341 >PaintEventArgsにGraphicsとかClipRectangleとかをつめつめしてるのはControl.WndProcなんでしょうか?
Control.WmPaint()
>>342 自分で書いてない処理も出力されたっけ?
>>353 だったらMSが書いたアセンブリをILDASMにかけるといいよ。
>>353 自分が書いた処理と「他の誰か」が書いた処理を
どうやって判断すると思うんだ?
いやILDASMってソースファイル上に書いてない処理まで出力してくれるの?
その前にソースファイル上に書いてない処理をどうやってアセンブリに組み込むのか知りたい
自分で考えろ阿呆
360 :
デフォルトの名無しさん :04/08/22 08:04
いまさらなんですが...... C# && .NET FrameworkでRS232Cの通信をしたいのです。 mscomm32.ocxは、VisualStudioに取り込めるのですか? ちょっとググったらStreamから継承して自分で作れ、 みたいなのもあったんですけど、具体的なコードがなかったので、想像もつきません。
private void pictureBox1_Paint(object sender, System.Windows.Forms.PaintEventArgs e) { Graphics g = pictureBox1.CreateGraphics(); //なんか描画する g.Dispose(); } とやるとフォームが読み込まれた最初はピクチャボックス内の描画が表示されません。 しかし、ウィンドウを重ねるなどして再描画させるとちゃんと表示されます。 が、たまに再描画してくれない時もあります。 海外のサイトに同じようなことを取り扱ったところがあり、 そこではピクチャボックスの代わりにパネルを使え、とあったのですが、 何故ピクチャボックスはこのようなことになるのでしょうか? //素直にPaintEventArgsのGraphicsオブジェクトを使えばいいとはわかっているのですが
364 :
デフォルトの名無しさん :04/08/25 20:46
ボタンのオーナードローをしたいのですが、 ButtonクラスにはDrawItemのイベントはないのでしょうか?
>>364 ButtonにItemなんてあんのかよ?
普通はOnPaintをオーバーライドしていじる。
>>363 漏れの直感では、PictureBox の Paint イベントはライブラリ側でダブルバッファリング
しているような・・・
WndProc をオーバーライドして、
WM_PAINT 時に Win32 API の BeginPaint / EndPaint した後に
そういうコードを書けば良いような気がする。
もっとよいのは、Paint イベントを自前で処理するなら PictureBox なんか使わないこと
だと思う。
368 :
デフォルトの名無しさん :04/08/25 21:14
WINDOWS XP使用しています、コマンドプロンプトで TEMPディレクトに移動しようとしてcd \TEMPと入力しても 何故か指定されたパスはありませんと表示されて移動できません 何故か本のは、できています。使用している教本は 十日でおぼえるC言語入門教室と言う本です。 ご助言頂けたら幸いです。
>>368 cd \TEMP だとルートディレクトリにある TEMP に移動しようとする
cd TEMP とせい
370 :
デフォルトの名無しさん :04/08/25 21:25
>>369 真にありがとうございます、さっきも
似た様な事が起こりました、本のは
cd WINDOWSとなっていて、そのとおりやってもできず
cd \WINDOWSと\を付けたらできたりとか
何が原因なんでしょうか?連続質問、すみません。
しかも実際、移動しても アクセサリーのエクスプローラーで見ても フォルダが移動されてない気がするんですが これで宜しいんでしょうか・・・・?
そろそろスレ違いというか板違いに気づけ
すみませんでした
フォームにラベルを配置して、それを覆い隠すようにピクチャボックスを配置して、 ピクチャボックスのBackColorをColor.TransParentにすると、 親であるフォームの背景色が透過され、 下にあるはずのラベルが見えません。 ピクチャボックスの親をラベルにすれば出来るのですが・・・ ピクチャボックスの親をフォームにしたまま、ラベルが見えるようにする方法はないのでしょうか?
>>374 PictureBox.Visibleをfalseにするとか。
>>374 Win32 API を使うか何かして、ラベルやピクチャボックスのウィンドウスタイルから
WS_CLIPSIBLINGS を外せばいいんじゃない(Form のを外すんだっけ?)
>>375 ピクチャボックスが見えないと困るんです・・・。
やりたいことは
テキストボックスやボタンを配置した普通のアプリで、
一定時間操作がないとフォーム上をスクリーンセイバーのように
キャラクターが動き回る、というものです。
なので、キャラクターはコントロールの上に描画されて、且つ描画されない部分は下のコントロールを透過させたいんです。
何卒よい知恵をお願いします。
378 :
デフォルトの名無しさん :04/08/26 21:59
CashedBitmapをC#から使うにはどうすればいいのですか?
>>377 FormにWM_PRINTを送ってFormのImageを取得、それを背景画像に使うというのは?
Bitmapってお金になるのか
Bitmapシャツでも作るの?
BitmapソーセージとかBitmapカレーとか
ソーセージ&マメ
文字列内 \x に続く 16 進数の記号を、対応する文字コードに置き換えるコードは 置き換えに Regex を使うとするとどうなりますか?
>>384 上手いやり方があるかも知れないが
考えるのが苦手な私はRegex.Replace(string, MatchEvaluator)を使う。
Disposeしたらお金にはなりません。
387 :
デフォルトの名無しさん :04/08/28 12:22
同期について教えて頂きたいんですが、 例えばあるクラスのint型のメンバへのアクセスで同期を取りたい場合、 意味のない適当な参照型をlockして同期を取ってもいいのでしょうか? lock(bitmap){}とか
388 :
デフォルトの名無しさん :04/08/28 12:44
C#でエクセルにデータ貼り付けた後に、ソートしたいんだけど、 oSheet.get_Range(oSheet.Cells[1,1],oSheet.Cells[10, 100]).Sort( の引数に、どう値をセットしたら良いかわからない・・・ カラムが10個あって、そのうちの3つ目、4つ目の値をキーにソート したいのだけども・・・ 誰か教えて
>>389 それはそうなんですが、
例えば、
get{
lock(bitmap{
}
}と
set{
lock(bitmap){
}
}
とやればbitmapへのロック自体は意味なくても、
set側とget側で同期が取れるんじゃないかなぁと思ったんですが
>>390 無理。あり得ない。
ロックは
「そのブロック中は他スレッドからの操作を待機させる」
じゃない。
「そのブロック中はロックしてるオブジェクトの他スレッドからの操作を待機させる」
だ。
>>391 何かおかしくないか?
lock は「この中でこのオブジェクトを使うから他の奴は待ってろ」っていう動作をするんだぞ?
待つのは lock の先頭、Monitor.Enter を行った瞬間だけだ
なのでこの場合は
>>390 の同期は取れる
ただし意味の無いオブジェクトをロックに使うのは無意味だから止めとけ
private void Form1_Load(object sender, System.EventArgs e)
{
Monitor.Enter(bitmap);
}
private void thread()
{
lock(bitmap)
{
label2.Text = "ここがでない";
}
}
private void button1_Click(object sender, System.EventArgs e)
{
Thread td = new Thread(new ThreadStart(thread));
td.Start();
}
こんな形でなんとか同期は取れてるのですが・・・
>>392 値型で同期を取るにはどうすればいいのでしょうか?
>>393 ありがとうございます
教えて頂いた方法でやってみたいと思います。
>>392 んが、ほんとだ。
適当なこと言って悪かった。
391は取り消し。
書き込み出来なくなってる? マルチスレッドは難しいなぁ。
>>387 値型でロックをとるという操作自体は無理。
が、べつに適当なロック用オブジェクトを作成しておいて
それで同期を取ることには何ら問題はない(正しく管理していれば)。
どうも勘違いしている書き込みが多いような気がするが、
ロックは必ずしも排他アクセスさせたいオブジェクトそのものに対して
行わなければならないわけではない。
インスタンスメソッドなのであれば、場合によってはthisでロックしてもいいし、
それがダメなら、例えばメンバに、
object forIntMemberLock = new object();
とでもしておいてそれをロックしてもいい。
追加、表現に若干語弊はあるが、lockというのは単純に言えば、 他のスレッドからの、同じオブジェクトに対するlockを待たせるもの。 「対象のオブジェクトへのアクセス」を禁止する物ではない。
mandatory lockingというやつですな
話の流れから言えば advisory lockingというやつですな な気がするが…
lock なんつうシンタクスシュガーを使わずに Monitor つかえや( ゚Д゚)ゴルァ!! ってことか
>>402 は分かってないけど分かってるようなフリをしようとして失敗した馬鹿。
405 :
デフォルトの名無しさん :04/08/28 19:36
ということにしてしまいたい理由はなんだろう ;-)
406 :
デフォルトの名無しさん :04/08/28 22:55
ということでないとしたらどん可能性があるかな
407 :
デフォルトの名無しさん :04/08/29 02:24
Class1.Test() メソッドを呼び出すとイベントが発生するようにしたいんですが、以下のソースだとぬるりが発生します。 どうやったら、上手くイベントを発生させられますか? public delegate void Handler(); public class Class1 { public event Handler Handle; public void Test() { Handle(); } } public class Class2 { public static void Main(string[] args) { Class1 c1 = new Class1(); c1.Test(); Console.WriteLine("Hello World!"); } }
ウェブにだって本だってサンプルいくらでも転がってるだろ・・・ if (Handle != null) Handle();
ファイルのリストの差分取るのって考え方としてはどうやればいいですか? よく差分バックアップするソフトにはこういう機能が付いてるんじゃないかと思うのですが。 物凄い初心者なんで考え方が分かりません。 ファイル名を比較しながらループさせたらできますか?でもこれだとめちゃめちゃ重くなりそう!?
C#に関係ないじゃん
メモ nanocrew.net - Software www.nanocrew.net/software/ DeDRMS - CLI utility for decrypting AES encrypted MPEG4 AAC files. FairKeys - CLI utility for retrieving FairPlay keys from Apple's servers. JustePort - CLI utility for streaming MPEG4 Apple Lossless files to an AirPort Express.
C#のダイアログで、C++みたいなDDXのような機能ってあるんでしょうか?
ない。 >C++みたいなDDX DDXはC++とは関係ねーだろ。WTLとかMFCの機能だ。 .NETではライブラリが充実してるから、 そんな腐った機能は逆に邪魔なだけ。
C#コンパイラはVisualStudio.Netにしか無いんですか?
.NET Frameworkの再頒布可能パッケージについてる。 つまり.NETアプリが実行可能な環境ならコンパイルも可能。 //Microsoft.CSharp.Compilerクラスで実行時コンパイルなんてな。
ありがとうございます。
ちょっと前の話題ですが、とあるクラスのインスタンスメソッドで適当に排他したいなら、 lock(this) {} がお勧めです。
>>418 というか、MSDN にもそう書いてある。
非 static メソッドなら lock(this)
static なら lock(typeof(TypeName))
ま、それで十分な場合も多いね。
421 :
デフォルトの名無しさん :04/08/31 02:17
TextBoxで、[Ctrl+←]を押すと[Home]と同じ働きをしてしまうのですが、 これを無効にするにはどうすればいいですか? 例えば、[Ctrl+j]を[←]と同じ動きをするようにしたいのですが、 [Ctrl+j]キーを押したときに、 SendKeys.Send( "{LEFT}" ); としてみても、Ctrlキーが押されているので、 [Ctrl+←]として認識されてしまい、 [←]キー単体で押している時のようにできませんでした。
>>421 ProcessCmdKeyとかそのへんでできない?
[Ctrl+j]ならContextMenuだけでいけるかもしれない。
>>422 どうもありがとう。
でも、うまくいきませんでした。
やったことは、
ProcessCmdKey()の中で、[Ctrl+J]の時に、
SendKeys.Send( "{LEFT}" );
あるいは、
keyData = Keys.Left;
とやってみましたが、[Ctrl+←]になっちゃいます。
ContextMenuも試してみましたが、マウスの右クリックからは望むとおりにできましたが、
キーボードからショートカットを打つと矢張り[Ctrl+←]になりました。
どうすればいいですか?_| ̄|〇
いままで.NET Frameworkにキャレット関係のプロパティ・メソッドが見あたらないことが不満だった。 しかし私は開眼した! SelectionStartプロパティが選択中か否かにかかわらずキャレット位置を示すのだ! ってことでProcessCmdKeyメソッドでこんなのでいける。 if (key == (Keys.Control | Keys.J)) { int current = SelectionStart + SelectionLength; SelectionLength = 0; SelectionStart = current - 1; return true; } else return false;
あ、>424にバグが。 SelectionStart = (current > 0) ? current : 0; だな。
ぐだぐだ。 SelectionStart = (current > 0) ? current - 1 : 0;
> しかし私は開眼した! > SelectionStartプロパティが選択中か否かにかかわらずキャレット位置を示すのだ! ここでゲラゲラ笑った
前キャレットの場合はどうなんの?
>>424 ぐだぐたのところわるいが
else
return base.ProcessCmdKey(...)
にしる。
>>423 メッセージの段階で変換するとか。
ProcessKeyEventArgsとかその辺でいけるはず。
XmlDocumentの配列ってどうやってつくるんでしょうか。 XmlDocument[] XD = new XmlDocument()[10]; とやるとしたのエラーがでてしまいます。 'System.Xml.XmlNode.this[string]' に最も適しているオーバーロード メソッドには無効な引数がいくつか含まれています。
>>430 その質問は正しくは
> 配列ってどうやってつくるんでしょうか。
だな。
MSDN/ヘルプの配列のところを読め。
432 :
デフォルトの名無しさん :04/09/01 20:28
DataGridにArrayListをバインドしたとき、 DataGridからデータの変更をすることは出来ないのでしょうか?
433 :
デフォルトの名無しさん :04/09/01 22:28
現在 vb で作成されたプログラムがあります.この中で, 'インスタンス生成 Set OBJ = CreateObject("TEST.Func") とかやって外部の DLL を操作している部分があるのですが, これら外部の DLL をそのまま C# で使う事ができますか?
>>432 まあ素直にDataSet/DataTableつかっとけってことだな。
>>432 ?? 普通に出来たけど。
なんか別のところで引っかかってない?
C#でSusieプラグイン対応の画像ビューアーを作っているのですが、下のソースのだめな所を教えてください。 //API [DllImport("gdi32.dll")] public static extern int BitBlt(IntPtr hDestDC,int x,int y,int nWidth,int nHeight,IntPtr hSrcDC,int xSrc,int ySrc,int dwRop); [DllImport("gdi32.dll")] public static extern short SetDIBitsToDevice(IntPtr hdc,short x,short y,int dx,int dy,short SrcX,short SrcY,int Scan,int NumScans,IntPtr Bits,IntPtr BitsInfo,int wUsage); [DllImport("gdi32.dll")] public static extern int SetDIBits(IntPtr hdc,IntPtr hBitmap,int nStartScan,int nNumScans,int lpBits,IntPtr lpBI,int wUsage); [DllImport("kernel32.dll")] public static extern void MoveMemory(IntPtr dest,IntPtr Source, int length); [DllImport("kernel32.dll")] 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("D:\\ifjpeg.spi", EntryPoint="GetPictureInfo" ,ExactSpelling=true, SetLastError=true)] public static extern int JPGInf( String FileSTR, int OffSet, int Mode,IntPtr Info); [DllImport("D:\\ifjpeg.spi", EntryPoint="GetPicture",ExactSpelling=true , SetLastError=true)] public static extern int JPGDraw( System.Text.StringBuilder FileSTR, int len, int flag,IntPtr pHBInfo,IntPtr FARPROC,int CallBack, int CallBackLong);
↑の続き public int SDrawPic(StringBuilder PicFile,PictureBox ToDraw) { IntPtr BitMapMemoryHandle = IntPtr.Zero; IntPtr BitMapInf = IntPtr.Zero; int LocalMemoryBMP; int LocalMemoryInf; BITMAPINFOHEADER BitMapHeader = new BITMAPINFOHEADER(); int Ret = 0;//エラーコード int Ret2;//エラーコード2 //画像展開 Ret = JPGDraw(PicFile, 0, 0,BitMapMemoryHandle,BitMapInf, 0, 0); //メモリーのロック LocalMemoryBMP = LocalLock(BitMapMemoryHandle); LocalMemoryInf = LocalLock(BitMapInf); //メモリの移動 MoveMemory((IntPtr)((object)BitMapHeader),(IntPtr)LocalMemoryBMP,Marshal.SizeOf(BitMapHeader)); //描画準備 Ret2 = SetDIBits(ToDraw.Handle, (IntPtr)((object)ToDraw.Image), 0, ToDraw.Height, LocalMemoryInf, (IntPtr)LocalMemoryBMP, 0); if(Ret2 == 0) Ret = 11; //メモリの開放 LocalUnlock(BitMapMemoryHandle); LocalUnlock(BitMapInf); LocalFree(BitMapMemoryHandle); LocalFree(BitMapInf); //描画 ToDraw.Refresh(); return Ret; }
439 :
デフォルトの名無しさん :04/09/02 13:44
指定した色が透過されて画像を描画させるにはどうしたら良いのですか?
>>439 Graphics.CompositingMode
>>440 もうちょっと詳しい説明をお願いします。
調べてから効け
あとBitmap.MakeTransparent
445 :
デフォルトの名無しさん :04/09/02 22:17
指定したディレクトリの、ひとつ上のディレクトリを得るにはどうしたらいいですか?
>>445 ちっとはSystem.IO名前空間ぐらい調べろって。
バイトデータをファイルに書き込むときにFileStreamを使うのと、BinaryWriterを使うのはどっちがいいのでしょうか? FileStream fs = new FileStream(path, FileMode, FIleAccess); BinaryWriter bw = new BinaryWriter(fs); fs.Write(byte[] array, int x, int y); bw.Write(byte[] array, int x, int y); どちらも結果は同じなんですが
まあ好みによるんじゃないか? BinaryWriterは結局のところStreamのラッパに過ぎないわけだし。 Write(byte[], int, int)を使うだけならBinaryWriterを使う意味は無かろうが。
↑で書いたソースですが、 Ret = JPGDraw(PicFile, 0, 0,BitMapMemoryHandle,BitMapInf, 0, 0); の場所で「オブジェクト参照がオブジェクト インスタンスに設定されていません。」とエラーを吐き出します。 その理由がわからず困っています、分かる方教えてください。
>>449 P/InvokeでNullReferenceExceptionが出ることはないはずだから、
なんか他のが原因な気がするけど……。
取りあえずエラーが起きた時に何がnullになってるかをチェック。
451 :
デフォルトの名無しさん :04/09/03 11:01
ポップアップメニュー を出すにはどうしたらいいですか? ちなみに普通のメニューは出ます。
>>451 まずはSystem.Windows.Forms名前空間内の〜Menuってなクラスを調べてみたらどうだろうか。
>>450 Ret = JPGDraw(PicFile, 0, 0,BitMapMemoryHandle,BitMapInf, 0, 0);
↑の変数の中身は
StringBuilder PicFile = "C:\Winter.jpg"
int BitMapMemoryHandle = 0
int BitMapInf = 0
でした。どれもNULLじゃないので、全然わからないです T_T
>>449 P/Invoke でも、確か先方がそれらしい Windows 構造化例外を投げれば
NullReferenceException として上がってきたと思う。JPGDraw のソースが
あるなら、デバッグビルド版にしてネイティブデバッグも ON にすれば
当該箇所が分かると思う。
JPGDrawはSusieプラグインなんでソースはないです。でもJPGDrawの行より先に進めました。 でもまだ表示はされないけどw 表示されない理由分かる方お願いします。 変更点-API [DllImport("gdi32.dll")] public static extern int BitBlt(IntPtr hDestDC,int x,int y,int nWidth,int nHeight,IntPtr hSrcDC,int xSrc,int ySrc,int dwRop); [DllImport("gdi32.dll")] public static extern short SetDIBitsToDevice(IntPtr hdc,short x,short y,int dx,int dy,short SrcX,short SrcY,int Scan,int NumScans,IntPtr Bits,IntPtr BitsInfo,int wUsage); [DllImport("gdi32.dll")] public static extern int SetDIBits(IntPtr hdc,IntPtr hBitmap,int nStartScan,int nNumScans,ref int lpBits,ref IntPtr lpBI,int wUsage); [DllImport("kernel32.dll")] public static extern void MoveMemory(IntPtr dest,IntPtr Source, int length); [DllImport("kernel32.dll")] 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("D:\\ifjpeg.spi", EntryPoint="GetPictureInfo" ,ExactSpelling=true, SetLastError=true)] public static extern int JPGInf( String FileSTR, int OffSet, int Mode,IntPtr Info); [DllImport("D:\\ifjpeg.spi", EntryPoint="GetPicture",ExactSpelling=true , SetLastError=true)] public static extern int JPGDraw( System.Text.StringBuilder FileSTR, int len, int flag,ref IntPtr pHBInfo,ref IntPtr FARPROC,int CallBack, int CallBackLong);
変更点-メソッド public int SDrawPic(StringBuilder PicFile,PictureBox ToDraw) { IntPtr BitMapMemoryHandle = IntPtr.Zero;IntPtr BitMapInf = IntPtr.Zero; IntPtr LocalMemoryBMP; int LocalMemoryInf; int Ret = 0; int Ret2; BITMAPINFOHEADER BitMapHeader = new BITMAPINFOHEADER(); //画像展開 Ret = JPGDraw(PicFile, 0, 0,ref BitMapMemoryHandle,ref BitMapInf, 0, 0); //メモリーのロック LocalMemoryBMP = (IntPtr)LocalLock(BitMapMemoryHandle); LocalMemoryInf = LocalLock(BitMapInf); //ガベージコレクタがオブジェクトを移動できないようにする GCHandle gch = GCHandle.Alloc(BitMapHeader, GCHandleType.Pinned); GCHandle gch2 = GCHandle.Alloc(ToDraw.Image, GCHandleType.Pinned); //メモリの移動 int address = gch.AddrOfPinnedObject().ToInt32(); MoveMemory((IntPtr)address,(IntPtr)LocalMemoryBMP,Marshal.SizeOf(BitMapHeader)); //描画準備 int address2 = gch.AddrOfPinnedObject().ToInt32(); Ret2 = SetDIBits(ToDraw.Handle, (IntPtr)address2, 0, ToDraw.Height,ref LocalMemoryInf,ref LocalMemoryBMP, 0); if(Ret2 == 0) Ret = 11; //メモリの開放 LocalUnlock(BitMapMemoryHandle); LocalUnlock(BitMapInf); LocalFree(BitMapMemoryHandle); LocalFree(BitMapInf); gch.Free(); gch2.Free(); //描画 ToDraw.Refresh(); return Ret; }
質問です。 JPEGファイルから作ったFileStreamを、 またJPEGファイルに戻して保存したいのですが、 どうすればよいのでしょうか? また、このStreamからBMPファイルに 変換→保存する方法はあるのでしょうか?
>>458 > JPEGファイルから作ったFileStreamを、
> またJPEGファイルに戻して保存したいのですが、
> どうすればよいのでしょうか?
は?
そのFileStreamは一体何者?
どっからどうみてもファイルそのものじゃないのか?
> また、このStreamからBMPファイルに
> 変換→保存する方法はあるのでしょうか?
Image.Save(Stream, ImageFormat)
Image.Save(string, ImageFormat)
Image.Save(Stream, ImageFormat) これで全て解決しました。ありがとうございます。
TabControl.TabPagesのように関連するコントロールの コレクションをプロパティとして持つコントロールを作成しました。 しかし、VS.netのプロパティウィンドウからそのコレクションに 関連コントロールを追加してもInitializeComponent()内に 関連コントロールを追加する文(Control.Add()など)が記述されません。 どうすれば自動的に追加する文を記述されることができますか?
>>457 使ってない変数や余計な行は削除してから上げてもらえると良かったんだけど。
まず、SetDIBits の第一引数は HDC なので、ToDraw.Handle じゃだめです。
あと PictureBox に直接描いても、ウィンドウを動かしたりなんかしたりするとすぐ消えてしまうので、
Bitmap を作ってそこに描画し、 Image プロパティにセットしておくのがよいと思います。
適切なサイズのビットマップを new Bitmap(...) 等して確保して、Graphics.FromImage で Graphics を作って、
GetHdc() で HDC を得て、StretchDIBits で描いて、ReleaseHdc() で開放して、出来上がった Bitmap を
PictureBox の Image にセットして Invalidate しておしまい、という流れにしてみてください。
463 :
デフォルトの名無しさん :04/09/03 17:23
フォームやコマンドプロンプトを出さずに、メッセージボックスだけ表示するにはどうしたらいいですか?
>>463 コンパイラに/target:winexeオプションを指定して
Main()のなかでMessageBox.Show()
466 :
デフォルトの名無しさん :04/09/03 19:30
C++にあったようなROP反転処理はC#にもありませんか? グーグルで思うようにヒットせずに質問致します。 例)ピクチャボクスに表示したビトマプ画像に塗りつぶし円を描くが その円はその領域だけ元のビトマプ画像を反転させる役目を有する 以上、ご存知な方、宜しくお願い致します。
>>466 Graphics ではサポートされていません。
円形のクリッピングを設定して、適当な色変換と供にビットマップを再度描画してはどうでしょうか。
Formを表示する際に、Formを任意の位置に表示したいのですが、 どうすれば良いでしょうか? 表示する前にLocationを設定しても無駄でした。
>>468 Form.StartPositionをFormStartPosition.ManualにしてLocationを設定(いや順番は関係ないが
>>466 それ、以前に同じ事やろうとして無駄な時間をすごしてしまった。俺。
素直にDirectX使ったほうがいい。
>>469 解決できました。
StartPositionに気づきませんでした。
ありがとうございました。
色々な参考書を読みましたが未だにカスタム属性が理解できません。 例えば、クラスA、クラスB、クラスC(プロパティc)というクラスがあり、 クラスCのプロパティcは、クラスAからは読み書き両方できるけど、クラスBからは読み取り専用・・・ なんてこともカスタム属性で出来るんでしょうか?
属性はたんなるマークでしかない。 マークをつける側と、マークを読む側で、 書式と意味が一致している必要がある。
フォーカスが移動する前にどのControlにフォーカスがあったか、 わかるんでしょうか?
メニューのショートカットをCtrlやらShiftやらの修飾キーがついていない単独のキーを割り当てたいのですが どのようにすれば割り当てられるでしょうか? 例えば this.menuItem1.Shortcut = System.Windows.Forms.Shortcut.CtrlQ; の場合、Ctrl+Qが割り当てられていますが、これをQのみに対応させたいのです
>>475 KeyDownで'Q'だったらmenuItem1.PerformClick()ってんじゃ駄目かな?
便乗ですいません。 this.button1.PerformClick(); だとbutton1_Clickで記述された処理が実行されますが、 このときに、画面に見えているボタンがぽこっと実際にクリックしたように へこむアクションをさしたいのですが、どうしたらいいでしょうか?
>>476 そうするとメニューの項目の横に
----------------------
メニュー1 Ctrl+Q
----------------------
というような表示が出ないので、なんとかShortcutで設定したいのです
どうにかならないものでしょうか?
>>478 "メニュー1\tQ"
でOK.
>>479 Buttonを継承したコントロールに独自のメソッド(SimulateClickとか)を追加して
そこでがしがし描画、かな。
System.Windows.Forms.ControlPaintクラスの各メソッドが使えるかも知れない。
モードレスダイアログを開発しようとしています。 ダイアログ終了時に親画面と同期をとりたいんですが、 どんなやり方がスマートなのでしょうか? 親が子の終了を察知する方法です。 子から親のメソッドをを呼び出したくないので。
イベント。
>>479 えらい適当な・・・
色々やってますが無理なんでしょうかね?
Shortcut.CtrlQとKeys.Control|Keys.Qの値が同じだったので
Keys.Qの値をShortcutに無理矢理キャストしたら怒られました
ショートカットキーの表示は479でできるんだしそれでいいじゃん。 Shortcutプロパティでできないのは動かしがたい事実。
仕様上ダメのようなので諦めました 476,479で行きます ありがとうございました 引き続きでなんですが アプリケーション用のアイコンと関連付けたファイルのアイコンを別々にしたいのですが 一つのアプリケーションに複数のアイコンをつけるにはどうすればよいでしょうか?
> アプリケーション用のアイコン はApp.icoのことでしょ? > 関連付けたファイルのアイコン はWindowsへ登録するわけだから、 アプリそのものは関係ないと思うんだけど。
>>486 別にアプリとは別のアイコンファイルを用意して
それにアイコンを設定するという方法でも良いのですが
市販のアプリとかは一つのアプリ内に複数のアイコンを持っていたりするので
できれば一緒にしたいと思っているわけです
要するにレジストリのDefaultIconで
"アプリのパス,1"とかで指定したいのです
DirectoryInfo.GetFilesで取得したファイルの数ってどうやったら分かりますか?
>>487 何を言ってるのかようわからん。
>>488 GetFiles().Length
GetFilesはFileInfoの配列を返すわけだから、
その配列の要素数( Length )がファイル数に相当する。
>>489 自分かなり初心者でただファイル読み込むときにプログレスバーを
付けてみたかっただけなんですけどこれでできそうです。
どうもありがとうございました!
次の質問予想 プログレスバーを表示しようとしたんですが、 0%から全部終わった瞬間に一気に100%までいってしまいます。 なぜでしょうか?
492 :
デフォルトの名無しさん :04/09/05 15:46
C#での正規表現関係クラスの使い方が分かりません。 strは、数字 文字列 数字 文字列 … 数字 という構造になっていて、 頭から順にnumに数字を、str2に文字列をいれて行きたいのですが… サンプルコードをいただけませんか? Perlの$1,$2にあたる部分とかもさっぱり分からん
プログレスバーを表示しようとしたんですが、 0%から全部終わった瞬間に一気に100%までいってしまいます。 なぜでしょうか?
>>492 書き方はいくらでもあるが、一例。
string data = "123ghoshg255grehi55dghdkg";
Regex reg = new Regex("([0-9]+)([a-zA-Z]+)", RegexOptions.Compiled);
foreach (Match m in reg.Matches(data)) {
int i = int.Parse(m.Groups[1].Value);
string n = m.Groups[2].Value;
Console.WriteLine("{0} : {1}", i, n);
}
>>492 string str = "111aaa222bbb333ccc";
Regex regex = new Regex(@"(?<num>\d+)(?<str2>[a-zA-Z]+)");
for (Match m = regex.Match(str); m.Success; m = m.NextMatch())
{
string num = m.Groups["num"].Value;
string str2 = m.Groups["str2"].Value;
Console.WriteLine("num={0}, str2={1}", num, str2);
}
こんな感じ?
かぶったスマソ
アプリのFont設定の保存のためにSoapFormatterを使って Font型フィールドをシリアル化したのですが デシリアライズ時に次のエラーをはきます。 System.ApplicationException {"呼び出しのターゲットが例外をスローしました。" } _innerException {"指定されたキャストは有効ではありません。" } 色々変えてみたりしたんですけど、うまく行かず ぐぐってみたらプロパティでラップしたら出来たとかかれていたんですけど それもやり方が悪いのか出来ませんでした。 どうすればデシリアライズできるか教えてください。
>>462 すみません、俺の力不足のせいで出来ないです。
もしよければソースを書いていただけますか?
499 :
デフォルトの名無しさん :04/09/06 15:03
2つの画像を合成しようと,透過色を設定した ImageAttr を DrawImage に渡していろいろ試しています. イメージは背景画像と前景画像とあり,前景画像はある特定の色が 透過色として設定してあります(255,0,255) この時前景画像が GIF 画像の時は合成されるのですが JPG の場合は合成されずに,透過色がそのまま描画されてしまいます. JPG では,ImageAttr を設定し,画像を合成する事はできないのでしょうか?
>>499 単に圧縮する時に色が変わってるだけじゃないの?
>>497 SoapFormatterならFontを問題なくシリアライズ・デシリアライズできるはずだが。
なんか他の要因があるような。
MessageBox は通常だと画面中央に表示されますが、 これを任意の位置に表示するにはどうすればいいの でしょうか?
>>497 ISerializableを実装させる。
.ctor(SerializationInfo info, StreamingContext context)
GetDataObject(SerializationInfo info, StreamingContext context)
でそれぞれFontConverterを使ってstringと変換しあう。
>>501 マジレス、自分でFormから作る。
>>502 やはりそれしかないんですか。
試行錯誤の結果、Font名、サイズ、スタイルと
別々に格納するという方法にしてみたんですけどねえ。
Fontクラスは、シリアル化はできるけどISerializableの
実装をしないと逆シリアル化はできないんですかね・・・
なんにせよ、回答ありがとう。
アイコンDLLを作ろうと思ったらどうすればよいですか?
1 アイコンを作成。 2 DLLを作成。
>>504 /win32res を使うんじゃないかな
>>507 /win32res の使い方が分かりません
プロパティーにそれらしい項目が無いんですけど
>>508 ただのアイコン詰め合わせくらいコンパイラでやれって。
csc /t:library /win32res:Icon1.RES class1.cs でも出来ないんですけど
icon1.resとやらはどうやってつくったのさ。
\Program Files\Microsoft Visual Studio .NET 2003\Vc7\bin\rc.exeに アイコンファイルをD&Dしたら出来ました
>>512 ok, あとはrc.exeの意味と使い方を知るだけだ。
ヘルプの/win32resをもう一度熟読して、googleに尋ねるべし。
>>513 できました
リソーススクリプトを入れるんですね
とても勉強になりました、どうもありがとうございました
DLLにアイコンを突っ込んだ要領でWindowsアプリに複数のアイコンをつけようとしたのですが コンパイル後にできたexeを実行すると 'System.Resources.MissingManifestResourceException' のハンドルされていない例外が mscorlib.dll で発生しました。 追加情報 : 指定されたカルチャ (またはニュートラル カルチャ) に必要なリソースがアセンブリに見つかりません。"Form1.resources" が、アセンブリ "Form1" に正しく埋め込まれているか、またはリンクされているかを確認してください。 baseName: Form1 locationInfo: CommandTableMaker.Form1 resource file name: Form1.resources assembly: Form1, Version=1.0.1711.30489, Culture=neutral, PublicKeyToken=null というエラーが出て実行できません アイコンはきちんと指定した分だけ登録されているようなので コンパイルさえ完全に出来れば完成なのですが・・・ ちなみにコンパイル時のコマンドは csc /t:winexe /win32res:icon.res *.cs です(icon.resはアイコンのコンパイル済みリソーススクリプト)
>>515 Form1はVC#で組んでる?
だとしたらobjディレクトリに*resourcesがあるからそれも突っ込め。
やってみましたが結果が同じでした csc /t:winexe /res:NameSpace.Form1.r esources,NameSpace.Form2.resources,NameSpace.Form3.resources /win32res:icon.res *.cs ちなみに、Form2,3はアプリ内で使う別窓です あと、コンパイル用にソースがあるフォルダにresourcesファイルを全部コピーしました
shift-jisでファイルから読み取った文字列に対してTrim()を使っても空白が削除されてくれません。 ユニコードに変換したりとかしないといけないのでしょうか?
>>518 素敵に意味不明。
> shift-jisでファイルから読み取った文字列に対してTrim()を使っても空白が削除されてくれません。
削除される空白は文字列の先頭からと末尾からのそれぞれ非空白文字が出現するまで、ってOK?
" p r " -> "p r"
> ユニコードに変換したりとかしないといけないのでしょうか?
.NETは内部の文字列処理にUnicodeを使っているので一旦stringになったらエンコードは関係ない。
憶測だけど string a = " hoge "; a.Trim(); とかして、「aの中身が変わらない〜」とか言っているような気がする。
error: cannot obtain value というエラーはどういった時に出るものなのでしょうか? ウォッチウィンドウでラベルのテキストを見ていると、 あるラベルの値だけが上記のようなエラーになっており、 その後デバッグも続行できない状態になります。 ウォッチウィンドウにそのラベルのテキストを加えなければなんともなりません。 このようなエラーが出たことのある方、何か情報を頂ければ・・・と思います。
色々やってみましたが無理っぽいのでDLLで済ませることにしました 皆さんどうもお騒がせしました
524 :
デフォルトの名無しさん :04/09/09 10:29
PictureBoxに画像が表示されれている状態で、 以下の部分でとエラーとなり、0byteのJpegファイルが生成されてしまいます。 どこを訂正すればよいのでしょうか。 if( PictureBox.Image != null ){ FileStream FS = new FileStream( filePath, FileMode.Create); PictureBox.Image.Save( FS, ImageFormat.Jpeg ); } エラー内容 'System.Runtime.InteropServices.ExternalException' のハンドルされていない例外が system.drawing.dll で発生しました。 追加情報 : GDI+ で一般的なエラーが発生しました。
ごめんなさい。上のStream.Close()は書き忘れです。 FileStream FS_TEST1 = new FileStream( @"C:\TEST1.bmp", FileMode.Open, FileAccess.Read ); FileStream FS_TEST2 = new FileStream( @"C:\TEST2.bmp", FileMode.Create ); Image IMG = Image.FromStream( FS_TEST1 ); // この段階でIMGがnullでないことは確認済み FS_TEST1.Close(); IMG.Save( FS_TEST2, ImageFormat.Bmp ); //ここで "GDI+の一般的エラー" FS_TEST2.Close(); これで、やはりTEST2.bmpが0 byteで生成されてしまいました。 例えばFileInfo.Copy()での書き込みや、適当にテキストファイルを生成することは出来ているので、 書き込み権は関係ないのではないかと思っています。
度々すいません。上のIMG.Saveの行を FS_TEST2.WriteByte(1); とかに変えてみると、ちゃんと1byte書き込まれたファイルが 生成できることを確認しました。さっぱりです…。help me... 環境 : Win2003SV + VS2003 + .NET1.1
あるファイルとあるファイルの内容が同じが異なるかを調べたいのですが 何かよい方法はないでしょうか? 大量(数千のオーダー)に存在するファイルの中から重複するファイルを 省く,という処理を行ないたいのです.
サイズ比べて同じならバイナリ比較. 前もってハッシュ作レるかとかの条件ももっと細かくかかんとアドバイスできんよ。
>> 529 ありがとうございます. サイズは似たりよったりのファイルが多数あるので,ファイルのサイズを 比べただけの時点でかなり複数のファイルが一致してしまいます. その後にバイナリ比較をするとバイナリ比較を行なうコストが高いと思うので できれば前もって全てのファイルに対するハッシュを生成し,同一ハッシュ値を 持つファイル同一とみなす,といったような事がしたいのですが, 例えば MD5 の場合,同じ内容であれば同一の MD5ハッシュが生成されるの でしょうか? また,MD5 ハッシュを生成するには,一旦ファイルの中身を全て byte 配列などに読み込み,MD5 ハッシュを求める,という処理が 必要になるのでしょうか? 簡単に,ファイルのパスを渡すと,そのファイルのハッシュ値を返して くれるようなメソッド,もしくは,ファイル名を2つ渡すと内容が同一か を判断してくれるようなクラスライブラリは .NET Framework には存在 しないでしょうか? 存在しないようであれば,自作するしかないのかな,と思っています. アドバイスよろしくお願いします.
>>530 そのものMD5クラスがある。使い方はヘルプをよく読む。
> 例えば MD5 の場合,同じ内容であれば同一の MD5ハッシュが生成されるの
> でしょうか?
そうでなきゃハッシュの意味がないだろう……。
>530 おまい少しはコードかけ...
他のスレッドが作ったコントロールを非表示にすることはいけないことなのでしょうか? デザイナで作ったボタンなどのVisibleをfalseにして、 新たに生成したスレッドからVisible=trueとすると、表示がされません。 //button1.Visible = false; private void Thread1() { this.button1.Visible = true; //表示されない } しかし、メインスレッドから一度Visibleをtrueにした後なら、異なるスレッドからでもVisibleをいじることが出来ます。 さっぱり意味がわかりません・・・。
>> 530 すいません.どうやって実装したらいいのか迷っていたので. 案ずるより…という事でやってみました. using (FileStream fs = new FileStream(fileName, FileMode.Open, FileAccess.Read)) { MD5CryptoServiceProvider csp = new MD5CryptoServiceProvider(); string checksum = BitConverter.ToString(csp.ComputeHash(fs)).Replace("-", "").ToLower(); } 以外に簡単でした(w つっこみどころ満載でしたら,つっこみ願います.
ミス. >> 530 じゃなくて >> 532 でした. スマソ.
>>534 出来たんなら問題ないんでは?
漏れが細かいとこ突っ込むとこんな感じになるが。
- MD5CryptoServiceProvider csp = new MD5CryptoServiceProvider();
+ HashAlgorithm csp = HashAlgorithm.Create("MD5");
cspという変数名がやだ。
540 :
デフォルトの名無しさん :04/09/09 23:35
class Class1 { [DllImport("user32.dll",CharSet=CharSet.Unicode)] public static extern IntPtr PostMessage(IntPtr hwnd,int wMsg,IntPtr wParam,IntPtr lParam); [STAThread] static void Main(string[] args) { System.Diagnostics.Process p = System.Diagnostics.Process.Start("notepad.exe"); p.WaitForInputIdle(); int WM_CHAR = 0x0102; char c = 's'; PostMessage(p.MainWindowHandle ,WM_CHAR ,new IntPtr(c), IntPtr.Zero); } } 外部アプリを起動して文字列を送信したいのですが上手くいきません。 notepadの起動は出来るんですがPostMessageが全く無視されてしまいます 何が悪いのかサッパリ分かりません お願いです助けてください。
>>540 ポインタ関係は一切送れない。少なくともMessage系では絶対に。
常用エディタのxyzzyやcmd.exeでは受け取ってくれた。
notepad、wordpadは無視された。
受け取るアプリの方の問題らしい。
>>541 これにポインタは含まれてないような。
>>540 notepadの場合 Edit に送らないとダメなのでは?
>>541 refつけたりマーシャリングしたりすれば送れたかったけ?
無理なら System.Runtime.InteropServices.Marshal なんてものもあるが。
544 :
デフォルトの名無しさん :04/09/10 00:38
ていうか、なんでIntPtrで宣言してんだ?intでいいじゃん。
できたー!! 皆さんありがとうございました!! class Class1 { [DllImport("user32.dll"] public static extern int PostMessage(IntPtr hwnd,int wMsg,IntPtr wParam,IntPtr lParam); [DllImport("user32.dll")] private static extern int FindWindowEx(IntPtr parentWindow, int childWindow, string _ClassName, string _WindowName); [STAThread] static void Main(string[] args) { System.Diagnostics.Process p = System.Diagnostics.Process.Start("notepad.exe"); p.WaitForInputIdle(); IntPtr hwindow = (IntPtr)FindWindowEx(p.MainWindowHandle, 0, "edit", null); int WM_CHAR = 0x0102; char c = 's'; PostMessage(hwindow ,WM_CHAR ,new IntPtr(c), IntPtr.Zero); } } あー後はソースを綺麗にしなきゃ。
>>545 例外処理はしますが、それだけでは
ImageがStreamに送れない問題は解決しないです…。
>524 わからんのだけど、一般的エラーってなんなんだよ...COMでも同じようなのあって切れた覚えが...
549 :
デフォルトの名無しさん :04/09/10 18:36:25
struct dat { int index; string str; } data = new dat[10]; data[0].index=1; data[0].str="ddd"; ・・・ data[9].index=99; data[9].str="ddd"; ↑のindexの所をソートするとstrもソートするにはどうしたら良いのですか? それと、Arraylistを利用してこの構造体配列変数にデータ挿入や削除させる事は可能ですか?
550 :
549 :04/09/10 18:42:29
data[].index.sort みたいな事をしたらstrも変わる様にしたいのです。
? 各要素のindexによってdataをソートするんだよね? なんか勘違いしてる気がする。 int[] indexとstring[] strをそれぞれ別々に持ってソートするってことかな? でindexをソートするとstrもソートされる、と? つまり int[] index = {3, 5, 2}; string[] str = {"c", "b", "a}; で Array.Sort(index)した時にArray.Sort(str)も実行、と。 結果は index = {2, 3, 5} str = {"a", "b", "c} こういう解釈で良いのかな。
552 :
549 :04/09/10 19:08:04
>>551 間違ってました。indexの所だけソートしたらstrも追従して
前 index=3,5,2 str=c,b,a
後 index=2,3,5 str=a,c,b
の様にしたいのです。
それで、この二つの変数は構造体でワンセットになってて、さらにそれが配列変数に
なっています。
簡単にいえば住所録みたいに名前とナンバーを付けといて、ナンバーをソートしたら
名前もそれに従うという風にしたいのです。
もう一つ、住所録なので挿入と削除も実装したいので構造体にそういう機能は無いのかな
と思ったのです。
class MyData{ public int no; public int name; public MyData(int no, int name){ this.no=no; this.name=name; } } class MyDataNoComparer : IComparer{ //二つのMyDataのnoを比較する public int Comparer(object x, object y){ return ((MyData)x).no - ((MyData)y).no; } } ArrayList al = new ArrayList(); al.Add(new MyData(6, "six")); al.Add(new MyData(3, "three")); al.Add(new MyData(8, "eight")); al.Add(new MyData(5, "five")); al.RemoveAt(3); //「five」を削除 al.Insert(1, new MyData(1, "one")); //「three」の前に挿入 al.Sort(new MyDataNoComparer()); //noで並べ替え
>>553 MyDataにIComparableを実装させる方が自然じゃないか?
Paintイベントが非同期的に呼ばれることってあるんでしょうか? 私の勉強した知識では、PaintイベントはWndProcがWM_PAINTを受け取ってから実行されると思いますが、 WndProcがWM_PAINTを連続で受け取っても、非同期でPaintイベントを起こしたりはしないと考えているのですが。 FormのPaintイベント内でBitmapをDrawImageでロードしてるのですが、 「そのオブジェクトは使われています」というエラーが出てしまいます。 lock(Bitmap) { e.Graphics.DrawImage(bitmap, 0, 0); } でエラーは出なくなったのですが、イマイチ釈然としません。
>>555 漏れも釈然としないので(マルチスレッドAPではないですよね)、
Graphics.FromImage でその Bitmap に対して作成した Graphics を Dispose し忘れている、
に1票。
>>556 Paintイベント内なので
private void Form1_Paint(object sender, PaintEventArgs e){
Graphics g = e.Graphics;
.....
となっておりますので、BitmapのGraphicsは生成しておりません。
言い忘れましたがマルチスレッドアプリケーションです。
マルチスレッドアプリケーションならありうることなのでしょうか?
そりゃマルチスレッドなら十分ありうるよ。
物凄い初歩の質問で恐縮なのですが、 ウィンドウのサイズ変更時にテキストボックスとかのサイズ(レイアウト)を変更する時って Resizeイベントが発生した時にWidthとかの値を取得して自分で設定するんですよね? もっと簡単な方法(もしくはこの方法に問題が)ってあるんでしょうか?
>>559 普通はDockまたはAnchorプロパティを使う。
>>560 縦横に複数並べてテキストボックス等配置してあるんですが、
そのレイアウト(というか比率というか)も設定できます?
できればこのテキストボックスは長めに伸びて・・・みたいなことをしたいんですが。
「縦横にテキストボックス等を複数並べて配置してあるんですが、」 でした。
DockやAnchorは便利だけど単純な機能しか持ってない。 複雑なレイアウトを実現しようと思ったら自分でやるしかないんじゃないかな?
564 :
デフォルトの名無しさん :04/09/12 06:40:52
すみません質問なのですが。 C#で作った簡単なプログラムをサイトなどにアップする場合に セキュリティ面で気をつけることはあるでしょうか? 個人情報流出とか、PCを特定されるとか・・
>>566 コードは書いたとおりにしか動かない。
自分で作ってあげる分には心配ないはず。
>>567 ちょっと、まだ最近始めたばかりであまりわからないのですが、
自分のプログラムをアセンブリして見ると
シリアルIDっぽいものや、ディレクトリ情報などがあると思うのですが
それ以外に何か情報が入ってないのかってのが心配です。
何故かminimumsizeをsizeと同じに設定したら 下に余白が出来て最小の状態でウィンドウが開かなくなってしまったorz 作り直しか・・・
と、思ったらメインメニューが悪さしてるような・・・。 試しにメインメニューをカットしてみたら意図した起動になりました。 なんなんだろう・・・。
>>568 別に違法コピーとかしてなきゃ問題無いでしょ。
>>571 実は自分のプログラムをラウンジってソース置き場あるでしょ?
あそこにうpしたらさ、なんかおれのPCに穴が開いたらしくて
おれのパソコンの中身とか見れたんだって
実際そいつが、うpしたファイルのディレクトリの場所知ってたし
プログラム自体のセキュリティってどうなのかなと思いまして
…
574 :
デフォルトの名無しさん :04/09/13 00:18:37
( ゚д゚)ポカーン
575 :
デフォルトの名無しさん :04/09/13 00:32:57
この話って本当か!?
RichTextBoxのスクロールバーで質問なのですが バー自体をつまんで移動した時に、 移動した情報やバーがつかまれた等認識できるのでしょうか? (hscroll等のように▼▲おしたときにクリックイベントとんで来るとか・・・) よろしくお願いします。
579 :
デフォルトの名無しさん :04/09/13 10:23:21
動的プロパティにプログラムから値を設定したいんですがどうすればよいのでしょうか。
みなさんに知識分けてほしいんです 自分で調べても、ノートンや、ウィルスチェックソフトのサイトしか見つからなくて 本当に怖いんです。 別に問題ないならいいんですが。偶然でもディレクトリの場所なんて わからないはずなんですが、お願いします
時々市販のプログラムでも、ディレクトリ情報が入っているプログラムがあるな。
582 :
デフォルトの名無しさん :04/09/13 10:46:44
まぁ仮に見えたとしても、別に構わんよ。
>>581 ディレクトリ情報っていっても、コンパイルした場所じゃないんです。
コンパイルした情報は埋め込まれてるのはわかります(消す方法ないですか?)
そうじゃなくて、ファイルをサイトにアップしたのですが
コンパイルした場所からじゃなくて、別のドライブのディレクトリに移動して
そこからうpしたのですが、その別のドライブのディレクトリに
まだファイルがあるってことを指摘されたんです
>>584 そろそろスレ違いに気付け。
それはもはやC#の話題ではない。
>>585 そうなんですか?プログラムに問題あると思ったのですが・・
どういうスレいけばいいでしょうか?
587 :
デフォルトの名無しさん :04/09/13 14:11:39
>>586 プログラムに問題があると思うならソースを公開汁
実際どうか知らんけど、設定とかデバッグビルドだからってことでディレクトリ情報はいった利することもあるんでは? だとしたらあながちすれ違いともいえんと思うが.
デバッグ版のpdbだね。
System.Diagnostics.Process p = new System.Diagnostics.Process(); p.StartInfo.FileName = 実行ファイルのパス; p.Start(); で起動したアプリをこのプログラムで終了したいのですが そのような事は可能なのでしょうか?
p.Close();
CheckBoxで判定するとして if (checkBox.Checked) { p.Start(); } else { p.Close(); } としても、何も起こらないんですけど・・・
ここにいるやつってその程度の知識なの? 自分で作ったソフトをexeのファイルをアセンブリなり バイナリでみてみろよ。ヘッダの情報にディレクトリ構造でるだろ? てか、おれの言ってること理解できないのかよ? そうじゃなくて、ファイルをサイトにアップしたのですが コンパイルした場所からじゃなくて、別のドライブのディレクトリに移動して そこからうpしたのですが、その別のドライブのディレクトリに まだファイルがあるってことを指摘されたんです っていってるだろ。どこからファイルうpしたかは、サイト運営者しか わからないだろ?それがなんで運営者でもないのにわかるのかって聞いてんだよ
>>594 あなたのPCが乗っ取られているかサイトがが乗っ取られているかのどちらか。
>>594 > ここにいるやつってその程度の知識なの?
> 自分で作ったソフトをexeのファイルをアセンブリなり
> バイナリでみてみろよ。ヘッダの情報にディレクトリ構造でるだろ?
だってそんなのないんだもの。
唯一
>>589 の言うとおり/debug+でビルドした時のみ.pdbのフルパスがバイナリに含まれるけど。
PictureBoxをダブルクリックしたとき、それが左ダブルクリックなのか右ダブルクリックなのか 判別したいのですが、なにかいい方法は無いでしょうか?
> てか、おれの言ってること理解できないのかよ? > > そうじゃなくて、ファイルをサイトにアップしたのですが > コンパイルした場所からじゃなくて、別のドライブのディレクトリに移動して > そこからうpしたのですが、その別のドライブのディレクトリに > まだファイルがあるってことを指摘されたんです > > っていってるだろ。どこからファイルうpしたかは、サイト運営者しか はっきりいって、いってません。ほんものの572かはしらんが
デバッグ版をうpしてしまった場合なにか問題ありますか?
>>600 すみません。詳しくお願いします。個人情報に関わるようなことは
ディレクトリ構造がばれるぐらいでしょうか?
デバッグ版をupしたの?
603 :
デフォルトの名無しさん :04/09/13 17:09:46
>>602 debugフォルダにあるexeファイルをうpしてしまいました
何か問題ありますでしょうか?
最近始めたので、コンパイルすればそれでいいと思ってたのですが
Releaseに設定しないとダメなんですね。
最近のプログラムって難しいです
>>592 ごめん。上のウソだった。
無理やりヤっちゃいたい時は p.Kill()
優しくしたい時は p.WaitForExit()
>>597 MouseEventArgsのButtonsプロパティで拾えるから
あとはアーダコーダやればOK。
話変わりますけど リストビューの項目を色分けで表示したいのですが どうすればいいですか? htmlの形式でやったほうが一番手っ取り早いですか?
だからディレクトリが分かることだけ。 ユーザー名も分かる可能性あり。 まだファイルがあるかどうかは当然分からない。 デバッグ版はupしない。 念のためプロジェクトフォルダはユーザー名が含まれる可能性のあるデフォから変えておく。
>>597 >>605 の補足。
DoubleClickイベントだとただのEventArgsしか取得できないので、
MouseDown辺りを使ってMouseEventArgs.Clicks == 2のときにダブルクリック時の処理を書く。
>>606 > リストビューの項目を色分けで表示したいのですが
> どうすればいいですか?
そのまんまのプロパティがあるだろ……。
>>608 それって2003年版とかですか?
モレのは2002年版なんだけど
なかったんだけどな・・・・
>>609 『System.Windows.Forms.ListViewItem.ForeColor プロパティ』
とりあえず探してみ
背景色なら『System.Windows.Forms.ListViewItem.BackColor プロパティ』
>>610 そのプロパティならあるんですが・・・
言い方悪かったみたいで
エクスプローラーでいうと
BMPファイルは赤で色反転
テクストは青で反転みたいな感じで
種類によって色分けしたいんですが
>>613 反転色を変えるの?
だったら無理ぽ
文字色・背景色を変えるならこれらを使う
>>614 文字色背景色もリストビュー項目のすべての色が変わる仕様じゃないですか?
項目ひとつひとつ色を変えることはできなかったような
SelectedColorを動的に帰るとなると、まぁ、 ListViewItemを自作するしかないわなぁ。
>>616 いや、選択状態にしてなくてもいいので
無選択の状態で項目ごとに色分けできたらいいのですが
それもできないですか?
御前ら! ListView.ForeColor じゃなくて ListViewItem.ForeColor だぞ(゚Д゚#)ゴルァ!!
とりあえず
>>572 は一週間ぐらいMSDN読み続けろ
なんだこのスレの伸び方は・・・
D:\BUCKUP\MYDATA\MYSOFT\C#\TEST\pso\obj\Debug\pso.pdb
D:\BUCKUP\MYDATA\MYSOFT\C#\TEST\pso\obj\Debug\pso.pdb D:\BUCKUP\MYDATA\MYSOFT\C#\test#\PsoBBIdSort\obj\Debug\PsoBBIdSort.pdb "BackUp" な。綴りはちゃんと覚えないと恥ずかしいぞ?
>>621 >>622 イチイチ晒さなくていいんじゃないですか・・・
ところで、穴って何かわかりますか?
>>623 とりあえず恥さらしってだけ。
どちらにしろこれだけでは何もされないから安心しとけ
おかしなヤツがそのパスを持って穴と言ってるだけかと。
>>624 そうですか・・・安心しました。
スレ汚したのは申し訳なかったです。
私にとっては一大事だったので
PCに穴が開いているのは確かだな。 結果こうやってパスが漏れたわけだし。
>>594 にはこう書いてあるぞ
> そうじゃなくて、ファイルをサイトにアップしたのですが
> コンパイルした場所からじゃなくて、別のドライブのディレクトリに移動して
> そこからうpしたのですが、その別のドライブのディレクトリに
> まだファイルがあるってことを指摘されたんです
>>627 なるほど、セキュリティの穴って訳じゃなかったんですね。
あ、でも、PC内部の構造だから一応セキュリティってことか
つーか、デバッグとリリースってのがあるとは・・
>>628 移動先のディレクトリでコンパイルし直したのをあげた予感
BackUp フォルダでコンパイルすることって……よくあることなのか?
> まだファイルがあるってことを指摘されたんです これはどこのレスで指摘されたの?
>>628 最初はコンパイルした場所から、次に別のドライブで
>>520 の「相変わらず」に繋がるわけだろう。
気にするほどのことでもない。
>>628 >>620 の分を読んでセキュリティに穴が開いてるのかと思い
そうすると、WEBサイトから何かしら情報抜き出して
おれのパソコンに繋げてきてるのかと思って
うpしたディレクトリみたら、
そのファイルがまだ残っていたので(それ以外は削除したのに)
てっきり、残っているファイルが何かわかっているのだと思ったのです
ネットワーク関連の知識はまったくないので・・
でも、一応、すべてのファイルはアドミニスターしかアクセスできないように
してるので、運営者などに仮にIP特定されてアクセスされても
アップしたファイルにはアクセスできても他のファイルにはアクセスできないはずなのに
早とちりだったのかな。とりあえず、これで安心して眠れます
残暑が厳しいなぁ
>>630 BACKUPフォルダにあるファイルは1週間ごとにDVDRAMにバックアップ取ってるので
そういう意味で付けました。消えては困るファイルだけをそこに・・・
このソフトはどうでもよかったのですが、面倒だったので、そのままそのディレクトリで
コンパイルしてしまってました。
みなさん、やさしいですね><ほんと、助かりました。ありがとうございます
ID:AacwGZwB 痛すぎ
>>633 揚げ足を取るようで申し訳ないが“アドミニストレータ” (^^
そしてAdmin権限で隠し共有からファイル抜きたい放題。
たまにアカウントを本名で登録している奴いるよな。 そういうのがマイドキュメントでビルドしたら、いい恥晒しになるかもしれんね。
>>639 人の名前を笑っちゃあかんだろw
本名晒したことは笑えるが
……どちらにしろリリースビルドすれば大丈夫だよね?
>>605 >無理やりヤっちゃいたい時は p.Kill()
>優しくしたい時は p.WaitForExit()
うんむ〜。
WaitForExitはやさしくやるとかそういう問題ではないが…
通常のウィンドウのあるアプリならCloseMainWindow。ただし終われるとは限らない。
ウィンドウのないプロセスは通常強制終了(Kill)するしかない。
MSDN見たらInvalidateがスレッドセーフではなかったんですが、
ってことはやっぱり他スレッドからInvalidateを呼んではいけないんでしょうか?
私はてっきりWndProcにWM_PAINT投げるだけかと思っていたんですが。
>>536 のサイトも見たのですが、BeginInvokeで問題ないんでしょうか?
>>642 疑問に思ったらILDASM。
結構いろいろやってるもんだな。
>
>>536 のサイトも見たのですが、BeginInvokeで問題ないんでしょうか?
うん、それでOK
644 :
デフォルトの名無しさん :04/09/14 01:46:00
ADO.NET関連はこちらでいいんでしょうか。 Web製作板探してみたんですが、見当たらないのでこちらで失礼します。 ADO.NET C#でSQL ServerにViewを作成しようとしています。 System.Data.OleDb.OleDbCommand command = new OleDbCommand(); command.CommandText = @"CREATE VIEW [search_view] AS SELECT * FROM [ddb].[msg_tb]" + @" WHERE [comment] LIKE ?"; command.Parameters.Add( "@comment" , System.Data.OleDb.OleDbType.VarChar , 1000 , "comment" ).Value="%test%"; command.Connection = this.connection; System.Data.OleDb.OleDbDataAdapter adapter = new System.Data.OleDb.OleDbDataAdapter( command ); adapter.Fill( myDataSet.msg_tb ); SQL文についてはクエリアナライザで問題なく動作することを確認しております。 しかしコード中で実行すると「キーワード 'VIEW' 付近に正しくない構文があります。 」と例外で出てしまいます。 色々と試して見ましたが、WHERE 以下の文字列を削除すればViewは作成されます。 そしてcommand.Parameterを使用して文字列(LIKE ?部分)を追加するのではなく、?部分を直接文字列%test%」にすると正常動作します。 どうすれば解決できるでしょうか。よろしくお願いします。
何で列名を指定してる?
colorに定義されてるシステム色を順番に出力したいのですがどうすればいいでしょうか? 毎回、Color.Redとか名前で指定するのが面倒なので・・
リフレクション 順番ってなんじゃろ?
いぜんMFC使ってて、バグった時になかのソースまで終えるのが好きだったんですが、COMで切れそうになりました. .NETやると同じ責め苦を味わう羽目になるんでしょうか?
>>646 Colorクラスでリフレクションしても出来るが、この方が楽。
つーかヘルプにしっかり書いてるだろ・・・
お前が言うところの「順番」を満たしているかは知らん。
foreach (string s in Enum.GetNames(typeof(KnownColor))) orz(Color.FromName(s));
>>648 >いぜん、なかの、終える
落ち着いて書け。
>同じ責め苦
どういう責め苦なんざんしょ。
遅レスですが
>>590 です。
>>605 >>641 レスありがとう。
p.CloseMainWindowは前に試したときは動かなかったのですが、
書き込みを見て再度見直したところ、とりあえず終了する事は出来ました。
でもこれって直前のプロセスを終了するだけみたいですね。
ラウンチャみたいなのを作っていて、
まとめて起動したのを、まとめて終了したいなと思いました。
パスを指定して終了とか出来れば良いんですけど、それは無理みたいですね。
むー。
>>651 > でもこれって直前のプロセスを終了するだけみたいですね。
> ラウンチャみたいなのを作っていて、
> まとめて起動したのを、まとめて終了したいなと思いました。
ProcessインスタンスをArrayListなりで保持しておいて必要な時にforeachで纏めて殺せば良いだけでは?
> パスを指定して終了とか出来れば良いんですけど、それは無理みたいですね。
Process.GetProcessesByName静的メソッドとかあるよ。
windowsアプリケーションの設定を保存するために.configファイルを使いたいと思います。 .configファイルから値を取得するメソッドは見つかりましたが、値を設定するメソッドが見当たりません。 どうすればプログラムから値を設定することができるのでしょうか。
>650 すまんそ... 以前MFC使ってて、バグった時に中のソースまで追えるのが好きだったんですが、COMで切れそうになりました ですじゃ... ADOをMTSで使ってたときですが、呼び出しの中ですっ飛んで、”一般的なエラー”とか原因不明なエラーをだしやがって、中まで追えず、原因わからずきれそうになった経験が. ..
>>649 ローカル変数sをスコープで宣言することができません。
for文で色を列挙していきたんですが
>>649 string[] col=Enum.GetNames(typeof(KnownColor));
Color.FromName(col[1]);
これでいけましたありがとう
>>654 氏
これで合ってます。それで、
このサイトではconfigファイルを直接編集して値を書き換えているみたいですが、
値の書き換えをレジストリの設定のようにプログラム内から行いたいんです。
Image IMG = Image.FromStream( FS ); とやった後、 FS.Close(); してしまうと、 その後の IMG.Save() でエラーがでるということがわかりました。 これはどういうことなんでしょうか? Image.FromStreamでIMGを作った時点で、 もうFSは関係ないのではないかと思っていたのですが…。 IMGはFSが指すファイルへの参照でしかないということですか?
ASP.NETで質問です。 ascxファイルを作るとき、テスト用のaspxファイルに 「<%@ Register TagPrefix="uc1" TagName="header" Src="header.ascx" %>」 と記述して、aspxファイルと同じフォルダに入れてテストしてました。 うまくいったので、他のaspxファイルでもheader.ascxを共有して使おうと思い、commonフォルダを上に作って 「<%@ Register TagPrefix="uc1" TagName="header" Src="..\common\header.ascx" %>」 としました。 そしたら 「解析エラー メッセージ: 仮想パス '/common/header.ascx' がほかのアプリケーションに割り当てられていますが、これは許可されていません。」 というエラーが出てしまいます。 ascxファイルはどうやって共有するのでしょうか?
>>660 氏
その辺りです。例えば、
System.Configuration.ConfigurationSettings.AppSettings["Form1.Icon"] = "hoge.icon";
のようにしたいんですけど、プロパティはgetだけしかないのでできないんですよね。
他にいい方法があると思うんですけど。
>>663 .NET 2.0ではそんな感じでできるけど1.xではない。
xmlシリアル化とかその辺に転がってるセッティング用のクラス使われたし。
>>652 レスありがとうございます。
変にforで回してしまっていて、かなりやり直さないとダメの予感です。
アドバイスを参考に週末にでもじっくりやり直してみます。
>>664 氏
できないことがわかっただけでよかったです。ありがとうございました。
しばらく適当に自作したクラスを使っときます。
>>465 参考に動くめどがつきました。
ありがとうございました。
>>643 ありがとうございます
ところでBeginInvokeはただコントロールを所有するスレッドに処理を渡すだけですよね?
ということは、メインスレッドでフォーム、ラベル、ボタンを作った場合、
Form.BeginInvoke(delegate)
label.BeginInvoke(delegate)
button.BeginInvoke(delegate)
のどれでもいいってことでしょうか?
.configファイルって実行ファイル一つにつき、一つしか作れませんよね? あれを使えばスキンが作れそうだったけど、上の制約で困ってます。 なにか良い方法はありませんか?
>>669 .configにこだわらなければ良いんでない?
読込部分を作る必要はあるが、それはたいした手間でもなし。
一番手っ取り早いのは適当なクラスを作ってXmlSerializerで読み書きすることかな?
>>668 そういうことになるね。
>>655 まあ、デバッガ使うのに慣れておいたほうがいいかも。
ツールバーの背景色を変更するにはどうしたらよいですか? flatスタイルにしたら背景色が変わってしまって困っています。
listView1.Sorting=SortOrder.Ascending これってリストにアイテムが追加された時点で動作するんですね Items.Addで項目追加した後に、SubItems.Addしようとすると エラーはでないのですが、ちゃんと思ったように項目追加できません 一応。一旦SortOrder.Noneにしてからアイテム追加して その後ソートするって方法を取っていますが ほかによい方法ありますでしょうか?
674 :
デフォルトの名無しさん :04/09/15 07:22:54
>>661 俺も引っかかったことがある。
俺の場合、Saveじゃなくて、ImageAttributesを使っての描画で落ちた。
ストリームから作成した画像の場合、使い終わるまでそのストリームは閉じてはダメみたいなことを
どっかで読んだ記憶があるがソースは忘れた。
>>673 > エラーはでないのですが、ちゃんと思ったように項目追加できません
思ったようにって、どういう動作を期待して、
実際には具体的にどういう動作になるのさ。
676 :
デフォルトの名無しさん :04/09/15 09:23:34
>>675 これができない人が本当に多いよね。
(で、順を追って説明させてみると自己解決してしまったり)
念じたように動かないのなら、 念に反応する入力デバイスの不良が考えられる。 早く修理に出すべきだ。
679 :
デフォルトの名無しさん :04/09/15 09:34:04
フォームを表示するときに すべてのコントロールを読み込んでから 表示する方法ってどうしたらいいのでしょうか? コントロールを貼り付けていくと、フォームを表示した時に 読み込んでる感がたっぷりでちゃうんですが・・・
読み込んでる感は描画の問題じゃないの? FormにControl.Addしてから表示してるわけだし。
681 :
デフォルトの名無しさん :04/09/15 09:42:26
>>679 そういう場面に出会ったことないけど、イベントハンドラでコントロールを
生成してるの?
それか、やたらコントロールが多いとか?
インストーラを使わずに Windowsサービスへの登録、解除を行うにはどうすればよいでしょうか? ユーザーモードとサービスモードを オブションから切り替えるような形にしたいのです。
>>681 遊びで100個ぐらいテキストボックスとラベルくっつけてみたら
もっさり感がいっぱいなので、
どうにかならないものかなぁって・・・
こんな事はやらないが正解かなぁ・・・
Controlの配列つくって、Controls.AddRange()でやると ちょっとだけ早いかもしれないね。
>>684 なるほど・・・
ちょっとやってみます。
ありがとうございました。
>>680 、681
ありがとうございました。
>>682 レジストリを自分で書き換える。
hogehoge.reg というファイルを作ってダブルクリックとか。
---- cut here ----
REGEDIT4
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\サービス名]
"パラメータ名"=dword:値
"パラメータ名"=dword:値
"パラメータ名"=dword:値
---- cut here ----
687 :
デフォルトの名無しさん :04/09/15 10:08:06
>>685 起動後に再描画させてみる(他のウィンドウをかぶせてみるとか)と
生成なのか描画なのか切り分けができそう。
>>686 ありがとう。だいたいできました。
DisplayName = サービス名
ImagePath = 実行パス /必要なら引数
Start = スタートアップの種類 ( 2 = 自動、3 = 手動、4 = 無効 )
Type = よくわからないけど他のを真似てみる
ErrorContro"= よくわからないけど他のを真似てみる
ObjectName = ログオンアカウントっぽい?( LocalSystem = ローカルシステムアカウント )
Description = サービスの説明
まだ他にも色々よくわからない値がありましたが、
このくらいやればとりあえず動くっぽいのを確認しました。
689 :
デフォルトの名無しさん :04/09/15 16:15:58
windowsapplicationを作っているのですが、 mainMenuを追加しても、実行時に見えなくなってしまいます。 編集時でも、フォームを選択して、mainMenuのフォーカスをはずすと 見えなくなってしまいます。 これって、どうすれば解決できますか? 宜しくお願い致します。
>>639 を読んで自分のパソコンのアカウントを作り直した俺はあほですか
うん
>>690 そんなことせーへんでもマイドキュメントの参照先を変えればいいだけなのにw
693 :
デフォルトの名無しさん :04/09/15 17:00:44
ていうか、マイドキュを使わなきゃいいだけでは?
でふぉがマイドキュだしね
695 :
デフォルトの名無しさん :04/09/15 17:22:59
Processで起動したアプリケーション(ウィンドウ付き)を、こちらのプログラム側から 最小化したり最大化したり、タスクバーから消したりしたいんですが、どうしたらいいですか?
適切な条件でウインドウハンドルを取得して、メッセージを送るだけ。
その関数なりを書いてくださいよ…ぐぐれないじゃないですか。 別にC#でも出来ないわけじゃないんですよね?unmanagedじゃないとできないわけでも無いですよね?
700 :
デフォルトの名無しさん :04/09/15 19:28:45
SendMessage()
こういう時に自身のWndProc(ref Message)を呼ぶってのはどうなんだろう。 //真っ当じゃないと思うが動作してしまう。
スレッドの作成したコントロールを他スレッドからいじってはいけない理由はわかったのですが (Windowsフォームが内部でCOMを使ってるからですよね?) あるスレッドの作ったBitmapなどのオブジェクトも他スレッドからいじってはいけないのでしょうか? 今のところ不具合は出てないのですが、不安です。
>702 スレッドを使ってはいけないのはMFCのときも同様で、それはWindowHandleとMFC内部の管理オブジェクトとの関連付けでおかしくなる可能性があったため(うろ覚え) .NETの場合は知らないけれど、多分同じようなものなのでは?そういう意味ではBitmapなどについてはある処理についてはスレッドセーフかもしれないけれど。
>>703 ありがとうございます
VBからC#に来たので、あまりWindowsの内部についての知識がなかったもので戸惑いました。
ということはMFCでCBitmap(でしたよね?)がスレッドセーフなのかどうか調べればよいのでしょうか?
>>704 スレッドセーフと、「コントロールは他のスレッドからアクセスしてはいけない」は微妙に違ったり
MSDN あたりに書いてあるんじゃないかな?
スミマセン スレッドセーフの意味を履き違えていました。 MSDNには、MFCはオブジェクトレベルでの安全性を保証していないので 複数のスレッドからオブジェクトを共有する場合は同期を取る云々、とありました。 コントロール等の記述は見当たらなかったのですが、 複数スレッドからオブジェクトは共有出来るのではないかと思いました。 COMが絡むのはWindowsフォームだけなのでしょうか? 質問ばかりでスミマセン。
>>706 それなら、C# では lock を使ってオブジェクトを排他制御すればよし
COMが絡んでも、.NET だとラップされてるから関係ないんじゃないか?
マニュアルのどこかに、特殊な操作を必要とするなら書いてあると思う
冷たいようだが、マニュアルを読めって事なのかな?
windowsプログラミングで Application.EnableVisualStyles(); としてXPスタイルを有効にするとツールバーのアイコンが見えなくなってしまいます。 どうすればよいのでしょうか。
バグなので素直にmanifest使う
スレッド間での同期の取り方はわかるのですが、 オブジェクトを共有することに、Windowフォームコントロールのような特殊な制限があるのかな?と思いまして。 MSDNには、マルチスレッドで他スレッドからコントロールを直接触ると危ないのでBeginInvokeを使う・・・程度しか書いておらず、 ネットで調べたところ、WindowsフォームはCOMを使っているので、 コントロールのオブジェクトがスレッドに関連付けられている、ということまでわかりました。 そこは理解できたのですが、他のオブジェクトはどうなっているのか疑問に思った次第です。 COMの理解が進んでいないのですが、 WordにExcelやBitmapを貼り付けられるのもCOMの技術、という記述を見つけたので、 もしかしたらBitmapもCOMでスレッドに関連付けられたりしてるのかと。
スミマセン更新してませんでした。
>>712 の書き込みは見なかった事にして下さい。
>>708 この記述からするにBitmapもスレッドを超えて共有することは推奨されてないようなんですが、
ワーカースレッドがBitmapを作成し、描画を行って、
あるタイミングでメインスレッドがそのBitmapを読み込む、という動作も危ないんでしょうか?
そんなわけないと思うのですが・・。
>713 危ないですよ. 逝っておくけれど、メインスレッドとワーカースレッドにはなにも違いはありません. だからメインスレッドが作ったBitmapにワーカーがアクセスすることが危ないのならワーカーが作った物にメインがアクセスする事もまた危ないのです. >702 のCOM使ってるうんぬんはたぶん関係ないともいます.というよりCOMは使ってないと思うんですけど...
>>715 危ないですか・・・
それでもBitmapを共有しなくてはいけないので、
HBITMAPで共有したいと思います。
色々とありがとうございました。
詳しくはわからないのですが、
コントロールのドラッグアンドドロップ機能はCOMを使っているそうです。
Mainの属性に[MTAThread]にするとdllエラーが起こるとかなんとか・・・
違ってたらスミマセン。
>>712 GDI+ のオブジェクトはスレッドセーフではない(←複数のスレッドから同時に操作すると危険)のだけれども、
lock や Monitor を使って一度に1つのスレッドから操作する分には安全なので、C# のラッパークラス
(Graphics やら Bitmap)も大丈夫だと思う。
COM オブジェクトに関しては、複数のスレッドから自由に操作してもよいもの (Free Thread) と、
そうでないもの (Single Thread) とがあります。これは COM の作成者がどっちか決めて作る。
>>716 GDI+ のクラスのラッパークラス (Graphics とか Bitmap とか) は、排他制御さえしていれば
別スレッドからメソッドを呼び出しても問題ないと思うけど・・・
>>717 やはり大丈夫なんでしょうか
MSDNによると「他のコンポーネントと違い、コントロールは作成したスレッドから〜」という記述があるので、
そのまま素直に読めば、他のコンポーネントは作成したスレッド以外からでもいじれるようにも思えました。
今日一日COMについて勉強してみましたが、
STAスレッドのGUIアプリなのに、スレッド間でもオブジェクトの共有が出来てたりするので、
.NETFrameWorkが何かやってるような気がしないでもないです。
.NETとCOMのinteropはおいおい学んでいくとして、
今はこれで納得しようと思います。
皆さんありがとうございました。
ビットマップのカラーパレットを示すhpaletteを取得したいんですが、 アンセーフじゃないと出来ないんですか?
お前が試してみてunsafeつけないと失敗するんなら、 アンセーフじゃないと出来ない。
>>720 聞き方が悪かったです。
アンセーフでhpaletteを取得する方法はわかったのですが、
.NETフレームワークのライブラリの中に取得するメソッドはあるのでしょうか?ということです。
私が調べた限りでは見つかりませんでした。
.GetHpalette()とかそんな感じのメソッドがあるといいんですけど。
スレ違いなら誘導お願いします .NET Framework や .NET Compact Framework の サービスパックや 新しいバージョンのリリース予定,現在のバグ一覧などが見られるサイトは ありませんでしょうか? あれば教えてください.おねがいします.
MSDN はチェックしたつもりなんですが,見つけられませんでした. お手数おかけして申しわけないのですが,よろしければ URL をはって頂けませんか? 一番欲しいのはバグ一覧が見たいのですが….
>>721 ノータッチデプロイとかでどーーーーしても .NET Framework ないでやる必要があるなら、
MemoryStream に BMP で Save して中のヘッダを見ればパレットが取れると思う。
↑ HPALETTE じゃないけど、パレットの色情報ってことね。
独り言だけど、マルチスレッド関連、マルチプロセッサ等考慮して非常に厳密にやろうとするなら lock から出る前に Thread.MemoryBarrier() 呼んだり、あるいは Thread.VolatileWrite 等で書いたり する必要があるみたいですね。サーバ系AP書いてる人は要注意っぽいな・・・
上の方で話題になってましたけど なんでフォームコントロールは他スレッドからアクセスしちゃいけないんですか? MSDNにもそう書いてありましたけど理由までは載っていなかったので
>>727 別CPUにスレッドが割り当てられるのってどんな場合があるの?
※普通にやっててそうなる?
もちろんそういう状態で動作するんなら考えないといけないだろうけど、
現実に現在の環境で起こり得るのかなって思って。
>>730 う・・・MSDNは大体目を通したつもりだったのですが
すみません。
スレッディングモデルを考えるのはフォームコントロールの部分だけってことですよね?
ということは同じアプリの中にSTAとフリースレッドが混在してたりするんでしょうか。
気付かずに使ってましたけど、結構難しいんですね。
>>730 >スレッド2つビジーにすればあっさりCPU二つ100%になるよ。
あら、さいでしたか…
>つかならなかったら悲しいじゃないか、デュアル以上のシステムが。
そりゃそうなんだけど、以前はそういうもんじゃなかったっけ?
733 :
デフォルトの名無しさん :04/09/17 20:24:56
C#でDirect3D9のプログラムを作っているんですが、 カーソルキーのKeyPressイベントを認識してくれません。 これって何かおまじないがいるのでしょうか。
昔は悲しかったってことさ…。
736 :
デフォルトの名無しさん :04/09/17 21:19:47
C#と直接関係があるわけじゃないんですけど、 今Socketクラスを使って簡単なHTTPクライアントを作っているんですが、 リクエストをサーバに送ってレスポンスを受け取りますよね? そのレスポンスがGIFなどの画像ファイルの場合、 どうやって最初にくっついているヘッダー情報を消せばいいんでしょうか? こんな感じの↓ HTTP/1.1 200 OK Content-Type: image/gif Last-Modified: Mon, 22 Mar 2004 23:04:43 GMT Expires: Sun, 17 Jan 2038 19:14:07 GMT Server: GWS/2.1 Content-Length: 8754 Date: Fri, 17 Sep 2004 12:18:13 GMT ↑このヘッダーを消さないと画像ファイルとして開けないんです。
>>736 HTTP のレスポンスは、
ヘッダ1 <CR><LF>
ヘッダ2 <CR><LF>
ヘッダ3 <CR><LF>
ヘッダ4 <CR><LF>
ヘッダ5 <CR><LF>
<CR><LF>
このあとデータ本体
って感じになってます。
バグったCGIだと、<CR><LF>のどっちか一個(大抵は <LF>) だけしか送ってこないこともあります。
漏れ的には HttpWebRequest 使ったほうがいいと思うけどね。タイムアウトの制御も簡単だし。
空行があったら、そこまでを切り離せば良い。
あ、「どうやって消す」っていう質問だったか・・・ バッファリングが適切に効くように Socket をNetworkStream で包んで、ReadByte で <CR><LF><CR><LF> または <LF><LF> が来るまで読み飛ばせばいいんじゃない? (注) <CR> ってのは '\r' で、<LF> ってのは '\n' のこと。
740 :
736 :04/09/17 21:45:11
>>737 >>738 >>739 レスポンスの全てをバイト配列に読み込んだ後に、
ヘッダーを削除する処理を行いたいのですが、
何かよい方法ありませんでしょうか?
空行の後を別の配列にコピーすればいいだけでは?
>>740 バイト配列は変更不可なんだから、MemoryStreamに流し込むあたりか。
適当な手段で位置を特定してあとはArray.Copyとか。
743 :
736 :04/09/17 21:53:27
>>741 文字列なら簡単なんですけど
バイト配列の場合どうやってやればいいんでしょうか?
空文字にリプレイス と元の質問も知らないけど言ってみる
>>742 サイズを指定して領域を確保した後、そのサイズ分だけ転送。
特に迷うところはないが。
746 :
736 :04/09/17 22:11:00
分かったような分からないような…。 とりあえず色々と試してみます。 どうもありがとうございました。
747 :
733 :04/09/17 22:40:54
>>733 の自己レスです。
特殊キーはKeyDown、通常キーはKeyPressで処理するようでした。
>>747 DirectXの話はそれ用のスレがあるからそっち行った方がいいよ
・・・最近しんでるけど
まあKeyPressは使いにくいから普段つかわんわ。
>>727 変数をvolatile付けて宣言してもだめなの?
C# の場合、フィールドに volatile 修飾子を使用すると、そのフィールドへのすべてのアクセスで VolatileRead または VolatileWrite が使用されることが保証されます。 と書いてあったので大丈夫だ。
Toolbarの背景に画像を使うにはどうしたらいいでしょうか? Paintイベントが無いので描写するのはムリですかね・・。
>>752 PanelとButtomで似たようなクラス作るか、
もっといろいろやりたければ、Control継承してシコシコやるかだね。
ちなみに .NET2.0でもBackgroundImageみたいのは追加されてないよ。
>>753 ToolBarクラスにはBackgroundImageあるよ。
自分で検証してみたところ反映されてないけど・・・。
>>754 え?あったっけ?
Button用のImageListしかなかったような…。
>>753 >>754 やはり標準のToolBarではキビシイですか・・。
PanelにButtonを置いて簡単なツールバーに見立てることにします。
ご解答どうもありがとうございました。
757 :
デフォルトの名無しさん :04/09/18 15:39:17
初歩的な質問ですが LabelやPictureBox下のコントロールなどを透過するには どうすればいいでつか(´Д`;)?
>>758 なるほどそうすればいいんですね
どうもありがとうございました(´∀`*)
760 :
デフォルトの名無しさん :04/09/18 17:04:13
System.Drawing.Graphics で描写した画像をファイルに保存するほうほうを教えてください
pictureBoxかなにかで一枚の一画面以上の大きい画像または 複数の一画面画像を使って画像がスクロールしているようにするには どうすればいいですかね? 何かいい方法があればご教授くださいませ(´・ω・`;)
>>760 Bitmap bitmap;
***
using (Graphics g = Graphics.FromImage(bitmap)) { *** }
bitmap.Save(***);
>>762 ウホ!サンクス
>>761 画面からはみ出す大きさの画像をスクロールさせて見たいってことかな?
フォームにPanelを配置
PanelにPictureBoxを配置
PanelのAutoScrollをtrue
とすればPictureBoxがPanelより大きいとき
スクロール機能を勝手につけてくれるけど
ttp://www.thecodeproject.com/csharp/networkmonitor.asp 上記URLのThe Code ProjectのRawSocketクラスを利用して色々いじっているのですが、
当然といえば当然ですが、パケットが分割されて受信されます。
TCP/IP限定でいいのですが、分割されたパケットを結合するためにはどうしたらよいのでしょうか?
一応色々調べてみたのですが『3ウェイハンドシェイク』とかが関係あるのでしょうか?
またTCPなのでパケットの送信順序は保証されると思うのですが、
分割されたパケットを受信してる間に、他のパケットを受信する事はあるのでしょうか?
例えば、
パケットA-1
パケットA-2
パケットB-1
パケットA-3
バケットB-2
・・・・
という具合に。
C#でパケット監視できるソフトって作れるの?
>>764 そういうのじゃなくて、キー操作やマウスクリックでスクロールするように
したいのですが、できませんかねえ?
すいません、説明不足でしたorz
>>768 KeyDownやらMouseDownに処理を書きたまへ。
770 :
デフォルトの名無しさん :04/09/19 15:09:30
(すみません、適切なスレが見つからなかったのでこちらに書かせてもらいます。) Javaの初期って、ガーベジコレクション時の挙動がかなり問題であったかと思いますが、 .NETでもやはりGCが走ると比較的長時間固まってしまうような現象は 発生するのでしょうか?
比較的長時間がどのくらいの時間なのかしらないけど、とりあえず気になったことはないな。
場合によってはありえる話ではあるのだが、俺も体感した事はない。
>>768 KeyDownやMouseDownでPictureBoxのTopやLeftプロパティを変えれば
とりあえずいけます。他にももっとうまい方法があるかも
てきとーに書いてみました。
>>1 のソース置き場の80に置いておきます
とりあえずキー操作だけだけど、どうでしょ?
>>770 そんなのマシンスペックに依存するし、稼働状況にもよるから何とも言えん。
ただし、ガベージコレクタが動いたら、まじで固まったように思うよ。
意図的に、呼んでみればわかると思うが。
>>773 なるほど、参考にさせていただきます
どうもでしたm(_ _)m
776 :
デフォルトの名無しさん :04/09/20 17:07:29
string型の文字列をint型にするにはどうしたらよいでしぃうか? ファイルから読み込んだ数値を計算したいのですが(´ω`;)
>>776 Int32.Parse()とかConvertクラスとか。
778 :
デフォルトの名無しさん :04/09/20 17:46:12
>>777 解決しました
ありがとうございました〜(人´∀`)
WMPで再生リストを表示するにはどうすればいいでしょうか Playerオブジェクト使いづらい。・・
他スレッドからコントロールを扱う方法は private delegate void hoge(); //スレッド内部の処理 //Form form1 = new Form(); form1.BeginInvoke(new hoge(form1.Refresh), new object[]{}); こんな感じで良いのでしょうか? 処理したいメソッド自体はコントロールのインスタンスを直接しても大丈夫ですか?
>こんな感じで良いのでしょうか? 聞く前にやってみればいいじゃねえか。 >処理したいメソッド自体はコントロールのインスタンスを直接しても大丈夫ですか? やってみてエラーや不具合がなければ大丈夫なんじゃねえか。
>>782 BeginInvoke って非同期だけど (EndInvoke も要るし)、そこんとこ OK?
デッドロックしないことがわかってるなら、ただの Invoke でいいのでは。
>>783 自分で試した限りでは問題なく動くのですがフォームコントロールの他スレッドからの干渉は
必ずしも毎回起こるわけではなさそうなので自信がもてませんでした。
>>784 例えが悪かったです。
呼び出しそのものはInvokeでもBeginInvokeでもどちらでも良かったのですが、
デリゲートに渡すメソッドはコントロールのインスタンスを直接参照してもよいものかわからなくて質問しました。
COMはほとんどわからないのですが、
STAスレッドの考え方からすると、他スレッドから直接コントロール(この場合フォームクラス)のメソッドを参照するのは良くないのかなと。
786 :
デフォルトの名無しさん :04/09/21 23:40:46
実行中にボタンのイメージを変更したいのですが button1.Image=Image.FromFile("File.bmp"); でやっても表示されないのですがなにが駄目なんでしょう?
>>786 それだけじゃなんとも。
まず変更前後の画像が本当に違うものなのかってところから。
788 :
デフォルトの名無しさん :04/09/22 00:01:54
789 :
デフォルトの名無しさん :04/09/22 00:07:55
System.Windows.Forms.ControlのInvalidate()をオーバーライドするには どうしたらいいですか?
>>789 不可能
派生クラスでだけでInvalidete()使うだけならnewで隠蔽するとか、Paintイベントを拾うとか別の方法を模索。
>>783 スレッドがらみのことでそれはちっときつい。
794 :
デフォルトの名無しさん :04/09/22 17:13:28
初歩的な質問ですいません。 フォームの名前を文字列で持っている状態で それを用いて、フォームを開く方法はあるでしょうか? string Form_Name = "Form1"; の状態でForm1を開きたいのです もし分かる方が居たらご教授願います
リフレクション
796 :
794 :04/09/22 17:36:19
>>795 氏
すいません、リフレクションを使えば可能ということですか?
ヘルプを見たのですが、どのようにしたら良いのか
分からなかったのですが…
教えて君で申し訳ないのですが
すいませんが、方法なども教えていただけますか?
素直にFormへの参照を持たせたら? どんなプログラムの構造かしらんけど。
リフレクション使うのなら System.Reflection.Assembly.GetAssembly() .GetType(Form_Name) .InvokeMember("", System.Reflection.BindingFlags.CreateInstance, null, null, null); だったかな? これで Form_Name のコンストラクタを呼び出してオブジェクトが返る Form_Name にはネームスペースまで含めないと駄目だったかも もっと単純に作るなら、Form_Name からの条件分岐で Form1 を直接作れば良い
799 :
デフォルトの名無しさん :04/09/22 17:59:08
Form1を閉じてForm2を表示させたんですが Form2_Load{}中のコードを実行させるにはどうしたらいでしょう? なんか初歩的でスマソorz
>>799 他から呼び出す部分をpublicなメソッドに纏めたら?
803 :
794 :04/09/22 19:15:59
>>798 氏
わざわざソースを書いていただき有難うございました。
お蔭様で、考えていた通りの機能を実現する事が出来ました。
本当に感謝です♪
Visible=falseに設定してあるピクチャボックスのImageプロパティが参照されるということはあり得ますか? 見えないピクチャボックスのImageにBitmapを設定しており、 Visible=trueのピクチャボックスのImageに同じBitmapを設定しています。 見えている方のピクチャボックスを再描画させまくると、 「そのオブジェクトは使われています」というエラーが出ます。 Bitmapを使っているのはこの二つのピクチャボックスだけなので、 原因はVisible=falseの方のピクチャボックスからもBitmapが読み込まれてしまっているのだとわかるのですが・・・。
805 :
デフォルトの名無しさん :04/09/22 19:35:14
>>800 ん〜よくわかんないのですが
結局どうやれば実行できるのでしょう^^;?
>>804 それに答えられる人が MS の開発者以外にいるかな・・・
>>805 800 氏じゃないけど、多分こうするんだと思う
private void Form2_Load(object sender, EventArgs e) {
Form2_Load_Main();
}
public void Form2_Load_Main() {
// ここに処理を書く
}
Form2 が普通にロードされたときには Form2_Load 経由で Form2_Load_Main が呼び出される
自力で実行させたい場合には Form2_Load_Main を直接呼び出す
メソッドの名前は自由に変えておくんなまし
810 :
デフォルトの名無しさん :04/09/22 20:48:46
>>809 おかげさまで直接呼び出せるようにはなったのですが、ロード時がよくわかんないのですが
Formがロードされたとはどうゆう状況なのですか?
Show()で表示させただけではだめなのでしょうか?
811 :
デフォルトの名無しさん :04/09/22 21:01:55
Show()ではLoadイベントが起きん。
>>810 Load はフォームが初めて表示される直前らしい
表示/非表示が切り替わった際に呼び出される VisibleChanged が使えそう
LoadイベントはWM_CREATEの時に呼ばれるんじゃなかったっけ?
>>813 MSDN に「フォームが初めて表示される直前」と書いてあったんだから
俺は M$ を信じるが……どうなんだろうか
初めて表示される直前に WM_CREATE されるんじゃないの?
Win のメッセージと .NET の関連はよくわからん
Loadイベント直前のメッセージはWM_SHOWWINDOW が、一度フォームが表示されたあとでWM_SHOWWINDOWを投げても Loadイベントは呼ばれないのでやっぱり「フォームが初めて・・・」が正しいんじゃないかと 原理はよくわからん
816 :
デフォルトの名無しさん :04/09/22 22:20:05
VB6では問題なく動くOCXなんですが、C#ではプロパティを参照するだけで 'System.Runtime.InteropServices.COMException' のハンドルされていない例外が mscorlib.dll で発生しました。 追加情報 : 致命的なエラーです。 となってしまいます。 たしかに、このOCXは.NET対応となってはいないのですが、なんとかして 対応することはできるものなのでしょうか。 ちなみにEleganTalkという音声合成OCXです。 最悪VB6でラップすることになりますが、できれば統合したいんで 探し方の手がかりをいただけないでしょうか。 よろしくお願いします。
817 :
デフォルトの名無しさん :04/09/23 00:01:20
mscorlib って、一体どんな意味なんですか?? 一体なんて読むんですか?? これが分からなくて朝も起きれません。どなたか教えてください。
ムスカリブ
819 :
デフォルトの名無しさん :04/09/23 00:05:08
C♯って明示的に.Dispose()して 使わない領域はいちいちデストラクトしないといけないの?
>>819 使わない領域ってなにさ。
Disposeでデストラクトされるとでも?
息子は、リブだろ!
>>817 マイクロソフトコーポレーションのライブラリの様な気がする
気がするだけ
>>819 ファイナライザから Dispose は呼ばれるかもしれない気がする
気がするだけ
だけど使い終わったらちゃんと Dispose はしといたほうが良い気がする
面倒だったら using ブロック使え
MultiLanguage Standard Common なんとかだった気がする 気がするだけ
MultiLanguage Standard Common Object Runtime Library
>>823 おまえデザパタスレにも居なかったか?
なんで俺のレスは真似されやすいんだろうか
>>822 ~F()
{
this.Dispose();
}
public void Dispose()
{
// なにか適切なDisposeらしい処理
GC.SuppressFinalize(this);
}
827 :
デフォルトの名無しさん :04/09/23 00:43:08
>>826 では不十分。
確定的破棄は下のコードを覚えてしまうのが吉。
public void Dispose()
{
Dispose(true);
GC.SuppressFinalize(this);
}
void Dispose(bool disposing)
{
if (!this.disposed)
{
if (disposing) { マネージドの資源を破棄。 }
アンマネージドの資源を破棄。
}
disposed = true;
}
~クラス()
{
Dispose(false);
}
俺まだ2つのDisposeの使い分け分かってねぇ・・・。 この際勉強するか。
ついでにDispose(bool)の方virtualにしておいて派生クラスから オーバーライド&呼び出しできるようにしとくのがパターン。
831 :
デフォルトの名無しさん :04/09/23 14:07:07
textコントロールにint型変数の数値を代入したいのですが 一時的にint型からstring型に変換する方法はありますか?
一時的?
>>831 一時的?
ToString()メソッドを使えばよかろう。
834 :
デフォルトの名無しさん :04/09/23 14:18:22
>>833 なるほど、うまくいきました
どうもでした〜
836 :
デフォルトの名無しさん :04/09/23 14:44:33
師匠を「おまえ」呼ばわりイクナイ
いわゆるメッセージループの部分ってどこですか?
Application.Run() 実際のループはラップされて見えない。
839 :
デフォルトの名無しさん :04/09/23 18:29:27
名前空間なんですが、なんで System.Windows.Forms.・・・、ってこんなに長いんでしょう。 System.Windows.・・・ や System.Forms.・・・、でいいような気がするんですが。 それに、System.Windows 直下に位置する型は存在しないんですし。 Microsoft.Win32 とかもあるんだから、Microsoft.Windows.・・・とかに全部 まとめてくれるのもきれいだと思うんだけどなあ。
ここは相談室であってお前のぼやきを書きところではない そーゆーのはチラシの裏にでも書け
>>839 何で Windows が System 配下なんだよと思った。
Windows 何だから Microsoft.Windows だろよと。
長いのは別に1回 using するだけだからいいんじゃないの?
ttp://members.at.infoseek.co.jp/molees/disp/Castella_popup_img.html のように、AxWebBrowser で
<DIV class="file" path="c:\ほげ.jpg">ほげ.jpg</DIV>
の上をマウスが通過するとき(onmousemove)に画像の Panel が出現して
離れたら消えるようなコードを書いているのですが、
ひとつ問題が起こって困っています。
ポップアップのPanelを何回も出現させたり消したりしてると
そのうち AxWebBrowser コントロールからイベントが飛んでこなくなるのです。
べつに onmousemove だけじゃなくて oncontextmenu とかも飛んでこなくなります。
これはどうしてこうなるのか、どうすれば直るのか、教えてください。
>>845 constはコンパイル時にその値が直接埋め込まれてて
public constな値が変わってもその値を使ってるほうも全てリビルドしないといけないような予感。
Javaはそれでどうしようもなかったが、C#はreadonlyがあるのが嬉しい。
>>847 おおthxなるほどです。
さて、修正するか・・・
851 :
846 :04/09/24 05:53:33
HTML に JavaScript 埋め込んで自己解決しますた。 C# で解決できなかったのが悔しいなぁ・・・。
852 :
デフォルトの名無しさん :04/09/24 16:57:18
Form1とForm2があり、Form2のデータをForm1に渡そうとしたらどの様にしたら 良いのですか?
853 :
デフォルトの名無しさん :04/09/24 17:12:39
>>852 どんなデータを渡したいのかによって変わってくる。
854 :
852 :04/09/24 17:15:32
Form2のTextboxに何か入力させてOKボタンを押したら、Form1のlabelに入力された データが出る様にしたいのです。
855 :
デフォルトの名無しさん :04/09/24 17:40:04
>>854 その場合は、
Form2を生成、ShowDialog()し
Form2のDialogResultに応じてForm2上のテキストボックスの文字列をreturnする
staticな関数を作る。
856 :
デフォルトの名無しさん :04/09/24 17:42:50
それの関数をForm1から呼び出すようにすれば、 互いに依存しない形になるので、将来別のクラスでも 利用しやすくなる。
staticでForm外から参照できるようになりました。
>857 なんかやな解決法だな... C#ならイベントとか使うようにしたほうがきれいな希ガス
form1のインスタンスをform2で受け取れるようにすればいいのでは? 将来別のクラスでも 利用しにくくなるけど。
>>852 /* Form2 */
public string TextBoxValue{
get {
return this.textBox1.Text;
}
set {
this.textBox1.Text = value;
}
}
/* Form1 */
protected void button1_Click(object sender; EventArgs e){
using(Form2 f2 = new Form2){
f2.TextBoxValue = this.label1.Text;
if(f2.ShowDialog(this) == DialogResults.OK){
this.label1.Text = f2.TextBoxValue;
}
}
}
とかにしとけ。
864 :
デフォルトの名無しさん :04/09/24 21:12:01
865 :
デフォルトの名無しさん :04/09/24 21:12:29
866 :
デフォルトの名無しさん :04/09/24 21:13:33
867 :
デフォルトの名無しさん :04/09/24 21:14:25
868 :
デフォルトの名無しさん :04/09/24 21:15:39
>>861 ( ´д)ヒソ(´д`)ヒソ(д` )
871 :
デフォルトの名無しさん :04/09/24 21:17:07
872 :
デフォルトの名無しさん :04/09/24 21:17:57
>>861 お前のためにあえて言う
「お 前 に は む い て な い」
文句があるなら手前等もソース書いてみろよばーか
ばーかって言う奴がばーかなんだよ ばーか
底辺同士の煽り合いって醜いね
877 :
853 ◆cReQ1pJtI. :04/09/24 21:36:42
自分の言っていたのはこんな風 public class Form1 : System.Windows.Forms.Form { private System.Windows.Forms.Label label1; private System.Windows.Forms.Button button1; private void button1_Click(object sender, System.EventArgs e) { string l_sText = label1.Text; if (Form2.GetForm2Text(ref l_sText, this)) { label1.Text = l_sText; } } }
878 :
853 ◆cReQ1pJtI. :04/09/24 21:37:05
つづき public class Form2 : System.Windows.Forms.Form { private System.Windows.Forms.TextBox textBox1; private System.Windows.Forms.Button button1; static public bool GetForm2Text(ref string a_sText, IWin32Window a_IWin32Window_Owner) { Form2 l_Form2 = new Form2(); l_Form2.textBox1.Text = a_sText; if (l_Form2.ShowDialog(a_IWin32Window_Owner) == DialogResult.OK) { a_sText = l_Form2.textBox1.Text; return true; } else { return false; } } public Form2() { InitializeComponent(); button1.DialogResult = DialogResult.OK; } }
879 :
853 ◆cReQ1pJtI. :04/09/24 21:56:43
よく見たら
>>861 もやってることは同じだね。
細々した処理をまとめてちょっと便利にしただけって感じか。
当たり前だ
881 :
853 ◆cReQ1pJtI. :04/09/24 22:03:06
デリゲート渡してどうにか出来ないかと思うんだかどうですか?
883 :
853 ◆cReQ1pJtI. :04/09/24 22:06:31
>>882 OKボタンを押しても反映するだけで閉じない仕様なら、
そういうこともしたくなるね。
884 :
デフォルトの名無しさん :04/09/24 22:24:24
hello world
だからイベント...
>> 861 のコードがたたかれてますが,外部に公開したい部分を プロパティとして出しているので,特にたたかれるような内容では ないと思うのですが,このコードのどこが糞で,どうするべきなのか まじめにわからないので,どなたかマジレス願えませんか? あー,釣りじゃなくてマジなので,本当によろしく.
何故句読点がカンマとピリオドなのかそっちのほうがまじめにわからない
>外部に公開したい部分を プロパティとして出しているので, >特にたたかれるような内容では ないと思うのですが おまえは、コードと言えばその一点しか見ないのか・・・ もうね、アボガドだな。
>886 きたないだけで、>877と本質は何も変わりません.
>>886 一人が言ってるだけなのでいちいち相手にすることは無い。
>> 887 他所で勉強してきてください. >> 888 すまん.本当にわからんのだが,「何が」そんなに「汚い」? みんなが叩いている「汚い」の基準がわからんのです.
ひさしぶりにきたら、いつからこんな煽りばっかりのスレになったんだ 昔はもっと上品だったはずだけどな C#の将来と自分の人生の将来をフィードバックしてるせいなのか
>> 895 俺が厨房なのはそうかもしらんが,頼むから教えてください.
>>886 本質がどうあれ、日本語は「、」と「。」で記述する言語だからです。
>>896 ダイアログならあんなもんでいいんじゃないの?
ちゃんとプロパティにしてあるから、仕様と実装の分離もできてるし。
>>878 にあるようにユーティリティ関数化するのも手だけど、その場合漏れなら
Form2.GetForm2Text()って感じじゃなくて、UI.Dialogs.AskText() とかそんな感じに
form とは別のユーティリティクラスに入れるけど。
お前らどうしたらいいのか書けよ。 あの機能のフォームなんてあんなもんだろ? まずいところを具体的に上げろ。 念のため、Form2って名前とか言うなよ… ってかそこまでたたかれてる理由がマジで分からん。
いや、釣られたのかも…
903 :
853 ◆cReQ1pJtI. :04/09/25 08:39:09
>>898 >
>>878 にあるようにユーティリティ関数化するのも手だけど、その場合漏れなら
> Form2.GetForm2Text()って感じじゃなくて、UI.Dialogs.AskText() とかそんな感じに
> form とは別のユーティリティクラスに入れるけど。
ダイアログを別のプロジェクトに持って行くときに1ファイルだけで済むとラクなので。
共通ソース群をまとめて持って行っちゃうならこれもメリットあるね。
904 :
デフォルトの名無しさん :04/09/25 10:21:49
結局どう汚いのかを誰も書けないという・・・悲惨なレベルですね、ここ ;-)
905 :
853 ◆cReQ1pJtI. :04/09/25 10:41:51
自分は汚いとは思わないけど、想像するに Form2を提供する側としては、利用者になるべく少ない 思考(コード量)で済むように設計するのが望ましい っていう程度の話じゃないかな。 それにあの妙な数の煽りは1人でやってんでしょ?
>>861 おれが簡単に説明してやろう
↑のようなことするぐらいなら、てっとり早いのが、TextBox自体をpublicにすればいいんだよ
ああ、それともう1つあったな このコードだと using(Form2 f2 = new Form2){ この部分が実行できない。 Form2ってなんですか?って警告されるぞ Form2のインスタンス生成する場合はクラスの先頭で宣言しないとな そんなことも知らないとはなさけない
>906 それはちょっと... まぁどこまでやっつけするかなんだけれど、自分なら Form1はForm2がダイアログであること、成功したときにファイルネームがセットされるとするなら class Form2{ string GetFileName(); string SetFileName(); }; として>861みたいにTextBoxの存在を意識させない。そんなことはForm1はしらないでいい。 >877はダイアログの処理までForm2内に隠蔽されてしまってるので、使う側でコントロールできずつかいずらい時がでると思われるからやらない とまじれすしてみる
>Form2のインスタンス生成する場合はクラスの先頭で宣言しないとな C++とC#の仕様を混同しているお馬鹿がいますよ。
>910 無駄なかみつきしか出来ないのか。(゚听)イラネ
>>911 煽りしかできないプログラム初心者かよ(爆
なんつかおまえら民度低いな
おまえもなー
915 :
デフォルトの名無しさん :04/09/25 11:58:46
Labelのtextの数値を-1してそのラベルに表示するにはどうしたらいいですか?
919 :
デフォルトの名無しさん :04/09/25 12:15:39
>>918 そうじゃなくて、ラベルtextの数値-1をそのラベルtextに設定しなおしたいのですが^^;
(1) Labelのtextの数値をとりだす (2) (1)でもとめた数値を-1する (3) (2)でもとめた値をLabelのtextに代入する
>>919 this.label1.text="-1"
>>921 string s=label1.text;
s="-1";
label1.text=s;
楽しいのかおまえら?
int a=Convert.Int32(label1.text)-1; label1.text=a.ToString();
926 :
デフォルトの名無しさん :04/09/25 12:30:18
できました IntelliSenseがきかないからできないと思い込んでたorz どうもでした
>>921 if(label1.Text == "1")
label1.Text="0";
if(label1.Text == "2")
label1.Text="1";
if(label1.Text == "3")
label1.Text="2";
.
.
.
.
.
if(label1.Text == "69821")
label1.Text="69820";
924 在日外国人参政権反対 [sage] 04/09/25(土) 12:26:52 楽しいのかおまえら?
>IntelliSenseがきかないからできないと思い込んでたorz ??
>928 楽しいのか?
931 :
デフォルトの名無しさん :04/09/25 13:22:57
System.Windows.Forms.TextBoxのAppendText()メソッドだと、なぜか32767文字(Unicodeで64KB)までしか文字を追加できないのは仕様でしょうか? Textプロパティに+=で追加なら何文字でも追加できるんですが… で、System.Windows.Forms.RichTextBoxを使えば制限はないので、RichTextBoxで行こうと思ったんですが、 RichTextBoxのスクロールマウスでのスクロールが異常に重いのですが、なにか原因・解決策はないでしょうか?
>>925 行数がもったいない。
label1.text=(Convert.Int32(label1.text)-1).ToString();
>>933 それだとコンパイルできないな(プゲラ
>>932 TextBoxクラスのAppendTextメソッドではできなくて、Textプロパティに64KB以上のstringを代入するのでは可能な理由が分からなかったです。
もう少しヒントください、お願いします。
(Convert.ToInt32(text)-1).ToString(); ~~
>>936 appendは一行だから
なんでそkまでappendにこだわるの?
stringでいいじゃん
>>938 ストリームから受け取り次第、テキストボックスに表示したいです。
なので、textBox1.Text += で行うと、スクロールしてくれないので、Appendにこだわっています。
一回でAppendで追加するのではなく、何文字かずつAppendで追加しようとしています。
for(int i=0; i<15000; i++) textBox1.AppendText("a\r\n");
これをやっても、64KB以上は追加されません。
for(int i=0; i<15000; i++) textBox1.Text += "a\r\n";
だとうまくいきます。
>>939 TextBoxのベースであるWindowsのエディットコントロールの制限。
AppendTextはセレクション関係もいじってて、
そのときに0x7FFFより大きい文字数を取得できないメッセージを使ってる。
スクロールなら足した後ScrollToCaret()使うとよろし。
\r\nもどうかと思う
>>939 ストリームからってんならこうすりゃいいじゃん
StreamReader sr=new StreamReader("test.txt");
textBox1.Text=sr.ReadLine();
>>943 もまいのスレ立てが一番ペース早いわw
ま、乙。
945 :
デフォルトの名無しさん :04/09/26 04:10:41
近々死滅する言語でなに必死になってんの?w
こっちもか
スレの残り埋めるネタとしてはありきたりすぎだな。
ここでソースコード晒してるときに if() { string s; } みたいに、ちゃんとIF内の文が空白で右にずらせないんだけど みんなどうやってやってるの? なにかソフト使ってるの?
全角 でも叩き込んでください。
つか半角スペースを に置換すれ。
テスト テスト
>>954 2chのスクリプトではタブ文字は削除される
0chだとタブ文字をそのまま入力できるけど
HTMLのタブ文字は半角スペースと等価
要するにタブはインデント量分の に置換するって事だな?
を並べておけばOK。 面倒くさければ全角スペースに置換すれば良い。 ちなみにかちゅ〜しゃのレスポップアップだと を置換してくれないので全角のほうが好きだったり
かちゅだとポップアップでは って表示されるってこと?
テスト
テスト
ほうほう
Jane最高
ちなみに、C++だと参照で®reg...みたいな名前を使いたいかもしれんが、 HTMLで®というのが®に変換されることもあるので、 出来るなら、半角の&を&に置換するとなお良し
てすと dd
nbspって何の略なの? いや、spはなんとなく分かるんだけどさ。
& だと改行が起きないから none-break かな?
ミスった(´・ω・`)ショボーン
950以降の方がためになるスレはここですか?
>>970 残念ながら、ちがう。
当たり前のことばかり書いてる厨房ばっかで、なんの役にも立たんスレだ。
>>971 それは949以前にも当てはまることでは
HTML化待ちの過去スレって、やっぱ●買わないと読めないの?
Unvisual Studioだ。
ここは上級2ちゃんねらの集うスレでつね
●販売以前ならかちゅで読めたのになあ。 まぁ俺は●もち廃人なので関係ありませんが
VC#2005はいつ発売なん?
20005年じゃないの?もうすぐじゃん
あと18000年くらいか? もうすぐだな。
一昨日出たよ
このスレは950超えると居心地がいい
ム板は全部それだな
まったりまったり
1000! にはまだ早いな。
1000の階乗か
ここって本スレだよね? 2001出た当初は結構レスあったのに みんなどこいったの? JAVA?DEL?結局どの言語がいいのさ?
埋め
埋め
埋め
埋め ↓↓後は任せた
995 :
デフォルトの名無しさん :04/09/29 07:27:47
じゃあ上げてみる
C# はゴミ それもがなり
よし埋め
埋め
1000
1001 :
1001 :
Over 1000 Thread このスレッドは1000を超えました。 もう書けないので、新しいスレッドを立ててくださいです。。。