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

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

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

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

29 ответов

11 просмотров

в 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
Так есть же компоненты и события к ним. На первых ...

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

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

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

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

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

Anyone here suffers from unexplained aural migraines, who would be up for talking for a bit? Doesn't *have* to be aural, but I am not asking about headaches, I mean actual mi...
Martin Rys
55
подскажите пожалуйста, как мне освободить результат записанный в переменную result? в чем проблема подскажите если МОЖЕТЕ?
Михаил Helper
28
кто-то пользуется компонентами rx ? как их лучше ставить, через OPM? (lazarus)
Iluha Companets
15
есть тут кто-то , кто только начал изучать си? если проходите курс на степике или как-то сами изучаете, пишите, может, скооперируемся?..
Eule
25
Слушайте, ещё такая интересная задачка. Сделан аудит действий пользователей через триггеры в базе, соответственно каждый пользователь имеет свой логин и пароль в базе. Это пре...
Сергей Бычков
12
Скажите, тут нет проблемы? IMyInterface1 = interface function GetInterface2: IInterface2; ... function TMyInterface.GetInterface2: IInterface2; begin Result := TI...
Ruslan aka DUDE
18
вопрос по москвину - не понимаю вот такого вопроса похоже Сколько разных всегда завершающихся функций с типом a -> a -> b -> a -> a можно реализовать? Две функции одинаково...
Fedor
11
я не магистр хаскеля, но разве не может лейзи тип конвертнуться в не-лейзи запросив вычисление содержимого прям при инициализации?
deadgnom32 λ madao
100
Кстати, раз про скачивание файлов разговор зашел) Сделал бота для себя (транскрибирующего и суммаризирующего встречи) но не ожидал что за 2 месяца 10к пользователей набежит😅...
Andrey Obolenskiy
8
что, сложно ифдеф на версию компилятора сделать?
Iluha Companets
6
Карта сайта