久し振りのお題です。
http://ja.doukaku.org/comment/6192/
オブジェクト指向とは擬人化することであると思うこの頃。
そうそう、トピックの投稿に挑戦してみました。
+評価は貰えましたが、コードの投稿が無いですね…。
久し振りのお題です。
http://ja.doukaku.org/comment/6192/
オブジェクト指向とは擬人化することであると思うこの頃。
そうそう、トピックの投稿に挑戦してみました。
+評価は貰えましたが、コードの投稿が無いですね…。
ネタのつもりが+評価貰っちゃってます。
HogeクラスからPiyoクラスをインスタンシング。
その時、PiyoクラスのコンストラクタでHogeクラスの参照を渡す
Piyoクラス内にHogeクラスのhogeHogeイベントのイベントプロシージャを作成
PiyoクラスDispose();
HogeクラスでhogeHogeイベント発生。
エラー発生、破棄されたオブジェクトにアクセス出来ません云々。
こんな感じです。油断してました。+=したエベントプロシージャはちゃんと-=で後始末しないといけませんね。VB.NETで言うと、AddHandler,RemoveHandler、だったかな?
なんていうか、その…、
ごめんなさい。
http://codezine.jp/a/article/aid/2187.aspx
これは面白そうです。
”C# 二重起動 禁止”等で検索するとMutexを使った方法を紹介したページがヒットしますが、これでは後から起動されようとしたインスタンスのコマンドライン引数を取得出来ません。
自分で、既に起動済みのインスタンスにコマンドラインを渡して、受け側で処理する様に実装しなければいけません。これでは面倒です。VB.NET 2005では簡単に二重起動を禁止して、引数も取得出来ました。
同じクラスライブラリなのだから、VBに出来てC#に出来ない筈は無いと考え、調べてみました。下準備をすればVBと同じ方法で二重起動を禁止し、引数も取得出来ることがわかりました。以下にその方法を紹介します。
まず、”Microsoft.VisualBasic”をプロジェクトの参照に追加します。
そして、次の様にクラスを書きます。
using System.IO;
using Microsoft.VisualBasic.ApplicationServices;
class myApplication:WindowsFormsApplicationBase{
public myApplication()
: base() {
this.EnableVisualStyles = true;
this.IsSingleInstance = true;
this.MainForm = new Form1();//スタートアップフォームを設定
this.StartupNextInstance += new StartupNextInstanceEventHandler(myApplication_StartupNextInstance);
}
void myApplication_StartupNextInstance(object sender, StartupNextInstanceEventArgs e) {
//ここに二重起動されたときの処理を書く
//e.CommandLineでコマンドライン引数を取得出来る
}
}
myApplication_StartupNextInstanceメソッドの中には、VB.NETの方法の時と同じ様にコーディング出来ます。詳しくは検索すればわかりやすいページがあるでしょう。
次に、プログラムのエントリポイントを書き換えます。
using System;
static class Program {
[STAThread]
static void Main(string[] args) {
//Application.EnableVisualStyles();
//Application.SetCompatibleTextRenderingDefault(false);
//Application.Run(new Form1());
myApplication winAppBase = new myApplication();
winAppBase.Run(args);
}
}
こんなに簡単な方法があるのに、検索しても紹介されているのを見たことがありません。この方法に何か問題があるのかも知れませんね。
知っている方がいましたらコメント下さい。
axWindowsMediaPlayerの使い方をググっても情報が少なかったのでメモします。
【準備】
参照設定する。
ツールボックスで右クリック、アイテムの選択
COMコンポーネントタブをクリック
Windows Media Playerをチェック
これでツールボックスにWindows Media Playerが追加されるのでフォームに貼り付ける。
【フォームデザイナでプロパティ設定】
Ctlenabled falseにするとボタン操作が無効になる
stretchToFit 動画、画像がウィンドウのサイズに合わせて変わる。
uiMode none ボタンが表示されない。UIをお好みで実装するならこれ。
full ボタンが表示される。WMPそのまんま。お手軽。
invisible 表示されないって意味らしい。設定したら表示が大変なことになった。オーディオ専用ならこれか、Visible = falseでいい気がするけど。
他に何かあったら教えて下さい。
URL 再生するファイルのパスを渡すとロードして再生の準備をする。settings.autoStart = true なら再生を開始する(既定ではfalseみたい)。
windowlessVideo trueにすると動画が表示されない。用途がわからない。
【メソッドとかプロパティとか】
Ctlcontrols.play() 再生。
Ctlcontrols.stop() 停止。
Ctlcontrols.pause() 一時停止。
Ctlcontrols.fastReverse() 早戻し、出来ないファイル形式があるみたい。
Ctlcontrols.fastForward() 早送り、上に同じ。
Ctlcontrols.currentPosition 再生位置、秒数。
Ctlcontrols.currentPositionString 再生位置、mm:ssの形式。
settings.volume = 0~100 ボリューム
settings.balance = -50~50 左右のバランス
settings.mute 消音。えってぃ動画とか見るなら必須。
status 準備完了とか一時停止とか表示されるあれ。StatusChangeイベントで更新してやるといいみたい。
currentMedia.duration 再生中のファイルの総時間。
他はよくわからなかった。
【シークバーを実装してみる】
再生位置を更新するイベントがいくら探しても見付かりません。どうやら無い様です。Windows.Forms.Timerを使って定期的に更新することにします。スライドにはTrackBarを使います。
再生開始したらTimerをStart()する。Intervalは既定の100でいいと思います。Windous Madia PlayerのPlayStateChengeイベントが使えるかも。currentMedia.durationでファイルの長さが得られるのでintにキャストしてTrackBarのMaxValueにセット。
TimerのTickイベントでCtlcontrols.currentPositionをintにキャストしてTrackBarのValueにセット
これで再生時間が刻々と更新されます。
後はTrackBarの操作で再生位置を操作しましょう。
TrackBarのScrollイベントでTrackBarのValueをdoubleにキャストしてCtlcontrols.currentPositionにセット。
これだけじゃエレガントに動かないので、操作中は更新を止めましょう。
TrackBarのMouseDownイベントでTimerをStop()。MouseUpイベントでStart()するとエレガントに動くようになりました。
以上、WindowsMediaPlayer弄りメモでした。他にも情報がありましたら教えて下さい。
理解できません。僕は何をしたらいいのでしょうか?僕にもわかるように要求仕様を教えて下さい。
どう書く?には珍しく実用的なお題です。
アルゴリズムでかなり悩んでたのですが、書き始めてみたらサクッと出来ました。コードを書く行為そのものに思考をまとめる作用があるようです。
久々の一番乗りです。いぇい。