![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
|
Опции темы | Поиск в этой теме | Опции просмотра |
|
|
|
#1
|
|||
|
|||
|
Приветствую.
Задача такая. Надо реализовать типа заводки будильника/таймера. Есть строка вида 00:00:00 Есть виртуальная клавиатура (аля калькулятор) Мне надо что б числа с клавиатуры записывались с права на лево. После каждых двух чисел ставился разделитель ":". На клаве есть кнопка удаления. Она должна удалять один, самый правый символ. (наподобии как в стандартном виндовом калькуляторе работает кнопка со стрелкой). При удалении в самый правый символ должен записываться ноль (что б баланс сохранялся). Короче должно всегда быть три группы по 2 символа разделённых двоеточиями. Тип такого: 03:10:06 или 00:00:07 Например что б завести таймер на 2часа и 10 минут, надо нажать на клавиатуре 21000 (02:10:00 Часы : Минуты : Секунды) И если можно продублировать ввод с виртуальной клавиатуры и с обычной. И ограничить ввод только целыми числами (что б нельзя было вводить буквы, дроби, и символы. Только числа). Спасибо. Вставку в конец строки делаю так: Код:
uses System
....
var
Target: string;
begin
Target:= '12345678';
Insert('-+-', Target, Length(Target)+1); // Как определить какая кнопка была нажата и добавить число соответствующее? Что б не писать кучу проверок.
ShowMessage('Target '+Target);
end;Удаление делаю так: Код:
var
Target: string;
begin
Target:= '12345678';
delete(Target,Length(Target),Length(Target)); // Удаляем символ с конца
Insert('0', Target, 0); // Записываем ноль в начало
ShowMessage('Target '+Target);
end;Последний раз редактировалось TEKTON, 15.09.2018 в 06:52. |
|
#2
|
||||
|
||||
|
А для указания времени не лучше ли подойдет MaskEdit с маской !90:00:00;1;_
|
|
#3
|
|||
|
|||
|
Выводи в TLabel, а клаву отлавливай на уровне формы.
Код:
// Вывод времени. У Label1 поставить Align=alRight
// Кондово, но должно работать.
procedure TForm1.InputTime(N : Integer);
var
s, t : String;
I : Integer;
begin
If (N >= 0) And (N <=10) Then
Begin
s := StringReplace(Label1.Caption,':','',[srReplaceAll]);
If N = 10 Then
Begin
If s <> '' Then s := Copy(s,1,length(s)-1);
End
Else
Begin
If Length(s) < 6 Then s := s + IntToStr(N);
End;
t := ''
For I := Length(s) DownTo 1 Do
Begin
t := s[i] + t;
If (Length(t) = 2) Or (Length(t) = 5) Then t := ':' + t;
End;
Label1.Caption := t;
End;
end;
// Обработчик кнопок. Назначить всем кнопкам 0-9 и забой.
// Каждой кнопке указать в св-ве Tag соответсв. значение (0-9
// для цифр, 10 - для забой)
procedure TForm1.KeyButtonClick(Sender : TObject)
begin
InputTime((Sender As TButton).Tag);
end;
// Обработчик для клавиатуры. У формы поставить свойство
// KeyPreview:=True
procedute TForm1.FormKeyPress(Sender : TObject; var Key : Char);
begin
If Key In ['0'..'9'] Then InputTime(StrToInt(Key))
Else If Key = #8 Then InputTime(10); // #8 - забой, если не ошибаюсь.
end; |
| Этот пользователь сказал Спасибо lmikle за это полезное сообщение: | ||
TEKTON (15.09.2018)
| ||
|
#4
|
|||
|
|||
|
Короче полазил я по компонентам и нашёл DateTimePicker (вкладка Win32) который можно использовать для моей задачи
![]() Если ему задать свойства: Код:
Kind:= dtkTime; DateMode:=dmUpDown; ![]() Было б круто ещё виртуальную клаву к нему прикрутить. Например установил курсор на ячейку с минутами, потом на виртуальной клаве мышей нажал пару конопок... Но как только курсор уходит с DateTimePicker, то фокус теряется и переходит на кнопку вирт.клавы ![]() Может как то можно хранить в переменную значение фокуса (часы:минуты:секунды) и потом эмулировать ввод? Последний раз редактировалось TEKTON, 17.09.2018 в 14:30. |