Форум программистов, компьютерный форум, киберфорум
C++ Builder
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.83/54: Рейтинг темы: голосов - 54, средняя оценка - 4.83
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30

Компонента для выбора даты

03.08.2011, 20:57. Показов 11643. Ответов 31
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Есть компонента TDateTimePicker. Она меня не устраивает тем, что в поле типа Edit, которое прилагается к компоненте, нельзя ввести пустое значение. Мне нужно что-то типа следующего. Поле ввода, по типу Edit, в которое нужно ввести дату (типа "21.03.2007") и при этом чтобы была возможность ткнуть в кнопочку и чтобы при этом появился миникалендарик для выбора даты мышкой. При этом пустое поле ввода будет трактоваться таким образом, что данная настройка попросту не установлена

Вариант с дополнительной галочкой типа "учитывать или не учитывать настройку" не предлагать
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
03.08.2011, 20:57
Ответы с готовыми решениями:

DbGrid, календарь для выбора даты
Кто знает,как поместить календарь в ячейку (столбец) DBGrid и выбирать из него дату (день,месяц,год) ? Спасибо

Вывод времени в DBGrid из компонента DateTimePicker (без даты)
Здравствуйте, подскажите, пожалуйста, есть ли способ в DBGrid вывести время из компонента DateTimePicker без даты, которая стоит по...

Запрет выбора прошедшей даты в DateTimePicker'e
Здравствуйте. Можно ли запретить выбор прошедшей даты в DateTimePicker'e? В гуглях ничего не нашёл, может быть плохо искал.:)

31
 Аватар для Maluda
1280 / 598 / 116
Регистрация: 18.08.2009
Сообщений: 832
03.08.2011, 23:07
Создай свой компонент. Возьми за базовый TDateTimePicker и переопредели OnChange,
если я не ошибаюсь этот метод виртуальный.
2
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30
03.08.2011, 23:29  [ТС]
Своё создавать пока не умею. А есть что-то типа TDateTimePicker'а, но только без Edit'а? Т.е. чтобы только стрелочка для выпадающего календарика была?
0
 Аватар для Maluda
1280 / 598 / 116
Регистрация: 18.08.2009
Сообщений: 832
04.08.2011, 00:07
Лучший ответ Сообщение было отмечено как решение

Решение

Цитата Сообщение от Evg Посмотреть сообщение
Своё создавать пока не умею.
Настоятельно советую это дело освоить, так как - это лучшее свойство VCL - гибкая модернизация
компонентов под свои нужды.

Ну, а для твоей задачи сейчас набросаю код

Добавлено через 30 минут
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
AnsiString sEditText = "";
bool bDateSet = false;
 
void __fastcall OnMonthCalendarDblClick(void *AThis, TObject *Sender) {
    TMonthCalendar *AMonthCalendar = dynamic_cast<TMonthCalendar*>(Sender);
    if (AMonthCalendar) {
        sEditText = AMonthCalendar->Date.DateTimeString();
        bDateSet = true;
    }
}
 
void SetDateTimeToEdit(TWinControl *AWinOwner, TEdit *AEdit, TButton *AButton) {
    bDateSet = false;
 
    TMonthCalendar* AMonthCalendar = new TMonthCalendar(AWinOwner);
    AMonthCalendar->Parent = AWinOwner;
    AMonthCalendar->BringToFront();
    // получаем экранные координаты кнопки
    const TPoint ptBtnScreen = AButton->Parent->ClientToScreen
        (TPoint(AButton->Left, AButton->Top));
    // получаем координаты относительно родителя календаря
    TPoint ptMonthClient = AWinOwner->ScreenToClient(ptBtnScreen);
    AMonthCalendar->Left = ptMonthClient.x;
    AMonthCalendar->Top = ptMonthClient.y + AButton->Height + 1;
    AMonthCalendar->Visible = true;
 
    TMethod AMethod;
    AMethod.Data = AWinOwner;
    AMethod.Code = &OnMonthCalendarDblClick;
    // по двойному щелчку дата будет добавлена в Edit
    AMonthCalendar->OnDblClick = *(TNotifyEvent*)&AMethod;
 
    while (!bDateSet) {
        Application->ProcessMessages();
        Sleep(5);
    }
 
    AEdit->Text = sEditText;
    delete AMonthCalendar;
}
 
//---------------------------------------------------------------------------
void __fastcall TForm1::btn3Click(TObject *Sender) {
    TButton *AClicked = dynamic_cast<TButton*>(Sender);
    if (!AClicked) {
        return;
    }
    SetDateTimeToEdit(this, edt1, AClicked);
}
//---------------------------------------------------------------------------
5
 Аватар для Maluda
1280 / 598 / 116
Регистрация: 18.08.2009
Сообщений: 832
04.08.2011, 00:18
Вот картинки как это выглядит.

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

3
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30
04.08.2011, 08:43  [ТС]
Цитата Сообщение от Maluda Посмотреть сообщение
Настоятельно советую это дело освоить
Для этого нужно свободное время и настроение

Код по приклеиванию даты к Edit'у я сам могу написать. Я думал, что может в этом DateTimePicker'е есть какая-то возможность отображать его без собственного Edit'а

У тебя есть тут какой-то MonthCalendar, с ходу не знаю, что это но поэкспериментирую. Наличие Sleep'а естественным образом приводит к тому, что такой метод плохой. Ну не суть. Мне бы просто понять, как от стандартного DateTimePicker'а оставить только кнопку для его вызова, остальное сам сделаю
0
 Аватар для Maluda
1280 / 598 / 116
Регистрация: 18.08.2009
Сообщений: 832
04.08.2011, 10:31
Цитата Сообщение от Evg Посмотреть сообщение
Мне бы просто понять, как от стандартного DateTimePicker'а оставить только кнопку для его вызова
Так вот, если ты посмотришь в заголовочный файл TDateTimePicker, то увидишь, что его членом
как раз и является TMonthCalendar, то есть нажимая на кнопочку, ты как раз его и вызываешь.

Цитата Сообщение от Evg Посмотреть сообщение
Наличие Sleep'а естественным образом приводит к тому, что такой метод плохой.
Абсолютно правильно! По нормальному, делается отдельный компонент, который будет включать
в себя TEdit, TButton и TMonthCalendar. Таким образом, тебе не придётся каждый раз создавать
TMonthCalendar и беспокоится о его удалении.
Ладно, сейчас сделаю нормальный компонент, заодно ты увидишь как просто создавать свои компоненты.
0
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30
04.08.2011, 12:26  [ТС]
Цитата Сообщение от Maluda Посмотреть сообщение
Ладно, сейчас сделаю нормальный компонент, заодно ты увидишь как просто создавать свои компоненты
Да не надо. Просто чтобы понять, как делать самодельные компоненты, мне лучше для начала чего-нибудь почитать. Щас borland'а под рукой нет, когда доберусь - с MonthCalendar поэкспериментирую, в теории мне этого хватит. А то вслепую сложно что-то сказать
0
 Аватар для Maluda
1280 / 598 / 116
Регистрация: 18.08.2009
Сообщений: 832
04.08.2011, 15:22
В общем с компонентами всё очень просто:
- формируется Package, то есть длл-ка в Борладновском формате с расширением bpl,
и либка, где будет тело класса, потом, когда ты будешь бросать такой компонент
на форму, добавиться директива #pragma link, которая укажет добавить либу
компонента к проекту
- берётся за основу какой-нибудь базовый компонент-класс
- добавляются новые свойства и методы или переопределяются старые

Особенностью этих bpl является то, что в них есть определённый код,
для интеграции в дизайнер, но этот код создаётся автоматически Wizard'ом,
поэтому руками его не трогаем и не корректируем.

Для человека, знающего с++, я думаю, что больше ничего объяснять не нужно.
Единственное, надо добавить, что, если программист перешёл с других компиляторов
на Борланд, ему следует обратить внимание на __property и на секцию __published.
Это по сути тот же public. Единственное отличие, то что все члены из секции
__published будут видны в инспекторе объектов.

Итак, создаём наш компонент
Меню -> Component -> New VCL Component

Базовым классом выбираем TCustomPanel,
указываем в какой Package всё это дело сохранять

Пишем код к нашему новому компоненту, жмём Install.

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
//---------------------------------------------------------------------------
 
#ifndef EvgCustomPanelH
#define EvgCustomPanelH
//---------------------------------------------------------------------------
#include <SysUtils.hpp>
#include <Classes.hpp>
#include <Controls.hpp>
#include <ExtCtrls.hpp>
 
#define EDP_DEFAULT_BUTTON_WIDTH 25
#define EDP_DEFAULT_PANEL_HEIGHT 21
 
//---------------------------------------------------------------------------
class PACKAGE TEvgDatePanel : public TCustomPanel {
private:
 
    void __fastcall SetText(AnsiString val);
 
    AnsiString __fastcall GetText();
 
    int iFBtnWidth;
 
    TEdit *edp_Edit;
    TButton *edp_Button;
    TMonthCalendar *edp_MonthCalendar;
    TForm *edp_MonthForm;
 
    TButton *edp_ButtonOk;
    TButton *edp_ButtonCancel;
 
    void __fastcall edp_OnBtnClick(TObject *Sender);
    void __fastcall edp_OnMonthCalendarOkClick(TObject *Sender);
    void __fastcall edp_OnMonthCalendarCnclClick(TObject *Sender);
 
    void __fastcall SetButtonWidth(int val);
    int __fastcall GetButtonWidth();
 
    void __fastcall SetHeight(int val);
    int __fastcall GetHeight();
protected:
 
    virtual void __fastcall edp_OnDeactivateMonthForm(TObject *Sender);
 
public:
 
    __fastcall TEvgDatePanel(TComponent* Owner);
    __fastcall ~TEvgDatePanel();
 
__published:
    __property int ButtonWidth = {read=GetButtonWidth, write=SetButtonWidth, default=EDP_DEFAULT_BUTTON_WIDTH};
    __property AnsiString Text = {read=GetText, write=SetText};
    __property Align = {default=0};
    __property Anchors = {default=3};
    __property Constraints;
    __property Enabled = {default=1};
    __property PopupMenu;
    __property ShowHint;
    __property TabOrder = {default=-1};
    __property TabStop = {default=0};
    __property Touch;
    __property Visible = {default=1};
};
//---------------------------------------------------------------------------
#endif
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
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
//---------------------------------------------------------------------------
 
#include <vcl.h>
 
#pragma hdrstop
 
#include "EvgCustomPanel.h"
#pragma package(smart_init)
//---------------------------------------------------------------------------
// ValidCtrCheck is used to assure that the components created do not have
// any pure virtual functions.
//
 
static inline void ValidCtrCheck(TEvgDatePanel *) {
    new TEvgDatePanel(NULL);
}
 
//---------------------------------------------------------------------------
__fastcall TEvgDatePanel::TEvgDatePanel(TComponent* Owner) : TCustomPanel(Owner) {
 
    iFBtnWidth = EDP_DEFAULT_BUTTON_WIDTH;
 
    this->BevelKind = TBevelKind::bkNone;
    this->BevelOuter = TBevelCut::bvNone;
    this->Height = EDP_DEFAULT_PANEL_HEIGHT;
 
    edp_Button = new TButton(this);
    edp_Button->Parent = this;
    edp_Button->Width = iFBtnWidth;
    edp_Button->Align = alRight;
    edp_Button->OnClick = &edp_OnBtnClick;
 
    edp_Edit = new TEdit(this);
    edp_Edit->Parent = this;
    edp_Edit->Align = alClient;
 
    edp_MonthForm = new TForm(this);
    edp_MonthForm->BorderStyle = TFormBorderStyle::bsNone;
    edp_MonthForm->FormStyle = fsStayOnTop;
    edp_MonthForm->Position = poDesigned;
    edp_MonthForm->OnDeactivate = &edp_OnDeactivateMonthForm;
 
    const int iMonthCalBorder = 14; // учитываем рамку календаря при создании
    edp_MonthCalendar = new TMonthCalendar(this);
    edp_MonthCalendar->Parent = edp_MonthForm;
    edp_MonthCalendar->Left = -iMonthCalBorder;
    edp_MonthCalendar->Top = 0;
 
    edp_MonthForm->Width = edp_MonthCalendar->Width - iMonthCalBorder * 2;
 
    edp_ButtonOk = new TButton(edp_MonthForm);
    edp_ButtonOk->Parent = edp_MonthForm;
    edp_ButtonOk->Left = 0;
    edp_ButtonOk->Top = edp_MonthCalendar->Height;
    edp_ButtonOk->Width = edp_MonthForm->Width / 2;
    edp_ButtonOk->Caption = "OK";
    edp_ButtonOk->OnClick = &edp_OnMonthCalendarOkClick;
    // форма сама потом удалит компонент
    edp_MonthForm->InsertComponent(edp_ButtonOk);
 
    edp_ButtonCancel = new TButton(edp_MonthForm);
    edp_ButtonCancel->Parent = edp_MonthForm;
    edp_ButtonCancel->Top = edp_MonthCalendar->Height;
    edp_ButtonCancel->Left = edp_ButtonOk->BoundsRect.Right + 3;
    edp_ButtonCancel->Width = edp_MonthForm->Width / 2 - 3;
    edp_ButtonCancel->Caption = "Cancel";
    edp_ButtonCancel->OnClick = &edp_OnMonthCalendarCnclClick;
    // форма сама потом удалит компонент
    edp_MonthForm->InsertComponent(edp_ButtonCancel);
 
    edp_MonthForm->Height = edp_MonthCalendar->Height + edp_ButtonOk->Height;
 
}
 
//---------------------------------------------------------------------------
__fastcall TEvgDatePanel::~TEvgDatePanel() {
    if (edp_MonthCalendar) {
        delete edp_MonthCalendar;
    }
    if (edp_MonthForm) {
        delete edp_MonthForm;
    }
    if (edp_Button) {
        delete edp_Button;
    }
    if (edp_Edit) {
        delete edp_Edit;
    }
}
 
//---------------------------------------------------------------------------
void __fastcall TEvgDatePanel::edp_OnDeactivateMonthForm(TObject *Sender) {
    edp_MonthForm->Hide();
}
 
//---------------------------------------------------------------------------
void __fastcall TEvgDatePanel::edp_OnBtnClick(TObject *Sender) {
    if (!edp_MonthForm->Showing) {
        // получаем экранные координаты кнопки
        const TPoint ptBtnScreen = ClientToScreen(TPoint(edp_Button->Left,
                edp_Button->Top));
 
        edp_MonthForm->Left = ptBtnScreen.x;
        edp_MonthForm->Top = ptBtnScreen.y + edp_Button->Height;
        // в календаре установим дату из Edit
        edp_MonthCalendar->Date = StrToDateTimeDef(edp_Edit->Text, Now());
        edp_MonthForm->Show();
    }
}
 
//---------------------------------------------------------------------------
void __fastcall TEvgDatePanel::edp_OnMonthCalendarOkClick(TObject *Sender) {
    edp_Edit->Text = edp_MonthCalendar->Date.DateString();
    edp_MonthForm->Hide();
}
 
//---------------------------------------------------------------------------
void __fastcall TEvgDatePanel::edp_OnMonthCalendarCnclClick(TObject *Sender) {
    edp_MonthForm->Hide();
}
 
//---------------------------------------------------------------------------
void __fastcall TEvgDatePanel::SetButtonWidth(int val) {
    iFBtnWidth = val;
    if (edp_Button) {
        edp_Button->Width = iFBtnWidth;
    }
}
 
//---------------------------------------------------------------------------
int __fastcall TEvgDatePanel::GetButtonWidth() {
    return iFBtnWidth;
}
 
//---------------------------------------------------------------------------
 
//---------------------------------------------------------------------------
namespace Evgcustompanel {
    void __fastcall PACKAGE Register() {
        TComponentClass classes[1] = {
            __classid(TEvgDatePanel)
        };
        RegisterComponents(L"Samples", classes, 0);
    }
}
 
//---------------------------------------------------------------------------
void __fastcall TEvgDatePanel::SetText(AnsiString val) {
    if (edp_Edit) {
        edp_Edit->Text = val;
    }
}
 
//---------------------------------------------------------------------------
AnsiString __fastcall TEvgDatePanel::GetText() {
    return edp_Edit->Text;
}
//---------------------------------------------------------------------------
Добавлено через 2 минуты
Очень подробно про написание компонентов расписано у Архангельского.
И очень доходчиво Кен Хендерсон Освой самостоятельно. Borland C++
1
 Аватар для Maluda
1280 / 598 / 116
Регистрация: 18.08.2009
Сообщений: 832
04.08.2011, 15:32
Пару скринов как это выглядит в диспетчере и как работает.
Вызов календаря сделал по принципу PopupMenu - так мне показалось удобнее.
Миниатюры
Компонента для выбора даты   Компонента для выбора даты  
Изображения
 
0
 Аватар для Maluda
1280 / 598 / 116
Регистрация: 18.08.2009
Сообщений: 832
04.08.2011, 15:38
П.С. Плюсы такого - своего компонента в том, что его можно дорабатывать как угодно,
они легко инсталлятся. Так что нет проблем при переустановке компа или студии.
Также можно создавать невизуальные компоненты, которые будут хранилищем своих полезных
функций, то есть бросил на форму такой компонент и он сам подключит все нужные хидеры и т.д.
1
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30
04.08.2011, 15:42  [ТС]
Цитата Сообщение от Maluda Посмотреть сообщение
Плюсы такого - своего компонента в том, что его можно дорабатывать как угодно,
они легко инсталлятся
Вот тем мне и не нравится такая технология компонентов, что если я захочу свой исходник утащить на другой комп, то сначала нужно выполнять пляску с бубном и установить компоненту. Неужто нет никаких способов НЕ устанавливать компоненту вовнутрь борландовского каталога, а сделать так, чтобы он жил исключительно в исходниках моей программы, чтобы при перетаскивании никаких дополнительных телодвижений не надо было делать?

P.S. куда-то кнопочки +1 пропали
0
 Аватар для Maluda
1280 / 598 / 116
Регистрация: 18.08.2009
Сообщений: 832
04.08.2011, 17:00
Цитата Сообщение от Evg Посмотреть сообщение
Неужто нет никаких способов НЕ устанавливать компоненту вовнутрь борландовского каталога, а сделать так, чтобы он жил исключительно в исходниках моей программы, чтобы при перетаскивании никаких дополнительных телодвижений не надо было делать?
Да, элементарно. Что ты рассматриваешь компоненты как какую-то абстрактную субстанцию?
Это класс! И мысли относительно использования компонентов как будто ты работаешь с классом!
Хочешь использовать свой компонент в исходнике без телодвижений в Борланде? Пожалуйста!
C++
1
2
3
4
5
6
7
8
class TMyButton : public TButton {
      AnsiString FVersion;
public:
      TMyButton(TComponent *AOwner):TButton(AOwner) {
             FVersion = "1.0.0.0";
      }
__published __property AnsiString Version = {read=FVersion,write=FVersion}; 
}
Только ты же прекрасно понимаешь, что Билдер ни сном, ни духом о твоём классе,
как о компоненте в дизайне. Поэтому его использовать можно только динамически.


Цитата Сообщение от Evg Посмотреть сообщение
то сначала нужно выполнять пляску с бубном и установить компоненту.
Пляска с бубном - это скопировать папку с проектом компонента, открыть в студии и нажать Install?

Что уже тогда говорить про инсталл, например, библиотеки QT под Visual Studio, когда у меня
компиляция пол-ночи занимает
0
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30
04.08.2011, 17:05  [ТС]
Цитата Сообщение от Maluda Посмотреть сообщение
Только ты же прекрасно понимаешь, что Билдер ни сном, ни духом о твоём классе,
как о компоненте в дизайне
Ну вот в моём понятии компонента это в первую очередь то, что можно на форму мышкой затащить, дабы не извращаться и динамически её не создавать. Или как вариант можно хотя бы какую-нибудь компоненту-пустышку в дизайнере затащить на форму? Чтобы контуры очерчивала: чтобы визуально видеть и при динамическом создании скопировать координаты из прямоугольника

Цитата Сообщение от Maluda Посмотреть сообщение
Пляска с бубном - это скопировать папку с проектом компонента, открыть в студии и нажать Install?
В моём понимании - да. Нормальная программа - это когда взял и скомпилял. А весь остальной онанизм в духе опенсорсного "возьми оттуда, руками поставь туда" - для программ лоховского уровня в моём понятии всё-таки неприемлимо. Т.е. программа, грубо говоря, два плюс два скалыдвает, а чтобы её компилять надо работать напильником. Не хочется этого
0
 Аватар для Maluda
1280 / 598 / 116
Регистрация: 18.08.2009
Сообщений: 832
04.08.2011, 17:17
Принципы VCL были разработаны очень толковым программистом Андерсом Хейлсбергом,
которому Майкрософт заплатила сумасшедшие деньги, чтобы он ушёл с Борланда к ним писать C#.
Чтобы не говорили о Борланде, но по удобству визуального программирования он впереди других сред лет на 10.
Минус в том, что так всё автоматизировано, люди тратят больше усилий на изучение свойств компонента, думая, что этого им хватит, чем на изучение теории самого программирования.

Добавлено через 7 минут
Evg, ты не обижайся, но мне кажется, что в визуальном программировании у тебя очень маленький опыт. Я просто очень серьёзно занимаюсь разработкой GUI, перепробовал огромное количество библиотек GUI.
Лично для тебя я рекомендую библиотеку Juce http://www.rawmaterialsoftware.com/juce.php.
Она кросс-платформенная, бесплатная, там есть визуальный редактор, ты набрасываешь компоненты, а из этого всего редактор тебе генерирует код, который ты можешь редактировать как угодно. Все базовые классы с исходниками.
0
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30
04.08.2011, 17:22  [ТС]
Цитата Сообщение от Maluda Посмотреть сообщение
Чтобы не говорили о Борланде, но по удобству визуального программирования он впереди других сред лет на 10
Дык я не спорю с этим. Я просто не хочу идти по тому пути, что на чужом компе придётся что-то дополнительно устанавливать.

Причина простая. Я понимаю, если взять те же самые TMC и какой-нибудь профессиональный продукт, его использующий, то затраты на установку компоненты того стоят. А если взять мою никчёменную программу и мою разнесчастную компоненту - то они тогоне стоят. Просто много раз натыкался при компиляции линуксовых программ, что из-за какой-то мелочи приходится ставить целый паровоз библиотек, в итоге оказывается, что программа полный кал и просто бесит, что столько усилий потрачено на то, чтобы это дерьмо скомпилировать.

Я не думаю, что мою программу будет кто-то где-то компилять, но гипотетически всегда из этого исхожу (ну мало ли кому-то понадобится). Поэтому на текущий момент мне хотелось бы решение без установки дополнительных bpl. Вариант с динамической компоненнтой меня в принципе устраивает, но при этом хотелось бы, чтобы в дизайнере это хоть как-то было видно. Дебильным решением было бы в дизайнере воткнуть Edit, а потом поверх него присобачить мою компоненту (чтобы не заниматься вычислениями координат и чтобы не корячиться в коде, если вдруг дизайн формы поменяется). Мнее дебильным решением было бы вместо Edit'а воткнуть какую-нибудь пустышку, если таковая есть. Т.е. прозрачная панелька-прямоугольничек, контуры которой хорошо видны в дизайнере форм

Добавлено через 3 минуты
Цитата Сообщение от Maluda Посмотреть сообщение
Evg, ты не обижайся, но мне кажется, что в визуальном программировании у тебя очень маленький опыт
Тебе не кажется, оно так и есть. Я как бы под линуксом программирую в консоли, а гуёвое приложение под виндой - это скорее для души. Ну и просто чтобы иметь об этом понятие, мало ли что на работе случится и придётся в жизни заниматься чем-то другим. Поэтому сложных решений пока не хочу. Выбрал borland, потому что он мне показался более понятным и менее геморройным. Большим количеством времени, чтобы заниматься на серьёзном уровне, не обладаю.

Конкретно делаю вот эту хрень: Программа для скачивания биржевых котировок
0
 Аватар для Maluda
1280 / 598 / 116
Регистрация: 18.08.2009
Сообщений: 832
04.08.2011, 17:23
П.С. У тебя будет полный контроль над каждой операцией в любом компоненте вплоть до того,
что можешь хоть вообще свою перерисовку каждого компонента делать.
Ещё из плюсов то, что довольно неплохой с++ код исходников. Есть чему поучиться, чего к сожалению нет в Билдере. И все исходники тщательно задокументированы. Прочитав заголовочный файл можно понять, что происходит в этой функции, а в Билдере надо пол-часа по интернету лазить, чтобы какое-то свойство компонента разведать и не факт, что найдёшь.

Но, подитожив все плюсы, как не прискорбно, то, что будешь на Juce делать неделю, в Билдере сделаешь за полчаса
0
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30
04.08.2011, 17:25  [ТС]
Как уже писал выше (в довесок к последнему своему посту), выбрал билдер за его понятность. Ну и времени на это много нет
0
 Аватар для Maluda
1280 / 598 / 116
Регистрация: 18.08.2009
Сообщений: 832
04.08.2011, 17:33
Цитата Сообщение от Evg Посмотреть сообщение
Я не думаю, что мою программу будет кто-то где-то компилять, но гипотетически всегда из этого исхожу (ну мало ли кому-то понадобится). Поэтому на текущий момент мне хотелось бы решение без установки дополнительных bpl.
Так вот в том то и дело, что в билдере это уже давным давно продумано. Есть такое понятие как
GroupProject. То есть ты привязываешь свой компонент к своему проекту.
Поэтому, когда ты дашь исходник своего проекта другому человеку. Ему ничего отдельно собирать,
или копировать не придётся. Это будет как единый проект.
Миниатюры
Компонента для выбора даты  
0
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30
04.08.2011, 20:32  [ТС]
Цитата Сообщение от Maluda Посмотреть сообщение
Есть такое понятие как
GroupProject. То есть ты привязываешь свой компонент к своему проекту
Насколько я понимаю, речь идёт о случае, когда компоненту нельзя будет использовать в дизайнере форм. То бишь создавать её только динамически. Так? Если да, то ето в чистом виде исходник и каким конкретно способом прицепить к проекту уже разницы быть не должно
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
04.08.2011, 20:32
Помогаю со студенческими работами здесь

ComboBox, после выбора компонента что при нажатии на кнопку открывалась новая форма!
То есть: есть combobox выбираешь что то от туда либо после выбора сразу открывалась новая форма или после нажатия кнопки как это...

Вывод времени типа AnsiString (формат даты-00:00:00) из многоуровнего массива в ось X компонента Chart
Всем доброго времени суток! Помогите чем сможите начинающему. Суть проблемы такова: Есть многоуровневый массив struct Arxiv { ...

Форматирование даты компонента DateTimePicker для SQL Servera
Пишу БД, мне нужно добавить клиента, проблема возникает с полем даты. в sql формат такой ГГГГ-ММ-ДД. как из DateTimePicker получить его...

Оператор выбора для компонента Edit
Здравствуйте! Вот моя процедура: procedure TForm1.Button1Click(Sender: TObject); var id1,id2,i,j:integer; f1:TextFile; ...

Компонент для выбора даты
Предлагаю написать самостоятельно. В классе Calendar есть все необходимое, для простого расчета даты. Остается нарисовать компонент. У меня...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
SDL3 для Android: Загрузка PNG с альфа-каналом с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru