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

Delphi Sources



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

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 10.02.2011, 19:56
Yamaha Yamaha вне форума
Прохожий
 
Регистрация: 10.02.2011
Сообщения: 14
Репутация: 10
По умолчанию Помогите с задачей по Дельфи

Здравствуйте, помогите найти ошибку, я хочю создать программу, в которой индикатор прогресса заполся по мере того, как проходит время между первой и второй временной отметкой указанных в лейблах? Заполняются только два процента от силы. Помогите найти ошибку:
Код:
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  
Старый 10.02.2011, 20:33
Аватар для Belanserg
Belanserg Belanserg вне форума
Прохожий
 
Регистрация: 18.11.2009
Сообщения: 29
Версия Delphi: 7
Репутация: 12
По умолчанию

Попробуй перенести строчку кода из события Timer1Timer
Код:
Timer1.Interval:=Timer1.Interval*Per; 
в конец события form2show
Ответить с цитированием
  #3  
Старый 10.02.2011, 20:53
Аватар для Pilot_Red
Pilot_Red Pilot_Red вне форума
Продвинутый
 
Регистрация: 01.11.2006
Адрес: Карелия
Сообщения: 702
Версия Delphi: D7
Репутация: 11581
По умолчанию

Если я тебя правильно понял то мой пример тебе поможет. (Доработано до секунд). Вводи значения и наблюдай!

Последний раз редактировалось Pilot_Red, 14.06.2012 в 22:25.
Ответить с цитированием
  #4  
Старый 10.02.2011, 21:28
Аватар для Pilot_Red
Pilot_Red Pilot_Red вне форума
Продвинутый
 
Регистрация: 01.11.2006
Адрес: Карелия
Сообщения: 702
Версия Delphi: D7
Репутация: 11581
По умолчанию

Чтобы работало "на всем диапазоне временой оси" в пределах суток

в таймере все убери все и вставь этот кусок кода
Код:
sec:=RazSec-SecondsBetween(time,t2);
ProgressBar1.Position:=(round(100*(sec-sec1)/RazSec));
Ответить с цитированием
  #5  
Старый 10.02.2011, 21:47
Yamaha Yamaha вне форума
Прохожий
 
Регистрация: 10.02.2011
Сообщения: 14
Репутация: 10
По умолчанию

Цитата:
Сообщение от Belanserg
Попробуй перенести строчку кода из события Timer1Timer
Код:
Timer1.Interval:=Timer1.Interval*Per; 
в конец события form2show
Спасибо помогло
Ответить с цитированием
  #6  
Старый 10.02.2011, 21:49
Yamaha Yamaha вне форума
Прохожий
 
Регистрация: 10.02.2011
Сообщения: 14
Репутация: 10
По умолчанию

Цитата:
Сообщение от Pilot_Red
Чтобы работало "на всем диапазоне временой оси" в пределах суток

в таймере все убери все и вставь этот кусок кода
Код:
sec:=RazSec-SecondsBetween(time,t2);
ProgressBar1.Position:=(round(100*(sec-sec1)/RazSec));
А как сделать так, чтобы программа определила время настоящее и выставила бы по нему соответствующее количество процентов пройденного времени
Ответить с цитированием
  #7  
Старый 10.02.2011, 22:08
Аватар для Pilot_Red
Pilot_Red Pilot_Red вне форума
Продвинутый
 
Регистрация: 01.11.2006
Адрес: Карелия
Сообщения: 702
Версия Delphi: D7
Репутация: 11581
По умолчанию

А мое вложение не катит? Там по моему есть ответ на твой вопрос! в виде работающего сорца. Только не забудь в таймере(моего исходника) вот это вставить(все остальное из таймера убери)
Код:
sec:=RazSec-SecondsBetween(time,t2);
ProgressBar1.Position:=(round(100*(sec-sec1)/RazSec));

что делает программа:
сначала вычесляет кол-во секунд между двумя time-ми (SecondsBetween)
потом (уже в таймере) вычесляется текущя секунда относительно найденого интервала(кол-ва секунд).
А потом с помощью обычной интерполяции находим положение прогрессбара
он как раз и показывает проценты(possition)
Ответить с цитированием
  #8  
Старый 10.02.2011, 22:34
Yamaha Yamaha вне форума
Прохожий
 
Регистрация: 10.02.2011
Сообщения: 14
Репутация: 10
По умолчанию

Цитата:
Сообщение от Pilot_Red
А мое вложение не катит? Там по моему есть ответ на твой вопрос! в виде работающего сорца. Только не забудь в таймере(моего исходника) вот это вставить(все остальное из таймера убери)
Код:
sec:=RazSec-SecondsBetween(time,t2);
ProgressBar1.Position:=(round(100*(sec-sec1)/RazSec));

что делает программа:
сначала вычесляет кол-во секунд между двумя time-ми (SecondsBetween)
потом (уже в таймере) вычесляется текущя секунда относительно найденого интервала(кол-ва секунд).
А потом с помощью обычной интерполяции находим положение прогрессбара
он как раз и показывает проценты(possition)

Я видоизменил код, посмотри, мой вариант, для того, чтобы отображался текущий процент уже пройденного времени, у меня правда полностью заполняется прогресс бар начальное время ставлю 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.02.2011, 22:43
Yamaha Yamaha вне форума
Прохожий
 
Регистрация: 10.02.2011
Сообщения: 14
Репутация: 10
По умолчанию

Цитата:
Сообщение от Yamaha
Я видоизменил код, посмотри, мой вариант, для того, чтобы отображался текущий процент уже пройденного времени, у меня правда полностью заполняется прогресс бар начальное время ставлю 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.
Нашел ошибку, исправил, теперь у меня такой вопрос: как изменять цвет прогрессбара, хочю чтобы по прошествии одной трети времени между лейблами менялся цвет прогрессбара, не подскажете друзья?
Ответить с цитированием
  #10  
Старый 11.02.2011, 08:14
Аватар для Belanserg
Belanserg Belanserg вне форума
Прохожий
 
Регистрация: 18.11.2009
Сообщения: 29
Версия Delphi: 7
Репутация: 12
По умолчанию

Изменить цвет progressbar можно так:
Код:
PostMessage(ProgressBar1.Handle, $0409, 0, clGreen); 
Ответить с цитированием
  #11  
Старый 11.02.2011, 17:27
Yamaha Yamaha вне форума
Прохожий
 
Регистрация: 10.02.2011
Сообщения: 14
Репутация: 10
По умолчанию

Цитата:
Сообщение от Belanserg
Изменить цвет progressbar можно так:
Код:
PostMessage(ProgressBar1.Handle, $0409, 0, clGreen); 
Я пробовал эту команду но почемуто цвет не меняется и еще, как можно поменять цвет фона прогрессбара, т.е. еще не заполненной части прогрессбара
Ответить с цитированием
  #12  
Старый 11.02.2011, 18:22
Аватар для Belanserg
Belanserg Belanserg вне форума
Прохожий
 
Регистрация: 18.11.2009
Сообщения: 29
Версия Delphi: 7
Репутация: 12
По умолчанию

странно, потому что сколько уже пользуюсь именно этим методом не разу не подвел, цвет шкалы меняется. насчет фона то смотри исходник, там и фон и шкала меняются.
Вложения
Тип файла: rar пример.rar (3.0 Кбайт, 9 просмотров)
Ответить с цитированием
  #13  
Старый 12.02.2011, 00:31
Yamaha Yamaha вне форума
Прохожий
 
Регистрация: 10.02.2011
Сообщения: 14
Репутация: 10
По умолчанию

Цитата:
Сообщение от Belanserg
странно, потому что сколько уже пользуюсь именно этим методом не разу не подвел, цвет шкалы меняется. насчет фона то смотри исходник, там и фон и шкала меняются.
Че то не пойму, запустил у себя на Delphi XE твою программку, так у меня не меняется цвет прогрессбара, он все время красный, а фон тем более
Ответить с цитированием
  #14  
Старый 12.02.2011, 07:15
Аватар для Belanserg
Belanserg Belanserg вне форума
Прохожий
 
Регистрация: 18.11.2009
Сообщения: 29
Версия Delphi: 7
Репутация: 12
По умолчанию

У меня Delphi7 и все работает.
Ответить с цитированием
  #15  
Старый 12.02.2011, 11:43
Аватар для Страдалецъ
Страдалецъ Страдалецъ вне форума
Гуру
 
Регистрация: 09.03.2009
Адрес: На курорте, из окна вижу теплое Баренцево море. Бррр.
Сообщения: 4,723
Репутация: 52347
По умолчанию

Просто этот способ для стандартной цветовой схемы, а вот для Аэро уже не катит.
__________________
Жизнь такова какова она есть и больше никакова.
Помогаю за спасибо.
Ответить с цитированием
Ответ


Delphi Sources

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

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

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

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


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


 

Сайт

Форум

FAQ

Соглашения

Прочее

 

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