169 похожих чатов

Комрады, насколько целесообразно прописывать код "светофора" в событие OnPaint формы:

Button1.Enable:= (varInt <> 1);
Button2.Enable:= (varInt = 1);

Если "нет", то почему?

29 ответов

26 просмотров

в onpaint рисовать надо, а не состояния контролов менять

Ed-Doc Автор вопроса
Igor
в onpaint рисовать надо, а не состояния контролов ...

Так в учебниках написано. Хотелось бы услышать точку зрения с позиции того, что происходит "под капотом"

Ed Doc
Так в учебниках написано. Хотелось бы услышать точ...

плохие учебники, в онпаинт не надо никуда лазить - это может вызывать другие события

Ed Doc
Так в учебниках написано. Хотелось бы услышать точ...

А зачем? Чтоб убедиться что кривой подход действительно кривой? Достаточно запомнить правильный подход и париться.

Ed-Doc Автор вопроса
Konstantin
А зачем? Чтоб убедиться что кривой подход действит...

я ожидал что-то вроде "смотри сюда: здесь вызывается это событие, в свою очередь это вызывает вот это событие..." и т.д. А так, я знаю, что это место для отрисовки и прочего. Мне бы понять подноготную...

Ed Doc
я ожидал что-то вроде "смотри сюда: здесь вызывает...

https://www.thoughtco.com/life-cycle-of-a-delphi-form-1058011 https://jamesmartinsandbrook.com/private/Tips/FornAct.htm https://delphisources.ru/pages/faq/base/form_life.html

Ed Doc
я ожидал что-то вроде "смотри сюда: здесь вызывает...

WM_PAINT это сообщение с самым низким приоритетом, вместе в WM_TIMER, которые отправляются тебе после того как все активные сообщения из очереди обработались, причем сообщение от таймера самое низкоприоритетное. Переключать стейты контролов в WM_PAINT крайне не желательно т.к. в данный текущий момент времени идет отрисовка на невалидированом ректе и такое переключение может вызвать избыточный оверхэд, т.к. твои кнопки могут быть вне рамок этого ректа (Canvas.ClipRect). Для управления состоянием контролов существует Idle событие в котором и нужно это делать, причем там-же происходит и обновление состояний всех акшенов, а вот само Idle дергается тогда, когда очередь целиком пуста, либо ты вызвал что-то модальное со своим ЦВС и уже его очередь стала пустой (в этом случае модалка отправит WM_ENTERIDLE главному окну). Ну либо менять стейт нужно по изменению значений твоей переменной varInt зафигачив её свойством и меняя стейт контрола на сеттере. А если контрол, состояние которого ты хочешь переключать, еще и недайбог не правильно написан и внутрях, на переключение стейта дергает Invalidate даже если стейт не изменился, то ты, переключая стейт именно в WM_PAINT, получишь вечную перерисовку и отключишь нахрен Idle, ВСЕ таймеры по всему проекту и сами акшены вообще целиком. А если он дергает вообще Repaint - то еще и StackOverflow до кучи 😂

Ed-Doc Автор вопроса
Ed-Doc Автор вопроса
Александр (Rouse_) Багель
Ну вот и узнал :)

А представляешь, сколько б мне пришлось времени потратить, что б это все узнать, осмыслить и сделать выводы? А тут прикинулся шлангом и, оп-па, тебе все рассказали 😁 Спасибо ещё раз

Ed-Doc Автор вопроса
Alex Wow
этот метод всегда работает )

Вот и я смотрю, все хитрые 🙂

Ed Doc
Вот и я смотрю, все хитрые 🙂

можно еще заведомо неверный ответ написать, чтобы тебе объяснили )

Ed Doc
А представляешь, сколько б мне пришлось времени по...

Могу добавить что Саша далеко не все возможные глюки описал. Могут быть дополнительные проблемы с буфферизацией, отрисовкой в структуре парент-чайлд, элементов с полупрозрачностью, не говоря о том что в общем случае ты не знаешь что вызывается на изменении свойства. ...Но иногда может и прокатить

Ed-Doc Автор вопроса
Konstantin
Могу добавить что Саша далеко не все возможные глю...

Да я ж не настаиваю, мне внутренняя кухня в этом контексте была интересна. Ибо в "книжках по Дельфи" все описано либо примитивно, либо архисложно.

Ed Doc
Да я ж не настаиваю, мне внутренняя кухня в этом к...

Вот поэтому, чтобы понять внутрянку лучше - нужно компилировать простые кусочки, кормить их в IDA Pro и разбираться, а потом еще и внешними отладчиками смотреть

Ed-Doc Автор вопроса
Ed Doc
+ изучить азы ассемблера 😁

А как программировать без понимания того, как работает процессор?

Ed-Doc Автор вопроса
Александр В
А как программировать без понимания того, как рабо...

Так есть же компоненты и события к ним. На первых порах для однооконного приложения достаточно 🙂

Konstantin
Питон?))

Ну мы сейчас не говорим про программистов отступами, где отсутствие готовой библиотеки для какой либо задачи = трагедия и нерешаемая задача

Неъматжон
Легко. Гугл программисты так кодят

Ну таки и результат соответствующий)

Александр В
Ну таки и результат соответствующий)

Да. Я перед словом "кодят" пропустил одно слово. Итак понятно. :)

Ed Doc
Так есть же компоненты и события к ним. На первых ...

Ну мыцж говорим о программировании, что подразумевает реализацию каких-либо алгоритмов и всякое такое, а не шлеп, клик - чет написал в сгенереном обработчике, вроде работает)

Александр В
Вот поэтому, чтобы понять внутрянку лучше - нужно ...

Книжки еще читать нужно правильные, Рихтера, Фень Юаня, Шрайбера и т.д.

Похожие вопросы

Обсуждают сегодня

Господа, а что сейчас вообще с рынком труда на делфи происходит? Какова ситуация?
Rꙮman Yankꙮvsky
29
А вообще, что может смущать в самой Julia - бы сказал, что нет единого стандартного подхода по многим моментам, поэтому многое выглядит как "хаки" и произвол. Короче говоря, с...
Viktor G.
2
30500 за редактор? )
Владимир
47
а через ESC-код ?
Alexey Kulakov
29
Чёт не понял, я ж правильной функцией воспользовался чтобы вывести отладочную информацию? но что-то она не ловится
notme
18
У меня есть функция где происходит это: write_bit(buffer, 1); write_bit(buffer, 0); write_bit(buffer, 1); write_bit(buffer, 1); write_bit(buffer, 1); w...
~
14
Добрый день! Скажите пожалуйста, а какие программы вы бы рекомендовали написать для того, чтобы научиться управлять памятью? Можно написать динамический массив, можно связный ...
Филипп
7
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
Ребят в СИ можно реализовать ООП?
Николай
33
https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_h_common.erl#L174 https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_olp.erl#L76 15 лет назад...
Maksim Lapshin
20
Карта сайта