Форум: "Начинающим";
Текущий архив: 2016.02.28;
Скачать: [xml.tar.bz2];
ВнизВывести пустой TDateTimePicker Найти похожие ветки
← →
С-К (2014-08-08 17:44) [0]То есть, чтобы DateTimePicker отображал пустые места, типа « . . »
Можно, конечно, dtp.Format := """"""; - а потом при выборе значения из календарика подставлять dtp.Format := "";
но в таком случае в первоначально пустом виде нельзя сразу ручками вбить дату цифрами.
Если присвоить dtp.Date := 0, то, конечно, просто выставится 1899 год.
А нужно, чтобы DateTimePicker изначально был пустым и это можно было определить. Если так и не заполнили - то в БД писать nil.
← →
А не проще ли ... (2014-08-08 18:26) [1]А не проще ли, если 1899 , то писать nil
чего тут городить ...
← →
Rouse_ © (2014-08-08 21:32) [2]
> А нужно, чтобы DateTimePicker изначально был пустым и это
> можно было определить.
Возьми к примеру наручные часы - могут ли они отображать ноль?
Не могут, возьми настенный календарь - тоже не может.
Что ты хочешь от контрола, который изначально должен отображать не цифры, а время и дату?
← →
Германн © (2014-08-09 02:45) [3]
> А нужно, чтобы DateTimePicker изначально был пустым и это
> можно было определить. Если так и не заполнили - то в БД
> писать nil.
>
TDateEdit от RxLib (JVCL) возможно позволяет определить введена ли какая-нибудь дата или нет. Это если не хочешь писать свой компонент.
← →
ВладОшин © (2014-08-10 10:39) [4]combobox на ондропдаун исчезает, показывается календарь
← →
С-К (2014-08-10 21:11) [5]
> А не проще ли, если 1899 , то писать nil
проще, только вопрос был не о том
> Что ты хочешь от контрола, который изначально должен отображать
> не цифры, а время и дату?
ты принципиально не прав. TDateTimePicker предназначен не для отображения даты, а для ВВОДА даты. И легко можно себе представить ситуацию, когда он должен быть изначально "пустой". То есть, даты просто нету. Пользователь может ввести дату, а может её принципиально не ввести.
← →
Германн © (2014-08-11 01:58) [6]
> С-К (10.08.14 21:11) [5]
> ты принципиально не прав.
Ты тоже. Причём гораздо более.
Пустыми могут быть строки или массивы. Переменные целого или вещественного типа пустыми быть не могут в принципе. (Практику использования NULL в БД не рассматриваю). Как должна программа реагировать на "пустое" поле ТDateTimePicker?
← →
sniknik © (2014-08-11 08:23) [7]> Пустыми могут быть строки или массивы.
это с точки зрения программирования, а по нуждам заказчиков (/пониманию пользователя) при начале ввода анкеты например в "год рождения" должно быть пусто... ведь он туда ничего еще не ввел.
ситуация часто встречающаяся (у меня точно).
← →
С-К (2014-08-11 09:25) [8]
> Переменные целого или вещественного типа пустыми быть не
> могут в принципе
переменные - да, но причем здесь это? Я говорю про интерфейс пользователя, когда контрол по умолчанию должен быть пустым, например.
> Как должна программа реагировать на "пустое" поле ТDateTimePicker?
записать в соответствующее поле БД null
← →
Rouse_ © (2014-08-11 10:23) [9]
> ты принципиально не прав
Ну что ж - каждому свое, однако я бы сделал это совершенно по другому.
← →
Styx (2014-08-11 10:36) [10]А если заполнили, а потом передумали? Imho, лучше дополнительную галочку сделать.
← →
С-К (2014-08-11 10:43) [11]
> однако я бы сделал это совершенно по другому.
как?
> А если заполнили, а потом передумали?
вот именно. Для пользователя интуитивно просто стереть дату, выделить её и нажать DEL. Но контрол стандартный это, судя по всему, не позволяет (
← →
sniknik © (2014-08-11 10:43) [12]> А если заполнили, а потом передумали?
в большинстве случаев это значит полный отказ от ввода всего (если продолжать пример анкеты).
но вообще если будет (/сделать) датапикер с дополнительным(/начальным) пустым значением, то разве проблема сделать в нем очистку ввода? ну например прямо в поле редактирования.
← →
junglecat (2014-08-11 11:11) [13]А ShowCheckbox или что-то наподобие - не то ли часом?
← →
Inovet © (2014-08-11 11:12) [14]Наварример, надо ввести период, начальная дата известна, конечная пока открыта. Интуитивно её надо или не заполнять или стереь, если уже ввели что-то раньше. Галочки там и прочее дополнительная путаница
← →
С-К (2014-08-11 11:13) [15]
> А ShowCheckbox или что-то наподобие
в принципе да, но решение не такое интуитивное (
Мы раньше сами компонент писали, он все это позволял. А сейчас требование работать на стандартных компонентах и жалко, что даже в XE контрол этого не позволяет.
Или как-то можно?
← →
С-К (2014-08-11 11:15) [16]
> начальная дата известна, конечная пока открыта
верно, это еще один пример такого контрола
← →
Rouse_ © (2014-08-11 11:25) [17]
> как?
Не использовал бы ТDateTimePicker, а по быстрому реализовал бы свой составной контрол (который будет отображать к примеру "дата не введена"), там делов-то на 15 минут.
← →
junglecat (2014-08-11 12:10) [18]MaskEdit?
← →
С-К (2014-08-11 13:07) [19]
> там делов-то на 15 минут.
ну нет. Дело в том, что пользователи привыкли выбирать дату зачастую из календарика, который отображается по стрелочке вниз. Это же не чисто текстовый контрол.
← →
junglecat (2014-08-11 13:10) [20]> [19] С-К (11.08.14 13:07)
MaskEdit + MonthCalendar?
да можно и просто readonly Edit
← →
С-К (2014-08-11 13:13) [21]>MonthCalendar
что это такое?
← →
Rouse_ © (2014-08-11 13:17) [22]
> ну нет. Дело в том, что пользователи привыкли выбирать дату зачастую из календарика, который отображается по стрелочке вниз. Это же не чисто текстовый контрол.
Стандартный TDateTimePicker является составным контролом из Edit и MonthCalendar, тебе предлагают сделать то-же самое, только поведение эдита изменить на такое, как тебе нужно.
← →
sniknik © (2014-08-11 13:34) [23]
procedure TForm1.FormCreate(Sender: TObject);
begin
Edit1.Parent:= DateTimePicker1;
Edit1.Align := alLeft;
Edit1.BorderStyle:= bsNone;
Edit1.Width:= DateTimePicker1.ClientWidth - GetSystemMetrics(SM_CXVSCROLL);
//Edit1.ReadOnly:= true;
end;
procedure TForm1.DateTimePicker1Change(Sender: TObject);
begin
Edit1.Text:= DateToStr(DateTimePicker1.Date);
end;
procedure TForm1.DateTimePicker1Enter(Sender: TObject);
begin
DateTimePicker1.DateTime:= StrToDateDef(Form1.Edit1.Text, Now());
end;
← →
С-К (2014-08-11 13:47) [24]sniknik, как я понял поверх dtp ты фигачишь Edit... интересная идея, спасибо
← →
sniknik © (2014-08-11 14:15) [25]не поверх, внутрь.
← →
Rouse_ © (2014-08-11 16:19) [26]
> С-К
Ну хорошо, давай попробуем без велосипедов.
Смотри, у TDateTimePicker есть стиль DTS_SHOWNONE: http://msdn.microsoft.com/en-us/library/windows/desktop/bb761728(v=vs.85).aspx
Который отвечает за отображение того что пикер не содержит валидной даты.
Управляется этот стиль при помощи свойства ShowCheckbox, при этом когда чекбокс выключен, дата задисейблена и сразу видно что дата не введена.
← →
С-К (2014-08-11 17:23) [27]
> при этом когда чекбокс выключен, дата задисейблена и сразу
> видно что дата не введена.
ну я бы не сказал, что верно.
Вот: http://goo.gl/5JwKAi
Задисейблено - видно, но вот что дата не введена - не факт. Многие подумают, что дата введена (сегодняшнее число), но её изменить нельзя. Корректно было - если даты реально не было (пустое поле).
← →
Rouse__ (2014-08-11 17:50) [28]Что значит ты бы не сказал? Ты хочешь сказать что люди разрабатывающие юзабилити в MS делают все не верно? ;)
← →
С-К (2014-08-11 19:35) [29]
> Что значит ты бы не сказал?
что сразу видно, что дата не введена.
> Ты хочешь сказать что люди разрабатывающие юзабилити в MS
> делают все не верно?
я думаю нет смысла дискутировать на эту тему.
Я в целом обозначил задачу, она такая.
← →
Rouse_ © (2014-08-11 19:55) [30]
> Я в целом обозначил задачу, она такая.
Ну раз так, то ответ был озвучен еще в [17]. Давно бы свой контрол склепал, чем время тратить на форуме.
← →
С-К (2014-08-11 19:58) [31]
> то ответ был озвучен еще в [17]
я писал ответ на этот пост.
← →
Rouse_ © (2014-08-11 20:04) [32]
> С-К (11.08.14 19:58) [31]
> я писал ответ на этот пост.
Ты написал неверный ответ. Составной контрол дружественный пользователю (с сохранением основных принципов ввода/вывода и листом выбора даты) пишется за 15 минут. Выглядит идентично DateTimePicker, но работает так как ты хочешь.
← →
Rouse_ © (2014-08-11 20:05) [33]Принцип реализации составных контролов можешь посмотреть вот тут: http://rouse.drkb.ru/components.php#fwvistapathedit
← →
имя (2014-08-11 20:37) [34]Удалено модератором
← →
Rouse_ © (2014-08-11 20:39) [35]
> С-К (11.08.14 19:35) [29]
> что сразу видно, что дата не введена.
Кажется именно такая и была изначальная задача в самом первом посте:
> С-К (08.08.14 17:44) [0]
> и это можно было определить
← →
Германн © (2014-08-12 01:25) [36]
> С-К (11.08.14 13:07) [19]
>
>
> > там делов-то на 15 минут.
>
> ну нет. Дело в том, что пользователи привыкли выбирать дату
> зачастую из календарика, который отображается по стрелочке
> вниз.
Ещё раз повторю TDateEdit от RxLib.
Ставить библиотеку не надо как и не обязательно использовать этот компонент. Но его исходный код был бесплатно отдан всем желающим. И работает он именно так как тебе хочется.
← →
Германн © (2014-08-12 01:27) [37]
> sniknik © (11.08.14 08:23) [7]
>
> > Пустыми могут быть строки или массивы.
> это с точки зрения программирования, а по нуждам заказчиков
> (/пониманию пользователя) при начале ввода анкеты например
> в "год рождения" должно быть пусто... ведь он туда ничего
> еще не ввел.
> ситуация часто встречающаяся (у меня точно).
>
Я же специально сказал
> (Практику использования NULL в БД не рассматриваю)
:)
← →
С-К (2014-08-12 09:08) [38]
> пишется за 15 минут
как реализовать выпадающий календарик?
> Ещё раз повторю TDateEdit от RxLib.
еще раз повторю:
> А сейчас требование работать на стандартных компонентах
> Я же специально сказал
> > (Практику использования NULL в БД не рассматриваю)
ну а мне от этого не легче, потому что если пользователь не ввел дату - то в БД надо писать null, и это логично.
← →
junglecat (2014-08-12 09:38) [39]> сейчас требование работать на стандартных компонентах
обычно под этим понимается "не юзать платные компоненты, потому что бабланетнах". А rxlib - бесплатна
← →
Rouse_ © (2014-08-12 10:24) [40]
> С-К (12.08.14 09:08) [38]
> как реализовать выпадающий календарик?
Ну я ж тебе даже ссылку на пример дал :)
Ладно, пойдем более простым путем, на форму кидай кнопку и календарь, у календаря свойство Visible ставь в False, потом в обработчике кнопки пиши следующий код:procedure TForm1.Button1Click(Sender: TObject);
begin
MonthCalendar1.Left := Button1.Left;
MonthCalendar1.Top := Button1.Top + Button1.Height;
AnimateWindow(MonthCalendar1.Handle, 200, AW_SLIDE or AW_VER_POSITIVE);
MonthCalendar1.Visible := True;
end;
Страницы: 1 2 вся ветка
Форум: "Начинающим";
Текущий архив: 2016.02.28;
Скачать: [xml.tar.bz2];
Память: 0.54 MB
Время: 0.003 c