всёшохошь

Одна несчастная строчка

Поучительная статья

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

Так вот, по одной такой детали можно с первого взгляда вычислить большинство программ, написанных на Delphi. Не всем эта деталь будет портить впечатление, но… Некоторые люди, например, несколько презрительно относятся к Delphi и готовы пинать этот язык по любому поводу.

О какой же детали я говорю? О курсоре, который символизирует гиперссылку. Рука, одним словом. В Delphi этот курсор-рука, скажем так, отличается от стандартной руки Windows.

Сравните:

Чувствуете разницу? Лично мне курсор от Borland совсем не нравится. Во-первых, черная полоса на запястье выглядит как давящий браслет, из-за этого возникает некоторый визуальный дискомфорт. Во-вторых, в Windows 2000 и выше наш горячо любимый курсор (тот, который из Delphi) не имеет тени (впрочем, как и все программно загружаемые курсоры).

Теперь, зная небольшой грешок Delphi-программ, можно порыскать по своим любимым программным продуктам и найти «своих». Вот некоторые из моих «знакомых»:

Почему товарищи из Borland не используют стандартный курсор Microsoft — для меня остается загадкой. Возможно, во время разработки первых версий Delphi привычной для нас «руки» еще не существовало, а позже внедрению нормального Win32-курсора помешала обычная лень…

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

Поехали!

Способ 1, геройский

Дескрипторы всех используемых (и неиспользуемых) приложением курсоров хранятся в массиве Screen.Cursors. Ход наших действий: получаем дескриптор вожделенной руки, помещаем его в определенную ячейку упомянутого массива, после чего нужному элементу управления указываем, чтобы тот использовал курсор из этой ячейки.

Итак, загрузка курсора из подсознания Windows:

Screen.Cursors [19] := LoadCursor (0, PChar (IDC_HAND)) ;

Приказы элементам управления:

Label13.Cursor := 19 ;
Panel7.Cursor := 19 ;
{ и т. д. }

Говорите — запутано? Способ ведь геройский, а настоящие герои…

Способ 2, бронебойный

Можно сделать быстрее и изящнее. С помощью справки узнаем, что наша рука (crHandPoint) проживает по адресу Screen.Cursors, индекс −21. Отлично. Мы ее (то есть, его) оттуда просто выселим:

Screen.Cursors [-21] := LoadCursor (0, PChar (IDC_HAND)) ;

Нужные элементы управления даже ничего не заметят: возьмут по старому адресу новый курсор, и все.


Теперь можете смеяться и хлопать себя по коленке: от человеческого курсора (с тенью, спешу заметить) вас отделяла одна несчастная строчка кода.