• 締切済み

プログレスバーについて

サーバー上からファイルをダウンロードするアプリを 作成しているものです。 ClassAとClassBが存在するとして、 ClassAでファイルをダウンロードする処理を記述し、 ClassBでプログレスバーを含むダイアログを作成しています。 ClassAのファイル読み込みのループ処理のカウンターを プログレスバーのメンバー変数m_plgと同調させたい。 例 ClassA  for(i=0;i<count;i++){  } ClassB  m_plg.SetRange(0,count); m_plg.SetPos(i); かなり簡略化してます。 上記内容は実現可能だと思うのですが、メンバー変数の宣言部がおかしいのか m_plgは宣言されていませんとエラーがでます。 メンバー変数の理解不足だと思うのですが、このような処理を行いたい場合は どちらのClassにも認識されるようなコントロールのメンバー変数はどのようにして 宣言すればよろしいのでしょうか? 開発環境はVC++6.0 MFC ダイアログです。

みんなの回答

  • Fooky
  • ベストアンサー率71% (59/82)
回答No.2

VCは使ったことないんでプログレスバーを 表すクラスの名前が分からないので、ここでは class ProgBarだとすると、class Bはこんな 感じですか? class B { public:  B(){   ...   m_plg.SetRange(0, count);   ...  }  ...  ProgBar m_plg;  ... }; m_plgを直接class Aからいじろうと 思うなら、class Bの中でpublicフィールド 内で宣言しなければなりません。 で、class A内で、 class A {  ...  void report_progress(){   for( int i = 0 ; i < 100 ; i++ ){    ...    dialogbox.m_plg.SetPos(i);   }  }  ...  B dialogbox;  ... }; てな感じのことをしたいんですかね。 だとすると、以上のプログラム例のように、 B内でm_plgをpublicで宣言し、A内で Bのインスタンスを生成(または外部から ポインタかリファレンスで受け取る)、 そのBのインスタンスからm_plgをメンバ参照する、 ということで良いと思いますが。

noname#30727
noname#30727
回答No.1

簡略化というよりも、意図することが正確に伝わってきません。 クラスとインスタンスの関係について、少し調べられてはどうでしょう? ClassB のインスタンスが Dialog だとしたら、ClassA 側から、Dialog.m_plg とアクセスすることはできます。もちろん public でなければなりません。

関連するQ&A

  • クラスでnew宣言

    いつも御世話になっています。 クラス作成時に、 オブジェクト型(クラス型)を変数として宣言している時がある気がするのですが、ClassB classB = new ClassB(); この場合の利点は何かあるのでしょうか? 普通に考えれば、この記述を宣言することで、この宣言がされているクラス自身が、ClassBの実体を持つことになり、このクラスだけで多数のクラスの実体を利用できるようになる。 と思ったのですが。 クラスとしては、 ClassA { private ClassB classB = new ClassB(); } という場合です。 ここで、private ClassB classB;でない理由: むやみに、上記の書き方をすると、外部から書き換えられてしまう恐れがあるから、、なるべくその可能性を回避するため 宜しくお願いします。

    • ベストアンサー
    • Java
  • 参照メンバを持つクラス

    ClassAとClassBにCMyDataオブジェクトを渡したいのですが、メモリ上に同じデータのコピーを作りたくないので、コンストラクタがCMyDataの参照を受け取る設計にしました。こうすることで、CMyDataの実体はメモリ上に1つしか存在しないことになります。 ただ、クラスが、自身が管理していない外部領域にあるデータへの参照を使って仕事をするというのに違和感を感じます。 完全コンストラクタというデザインパターンがあって、クラスのインスタンスを生成する時に必要な全てのデータを渡すのが正しい流儀だそうです。 しかしこのClassA(B)の設計では、ClassA(B)の寿命が終わるまで参照先のデータが生きているとは限りません。もっといい設計はないでしょうか?ちなみにCMyDataは実際にはかなり大きなデータで、一時的であってもコピーを複数持ちたくないのです。ClassAとClassBは、実際は他のデータも参照するため1つのクラスにはしたくないのです。 class CMyData { // 色々なデータ }; class CMain { CMyData* myData; // ファイルからデータを読み込んで生成 ClassA* objA; ClassB* objB; void ReadFile() { myData = new CMyData(); // ファイルからデータを読み込みCMyData構築 } void Init() { ReadFile(); objA = new ClassA(*myData); // 自身のメンバ変数の参照でClassAを構築 objB = new ClassB(*myData); } void DoProcess() { Init(); // 実行は一度だけ objA->hoge(); // ClassAに仕事をさせる objB->foo(); // ClassBに仕事をさせる } } class ClassA { CMyData& m_data; public: ClassA(CMyData& data) m_data=data; // CMyDataオブジェクトを参照で受け取る void hoge(); } class ClassB { CMyData& m_data; public: ClassB(CMyData& data) m_data=data; // CMyDataオブジェクトを参照で受け取る void foo(); }

  • C# or VB プログレスバー

    プログレスバーで進行状況を表示する処理を入れています。 http://dobon.net/vb/dotnet/programing/progressdialog.html 上記のサイトをパクってとりあえず作ってみました。きちんとできているのですが 1つだけ問題があって try { ProgressDialog pd = new ProgressDialog(); //ダイアログのタイトルを設定 pd.Title = "カウントアップ"; //プログレスバーの最小値を設定 pd.Minimum = 0; //プログレスバーの最大値を設定 pd.Maximum = 10; //プログレスバーの初期値を設定 pd.Value = 0; //進行状況ダイアログを表示する pd.Show(this); //処理を開始 for (int i = 1; i <= 10; i++) { //プログレスバーの値を変更する pd.Value = i; //メッセージを変更する pd.Message = i.ToString() + "番目を処理中..."; //キャンセルされた時はループを抜ける if (pd.Canceled) break; //1秒間待機する(本来なら何らかの処理を行う) System.Threading.Thread.Sleep(1000); } //ダイアログを閉じる pd.Close(); } catch { MessageBox.Show("error"); } こんな感じで使い、プログレスバー表示中に例外が走るとMessageBoxがモーダレスで 表示されてしまいます。プログレスバー表示前だとモーダルのままです。 色々調べたところ原因は裏でスレッドが走っているからだと思います。たぶん・・ ところが対処法となると少々困っています。モーダルでMessageBoxを表示させたいのですが どうすればよいのでしょうか?教えてください。

  • MFCを使わないで、プログレスバーを表示したい。

    複数のファイルで構成されているフォルダがあって、そのフォルダのコピーを作成する処理を行うとします。 その処理の進行状況を、ダイアログボックス上に貼り付けたプログレスバーコントロールで表示したい と思っているのですが、MFCを使用しない例はネットなどで検索しても見つけることができません。 例えば、フォルダの容量の「現在○○%コピーしました。」とか、それが無理なら全体の何ファイル目を処理 しているかなどを、プログレスバーで表示することは可能ですか。 数値的な表示が無理なら、現在処理中かどうかを表示するだけでも構いません。 ご教授の程、よろしくお願いいたします。 環境:VC++6.0, WIN32 API

  • 【シェルスクリプト】 ローカル変数、グローバル変数

    シェルスクリプトのローカル変数、グローバル変数の取り扱いで迷っています。 ---------------- #!/bin/bash count=0 cat file | while read i do count=`expre $count + 1 ` done echo $count ---------------- fileの中身をcatで流して、それを一行ずつ読み込みます。 そのつど、count の値を増やしていくようにしたいのですが、最後の出力値は0となります。 cat→whileで読み込ませて処理している間はローカル変数として扱われているのでしょうか。 またそうであるならば、シェルスクリプトでグローバル変数を明示的に宣言するにはどうのようにすればいいのでしょうか。

  • C++ 振る舞いの動的な変更

    似たような動作をする、複数の処理があるのですが、それらをひとつのインターフェースで、モード切り替えで実行できるようにしたいのですが、良い方法はありますでしょうか? 下はクラスでの例です。 class SuperClass {  virtual static void method_1() = 0;  virtual static void method_2() = 0;  ... } class classA : public SuperClass {  static void method_1() {}  static void method_2() {}  ... }; class classB : public SuperClass {  static void method_1() {}  static void method_2() {}  ... }; // 処理だけですので、メンバ変数はありません XXX::mode = A; XXX::mehod_1(); // classA のメソッドが呼ばれる。 XXX::mode = B; XXX::mehod_1(); // classB のメソッドが呼ばれる。 方法としては、クラスでも関数ポインタでも何でもかまわないんですが、 関数が複数あるため、クラスにしてまとめて変更ができると楽なのですが、 実体は特になく、static なメンバ しかないので、名前空間になるのか、、、、 どのように実装してよいか悩んでいる状態です。 よろしくお願いいたします。

  • メンバ変数宣言時にfinal修飾子

    いつも御世話になっています。 final修飾子を使用する際で、メンバ変数宣言時で、 オブジェクト型変数にfinalをつけた際、値を変更できると思うのですが。 インターフェースで考えた時はどうなるのでしょうか? クラス型だと, final ClassA object1 = new ClassA(); classA.value = 10; //valueはint型 と記述されると思うのですが、 また、配列だと, final String[] hairetu = {"one","two"}; classA.strValue = hairetu; とするのがいいのでしょうか? 宜しくお願いします。

    • ベストアンサー
    • Java
  • [C#.net]スレッド化された別フォームのプログレスバーの操作方法について

    こんちは。最近C#をやり始めて行き詰まったので質問致します。 質問内容に対する答えをお持ちの方がいらっしゃいましたら、お暇な時にでもお答えください。 public Class SumLoop { public Keisan(int Cnt, string Msg) {   // (1)プログレスバーのフォーム生成時に変数Cntをプログレスバーの最大値、変数Msgをフォームのタイトルに設定したい。   FormProgress FrmPro = new FormProgress();  Thread thread = new Thread(new ThreadStart((2)) );   thread.Start();   for(int i=0; i<Cnt; i++) {   // (3)このiがインクリメントする度にプログレスバーのValueを増やしたい   // FrmPro.SetProgressValue(i) // これだとコンパイラに怒られた    // ここに主な処理   } } public partial class FormProgress : System.Windows.Forms.Form {  public FormDfmProgress() { InitializeComponent(); }  // (3)これではダメみたい  public void SetprogressValue(int iValue) {   progressBar1.Value = iValue;   progressBar1.Refresh();  }  // (4)他のイベントが必要? } ざっと汚いコードを書きましたが具体的にお知恵を貸して頂きたいところは (1)のフォーム生成時のパラメータをどう与えるのか? インスタンス作成の際にここで言うFormDfmProgressをthisで継承させオーバーロードさせれば良いんでしょうか? (2)プログレスバーのフォームを表示させたいだけなのですが、.ShowDialog()では怒られ、.Showでは即座にフォームが消えたりでどうにもなりません。スレッドが消えるまで表示させるにはどうしたらいいでしょう? (3)フォーム側のプログレスバーのValueなり、変数なりをスレッド稼動中に更新させるにはどうしたらいいでしょうか? (4)は、大して気にしていないのですが、これが致命的に足りない!とかいうのがあればご指導願います。 以上長々となりましたが、お暇な方お力を御貸しください

  • 複数の派生クラスオブジェクトを一括して取り扱う方法

    いつもお世話になっています。 C++でプログラムをしています。 classAの派生クラスとして、 classA-1、classA-2を作りました。 classAのオブジェクトには、 親クラスにおいて、重複しないIDを 定義しています。 classA{...} classA-1():public A classA-2():public A classA-1 A1[1000]; classA-2 A2[2000]; ここで、クラスAオブジェクト (派生クラスを含む)のうち、 特定のIDのオブジェクト、 例えば、ID=100番のものを 取り出して、何某かの処理をしたいのですが、 現在は、 for(i=0;i<1000;i++){ if(A1[i] == 100){...} } for(i=0;i<2000;i++){ if(A2[i] == 100){...} } のようにしています。 しかし、派生クラスの種類が増えてくると、 この方法はコーディング量が非常に増えて 非効率的です。 プログラム上も美しくありません。 できれば、 同じクラスなのですから、 for(i=0;i<1000;i++){ if(A[i] == 100){...} } のような形で一括して検索するようにしたいのです。 つまり1つの配列変数で 両方を扱えるようにしたいのです。 ただし、当該IDを持つ、ポインタさえ取得できれば、 それぞれの派生クラスに型キャストしてから 操作するつもりです。 target = (classA-2)A[5]; target.Action(); どなたか、参考URL、キーワード、アドバイス等 頂ければ助かります。 よろしくお願いします。 よろしくお願いします。 としており、効率的ではなくなってしまいます。

  • C#のフォームについて

    http://dobon.net/vb/dotnet/programing/progressdialog.html 上記のサイトを元にプログラムを作成したのですがうまくいきません。 ProgressDialog pd = new ProgressDialog(); //ダイアログのタイトルを設定 pd.Title = "カウントアップ"; //プログレスバーの最小値を設定 pd.Minimum = 0; //プログレスバーの最大値を設定 pd.Maximum = 10; //プログレスバーの初期値を設定 pd.Value = 0; //進行状況ダイアログを表示する pd.Show(this); //処理を開始 for (int i = 1; i <= 10; i++) { //プログレスバーの値を変更する pd.Value = i; //メッセージを変更する pd.Message = i.ToString() + "番目を処理中..."; //キャンセルされた時はループを抜ける if (pd.Canceled) break; //時間のかかる処理 //時間のかかる処理 //時間のかかる処理 } //ダイアログを閉じる pd.Close(); 上記のコードの場合、ループ毎の最初にキャンセルかどうかの条件が書かれているため、ループ処理の途中にキャンセルを押してもきかない時があります。 処理中は常にキャンセルかを監視し、押されたらすぐにキャンセルできるようにしたいのですが、どのようにしたらいいのでしょうか。