Форум — Ответы     (  К темам )
 ?  mal: Как передать по ссылке объект типа TEdit? (27-03-2003 00:03:45)
Ситуация:
На форме есть несколько полей редактирования типа TEDit. При вводе в них данных необходимо выполнять проверку введенных значений определенным условиям. При попытке передать в функцию-тестер ссылки на объект TEdit компилятор выдает ошибку!

Пример кода:
void __fastcall TCalc::Bee5ColChange(TObject *Sender)
{
TestCol(Bee5Col);
}

В заголовочном файле объявлено:
void __fastcall TestCol(TEdit);

Сообщение об ошибке:
[C++ Error] Calc.cpp(21): E2459 VCL style classes must be constructed using operator new
 Георгий (27-03-2003 00:14:21)
ты передаёшь в эту ф-цию не ссылку на обьект, а копию
надо писать так:
void __fastcall TestCol(TEdit*);
или
void __fastcall TestCol(TEdit&);
т.е. передавать или указатель или ссылку
 Павел (27-03-2003 14:31:08)
А кроме того, если обработка идет в стандартном обрабочике события,
можете использовать указатель Sender на объект. в котором произошло
событие (не забыв привеети его к реальному типу объекта)

например, для всех Edit-ов на форме указать один обработчик события:

void __fastcall TForm1::Edit1Change(TObject *Sender)
{
Label1->Caption = ((TEdit*)Sender)->Text;
}
 Георгий (27-03-2003 17:56:03)
Павел:
"((TEdit*)Sender)" — это очень опасное преобразование — лучше так

TEdit *ptrEdit;
ptrEdit=dynamic_cast<TEdit*>(Sender);
if (ptrEdit)
Label1->Caption=ptrEdit->Text;
 mal (27-03-2003 23:08:39)
Спасибо!!!
Только вариант

void __fastcall TestCol(TEdit&);

почему-то работать не хочет — компилятор ругается, а

void __fastcall TestCol(TEdit*);

компилируется нормально.
 denver (02-05-2003 11:11:31)
народ, объясните, пожалуйста, зачем передавать в функцию-обработчик ВЕСЬ компонент TEdit?
не эффективнее ли передавать, скажем, Edit1->Text и принимать в обработчике строку?