Есть DbGrid (а также датасёрс, датасет и его поля :-) ) Есть поле датасета типа DateTime. Как сделать чтобы
при редактировании поля можно было вводить например только время?
P.S. Пробовал поиграться с EditMask но что-то не очень мне это помогло т.е. при вводе времени 12:10 получалась ошибка в духе "Неверная дата 12:10"
Уважаемые авторы вопросов! Большая просьба сообщить о результатах решения проблемы на этой странице. Иначе, следящие за обсуждением, возможно имеющие аналогичные проблемы, не получают ясного представления об их решении. А авторы ответов не получают обратной связи. Что можно расценивать, как проявление неуважения к отвечающим от автора вопроса.
21-07-2009 03:50
С П А С И Б О ! ! ! Бел Амор.
этот вариант делает именно то, что нужно конкретно вам
Да, это именно так.
Это не то, что требовалось в изначальном вопросе.
Автор спрашивает:
Есть поле датасета типа DateTime. Как сделать чтобы
при редактировании поля можно было вводить например только время?
Мой вариант принципе автору подойдет. Но ты действительно сделал более универсальный вариант.
За это тебе большое спасибо.
Зачем выставлять маску в OnEnter?
Я поспешил! А как известно Поспешишь людей насмешишь.
при этом автоматически подставляется текущая дата, которая не только хранится в поле, но ещё при любой попытке редактирования времени, независимо от прежнего значения даты, вновь выставляется на текущую...
Это я понял еще когда писал функцию. Но на тот момент я другой вариант не мог реализовать(Наверное ЛЕНЬ).
ЗЫ: С меня, для Бел Амор, 'ПЛЮС'. Только не могу найти где его ставить.
oooDimitriuSooo:
Все проблема решена.
Написал вот такую функцию:
Вполне возможно, что этот вариант делает именно то, что нужно конкретно вам, однако у меня есть ряд соображений по поводу этого варианта...
1. Это не то, что требовалось в изначальном вопросе. Насколько я понимаю, автор вопроса хотел хранить (и отображать) отдельно: в одном поле только дату (т.е. только целую часть), а в другом - только время (т.е. только дробную часть). В вашем варианте в одном поле хранитя и дата, и время, при этом автоматически подставляется текущая дата, которая не только хранится в поле, но ещё при любой попытке редактирования времени, независимо от прежнего значения даты, вновь выставляется на текущую... Странное поведение для штатного режима работы...
2. Зачем выставлять маску в OnEnter? Это однократное действе, зачем повторять его каждый раз при получении фокуса гридом? Логичнее сделать это при создании формы.
На мой взгляд, решение изначального вопроса в первом приближении может выглядеть так:
unit DataSet_Util;
interface
uses DB, SysUtils;
type
{ Класс предназначен для назначения обработчиков событий
Экземпляры класса не создавать. Self не использовать }
TFieldEvents = class
public
procedure GetText_DateOnly(Sender: TField; var Text: string; DisplayText: Boolean);
procedure SetText_DateOnly(Sender: TField; const Text: string);
procedure GetText_TimeOnly(Sender: TField; var Text: string; DisplayText: Boolean);
procedure SetText_TimeOnly(Sender: TField; const Text: string);
end;
implementation
procedure TFieldEvents.GetText_DateOnly(Sender: TField; var Text: string;
DisplayText: Boolean);
begin
if not Sender.IsNull then
Text := DateToStr(Sender.AsDateTime);
end;
procedure TFieldEvents.SetText_DateOnly(Sender: TField; const Text: string);
begin
try
if Text='' then
Sender.AsString := ''
else
Sender.AsDateTime := StrToDate(Text);
except
raise Exception.Create('Неверная дата:'#13#10 + Text);
end;
end;
procedure TFieldEvents.GetText_TimeOnly(Sender: TField; var Text: string;
DisplayText: Boolean);
begin
if not Sender.IsNull then
Text := FormatDateTime('hh:nn', Sender.AsDateTime);
end;
procedure TFieldEvents.SetText_TimeOnly(Sender: TField; const Text: string);
begin
try
if Text='' then
Sender.AsString := ''
else
Sender.AsDateTime := StrToTime(Text);
except
raise Exception.Create('Неверное время:'#13#10 + Text);
end;
end;
end.
Использование в модуле формы:
implementation
uses DataSet_Util;
{$R *.dfm}
// В тестовом примере используется orders.db (DBDEMOS)
function TfrmMain.masckDateTime(CurrentDate: TDateTime): string;
var
Itog:String;
I:Integer;
begin
I:=1;
Itog:=DateToStr(CurrentDate);
while I<=Length(Itog) do begin
Insert('\',Itog, I);
I:=I+2;
end;
Result := Itog+' '+'90:00;1;_';
end;
написал в OnEnter: DBGridEh DBGridEh2.FieldColumns['StartTime'].EditMask := masckDateTime(Date); и все работает на ура.
Переформулирую вопрос:
Есть EhGrid в нем есть 2 отдельных
поля дата и время. Как сделать так чтобы при вводе значения в поле
время(например) нужно было вводить только время?
Пробовал поставить полю с-во EditMask равное '!90:00;1;_' и в OnPost
дописывал к нему дату но при таком раскладе есть 3 проблемы:
1)Вводим время 12:45 (например), переходим в следующее поле, возвращаемся
в поле времени и текст магически превращается в 12:00...
2)При нажатии кнопки открывающей календарь для выбора даты при введенном
времени вылетает ошибка типа "12:00 - не верная дата" (это в принципе
побеждает try ... except но хотелось бы обойтись без этого)
3)При выборе даты в календаре содержимое поля меняется на что-то вроде
99:__ (возможны и другие варианты)
Если вы заметили орфографическую ошибку на этой странице, просто выделите ошибку мышью и нажмите Ctrl+Enter. Функция может не работать в некоторых версиях броузеров.