пятница, 12 сентября 2014 г.

Используем макросы в IDE-редакторе Delphi

Занимаясь отладкой процедур, связанных с обработкой сообщений, постоянно приходится делать сопоставление между кодом сообщения и его строковым наименованием. Ну, к примеру, "прилетает" код 6 - это WM_ACTIVATE. Или сложнее: код 274 (0x0112) = WM_SYSCOMMAND.
Мне это порядком надоело - решил сделать Helper для TMessage (попутно и для TMsg). Ну и в планах попробовать сделать Debugger Visualizer.

Однако о самом хелпере я постараюсь написать в следующий раз. В этой заметке хочу описать, как можно использовать кнопочки Record Macro и Playback Macro, которые находятся в левом нижнем углу строки состояния редактора кода.
(Кстати, мне впервые в жизни пришло в голову попробовать их использовать.)

Итак, я хочу получить код вида:
  case Msg of
    WM_NULL: Result := 'WM_NULL';
    WM_CREATE: Result := 'WM_CREATE';
    ...
    WM_APP: Result := 'WM_APP';
  end;

Идём в модуль Messages и копируем оттуда код:
  {$EXTERNALSYM WM_NULL}
  WM_NULL             = $0000;
  {$EXTERNALSYM WM_CREATE}
  WM_CREATE           = $0001;
  ...
  {$EXTERNALSYM WM_APP}
  WM_APP = $8000;

Вставляем в новый модуль и начинаем макрос. По шагам:
  1. Нажимаю Ctrl+F (Панель поиска), указываю пробел, снимаю все флажки. Enter - чтобы запомнилось.
  2. Устанавливаю курсор на первой строке, нажимаю "Record Macro":.
  3. Ctrl+Y - удаляем строку
  4. Ctrl+Вправо - курсор к началу идентификатора
  5. F3 - поиск до пробела
  6. Влево - курсор к концу идентификатора
  7. Ctrl+Shift+Влево - выделили идентификатор
  8. Ctrl+C - скопировали выделенное в буфер обмена
  9. Повторяем 5. и 6. - курсор к концу идентификатора
  10. Shift+End - выделение до конца строки
  11. Delete - удаляем выделенное
  12. Набираем на клавиатуре
    : Result := '
  13. Ctrl+V - вставили скопированное
  14. Набираем на клавиатуре
    ';
  15. Home - переход к началу строки
  16. Вниз - переход к следующей строке
  17. Нажимаю "Stop Recording Macro":.

Макрос готов, теперь просто жамкаем в "Playback Macro" пока не достигнем нужного результата.

4 коммент.:

rrrFer комментирует...

А все потому что это WinAPI ущербное. Сколько можно уже к нему заплатки и костыли лепить?

Я не против САБЖа, я в курсе что если WinAPI используешь, то вот приходится извращаться. Я к тому, что МБ возможно перестать им пользоваться? - в делфи нет альтернативы? (я не вкурсе, я на крестах пишу так-то...).

Николай Зверев комментирует...

> WinAPI ущербное
Ну это Вы погорячились...

> в делфи нет альтернативы?
Альтернатива есть - начиная с Delphi XE2 есть платформа FM (оно же FireMonkey или FMX). Её принципиальное отличие от VCL как раз именно в том, что оно не привязано к API Windows - мультиплатформенное оно: и под WindowsOS, и под MacOS, и под iOS, и под Android.

rrrFer комментирует...

> Ну это Вы погорячились...
Но оно морально устарело. Исключения не кидаются. Любая функция обработки сообщений превращается в антипаттерн, по всему коду разбрасываются switch-и. Ну вот банально вместо кодов типа WM_CREATE передавай элементы перечисления и проблемы автоматически не будет (и еще один костыль в виде "Helper для TMessage" не будет нужен).

Внутри то оно может как угодно работать. Я о том пишу, что с тех пор, как я начал использовать обертки этого API, про то, что внутри я вспоминаю как про страшный сон ))

Torbins комментирует...

"Я не против САБЖа, я в курсе что если WinAPI используешь, то вот приходится извращаться. Я к тому, что МБ возможно перестать им пользоваться? - в делфи нет альтернативы? (я не вкурсе, я на крестах пишу так-то...)."
В делфи есть прекрасная альтернатива - VCL называется. Но Николай как раз ее и отлаживает.

Отправить комментарий

.

.