VC♯.NET統合スレッド

このエントリーをはてなブックマークに追加
902sage:2005/06/23(木) 10:53:22
InternetExplorerを操作したいのですが。。。
あるURLを1分おきにリロードして、ある文字列がHTMLの中にあった場合
メッセージボックスを出すというような小物アプリを作りたいのですが
どしたらよかですか?
903デフォルトの名無しさん:2005/06/23(木) 11:04:50
IE を使いたいなら System.Windows.Forms.WebBrowser でもつかってろよ
文字列の検索だけをしたいのなら WebClient の方が楽かもしれんが
904デフォルトの名無しさん:2005/06/23(木) 11:54:40
要件を見ただけだとIEである必然性がどこにも感じられんな。
905902:2005/06/23(木) 13:34:27
そうですね、説明不足でした。
文字列がマッチしたらメッセージボックスを出すと同時に
そのWebページを表示しているIEを前面に出すということもしたいです。
906デフォルトの名無しさん:2005/06/23(木) 13:41:34
ie automation c# あたりで
907898:2005/06/23(木) 14:31:14
>900
ありがと!
908デフォルトの名無しさん:2005/06/23(木) 15:42:52
スクリプト無効にされてるとアウトだと思うが
妙にそういう事に拘る厨房が多いし
909デフォルトの名無しさん:2005/06/23(木) 15:54:35
はじめに断っておけばいいじゃん
910デフォルトの名無しさん:2005/06/23(木) 16:01:22
別にオートメーションとスクリプトは関係ないが。

一番簡単なのは、WebClientでデータ受け取ってチェックしてヒットしたらIEを起動させる。
911デフォルトの名無しさん:2005/06/23(木) 22:26:19
MSDNのリファレンスってこのオブジェクトはこれこれこうするためのものですって文章が抜けている気がする。
いきなりプロパティ語りだされてもわけわかんねーよ。
っていうのはここでいいのですか?
912デフォルトの名無しさん:2005/06/23(木) 22:32:55
クラス名とメンバ名みりゃ分かるだろ
913デフォルトの名無しさん:2005/06/23(木) 22:37:48
ていうか普通に書いてあると思うんだが。
例えばUriクラス、

>URI (Uniform Resource Identifier) のオブジェクト表現を可能にし、URI の一部へ簡単にアクセスできるようにします。

>URI は、アプリケーションが使用できるインターネット上のリソースを簡潔に表す記述方式です。
>Uri クラスは、URI の解析、比較、結合などの URI 処理のためのプロパティとメソッドを定義します。
>Uri クラスのプロパティは読み取り専用です。 Uri インスタンスを変更するには、 UriBuilder クラスを使用します。
>Uri クラスは、"ttp://www.contoso.com/index.htm" などの絶対 URI だけを格納します。
>"/new/index.htm" などの相対 URI は、ベース URI を基準にして展開し、絶対 URI に変換する必要があります。
>MakeRelative メソッドは、必要に応じて絶対 URI を相対 URI に変換するメソッドです。
(以下略)

なにか足りない?
914デフォルトの名無しさん:2005/06/23(木) 22:42:26
なんかすごくいい例をだしてない?
俺が今日会社で見たのはまさしくプロパティの説明から始まっていた。
ちなみにVS.NET2003付属の日本語版ね。
915デフォルトの名無しさん:2005/06/23(木) 22:44:07
何を見たんだよ!
916デフォルトの名無しさん:2005/06/23(木) 23:00:07
>>902
SHDocVW.ShellWindowsをforeachで
917902:2005/06/24(金) 15:05:20
>>916
どうやったらいいんでうか。。。?わかりまぜん。
918デフォルトの名無しさん:2005/06/24(金) 15:07:53
分からないなら素直に910にしとけ。
919902:2005/06/24(金) 15:08:47
VBScriptでは
Set Shell=Wscript.CreateObject("Shell.Application")
Set ws=Shell.Windows
For Each obj In ws
でできたのですが。
920902:2005/06/24(金) 15:21:48
わかりました。WebClientというのを使ってみます。
921デフォルトの名無しさん:2005/06/25(土) 00:23:37
Sendkeysでシステムに直接キー入力を渡せるようですが、
逆にフォームがアクティブじゃない時でもキー入力を受け取る方法は無いですか?
教えていただきたいです。
922デフォルトの名無しさん:2005/06/25(土) 00:29:37
グローバルフック。
.NETではできないはずなんだがWH_KEYBOARD_LL/WH_MOUSE_LLは何故か有効だと聞いたことがある。

あとはホットキー。
923デフォルトの名無しさん:2005/06/25(土) 01:47:17
IKeJIさんがここに出没していましたか。多分知り合い。俺も最近C#を。
924デフォルトの名無しさん:2005/06/25(土) 16:30:29
五月蠅い
925デフォルトの名無しさん:2005/06/26(日) 01:29:08
ノートン インターネットセキュリティ2005を使っています
devenv.exeというスクリプトが検出されるのですがこれは認証しても問題ないのでしょうか?
926デフォルトの名無しさん:2005/06/26(日) 01:32:09
普通にVSの実行ファイルじゃねぇか。
927デフォルトの名無しさん:2005/06/26(日) 23:37:10
やはり.NET上で実行されるだけに起動時、ウィンドウやボタンなんかの生成が
チラついたりもっさりしてるね。
928デフォルトの名無しさん:2005/06/27(月) 11:26:28
>>927
CPUをもっと速いのに替えろ。
メモリを増やせ。デュアルチャンネル化しろ。
929デフォルトの名無しさん:2005/06/27(月) 12:01:40
>>927
生成でチラつくなんて、いったいどんなマシン使ってるんだ?
930デフォルトの名無しさん:2005/06/27(月) 13:45:17
>>927
まさか、Celeron 450MHz + 256MBなんて言わないだろうな?
931デフォルトの名無しさん:2005/06/28(火) 11:31:32
家のクライアントアプリは画面遷移に5秒かかりますがなにか?
932デフォルトの名無しさん:2005/06/28(火) 12:25:02
そんな糞マシンでCLR言語を使おうって気持ちがおこがましい。
逝ってヨシ!
933デフォルトの名無しさん:2005/06/28(火) 14:46:15
メイン以外のFormインスタンスの生成だけは初めのApplication.Idleでやってそれを使い回すようにしてる。
934デフォルトの名無しさん:2005/06/30(木) 12:29:54
>>931
それはおまいのプログラムの仕様だろw

>>927はウィンドウやボタンなんかの生成だけでチラつくんだぞw
935デフォルトの名無しさん:2005/06/30(木) 12:55:29
>>927
SuspendLayout使えばマシになるんじゃね?
936デフォルトの名無しさん:2005/07/01(金) 15:06:08
C#.NETでmp3再生させようと思い、mciSendStringを使ってコーディングしてみたのですが
以下のエラーが出て先へ進めなくて困ってます。

引数 '4' : '<null>' から 'System.IntPtr' に変換できません。
'mp3_4.Form1.mciSendString(string, string, uint, System.IntPtr)' に最も適しているオーバーロード メソッドには無効な引数がいくつか含まれています。

次のすれにコードを貼り付けるので、助言いただけるとうれしいです。
937936:2005/07/01(金) 15:08:02
[DllImport("winmm.dll", EntryPoint = "PlaySound")]

static extern System.IntPtr mciSendString(
string lpszCommand,
string lpszReturnString,
uint cchReturn,
System.IntPtr hwndCallback
);

private void button1_Click(object sender, System.EventArgs e)
{
mciSendString("open \"C:\\madonna.mp3\" type mpegvideo alias MP3", null, 0, null);//この行にエラーが出ます。
    mciSendString("play MP3 notyfy", null, 0, null);//この行にもエラーが出ます
}
938デフォルトの名無しさん:2005/07/01(金) 15:22:42
IntPtrは構造体だから。
int a = null;
とおなじぐらいおかしい。
NULLポインタを指すのはIntPtr.Zero。
939デフォルトの名無しさん:2005/07/01(金) 15:22:59
System.IntPtr hwndCallback

String hwndCallback

mciSendString("open \"C:\\madonna.mp3\" type mpegvideo alias MP3", null, 0, null);

mciSendString("open C://madonna.mp3 type mpegvideo alias MP3", null, 0, null);

に変えてみたところ、ビルドは成功したのですが、ボタンを押してもmp3ファイルの音が鳴らないのですが
何か考えられる原因があれば教えていただけるとうれしいです。
940デフォルトの名無しさん:2005/07/01(金) 15:30:47
もう@stringにしてよ〜見にくくて仕方ない。
941936:2005/07/01(金) 15:38:14
>>938 アドバイスありがとうございます。

IntPtr.Zero hwndCallback

これでビルドしてみたのですが、
型、または名前空間名 'Zero' は、クラスまたは名前空間 'System.IntPtr' に存在しません。アセンブリ参照があるか確認してください。
と出力されます。

名前空間は
using System;
using System.Runtime.InteropServices;
これらを指定してるので、問題ないと思うのですが。

>>940
アドバイスありがとうございます。
下の@string hwndCallbackの前に全角入れて右に寄るようでしたら入れて体裁整えます。

 @string hwndCallback

でビルドすると通るのですが、音が鳴りません。なんででしょうか。
942デフォルトの名無しさん:2005/07/01(金) 15:45:01
>>941
>  IntPtr.Zero hwndCallback  

あのな……。
IntPtrは型。
ZeroはIntPtr型の静的フィールド。
メソッドの宣言で値まで書いてどうする。
public void Does(Int32.MaxValue value);
なんて書かないだろう?

で、
> 音が鳴りません。なんででしょうか。

そりゃデバイス開いただけで開始しろいうコマンドを送ってないもの。
943デフォルトの名無しさん:2005/07/01(金) 15:50:16
あと

[DllImport("winmm.dll", EntryPoint = "PlaySound")]

なんだこれ。PlaySound関数を呼んでどうする。
呼びたいのはmciSendStringだろ。
944936:2005/07/01(金) 15:57:05
>>942
アドバイスありがとうございます。

>そりゃデバイス開いただけで開始しろいうコマンドを送ってないもの。
mciSendString("play MP3 notyfy", null, 0, null);
これが再生させる命令だと思うのですが、違うのでしょうか(T T)

>ZeroはIntPtr型の静的フィールド。メソッドの宣言で値まで書いてどうする。
とりあえず、IntPtr mciSendStringに変えときました(T T)

>なんだこれ。PlaySound関数を呼んでどうする。
[DllImport("winmm.dll", EntryPoint = "mciSendString")]
ご指摘どおり上のように変えました。

しかし、音が鳴りません。また、いろいろいじってみます。
945デフォルトの名無しさん:2005/07/01(金) 15:58:12
[DllImport("winmm.dll", EntryPoint="mciSendString")]
extern static System.Int32 mciSendStringA(
string lpstrCommand, string lpstrReturnString,
int uReturnLength, int hwndCallback);
946デフォルトの名無しさん:2005/07/01(金) 16:00:56
947デフォルトの名無しさん:2005/07/01(金) 16:02:52
DataGridのヘッダセルとセル内で改行ってできますか?

普通に"HELLO\r\nWORLD"では出来ませんでした。

Windowsアプリケーションです。
948936:2005/07/01(金) 16:13:26
>>945
アドバイスありがとうございます。
コードをそのまま張り替えてビルドしてみたのですが、>>936と同じエラーが表示されてしまいました。
とにかく、hwndCallbackの前の引数をstringにしないことにはビルドが通らないといった状態です。

>>946
ありがとうございます。印刷してよく読んでみようと思います。
949936:2005/07/01(金) 16:13:50
>>945
アドバイスありがとうございます。
コードをそのまま張り替えてビルドしてみたのですが、>>936と同じエラーが表示されてしまいました。
とにかく、hwndCallbackの前の引数をstringにしないことにはビルドが通らないといった状態です。

>>946
ありがとうございます。印刷してよく読んでみようと思います。
950936:2005/07/01(金) 16:14:42
>>945
アドバイスありがとうございます。
コードをそのまま張り替えてビルドしてみたのですが、>>936と同じエラーが表示されてしまいました。
とにかく、hwndCallbackの前の引数をstringにしないことにはビルドが通らないといった状態です。

>>946
ありがとうございます。印刷してよく読んでみようと思います。
951936:2005/07/01(金) 16:17:01
>>945
アドバイスありがとうございます。
コードをそのまま張り替えてビルドしてみたのですが、>>936と同じエラーが表示されてしまいました。
とにかく、hwndCallbackの前の引数をstringにしないことにはビルドが通らないといった状態です。

>>946
ありがとうございます。印刷してよく読んでみようと思います。
952デフォルトの名無しさん:2005/07/01(金) 16:17:11
[DllImport("winmm.dll", EntryPoint="mciSendString")]
public extern static System.Int32 mciSendStringA(
string lpstrCommand, string lpstrReturnString,
int uReturnLength, int hwndCallback);
private void button2_Click(object sender, System.EventArgs e)
{
string FileName =
@"C:\madonna.mp3";
mciSendStringA("open \""+FileName+"\"", null, 0, 0);
mciSendStringA("Play \""+FileName+"\"", null, 0, 0);

VCL.Netならuses MMSystem;でおわる。 いちいち 定義をインポートする必要なし。
Delphi2006 C++ つくので のりかえ検討しましょう。
ちゃんちゃん
953デフォルトの名無しさん:2005/07/01(金) 16:18:18
[DllImport("winmm.dll", EntryPoint="mciSendString")]
public extern static System.Int32 mciSendStringA(
string lpstrCommand, string lpstrReturnString,
int uReturnLength, int hwndCallback);
private void button2_Click(object sender, System.EventArgs e)
{
string FileName =
@"C:\madonna.mp3";
mciSendStringA("open \""+FileName+"\"", null, 0, 0);
mciSendStringA("Play \""+FileName+"\"", null, 0, 0);

VCL.Netならuses MMSystem;でおわる。 いちいち 定義をインポートする必要なし。
Delphi2006 C++ つくので のりかえ検討しましょう。
ちゃんちゃん
954デフォルトの名無しさん:2005/07/01(金) 16:19:22
[DllImport("winmm.dll", EntryPoint="mciSendString")]
public extern static System.Int32 mciSendStringA(
string lpstrCommand, string lpstrReturnString,
int uReturnLength, int hwndCallback);
private void button2_Click(object sender, System.EventArgs e)
{
string FileName =
@"C:\madonna.mp3";
mciSendStringA("open \""+FileName+"\"", null, 0, 0);
mciSendStringA("Play \""+FileName+"\"", null, 0, 0);

VCL.Netならuses MMSystem;でおわる。 いちいち 定義をインポートする必要なし。
Delphi2006 C++ つくので のりかえ検討しましょう。
ちゃんちゃん
955936:2005/07/01(金) 16:28:29
>>952
再生されましたヾ(*´∀`*)ノありがとうございます。
よーく見て勉強しようと思います。
DelphiやC++も検討しようかと思います。ありがとう。
956デフォルトの名無しさん:2005/07/01(金) 19:18:42
>>955

文字列を代入させるには、stringではできないようです。

ごめんなさい。 間違っていました。
string lpstrReturnString

System.Text.StringBuilder lpstrReturnString
に変更してください。

型は
ttp://www.atmarkit.co.jp/fdotnet/dotnettips/024w32api/w32api.html
ttp://www.atmarkit.co.jp/fdotnet/dotnettips/025w32string/w32string.html
を参考にしてください。

コードはこんな感じになります
957デフォルトの名無しさん:2005/07/01(金) 19:19:02
mciSendText(コマンド);でうごきます。
mciSendTextの名前は好きな名前に変えてください。
stausの時は、戻り値に入ります。
こんな感じです。
textBox1.Text = ciSendText("Status \""+FileName+"\" mode");


訂正のコード載せておきます。

// using System.Text; // を追加します。
//
[DllImport("winmm.dll", EntryPoint="mciSendString")]
public extern static System.Int32 mciSendStringA(
string lpstrCommand,
System.Text.StringBuilder lpstrReturnString,
int uReturnLength, int hwndCallback);

public string mciSendText(string lpstrCommand)
{
StringBuilder buf = new StringBuilder(500); // サイズは適当に決めて下さい
mciSendStringA(lpstrCommand, buf ,buf.Capacity ,0);
return buf.ToString();
}
958デフォルトの名無しさん:2005/07/01(金) 19:24:42
ハンドルにintを使うなと言うに。
EntryPointと定義する関数名が逆。
その.NETらしからぬネーミングどうにかなんない?
959デフォルトの名無しさん:2005/07/01(金) 19:35:33
>>955
それから
[DllImport("winmm.dll", EntryPoint="mciSendString")]

[DllImport("winmm.dll")]
にしてください。
960デフォルトの名無しさん:2005/07/01(金) 19:40:17
>>958
型変換されるから関係ない
961936:2005/07/02(土) 21:53:26
>>956-960
たくさんのアドバイスありがとうございます。
皆さんのアドバイスを参考にいろいろいじって勉強しようと思います。
今まではC++を使おうかと思ったのですが、MFCやらC++.NETやらAPIやらややこしそうだったので
C#に決めたのですが、今度は型の変換がややこしいということですね。
その辺も、アプリを作りながら考えようかと思います。
どうもありがとうございました。
962デフォルトの名無しさん:2005/07/03(日) 12:01:28
>>961
C# で Win32 API を扱う場合の参考サイト。
http://www.pinvoke.net/index.aspx
このページの情報と MSDN で大体間に合うと思う。
でも、普通にアプリ使う分にはあまりアンマネージドな部分に
触れる事はないのでは。
963936:2005/07/03(日) 20:25:44
>>962
とってもすてきなサイトをどうもありがとうございます。
すごく参考になりました。
Win32APIを使う際に、C#用に型変換しなくちゃいけないのは面倒だなと思っていたところなので
とっても助かります。
Win32API使う際にはぜひ活用しようと思います。
ありがとうございました。
964デフォルトの名無しさん:2005/07/04(月) 08:36:43
指定時刻に、メッセージボックスが表示されるようにしようと思うのですが

タイマーのコンポーネントを使って、1秒ごとに、アラーム時刻と現在時刻を比較して一致したら
メッセージボックスを表示という仕組みにしようかなと思いついたのですが

それだと、タイマーと現在時刻の同期がとれるのかという疑問がわいてきました。

C#でアラーム機能を盛り込むのに、もっとスマートな方法はないでしょうか。
タイマーのように、アラームのコンポーネントがあれば楽でいいのですが。
何か他にスマートな方法があれば助言いただけるとうれしいです。
965964:2005/07/04(月) 08:54:41
設定時刻を秒に変えて、タイマーにする方法を思いつきました。
とりあえずこの方法でやってみようと思います。
他にもっと簡単な方法があれば助言いただけるとうれしいです。
966964:2005/07/04(月) 09:23:00
やっぱり単純にタイマーで日付時刻を比較する方法にしようと思います。
簡単なコードで確認したところ、システム時計と、.NETのタイマーコンポーネントとは
ちゃんと同期がとれているようです。
どうもお騒がせしました。
967デフォルトの名無しさん:2005/07/04(月) 17:16:49
日付を選択できるDateTimePickerというコンポーネントがありますが
日付と時刻を選択できるコンポーネントってないでしょうか。
もしあれば教えてください。
なければテキストボックスとラベルの組み合わせを使うことにします、
968デフォルトの名無しさん:2005/07/04(月) 17:30:15
DateTimePicker
969967:2005/07/04(月) 17:58:59
>>968
回答ありがとうございます。
どこか設定をいじったらDateTimePickerに時刻が現れるのかと思っていろいろ
いじってみましたが見つかりませんでした。
日付と時刻を同時に設定できるようなコンポーネントがあったらうれしいのですが。
970デフォルトの名無しさん:2005/07/04(月) 19:23:25
日付しか扱えなかったらDate"Time"Pickerの名前に反するじゃないかw
FormatプロパティとCustomFormatプロパティを使う。
971デフォルトの名無しさん:2005/07/04(月) 19:28:26
DateTimePicker
972967:2005/07/04(月) 20:55:43
>>970-971
ご指摘のプロパティをいじったら時刻が表示されました。
どうもありがとう。CustomFormatプロパティとか調べていろいろいじってみようと
思います。
973デフォルトの名無しさん:2005/07/06(水) 16:51:11
DateTime構造体を初期化するにはどのように書けばいいのでしょうか。

参考書で自作クラスのフィールドの各メンバ変数を初期化するというところで躓いてます。
参考書では

using System;

public class AlarmData //自作のAlarmDataクラスです。
{
   private DateTime date;
   private string title;

   public AlarmData()
   {
      this.date = DateTime(0); //この部分でエラーが出ます。
      this.title = "";
   }
}


このように記述されていますが、これをビルドすると
   'System.DateTime' は 'クラス' を意味しますが、このコンテキストでは無効です。
と、出力されます

グーグルで「DateTime 初期化 C#」とか「DateTime(0) 初期化 C#」とか「DateTime構造体 初期化」とか
入れて調べてみましたが、DateTime構造体を0に初期化する方法はわかりませんでした。
こういう場合、どのように記述すればDateTime構造体が初期化されるのでしょうか。
974デフォルトの名無しさん:2005/07/06(水) 16:58:26
new
975デフォルトの名無しさん:2005/07/06(水) 17:00:33
DateTime.〜
976973:2005/07/06(水) 17:04:36
>>974
this.date = new DateTime();
と書いたらビルド成功しました。ありがとうございます。

this.date = DateTime.Parse("");
と書いてみたこともあったのですが、ビルド成功しますが。はたしてこれが初期化の記述であるのか自信がありませんでした。
ParseはstringをDateTimeに変換する関数ですが、これを使って初期化したことになるのかという疑問がわいてきたんです。

>>975
アドバイスありがとうございます。
DateTime構造体のなんらかのメソッドを使って初期化する方法もあるよということでしょうか。
だとすると、上でかいたParseを使った方法でも初期化したことになるのでしょうか。
977デフォルトの名無しさん:2005/07/06(水) 17:20:25
初期化というのが微妙な表現だ。
構造体は値型なんだから、値を持ってるということが事実。それがどんなものに因るにせよ。
978973:2005/07/06(水) 17:27:44
>>977
AlarmDataコンストラクタでフィールドを初期化するというところなので、初期化という表現を
使ったのですが、DateTime構造体の場合どう書けばいいのかと困ってしまいました。
とにかく、this.date = new DateTime(); でやってみようと思います。
これで何か問題があれば

>値を持ってるということが事実
ということろを参考に、何か適当に値を入れてやってみようと思います。
979デフォルトの名無しさん:2005/07/06(水) 18:02:42
>>976
> this.date = DateTime.Parse("");
これって成功するの?
例外吐くような気がするけど。
980973:2005/07/06(水) 18:59:49
>>979
ビルドは成功しました。
実行してアプリを動かしてみても例外をはいたりはしてません。
が、おそらくそのコードは間違ってるのでしょうね。
981979:2005/07/06(水) 19:04:47
http://www.microsoft.com/japan/msdn/library/default.asp?url=/japan/msdn/library/ja/cpref/html/frlrfsystemdatetimeclassparsetopic1.asp
のメソッドは、 s を完全に解析して、 FormatException がスローされるのを防ごうとします。このメソッドは、認識されないデータをできる限り無視し、
不足している月、日、および年の情報に現在の時刻を格納します


現在の時刻が格納されるってことかな。
なんにせよ、初期化の方法としてはかなり不適切なのでnew DateTime()を使うべし。
982973:2005/07/06(水) 19:14:19
>>981
情報ありがとうございます。
new使って今コード書いてます。たぶんこれでいけるような気がします。
どうもありがとう。
983デフォルトの名無しさん:2005/07/06(水) 21:45:28
プロパティグリッドの各プロパティ表示ON/OFFの切り替えって
属性を直接書き換えないとできないのですか?
動的にbrowsable属性を切り替える感じです。
元クラスを書き換えたり継承したりはできない状況なのです。
984デフォルトの名無しさん:2005/07/07(木) 13:38:58
トレイアイコンを状態によって切り替えるために以下のようなソースを作ってみましたが、
アイコンのリソースの設定をどうやったらいいか分かりません。
ヒントをいただけませんか?

System.Resources.ResourceManager resources = new System.Resources.ResourceManager(typeof(TrayControllerForm));
if(~)
{
  notifyIcon1.Icon = ((System.Drawing.Icon)(resources.GetObject("notifyIcon1.Icon1")));
}
else
{
  notifyIcon1.Icon = ((System.Drawing.Icon)(resources.GetObject("notifyIcon1.Icon2")));
}
985984:2005/07/07(木) 15:24:10
>984

自己レスです。
アイコンをEXEに埋め込む場合は、
RESXGEN.EXEでアイコンのイメージを.resx形式に変換して
埋め込むらしい。。。
986デフォルトの名無しさん:2005/07/07(木) 15:32:46
DateTimePicker
987898:2005/07/07(木) 16:02:12
印刷プロパティのフリーのクラスライブラリー無いの?
988Form1.cs:2005/07/08(金) 07:49:20
using System.Collections;

public class Form1 : System.Windows.Forms.Form
{
   private AlarmList report;

   public Form1()
   {
      this.report = new AlarmList();
   }

   private void button1_Click(object sender, System.EventArgs e)
   {
      string title = textBox1.Text;
      this.report.Add(title);
      UpdateListBox();
   }

   //リストボックスを更新するメソッド
   private void UpdateListBox()
   {
      ArrayList items = this.report.GetItems();
      IEnumerator it = items.GetEnumerator();
      listBox1.Items.Clear();

      while(it.MoveNext())
      {
         AlarmData item = (AlarmData)(it.Current);
         listBox1.Items.Add(item.ToString()); //.ToString()がないとListBoxに文字列が表示されない
      }
   }
}
989AlarmList.cs AlarmDataクラスを自作:2005/07/08(金) 07:50:15
namespace AddList
{
   using System;
   using System.Collections;

   public class AlarmData
   {
      private string title;

      public AlarmData()
      {
         this.title = "";
      }

      public AlarmData(string title)
      {
         this.title = title;
      }

      //リストボックスに表示する用に文字列を整えるメソッド
      public string ToString()
      {
         string moji;
         moji = String.Format("{0}", title);
        return moji;
      }
   }
990AlarmList.cs AlarmListクラスを自作:2005/07/08(金) 07:50:48
   public class AlarmList
   {
      private ArrayList items;

      public AlarmList()
      {
         this.items = new ArrayList();
      }

      public void Add(string title)
      {
         AlarmData item = new AlarmData(title);
         this.items.Add(item);
      }

      public void Add(AlarmData item)
      {
         this.items.Add(item);
      }

      public ArrayList GetItems()
      {
         return this.items;
      }
   }
}
991988:2005/07/08(金) 07:55:22
>>988
listBox1.Items.Add(item.ToString()); の部分を
listBox1.Items.Add(item);
にして、リストボックスにテキストボックスに入力した文字列を表示させたいのですが

listBox1.Items.Add(item); と書くとリストボックスに
AlarmList.AlarmData
と表示されてしまいます。

listBox1.Items.Add(item); と書いてリストボックスに文字列を表示させるにはどうすれば
いいのかで悩んでます。
同じコードを前にC++で書いたことがあるのですが、そのときはlistBox1.Items.Add(item);
と書いてもちゃんと文字列が表示されました。
なのでC#のなんらかの原因があるのかと思うのですが、何か助言いただけるとうれしいです。
992988:2005/07/08(金) 08:04:04
なんで listBox1.Items.Add(item); にしたいかというと

後々、リストボックスから一行を削除するのに
this.report.Remove(item);
と書いて、削除しようとするとアプリが固まってしまうからです。

listBox1.Items.Add(item) にすると固まらずに一行を削除可能なのですが
そうすると今度は、リストボックスに表示されるはずの文字列の代わりにAlarmList.AlarmData
という文字列が表示されてしまうので困ってます。
993デフォルトの名無しさん:2005/07/08(金) 08:16:45
このコード、コンパイル時に警告が出ているはずだが。
994988:2005/07/08(金) 08:21:10
>>993
こちらでは、ちゃんとビルド成功しますし、アプリの実行もできてるのですが。
投稿するために極力けずりましたが、けずったものでもちゃんとビルド成功してますけどなんでだろう。
995デフォルトの名無しさん:2005/07/08(金) 08:26:11
警告とエラーは別物なんだが
996988:2005/07/08(金) 08:33:30
>>995
アドバイスありがとうございます。
出力ウィンドウをよく見てみたら

ビルドの完了 -- エラー 0、警告 1

とありました。

'AddList.AlarmData.ToString()' は継承されたメンバ 'object.ToString() を隠します。
現在のメンバでそのインプリメンテーションをオーバーライドするには、override キーワードを追加してください。
オーバーライドしない場合は、new キーワードを追加してください。

と出ます。

しかし、listBox1.Items.Add(item.ToString()); とToStringをつけると警告が消えます。
ここに何かヒントがあるのでしょうか。
ちょっとAlarmData.ToString()をいじってみようかと思います。
997988:2005/07/08(金) 08:38:25
>>995
解決しました。

public override string ToString()
{
}

にしたところ、 listBox1.Items.Add(item) でちゃんと文字列が表示されました。
どうもありがとうございました。大変たすかりました。
998デフォルトの名無しさん:2005/07/08(金) 08:41:13
結局問題の本質は理解しないというかしようとしないんだろうな……。
999988:2005/07/08(金) 08:49:49
>>998
'AddList.AlarmData.ToString()' は継承されたメンバ 'object.ToString() を隠します。
現在のメンバでそのインプリメンテーションをオーバーライドするには、override キーワードを追加してください。
オーバーライドしない場合は、new キーワードを追加してください。

の意味が残念ながらわかりません。
ご指摘のとおり、なんか知らないけどoverrideつけたら解決したよという段階にすぎません。
プログラミングの習得にかなりの時間使っちゃったので、今はもうとにかく動くものを作ろうという決意のもとやってます。
結局、ご指摘の問題の本質は理解できてませんが、時間があいたらその件はじっくり考えようと思います。

今、自分なりに考えた解釈は
クラスの設計時に、ToStringというメソッドを作ると、オブジェクトをToStringの返す文字列に整形してくれるんだけど
それにはoverrideって書かないとやってあげないよっていう意味かなとしか解釈できません。
1000デフォルトの名無しさん:2005/07/08(金) 09:16:54
スレの流れからして以降は本スレ&初心者スレに合流、でいいよね?

C♯相談室 Part24
http://pc8.2ch.net/test/read.cgi/tech/1117631000/

ふらっとC♯(Part5)
http://pc8.2ch.net/test/read.cgi/tech/1065196964/
10011001
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。