И так…
У меня проект состоит из боольшого количества форм, на каждой форме есть таймер(и нетолько), как с одной формы запустить все ети таймера??? Причем ето все описать в какомто масиньком цыкле…
И так…
У меня проект состоит из боольшого количества форм, на каждой форме есть таймер(и нетолько), как с одной формы запустить все ети таймера??? Причем ето все описать в какомто масиньком цыкле…
Клуб программистов работает уже ой-ой-ой сколько, а если поточнее, то с 2007 года.
27 октября 2009 в 12:02
#9: вреднючий дед дельфи. Тогда так:
var i: integer;
begin
for i:=1 to КоличествоФорм do
TTimer(TForm(FindComponent('Form'+IntToStr(i))).FindComponent('Timer1')).Enabed := TRUE;
end;
^_^
27 октября 2009 в 12:02
#12 – вот это уже шаманство))
26 октября 2009 в 22:04
сделай темплейт-форму, скажем, TTForm = class(TForm) с таймером. пропиши препертю для этой формы, скажем, TimerOn : Boolean. Все свои формы строй не от TForm,а от TTForm. Вот и будет стандартный вызов таймера с любой из них. Формы регистри в Main или просто по Application пробеги
26 октября 2009 в 20:04
Но вообще такие шаманства не есть гут.
Лучше один раз грамотно спроектировать приложение. Например создать для своих форм общий базовый класс формы с таймером. И все нужные формы добавлять в массив на этапе создания. Тогда цикл будет совсем простым.
26 октября 2009 в 20:03
Form1 – объект класса TForm1 и нужный таймер определен только в этом классе. А в #7 получается просто TForm.
Если нужно универсальное решение, то нужно из TApplication или еще какого глобального класса вытащить список форм. Потом пробежаться по всем детям каждой формы и обработать TTimer
//www.delphisources.ru/pages/faq/base/tree_cont...
вот пример как пробежаться по объектам приложения. Если таймеры лежат прямо на формах, то рекурсия не нужна. Достаточно будет двух вложенных циклов. Один по компонентам TApplication должен отобрать все TForm, а вложенный должен среди компонентом TForm выделить TTimer
26 октября 2009 в 20:01
Антон, в #7 мне идея понравелась… НО, после TForm(FindComponent('Form'+IntToStr(i))) он непонимает что такое Timer1((( хотя я в uses-е обявил формы с которыми я роботаю…
26 октября 2009 в 20:00
хотя возможно я подработал кэпом ))
26 октября 2009 в 20:00
У каждого объекта должен быть список детей. Можно перебрать всех детей формы и найти среди них таймеры. Список форм наверное тоже хранится в Application или чем-то подобном.
Как вариант можно в каком-либо событии таймера(например onCreate если у него такое есть) прописать его добавление в массив. А дальше пробегать по массиву таймеров.
Конкретные названия свойств и методов не подскажу – давно уже не видел делфи %)
26 октября 2009 в 20:00
Ну ето я понемаю, но дело в том что получится офигезно много таких "form1.timer1.enabled=true;" строчек, хотелосьбы както оптимизировать…
чтото в таком стиле
var
lab: TLabel;
begin
lab := TLabel(FindComponent('Label1'));
lab.Caption := 'Эй!'
end;
только искать не компоненту а саму форму…
26 октября 2009 в 20:00
вот с массивом – это хорошая идея
действительно при создании окон (OnCreate) добавляем таймер в список (TList), а при закрытии окна (OnClose) удаляем его оттуда.
События списка (TList) смотрим в справке.
Самый удобный способ как мне кажется (есть еще один, если формы называются Form1, Form2, и т.д.)
26 октября 2009 в 20:00
а, вы так хотите? ну вот:
var i: integer;
begin
for i:=1 to КоличествоФорм do
TForm(FindComponent('Form'+IntToStr(i))).Timer1.Enabed := TRUE;
end;
26 октября 2009 в 20:00
но с массивом круче
26 октября 2009 в 19:05
Просто перед обьектом указываете форму…
form*n*.timer*n*..ну на примере запуска таймера:
form1.timer1.enabled=true;
ну и формы надо соединить естесственно