С Новым годом! Форум программистов, компьютерный форум, киберфорум
C++ Builder
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.54/26: Рейтинг темы: голосов - 26, средняя оценка - 4.54
1 / 1 / 0
Регистрация: 24.01.2010
Сообщений: 10

2 события onChange не работают с двумя Edit

13.11.2010, 12:00. Показов 5029. Ответов 10
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте . Нужно создать программу которая подсчитывает длину гипотенузы в прямоугольном треугольнике. После этого при изменении одного из катетов должен изменяться второй при той же длинне гипотенузы.

Программа работает , если onChange включено в каком то одном Edit , если включить в обоих то программа компилируется без ошибок , но при работе возникает ошибка

вот код:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
#include <vcl.h>
#pragma hdrstop
 
#include "U_lab4.h"
#include <math.h>
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
}
//---------------------------------------------------------------------------
float a,b,gip;
int flag,flas;
 
 
 
 
void __fastcall TForm1::Button1Click(TObject *Sender)
{
if ((Edit1->Text).Length()==0||(Edit2->Text).Length()==0||
Edit1->Text=='a'||Edit2->Text=='b')
  {
 
 
 
 
 
 
      if((Edit2->Text).Length()==0||Edit2->Text=='b')
      {ShowMessage("Введите катет 1");
       Edit2->SetFocus();
       }
 
 
      if((Edit1->Text).Length()==0||Edit1->Text=='a')
      {ShowMessage("Введите кактет 2");
       Edit1->SetFocus();
 
       }
 
     }
 
 
 
 
     else
{
try
 {a=StrToFloat(Edit1->Text);
 b=StrToFloat(Edit2->Text);
 
 
}
 
 catch (EConvertError &e)
 {ShowMessage("данные не были введены");
  return;
 }
 
}
 
gip=sqrt(b*b+a*a);
 
 
Label4->Caption=FloatToStrF(gip,ffGeneral,7,3);
flag=1;
 
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Edit1Change(TObject *Sender)
{
 
if(flag==1&&flas!=3)
{float pp;
 
 
try
 {a=StrToFloat(Edit1->Text);
 
}
 
 catch (EConvertError &e)
 {ShowMessage("данные не были введены");
  return;
 }
 
 
 
float b1=sqrt(gip*gip-a*a);
Edit2->Text=FloatToStr(b1);
flas=2;
}
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Edit2Change(TObject *Sender)
{/*
if(flag==1&&flas!=2)
{
try
 {
 b=StrToFloat(Edit2->Text);
 
 
}
 
 catch (EConvertError &e)
 {ShowMessage("данные не были введены");
  return;
 }
 
 
float a1=sqrt(gip*gip-b*b);
Edit2->Text=FloatToStr(a1);
flas=3;
}  */
}
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
13.11.2010, 12:00
Ответы с готовыми решениями:

Вызов события OnChange программно
Есть 10 компонентов хот-кеив, хочу вызвать события OnChange у всех. Всем присвоил тег 1 Такой код не работает: for(int...

Поиск в OnChange в edit
Необходимо реализовать выделение как на картинке, во время поиска по базе. Как это сделать? Я знаю, что такое выделение срабатывает во...

Вычисления по условию. События OnChange
Помогите, пожалуйста, с заданием. Не могу понять, с какими формулами работать, по которым будут пересчитываться значения. Создать...

10
Почетный модератор
 Аватар для Lord_Voodoo
8785 / 2538 / 144
Регистрация: 07.03.2007
Сообщений: 11,873
13.11.2010, 12:38
Jenek__89, вам надо преобразорвывать параметр Sender в TEdit и с ним работать, тогда никаких проблем не будет

C++
1
TEdit* edit = dynamic_cast <TEdit*>(Sender);
или хотя бы так:
C++
1
TEdit* edit = (TEdit*)Sender;
0
1 / 1 / 0
Регистрация: 24.01.2010
Сообщений: 10
13.11.2010, 15:00  [ТС]
Я только начинаю осваивать Builder и не чего не понял.
не могли бы вы поподробнее описать обработчик события onChange и закоментировать строки?

Добавлено через 1 час 56 минут
как использовать переменную edit?
0
42 / 42 / 12
Регистрация: 04.11.2010
Сообщений: 119
20.11.2010, 10:27
А как тебе такая реализация программы:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
//---------------------------------------------------------------------------
 
#include <vcl.h>
#include <math.h>
#define sqr(x) (x)*(x)
#pragma hdrstop
 
#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
double a, b, c;  //измерения треугольника
bool flag=false; //нажата ли кнопка
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
}
//---------------------------------------------------------------------------
 
void __fastcall TForm1::Button1Click(TObject *Sender)
{
  a=StrToFloat(Edit1->Text);
  b=StrToFloat(Edit2->Text);
  c=sqrt(sqr(a)+sqr(b));
  flag=true; //кнопка нажата
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Edit1Change(TObject *Sender)
{
  if(flag==true && Edit1->Text.Length())
  {
    a=StrToFloat(Edit1->Text);
    b=sqrt(sqr(c)-sqr(a));
    Edit2->Text=FloatToStr(b);
  }
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Edit2Change(TObject *Sender)
{
  if(flag==true && Edit2->Text.Length())
  {
    b=StrToFloat(Edit2->Text);
    a=sqrt(sqr(c)-sqr(b));
    Edit1->Text=FloatToStr(a);
  }
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Edit1KeyPress(TObject *Sender, char &Key)
{
  switch(Key)  //вводим только цифры и десятичный разделитель
  {
   case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7':
   case '8': case '9': case 8:break;
   case ',':
           {
             if(Edit1->Text.Pos(Key)!=0) Key=0;
             break;
           }
   default: Key= 0;
  }
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Edit2KeyPress(TObject *Sender, char &Key)
{
  switch(Key)  //вводим только цифры и десятичный разделитель
  {
   case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7':
   case '8': case '9': case 8:break;
   case ',':
           {
             if(Edit2->Text.Pos(Key)!=0) Key=0;
             break;
           }
   default: Key= 0;
  }
}
//---------------------------------------------------------------------------
0
Эксперт С++
 Аватар для MikeSoft
3956 / 1811 / 184
Регистрация: 21.11.2009
Сообщений: 2,540
20.11.2010, 14:46
Evgen88, используйте приведение к типу TEdit параметра Sender и ваш код сократится в два раза.
0
42 / 42 / 12
Регистрация: 04.11.2010
Сообщений: 119
20.11.2010, 15:36
То есть нужно объявить глобальный объект TEdit *Edit, а в обработчиках событий для эдитов присваивать ему с соотв. преобразованием адрес Sender и использовать его вместо имен эдитов? Я правильно понимаю?
0
Эксперт С++
 Аватар для MikeSoft
3956 / 1811 / 184
Регистрация: 21.11.2009
Сообщений: 2,540
20.11.2010, 16:03
Evgen88, нет, не нужно глобальных указателей.
Прототип обработчика для события OnKeyPress имеет вид:
C++
1
void __fastcall TForm1::Edit1KeyPress(TObject *Sender, char &Key)
Вы описываете одно и то же для каждого TEdit'a.
Зачем, если можно воспользоваться параметром Sender и назначить одну функцию на все подобные объекты?

Простенький пример:
C++
1
2
3
4
5
6
7
8
9
void __fastcall TForm1::Edit1KeyPress(TObject *Sender, wchar_t &Key)
{
  if (!(Key >= '0' && Key <= '9')) {
    Key = 0;
    return;
  } else {
    ((TEdit *)Sender)->Text = " <- Введённая цифра";
  }
}
Назначьте этот обработчик для объектов, нуждающихся в одинаковых событиях.
0
42 / 42 / 12
Регистрация: 04.11.2010
Сообщений: 119
20.11.2010, 19:24
А какой класс нужно использовать для преобразования типов и доступности поля Text?
TEdit является родительским для подобного рода объектов?
0
Эксперт С++
 Аватар для MikeSoft
3956 / 1811 / 184
Регистрация: 21.11.2009
Сообщений: 2,540
20.11.2010, 19:47
Evgen88, немного не понял вашего вопроса.
При размещении компонента вам ясно показывают класс объекта: для поля ввода текста это TEdit.
В случае с заданием функции для события - вы знаете, что Sender будет ссылаться на объект класса TEdit.

Если всё же не уверены, что объект будет именно этого класса, существует ряд проверок, которыми следует воспользоваться.

Например:
C++
1
2
3
4
5
6
7
8
9
10
11
TEdit *Edit = NULL;
try {
  Edit = dynamic_cast <TEdit *> (Sender);
  if (Edit) {
    Edit->Text = "TObject has been successfully casted to TEdit";
    ShowMessage(Edit->Text);
    Edit = NULL;
  }
} catch (...) {
  ShowMessage("Error while casting TObject to TEdit...");
}
0
42 / 42 / 12
Регистрация: 04.11.2010
Сообщений: 119
20.11.2010, 21:07
Я имел ввиду то, что если например создать универсальную функцию для запрета ввода цифр в объектах классов TEdit, TLabeledEdit, то для доступности поля Text достаточно определить указатель на объект Sender как указатель на требуемый класс (в данном случае TEdit, imho, он родительский для TLabeledEdit): TEdit *Edit=(TEdit *)Sender. И потом данную функцию использовать в OnKeyPress объектов этих классов. Принцип подстановки тут будет работать (везде где можно использовать объект родительского класса, можно использовать и объект класса потомка)? То есть мы в данную функцию передадим Sender и там уже его используем для создания объекта класса обладающего необходимой функциональностью, таким образом мы применим к объекту Sender метод объявленный в классах наследниках где этот метод имеется.

Ваши замечания по-поводу сокращения объема кода касаются и событий EditChange я правильно понял?
0
Эксперт С++
 Аватар для MikeSoft
3956 / 1811 / 184
Регистрация: 21.11.2009
Сообщений: 2,540
20.11.2010, 23:14
Цитата Сообщение от Evgen88 Посмотреть сообщение
(в данном случае TEdit, imho, он родительский для TLabeledEdit)
TLabeledEdit порождён из TCustomLabeledEdit, который в свою очередь порождён из TCustomEdit.

Цитата Сообщение от Evgen88 Посмотреть сообщение
Ваши замечания по-поводу сокращения объема кода касаются и событий EditChange я правильно понял?
События OnKeyPress и OnChange. Можно оставить по одному обработчику события.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
20.11.2010, 23:14
Помогаю со студенческими работами здесь

Нужно избавиться от события onchange
Я получаю select парсингом (JS), а в селекте есть встроенное событие onchange от которого нужно избавиться, чтобы выполнялось событие из...

Как сделать onChange для 2-х edit?
Необходимо что-то типо обменника (см. скрин), т.е вводишь в первый edit значения по формуле записываются во 2-й и тоже самое и для второго....

Обработчик события onChange для компонента label
Как создать обработчик события onChange для компонента label?

обработка OnChange для программно созданного edit
У меня есть ed:tedit и but:tbutton я их создал так: ed:=tedit(form1); ed.parent=form1; там далье параметры задал left и top, тоже самое...

Как получить значение Select в обработчике события Onchange???
Есть следующий код: &lt;script language='JavaScript'&gt; function SelectMaterial(obj) { ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Новые блоги и статьи
Модель микоризы: классовый агентный подход
anaschu 02.01.2026
Раньше это было два гриба и бактерия. Теперь три гриба, растение. И на уровне агентов добавится между грибами или бактериями взаимодействий. До того я пробовал подход через многомерные массивы,. . .
Учёным и волонтёрам проекта «Einstein@home» удалось обнаружить четыре гамма-лучевых пульсара в джете Млечного Пути
Programma_Boinc 01.01.2026
Учёным и волонтёрам проекта «Einstein@home» удалось обнаружить четыре гамма-лучевых пульсара в джете Млечного Пути Сочетание глобально распределённой вычислительной мощности и инновационных. . .
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru