выдача ошибки при вводе 2 нулей в Edit1..Edit5

Модераторы: Hawk, Romeo, Absurd, DeeJayC, WinMain

Ответить
prikolist
Сообщения: 38
Зарегистрирован: 19 ноя 2008, 13:09

Здравствуйте! Подскажите пожалуйста,как, используя функцию,повторять вот это выражение, начиная с Edit1..Edit5.,чтоб не записывать много текста.

Код: Выделить всё

if(Edit1->Text.Length()>1)
if(Edit1->Text[1] == '0' && Edit1->Text[2]!=DecimalSeparator)
{
ShowMessage("Ошибка! Вы не поставили запятую после 1-го нуля");
return;
Тоесть,чтоб не вводить тоже самое 5 раз в Edit1,Edit2,Edit3,Edit4,Edit5.
Заранне благодарен за ответ.
Аватара пользователя
Decoder
Сообщения: 308
Зарегистрирован: 19 фев 2008, 23:11
Откуда: Moscow

Вообще правильно было бы создать суб-класс для компонента TEdit, чтобы прямо в нём проводить проверку вводимых символов. Тогда количество этих элементов на форме вообще не будет иметь значения.
Но для тебя это пока слишком сложно...
Так что могу предложить вариант по-проще:
Описать массив указателей на объекты TEdit и циклом пройти по этому массиву, проверяя у каждого элемента одно и то же свойство.
Аватара пользователя
Naeel Maqsudov
Сообщения: 2570
Зарегистрирован: 20 фев 2004, 19:17
Откуда: Moscow, Russia
Контактная информация:

А у формы на которой лежат эти Edit1...Edit5 случайно нет ли какого-нибудь свойства типа Controls, или что-то типа того?
Может массив указателей-то уже есть?
Аватара пользователя
Decoder
Сообщения: 308
Зарегистрирован: 19 фев 2008, 23:11
Откуда: Moscow

Есть возможность получить список всех элементов формы, но на форме могут быть не только Edit-ы, а ещё другие элементы, поэтому придётся их фильтровать по типу. К тому же не на все Edit-ы может распространяться данное действие.
prikolist
Сообщения: 38
Зарегистрирован: 19 ноя 2008, 13:09

Одни человек, подсказал вот так,код нижу. Расшифруйте пожалуйста,кто знает,первые три строки,что они делают?

Код: Выделить всё

void __fastcall TForm1::Button1Click(TObject *Sender)
{
TEdit *edit;
for(int i=0;i<ComponentCount;i++)
if(edit=dynamic_cast<TEdit*>(Components[i]))
if(edit->Text.Length()>1)
 if(edit->Text[1] == '0' && edit->Text[2]!=DecimalSeparator)
 {
 ShowMessage("Ошибка! Вы не поставили запятую после 1-го нуля");
 edit->SetFocus();
 return;
 }
}
Аватара пользователя
mc-black
Сообщения: 250
Зарегистрирован: 08 май 2008, 16:09
Откуда: Россия, Нижний Новгород
Контактная информация:

prikolist,
код перебирает все компоненты на форме и если среди них встречается компонент типа TEdit, то проверяется правило равенства второго символа в TEdit нулю для тех компонентов TEdit, в которые было введено более одного символа. Я мало знаком с CBuilder, но этот код написан вроде для него. В общем-то код решает твою задачу. Что касается фигурных скобок, то я бы добавил их еще две пары - для большей читабельности.

Что касается подхода методически, тут я полностью согласен с двумя путями, предложенными Decoder: сурепклассинг для очень большого количества "EDIT" в какой-нибудь "MyFPU_EDIT" или создать массив контролов типа EDIT для нескольких текстовых полей в задачах попроще.
На заказ: VBA, Excel mc-black@yandex.ru
prikolist
Сообщения: 38
Зарегистрирован: 19 ноя 2008, 13:09

Здравствуйте программисты! Объясните пожалуйста этот код. Особенно

Исходн.код :

Код: Выделить всё

for(int i=1;i<6;i++)
 {
 TEdit *b = dynamic_cast<TEdit*>(FindChildControl("Edit"+IntToStr(i)));
 if(b->Text.Length()==0)
  {
   ShowMessage("Введите значение");
   b->SetFocus();
   return;
  }
 }

Код: Выделить всё

for(int i=1;i<6;i++)
 {
 TEdit *b = dynamic_cast<TEdit*>(FindChildControl("Edit"+IntToStr(i)));
 if(b->Text.Length()==0)
Аватара пользователя
mc-black
Сообщения: 250
Зарегистрирован: 08 май 2008, 16:09
Откуда: Россия, Нижний Новгород
Контактная информация:

1. FindChildControl("Edit"+IntToStr(i)) производит поиск дочернего элемента управления с именем "Edit1", "Edit2".. "Edit5". Что за функция FindChildControl я не знаю, похоже на встроенную библиотечную функцию среды программирования CBuilder или функцию-обертку для API.
2. dynamic_cast<TEdit*>(...) производит приведение типа к указателю на класс TEdit (или шаблон класса EDIT?)
3. TEdit *b = ... Получает указатель на найденный TEdit
4. b->Text возвращает свойство Text для элемента управления переданного по указателю b
5. b->Text.Length() Возвращает длину строки, содержащуюся в элементе управления Edit
6. if(b->Text.Length()==0) Проверяет, пусто ли текстовое поле

В целом функция проверит 5 текстовых полей. Если встретится пустое поле, то для каждого пустого поля будет выведено сообщение и будет переведен фокус ввода в это текстовое поле.
На заказ: VBA, Excel mc-black@yandex.ru
Аватара пользователя
Naeel Maqsudov
Сообщения: 2570
Зарегистрирован: 20 фев 2004, 19:17
Откуда: Moscow, Russia
Контактная информация:

CBuilder (также как и Deplhi) использует VCL (Visual Component Library). Классы VCL - это формы окна и масса других контролов. Все они наследники класса Control. Этот класс имеет коллекцию Controlы (уже упомяную тут ранее), а также метод FindChildControl, который осуществляет поиск по этой самой коллекции.
Вся VCL, как в Delphi, так и в CBuilder-е доступна с исходниками.
Ответить