4

私はc++ビルダーで2つのフォームを設計しました:

  • TfrmMain
  • TfrmChooseName

TfrmMainクラスには、btnNextという名前のボタンがあります。btnNextをクリックすると、以下のコードが実行され、新しいTfrmChooseNameが作成されます。

frmChooseName = new TfrmChooseName(this);
this->Hide();
frmChooseName->ShowModal();
this->Show();
delete frmChooseName;
frmChooseName = NULL;

また、TfrmMainには、txtInputという名前のTEditコントロールがあります。
TfrmChooseNameのcostructorで、txtInputのテキストを取得し、フォームのキャプションとして設定したいのですが、アクセスボリュームエラーが発生しました。
私も両方のクラスを友達にしました!

4

2 に答える 2

3

これを処理する最良の方法は、値を探すようにコーディングするのではなく、目的のCaption値をコンストラクター自体に渡すことです。例:

__fastcall TfrmChooseName(TComponent *Owner, const String &ACaption)
    : TForm(Owner)
{
    Caption = ACaption;
}

frmChooseName = new TfrmChooseName(this, txtInput->Text);

または、コンストラクターの終了後にキャプションを設定することもできます。例:

frmChooseName = new TfrmChooseName(this);
frmChooseName->Caption = txtInput->Text;
于 2012-12-25T23:51:13.937 に答える
2

より多くのコードを見ずに正確な問題を検出することは不可能だと思います。フォームデザイナを使用して追加されたコンポーネントはとにかくパブリックアクセスできるため、クラスを友達にする必要はありません。

TfrmChooseName自動作成フォームから削除しましたか?そうでない場合、およびfrmChooseNameが自動作成されたフォームを指すグローバル変数である場合、アクセス違反が発生する可能性があります。

RADStudioドキュメントの記事「フォームを動的に作成する」には次のように書かれています。

注:コンストラクターを使用してフォームを作成する場合は、フォームが[プロジェクト]>[オプション]>[フォーム]ページの[フォームの自動作成]リストにないことを確認してください。具体的には、リストから同じ名前のフォームを削除せずに新しいフォームを作成すると、Delphiは起動時にフォームを作成し、このイベントハンドラーはフォームの新しいインスタンスを作成して、自動作成されたインスタンスへの参照を上書きします。自動作成されたインスタンスはまだ存在しますが、アプリケーションはそのインスタンスにアクセスできなくなります。イベントハンドラーが終了すると、グローバル変数は有効なフォームを指しなくなります。グローバル変数を使用しようとすると、アプリケーションがクラッシュする可能性があります。

ローカル変数を使用したフォームインスタンスの作成もご覧ください。

于 2012-12-25T23:50:42.800 に答える