Форум: "Начинающим";
Текущий архив: 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