Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > TDateTimePicker. Ввод без разделителей.


Автор: MetalFan 13.2.2012, 17:57
Что имеем: Стандартное поведение вышеназванного контрола при вводе даты(времени) "01<разд>01<разд>2012". Где <разд> - кнопка "влево" или знак разделителя даты.

Задача: "заставить" DateTimePicker понимать ввод с клавиатуры без необходимости ввода разделителя, т.е. набрали 01012012 - получили 01.01.2012

Есть конечно вариант с использованием TMaskedEdit... но хотелось бы красиво "расковырять" сабжевый контрол. В голову ничего "красивого" не приходит.

Автор: Akella 13.2.2012, 23:41
именно стандартный?

Добавлено через 7 минут и 58 секунд
а у меня событие OnUserInput не срабатывает, хотя ParseInput включено

Автор: northener 14.2.2012, 01:17
Курите TDateEdit от RxLib. 
Или смотрите его исходники.

Автор: superVad 14.2.2012, 10:59
Цитата(northener @  14.2.2012,  00:17 Найти цитируемый пост)
Курите TDateEdit от RxLib. 

Ну тогда уже jvcl-овский.

Автор: MetalFan 14.2.2012, 14:49
Курить то оно хорошо,  покурим на досуге, но как добиться нужного поведения от стандартного компонента?

Добавлено через 8 минут и 42 секунды
p.s. Покурил. JVCL-овский компонент является наследником TMaskedEdit'а и никак не связан с "исходной" оберткой над виндовым DATETIMEPICK_CLASS... Так что не катит.

Больше идей ни у кого нет?

Автор: superVad 14.2.2012, 17:10
Цитата(MetalFan @  14.2.2012,  13:49 Найти цитируемый пост)
Больше идей ни у кого нет?

Идей нет. Но тема интересная.
Мне жвцл-овский тоже не нравится - к примеру возможностью его очистки и срабатывания события изменения в открытом состоянии.

Автор: Akella 14.2.2012, 17:17
Цитата(MetalFan @  14.2.2012,  14:49 Найти цитируемый пост)
p.s. Покурил. JVCL-овский компонент является наследником TMaskedEdit'а и никак не связан с "исходной" оберткой над виндовым DATETIMEPICK_CLASS... Так что не катит.

Больше идей ни у кого нет? 


У DevExpress тоже использует MaskEdit, так что вряд ли у тебя что-то выйдет со стандартной компонентой.

Автор: Чучмек 15.2.2012, 19:14
Код

procedure TForm1.DateTimePicker1Change(Sender: TObject);
begin
if not DateTimePicker1.DroppedDown then
    sendmessage(DateTimePicker1.Handle,WM_KEYDOWN,39,0);
end;

Автор: MetalFan 23.2.2012, 16:39
Чучмек, Спасибо за решение!
Немножко "причесал", в целом сойдет)
Код

procedure TForm1.DateTimePicker1Change(Sender: TObject);
begin
  with TDateTimePicker(Sender) do
    if not DroppedDown then
      Perform(WM_KEYDOWN, VK_RIGHT, 0);
end;

Автор: MetalFan 5.3.2012, 23:00
Дооптимизировал. Написал хелпер. 
Теперь работает более логично. Переход на сл.поле происходит, если были нажаты только цифровые клавиши.
Для активации "ввода без разделителей" достаточно описать хелпер в одном из модулей и подключать его в нужном месте. Ну и для нужных контролов вызвать InitHelper при инициализации формы.
Может кому пригодиться:
Код

  TDateTimePickerHelper = class helper for TDateTimePicker
    procedure dtpChange(Sender: TObject);
    procedure dtpKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
    procedure InitHelper;
  end;
...
{ TDateTimePickerHelper }

procedure TDateTimePickerHelper.dtpChange(Sender: TObject);
begin
  with TDateTimePicker(Sender) do
  begin
    if not DroppedDown and (Tag in [Ord('0')..Ord('9')]) then
      Perform(WM_KEYDOWN, VK_RIGHT, 0);
    Tag := 0;
  end;
end;

procedure TDateTimePickerHelper.dtpKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
begin
  if Shift = [] then
    TControl(Sender).Tag := Key
  else
    TControl(Sender).Tag := 0;
end;

procedure TDateTimePickerHelper.InitHelper;
begin
  OnChange := dtpChange;
  OnKeyDown := dtpKeyDown;
end;


Автор: northener 6.3.2012, 00:37
Цитата(MetalFan @  5.3.2012,  23:00 Найти цитируемый пост)
Дооптимизировал. Написал хелпер. 

А хелперы в Дельфи появились в какой версии?

Автор: Rennigth 6.3.2012, 04:58
Цитата(northener @  6.3.2012,  00:37 Найти цитируемый пост)
А хелперы в Дельфи появились в какой версии? 

вроде D2007

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)