IPB
ЛогинПароль:

> ВНИМАНИЕ!

Прежде чем задать вопрос, смотрите FAQ.
Рекомендуем загрузить DRKB.

Наладить общение поможет, если вы подпишитесь по почте на новые темы в этом форуме.

 
 Ответить  Открыть новую тему 
> торможение Ttimer - ?
сообщение
Сообщение #1


Бывалый
***

Группа: Пользователи
Сообщений: 205
Пол: Мужской
Реальное имя: Евгений

Репутация: -  0  +


Такая ситуация: 6 таймеров работают одновременно, у трех из них интервал 50 у остальных 70. При этом переходы между изображениями, которые меняют таймеры, сильно тормозят. Стоит включить 7й таймер, одновременно работающий с остальными с интервалом 70, торможение исчезает, хотя по логике, торможение должно возрасти... В чем тут может быть причина? Можно ли избежать торможение изображений?
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #2


mea culpa
*****

Группа: Пользователи
Сообщений: 1 372
Пол: Мужской
Реальное имя: Николай

Репутация: -  24  +


Как-то всё туманно... Как сделан "переход между изображениями", и какую роль там таймер играет?


--------------------
"Знаешь, стыдно - когда не видно, что услышал всё, что слушал.."
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #3


Бывалый
***

Группа: Пользователи
Сообщений: 205
Пол: Мужской
Реальное имя: Евгений

Репутация: -  0  +


procedure TForm1.Timer1Timer(Sender: TObject);
begin

if ind<35 then Inc(ind) else ind:=0;


if ind=0 then image2.Visible:=true;
if ind=1 then image3.Visible:=true;
if ind=2 then image4.Visible:=true;
if ind=3 then image5.Visible:=true;
if ind=4 then image6.Visible:=true;
if ind=5 then image7.Visible:=true;
if ind=6 then image8.Visible:=true;
......
if ind=35 then image24.Visible:=true;
end;



Сообщение отредактировано: 1147 -
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #4


Гость






Ну, и что ты хочешь, чтоб не тормозило? У тебя лишние условия каждый раз проверяются. Либо сделай Case, это будет быстрее, и лишняя работа делаться не будет. Либо вообще запихай все свои изображения в массив и одним оператором показывай нужный элемент массива.
 К началу страницы 
+ Ответить 
сообщение
Сообщение #5


Бывалый
***

Группа: Пользователи
Сообщений: 205
Пол: Мужской
Реальное имя: Евгений

Репутация: -  0  +


volvo, если не трудно, покажи пожалуйста на примере, как в моем случае можно использовать Case
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #6


Гость






Вот так, например:
procedure TForm1.Timer1Timer(Sender: TObject);
begin
if ind<35 then Inc(ind) else ind:=0;
case ind of
0: image2.Visible:=true;
1: image3.Visible:=true;
2: image4.Visible:=true;
// ...
35: image24.Visible:=true;
end;
end; { Timer1Timer }
 К началу страницы 
+ Ответить 
сообщение
Сообщение #7


Бывалый
***

Группа: Пользователи
Сообщений: 205
Пол: Мужской
Реальное имя: Евгений

Репутация: -  0  +


можно сделать так чтобы за 1 шаг появлялось изображение 43 а 42 исчезало? Примерно это можно изобразить так:
1:  image43.Visible:=true and image42.Visible:=false;
Это нужно для осуществления циклической анимации, вроде стрелки часов
Переделал все таймеры, но причина торможения кроется в чем-то другом..

Сообщение отредактировано: 1147 -
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #8


Гость






1:
begin
image42.Visible:=false; image43.Visible:=true;
end;


Но в таком случае - почему бы тебе не сделать то, что я предлагал вторым вариантом? Все TImage - элементы массива. И тогда твой обработчик таймера выродится вот в такой:
procedure TForm1.Timer1Timer(Sender: TObject);
begin
ImageArray[ind].Visible := False; // Гасим то, изображение, которое было активным
ind := (ind + 1) mod 35; // аналог if ind<35 then Inc(ind) else ind:=0;
ImageArray[ind].Visible := True; // Показываем следующее изображение
end;
 К началу страницы 
+ Ответить 
сообщение
Сообщение #9


Бывалый
***

Группа: Пользователи
Сообщений: 205
Пол: Мужской
Реальное имя: Евгений

Репутация: -  0  +


как правильно описать массив? ImageArray: array[1..35] of .. Как здесь показать что нужно использовать изображения со первого по 35?

Сообщение отредактировано: 1147 -
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #10


Гость






type
TForm1 = class(TForm)
// ...
Image1: TImage;
Image2: TImage;
Image3: TImage; // Для теста сделал всего 3 изображения

private
{ Private declarations }
public
ImageArray: array[0 .. 2] of TImage; // Место под массив изображений
// ...
end;

// При инициализации формы - заполняем массив:
procedure TForm1.FormCreate(Sender: TObject);
var i: integer;
begin
for i := 0 to 2 do
begin
ImageArray[i] := FindComponent(Format('Image%d', [i + 1])) as TImage;
end;
// ...
end;

Теперь можно обращаться к ImageArray. как я показал выше...
 К началу страницы 
+ Ответить 
сообщение
Сообщение #11


Профи
****

Группа: Пользователи
Сообщений: 865
Пол: Мужской
Реальное имя: Вячеслав

Репутация: -  20  +


a:array [1..10] of TImage;
...
procedure TForm3.Button1Click(Sender: TObject);
var
i,k:integer;
begin
k:=0;
for i := 0 to ComponentCount - 1 do begin
if (Components[i] is TImage) then begin
inc(k);
a[k] := Components[i] as TImage;
end;
end;
end;
Опаздал smile.gif

Сообщение отредактировано: Client -
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #12


Бывалый
***

Группа: Пользователи
Сообщений: 205
Пол: Мужской
Реальное имя: Евгений

Репутация: -  0  +


Насколько я понимаю, эта строка выбирает нужные изображения для массива:
ImageArray[i] := FindComponent(Format('Image%d', [i + 1])) as TImage; 

Но каким образом это происходит, если мне требуются изображения например image12...image85? В общем я не понял как взять конкретные изображения и заполнить ими массив.. Что такое image%d?
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #13


Профи
****

Группа: Пользователи
Сообщений: 865
Пол: Мужской
Реальное имя: Вячеслав

Репутация: -  20  +


ищет среди компонентов те, которые подходят по "шаблону".
А как пронумерованы у тебя Timage -ы и сколько их?
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #14


Бывалый
***

Группа: Пользователи
Сообщений: 205
Пол: Мужской
Реальное имя: Евгений

Репутация: -  0  +


вот я и не понял с этим шаблоном... У меня 6 таймеров, для каждого есть свои изображения. Timer1 содержит изображения 112, 245..264, Timer2 содержит 111, 225..244. И так для каждого таймера. Как шаблон найдет нужные для каждого таймера?
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #15


Профи
****

Группа: Пользователи
Сообщений: 865
Пол: Мужской
Реальное имя: Вячеслав

Репутация: -  20  +


не в ту сторону пошел smile.gif
это все делается для того, чтобы занести все TImage, которые есть на форме в массив. И уже работать с этим массивом. (чтобы индексация совпадала) т.е. пишешь
мой_массив[111].свойство 
а не
Image111.свойство
Если не подходит сделать так, то замени условные на case и все

Сообщение отредактировано: Client -
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #16


Бывалый
***

Группа: Пользователи
Сообщений: 205
Пол: Мужской
Реальное имя: Евгений

Репутация: -  0  +


То есть сначала создается общий массив со всеми изображениями, которые есть. затем я беру и обозначаю что массив а [112,245..264] это массив для таймера 1 к примеру, так?
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #17


Гость






Цитата
вот я и не понял с этим шаблоном... У меня 6 таймеров, для каждого есть свои изображения. Timer1 содержит изображения 112, 245..264, Timer2 содержит 111, 225..244. И так для каждого таймера. Как шаблон найдет нужные для каждого таймера?
Элементарно (для каждого таймера - свой массив изображений, с которыми именно этот таймер работает) :

const
Timer1_Count = 21;
Timer1_IDs: array[1 .. Timer1_Count] of Integer = (
112,
245, 246, 247, 248, 249, 250, 251, 252, 253, 254,
255, 256, 257, 258, 259, 260, 261, 262, 263, 264
);
var
T1_ImageArray: array[1 .. Timer1_Count] of TImage;

// Заполнять массив Image-й для этого таймера - вот так:
for i := 1 to Timer1_Count do begin
T1_ImageArray[i] := FindComponent(Format('Image%d', [ Timer1_IDs[i] ])) as TImage;
end;

Что, это нереально сложно? Мне не кажется...

Цитата
Если не подходит сделать так, то замени условные на case и все
Опять будет "раздувание" программы. Этого в данном случае лучше избегать... При работе вот с такими массивами, как показано выше - достаточно будет всего лишь поменять размер массива и его содержимое, больше ничего меняться не будет. Если сделать Case - то будешь ползать по всей программе и искать где еще что поменять...
 К началу страницы 
+ Ответить 
сообщение
Сообщение #18


Профи
****

Группа: Пользователи
Сообщений: 865
Пол: Мужской
Реальное имя: Вячеслав

Репутация: -  20  +


Цитата
procedure TForm1.Timer1Timer(Sender: TObject);
begin

if ind<35 then Inc(ind) else ind:=0;


if ind=0 then image2.Visible:=true;
if ind=1 then image3.Visible:=true;
if ind=2 then image4.Visible:=true;
if ind=3 then image5.Visible:=true;
if ind=4 then image6.Visible:=true;
if ind=5 then image7.Visible:=true;
if ind=6 then image8.Visible:=true;
......
if ind=35 then image24.Visible:=true;
end;
заменится на
if ind<35 then Inc(ind) else ind:=0;
my_array[ind+2].visible := true;
Ну, для каждого таймера сделать проверку на границы, и все.
Только, не забудь, что бы не получилось так, что 2 элемент массива не указывал на 5 (6,7,8...) имедж, а именно на Image2.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #19


Злостный любитель
*****

Группа: Пользователи
Сообщений: 1 755
Пол: Мужской

Репутация: -  62  +


Я бы сделал один TImage и массив из TBitmap.

Код

procedure TForm1.Timer1Timer(Sender: TObject);
begin
  ind := (ind + 1) mod 35;
  Image1.Canvas.Draw(0, 0, BufBitmap[ind]);
end;


Как-то мне не нравится, когда сначала одно изображение гасят, потом другое показывают. Там не мерцает?

И вообще, вместо TImage поставил бы TPaintBox (он легче), TPaintBox хоть и не умеет сам себя перерисовывать, но с таймером 50 это не проблема.


--------------------
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 





- Текстовая версия 22.10.2020 18:39
500Gb HDD, 6Gb RAM, 2 Cores, 7 EUR в месяц — такие хостинги правда бывают
Связь с администрацией: bu_gen в домене octagram.name