Форум программистов, компьютерный форум, киберфорум
C++ Builder
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.55/11: Рейтинг темы: голосов - 11, средняя оценка - 4.55
7 / 0 / 0
Регистрация: 02.02.2012
Сообщений: 39

Создание собственного компонента, происходящего от Edit

04.02.2013, 18:24. Показов 2534. Ответов 17
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Нужна помощь. Надо создать собственный компонент, типа Edit, но чтобы в нём вводилась информация в виде даты ( то есть в таком виде: дд.мм.гг). Думал сделать через Keypressed, но когда же создаешь компонент, оператора Key не определяет. Думал, думал, как сделать... Не придумал... Прошу помочь, буду очень благодарен, т.к. компонент нужен на завтра.

Заранее, огромное спасибо!
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
04.02.2013, 18:24
Ответы с готовыми решениями:

Создание собственного компонента. Как?
Доброго всем времени суток. Пишу клиент-серверное приложение на основе Client ~ServerSocket'ов При общении клиента с сервером...

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

Создание собственного компонента: Ошибка Unresolved external
Всем привет. Есть задание: Построить класс - потомок класса TStringGrid, у объектов которого при нажатии клавиши F11 исчезают...

17
 Аватар для BRcr
4043 / 2333 / 292
Регистрация: 03.02.2011
Сообщений: 5,066
Записей в блоге: 10
04.02.2013, 20:21
Стандартный TDateTimePicker - не вариант?
0
Практикантроп
 Аватар для nick42
4841 / 2726 / 534
Регистрация: 23.09.2011
Сообщений: 5,798
04.02.2013, 20:55
Если только я правильно понял...
В меню Боланда выбрать Component-New Component. Появится вот такая панель__

Там нужно выбрать TEdit, изменить имя создаваемого сомпонента (напр. TEditMF ) и указать папку (желательно пустую), куда будет сохраняться вся база для компонента. Затем нажать Install... и подтвердить использование пакета Borland User Components.. Новый компонент будет создан и должен появиться во вкладке Samples (если не меняли в процессе установок). Далее нужно просто добавить несколько строчек в файлы .cpp и .h и заново перекомпилировать пакет Borland User Components, чтобы в новом компоненте появилось требуемое свойство.
1
7 / 0 / 0
Регистрация: 02.02.2012
Сообщений: 39
04.02.2013, 22:13  [ТС]
BRcr, нет. Задание стоит именно в том, чтобы создать компонент, происходящий от Edit,например, EditDate. Особенность его в том, чтобы в него можно было вводить только дату, в стандартном формате.

Добавлено через 57 секунд
nick42, спасибо, конечно, но я знаю как создавать сам компонент. Я не могу понять как именно можно реализовать мою задачу - Edit для ввода даты.
0
Практикантроп
 Аватар для nick42
4841 / 2726 / 534
Регистрация: 23.09.2011
Сообщений: 5,798
04.02.2013, 22:39
Цитата Сообщение от tempestelectro Посмотреть сообщение
спасибо, конечно, но я знаю как создавать сам компонент. Я не могу понять как именно можно реализовать мою задачу - Edit для ввода даты.
тоже не очень сложно;
вот, например, я записал в хедер:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
//---------------------------------------------------------------------------
class PACKAGE TEditMF : public TEdit
{
private:
     AnsiString __fastcall GetmfDate();
     void __fastcall SetmfDate(AnsiString);
protected:
public:
        __fastcall TEditMF(TComponent* Owner);
__published:
//     TDateTime *moDaT;
   __property  AnsiString mfDate= {read=GetmfDate, write=SetmfDate, nodefault};
};
//---------------------------------------------------------------------------
Этим определили новое свойство mfDate у компонента TEditMF. В cpp файле нужно записать:
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
//---------------------------------------------------------------------------
 
#include <vcl.h>
#pragma hdrstop
 
#include "EditMF.h"
#pragma package(smart_init)
//---------------------------------------------------------------------------
static inline void ValidCtrCheck(TEditMF *)
{
        new TEditMF(NULL);
}
//---------------------------------------------------------------------------
__fastcall TEditMF::TEditMF(TComponent* Owner)
        : TEdit(Owner)
{
}
//---------------------------------------------------------------------------
   TDateTime moDaT;
//---------------------------------------------------------------------------
AnsiString __fastcall TEditMF::GetmfDate()
{
   AnsiString mDate = DateToStr(moDaT) ;
 
   return mDate ;
}
//---------------------------------------------------------------------------
void __fastcall TEditMF::SetmfDate(AnsiString Str)
{
    moDaT = StrToDate(Str);
}
//---------------------------------------------------------------------------
namespace Editmf
{
        void __fastcall PACKAGE Register()
        {
                 TComponentClass classes[1] = {__classid(TEditMF)};
                 RegisterComponents("Samples", classes, 0);
        }
}
//---------------------------------------------------------------------------
Это не вполне верно теоретически (ячейка хранения TDateTime не красиво записана), но это работает, а я практик; мне важно, чтоб был результат, (даже если часть за меня сделает Боландовский оптимизатор).

Добавлено через 2 минуты
Хотя, это скорей всего не то. Здесь у компонента добавляется свойство ДАТА, которое ему как пятая нога. А требуется, вероятно, форматный ввод в поле эдита. То-есть нужно у существующего эдита изменить обработку ввода в поле данных.
0
Эксперт С++
 Аватар для Avazart
8488 / 6155 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
04.02.2013, 22:55
Цитата Сообщение от tempestelectro Посмотреть сообщение
BRcr, нет. Задание стоит именно в том, чтобы создать компонент, происходящий от Edit,например, EditDate. Особенность его в том, чтобы в него можно было вводить только дату, в стандартном формате.
TDateTimePicker тоже это могЁт - там в свойствах выставить надо...
0
7 / 0 / 0
Регистрация: 02.02.2012
Сообщений: 39
04.02.2013, 23:02  [ТС]
Мне нужно сделать это именно с эдитом, в этом-то и вся проблема...
0
Эксперт С++
 Аватар для Avazart
8488 / 6155 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
04.02.2013, 23:07
Дума добавить поле TDate добавить поле TDate в компонент не проблема как и ковертить его в строку и обратно?

Как я понимаю основная проблема в запрете ввода значений не по формату даты ?
0
 Аватар для BRcr
4043 / 2333 / 292
Регистрация: 03.02.2011
Сообщений: 5,066
Записей в блоге: 10
05.02.2013, 00:12
Формат блюсти, на мой взгляд, проще всего через регулярки. На каждом onchange эдита проверять формат по регулярке и откатывать, если не совпадает, вот и все. Правда, придется использовать буст\TRegExp\lua...
0
Эксперт С++
 Аватар для Avazart
8488 / 6155 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
05.02.2013, 00:42
Цитата Сообщение от BRcr Посмотреть сообщение
Формат блюсти, на мой взгляд, проще всего через регулярки. На каждом onchange эдита проверять формат по регулярке и откатывать, если не совпадает, вот и все. Правда, придется использовать буст\TRegExp\lua...
Вообще есть класс TMask его можно использовать...

Добавлено через 6 минут
http://docwiki.embarcadero.com... sk.Matches

Добавлено через 5 минут
Ну или http://docwiki.embarcadero.com... C%2B%2B%29

Добавлено через 16 минут
В общем не особо заморачиваясь написал такой пример
C++
1
2
3
4
5
6
7
8
9
10
11
//---------------------------------------------------------------------------
#include <Masks.hpp>
#include <memory>
//---------------------------------------------------------------------------
void __fastcall TForm1::ToolButton9Click(TObject *Sender)
{
 String Text= "10.10.2010";
 std::auto_ptr<TMask> Mask(new TMask("[0-9][0-9].[0-9][0-9].[0-9][0-9][0-9][0-9]") );
 if( Mask->Matches(Text) ) ShowMessage("Matched!");
}
//---------------------------------------------------------------------------
http://cppbuilder.ru/articles/0093.php
0
05.02.2013, 01:10

Не по теме:

О, еще одна реализация регулярок! Ddv122 будет рад узнать, а то с бустом не дружит.:)

0
7 / 0 / 0
Регистрация: 02.02.2012
Сообщений: 39
05.02.2013, 10:41  [ТС]
Avazart, внёс код - ничего не получилось. Прописывается, как в простом эдите
0
Эксперт С++
 Аватар для Avazart
8488 / 6155 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
05.02.2013, 11:58
Ясное дело это же только пол роботы, а вы хотели готовое на блюдЯчке ?
0
Практикантроп
 Аватар для nick42
4841 / 2726 / 534
Регистрация: 23.09.2011
Сообщений: 5,798
05.02.2013, 12:49
.. и готовое уже есть... - компонент MaskEdit , вкладка Additional
1
7 / 0 / 0
Регистрация: 02.02.2012
Сообщений: 39
05.02.2013, 13:15  [ТС]
Avazart, если вам не составит труда, можете показать или просто объяснить, что и куда ещё нужно вписать?

Извините за возможную наглость, но я пока что в в билдере не полностью разбираюсь, а компонент нужен срочно. Конечно, сам виноват, где-то поленился, не разобрался... В дальнейшем не буду задавать таких вопросов.

Добавлено через 25 минут
Nick42, да, действительно есть, не заметил. Мне в ВУЗЕ преподаватель задал сделать чисто эдит для ввода даты, то есть, что стандартными свойствами и событиями, но чтобы в само поле можно было вводить только дату ( стандартный формат: дд.мм.гггг).
0
Эксперт С++
 Аватар для Avazart
8488 / 6155 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
05.02.2013, 14:53
Цитата Сообщение от tempestelectro Посмотреть сообщение
Avazart, если вам не составит труда, можете показать или просто объяснить, что и куда ещё нужно вписать?
Ну так что тут объяснять обрабатываете OnChange() или OnKeyPress() проверяйте маску, проверяйте положение каретки.

Добавлено через 1 минуту
Тут с налёта вряд ли получится нужно играться.

Добавлено через 53 минуты
Ну вот примерчик как запретить ввод "не даты" в 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
//---------------------------------------------------------------------------
void __fastcall TForm1::FormCreate(TObject *Sender)
{
Edit1->Text= Date().DateString();
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Edit1KeyDown(TObject *Sender, WORD &Key, TShiftState Shift)
 
{
if(Key!=VK_LEFT && Key!=VK_RIGHT)   Key= 0;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Edit1KeyPress(TObject *Sender, System::WideChar &Key)
{
    if(  Key>='0' && Key<='9');
     {
            int OldStart= Edit1->SelStart;
            String Text=  Edit1->Text;
            int index= Edit1->SelStart+1;
 
            if(index<=Text.Length() && Text[index]!='.')
                {
                    Text[index]= Key;
                    TDate D;
                    if( TryStrToDate(Text,D) )
                        {
                            Edit1->Text= Text;
                            Edit1->SelStart= OldStart+1;
                        }
                }
     }
    Key= 0;
}
//---------------------------------------------------------------------------
0
7 / 0 / 0
Регистрация: 02.02.2012
Сообщений: 39
05.02.2013, 16:09  [ТС]
Аа. так в простом эдите я ещё могу как-то сделать, но мне нужен новый компонент, типа эдит, но чтобы в нём вводилась только дата. Пробовал сначала сделать через Keypress, но свойства такого там нету. Может быть через __property его добавить, но тогда будет определяться оператор Key?
0
Эксперт С++
 Аватар для Avazart
8488 / 6155 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
05.02.2013, 16:11
Вы же говорили что умеете создавать новые компоненты ?

Так что флаг в руки ( ну либо книгу Архангельского )
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
05.02.2013, 16:11
Помогаю со студенческими работами здесь

Создание собственного VCL компонента. Динамическое изменение количества колонок в зависимости от размера объекта
Доброго времени суток всем. Решил при создании своего компонента на основе TStringGrid инкапсулировать в него ряд свойств. Хочется...

Создание собственного компонента
Здравствуйте, требуется создать компонент рабочей программы (TCustomPanel (ExtCtrls)). Собственно, после редактирования исходной программы...

Создание собственного компонента
Доброго времени суток!!! Возникла идея создания собственного универсального компонента, у которого было бы свойство Type ...

Создание собственного компонента
Всем привет! Я хочу переписать аудиоплеер с swing на javafx. Как на javafx создать свой компонент - звукову дорожку waveform?

Создание собственного компонента
Ребята, помогите разобраться плиз. Создаю собственный компонент: unit EditId; interface uses System.SysUtils,...


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

Или воспользуйтесь поиском по форуму:
18
Ответ Создать тему
Новые блоги и статьи
Символьное дифференцирование
igorrr37 13.02.2026
/ * Логарифм записывается как: (x-2)log(x^2+2) - означает логарифм (x^2+2) по основанию (x-2). Унарный минус обозначается как ! */ #include <iostream> #include <stack> #include <cctype>. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru