Form1にForm2を作ることはできるか?

このQ&Aのポイント
  • Vclフォームアプリケーションで作ったForm1に、更にForm2を作ることはできるのでしょうか。
  • Form2とForm1はそれぞれ別プロセスで動作させ、かつForm2は子ウインドウのように動作させる、すなわち、Form1の位置を変えると、Form2も移動し、かつForm2はForm1より常に前面に置くためですが、このようなことができるかどうかを確かめたいのです。
  • 他にもっとスマートな方法があればご教示願えれば幸いです。
回答を見る
  • ベストアンサー

Form1にForm2を作る

c++BuilderXE2です。 Vclフォームアプリケーションで作ったForm1に、更にForm2を作ることはできるのでしょうか。 プロジェクトマネージャーにFormコントロールが無いのでできないのでしょうか。 Form2を作る目的は、Form2とForm1はそれぞれ別プロセスで動作させ、かつForm2は子ウインドウのように動作させる、すなわち、Form1の位置を変えると、Form2も移動し、かつForm2はForm1より常に前面に置くためですが、このようなことができるかどうかを確かめたいのです。 他にもっとスマートな方法があればご教示願えれば幸いです。 まったく別のexeのウインドウ(Form2に対応)をForm1からspawn関数により立ち上げることは、テストしているのですが、両者の位置関係が連動しない問題があるのです。SetWindowRectは目的が違うようです。

質問者が選んだベストアンサー

  • ベストアンサー
  • chie65535
  • ベストアンサー率43% (8519/19367)
回答No.2

From2でのタイマー処理を避けたいなら(Form2での処理を軽くしたいなら)、プロセス間通信を使いましょう。 Form2の起動時に、Form1からプロセス間通信用のオブジェクトを受け取って、オブジェクトがシグナル状態になったらイベント処理をするようにコーディングします。 これは、通常のボタンクリックなどのイベント処理と同じくらいの負荷しか与えません。 Form1では、自身のウィンドウの位置が変更されたり、zオーダーが変更されたりした場合、イベントでそれを捕捉し、イベント処理の中で、Form2に渡したプロセス間通信用のオブジェクトをシグナル状態にセットしてあげるのです。 こうすればタイマーの処理は不要なので、負荷を最小限に出来ます。 >この処理を、Form2の中でなく、Form1でできればよいのですが。Form2はCppWebBrowserだけ走り、WebBrowser以外の処理はForm2では極力すくなくしたいのです。 そうしたい場合は、From1でウィンドウの移動やzオーダーの変更を捕捉し、イベント処理でSetWindowPosのAPIを使って 1.From2のzオーダーをForm1の後ろに変更する(変更されたForm1のzオーダーにFrom2を追従させるため) 2.From1のzオーダーをForm2の後ろに変更する(Form2をFrom1の手前に押し出す) 3.Form1の位置を元に、Form2のXPos、YPosを変更する の処理をすれば良いでしょう。Form2では、特に何もしなくても良いです。 残された問題は「Form2のウィンドゥハンドルを、どうやってForm1で取得するか」だけです。

qhtsige
質問者

お礼

ご返事ありがとうございます。 実はSetWindowsPosを使って、ご案内のような手順で、Form1,Form2でなく、prog1.exe、prog2.exeでやっているのです。同じことがFormでできればよいなとが質問の背景でもあるのです。 Form2のハンドルはFindWindow(NULL,"Form2")でできそうにも思うのですが、気になることは、Form1とForm2を持つ1個のプロジェクト(exe)は単一のプロセスでしかないのではないかとの疑問なのです。 そうだとすると、見かけ上window(form?)が2個でも、一方の処理中は、他方のタイムスロットは割り当てられないのではないかとの懸念です。それ故でまだ試していません。 この心配の背景は、Form2にCppWebBrowserで表示・制御するページがFlashを使っていて、ある場面では、タイムスロットを十分割り当てなければならないようなのですが、動作の関係上必要な、Form1での時間待ちにSleepが使えず、タイマー処理で無いと駄目なのです。一方Form1での第3のexeとのプロセス間通信のメッセージ処理では、タイマー処理があると駄目で、Sleep関数を使わねばならない(他に原因があるかもしれなく、それが確実な原因でない無いかもしれませんが)ジレンマに陥っています。それでExeを分けた次第です。

その他の回答 (1)

  • chie65535
  • ベストアンサー率43% (8519/19367)
回答No.1

>Form2とForm1はそれぞれ別プロセスで動作させ、 「別プロセス」じゃないといけないのなら >Form2は子ウインドウのように動作させる、すなわち、Form1の位置を変えると、Form2も移動し、かつForm2はForm1より常に前面に置く と言う処理を、Form2の中で自前で記述しなければなりません。 具体的には、 1.親となるForm1のWindowハンドルを求める。 2.タイマー等で、From1のWindowの位置を監視する(Windowハンドルから辿る)。 3.辿るべきWindowハンドルが無いなら、Form1が終了したので、自分も終了する。 4.From1のWindowの位置が動いたら、自分も追従する。 5.自分のWindowのZオーダーが変わったら、Form1よりも手前なのか奥なのか判断し、奥なら手前に変える。 と言う処理が必要です。 あと5.に関して「Form2のすべての描画を自分で行う」のであれば「Form1の再描画を検出したら、常にForm2を再描画する」と言う処理で「見た目だけは常に前面」にする事が出来ます(フォーカスは下にあるForm1に行ってしまう)

qhtsige
質問者

お礼

答えにくい質問に、ご返事ありがとうございます。 >と言う処理を、Form2の中で自前で記述しなければなりません。 ご提案のようにすればできそうであることはわかりました。(そうするほか無い?) しかし、残念ながら、それではタイマー処理やForm1の監視などで、Form2のタイムスロットをその処理のために使ってしまい、別スロットにしたい意義が減殺されてしまいます。(同じFormで処理するのと同じになりそう)。そうしたい背景は長くなりますので割愛させていただきます。

qhtsige
質問者

補足

お礼の補足です。 >と言う処理を、Form2の中で自前で記述しなければなりません。 この処理を、Form2の中でなく、Form1でできればよいのですが。Form2はCppWebBrowserだけ走り、WebBrowser以外の処理はForm2では極力すくなくしたいのです。

関連するQ&A

  • DelphiでFormを透視化しするには?

    Delphi 6, Windows 98 です。Formの一番上のバーをマウスで押すとこのFormが透明になり、その裏側に表示されている別のウィンドウの文字(たとえば新聞記事)などを読みたいのですが、どうやれば前面のFormを透視化できますか、どなたか教えてください。

  • タスクスケジューラでVB6のプログラムが実行しない

    VB6で作ったプログラムをWindows7において、タスクスケジューラで起動させたが、実行しない。 フォ-ムは1個だけで、その中のACTIVATEから、同フォーム内のルーチンを呼び出して目的の動作をさせるようになっています。手動で起動させると、目的の動作をして終了するが、タスクスケジューラではフォームを表示した状態で止まっている。そのフォームをクリックすると目的の動作を行う。なお、フォームはその時実行されている別のVB6のフォームの前面[最前面)に表示されている。目的は1日1回自動的に特定ファイルの状態を調べたいだけです。 よろしくお願いします。

  • Form.ShowDialogを使用してください エラー

    環境 Windows7 VS2008 SP1 C# でWindowsフォームを作ります そのプロジェクトにもう一つWindowsフォームを追加します。 namespace Valhallax { public partial class Valhallax : Form { public Valhallax() { InitializeComponent(); } private void button1_Click(object sender, EventArgs e) { Application.Run(new ImageViewer()); 一つのWindowsフォームにボタンを配置して それをクリックしたら、 もう一つのWindowsフォームを呼び出したいのですが Application.Run(new ImageViewer()); とすると 画像の様にエラーがでてしまい うまくいきません 実現したいのは 一つのWindowsフォームのボタンをクリックしたら 同一プロジェクトにあるWindowsフォーム(Window)を 呼び出すことです。 どなたかアドバイスおねがいしますm(__)m

  • EXE起動時の操作の案内方法について

    プログラム(C#)を起動させたときに親切な案内手段について意見をいただけませんでしょうか? あるプログラムのインストール方法案内手段で悩んでいます。 上司からユーザー向けに案内HTMLを作って操作させる方法もいいけどあまり読んでくれないからEXEを叩いた瞬間にインストールの仕方を案内するものを見えるようにしたほうがいいと指示があります。 そこで別のプロジェクトでフォームを作りPictureBoxを使って画像を切り貼りして案内のフォーム用のEXEを作りました。 それを更に別プロジェクトのResourceに登録して起動するようにしています。 ただ、このプログラムはすべてバラバラのプロジェクトで作ったので連動性がありません。 フォームが起動してしまうと別プログラムが立ち上がった瞬間後ろにウィンドウが隠れてしまいます。 それが嫌だったので、this.TopMost = true;としたところ常時最前面でこれも使いにくいです・・・ なにかいい方法はないでしょうか? 全く別の手段でも構いません

  • VB.NETとEXE

    VB.NETで作成したフォーム(仮にメインフォームとします)にコマンドボタンを複数貼り付けています。 各コマンドボタンをクリックすると、それぞれの別のEXEが起動します。 (例 コマンドAをクリックすると、EXE-Aが起動、コマンドBをクリックするとEXE-Bが起動。両方一度に起動も可) この時、必ずメインフォームの上にEXEのフォームが重なるように表示されています。 そこで質問があります。 1、複数EXEが起動されている時、一番前面に表示されているEXEを識別する方法はありますか? 「現在アクティブなEXE」とは異なります。なぜなら、メインフォームをクリックすると、前面に表示されているEXEはアクティブな状態とはならないためです。 2、メインのフォームの右上にある「最大化」や「最小化」のボタンをクリックしたら、それに連動してEXEも最大化や最小化をするようにすることは可能でしょうか? すこしわかりにくいと思いますが、補足もしますので、アドバイスよろしくお願いします。

  • safari とmultipart/form-data

    自作のCGIに対して、safariで動かすと正しく動作しないという苦情がきました。 (画像をアップできるようにしているため)multipart/form-data のフォームでデータを送信する形式をとっているのですが、報告してくれた方によるとWindowsのIEやNetscapeではちゃんと動作することを確認済みで、MacのNetscapeでも確認済みのようです。なのでsafariというブラウザに対応した記述をしていないからだとは思うのですが、私自身Macユーザーではないので自分で動作確認が出来ません^^;送信されるデータ形式が違うのでしょうか? 普通ならば -----------------------------7dxxxxxxxxxxxx Content-Disposition: form-data; name="test_A" aaaaa -----------------------------7dxxxxxxxxxxxx Content-Disposition: form-data; name="test_B" bbbbbb -----------------------------7dxxxxxxxxxxxx-- といった感じですよね?

    • ベストアンサー
    • HTML
  • VBで外部プログラムを位置のみ指定して実行したい

    Form1上のボタンを押すと、ある別のアプリケーションを実行し、そのウィンドウをForm1の横に大きさを保持したまま配置したいです。 現在は下記のコードを使っていますが、この場合 ・幅・高さが変わる ・一瞬別の位置にウィンドウが見える といった問題があります。 ・位置のみを指定する、もしくは外部のウィンドウのサイズを取得する方法 ・表示する前に位置を変える方法 あるいは ・位置のみを指定して実行する方法 について教えていただきたいです。 Dim p As Process = Process.Start(application) p.WaitForInputIdle() MoveWindow(p.MainWindowHandle, Me.Right, Me.Top, 100, 100, 1)

  • アプリケーションのプロセス監視について

    VisualBasic.netでフォーム(Form1)を作成、Visible=Falseで隠した後、タスクトレイにアイコンを表示させるプログラムを作っています。以前の質問に、プロセス監視をするとexeが軽くなるとあるんですが、理屈がわかりません。どうしてexeが軽くなるんでしょうか? よろしくお願いします。

  • フォーム内で記入したクエリ送信後自動的にフォーム内をリセットする方法

    いつもお世話になっております。 今回ご教授いただきたいのが、 <FORM action=/search/clanad/filed.exe method=post target="main"> ~~中略~~ <INPUT type=submit value=検索 > という形で、フォーム内に記述したものを、 submitで"検索"を押して動作が走ったときに連動してクリアしたい、と考えております。 どのような記述を加えてあげれば宜しいのでしょうか? 単純なごしつんもんかとは思いますが、知恵をお貸しいただければと思います。 よろしくお願いいたします。

  • アプリケーションAから外部アプリケーションBを

    アプリケーションAから外部アプリケーションBを 呼び出す処理。 Bのフォームを常に最前面にして、Aのフォームを操作できないようにしたいです。 ただしAにあるタイマーを止めないようにもしたいです。 そこで [C#] //ファイルを開いて終了まで待機する System.Diagnostics.Process p = System.Diagnostics.Process.Start("C:\\test.exe"); p.WaitForExit(); ※「test.exe」を外部アプリケーションBとする。 を使ったのですが、Aのタイマーが止まってしまいます。 何か良い方法はないでしょうか? 言語はC#です。

専門家に質問してみよう