0

複数のフォームを使用してVCLフォームアプリケーションを作成しています。formCreateAppointmentという新しいフォームを作成しました。

menuItemのこのコードを介してフォームをロードしようとしています:

formCreateAppointment.Show();

このエラーが発生します:

E2451未定義のシンボル'formCreateAppointment'

このフォームを「グローバル」オブジェクトまたは類似のものとして宣言する必要がありますか?

ありがとう

より詳しい情報

フォーム'formCreateAppointment'は、[プロジェクト]->[オプション]->[フォームの自動作成]の下にあります。コードを使用する場合:

formCreateAppointment->Show();

コードがコンパイルされず、次のエラーが発生します。

E2451未定義のシンボル'formCreateAppointment'

4

2 に答える 2

2

IDEで新しいFormクラスを作成すると、生成された.hppファイルにグローバルポインタが含まれます。例:

#ifndef Unit2H
#define Unit2H

#include <Classes.hpp>
//...

class TformCreateAppointment : public TForm
{
    //...
}; 

extern PACKAGE TformCreateAppointment *formCreateAppointment; // <-- here

#endif

#includeその.hppファイルをメインコードにインクルードしていないようです。例:

#include "Unit2.hpp" // (or whatever you decided to name that Form's unit as)

プロジェクトオプションでそのフォームを自動作成するように設定した場合、そのグローバルポインターは、プログラムの起動時に(Application->CreateForm()プロジェクトのWinMain()関数にへの呼び出しを挿入することにより)自動的にインスタンス化されます。newそれ以外の場合は、代わりに演算子を使用してコードで手動でインスタンス化する必要があります。

いずれにせよ、変数はポインターです。VCLオブジェクトはスタックでインスタンス化できず、ヒープのみでインスタンス化できます。->Formオブジェクトのメンバーにアクセスするには、演算子を使用する必要があります。例:

formCreateAppointment->Show(); 

代わりに演算子を使用する場合は.、最初にポインターを逆参照する必要があります。

(*formCreateAppointment).Show(); 
于 2012-09-24T20:14:44.430 に答える
0

どうやらあなたはどこか別の場所でローカル変数としてフォームを作成したので、それを呼び出そうとしている場所からフォームにアクセスできないのはそのためです。

これを解決するには、次の3つのアプローチを使用できます。

  • 表示する正確な場所にフォームを作成します。ただし、これは1か所からフォームを呼び出す場合にのみ機能します
  • グローバル変数として作成します。
  • ヒープに作成し、メインフォームにポインタを格納します。例えば:

    class MyMainForm
    {
    public:
        MyMainForm()
        {
            //create the form in the constructor
            formCreateAppointment = new myOtherForm();
        }
        ~MyMainForm()
        {
            delete formCreateAppointment;
        }
        //code
    private:
        myOtherForm * formCreateAppointment;
    }
    
于 2012-09-24T07:18:49.517 に答える