Небольшая авантюра :)
Dec. 6th, 2008 01:33 pm![[personal profile]](https://www.dreamwidth.org/img/silk/identity/user.png)
И до чего же мне остопи... осточертели разнообразные глюки виндового контрола ListView. В один прекрасный день я осознал, что на периодический отлов и исправление подобных глюков было потрачено много дней. Ну и решился я на такую авантюру: написать этот класс "ручками", так сказать, под себя. Пока получается. Позавчера сделал отображение и скроллинг, вчера - множественный выбор и перетаскивание/растягивание заголовков. Как там говорится в одной программистской поговорке: никогда не находится время, чтобы сделать что-то необходимое, но всегда находится время, чтобы переделать ;)

Это, кстати, к вопросу, как дела с bard-ом. Нормально дела, вовсю идет работа над новой версией.

Это, кстати, к вопросу, как дела с bard-ом. Нормально дела, вовсю идет работа над новой версией.
no subject
Date: 2008-12-09 03:17 pm (UTC)no subject
Date: 2008-12-09 03:19 pm (UTC)no subject
Date: 2008-12-09 03:23 pm (UTC)no subject
Date: 2008-12-09 03:25 pm (UTC)no subject
Date: 2008-12-09 03:43 pm (UTC)no subject
Date: 2008-12-09 03:47 pm (UTC)no subject
Date: 2008-12-09 03:58 pm (UTC)На тему "привык чужой код читать" вспомнилось с баш.орга: если при чтении чужого кода матерные восклицания звучат не чаще двух раз в минуту, это качественный код :)
no subject
Date: 2008-12-09 04:41 pm (UTC)>кросс-платформенности среди них нет и не будет
Qt — ещё и мощный тулкит, где зиллионы всего уже написаны и отлажены. %-)
алсо, QT — это QuickTime. %-)
>сли при чтении чужого кода матерные восклицания звучат не чаще двух раз в минуту,
>это качественный код :)
обычно если мне надо лезть в чужой код, то суточный запас матов я уже израсходовал. ибо я что, по доброй воле лезу? ежели работает — не трогаю.
no subject
Date: 2008-12-09 05:19 pm (UTC)Win SDK - тоже =)
no subject
Date: 2008-12-09 05:22 pm (UTC)нет, stl не предлагать. %-)
no subject
Date: 2008-12-09 05:26 pm (UTC)такого говна даже микрософт не написало :)
что касается hash, map - то это вообще не платформо-зависимый уровень, пользуйся чем хошь, хоть STL-ем, хоть еще чем...
no subject
Date: 2008-12-09 05:30 pm (UTC)no subject
Date: 2008-12-09 05:31 pm (UTC)no subject
Date: 2008-12-09 05:39 pm (UTC)no subject
Date: 2008-12-09 05:53 pm (UTC)а в оставшихся 5% я использую "аддоны". это значит, что к любому контролу можно прихреначить (на runtime) энное количество "обработчиков", которые будут перехватывать события, предназначенные окну, и делать что-то такое хитроуебищное... например, обслуживать drag-drop-ы или "резиновые контуры"...
и нахер мне тогда связи многие-ко-многим и переназначение реакций? если такое и понадобится, то раз в год, и раз в год мне не в падлу написать цикл.
no subject
Date: 2008-12-09 06:04 pm (UTC)однако же схема с «хуками» не есть красива, ящитаю. ну и Qt ещё умеет сам привинцивать сигналы на обработчики с соотв. именами. понятно, что это можно ручками один раз написать массажёра и всё, но лень же — уже написано.
алсо, достаточно удобен широкий диапазон параметров к сигналам. строки, числа, фиготень всякая.
no subject
Date: 2008-12-09 06:29 pm (UTC)если же то же самое делать сверху-вниз, тогда ты должен рекурсивно опрашивать всех child-ов "тебе Enter не надо? а тебе Enter не надо?". получится перебор всех контролов вместо однократного прохода ветки снизу-вверх.
"не есть красива" - понятие субъективное. по-моему очень даже есть красива :) по мне так одно слово "moc" однозначно решает все вопросы на тему красоты - и не в пользу той библиотеки, которая этот moc использует :)
виртуальные функции плохи в том смысле, что они вызываются, даже если там заглушка. когда вирт. функций много, то получается много ненужных вызовов.
но как раз на этот случай у меня есть гибридная схема. :) у контрола может быть хоть миллион виртуальных обработчиков, но регулярно из них вызываются только несколько. остальные вызываются теми самыми аддонами.
например, бывает нужно, чтобы при нажатии клавиши мыши началось некое "действо" - перетаскивание чего-то, а при отпускании - что-то произошло. так вот у контрола есть виртуальные функции вроде "перетаскивание началось", "перетаскивание идет"...
но ведь такая функциональность нужна лишь немногим контролам, нафиг тогда вызывать эти функции у всех контролов? нефик. вместо этого я ставлю только на нужный на контрол аддон "перетаскиватель". этот аддон перехватывает мышиные события, рюхает их и потом, если надо, вызывает те самые "перетаскивание началось", "перетаскивание идет"... получается это только для тех контролов, которые действительно нуждаются в таких событиях.
в принципе, можно так все события обрабатывать, но тогда придется в конструкторе создавать эти аддоны-перебрасыватели. компромиссный вариант меня больше устраивает :)
no subject
Date: 2008-12-09 06:37 pm (UTC)>но ведь такая функциональность нужна лишь немногим контролам, нафиг тогда
>вызывать эти функции у всех контролов?
правильно. у кого обработчика сигнала нет — тот и не откликнется. %-)
зыж что-то у нас хилый какой-то холивар получается.
no subject
Date: 2008-12-09 06:47 pm (UTC)ежели оно всплыло до диалога, то дальше все на этом. либо у диалога есть поинтер на что-то конкретное, дополнительное, тогда это еще плюс один вызов. а всем подряд сувать - какой смысл? в том примере прикинь, если в окне есть multi-line-edit и дерево (как в студии с редактором и деревом проекта), фокус стоит на дереве. деерву Enter не нужен, и зачем тогда совать Enter в первый попавшийся multi-line-edit? это уже излишество :)
no subject
Date: 2008-12-09 07:00 pm (UTC)это как это «всё»? это, то есть, диалог должен, например, знать о сущности «дефолтная кнопка» и какие события туда роутить? O_O
а enter надо всем предложить, вдруг он кому нужен? мультилайн умный, он глянет, что фокус не у него — и не станет трогать клаву. а дефолтная кнопка тупая, она увидит enter — и зажрёт, и пофигу ей на фокусы. именно чтобы такие гады не хавали чужие события, сначала его надо утопить до контрола с фокусом.
плюс подхода — диспетчер событий вообще не должен быть осведомлён ни о чём, кроме того, какое его дитё имеет фокус. и скидывает мессагу дитю. дитё в свою очередь тоже является диспетчером, смотрит на своих. и так далее. если событие никому в пень не надо — оно всплывёт на уровень выше и будет скормлено следующему контролу. и так пока контролы не закончатся, после чего ещё на уровень выше всплывёт. просто, как топором по яйцам. оверхэдом можно пренебречь, это гуя — тут даже с сотней контролов не выйдет схему затормозить (ну, у меня не выходило даже на 286-х %-).
no subject
Date: 2008-12-09 07:19 pm (UTC)именно. а почему бы и нет?
[ он глянет, что фокус не у него — и не станет трогать клаву ]
и каждый будет смотреть, а не у меня ли фокус, тварьли я дрожащая или право имею клавишу обрабать? :) так просто не надо совать кнопки тому, кто не в фокусе. сам подумай: что есть "фокус"? по определению это тот, кто берет события от кнопок. дело не столько в оверхеде, сколько в предсказуемости с т.з. пользователя - что никакая херня, которая не в фокусе "вдруг" не оживет :)
no subject
Date: 2008-12-09 07:30 pm (UTC)а зачем ему знать о том, о чём знать не надо? мало ли, какой извращённый компонент я придумаю завтра — что, и такому обучать? это как раз нарушение красоты ооп и прямой путь к кодокаше. чем меньше объект знает о других — тем крепче спит программист.
>и каждый будет смотреть, а не у меня ли фокус, тварьли я дрожащая или право имею
>клавишу обрабать?
а в чём проблема? а вот есть такой себе скроллбар, который вообще, например, фокуса никогда не имеет. зато отлично обрабатывает клаву, потому что пришпандорен к нужному элементу. точнее, не обрабатывает, а преобразует события в «страница вверх» вместо «нажат pgup». отлично «херня не в фокусе» оживает, и более того — это ожидаемое юзером поведение. что, мне теперь диалоги и скроллбарам отдельно обучать? %-) или учить каждый scrollable component обрабатывать pgup самолично? а потом ещё и смотреть, не привинчены ли рядом скроллбары и их дёргать? нененене, Дэвид Блэйн, такая магия нам не нужна.
no subject
Date: 2008-12-09 07:22 pm (UTC)(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:no subject
Date: 2008-12-09 07:02 pm (UTC)no subject
Date: 2008-12-09 05:31 pm (UTC)жопуиндекс :))