IPB
ЛогинПароль:

> ВНИМАНИЕ!

Прежде чем задать вопрос, смотрите FAQ.
Рекомендуем загрузить DRKB.

Наладить общение поможет, если вы подпишитесь по почте на новые темы в этом форуме.

 
 Ответить  Открыть новую тему 
> Вопрос по использованию системной даты в программе
сообщение
Сообщение #1


Бывалый
***

Группа: Пользователи
Сообщений: 205
Пол: Мужской
Реальное имя: Евгений

Репутация: -  0  +


В программе нужно постоянно вводить текущую дату в dbedit1. Видел такой вариант, когда вместо того чтобы вводить дату самому, при нажатии пробела автоматически вводится сначала число, затем при втором нажатии пробела - месяц, при третьем год и сразу же переход курсора в dbedit2. Т.е. программа берет системную дату и помещает ее в нужное поле. Подскажите пожалуйста, как реализовать такой вариант???
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #2


Гость






К примеру, так:
uses DateUtils;
// ...
procedure TForm1.DBEdit1KeyPress(Sender: TObject; var Key: Char);
var curr: TDbEdit;
begin
if Key = #32 then begin
curr := Sender as TDbEdit;
case Length((Sender as TDbEdit).Text) of
0: curr.Text := Format('%2d/', [DayOf(Now)]);
3: curr.Text := curr.Text + Format('%2d/', [MonthOf(Now)]);
6: curr.Text := curr.Text + Format('%4d', [YearOf(Now)]);
end;
curr.SelStart := Length(curr.Text);
curr.SelLength := 0;
Key := #0;
end;
end;
Это - само заполнение нажатиями пробелов, ну, а после заполнения, уж сам перекинь фокус на другой компонент...
 К началу страницы 
+ Ответить 
сообщение
Сообщение #3


Бывалый
***

Группа: Пользователи
Сообщений: 205
Пол: Мужской
Реальное имя: Евгений

Репутация: -  0  +


а можно пояснить строки?:
      0: curr.Text := Format('%2d/', [DayOf(Now)]);
3: curr.Text := curr.Text + Format('%2d/', [MonthOf(Now)]);
6: curr.Text := curr.Text + Format('%4d', [YearOf(Now)]);

что означает 0, 3 и 6 вначале? и значения с процентами? Данные в квадратных скобках воспринимаются программой как undecleared identifier 'DayOf', 'MonthOf', 'YearOf'

Сообщение отредактировано: 1147 -
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #4


Гость






Цитата
Данные в квадратных скобках воспринимаются программой как undecleared identifier 'DayOf', 'MonthOf', 'YearOf'
А тот модуль, который приведен первой строкой, ты подключил? Я не просто так его написал...

Цитата
что означает 0, 3 и 6 вначале?
Логика: если содержимое DBEdit-а пусто (длина содержимого = 0), то надо добавить первый кусок - число... Число и разделитель - это уже 3 символа, если при нажатии пробела в DBEdit-е уже есть эти 3 символа, то добавляем месяц, и так далее...

Цитата
и значения с процентами?
Это форматная строка для функции Format, процент - это признак спецификатора формата, что функция ожидает в качестве параметра, и как собственно это форматировать... Вот "d" - это десятичное число, а двойка перед ним - это сколько позиций выделять под это число... Подробнее - в Хелпе по Format-у
 К началу страницы 
+ Ответить 
сообщение
Сообщение #5


Бывалый
***

Группа: Пользователи
Сообщений: 205
Пол: Мужской
Реальное имя: Евгений

Репутация: -  0  +


Понятно, все замечательно получается, вот только число и месяц, например 01.06 получается как 1. 6, а при использовании поиска это может вызвать некоторые проблемы . Что влияет на такой вывод формата и можно ли добавить нули если число и месяц состоят из одной цифры?

И еще такой вопрос: у меня была маска для ввода такого формата: __.__.____ Это уже означает что строка <>0. Соответственно маску нужно убрать. В случае если пользователь самостоятельно вводит дату, вместо точек могут оказаться запятые и тд. что также нежелательно. Нельзя ли маску приравнять к 0 или как то по другому решить этот вопрос? В общем чтобы не отказываться от маски?

Сообщение отредактировано: 1147 -
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #6


Гость






Так?
procedure TForm1.DBEdit1KeyPress(Sender: TObject; var Key: Char);

function Conv(w: word; len: integer): string;
begin
result := IntToStr(w);
while Length(result) < len do result := '0' + result;
end;

var curr: TDbEdit;
begin
if Key = #32 then begin
curr := Sender as TDbEdit;
case Length((Sender as TDbEdit).Text) of
0: curr.Text := Conv(DayOf(Now), 2) + '/';
3: curr.Text := curr.Text + Conv(MonthOf(Now), 2) + '/';

// Тут можно и не менять, год всегда четырехзначный
6: curr.Text := curr.Text + Conv(YearOf(Now), 4);
end;
curr.SelStart := Length(curr.Text);
curr.SelLength := 0;
Key := #0;
end;
end;
 К началу страницы 
+ Ответить 
сообщение
Сообщение #7


Бывалый
***

Группа: Пользователи
Сообщений: 205
Пол: Мужской
Реальное имя: Евгений

Репутация: -  0  +


Большое спасибо за неоценимую помощь, основная проблема решена, а с маской придумаю что-нибудь good.gif
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #8


Бывалый
***

Группа: Пользователи
Сообщений: 205
Пол: Мужской
Реальное имя: Евгений

Репутация: -  0  +


А можно ли использовать автоматический ввод даты для ячейки DBGrid? Вернее в определенном столбце все ячейки должны обладать такой возможностью

Сообщение отредактировано: 1147 -
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #9


Гость






Подменяем стандартный InPlace редактор на DBEdit, "и всего делов" (С)... Вот тут описывается технология: Google cache: НеОбычный TDBGrid (или в DRKB -> VCL -> Вставка одних компонентов в другие -> Помещение компонентов в TDBGrid)
 К началу страницы 
+ Ответить 
сообщение
Сообщение #10


Бывалый
***

Группа: Пользователи
Сообщений: 205
Пол: Мужской
Реальное имя: Евгений

Репутация: -  0  +


Для этого необходимо чтобы в DBEdit уже стояла дата или он может быть пустым?
Ясно) Тогда нужно чтобы дата без нажатия пробела сразу (например при запуске программы) появлялась в каком-нибудь нивидимом компоненте который затем помещается в ячейук DBGridа

Сообщение отредактировано: 1147 -
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #11


Бывалый
***

Группа: Пользователи
Сообщений: 205
Пол: Мужской
Реальное имя: Евгений

Репутация: -  0  +


Это не совсем то что хотелось бы... Нельзя ли без создания каких то ненужных компонентов, сделать так чтобы при фокусировке, в ячейке dbgrida появлялась дата?
Например как с label:
var d:string;
begin
d:=datetostr;
label1.caption:=(d);
end;


Сообщение отредактировано: 1147 -
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #12


Гость






Цитата
сделать так чтобы при фокусировке, в ячейке dbgrida появлялась дата
Если поле, хранящее дату - пустое, то при клике по нему туда заносится сегодняшнее число. Уже существующие значения на сегодня не меняются (если надо, чтоб менялись - убери условие). И не забудь поменять название столбца не свое...
procedure TForm1.DBGrid1CellClick(Column: TColumn);
begin
if CompareText(Column.Field.FieldName, 'DateOfBirth') = 0 then
begin
if Column.Field.AsString = '' then begin
Column.Field.AsString := DateToStr(Today);
end;
end;
end;
 К началу страницы 
+ Ответить 
сообщение
Сообщение #13


Бывалый
***

Группа: Пользователи
Сообщений: 205
Пол: Мужской
Реальное имя: Евгений

Репутация: -  0  +


возникает ошибка: "dataset not in edit or insert mode". Не пойму в чем дело..
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #14


Гость






Цитата
Не пойму в чем дело..
Я тоже... Код, приведенный выше, тестировался, и отработал на реальной базе данных. Попробуй на новом проекте.
 К началу страницы 
+ Ответить 

 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 





- Текстовая версия 28.03.2024 17:37
500Gb HDD, 6Gb RAM, 2 Cores, 7 EUR в месяц — такие хостинги правда бывают
Связь с администрацией: bu_gen в домене octagram.name