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

Delphi Sources



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

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 25.03.2009, 01:06
"Hatchet" Harry "Hatchet" Harry вне форума
Прохожий
 
Регистрация: 22.03.2009
Сообщения: 30
Репутация: 10
По умолчанию загнать время TTimer в Label.Caption

Есть объект TTimer (таймер), соответственно время на таймере начинает капать с того момента, как
Код:
Timer.Enabled := True //Запуск таймера
Возможно ли это время загнать в какой-нить Label.Caption (ну т.е. чтобы оно динамически отображалось на форме)?
Ответить с цитированием
  #2  
Старый 25.03.2009, 01:42
Аватар для Electronic_Arts
Electronic_Arts Electronic_Arts вне форума
Местный
 
Регистрация: 13.07.2006
Адрес: на земле
Сообщения: 559
Версия Delphi: XE5
Репутация: 18
Восклицание

label1.caption:= timetostr(now);
Ответить с цитированием
  #3  
Старый 25.03.2009, 02:10
"Hatchet" Harry "Hatchet" Harry вне форума
Прохожий
 
Регистрация: 22.03.2009
Сообщения: 30
Репутация: 10
По умолчанию

Виноват, не пояснил: у меня таймер (Timer1) с интервалом 20 минут работает, поэтому ему на событие OnTime нельзя назначить, чтобы он собственное время работы в TimerLabel.Caption присваивал!
Сам только что допёр до такого способа: добавил на форму еще 1 таймер который уже работывает с интервалом в 1 секунду и, соответственно, на событие OnTimer я ему назначаю присвоение TimerLabel.Caption времени работы первого таймера. . Вот так мы и получаем динамичную обнову лейбла т.к. интервал у нас - 1 секунда на этом таймере)
Код:
procedure TForm.Timer2Timer(Sender: TObject);
begin
 TimerLabel.Caption := TimeToStr(Time);
end;
Только вот теперь в чем проблема:
TimeToStr(Time) - этим мы выводим системное время, а мне нужно как-то время работы таймера1 с начала его запуска вывести.
Ответить с цитированием
  #4  
Старый 25.03.2009, 02:17
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,015
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Сделай отсечку времени в момент начала работы таймера 1 и потом выводи разницу между запомненым и текущим временами.

Типа:
Код:
var
  TimeBegin : TDateTime;

procedure TForm1.Timer1Timer(Sender : TObject);
begin
  TimeBegin := Now;
  ...
end;

procedure TForm1.Timer2Timer(Sender : TObject);
begin
  Label1.Caption := TimeToStr(Now - TimeBegin);
end;
Ответить с цитированием
  #5  
Старый 25.03.2009, 02:20
Аватар для Karsh
Karsh Karsh вне форума
Активный
 
Регистрация: 22.09.2007
Адрес: SPb
Сообщения: 228
Версия Delphi: 7, 2009, XE2
Репутация: 70
По умолчанию

TimeBegin := Now лучше задавать вместе с Timer1.Enble:= true
А для второго таймера - как lmikle сказал
__________________
Начинающий программист уверен, что в 1 килобайте 1000 байт.
Законченный программист уверен, что в 1 километре 1024 метра.

Последний раз редактировалось Karsh, 25.03.2009 в 02:25.
Ответить с цитированием
  #6  
Старый 25.03.2009, 02:42
"Hatchet" Harry "Hatchet" Harry вне форума
Прохожий
 
Регистрация: 22.03.2009
Сообщения: 30
Репутация: 10
Радость

И опять же только что сам пришел к тому что надо вначале проги описать глобальную переменную StartTime типа TDateTime; присвоить ей системное время в момент включения первого таймера; В событии OnTimer второго таймера описать 2 переменные EndTime и ResultTime обе типа TDateTime; присвоить EndTime системное время на момент срабатывания второго таймера (т.е. каждую секунду); присвоить переменной ResultTime разницу: EndTime - StartTime, ну и естественно вывести всё это дело на нужный лейбл:
Код:
TimerLabel.Caption := TimeToStr(ResultTime);
Был очень рад когда всё норм скомпилилось и корректно срабатывало! Зашел в топик, а тут уже этот способ вы предлагаете))).
И тем не менее: Electronic_Arts,lmikle,Karsh спасибо!
PS: Ночью мозг как-то тормозит (сначала спрашиваю а потом уже приходит в голову норм мысль и начинаю делать сам).
Ответить с цитированием
  #7  
Старый 05.04.2009, 16:23
"Hatchet" Harry "Hatchet" Harry вне форума
Прохожий
 
Регистрация: 22.03.2009
Сообщения: 30
Репутация: 10
По умолчанию

Подскажите, а каким способом можно получить текущее системное время, переведённое в 24-часовой формат(подозреваю, что как-то с помощью функции FormatDateTime, но что-то не могу сообразить, как именно). И как сделать чтобы время работы таймера на капче лейбла выводилось выше 24-часов (не обнуляясь, в момент перехода с 24 на 0 часов).
Ответить с цитированием
  #8  
Старый 05.04.2009, 16:52
Аватар для Страдалецъ
Страдалецъ Страдалецъ вне форума
Гуру
 
Регистрация: 09.03.2009
Адрес: На курорте, из окна вижу теплое Баренцево море. Бррр.
Сообщения: 4,721
Репутация: 52347
По умолчанию

Цитата:
Сообщение от "Hatchet" Harry
Подскажите, а каким способом можно получить текущее системное время, переведённое в 24-часовой формат(подозреваю, что как-то с помощью функции FormatDateTime, но что-то не могу сообразить, как именно). И как сделать чтобы время работы таймера на капче лейбла выводилось выше 24-часов (не обнуляясь, в момент перехода с 24 на 0 часов).
Это как? 24:00:01,24:00:02 и далее что-ли?
__________________
Жизнь такова какова она есть и больше никакова.
Помогаю за спасибо.
Ответить с цитированием
  #9  
Старый 05.04.2009, 17:14
"Hatchet" Harry "Hatchet" Harry вне форума
Прохожий
 
Регистрация: 22.03.2009
Сообщения: 30
Репутация: 10
По умолчанию

Цитата:
Сообщение от Страдалецъ
Это как? 24:00:01,24:00:02 и далее что-ли?
да, чтоб 24, 30, 48 и т.д. часов можно было словить
Знаю такой способ пока: проверять, если EndTime - StartTime = '00:00:00' то прибавлять к этому делу +24:00:00, но, думаю как-то это совсем "по-левому".
Ответить с цитированием
  #10  
Старый 05.04.2009, 17:59
Nyctos Kasignete Nyctos Kasignete вне форума
Активный
 
Регистрация: 29.03.2009
Сообщения: 300
Репутация: 94
По умолчанию

Цитата:
Сообщение от "Hatchet" Harry
каким способом можно получить текущее системное время, переведённое в 24-часовой формат
Есть функция DateTimeToSystemTime. Можно так:
Код:
var
  dt: TSystemTime;
begin
  DateTimeToSystemTime(Now, dt);
  Label1.Caption := 'Hour: ' + IntToStr(dt.wHour);
  Label2.Caption := 'Minute: ' + IntToStr(dt.wMinute);
  Label3.Caption := 'Second: ' + IntToStr(dt.wSecond);
end;

Цитата:
Сообщение от "Hatchet" Harry
как сделать чтобы время работы таймера на капче лейбла выводилось выше 24-часов
Для этого можно использовать функцию HoursBetween из модуля DateUtils, передавая ей в качестве параметров дату и время старта таймера и результат функции Now.
Код:
Label1.Caption := IntToStr(HoursBetween(StartDateTime, Now));

_____________

P.S. Кстати, если посмотреть исходный код функции Now, то можно увидеть, что под Windows вызывается API-шная функция GetLocalTime, заполняющая структуру SYSTEMTIME с полями wHour, wMinute, wSecond и т.д. Так что если программа для Windows, то можно использовать прямо эту функцию, не пользуясь функцией Now:
Код:
var
  sysTime: _SYSTEMTIME;
begin
  GetLocalTime(sysTime);
  Label2.Caption := 'Hour: ' + IntToStr(sysTime.wHour);
  Label3.Caption := 'Minute: ' + IntToStr(sysTime.wMinute);
  Label4.Caption := 'Second: ' + IntToStr(sysTime.wSecond);
end;

Последний раз редактировалось Nyctos Kasignete, 05.04.2009 в 18:39.
Ответить с цитированием
  #11  
Старый 05.04.2009, 18:04
Аватар для Страдалецъ
Страдалецъ Страдалецъ вне форума
Гуру
 
Регистрация: 09.03.2009
Адрес: На курорте, из окна вижу теплое Баренцево море. Бррр.
Сообщения: 4,721
Репутация: 52347
По умолчанию

Я такое делал, только у меня в обратную сторону к 00:00:00 считало, для вас адаптировал:
Код:
unit Unit10;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ExtCtrls;

type
  TForm10 = class(TForm)
    Timer1: TTimer;
    Label1: TLabel;
    procedure Timer1Timer(Sender: TObject);
    procedure FormCreate(Sender: TObject);
  private
   LeftSeconds: Integer;
  public
    { Public declarations }
  end;

var
  Form10: TForm10;

implementation

{$R *.dfm}

procedure TForm10.FormCreate(Sender: TObject);
begin
 LeftSeconds := 3600*24-5;
end;

procedure TForm10.Timer1Timer(Sender: TObject);
Var H, M, S: String;
    T: Integer;
begin
 T := LeftSeconds;
 H := IntToStr(T div 3600);
 Dec(T, T div 3600 * 3600);
 M := IntToStr(T div 60);
 Dec(T, T div 60 * 60);
 S := IntToStr(T mod 60);

 if Length(H) = 1 then H := '0'+ H;
 if Length(M) = 1 then M := '0'+ M;
 if Length(S) = 1 then S := '0'+ S;
 Label1.Caption := H + ':' + M + ':' + S;
 Inc(LeftSeconds);
end;

Код:
object Form10: TForm10
  Left = 0
  Top = 0
  Caption = 'Form10'
  ClientHeight = 137
  ClientWidth = 406
  Color = clBtnFace
  Font.Charset = DEFAULT_CHARSET
  Font.Color = clWindowText
  Font.Height = -11
  Font.Name = 'Tahoma'
  Font.Style = []
  OldCreateOrder = False
  OnCreate = FormCreate
  PixelsPerInch = 96
  TextHeight = 13
  object Label1: TLabel
    Left = 128
    Top = 40
    Width = 146
    Height = 45
    Caption = '00:00:00'
    Font.Charset = DEFAULT_CHARSET
    Font.Color = clWindowText
    Font.Height = -37
    Font.Name = 'Tahoma'
    Font.Style = []
    ParentFont = False
  end
  object Timer1: TTimer
    Interval = 5
    OnTimer = Timer1Timer
    Left = 80
    Top = 8
  end
end
__________________
Жизнь такова какова она есть и больше никакова.
Помогаю за спасибо.
Ответить с цитированием
  #12  
Старый 07.04.2009, 02:55
"Hatchet" Harry "Hatchet" Harry вне форума
Прохожий
 
Регистрация: 22.03.2009
Сообщения: 30
Репутация: 10
По умолчанию

Если кому интересно, привожу свой окончательный вариант
(Напомню, задача была поставлена следующая: отобразить время с момента включения таймера1 и динамически выводить его на лейбл1.
Было реализованно следующим образом: добавляем таймер2 с interval = 1000 (1 сек), включаем этот таймер вместе с таймером1 и пишем ему в событие OnTimer:
Код:
procedure TMainForm.Timer2Timer(Sender: TObject);
var
 ResultTime: TDateTime;
begin
 ResultTime := Now - StartTime;
 TimerLabel.Caption := IntToStr(HoursBetween(StartTime, Now)) + ':' + FormatDateTime('nn:ss', ResultTime);
end;
где StartTime - переменная типа TDateTime, которую мы определяем при включении таймера1, как StartTime := Now;


PS: В очередной раз, низкий поклон помогавшим!
Ответить с цитированием
Ответ


Delphi Sources

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

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

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

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


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


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

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

ВКонтакте   Facebook   Twitter