VC♯.NET統合スレッド
レス数が1000を超えています。これ以上書き込みはできません。
0001デフォルトの名無しさん
NGNGVB、JAVA厨は要りませんのでご了承
0951936
2005/07/01(金) 16:17:01アドバイスありがとうございます。
コードをそのまま張り替えてビルドしてみたのですが、>>936と同じエラーが表示されてしまいました。
とにかく、hwndCallbackの前の引数をstringにしないことにはビルドが通らないといった状態です。
>>946
ありがとうございます。印刷してよく読んでみようと思います。
0952デフォルトの名無しさん
2005/07/01(金) 16:17:11public 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++ つくので のりかえ検討しましょう。
ちゃんちゃん
0953デフォルトの名無しさん
2005/07/01(金) 16:18:18public 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++ つくので のりかえ検討しましょう。
ちゃんちゃん
0954デフォルトの名無しさん
2005/07/01(金) 16:19:22public 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++ つくので のりかえ検討しましょう。
ちゃんちゃん
0955936
2005/07/01(金) 16:28:29再生されましたヾ(*´∀`*)ノありがとうございます。
よーく見て勉強しようと思います。
DelphiやC++も検討しようかと思います。ありがとう。
0956デフォルトの名無しさん
2005/07/01(金) 19:18:42文字列を代入させるには、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
を参考にしてください。
コードはこんな感じになります
↓
0957デフォルトの名無しさん
2005/07/01(金) 19:19:02mciSendTextの名前は好きな名前に変えてください。
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();
}
0958デフォルトの名無しさん
2005/07/01(金) 19:24:42EntryPointと定義する関数名が逆。
その.NETらしからぬネーミングどうにかなんない?
0959デフォルトの名無しさん
2005/07/01(金) 19:35:33それから
[DllImport("winmm.dll", EntryPoint="mciSendString")]
を
[DllImport("winmm.dll")]
にしてください。
0960デフォルトの名無しさん
2005/07/01(金) 19:40:17型変換されるから関係ない
0961936
2005/07/02(土) 21:53:26たくさんのアドバイスありがとうございます。
皆さんのアドバイスを参考にいろいろいじって勉強しようと思います。
今まではC++を使おうかと思ったのですが、MFCやらC++.NETやらAPIやらややこしそうだったので
C#に決めたのですが、今度は型の変換がややこしいということですね。
その辺も、アプリを作りながら考えようかと思います。
どうもありがとうございました。
0962デフォルトの名無しさん
2005/07/03(日) 12:01:28C# で Win32 API を扱う場合の参考サイト。
http://www.pinvoke.net/index.aspx
このページの情報と MSDN で大体間に合うと思う。
でも、普通にアプリ使う分にはあまりアンマネージドな部分に
触れる事はないのでは。
0963936
2005/07/03(日) 20:25:44とってもすてきなサイトをどうもありがとうございます。
すごく参考になりました。
Win32APIを使う際に、C#用に型変換しなくちゃいけないのは面倒だなと思っていたところなので
とっても助かります。
Win32API使う際にはぜひ活用しようと思います。
ありがとうございました。
0964デフォルトの名無しさん
2005/07/04(月) 08:36:43タイマーのコンポーネントを使って、1秒ごとに、アラーム時刻と現在時刻を比較して一致したら
メッセージボックスを表示という仕組みにしようかなと思いついたのですが
それだと、タイマーと現在時刻の同期がとれるのかという疑問がわいてきました。
C#でアラーム機能を盛り込むのに、もっとスマートな方法はないでしょうか。
タイマーのように、アラームのコンポーネントがあれば楽でいいのですが。
何か他にスマートな方法があれば助言いただけるとうれしいです。
0965964
2005/07/04(月) 08:54:41とりあえずこの方法でやってみようと思います。
他にもっと簡単な方法があれば助言いただけるとうれしいです。
0966964
2005/07/04(月) 09:23:00簡単なコードで確認したところ、システム時計と、.NETのタイマーコンポーネントとは
ちゃんと同期がとれているようです。
どうもお騒がせしました。
0967デフォルトの名無しさん
2005/07/04(月) 17:16:49日付と時刻を選択できるコンポーネントってないでしょうか。
もしあれば教えてください。
なければテキストボックスとラベルの組み合わせを使うことにします、
0968デフォルトの名無しさん
2005/07/04(月) 17:30:150969967
2005/07/04(月) 17:58:59回答ありがとうございます。
どこか設定をいじったらDateTimePickerに時刻が現れるのかと思っていろいろ
いじってみましたが見つかりませんでした。
日付と時刻を同時に設定できるようなコンポーネントがあったらうれしいのですが。
0970デフォルトの名無しさん
2005/07/04(月) 19:23:25FormatプロパティとCustomFormatプロパティを使う。
0971デフォルトの名無しさん
2005/07/04(月) 19:28:260972967
2005/07/04(月) 20:55:43ご指摘のプロパティをいじったら時刻が表示されました。
どうもありがとう。CustomFormatプロパティとか調べていろいろいじってみようと
思います。
0973デフォルトの名無しさん
2005/07/06(水) 16:51:11参考書で自作クラスのフィールドの各メンバ変数を初期化するというところで躓いてます。
参考書では
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構造体が初期化されるのでしょうか。
0974デフォルトの名無しさん
2005/07/06(水) 16:58:260975デフォルトの名無しさん
2005/07/06(水) 17:00:330976973
2005/07/06(水) 17:04:36this.date = new DateTime();
と書いたらビルド成功しました。ありがとうございます。
this.date = DateTime.Parse("");
と書いてみたこともあったのですが、ビルド成功しますが。はたしてこれが初期化の記述であるのか自信がありませんでした。
ParseはstringをDateTimeに変換する関数ですが、これを使って初期化したことになるのかという疑問がわいてきたんです。
>>975
アドバイスありがとうございます。
DateTime構造体のなんらかのメソッドを使って初期化する方法もあるよということでしょうか。
だとすると、上でかいたParseを使った方法でも初期化したことになるのでしょうか。
0977デフォルトの名無しさん
2005/07/06(水) 17:20:25構造体は値型なんだから、値を持ってるということが事実。それがどんなものに因るにせよ。
0978973
2005/07/06(水) 17:27:44AlarmDataコンストラクタでフィールドを初期化するというところなので、初期化という表現を
使ったのですが、DateTime構造体の場合どう書けばいいのかと困ってしまいました。
とにかく、this.date = new DateTime(); でやってみようと思います。
これで何か問題があれば
>値を持ってるということが事実
ということろを参考に、何か適当に値を入れてやってみようと思います。
0979デフォルトの名無しさん
2005/07/06(水) 18:02:42> this.date = DateTime.Parse("");
これって成功するの?
例外吐くような気がするけど。
0980973
2005/07/06(水) 18:59:49ビルドは成功しました。
実行してアプリを動かしてみても例外をはいたりはしてません。
が、おそらくそのコードは間違ってるのでしょうね。
0981979
2005/07/06(水) 19:04:47のメソッドは、 s を完全に解析して、 FormatException がスローされるのを防ごうとします。このメソッドは、認識されないデータをできる限り無視し、
不足している月、日、および年の情報に現在の時刻を格納します
現在の時刻が格納されるってことかな。
なんにせよ、初期化の方法としてはかなり不適切なのでnew DateTime()を使うべし。
0983デフォルトの名無しさん
2005/07/06(水) 21:45:28属性を直接書き換えないとできないのですか?
動的にbrowsable属性を切り替える感じです。
元クラスを書き換えたり継承したりはできない状況なのです。
0984デフォルトの名無しさん
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")));
}
0985984
2005/07/07(木) 15:24:10自己レスです。
アイコンをEXEに埋め込む場合は、
RESXGEN.EXEでアイコンのイメージを.resx形式に変換して
埋め込むらしい。。。
0986デフォルトの名無しさん
2005/07/07(木) 15:32:460987898
2005/07/07(木) 16:02:120988Form1.cs
2005/07/08(金) 07:49:20public 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に文字列が表示されない
}
}
}
0989AlarmList.cs AlarmDataクラスを自作
2005/07/08(金) 07:50:15{
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;
}
}
0990AlarmList.cs AlarmListクラスを自作
2005/07/08(金) 07:50:48{
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;
}
}
}
0991988
2005/07/08(金) 07:55:22listBox1.Items.Add(item.ToString()); の部分を
listBox1.Items.Add(item);
にして、リストボックスにテキストボックスに入力した文字列を表示させたいのですが
listBox1.Items.Add(item); と書くとリストボックスに
AlarmList.AlarmData
と表示されてしまいます。
listBox1.Items.Add(item); と書いてリストボックスに文字列を表示させるにはどうすれば
いいのかで悩んでます。
同じコードを前にC++で書いたことがあるのですが、そのときはlistBox1.Items.Add(item);
と書いてもちゃんと文字列が表示されました。
なのでC#のなんらかの原因があるのかと思うのですが、何か助言いただけるとうれしいです。
0992988
2005/07/08(金) 08:04:04後々、リストボックスから一行を削除するのに
this.report.Remove(item);
と書いて、削除しようとするとアプリが固まってしまうからです。
listBox1.Items.Add(item) にすると固まらずに一行を削除可能なのですが
そうすると今度は、リストボックスに表示されるはずの文字列の代わりにAlarmList.AlarmData
という文字列が表示されてしまうので困ってます。
0993デフォルトの名無しさん
2005/07/08(金) 08:16:450994988
2005/07/08(金) 08:21:10こちらでは、ちゃんとビルド成功しますし、アプリの実行もできてるのですが。
投稿するために極力けずりましたが、けずったものでもちゃんとビルド成功してますけどなんでだろう。
0995デフォルトの名無しさん
2005/07/08(金) 08:26:110996988
2005/07/08(金) 08:33:30アドバイスありがとうございます。
出力ウィンドウをよく見てみたら
ビルドの完了 -- エラー 0、警告 1
とありました。
'AddList.AlarmData.ToString()' は継承されたメンバ 'object.ToString() を隠します。
現在のメンバでそのインプリメンテーションをオーバーライドするには、override キーワードを追加してください。
オーバーライドしない場合は、new キーワードを追加してください。
と出ます。
しかし、listBox1.Items.Add(item.ToString()); とToStringをつけると警告が消えます。
ここに何かヒントがあるのでしょうか。
ちょっとAlarmData.ToString()をいじってみようかと思います。
0997988
2005/07/08(金) 08:38:25解決しました。
public override string ToString()
{
}
にしたところ、 listBox1.Items.Add(item) でちゃんと文字列が表示されました。
どうもありがとうございました。大変たすかりました。
0998デフォルトの名無しさん
2005/07/08(金) 08:41:130999988
2005/07/08(金) 08:49:49'AddList.AlarmData.ToString()' は継承されたメンバ 'object.ToString() を隠します。
現在のメンバでそのインプリメンテーションをオーバーライドするには、override キーワードを追加してください。
オーバーライドしない場合は、new キーワードを追加してください。
の意味が残念ながらわかりません。
ご指摘のとおり、なんか知らないけどoverrideつけたら解決したよという段階にすぎません。
プログラミングの習得にかなりの時間使っちゃったので、今はもうとにかく動くものを作ろうという決意のもとやってます。
結局、ご指摘の問題の本質は理解できてませんが、時間があいたらその件はじっくり考えようと思います。
今、自分なりに考えた解釈は
クラスの設計時に、ToStringというメソッドを作ると、オブジェクトをToStringの返す文字列に整形してくれるんだけど
それにはoverrideって書かないとやってあげないよっていう意味かなとしか解釈できません。
1000デフォルトの名無しさん
2005/07/08(金) 09:16:54C♯相談室 Part24
http://pc8.2ch.net/test/read.cgi/tech/1117631000/
ふらっとC♯(Part5)
http://pc8.2ch.net/test/read.cgi/tech/1065196964/
10011001
Over 1000Threadもう書けないので、新しいスレッドを立ててくださいです。。。
レス数が1000を超えています。これ以上書き込みはできません。