Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 15.09.2018, 06:24
TEKTON TEKTON вне форума
Новичок
 
Регистрация: 14.03.2011
Сообщения: 60
Репутация: 10
По умолчанию Разбить строку разделителями

Приветствую.
Задача такая.
Надо реализовать типа заводки будильника/таймера.

Есть строка вида 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  
Старый 15.09.2018, 15:50
Аватар для Kailon
Kailon Kailon вне форума
Активный
 
Регистрация: 06.06.2010
Сообщения: 339
Версия Delphi: 10.4
Репутация: 429
Сообщение

А для указания времени не лучше ли подойдет MaskEdit с маской !90:00:00;1;_
__________________
Всегда пишите код так, будто сопровождать его будет склонный к насилию психопат, который знает, где вы живете.
Ответить с цитированием
  #3  
Старый 15.09.2018, 18:23
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,003
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Выводи в 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  
Старый 17.09.2018, 07:00
TEKTON TEKTON вне форума
Новичок
 
Регистрация: 14.03.2011
Сообщения: 60
Репутация: 10
По умолчанию

Короче полазил я по компонентам и нашёл DateTimePicker (вкладка Win32) который можно использовать для моей задачи

Если ему задать свойства:
Код:
Kind:= dtkTime;
DateMode:=dmUpDown;
То получается классная штука для организации выставления времени в таймере.

Было б круто ещё виртуальную клаву к нему прикрутить.
Например установил курсор на ячейку с минутами, потом на виртуальной клаве мышей нажал пару конопок...
Но как только курсор уходит с DateTimePicker, то фокус теряется и переходит на кнопку вирт.клавы
Может как то можно хранить в переменную значение фокуса (часы:минуты:секунды) и потом эмулировать ввод?

Последний раз редактировалось TEKTON, 17.09.2018 в 14:30.
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра
Комбинированный вид Комбинированный вид

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 13:56.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter