Конференция "Начинающим" » Убить таймер в своем же OnTimer [D7]
 
  • kashey © (29.01.18 10:06) [0]
    Корректно ли так будет:
    procedure TForm1.Timer1Timer(Sender: TObject);
    begin
     Sender.Free;
    end;



    Или лучше убить его через PostMessage?
  • Игорь Шевченко © (29.01.18 10:14) [1]
    Корректно. Проверить дело 5 минут
  • Dimka Maslov © (29.01.18 11:57) [2]
    обработчик события таймеру не принадлежит, а принадлежит, в данном случае, форме. Следовательно, убивание таймера формально допустимо.
  • Германн © (30.01.18 01:41) [3]
    2
    > Dimka Maslov ©   (29.01.18 11:57) [2]

    Ну вообще-то любой обработчик события любого компонента ему не принадлежит. Это метод класса формы.  Вот к примеру обработчик TButton.OnClick. Но в этом обработчике уничтожать кнопку весьма стрёмно может быть.
  • Z (30.01.18 14:11) [4]
    угу... Ну разве что если только на всякий случай:
    TTimer(Sender).Free();
  • Игорь Шевченко © (30.01.18 17:39) [5]

    > Ну разве что если только на всякий случай:



    > TTimer(Sender).Free();


    Не будет ли благородный дон так любезен объяснить сакральный смысл приведенного кода ?
  • Германн © (31.01.18 02:19) [6]

    > Z   (30.01.18 14:11) [4]

    Метод Free не нуждается ни в каком приведении типа. Метод Free во всей VCL один единственный наследованный от TObject.
  • Dimka Maslov © (31.01.18 11:42) [7]

    > один единственный


    Так уж один единственный?

    Но даже в силу неединственности унаследованного метода, всё равно неплохо было перед уничтожением объекта проверить, тот ли объект уничтожается.
  • Плохиш © (31.01.18 12:29) [8]

    > Dimka Maslov ©   (31.01.18 11:42) [7]
    >
    >
    > > один единственный
    >
    >
    > Так уж один единственный?

    Free не виртуальный.

    > всё равно неплохо было перед уничтожением объекта проверить,
    >  тот ли объект уничтожается.

    В [4] никаких проверок не производится, обычное тупое приведение типа.
  • Dimka Maslov © (31.01.18 14:31) [9]

    > Free не виртуальный


    Наследуемые и виртуальные методы - две большие разности. И метод Free не является единственным унаследованным от TObject невиртуальным методом (смотрим реализацию TObject.

    А про [4] я вообще молчу.
  • Германн © (01.02.18 02:11) [10]

    > Dimka Maslov ©   (31.01.18 14:31) [9]
    >  И метод Free не является единственным унаследованным от
    > TObject

    Пардон. Употребил в своём сообщении набор слов не позаботившись о том, где поставить запятую в смысле "Казнить нельзя помиловать".
    А ещё точнее не поставил ударение в своём сообщении на "один единственный".
  • Игорь Шевченко © (01.02.18 10:23) [11]
    Dimka Maslov ©   (31.01.18 11:42) [7]


    > всё равно неплохо было перед уничтожением объекта проверить,
    >  тот ли объект уничтожается


    Зачем ? Если логика ясна, другой объект не уничтожить, если логика не ясна, проверка не улучшит положение.
  • Leonid Troyanovsky © (01.02.18 10:32) [12]

    > Dimka Maslov ©   (29.01.18 11:57) [2]

    > обработчик события таймеру не принадлежит, а принадлежит,
    >  в данном случае, форме

    Причина, скорее, в том, что сообщения таймера are posted.

    --
    Regards, LVT.
  • Dimka Maslov © (01.02.18 16:49) [13]

    > are posted.


    Даже если бы были sent - обработчик принадлежал бы форме


    > Зачем ? Если логика ясна,


    При ясной логике таймер глушится, а не уничтожается.
  • Leonid Troyanovsky © (02.02.18 09:32) [14]

    > Dimka Maslov ©   (01.02.18 16:49) [13]

    > Даже если бы были sent - обработчик принадлежал бы форме

    Cообщения таймера are posted. Следовательно, убивание таймера формально допустимо.

    При некоторых ограничениях, к которым не относится принадлежность обработчика
    чему бы то не было.

    Ну, или формально неотличимо от PostMessage.

    --
    Regards, LVT.
 
Конференция "Начинающим" » Убить таймер в своем же OnTimer [D7]
Есть новые Нет новых   [134427   +35][b:0][p:0.001]