LoginSignup
0
1

More than 5 years have passed since last update.

C++ Builder XE4 > Forms > Form1からForm2を生成した時、Form1が常にForm2の後ろに隠れる問題の対処 > CreateParams()のオーバライド

Last updated at Posted at 2018-11-06
動作環境
C++ Builder XE4

概要

  • Form1からForm2をnewで生成
  • Form2をShowした後、Form1が常に後ろに隠れる

下記のようにForm1をクリックしても、Form2が前面に出たままとなります。

2018-11-06_18h55_16.png

参考

色々調べて下記の2つを見つけた。

情報感謝です。

CreateParams()をオーバーライドしてParams.WndParentを書換える方法をC++ Builderで実装します。

実装

newされるフォーム > CreateParams()のオーバライド

Unit2.h
//---------------------------------------------------------------------------

#ifndef Unit2H
#define Unit2H
//---------------------------------------------------------------------------
#include <System.Classes.hpp>
#include <Vcl.Controls.hpp>
#include <Vcl.StdCtrls.hpp>
#include <Vcl.Forms.hpp>
//---------------------------------------------------------------------------
class TForm2 : public TForm
{
__published:    // IDE で管理されるコンポーネント
private:    // ユーザー宣言
public:     // ユーザー宣言
    void __fastcall CreateParams(Controls::TCreateParams &Params);
    __fastcall TForm2(TComponent* Owner);
};
//---------------------------------------------------------------------------
extern PACKAGE TForm2 *Form2;
//---------------------------------------------------------------------------
#endif
Unit2.cpp
//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop

#include "Unit2.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm2 *Form2;
//---------------------------------------------------------------------------
__fastcall TForm2::TForm2(TComponent* Owner)
    : TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm2::CreateParams(Controls::TCreateParams &Params)
{
    TForm::CreateParams(Params);
    Params.WndParent = Application->Handle;
}

newするフォーム

こちらでは特別な処理は入れていない(newしてShowするだけ)。

Unit1.h
//---------------------------------------------------------------------------

#ifndef Unit1H
#define Unit1H
//---------------------------------------------------------------------------
#include <System.Classes.hpp>
#include <Vcl.Controls.hpp>
#include <Vcl.StdCtrls.hpp>
#include <Vcl.Forms.hpp>
#include "Unit2.h"

//---------------------------------------------------------------------------
class TForm1 : public TForm
{
__published:    // IDE で管理されるコンポーネント
    TButton *Button1;
    void __fastcall Button1Click(TObject *Sender);
private:    // ユーザー宣言
    TForm2 *aform2;
public:     // ユーザー宣言
    __fastcall TForm1(TComponent* Owner);
};
//---------------------------------------------------------------------------
extern PACKAGE TForm1 *Form1;
//---------------------------------------------------------------------------
#endif
Unit1.cpp
//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop

#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
    : TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
    aform2 = new TForm2(NULL);
    aform2->Show();
}
//---------------------------------------------------------------------------

結果

クリックしたフォームが前面に来るようになりました。

2018-11-06_18h59_44.png

2018-11-06_18h59_57.png

試したけどしっくりこなかった情報

備考 > fsStayOnTop

fsStayOnTopをFormStyleに指定すると、そのフォームは常に前面に出るようになります。
ただ、その場合、クリックしたウィンドウも背面のままなので、希望の動作ではありませんでした。

検索用キーワード

  • override
0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1