![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
ввод tDateTimePicker [D2005, XP]
Евгений Р. © (2007-08-15 00:55:00)у tDateTimePicker есть событие UserInput. При обработке события можно устанавливать свойство Date. Если дата введена неправильно, до до события появляется сообщение об ошибке. Можно ли отключить системный контроль и самостоятельно анализировать введенную строку?
Евгений Р. (2007-08-15 16:08:00) [1]Править не буду, только читать. Киньте!!!!
Хотя делать новый компонент тоже не хочется.
Leonid Troyanovsky (2007-08-15 15:48:00) [2]
> Евгений Р. (15.08.07 14:54) [11]
> Где можно взять исходник VCL на 2005?
А, все равно, править исходники - не наш метод.
Попробуй, как я показал.
--
Regards, LVT.
Leonid Troyanovsky (2007-08-15 15:45:00) [3]
> Евгений Р. (15.08.07 15:27) [14]
> Это из D5. На месте ***** у Вас стоит // DT := StrToDateTime(pszUserString);
> . Непонятно, зачем ее теперь добавили.
Значит, добавили в D6. И в Turbo Delphi оно есть.
> Киньте ComCtrls.pas на почту???
D6 & Turbo Delphi?
--
Regards, LVT.
Евгений Р. (2007-08-15 15:27:00) [4]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:24:00) [5]
> Юрий Зотов © (15.08.07 13:43) [8]
По большому счету, это борландовский косяк.
Т.е., с одной стороны они разрешают, например, Format
(есть даже пример), а с другой не пускают в OnUserInput,
дабы предварительно пропарсить.
--
Regards, LVT.
Leonid Troyanovsky (2007-08-15 15:09:00) [6]
> Евгений Р. (15.08.07 14:54) [11]
> Закоментиорованная Вами строка присутствует в исходнике?
Присутствует. Она там, IMHO, с незапямятных времен.
А про какой компонент речь?
--
Regards, LVT.
Евгений Р. (2007-08-15 14:54:00) [7]
> Leonid Troyanovsky © (15.08.07 13:56) [9]
Работал на Delphi5 и не знал о таком компоненте. Сейчас перехожу на 2005 и случайно его обнаружил.
Попробовал на Delphi5 - работает так как хотелось.
Где можно взять исходник VCL на 2005?
Закоментиорованная Вами строка присутствует в исходнике?
Евгений Р. (2007-08-15 14:20:00) [8]На рабочем месте работает 4 смены+меняются друг с другом. Квалификации у разных пользователей разные. Работают на русском и английском (точка на разных клавишах). Поэтому, если программа это умеет, то хорошо. Тем более пользователи уже привыкли. Через dbGrid и tEdit реализовывалось легко. Хочу попробовать tDateTimePicker, но пока не получается.
К статьи Excel позволяет вводить через "." или "/".
Leonid Troyanovsky (2007-08-15 13:56:00) [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 13:43:00) [10]> Евгений Р. (15.08.07 13:31) [6]
Стандартный ввод даты требует разделителя DateSeparator (а не точка). По умолчанию он совпадает с региональными настройками, но можно и установить свой.
Только зачем? Если юзер что-то выставил в своих настройках - значит именно в таком формате он и хочет работать с датами. Пусть и работает. Да и с другими программами совместимо будет (с тем же оффисом, к примеру).
Евгений Р. (2007-08-15 13:34:00) [11]
> Вдогонку.
см [3]
обработчике OnUserInput не вызывается. Исключение происходит до него
Евгений Р. (2007-08-15 13:31:00) [12]Стандартный ввод даты требует разделителя ".". Иначе - исключение.
Я в обработчике делаю преобразование, где допустимым являются ".", "," , "/". Но до обработки дело не доходит.
Юрий Зотов (2007-08-15 12:43:00) [13]> Евгений Р. (15.08.07 11:46) [3]
Вдогонку.
Могу ошибаться, (а Delphi нет под рукой, проверить негде), но, насколько помню, в обработчике OnUserInput есть булевский var-параметр AllowChange (или что-то в этом духе) - и если, проверив СТРОКУ, выставить его в false, то исключение не возникает. Это и есть отключение п.4.
Юрий Зотов (2007-08-15 12:24:00) [14]> Евгений Р. (15.08.07 11:46) [3]
Если ParseInput=false, то вызов редактора НЕ запрещается, но этот редактор уже НЕ даст пользователю ввести ЛЮБУЮ символьную строку.
А даст ввести только корректную дату (с учетом високосных лет и прочего). После чего ее проверка, как СТРОКИ уже совершенно не нужна.
И если в программе нужна проверка введенной ДАТЫ на соответствие каким-то условиям, то ее и надо проверять, как ДАТУ, а не как СТРОКУ.
То есть, в обработчике ДРУГОГО события.
Евгений Р. (2007-08-15 11:46:00) [15]
> 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 07:28:00) [16]???
F1
Description
This event occurs only if ParseInput is set to true.
{RASkov} (2007-08-15 02:03:00) [17]> [0] Евгений Р. (15.08.07 00:55)
Попробуй назначить Application.OnException и там ловить "свою" ошибку...
типа такого -if not E is <ТипОшибки> then ShowMessage(E.Message);