- PR -

Arrayオブジェクトの関数化(クラス化)について

1
投稿者投稿内容
ネーブル
常連さん
会議室デビュー日: 2006/08/26
投稿数: 27
投稿日時: 2006-09-09 10:31
皆様には大変お世話になっています宜しくお願いいたします。
Jubeiさんに教わり、コンボボックスの選択を変えると、各メソッドのデータ値を変化させることができました。
今TotalFreeSpaceプロパティをInt64の型で他の関数ブロック内で呼出す必然性が生じましたそこで質問ですが

[質問内容]
このように関数化したのですが
error C2275: 'cli::array<Type>' : この型は演算子として使用できません
with
[
Type=System::IO::DriveInfo ^
]
とエラーを表示します、DriveInfoクラスのメッソッドを他の関数で呼出したい時は
どのような書き方をしたら良いのでしょうか?
またDriveInfoのArrayオブジェクトをクラス化出来ないものでしょうか?
以上宜しくご教授お願いいたします。


コード:
array< DriveInfo^ >^ allDrives() 
	{
		return array< DriveInfo^ >^ allDrives = (array< DriveInfo^ >^)comboBox1->DataSource;
	}



[Jubeiさんに教わったコード]
コード:
private:
	System::Void comboBox1_SelectedIndexChanged(System::Object^  sender, System::EventArgs^  e)
	{
		array< DriveInfo^ >^ allDrives = (array< DriveInfo^ >^)comboBox1->DataSource;
		DriveInfo^ di = allDrives[comboBox1->SelectedIndex];
		if (di->IsReady == true)
		{
			textBox1->Text = di->VolumeLabel;
			textBox2->Text = di->DriveFormat;
			textBox3->Text = di->TotalSize.ToString();
			textBox4->Text = di->TotalFreeSpace.ToString();
			
		}else{
			textBox1->Text = L"ドライブの準備ができていません";
			textBox2->Text = "";
			textBox3->Text = "";
			textBox4->Text = "";
		}
	}

private:
	System::Void Form1_Load(System::Object^  sender, System::EventArgs^  e)
	{
		textBox1->Text = "";
		textBox2->Text = "";
		textBox3->Text = "";
		textBox4->Text = "";

		array< DriveInfo^ >^ allDrives = DriveInfo::GetDrives();
		comboBox1->DataSource = allDrives;
		comboBox1->DisplayMember = L"Name";
	}

Blue
大ベテラン
会議室デビュー日: 2005/09/12
投稿数: 230
お住まい・勤務地: 知っている人は知っている
投稿日時: 2006-09-09 12:05
引用:

ネーブルさんの書き込み (2006-09-09 10:31) より:
コード:
array< DriveInfo^ >^ allDrives() 
	{
		return array< DriveInfo^ >^ allDrives = (array< DriveInfo^ >^)comboBox1->DataSource;
	}




C言語の文法を理解されていますか?
コード:
array< DriveInfo^ >^ allDrives() 
	{
		return (array< DriveInfo^ >^)comboBox1->DataSource;
	}


ですよね?
というか、このようなメソッドを作るならば、array< DriveInfo^ >^ 型のメンバ変数を用意しておけばよいのでは?
ネーブル
常連さん
会議室デビュー日: 2006/08/26
投稿数: 27
投稿日時: 2006-09-09 15:27
Blueさんいつもお世話になります
引用:

C言語の文法を理解されていますか?


耳の痛い話です一応分かっているつもりですが、変化球に弱いものでして。
引用:

というか、このようなメソッドを作るならば、array< DriveInfo^ >^ 型のメンバ変数を用意しておけばよいのでは?


メンバ変数を用意しておけばよいのでは?
とはgcnewして、初期化する変数を準備するということで宜しいですよね、
このような書き方しか考えれないのですが、申し訳ございませんが、ご教授願えませんか。よろしくお願いします。

コード:
public ref class Foo
{
    array< DriveInfo^ >^ allDrives;
public:
    // コンストラクタ
    Foo()
    {        // メンバ変数をgcnew
        allDrives = gcnew (array< DriveInfo^ >^)comboBox1->DataSource;
    }
};
private:
	System::Void comboBox1_SelectedIndexChanged(System::Object^  sender, System::EventArgs^  e)
	{
		Foo(){
			DriveInfo^ di = allDrives[comboBox1->SelectedIndex];
			if (di->IsReady == true)
			{
				textBox1->Text = di->VolumeLabel;
				textBox2->Text = di->DriveFormat;
				textBox3->Text = di->TotalSize.ToString();
				textBox4->Text = di->TotalFreeSpace.ToString();
			}else{
				textBox1->Text = L"ドライブの準備ができていません";
				textBox2->Text = "";
				textBox3->Text = "";
				textBox4->Text = "";
			}
	}
}
private:
	System::Void Form1_Load(System::Object^  sender, System::EventArgs^  e)
	{
		textBox1->Text = "";
		textBox2->Text = "";
		textBox3->Text = "";
		textBox4->Text = "";

		array< DriveInfo^ >^ allDrives = DriveInfo::GetDrives();
		comboBox1->DataSource = allDrives;
		comboBox1->DisplayMember = L"Name";
	}


Jubei
ぬし
会議室デビュー日: 2002/03/02
投稿数: 830
お住まい・勤務地: 関西
投稿日時: 2006-09-09 16:00
諸農です。

引用:

引用:

C言語の文法を理解されていますか?


耳の痛い話です一応分かっているつもりですが、変化球に弱いものでして。


returnの書き方なんて、変化球とは言えないと思いますが。。


前回、DataSourceにそのまま配列オブジェクトを突っ込んだわけですが、
VS2005ならBindingSourceを使う方法もあります。
元質問の「他の関数ブロック」と言われているものがFormクラス内のメソッドを指しているのであれば、次のような方法でFormクラス内からComboBoxで現在選択されているドライブのDriveInfoオブジェクトにアクセスできるようになります。

準備としてツールボックスのデータカテゴリからBindingSourceコントロールをFormに貼り付けてください。ComboBoxでのドライブ選択の変化はBindingSourceのCurrentChangedイベントハンドラでキャッチします。
コード:
private: System::Void Form1_Load(System::Object^  sender, System::EventArgs^  e) 
{
array< DriveInfo^ >^ dis = DriveInfo::GetDrives();
bindingSource1->DataSource = dis;
comboBox1->DataSource = bindingSource1;
}

private: System::Void bindingSource1_CurrentChanged(System::Object^  sender, System::EventArgs^  e) 
{
DriveInfo^ di = (DriveInfo^)bindingSource1->Current;
if (di->IsReady)
    {
    label1->Text = di->VolumeLabel;
    label2->Text = di->TotalFreeSpace.ToString();
    }
else
    {
    label1->Text = L"ドライブが準備されていません";
    label2->Text = "";
    }
}



このようにすることで、Formクラス内であればBindingSource->Currentで現在ComboBoxで選択されているドライブのDriveInfoオブジェクトにアクセス出来るようになります。

_________________
諸農和岳
Powered by Turbo Delphi & Microsoft Visual Studio 2005

十兵衛@わんくま同盟
http://blogs.wankuma.com/jubei/
Blue
大ベテラン
会議室デビュー日: 2005/09/12
投稿数: 230
お住まい・勤務地: 知っている人は知っている
投稿日時: 2006-09-09 17:19
コード:
public ref class Form1 : public System.Windows.Forms.Form

{
array< DriveInfo^ >^ allDrives;
// コンストラクタでgcnewする必要はない
private:
System::Void comboBox1_SelectedIndexChanged(System::object^ sender, System::EventArgs^ e)
{
DriveInfo^ di = this->allDrives[ comboBox1->SelectedIndex ];
if ( di->IsReady )
{
textBox1->Text = di->VolumeLabel;
textBox2->Text = di->DriveFormat;
textBox3->Text = di->TotalSize.ToString();
textBox4->Text = di->TotalFreeSpace.ToString();
}
else
{
textBox1->Text = L"ドライブの準備ができていません";
textBox2->Text = L"";
textBox3->Text = L"";
textBox4->Text = L"";
}
}
private:
System::Void Form1_Load(System::object^ sender, System::EventArgs^ e)
{
textBox1->Text = L"";
textBox2->Text = L"";
textBox3->Text = L"";
textBox4->Text = L"";

this->allDrives = DriveInfo::GetDrives();
comboBox1->DataSource = this->allDrives;
comboBox1->DisplayMember = L"Name";
}
};



[ メッセージ編集済み 編集者: Blue 編集日時 2006-09-09 17:20 ]
ネーブル
常連さん
会議室デビュー日: 2006/08/26
投稿数: 27
投稿日時: 2006-09-10 11:38
いつもお世話になっています
Jubeiさん
引用:

このようにすることで、Formクラス内であればBindingSource->Currentで現在ComboBoxで選択されているドライブのDriveInfoオブジェクトにアクセス出来るようになります


このような方法もあったのですね、BindingSourceコントロールとても参考になりましたありがとうございました。

Blueさん
コード:
public ref class Form1 : public System.Windows.Forms.Form
{
    array< DriveInfo^ >^ allDrives;
    // コンストラクタでgcnewする必要はない


以前質問に答えて頂いた時、私が質問しきれてなく、教えて欲しかった解答でした
FORM1でメンバ変数を用意しておけば、他の関数内でも操作できるようになりますね、
ネイティブC++のグローバル変数のような使い方に近いイメージのような気がします。
また、このように初期化の必要ない事も確認しました。
どうもありがとうございました。
コード:
	public ref class Form1 : public System::Windows::Forms::Form
	{
		array< DriveInfo^ >^ allDrives;
	public:
		Form1(void)
		{
			InitializeComponent();
			//this->allDrives = nullptr; 初期化の必要なし


1

スキルアップ/キャリアアップ(JOB@IT)