C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[4]: C# this.Handdleを別のクラスで実行したい。


(過去ログ 127 を表示中)

[トピック内 5 記事 (1 - 5 表示)]  << 0 >>

■75679 / inTopicNo.1)  C# this.Handdleを別のクラスで実行したい。
  
□投稿者/ 寅 (1回)-(2015/04/22(Wed) 21:02:03)

分類:[C#] 

環境 VisualStrudio C#.Net + AForge.NET (Windows7)

C#を始めて6ヶ月程の者です。C;; builderは数年やって居ます。

カメラの制御プログラムをAforge.Netのサイトを参考に作成しています。
全ての必要な処理は無事実行出来る様に成りました。
そこで、次にカメラの制御に詳しく無い人の為に簡単にカメラのプログラムを書ける様に、カメラの制御を関数化しようと思い、これも殆ど関数化出来ました。
最後に一つだけ、カメラのフォーカス等を調整する部分が関数化出来なくて困っています。

最初のソースがコンパイルが通り、実行出来ているものです。
次にその下の様に、別クラスでこの内容を作成し、元のクラスから関数で呼ぼうとした時、this.Handleでコンパイルエラーが(当然ですが)出ました。

thisの用法を調べたのですが良く分りません。this.Handleを元のクラスから引数で渡しても、関数の中で元のクラスを参照させても良いのですがthisの意味を余り良く分っていないのでとっかかりが掴めません。
このthis.Handleをどう替えたら良いのでしょうか、若しくはこの様なものは関数に内容をを渡せないものなのでしょうか。
よろしくお教えください。

よろしくお願いいたします。


コンパイルが通り、実行出来たプログラム。
static public FilterInfoCollection videoDevice;
static public VideoCaptureDevice videoSource = null;
static public VideoCapabilities[] videoCapabilities;

publicc void btnParamSet_Click(object sender, EventArgs e)
{
if((videoSource != null) && (videoSource is VideoCaptureDevice))
{
try
{
((VideoCaptureDevice)videoSource).DisplayPropertyPage(this.Handle);
}
catch(NotSupportedException ex)
{
MessageBox.Show(ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
}

コンパイルエラーに成るプログラム。
static public FilterInfoCollection videoDevice;
static public VideoCaptureDevice videoSource = null;
static public VideoCapabilities[] videoCapabilities;

af.AfParamSet(); //関数を呼ぶ

af はnewで別クラスを設定。

別クラス

public void AfParamSet()
{
if((videoSource != null) && (videoSource is VideoCaptureDevice))
{
try
{
((VideoCaptureDevice)videoSource).DisplayPropertyPage(this.Handle); //<コンパイルエラー
}
catch(NotSupportedException ex)
{
MessageBox.Show(ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
}

引用返信 編集キー/
■75680 / inTopicNo.2)  Re[1]: C# this.Handdleを別のクラスで実行したい。
□投稿者/ Azulean (465回)-(2015/04/22(Wed) 22:07:13)
No75679 (寅 さん) に返信
> thisの用法を調べたのですが良く分りません。

C++ でも this があったと思いますが、C# でも同じです。
別クラス、あるいは別オブジェクトから利用できないことも同じです。
(今回の問題に対する解決方法も C++ と似たようなアプローチになります)


> this.Handleを元のクラスから引数で渡しても、関数の中で元のクラスを参照させても良いのですがthisの意味を余り良く分っていないのでとっかかりが掴めません。
> このthis.Handleをどう替えたら良いのでしょうか、若しくはこの様なものは関数に内容をを渡せないものなのでしょうか。

そのプロパティから値を取り出しておいて、その値を関数などに渡すのがまず第一に考えることでしょう。

1.Handle プロパティが何型なのかをまず調べる(MSDN などで)
2.AfParamSet の引数として1で調べた型を加える
3.AfParamSet を呼び出す箇所で Handle プロパティにアクセスし、関数の引数として与える

なお、AfParamSet を呼び出す箇所が Handle プロパティを提供できないのであれば、さらに呼び出し元からもらうように変えていくことになります。


// 別解としてはデリゲートがありますが、上記手順を自力解決できない状態だと厳しいと思います…。
引用返信 編集キー/
■75681 / inTopicNo.3)  Re[2]: C# this.Handdleを別のクラスで実行したい。
□投稿者/ 寅 (2回)-(2015/04/22(Wed) 22:25:25)
No75680 (Azulean さん) に返信
> ■No75679 (寅 さん) に返信

Azuleanさん、ご回答ありがとうございます。

> そのプロパティから値を取り出しておいて、その値を関数などに渡すのがまず第一に考えることでしょう。
>
> 1.Handle プロパティが何型なのかをまず調べる(MSDN などで)
> 2.AfParamSet の引数として1で調べた型を加える
> 3.AfParamSet を呼び出す箇所で Handle プロパティにアクセスし、関数の引数として与える
型を調べる必要があるのですね。
ある程度は今日、探してみたんですが良く分りませんでした。
明日、会社で又調べてみます。

ありがとう御座いました。
引用返信 編集キー/
■75683 / inTopicNo.4)  Re[3]: C# this.Handdleを別のクラスで実行したい。
□投稿者/ Azulean (466回)-(2015/04/22(Wed) 22:49:35)
No75681 (寅 さん) に返信
> 型を調べる必要があるのですね。
> ある程度は今日、探してみたんですが良く分りませんでした。

その Handle にカーソルを合わせて F1 キーを押すとか、F12 キーを押すとか、そういったことでも何らかの情報を得られるでしょう。
自分が使っているオブジェクトが何型なのかはきちんと理解して使わなければならないのは、C++ も C# も変わりません。
引用返信 編集キー/
■75684 / inTopicNo.5)  Re[4]: C# this.Handdleを別のクラスで実行したい。
□投稿者/ ?? (3回)-(2015/04/23(Thu) 19:31:55)
No75683 (Azulean さん) に返信

> 自分が使っているオブジェクトが何型なのかはきちんと理解して使わなければならないのは、C++ も C# も変わりません。

本日、会社で型を探してみました。
結果として、以下のコーディングで動作しました。肝心の所だけの抜き出しです。

af.AfParamSet(this.Handle); //関数を呼ぶ

public void AfParamSet(IntPtr hndHandler)
{
((VideoCaptureDevice)videoSource).DisplayPropertyPage(hndHandler); //<コンパイルエラー無し
}

当初、見慣れない this に目を取られ、色々thisに関しての情報を探っていたのが間違いの元でDisplayPropertyPageのパラメーターの型を調べなければいけなかったのですね。

余談ですが、今朝、関連工場から、ウエブカメラ2台を接続してモニター出来るプログラムは無いか、との問い合わせがあり、今、整理して居るある拠点向けのサンプルプログラムの基本形が出来たら、30分程度で希望のプログラムは作れるとの返事をして置き、サンプルプログラムの基本形を仕上げた後、工場希望の仕様のカメラ2台同時モニターのプログラムを仕上げる事が出来ました。

ありがとう御座いました。


解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -