singlepost

Помогите с DELPHI << На главную или назад  

И так…
У меня проект состоит из боольшого количества форм, на каждой форме есть таймер(и нетолько), как с одной формы запустить все ети таймера??? Причем ето все описать в какомто масиньком цыкле…

70 ответов в теме “Помогите с DELPHI”

  1. 13
    Антон Кононов ответил:

    #9: вреднючий дед дельфи. Тогда так:

    var i: integer;
    begin
    for i:=1 to КоличествоФорм do
    TTimer(TForm(FindComponent('Form'+IntToStr(i))).FindComponent('Timer1')).Enabed := TRUE;
    end;

    ^_^

  2. 12
    Антон Кононов ответил:

    #12 – вот это уже шаманство))

  3. 11
    Михаил Бураш ответил:

    сделай темплейт-форму, скажем, TTForm = class(TForm) с таймером. пропиши препертю для этой формы, скажем, TimerOn : Boolean. Все свои формы строй не от TForm,а от TTForm. Вот и будет стандартный вызов таймера с любой из них. Формы регистри в Main или просто по Application пробеги

  4. 10
    Евгений Тюкавкин ответил:

    Но вообще такие шаманства не есть гут.
    Лучше один раз грамотно спроектировать приложение. Например создать для своих форм общий базовый класс формы с таймером. И все нужные формы добавлять в массив на этапе создания. Тогда цикл будет совсем простым.

  5. 9
    Евгений Тюкавкин ответил:

    Form1 – объект класса TForm1 и нужный таймер определен только в этом классе. А в #7 получается просто TForm.
    Если нужно универсальное решение, то нужно из TApplication или еще какого глобального класса вытащить список форм. Потом пробежаться по всем детям каждой формы и обработать TTimer
    //www.delphisources.ru/pages/faq/base/tree_cont...
    вот пример как пробежаться по объектам приложения. Если таймеры лежат прямо на формах, то рекурсия не нужна. Достаточно будет двух вложенных циклов. Один по компонентам TApplication должен отобрать все TForm, а вложенный должен среди компонентом TForm выделить TTimer

  6. 8
    Евгений Озерский ответил:

    Антон, в #7 мне идея понравелась… НО, после TForm(FindComponent('Form'+IntToStr(i))) он непонимает что такое Timer1((( хотя я в uses-е обявил формы с которыми я роботаю…

  7. 7
    Сергей Макаров ответил:

    хотя возможно я подработал кэпом ))

  8. 6
    Евгений Тюкавкин ответил:

    У каждого объекта должен быть список детей. Можно перебрать всех детей формы и найти среди них таймеры. Список форм наверное тоже хранится в Application или чем-то подобном.
    Как вариант можно в каком-либо событии таймера(например onCreate если у него такое есть) прописать его добавление в массив. А дальше пробегать по массиву таймеров.
    Конкретные названия свойств и методов не подскажу – давно уже не видел делфи %)

  9. 5
    Евгений Озерский ответил:

    Ну ето я понемаю, но дело в том что получится офигезно много таких "form1.timer1.enabled=true;" строчек, хотелосьбы както оптимизировать…
    чтото в таком стиле

    var
    lab: TLabel;
    begin
    lab := TLabel(FindComponent('Label1'));
    lab.Caption := 'Эй!'
    end;

    только искать не компоненту а саму форму…

  10. 4
    Антон Кононов ответил:

    вот с массивом – это хорошая идея

    действительно при создании окон (OnCreate) добавляем таймер в список (TList), а при закрытии окна (OnClose) удаляем его оттуда.

    События списка (TList) смотрим в справке.

    Самый удобный способ как мне кажется (есть еще один, если формы называются Form1, Form2, и т.д.)

  11. 3
    Антон Кононов ответил:

    а, вы так хотите? ну вот:

    var i: integer;
    begin
    for i:=1 to КоличествоФорм do
    TForm(FindComponent('Form'+IntToStr(i))).Timer1.Enabed := TRUE;
    end;

  12. 2
    Антон Кононов ответил:

    но с массивом круче

  13. 1
    Сергей Макаров ответил:

    Просто перед обьектом указываете форму…
    form*n*.timer*n*..ну на примере запуска таймера:
    form1.timer1.enabled=true;
    ну и формы надо соединить естесственно

Клуб программистов работает уже ой-ой-ой сколько, а если поточнее, то с 2007 года.