Как сгенерировать событие?

Вопросы программирования и использования среды Lazarus.

Модератор: Модераторы

Re: Как сгенерировать событие?

Сообщение zub » 16.11.2017 22:06:49

Чето я переоценил с уничтожением себя из обработчика. тут тупо неумение писать формы создаваемые динамически
>>Была же в сообщении ссылка на яндексдиск с примером https://yadi.sk/d/O0ht_yGZ3PjHyj
замени form2.Hide на просто Hide;
zub
долгожитель
 
Сообщения: 2275
Зарегистрирован: 14.11.2005 23:51:26

Re: Как сгенерировать событие?

Сообщение Сквозняк » 17.11.2017 00:48:30

zub писал(а):Чето я переоценил с уничтожением себя из обработчика. тут тупо неумение писать формы создаваемые динамически
>>Была же в сообщении ссылка на яндексдиск с примером https://yadi.sk/d/O0ht_yGZ3PjHyj
замени form2.Hide на просто Hide;

А я и не скрывал, что со знанием ассемблера у меня не очень. Откуда тогда секретным знаниям "как не вылететь из стека не сделав ничего плохого" взяться в полном объёме:))))
С такой заменой шила на мыло программа не ломается. Но!
Код: Выделить всё
procedure TForm1.Button2Click(Sender: TObject);
begin
if FF_2=1 then F_2.free;
FF_2:=0;
end;     

этот код всё равно должен быть на родительской форме и чтобы его вручную не жать, всё равно нужен параллельный системному обработчик событий. А если он будет, то и дочернюю форму можно из главной убирать - на одну строчку кода в нём больше, только и всего.
В принципе, обработчик удаляющий формы и чистящий память можно в большинстве случаев ставить в
Код: Выделить всё
procedure TForm1.FormActivate(Sender: TObject);
begin

end;     
Сквозняк
энтузиаст
 
Сообщения: 579
Зарегистрирован: 29.06.2006 22:08:32

Re: Как сгенерировать событие?

Сообщение pupsik » 17.11.2017 02:18:31

Сквозняк Спуститесь с высших материй на землю грешную. Ну не создано у вас то к чему вы обращаетесь (в исходниках). Что должно закрыться (скрыться) если его нет?

Т.е.:
почему так? решайте сами, но: F_2: TForm2 относительно равно Form2


п.с.
песец: 4-я страница детских проблем.
pupsik
энтузиаст
 
Сообщения: 1014
Зарегистрирован: 20.08.2014 16:20:13

Re: Как сгенерировать событие?

Сообщение Сквозняк » 17.11.2017 03:03:20

pupsik писал(а):Сквозняк Спуститесь с высших материй на землю грешную. Ну не создано у вас то к чему вы обращаетесь (в исходниках). Что должно закрыться (скрыться) если его нет?

Смысл этой философии тяжёл и неоднозначен есть.
п.с.
песец: 4-я страница детских проблем.

Какое освещение программирования на паскале в литературе, примерах и вики, такие и проблемы.
Сквозняк
энтузиаст
 
Сообщения: 579
Зарегистрирован: 29.06.2006 22:08:32

Re: Как сгенерировать событие?

Сообщение Лекс Айрин » 17.11.2017 09:10:24

Сквозняк писал(а):Какое освещение программирования на паскале в литературе, примерах и вики, такие и проблемы.


Речь о том, что form2 не равно F_2. поэтому у тебя и глюки возникают. Ты пытаешься завершить не созданную форму.

Сквозняк писал(а):Какое освещение программирования на паскале в литературе, примерах и вики, такие и проблемы.


Лично я, как полный нуб, разобрался быстро. В том же С я до сих пор не могу разобраться(((

А твой пример я не запускал. У меня просто архив открывается с ошибками.
Аватара пользователя
Лекс Айрин
долгожитель
 
Сообщения: 4169
Зарегистрирован: 19.02.2013 16:54:51

Re: Как сгенерировать событие?

Сообщение sign » 17.11.2017 09:31:19

Сквозняк писал(а):
Mikhail писал(а):Совсем даже наоборот, Exit, break, continue имеют фиксированную точку выхода

Не видимую для программиста.

Блин!
Читайте доки, там всё подробно описано или Вам программирование противопоказано.
sign
энтузиаст
 
Сообщения: 883
Зарегистрирован: 30.08.2009 09:20:53

Re: Как сгенерировать событие?

Сообщение LearnMagic » 17.11.2017 15:23:59

Сквозняк, чем не устраивает showmodal? Вместо ввода дополнительной глобальной переменной для проверки можно воспользоваться функцией Assigned
LearnMagic
новенький
 
Сообщения: 36
Зарегистрирован: 10.11.2016 23:13:38

Re: Как сгенерировать событие?

Сообщение Лекс Айрин » 17.11.2017 15:27:21

LearnMagic писал(а):чем не устраивает showmodal?


А в нем все глюки вылечили?
Аватара пользователя
Лекс Айрин
долгожитель
 
Сообщения: 4169
Зарегистрирован: 19.02.2013 16:54:51

Re: Как сгенерировать событие?

Сообщение LearnMagic » 17.11.2017 15:49:48

Лекс Айрин писал(а):А в нем все глюки вылечили?

Какие именно? Возможно мне повезло, но никаких глюков не наблюдал :)
LearnMagic
новенький
 
Сообщения: 36
Зарегистрирован: 10.11.2016 23:13:38

Re: Как сгенерировать событие?

Сообщение Лекс Айрин » 17.11.2017 16:02:21

LearnMagic, были у людей ситуации, когда при закрытии (или открытии, уже не помню) окна фокус уходил к неконтролируемому окну.

Впрочем, не всегда эти модальные окна и удобны. я лично кроме диалоговых окон не вижу особых причин так делать. Во всех остальных случаях проще перед закрытием приподнять нужное окно.
Аватара пользователя
Лекс Айрин
долгожитель
 
Сообщения: 4169
Зарегистрирован: 19.02.2013 16:54:51

Re: Как сгенерировать событие?

Сообщение LearnMagic » 17.11.2017 17:33:56

Лекс Айрин писал(а):Впрочем, не всегда эти модальные окна и удобны

Дело вкуса и области разрабатываемой программы.
Уход фокуса наблюдал из-за глюков диспетчера окон в ОС (примеры приводить не буду :D ).
LearnMagic
новенький
 
Сообщения: 36
Зарегистрирован: 10.11.2016 23:13:38

Re: Как сгенерировать событие?

Сообщение Сквозняк » 17.11.2017 18:25:18

LearnMagic писал(а):Сквозняк, чем не устраивает showmodal?

Универсальный способ создания окон освоил в первую очередь, как самый нужный, ну а после - зачем ещё что-то :)
Вместо ввода дополнительной глобальной переменной для проверки можно воспользоваться функцией Assigned

Одной переменной? По нормальному их нужно две. Вторая обнуляется при событии "создание формы", больше нигде в дополнительной форме не изменяется, и нужна для того, чтобы не обработать окно лишний раз. Закрывать окно можно кликом по крестику на рамке, а значит в обработчике события "он клосе" нужно поместить аналогичный закрыватель что и в обработчике события клика по кнопке "выход". А это значит, что при клике на "выход", закрыватель сработает 2 раза и начнётся лотерея: успеет обработчик закрывателей выполнить операцию 2 раза или нет. С Assigned ещё нужно разбираться, что там да как - в лазарусе не оттуда вызовешь функцию и привет - жалуйтесь ассемблеру, а с переменными, взял и написал. Если понадобится асинхронность для чего-то более сложного, тогда будет повод обратиться к данной функции.
Сквозняк
энтузиаст
 
Сообщения: 579
Зарегистрирован: 29.06.2006 22:08:32

Re: Как сгенерировать событие?

Сообщение LearnMagic » 17.11.2017 18:49:05

Сквозняк писал(а): нужна для того, чтобы не обработать окно лишний раз

Не совсем понятно, что имеется в виду.
Как писали выше, в обработчике onClose формы 2 написать CloseAction := caHide; - при закрытии форма будет оставаться в памяти. Причём этот обработчик будет вызван при любом закрытии формы: хоть крестик в углу окна, хоть через Close в коде программы.
При компиляции Assigned генерируется не вызов функции, а заменяется на несколько команд. В любом языке программирования, если вызываешь функцию не там или не с теми параметрами - ничего хорошего не жди.
ShowModal деактивирует то окно, из под которого был вызов, и следующая команда не будет выполнена до закрытия модального окна.
Последний раз редактировалось LearnMagic 17.11.2017 18:50:16, всего редактировалось 1 раз.
LearnMagic
новенький
 
Сообщения: 36
Зарегистрирован: 10.11.2016 23:13:38

Re: Как сгенерировать событие?

Сообщение Лекс Айрин » 17.11.2017 18:49:38

LearnMagic, не знаю как в других осях, а в винде можно воспользоваться и трюком с привязкой окна к окну (Form2.Parent:=Form1). Это мало чем, с практической точки зрения, отличается от модальности, только еще и можно работать в окне-родителе.

А вот уход фокуса это серьезно. Особенно, если человек работает в полу-автоматическом режиме. И тут уже неважно что и как гадит. Модальность хороша когда дальнейшая работа, без закрытия текущего окна, не имеет смысла. Чаще всего это не так.
Аватара пользователя
Лекс Айрин
долгожитель
 
Сообщения: 4169
Зарегистрирован: 19.02.2013 16:54:51

Re: Как сгенерировать событие?

Сообщение LearnMagic » 17.11.2017 18:55:38

Лекс Айрин писал(а):Модальность хороша когда дальнейшая работа, без закрытия текущего окна, не имеет смысла. Чаще всего это не так.

Всё зависит от контекста задачи. Одному оператору проблематично одновременно вводить несколько документов. Обычно вводится один документ, а потом другой.
LearnMagic
новенький
 
Сообщения: 36
Зарегистрирован: 10.11.2016 23:13:38

Пред.След.

Вернуться в Lazarus

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 6

Рейтинг@Mail.ru