Передача данных между формами в 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 создает форму при запуске, и этот обработчик событий создает новый экземпляр формы, перезаписывая ссылку на автоматически созданный экземпляр. Автоматически созданный экземпляр все еще существует, но приложение больше не может получить к нему доступ. После завершения обработчика событий глобальная переменная больше не указывает на допустимую форму. Любая попытка использовать глобальную переменную может привести к сбою приложения.
Вы также можете взглянуть на создание экземпляра формы с использованием локальной переменной.