![]() |
|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
|||
|
|||
![]() Здравствуйте, помогите найти ошибку, я хочю создать программу, в которой индикатор прогресса заполся по мере того, как проходит время между первой и второй временной отметкой указанных в лейблах? Заполняются только два процента от силы. Помогите найти ошибку:
Код:
unit Unit2; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, ComCtrls, StdCtrls, ExtCtrls; type TForm2 = class(TForm) Label1: TLabel; Label2: TLabel; ProgressBar1: TProgressBar; Button1: TButton; Timer1: TTimer; procedure FormShow(Sender: TObject); procedure Timer1Timer(Sender: TObject); private { Private declarations } public { Public declarations } end; var Form2: TForm2; Raz,Per:integer; implementatiоn {$R *.dfm} procedure TForm2.FormShow(Sender: TObject); var Time1, Time2: TDateTime; begin Time1:=StrtoTime(Label1.Caption); Time2:=StrtoTime(Label2.Caption); Raz:=((StrToInt(FormatDateTime('h',Time2)))*60+StrToInt(FormatDateTime('n',Time2)))*60- ((StrToInt(FormatDateTime('h',Time1)))*60+StrToInt(FormatDateTime('n',Time1)))*60; if Raz Mod 2 <> 0 then Raz:=Raz-1; Per:=Raz div 100; if StrToTime(Label1.Caption+':00') <= Time then Timer1.Enabled:=True; end; procedure TForm2.Timer1Timer(Sender: TObject); begin Timer1.Interval:=Timer1.Interval*Per; progressbar1.Positiоn := progressbar1.Positiоn + 1; if progressbar1.Positiоn = 100 then timer1.Enabled := false; end; end. Последний раз редактировалось Admin, 10.02.2011 в 20:27. |
#2
|
||||
|
||||
![]() Попробуй перенести строчку кода из события Timer1Timer
Код:
Timer1.Interval:=Timer1.Interval*Per; |
#3
|
||||
|
||||
![]() Если я тебя правильно понял то мой пример тебе поможет. (Доработано до секунд). Вводи значения и наблюдай!
Последний раз редактировалось Pilot_Red, 14.06.2012 в 22:25. |
#4
|
||||
|
||||
![]() Чтобы работало "на всем диапазоне временой оси" в пределах суток
в таймере все убери все и вставь этот кусок кода Код:
sec:=RazSec-SecondsBetween(time,t2); ProgressBar1.Position:=(round(100*(sec-sec1)/RazSec)); |
#5
|
|||
|
|||
![]() Цитата:
|
#6
|
|||
|
|||
![]() Цитата:
|
#7
|
||||
|
||||
![]() А мое вложение не катит? Там по моему есть ответ на твой вопрос! в виде работающего сорца. Только не забудь в таймере(моего исходника) вот это вставить(все остальное из таймера убери)
Код:
sec:=RazSec-SecondsBetween(time,t2); ProgressBar1.Position:=(round(100*(sec-sec1)/RazSec)); что делает программа: сначала вычесляет кол-во секунд между двумя time-ми (SecondsBetween) потом (уже в таймере) вычесляется текущя секунда относительно найденого интервала(кол-ва секунд). А потом с помощью обычной интерполяции находим положение прогрессбара он как раз и показывает проценты(possition) |
#8
|
|||
|
|||
![]() Цитата:
Я видоизменил код, посмотри, мой вариант, для того, чтобы отображался текущий процент уже пройденного времени, у меня правда полностью заполняется прогресс бар начальное время ставлю 21.00 конечное 23.00, а текущее время 22.30 Код:
unit Unit2; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, ComCtrls, StdCtrls, ExtCtrls; type TForm2 = class(TForm) Label1: TLabel; Label2: TLabel; ProgressBar1: TProgressBar; Button1: TButton; Timer1: TTimer; procedure FormShow(Sender: TObject); procedure Timer1Timer(Sender: TObject); private { Private declarations } public { Public declarations } end; var Form2: TForm2; Raz,RazNow,BarNow,Per:integer; implementation {$R *.dfm} procedure TForm2.FormShow(Sender: TObject); var Time1, Time2: TDateTime; begin Time1:=StrtoTime(Label1.Caption); Time2:=StrtoTime(Label2.Caption); RazNow:=((StrToInt(FormatDateTime('h',Time)))*60+StrToInt(FormatDateTime('n',Time)))*60-((StrToInt(FormatDateTime('h',Time1)))*60+StrToInt(FormatDateTime('n',Time1)))*60;; Raz:=((StrToInt(FormatDateTime('h',Time2)))*60+StrToInt(FormatDateTime('n',Time2)))*60- ((StrToInt(FormatDateTime('h',Time1)))*60+StrToInt(FormatDateTime('n',Time1)))*60; if Raz Mod 2 <> 0 then Raz:=Raz-1; Per:=Raz div 100; BarNow:=RazNow div Per; ProgressBar1.Position:=ProgressBar1.Position+RazNow; if StrToTime(Label1.Caption+':00') <= Time then Timer1.Enabled:=True; Timer1.Interval:=Timer1.Interval*Per; end; procedure TForm2.Timer1Timer(Sender: TObject); begin //Timer1.Interval:=Timer1.Interval*Per; progressbar1.Position := progressbar1.Position + 1; if progressbar1.Position = 100 then timer1.Enabled := false; end; end. Последний раз редактировалось Yamaha, 10.02.2011 в 22:41. |
#9
|
|||
|
|||
![]() Цитата:
|
#10
|
||||
|
||||
![]() Изменить цвет progressbar можно так:
Код:
PostMessage(ProgressBar1.Handle, $0409, 0, clGreen); |
#11
|
|||
|
|||
![]() Цитата:
|
#12
|
||||
|
||||
![]() странно, потому что сколько уже пользуюсь именно этим методом не разу не подвел, цвет шкалы меняется. насчет фона то смотри исходник, там и фон и шкала меняются.
|
#13
|
|||
|
|||
![]() Цитата:
|
#14
|
||||
|
||||
![]() У меня Delphi7 и все работает.
|
#15
|
||||
|
||||
![]() Просто этот способ для стандартной цветовой схемы, а вот для Аэро уже не катит.
Жизнь такова какова она есть и больше никакова. Помогаю за спасибо. |