VC♯.NET統合スレッド

このエントリーをはてなブックマークに追加
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を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。