Форум программистов, компьютерный форум, киберфорум
C++ Builder
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.53/15: Рейтинг темы: голосов - 15, средняя оценка - 4.53
 Аватар для ODDsama
1 / 1 / 0
Регистрация: 16.02.2013
Сообщений: 44

Массовое создание TEdit

07.04.2013, 17:24. Показов 3646. Ответов 26
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
На просторах интернета нашел код для массового создания TEdit:
C++
1
2
3
4
5
6
7
8
9
10
11
12
for (int i=0;i<5;i++)
        {
        TEdit *edit = new TEdit(this);
        edit->Parent = this;
        edit->Name = "edit"+AnsiString(i);
        edit->AutoSize=False;
        edit->Height = 40;
        edit->Width = 40;
        edit->Left = 20;
        edit->Top = i*edit->Height+20;
        edit->Text = AnsiString(i);
        }
Не полностью разобрался что тут происходит особенно в этих строчках:
C++
1
2
3
TEdit *edit = new TEdit(this);
        edit->Parent = this;
        edit->Name = "edit"+AnsiString(i);
Подскажите каким образом я могу задать интервалы между ими??? И объясните кусочек, пожалуйста.
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
07.04.2013, 17:24
Ответы с готовыми решениями:

Создание собственного компонента на основе TEdit
Мне нужно создать пакет со своим компонентом в c++ builder'e на основе edit'a. В обработчик события надо прописать код, но я не могу...

Массовое переименование файлов
Здравствуйте, подскажите пожалуйста как в определенной папке (используя DirectoryListBox и FileListBox) удалить из названия файлов...

Массовое переименование файлов
Здравствуйте! Подскажите пожалуйста, в чем ошибка? //--------------------------------------------------------------------------- ...

26
Модератор
 Аватар для D1973
9954 / 6490 / 2461
Регистрация: 21.01.2014
Сообщений: 27,496
Записей в блоге: 3
06.08.2020, 09:29
Студворк — интернет-сервис помощи студентам
_BeasT_, если я правильно понял Вашу задачу:
Цитата Сообщение от _BeasT_ Посмотреть сообщение
Нужно получить из готовых Edit-ов строку: Edit1.Text +"-"+Edit2.Text+"-"+.....+ Edit[i].Text
Цитата Сообщение от _BeasT_ Посмотреть сообщение
в этих динамически созданных Edit-ах разрешить ввод только цифр
то вот можете посмотреть пример, и даже скомпилировать его, если у Вас версия ХЕ+



пример позволяет создавать столько эдитов, сколько укажет пользователь (я ограничил их количество числом 25), удалять их, вводить только цифры (в количестве не более 9) и стирать введенное при помощи Backspace... Так как при организации ограничения на ввод в событии OnKeyPress мы контролируем только ручной ввод, но не "копипасту" из буфера обмена - в результирующей строке значения полей ввода с неверными или пустыми данными заменяются нулями.
Вложения
Тип файла: rar Массовое создание TEdit.rar (4.9 Кб, 5 просмотров)
1
2 / 2 / 0
Регистрация: 18.06.2011
Сообщений: 64
06.08.2020, 12:54
С маской для динамически созданных Edit я разобрался. Сделал свое событие EditKeyPress, объявил её в .h файле и все заработало. Не смог до конца понять как к этим Edit-aм обратиться через обработчик (Sender*). Хотел в ограничении запретить ввод в Edit первым знаком 0 и подвис.
В стационарном компоненте хорошо работает и такой вариант:
C++
1
2
3
4
5
6
7
8
9
10
11
void __fastcall TForm1::Edit1KeyPress(TObject *Sender, System::WideChar &Key)
{
if((Key>='0')&&(Key<='9')){} //цыфры
        else if(Key==8){} //<-
            else Key=0; //не цыфра
if (Key == '0') // Если вводим "0"
    {
    if (Form3->Edit8->SelStart == 0)  //и курсор в начале строки, т. е. вводим первый символ
            Key = 0;   // тогда оставляем запрет на ввод "0" первым символом.
    }
}
К динамическим пытался применить таким образом и не выходит((:
C++
1
2
3
4
5
6
7
8
9
10
11
void __fastcall TForm1::EditKeyPress(TObject *Sender, System::WideChar &Key)
{
if((Key>='0')&&(Key<='9')){} //цыфры
        else if(Key==8){} //<-
            else Key=0; //не цыфра
if (Key == '0') // Если вводим "0"
    {
    if (dynamic_cast<new_LabEdit*>(Sender)->SelStart == 0)
            Key = 0;   // тогда оставляем запрет на ввод "0" первым символом.
    }
}
D1973 Примера вчера не увидел. Огромное спасибо, сейчас попробую во всём разобраться!

Добавлено через 6 минут
D1973, Огромное спасибо во всём разобрался!

Добавлено через 2 часа 54 минуты
D1973, Рано я порадовался. Вопрос у меня один остался касаемо запрета ставить первым символом 0.
Дописал процедуру обработки EKP (OnPressKey) следующим образом:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
void __fastcall TForm1::EKP(TObject *Sender, System::WideChar &Key)
{
if((Key>='0')&&(Key<='9')){} //цыфры
        else if(Key==8){} //<-
            else Key=0; //не цыфра
for(int i = 0; i < L.size(); i++)
    if ((Key == '0')&&(L[i]->SelStart == 0)) // Если вводим "0" и курсор стоит в начале строки, т. е. вводим первый символ
    {
     ShowMessage (L[i]->SelStart);
     Key = 0;   // тогда оставляем запрет на ввод "0" первым символом.*/
    }
 
}
Фишка заключается в следующем. Если создается один Edit то работает всё как нужно. Если больше одного то исключение вообще не дает ввести 0 не в один из Edit-ов.
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33479 / 21577 / 8250
Регистрация: 22.10.2011
Сообщений: 37,038
Записей в блоге: 12
06.08.2020, 13:21
А на кой вообще работать с массивом Edit-ов? Событие OnKeyPress возникает для того поля ввода, которое передано как Sender. Зачем при этом обрабатывать весь массив остальных Edit-ов?

Ресурсов слишком много, что-ли?

то вот можете посмотреть пример
Огромное спасибо. Зашел с планшета, посмотреть, увидел прикрепленный архив, который андроид не открывает, и результаты работы программы. Ну, наверное, там все круто... Код же плюс к этому выложить нельзя было в открытом виде, правда?
0
2 / 2 / 0
Регистрация: 18.06.2011
Сообщений: 64
06.08.2020, 13:44
volvo, Что то в голове у меня не то. И правда. Спасибо за замечание. Попробую реализовать.

Добавлено через 19 минут
Всё заработало через Sendler:
C++
1
2
3
4
5
6
7
8
9
10
11
12
void __fastcall TForm1::EKP(TObject *Sender, System::WideChar &Key)
{
if((Key>='0')&&(Key<='9')){} //цыфры
        else if(Key==8){} //<-
            else Key=0; //не цыфра
for(int i = 0; i < L.size(); i++)
    if ((Key == '0')&&(dynamic_cast<TEdit *>(Sender)->SelStart == 0)) // Если вводим "0" и курсор стоит в начале строки, т. е. вводим первый символ
    {
     Key = 0;   // тогда оставляем запрет на ввод "0" первым символом.*/
    }
 
}
Спасибо!
0
Практикантроп
 Аватар для nick42
4841 / 2726 / 534
Регистрация: 23.09.2011
Сообщений: 5,798
06.08.2020, 13:56
Цикл ни к чему.
Как вариант__
C++
1
2
3
4
5
6
7
8
9
10
void __fastcall TForm1::EKP(TObject *Sender, System::WideChar &Key)
{
    TEdit *edi = dynamic_cast<TEdit*>(Sender) ;
    Key = isdigit(Key)||Key==VK_BACK ? Key : NULL;
    if(Key == '0' && edi->SelStart == 0) // Если вводим "0" и курсор стоит в начале строки, т. е. вводим первый символ
    {
       ShowMessage (edi->SelStart);
       Key = 0;   // тогда оставляем запрет на ввод "0" первым символом.*/
    }
}
1
Модератор
 Аватар для D1973
9954 / 6490 / 2461
Регистрация: 21.01.2014
Сообщений: 27,496
Записей в блоге: 3
06.08.2020, 16:52
Цитата Сообщение от _BeasT_ Посмотреть сообщение
Дописал процедуру обработки EKP (OnPressKey) следующим образом:
Ну, я бы сказал, что Вы вообще выбросили все, что я в этом методе написал... Более того, до написания примера ни слова не было о том, что нельзя ноль ставить в первую позицию вводимой строки, поэтому это, естественно, учтено не было...
Цитата Сообщение от volvo Посмотреть сообщение
Код же плюс к этому выложить нельзя было в открытом виде, правда?
Вот даже не подумал об этом... Ну, виноват, исправлюсь... _BeasT_, под спойлером метод EKP() уже адаптирован под ваши озвученные нужды...
*.срр
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
#include <vcl.h>
#pragma hdrstop
 
#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
    : TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Clear(bool Prm)
{
   while(!L.empty())
    {
       delete L.back();
       L.pop_back();
    }
   btn_Del->Enabled = false;
   btn_Rez->Enabled = false;
   Label2->Caption = "";
   if(Prm)
     {
         btn_Create->Enabled = false;
         se_Amount->Value = 0;
     }
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormDblClick(TObject *Sender)
{
//Это чисто для заполнения Эдитов, чтобы руками не набирать
   Randomize();
   for(int i = 0; i < se_Amount->Value; i++)
     L[i]->Text = IntToStr(RandomRange(10, 1000));
}
//---------------------------------------------------------------------------
void __fastcall TForm1::btn_CreateClick(TObject *Sender)
{
   for(int i = 0; i < se_Amount->Value; i++)
     {
         TEdit *E = new TEdit(Pnl);
         E->Parent = Pnl;
         E->Left = 8 + (i % 5) * (E->Width + 8);
         E->Top = 8 + (i / 5) * (E->Height + 8);
         E->MaxLength = 9;
         E->OnKeyPress = EKP;
         L.push_back(E);
     }
   btn_Del->Enabled = true;
   btn_Rez->Enabled = true;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::se_AmountChange(TObject *Sender)
{
   btn_Create->Enabled = se_Amount->Value > 0;
   Clear(false);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormCreate(TObject *Sender)
{
   Clear();
}
//---------------------------------------------------------------------------
void __fastcall TForm1::btn_DelClick(TObject *Sender)
{
   Clear();
}
//---------------------------------------------------------------------------
void __fastcall TForm1::btn_RezClick(TObject *Sender)
{
   std::auto_ptr<TStringList> SL (new TStringList);
   SL->Delimiter = '-';
   int k;
   for(int i = 0; i < L.size(); i++)
     TryStrToInt(L[i]->Text, k) ? SL->Add(L[i]->Text) : SL->Add("0");
   Label2->Caption = SL->DelimitedText;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::EKP(TObject *Sender, System::WideChar &Key)
{
   TEdit *ed = dynamic_cast<TEdit*>(Sender);
   if(((Key == '0') && (ed->SelStart == 0)) || (((Key < '0') || (Key > '9')) && (Key != 8))) Key = 0;
}

*.h
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
#ifndef Unit1H
#define Unit1H
//---------------------------------------------------------------------------
#include <System.Classes.hpp>
#include <Vcl.Controls.hpp>
#include <Vcl.StdCtrls.hpp>
#include <Vcl.Forms.hpp>
#include <Vcl.ExtCtrls.hpp>
#include <Vcl.Samples.Spin.hpp>
#include <vector>
#include <System.Math.hpp>
 
//---------------------------------------------------------------------------
class TForm1 : public TForm
{
__published:    // IDE-managed Components
    TSpinEdit *se_Amount;
    TButton *btn_Create;
    TLabel *Label1;
    TButton *btn_Rez;
    TPanel *Pnl;
    TButton *btn_Del;
    TLabel *Label2;
    void __fastcall FormDblClick(TObject *Sender);
    void __fastcall btn_CreateClick(TObject *Sender);
    void __fastcall se_AmountChange(TObject *Sender);
    void __fastcall FormCreate(TObject *Sender);
    void __fastcall btn_DelClick(TObject *Sender);
    void __fastcall btn_RezClick(TObject *Sender);
private:    // User declarations
    std::vector<TEdit*> L;
    void __fastcall Clear(bool Prm = true);
    void __fastcall TForm1::EKP(TObject *Sender, System::WideChar &Key);
public:     // User declarations
    __fastcall TForm1(TComponent* Owner);
};
//---------------------------------------------------------------------------
extern PACKAGE TForm1 *Form1;
//---------------------------------------------------------------------------
#endif

volvo, буду рад замечаниям...
0
2 / 2 / 0
Регистрация: 18.06.2011
Сообщений: 64
06.08.2020, 18:04
Цитата Сообщение от D1973 Посмотреть сообщение
Ну, я бы сказал, что Вы вообще выбросили все, что я в этом методе написал... Более того, до написания примера ни слова не было о том, что нельзя ноль ставить в первую позицию вводимой строки, поэтому это, естественно, учтено не было...
Ну прошу прощения. Вы мне очень сильно помогли. А то что не было не чего сказано про первоначальный ноль, так это аппетит приходит во время еды. Там на самом деле много проверок. Но не красиво загружать и заставлять за тебя всё полностью писать. Поэтому я остальное все сам доделал. Главное благодаря Вам я понял принцип работы. За сделанный пример и потраченное на это время, отдельное спасибо! Просто не писал раньше не чего с динамически созданными компонентами. Ещё раз большое спасибо.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
06.08.2020, 18:04

Sender as TEdit c++
Доброго времени суток! Покопался в гугле, но не нашел ответа(( С плюсами только начал работать, не сердчайте Есть обработчик события...

SendMessage и TEdit.
Здравствуйте. Вопрос такой, как через SendMessage из потока передать сообщение на TEdit или TLabel, мне все равно. Желательно покажите...

Структура из TEdit
Кину пока сюда, так как незнаю куда кидать:) У меня такая проблемка - у меня создан 2х-связная динамическая кольцевая структура, каждое...

Массовое создание документов Word
необходимо сделать массовое создание документов на основе реестра в Word. функция слияния не подходит, так как переребирая данные в...

Массовое создание элементов с определенными параметрами
Добрый день, господа. Хочу узнать как массово создать определенное количество элементов упорядочные между собой и имеющие разные параметры....


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

Или воспользуйтесь поиском по форуму:
27
Ответ Создать тему
Новые блоги и статьи
Запустил конкурс "тем и промптов для текстовых квестов созданных почти чисто ИИ"
Adler 06.10.2026
Всем привет! За последние три-четыре дня я создал более 16 текстовых квестовых игр используя преимущественно по одному запросу к ИИ на игру. Мне так понравилось смотреть все ветки/ сцены во всех. . .
ИИ не может найти нужный язык в списке
Supersumestria 05.10.2026
Я ему даю вот такое изображение и прошу найти и подчеркнуть немецкий язык. Возвращает он вот это: https:/ / i. **********/ vqBWLe2. png Нужную строчку в 3й колонке просто выдумал. . Это. . .
Новая последняя моя музыка в SUNO
zorxor 05.10.2026
Здравствуйте, дорогие мои друзья! С большой радостью я хотел бы представить вам свою новую последнею музыку, которую сгенерировала мне по моей просьбе нейросеть SUNO. С уважением, zorxor. Это. . .
Nekobox - outbounds[0].transport: unknown transport type: raw
damix 01.10.2026
Фикс ошибки Правым кликом по серверу -> отладочная информация -> edit Заменить "net": "raw", на "net": "tcp", Нажать кнопку reload.
Программный домашний кинотеатр
russiannick 27.09.2026
Сподобился на программный домашний кинотеатр. В качестве ЯВУ по традиции выбрал js. В помощники взял Яндекс-Алису. Было создано три зала на разные интересы. исторические и ретро сериал Хичкок. . .
Беседа с ИИ о программистах, недопускающих к созданию и правке кода генеративные ИИ и причины этого
zorxor 21.09.2026
Раньше я радовался или получал некоторые эмоции, пусть небольшие, но всё же, от самого процесса написания кода, рекомпиляции и запуска, видя постепенное развитие программы и прочее. А теперь лень. . .
Мобильное приложение ColorStep
pavlinmavlin 17.09.2026
Реализовал приложение Красный, Зеленый, Синий в Unity3d + c#. Название изменил на ColorStep. Приложение прошло модерацию и теперь доступно для скачивания. Делал его сам, шаг за шагом — и вот,. . .
Запрет дублирования строк в табличной части
Maks 13.09.2026
Реализация из решения ниже выполнена на нетиповом справочнике "Нормы ТО" с табличной часть "Виды ТО", разработанного в КА2, со следующими реквизитами: - ВидТО (СправочникСсылка. ВидыТО); - ВидГСМ. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru