Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2007.09.09;
Скачать: CL | DM;

Вниз

ввод tDateTimePicker   Найти похожие ветки 

 
Евгений Р.   (2007-08-15 00:55) [0]

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


 
{RASkov} ©   (2007-08-15 02:03) [1]

> [0] Евгений Р.   (15.08.07 00:55)

Попробуй назначить Application.OnException и там ловить "свою" ошибку...
типа такого - if not E is <ТипОшибки> then ShowMessage(E.Message);


 
Юрий Зотов ©   (2007-08-15 07:28) [2]

???

F1

Description
This event occurs only if ParseInput is set to true.


 
Евгений Р.   (2007-08-15 11:46) [3]


> Description
> This event occurs only if ParseInput is set to true.


Если ParseInput=false, то запрещается вызов редактора.
Если True, то:
1.вызывается редактор
2.Пользователь может ввести любую символьную строку
3.Пользователь нажимает Enter
4.Система проверяет введенную стрку и, в случае ошибки генерит исключение.
5.После благополучного выполнение п.4 вызывается UserInput и можно самостоятельно обработать введенную строку.

Т.е. п.4 в принципе лишний.
Как можно его отключить?


 
Юрий Зотов ©   (2007-08-15 12:24) [4]

> Евгений Р.   (15.08.07 11:46) [3]

Если ParseInput=false, то вызов редактора НЕ запрещается, но этот редактор уже НЕ даст пользователю ввести ЛЮБУЮ символьную строку.

А даст ввести только корректную дату (с учетом високосных лет и прочего). После чего ее проверка, как СТРОКИ уже совершенно не нужна.

И если в программе нужна проверка введенной ДАТЫ на соответствие каким-то условиям, то ее и надо проверять, как ДАТУ, а не как СТРОКУ.

То есть, в обработчике ДРУГОГО события.


 
Юрий Зотов ©   (2007-08-15 12:43) [5]

> Евгений Р.   (15.08.07 11:46) [3]

Вдогонку.

Могу ошибаться, (а Delphi нет под рукой, проверить негде), но, насколько помню, в обработчике OnUserInput есть булевский var-параметр AllowChange (или что-то в этом духе) - и если, проверив СТРОКУ, выставить его в false, то исключение не возникает. Это и есть отключение п.4.


 
Евгений Р.   (2007-08-15 13:31) [6]

Стандартный ввод даты требует разделителя ".". Иначе - исключение.
Я в обработчике делаю преобразование, где допустимым являются ".", "," , "/". Но до обработки дело не доходит.


 
Евгений Р.   (2007-08-15 13:34) [7]


> Вдогонку.


см [3]

обработчике OnUserInput не вызывается. Исключение происходит до него


 
Юрий Зотов ©   (2007-08-15 13:43) [8]

> Евгений Р.   (15.08.07 13:31) [6]

Стандартный ввод даты требует разделителя DateSeparator (а не точка). По умолчанию он совпадает с региональными настройками, но можно и установить свой.

Только зачем? Если юзер что-то выставил в своих настройках - значит именно в таком формате он и хочет работать с датами. Пусть и работает. Да и с другими программами совместимо будет (с тем же оффисом, к примеру).


 
Leonid Troyanovsky ©   (2007-08-15 13:56) [9]


> Евгений Р.   (15.08.07 13:34) [7]

> обработчике OnUserInput не вызывается. Исключение происходит
> до него


Сделай наследника, подкорректировав ему

procedure TDateTimePicker.CNNotify(var Message: TWMNotify); // message CN_NOTIFY
var
 DT: TDateTime;
 AllowChange: Boolean;
begin
 with Message, NMHdr^ do
 begin
   Result := 0;
   if code  =  DTN_USERSTRING then
       begin
         with PNMDateTimeString(NMHdr)^ do
         begin
         //  DT := StrToDateTime(pszUserString);
           if Assigned(OnUserInput) then
           begin
             AllowChange := True;
             OnUserInput(Self, pszUserString, DT, AllowChange);
             dwFlags := Ord(not AllowChange);
           end
           else
             dwFlags := Ord(False);
           DateTimeToSystemTime(DT, st);
         end;
       end;
   else
     inherited;
 end;
end;

(не тестировалось)

Тогда вся ответственность за правильность DT ляжет на OnUserInput.

--
Regards, LVT.


 
Евгений Р.   (2007-08-15 14:20) [10]

На рабочем месте работает 4 смены+меняются друг с другом. Квалификации у разных пользователей разные. Работают на русском и английском (точка на разных клавишах). Поэтому, если программа это умеет, то хорошо. Тем более пользователи уже привыкли. Через dbGrid и tEdit реализовывалось легко. Хочу попробовать tDateTimePicker, но пока не получается.
К статьи Excel позволяет вводить через "." или "/".


 
Евгений Р.   (2007-08-15 14:54) [11]


> Leonid Troyanovsky ©   (15.08.07 13:56) [9]


Работал на Delphi5 и не знал о таком компоненте. Сейчас перехожу на 2005 и случайно его обнаружил.
Попробовал на Delphi5 - работает так как хотелось.

Где можно взять исходник VCL на 2005?

Закоментиорованная Вами строка присутствует в исходнике?


 
Leonid Troyanovsky ©   (2007-08-15 15:09) [12]


> Евгений Р.   (15.08.07 14:54) [11]

> Закоментиорованная Вами строка присутствует в исходнике?

Присутствует. Она там, IMHO, с незапямятных времен.

А про какой компонент речь?

--
Regards, LVT.


 
Leonid Troyanovsky ©   (2007-08-15 15:24) [13]


> Юрий Зотов ©   (15.08.07 13:43) [8]

По большому счету, это борландовский косяк.
Т.е., с одной стороны они разрешают, например, Format
(есть даже пример), а с другой не пускают в OnUserInput,
дабы предварительно пропарсить.

--
Regards, LVT.


 
Евгений Р.   (2007-08-15 15:27) [14]

DTN_USERSTRING:
       begin
         AllowChange := Assigned(FOnUserInput);
         with PNMDateTimeString(NMHdr)^ do
         begin

**********
           if AllowChange then
           begin
             DT := 0.0;
             FOnUserInput(Self, pszUserString, DT, AllowChange);
             DateTimeToSystemTime(DT, st);
           end;
           dwFlags := Ord(not AllowChange);
         end;
       end;
Это из D5. На месте ***** у Вас стоит //  DT := StrToDateTime(pszUserString);. Непонятно, зачем ее теперь добавили.

Киньте ComCtrls.pas на почту???


 
Leonid Troyanovsky ©   (2007-08-15 15:45) [15]


> Евгений Р.   (15.08.07 15:27) [14]

> Это из D5. На месте ***** у Вас стоит //  DT := StrToDateTime(pszUserString);
> . Непонятно, зачем ее теперь добавили.

Значит, добавили в D6. И в Turbo Delphi оно есть.

> Киньте ComCtrls.pas на почту???

D6 & Turbo Delphi?

--
Regards, LVT.


 
Leonid Troyanovsky ©   (2007-08-15 15:48) [16]


> Евгений Р.   (15.08.07 14:54) [11]

> Где можно взять исходник VCL на 2005?

А, все равно, править исходники - не наш метод.
Попробуй, как я показал.

--
Regards, LVT.


 
Евгений Р.   (2007-08-15 16:08) [17]

Править не буду, только читать. Киньте!!!!
Хотя делать новый компонент тоже не хочется.



Страницы: 1 вся ветка

Текущий архив: 2007.09.09;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.028 c
15-1186739788
Сергей М.
2007-08-10 13:56
2007.09.09
За что я уважаю или не уважаю Styx


4-1174064441
ChainicDenis
2007-03-16 20:00
2007.09.09
Как узнать, установлен ли драйвер


15-1187006902
Сатир
2007-08-13 16:08
2007.09.09
Вольные хлеба


2-1187355411
Arhipus
2007-08-17 16:56
2007.09.09
Расуспендить и засуспендить (3 вопроса)


15-1186900481
Тимоха
2007-08-12 10:34
2007.09.09
Что за ошибка такая