Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2007.09.09;
Скачать: [xml.tar.bz2];

Вниз

ввод 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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.5 MB
Время: 0.038 c
15-1187117101
@!!ex
2007-08-14 22:45
2007.09.09
Навязывание рекламы.


15-1187184079
Черный Шаман
2007-08-15 17:21
2007.09.09
Четкое быстрое сравнение строк без учета регистра символов.


15-1186663539
Sdubaruhnul
2007-08-09 16:45
2007.09.09
Pixel ratio и сканер HP


15-1187165904
Sonia
2007-08-15 12:18
2007.09.09
Интересные вещи творятся


1-1182926455
Stanislav
2007-06-27 10:40
2007.09.09
Упаковка данных с помощью ZLIB





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский