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

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

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

zub
долгожитель
Сообщения: 2889
Зарегистрирован: 14.11.2005 22:51:26
Контактная информация:

Сообщение zub »

Чето я переоценил с уничтожением себя из обработчика. тут тупо неумение писать формы создаваемые динамически
>>Была же в сообщении ссылка на яндексдиск с примером https://yadi.sk/d/O0ht_yGZ3PjHyj
замени form2.Hide на просто Hide;
Сквозняк
энтузиаст
Сообщения: 1159
Зарегистрирован: 29.06.2006 22:08:32

Сообщение Сквозняк »

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;     
pupsik
энтузиаст
Сообщения: 1154
Зарегистрирован: 20.08.2014 16:20:13
Контактная информация:

Сообщение pupsik »

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

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


п.с.
песец: 4-я страница детских проблем.
Сквозняк
энтузиаст
Сообщения: 1159
Зарегистрирован: 29.06.2006 22:08:32

Сообщение Сквозняк »

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

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

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

Сообщение Лекс Айрин »

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


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

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


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

А твой пример я не запускал. У меня просто архив открывается с ошибками.
sign
энтузиаст
Сообщения: 1131
Зарегистрирован: 30.08.2009 09:20:53

Сообщение sign »

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

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

Блин!
Читайте доки, там всё подробно описано или Вам программирование противопоказано.
LearnMagic
новенький
Сообщения: 66
Зарегистрирован: 10.11.2016 22:13:38

Сообщение LearnMagic »

Сквозняк, чем не устраивает showmodal? Вместо ввода дополнительной глобальной переменной для проверки можно воспользоваться функцией Assigned
Аватара пользователя
Лекс Айрин
долгожитель
Сообщения: 5723
Зарегистрирован: 19.02.2013 16:54:51
Откуда: Волгоград
Контактная информация:

Сообщение Лекс Айрин »

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


А в нем все глюки вылечили?
LearnMagic
новенький
Сообщения: 66
Зарегистрирован: 10.11.2016 22:13:38

Сообщение LearnMagic »

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

Какие именно? Возможно мне повезло, но никаких глюков не наблюдал :)
Аватара пользователя
Лекс Айрин
долгожитель
Сообщения: 5723
Зарегистрирован: 19.02.2013 16:54:51
Откуда: Волгоград
Контактная информация:

Сообщение Лекс Айрин »

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

Впрочем, не всегда эти модальные окна и удобны. я лично кроме диалоговых окон не вижу особых причин так делать. Во всех остальных случаях проще перед закрытием приподнять нужное окно.
LearnMagic
новенький
Сообщения: 66
Зарегистрирован: 10.11.2016 22:13:38

Сообщение LearnMagic »

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

Дело вкуса и области разрабатываемой программы.
Уход фокуса наблюдал из-за глюков диспетчера окон в ОС (примеры приводить не буду :D ).
Сквозняк
энтузиаст
Сообщения: 1159
Зарегистрирован: 29.06.2006 22:08:32

Сообщение Сквозняк »

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

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

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

Сообщение LearnMagic »

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

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

Сообщение Лекс Айрин »

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

А вот уход фокуса это серьезно. Особенно, если человек работает в полу-автоматическом режиме. И тут уже неважно что и как гадит. Модальность хороша когда дальнейшая работа, без закрытия текущего окна, не имеет смысла. Чаще всего это не так.
LearnMagic
новенький
Сообщения: 66
Зарегистрирован: 10.11.2016 22:13:38

Сообщение LearnMagic »

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

Всё зависит от контекста задачи. Одному оператору проблематично одновременно вводить несколько документов. Обычно вводится один документ, а потом другой.
Ответить