Topic: Как не отображать дату в DateTimePicker если она не выбрана?

Есть поле даты DateTimePicker.
Надо отображать в нем пустоту, если пользователь явно не указывал в нем дату.
А если он кликает по этому полю, то должен открываться стандартный диалог выбора даты.
Как это сделать?
А то у пользователей вызывает путаницу наличие текущей даты в этом поле, если явное указание даты не производилось..

Re: Как не отображать дату в DateTimePicker если она не выбрана?

К сожалению отображать в нем пустоту нет возможности, но можно например устанавливать необычную дату (30.12.1899), пример

procedure Form2_OnShow (Sender: TObject; Action: string);
begin
    if Action = 'NewRecord' then
    begin
        Form2.DateTimePicker1.DateTime := 0;
        Form2.DateTimePicker1.Checked := False;
    end;
end;
Dmitry.

3 (edited by mikhail_a 2019-07-05 07:20:45)

Re: Как не отображать дату в DateTimePicker если она не выбрана?

Нет, необычная дата на форме добавления новой записи не подходит.
У меня на форме поле даты заполняется не при создании записи, а тогда когда поступит информация от клиента о дате заключения договора.
Я уже устал объяснять новым пользователям, как работает отображение даты договора - типа "есть условность, что если галочка не стоит, то  дата в этом поле ничего не обозначает."
Наличие даты, которая меняется каждый день, реально сбивает с толку.
Надо, именно, чтобы дата не отображалась, если ее не указали.
Можно ли добавить хотя бы изменение цвета шрифта?
Т.е. чтобы срабатывало
if Form2.DateTimePicker1.Checked := False then Form2.DateTimePicker1.Font.Color := clWhite;

Re: Как не отображать дату в DateTimePicker если она не выбрана?

сделайт просто проверку на заполнение

procedure Form1_Button1_OnClick (Sender: TObject; var Cancel: boolean);
begin
  if form1.DateTimePicker1.Checked = False then begin
  ShowHint(form1.DateTimePicker1,'Дата не выбрана');
  CANCEL:=TRUE;
  end;
end;

Re: Как не отображать дату в DateTimePicker если она не выбрана?

Привет михаил,
Возможно, вы могли бы сделать это так.
Derek.
(с гугл переводчиком)

Post's attachments

Attachment icon emptydate.zip 337.05 kb, 325 downloads since 2019-07-05 

Re: Как не отображать дату в DateTimePicker если она не выбрана?

Hi Derek,
This is a very original solution!
Thank you very much!

Re: Как не отображать дату в DateTimePicker если она не выбрана?

Дмитрий,
А как можно получить множество всех компонентов на форме, которые являются датами?
Тогда можно для всех них поменять формат, а не писать код для каждой даты.

Re: Как не отображать дату в DateTimePicker если она не выбрана?

function checkedDT(d:TdbDateTimePicker; r: string):string;
begin
  if d.checked then begin
    if r= 'date' then result:='dd.mm.yy' else
    if r= 'time' then result:='hh:mm' else
   end else result:='.';
end;

procedure Form1_DateTimePicker1_OnChange (Sender: TObject);
begin
  Form1.DateTimePicker1.Format:= checkedDT(Form1.DateTimePicker1,'date');
end;
procedure Form1_DateTimePicker2_OnChange (Sender: TObject);
begin
  Form1.DateTimePicker2.Format:= checkedDT(Form1.DateTimePicker2,'time');
end;

9 (edited by sibprogsistem 2019-07-06 18:53:35)

Re: Как не отображать дату в DateTimePicker если она не выбрана?

vovka3003 wrote:

sibprogsistem, эффектно... Но к сожалению это не ответ на вопрос:

mikhail_a wrote:

... как можно получить множество всех компонентов на форме, которые являются датами?

вы предлагаете копипастить DateTimePicker1..100500 ?

cогласен..
но как я понимаю ему нужно множество только для  запуска программы

тагда я предлагаю так

var
i:integer;
function checkedDT(d:TdbDateTimePicker; r: string):string;
begin
  if d.checked then begin
    if r= 'date' then result:='dd.mm.yy' else
    if r= 'time' then result:='hh:mm' else
   end else result:='.';
end;

procedure Form1_DateTimePicker1_OnChange (Sender: TObject);
begin
  Form1.DateTimePicker1.Format:= checkedDT(Form1.DateTimePicker1,'date');
end;
procedure Form1_DateTimePicker2_OnChange (Sender: TObject);
begin
  Form1.DateTimePicker2.Format:= checkedDT(Form1.DateTimePicker2,'time');
end;

begin
  for i:=0 to Form1.ComponentCount-1 do
     if Form1.Components[i].ClassName = 'TdbDateTimePicker' then
     with TdbDateTimePicker(Form1.Components[i]) do
     begin
       TdbDateTimePicker(Form1.Components[i]).Format:= '.';
     end;
end.

Re: Как не отображать дату в DateTimePicker если она не выбрана?

Идея с манипулированием форматом даты для неотображения пустых дат,как я понимаю, может быть защита разработчиком в саму программу.
Это сэкономит кучу строк кода.
...
Если же это не реализовано, то я хотел сделать так:
При запуске программы перебираю множество всех форм и получаю ни них все имена дата пикеров. Устанавливаю для них отображать пустой формат, если даты нет. Имена форм и датапикеров загоняю в глобальный массив.
Создаю функцию  FormatDTChahge, которая меняет формат датапикеров на переданой в нее имени формы. Она ищет нужные датапикеры по глобальному массиву.
Тогда останется на все OnChange датапикеров вручную повесить эту функцию с именем формы.
В этом случае не надо будет прописывать имя каждого датапикера в коде событий OnChange и на открытие форм не надо вешать обработчик.
У кого-нибудь есть идеи получше?

Re: Как не отображать дату в DateTimePicker если она не выбрана?

vovka3003 wrote:

Почему такой метод не работает

может глупо, но я думаю, что в вашем случае в процедуре
procedure SetDTMode(Sender:TObject);
вот тут
DT:= TdbDateTimePicker(Sender);
пытается получить толи имя DateTimePicker толи полный адрес

Form1.DateTimePicker[i]

но в Sender находиться ,что-то иное..

Re: Как не отображать дату в DateTimePicker если она не выбрана?

mikhail_a wrote:

В этом случае не надо будет прописывать имя каждого датапикера в коде событий OnChange и на открытие форм не надо вешать обработчик.

может от того,что я ниразу с таким не сталкивался , но я сомниваюсь..

Re: Как не отображать дату в DateTimePicker если она не выбрана?

vovka3003, Кому костыль, а кому - решение ))) 


Раньше не обращал на это внимание, да и клиенты не жаловались, но, признаюсь, решение повышает удобство работы. Возьму к себе в копилочку. Спасибо!


P.S. пожалуй, надо добавить проверку свойства TdbDateTimePicker.Kind,  так как данный компонент используется и для ввода времени.  В этом случае либо не устанавливать обработчик, либо добавить формат для времени.

Визуальное программирование: блог и телеграм-канал.

Re: Как не отображать дату в DateTimePicker если она не выбрана?

Есть одна проблема, событие компонента OnChange срабатывает только при изменении значения пользователем. Т.е. если откроете запись с датой, то дата будет невидима, необходимо в событии OnShow пройтись по всем компонентам и удалить пробел из свойства Format если Checked = True

Dmitry.

15 (edited by mikhail_a 2019-07-08 19:12:52)

Re: Как не отображать дату в DateTimePicker если она не выбрана?

Протестировал, работает действительно только либо дата, либо время.
Т.е. код:
    case Kind of
          0:Format := 'dd.MM.yyyy';
          1:Format := 'HH:mm';
          2:Format := 'dd.MM.yyyy HH:mm';
некорректно срабатывает для Kind=2 - скрывается/появляется только дата, а время не скрывается.
Вопрос: каким образом правильно указать формат для поля "ДатаВремя", чтобы данные вывелись как  'dd.MM.yyyy HH:mm'?

Re: Как не отображать дату в DateTimePicker если она не выбрана?

Form1.DateTimePicker1.TimeFormat := ' ';

Вообще нет необходимости указывать формат, чтобы дата или время снова появились, достаточно вместо этого присвоить пустую строку.

Dmitry.

Re: Как не отображать дату в DateTimePicker если она не выбрана?

Прикрутил код от vovka3003 к реальному проекту.
Оказалось, что если повесить  DTModeInForms между основными begin и end, или на основной форме где идет соединение с MySQL базой, то соединение отрубается.
Почему - непонятно.
Пришлось повесить на формы, где реально есть даты.
Хорошо, что их нет на основной smile
Отображение формата в ДатаВремя устанавливается так:

      if not Checked then
      Format := #32 else
      begin
        case Kind of
          0:Format := 'dd.MM.yyyy';
          1:Format := 'HH:mm';
          2:begin Format := 'dd.MM.yy'; TimeFormat := 'HH:mm';  end;
        end;

18 (edited by mikhail_a 2019-07-16 16:22:26)

Re: Как не отображать дату в DateTimePicker если она не выбрана?

Оказывается, что не только коннект с базой пропадает.
Вообще не выполняется код события формы OnShow.
Даже безобидный ShowMessage не срабатывает.
Непонятки.
Похоже, существующий обработчик действительно затирается.
А событий OnCreate и OnPoint вроде в MVD нет