Передача данных между формами в Borland C++ Builder

Я разработал две формы в C++ Builder:

  • TfrmMain
  • TfrmChooseName

В классе TfrmMain у меня есть кнопка с именем btnNext. при нажатии btnNext запускается приведенный ниже код, который создает новое имя TfrmChooseName.

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

также в TfrmMain у меня есть элемент управления TEdit с именем txtInput.
В конструкторе TfrmChooseName я хочу получить текст txtInput и установить его как заголовок формы, но произошла ошибка изменения доступа!
Я также сделал оба класса друг!

2 ответа

Решение

Лучший способ справиться с этим - передать требуемое значение 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;

Я думаю, что невозможно точно определить проблему, не видя больше кода. Подружиться с классами не нужно, поскольку компоненты, добавленные с помощью дизайнера форм, в любом случае имеют открытый доступ.

Вы удалили TfrmChooseName из авто-создания форм? Если нет, а если frmChooseName глобальная переменная, указывающая на автоматически созданную форму, которая может привести к нарушению прав доступа.

В статье документации RADStudio Создание форм динамически говорится:

Примечание. Если вы создаете форму с использованием ее конструктора, убедитесь, что формы нет в списке "Автоматическое создание форм" на странице "Проект"> "Параметры"> "Формы". В частности, если вы создаете новую форму без удаления формы с тем же именем из списка, Delphi создает форму при запуске, и этот обработчик событий создает новый экземпляр формы, перезаписывая ссылку на автоматически созданный экземпляр. Автоматически созданный экземпляр все еще существует, но приложение больше не может получить к нему доступ. После завершения обработчика событий глобальная переменная больше не указывает на допустимую форму. Любая попытка использовать глобальную переменную может привести к сбою приложения.

Вы также можете взглянуть на создание экземпляра формы с использованием локальной переменной.

Другие вопросы по тегам