|
И ВСЕ-ТАКИ. Надо ли снимать сабклассинг? Как правильно его снять?
|
|||
---|---|---|---|
#18+
Меня учили : AntonariyСабклассинг нужно снимать всегда. Дмитрий77Почему? Если честно, почти никогда этого не делаю. Какие последствия?C одним из них ты уже столкнулся. Другое — критические ошибки. Я научился: Код: vbnet 1. 2. 3.
В процессе освоения .NET я УДЕЛИЛ ДАННОМУ ВОПРОСУ БОЛЬШОЕ ВНИМАНИЕ и задал вопрос ПО СУЩЕСТВУ. Дмитрий77 Вопрос 2. Сабклассинг снимать надо? И правильно ли я это делаю? Код: vbnet 1. 2. 3. 4.
Мне конкретно по этому моменту никто толком ничего не ответил. У меня возникла проблема с использованием Tooltip1 на Listview1 : InvalidOperationException Попытка доступа к элементу управления 'ListView1' не из того потока в кот. он был создан Сообщение m = WM_CLOSE Я НАКОНЕЦ ДОКОПАЛСЯ: Минимальный код примера на котором ПРОБЛЕМА ВОСПРОИЗВОДИТСЯ (см. тест-проект во вложении): Код: vbnet 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26.
Для воспроизведения проблемы надо: 1) создать проект, кинуть на форму ListView1 и Tooltip1 2) вставить мой код в Form1 3) запустить проект 4) навести мышку на Listview чтобы отобразилось примечание 5) закрыть форму ВСЕ. Ошибка очевидно в том КАК и ГДЕ я снимаю сабклассинг: Код: vbnet 1. 2. 3. 4. 5.
Вопросы: 1) Сабклассинг снимать надо? 2) ГДЕ И КАК это сделать? ... |
|||
:
Нравится:
Не нравится:
|
|||
17.10.2013, 02:41 |
|
И ВСЕ-ТАКИ. Надо ли снимать сабклассинг? Как правильно его снять?
|
|||
---|---|---|---|
#18+
Дмитрий77Мне конкретно по этому моменту никто толком ничего не ответил. неправда Объясните мне как делать сабклассинг нескольких контролов в .Net ... |
|||
:
Нравится:
Не нравится:
|
|||
17.10.2013, 08:39 |
|
И ВСЕ-ТАКИ. Надо ли снимать сабклассинг? Как правильно его снять?
|
|||
---|---|---|---|
#18+
ИзопропилДмитрий77Мне конкретно по этому моменту никто толком ничего не ответил. неправда Объясните мне как делать сабклассинг нескольких контролов в .Net Не, я видел. Я не в потолок смотрю. Я еще в документацию смотрел (пример) -там примерно тоже самое. А давай на мой код конкретно смотреть. Вот мой класс (чуть переделанный глядючи на твой код и на пример из документации): Код: vbnet 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41.
Очень удобно, когда окно (ListView) сабклассится, я получаю все его Msg в s_ListView_CallBackWndProc Код: vbnet 1. 2. 3. 4. 5. 6. 7. 8. 9.
А теперь я хочу сделать 2 кнопки: Код: vbnet 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13.
И что ты думаешь, я не понимаю в чем засада? Идея такого класса понятна: Класс тупо привязывается к родному Control. Т.е. когда ListView1 делает parent.HandleCreated, класс вызывает OnHandleCreated и делает AssignHandle(ListView1.Handle) Но на момент ButtonSubclass_Click мне это бесполезно, т.к. parent.HandleCreated уже давно в прошлом. Я не хочу лазить в дизайнеры и привязывать s_ListView = New SubclassHWND(ListView1) на этапе создания ListView (как это здесь делается ) У меня есть Form_Load и (условно) ButtonSubclass_Click (где я могу и хочу это сделать). Аналогично, со снятием. Опять же, я понимаю, что этот класс тупо ловит parent.HandleDestroyed и автоматически снимает сабклассинг в Sub OnHandleDestroyed делая ReleaseHandle() Тогда да, ничего не ругается. Ну я например хочу снять сабклассинг раньше, в ButtonUnSubclass_Click. Вопросы: 1. что мне переделать в МОЕМ коде чтоб УСТАНАВЛИВАТЬ САБКЛАССИНГ в ButtonSubclass_Click (когда я этого хочу)? 2. что мне переделать в МОЕМ коде чтоб СНИМАТЬ САБКЛАССИНГ в ButtonSubclass_Click (когда я этого хочу)? В VB6 аналогичный вопрос решаем так: Код: vbnet 1. 2. 3. 4. 5. 6. 7. 8. 9. 10.
Не, ребят, ну объясните что переделать Я в ваших хитрожопых классах человек новый. 1) Установить сабклассинг (в любой момент) 2) Снять сабклассинг (в любой момент) И чтоб ничего не глючило при этом. М.б. тупо забабахать SetWindowLong и CallWindowProc? И не сомневаюсь что это будет работать без глюков. Но хочется все-таки как здесь принято сделать. Просто в каждом посте тыкаете на БОЛЬШУЮ КУЛИНАРНУЮ КНИГУ, причем я так понял обязательно читать ее всю (1000 страниц) и прямо сейчас, а это если честно уже достало. Что мне конкретно надо я объяснил выше. ... |
|||
:
Нравится:
Не нравится:
|
|||
17.10.2013, 14:36 |
|
И ВСЕ-ТАКИ. Надо ли снимать сабклассинг? Как правильно его снять?
|
|||
---|---|---|---|
#18+
Короче этот метод сабклассинга без хитрожопостей умностей внутри класса и влезания в дизайнер формы стандартного проекта правильно готовится так: Код: vbnet 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39.
И в этом виде я могу применять класс как к .Net контролам, так и к API-контролам, потому как контрол не обязательно создан в чудо-Control-Net-дизайнере, а может быть API-шным. Но нерешенным остается вопрос с ключевым словом КОГДА Я ЭТОГО ХОЧУ особенно применительно к вопросу как СНИМАТЬ САБКЛАССИНГ. Т.е. ВОПРОС ОСТАЕТСЯ Потому что ВКЛЮЧАТЬ САБКЛАССИНГ очевидно таким образом можно в любой момент. А вот БЕЗОБИДНО снять сабклассинг по этому методу может не получиться. В принципе мне этого по идее пока должно хватить, хотя исходя из опыта не уверен. Ну, и как говорится некая непонятка с сабклассингом API-контролов по этому методу -напр. мой пример с hwndHelp. (API-контрол не предоставляет событий HandleCreated и HandleDestroyed в которые по хорошему надо втыкать AssignHandle и ReleaseHandle чтоб избежать проблем) ... |
|||
:
Нравится:
Не нравится:
|
|||
17.10.2013, 16:46 |
|
И ВСЕ-ТАКИ. Надо ли снимать сабклассинг? Как правильно его снять?
|
|||
---|---|---|---|
#18+
А кто нибудь может мне внятно ответить? НА ХРЕНА его вообще снимать В КОНЦЕ? Хоть по кулинарному? ИзопропилИзопропил, вот такой говнокод получше видимо будет Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11.
Хоть по простому? Код: vbnet 1. 2. 3. 4.
Тогда как в вашей же кулинарной книге (вернее в документации Майкрософт): NativeWindow.ReleaseHandle Method НАПИСАНО:A window automatically calls this method if it receives a native Win32 WM_NCDESTROY message, indicating that Windows has destroyed the handle. Отсюда вывод, что для API-hwnd сабклассинг в конце можно не снимать (ReleaseHandle не делать). Да и для Net контролов зачем это делать. Или имеется ввиду что стрипы не являясь native Win32 Window не получают native Win32 WM_NCDESTROY message? На хрена ReleaseHandle в конце делать если он автоматически делается? Но при этом ВОПРОС ОТКРЫТЫЙ: НАПИСАНОThis method does not destroy the window handle. Instead, it sets the handle's window procedure to the default window procedure . It sets the Handle property to 0 and calls OnHandleChange to reflect the change. Т.е. для того чтобы снять сабклассинг КОГДА Я ХОЧУ ( sets the handle's window procedure to the default window procedure ) выполнить Код: vbnet 1.
законно в любом месте кода (согласно документации) и не должно приводить к проблемам. Но ПРИВОДИТ как видим из приведенного примера с тултип. ... |
|||
:
Нравится:
Не нравится:
|
|||
17.10.2013, 23:52 |
|
И ВСЕ-ТАКИ. Надо ли снимать сабклассинг? Как правильно его снять?
|
|||
---|---|---|---|
#18+
И...и...и как все плохо Я понял зачем эти предусмотрительные заглушки, Код: plaintext 1. 2.
боюсь дядя Рихтер не поможет. Дело не в кулинарии, а попорченном мясе, здесь марганцовка блин нужна и много. Дальше веселее. Мне надо установить API -image лист (потому что Net imagelist слегка глючный), но чтобы он не перерисовывался контролом, надо сделать сабклассинг, но начинать сабклассинг надо только ПОСЛЕ установки API-Image-листа. Т.е. вот так: Код: vbnet 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17.
Естественно, control.HandleCreated += control_HandleCreated; я убрал Ну а вторую часть оставил: Код: vbnet 1. 2. 3. 4.
На XP работает, на 7-ке ругается при старте. Я понял почему, до установки ImageList у меня стоял код, кот. на 7-ке срабатывает Работает на Вистах, 7-ках и 8-ках. LVN_GETINFOTIP не генерируется. Если строка не вписывается, то автоматом генерируетя системный Tooltip (работает и для итемов, и для сабитемов). "Самопалка" не нужна. Решение в одну строчку кода: Код: vbnet 1. 2. 3.
Эти ДЕБИЛЫ для того чтобы установить Or LVS_EX_INFOTIP (а мне надо это сделать НЕ В КОНСТРУКТОРЕ) ПЕРЕСОЗДАЮТ КОНТРОЛ ЗАНОВО. В итоге имеем: 1) ListView1_HandleCreated 2) ListView1_HandleDestroyed (здесь краш s_ListView.ReleaseHandle(), я не мог предположить что дебилы НАСТОЛЬКО) 3) ListView1_HandleCreated (но уже с Or LVS_EX_INFOTIP) !!!с другим хэндлом Я конечно вылечил с перестраховкой: Код: vbnet 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15.
Неудивительно что при работе с таким продуктом снятие сабклассинга s_ListView.ReleaseHandle() может приводить к проблемам. НЕ В КУЛИНАРИИ дело, а в НЕКАЧЕСТВЕННЫХ ПОЛУФАБРИКАТАХ с которыми приходится работать. ... |
|||
:
Нравится:
Не нравится:
|
|||
18.10.2013, 01:44 |
|
И ВСЕ-ТАКИ. Надо ли снимать сабклассинг? Как правильно его снять?
|
|||
---|---|---|---|
#18+
Дмитрий77Эти ДЕБИЛЫ для того чтобы установить Or LVS_EX_INFOTIP (а мне надо это сделать НЕ В КОНСТРУКТОРЕ) ПЕРЕСОЗДАЮТ КОНТРОЛ ЗАНОВО. в документации это описано,но кто ж её читает ... |
|||
:
Нравится:
Не нравится:
|
|||
18.10.2013, 04:14 |
|
И ВСЕ-ТАКИ. Надо ли снимать сабклассинг? Как правильно его снять?
|
|||
---|---|---|---|
#18+
Изопропил, ListView.ShowItemToolTips Property 1) Вообще я не принебрегаю чтением MS -документаций, иначе б в API так не разбирался. Где? М.б. где-то в общих описаниях? М.б. они еще объясняют зачем? 2) А ты считаешь что это нормально? Я так делаю в ОЧЕНЬ РЕДКИХ СЛУЧАЯХ -когда лениво перерисовывать и отслеживать все ньюансы.Но здесь то один единственный стиль и никаких ньюансов. А вот проблем можно огрести. ... |
|||
:
Нравится:
Не нравится:
|
|||
18.10.2013, 04:35 |
|
И ВСЕ-ТАКИ. Надо ли снимать сабклассинг? Как правильно его снять?
|
|||
---|---|---|---|
#18+
Дмитрий77Эти ДЕБИЛЫ для того чтобы установить Or LVS_EX_INFOTIP (а мне надо это сделать НЕ В КОНСТРУКТОРЕ) ПЕРЕСОЗДАЮТ КОНТРОЛ ЗАНОВО.Этот случай не единичен. Чтобы добавить статус бару SBARS_SIZEGRIP, его тоже нужно пересоздать. ... |
|||
:
Нравится:
Не нравится:
|
|||
18.10.2013, 09:55 |
|
И ВСЕ-ТАКИ. Надо ли снимать сабклассинг? Как правильно его снять?
|
|||
---|---|---|---|
#18+
Дмитрий77Вопросы: 1. что мне переделать в МОЕМ коде чтоб УСТАНАВЛИВАТЬ САБКЛАССИНГ в ButtonSubclass_Click (когда я этого хочу)? 2. что мне переделать в МОЕМ коде чтоб СНИМАТЬ САБКЛАССИНГ в ButtonSubclass_Click (когда я этого хочу)? Я так понимаю, никто не знает как это БЕЗГЛЮЧНО сделать через NativeWindow? не привязываясь к Код: vbnet 1. 2.
А вот так кстати ничего не глючит (тест-проект приложил). И можно жать на кнопки Subclass() и UnSubclass() сколько влезет. Может ну его и использовать "старый добрый метод"? Правда конфликт с дворником пришлось улаживать, я там выделил проблемное место. Код: vbnet 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65. 66. 67. 68. 69. 70. 71. 72. 73. 74. 75. 76. 77. 78. 79. 80. 81. 82.
... |
|||
:
Нравится:
Не нравится:
|
|||
19.10.2013, 03:47 |
|
|
start [/forum/topic.php?fid=20&msg=38430556&tid=1403839]: |
0ms |
get settings: |
9ms |
get forum list: |
13ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
70ms |
get topic data: |
11ms |
get forum data: |
2ms |
get page messages: |
46ms |
get tp. blocked users: |
1ms |
others: | 17ms |
total: | 175ms |
0 / 0 |