|
3 формы, 3-я должна быть модальной относит. 2-й но не перекрывать доступ к 1-й
|
|||
---|---|---|---|
#18+
Задача наверно на 2 копейки, но чего-то не получается. Есть основная Form1. Из нее вызываем Form2: Код: vbnet 1. 2. 3. 4.
(обе формы доступны одновременно, т.е. с Form1 можно работать не закрывая Form2) Теперь из Form2 вызываем Form3 (какая-нибудь мелкая настройка). Надо сделать так, чтоб Form3 вызывалась модально относит. только Form2, но при этом Form1 оставалась бы доступна для работы с ней. Делаю (в Form2): Код: vbnet 1. 2. 3.
и недоступны сразу Form1 и Form2 Как выкрутиться? Ну, тест накатал (во вложении) -неработающий. ... |
|||
:
Нравится:
Не нравится:
|
|||
07.04.2013, 01:10 |
|
3 формы, 3-я должна быть модальной относит. 2-й но не перекрывать доступ к 1-й
|
|||
---|---|---|---|
#18+
я ловлю Activate на Form2 и переключаю на Form3 ... |
|||
:
Нравится:
Не нравится:
|
|||
07.04.2013, 01:33 |
|
3 формы, 3-я должна быть модальной относит. 2-й но не перекрывать доступ к 1-й
|
|||
---|---|---|---|
#18+
Shocker.Proя ловлю Activate на Form2 и переключаю на Form3 не понял что имеешь в виду Исходя из того что я начал искать-читать, дело дрянь. Модальная, по определению блокирует "ВСЕ". Создавать какие-то "потоки" -извините, уже наигрались, оно того не стоит да и не надо. Разделять exe-шники в данном случае не хочу, заколебешься обмен между формами делать. ... |
|||
:
Нравится:
Не нравится:
|
|||
07.04.2013, 01:52 |
|
3 формы, 3-я должна быть модальной относит. 2-й но не перекрывать доступ к 1-й
|
|||
---|---|---|---|
#18+
Shocker.Pro, Ну т.е. уже понял, но это глюкота какая-то получается. ... |
|||
:
Нравится:
Не нравится:
|
|||
07.04.2013, 02:05 |
|
3 формы, 3-я должна быть модальной относит. 2-й но не перекрывать доступ к 1-й
|
|||
---|---|---|---|
#18+
Ну это как бы псевдомодальная форма. На самом деле у меня все посложнее, а именно - формами и обменом данными между ними управляет движок форм, он в том числе и отслеживает подобные цепочки и поддерживает таскбар внутри приложения (MDI). То есть для твоего случая - если пользователь переключается через такскбар или напрямую на Form1, то ничего не происходит, если на Form2 - автоматически на экран вылазит Form2, за ней Form3 и т.п. (то есть цепочка может быть и длиннее). Можно еще сделать Form2.Enabled=False, то тогда есть недостаток - пользователь не может переключиться на форму с помощью клика по ней. ЗЫ: есть и другой вариант - следить за Form3.Deactivate. Если фокус ушел на родительскую форму - возвращать его себе обратно. То есть эдакая псевдомодальность. ... |
|||
:
Нравится:
Не нравится:
|
|||
07.04.2013, 11:31 |
|
3 формы, 3-я должна быть модальной относит. 2-й но не перекрывать доступ к 1-й
|
|||
---|---|---|---|
#18+
Shocker.ProМожно еще сделать Form2.Enabled=False, то тогда есть недостаток - пользователь не может переключиться на форму с помощью клика по ней. Почему не может? После закрытия Form3 сможет. Все формы вызывать не модально, а в Form3 прописать: Код: vbnet 1. 2. 3. 4. 5. 6. 7.
... |
|||
:
Нравится:
Не нравится:
|
|||
07.04.2013, 19:37 |
|
3 формы, 3-я должна быть модальной относит. 2-й но не перекрывать доступ к 1-й
|
|||
---|---|---|---|
#18+
ZVIПочему не может? После закрытия Form3 сможет.а ДО закрытия не может. Клик в пустоту уходит. То есть логично было бы, чтобы по клику на Form2 активировалась бы Form2, а поверх нее Form3. А так клик проходит "сквозь" Form2 и активируется то, что находится "позади" Form2 ... |
|||
:
Нравится:
Не нравится:
|
|||
07.04.2013, 20:37 |
|
3 формы, 3-я должна быть модальной относит. 2-й но не перекрывать доступ к 1-й
|
|||
---|---|---|---|
#18+
А об чем спор? Form1 (типа основная): Код: vbnet 1. 2. 3. 4. 5. 6. 7.
Form2 (типа параллельная): Код: vbnet 1. 2. 3.
Form3 (псевдомодальная относительно Form2): Код: vbnet 1. 2. 3. 4. 5. 6. 7. 8.
И вроде как все путем, и придраться нельзя. Или я чего-то не заметил? ... |
|||
:
Нравится:
Не нравится:
|
|||
07.04.2013, 21:23 |
|
3 формы, 3-я должна быть модальной относит. 2-й но не перекрывать доступ к 1-й
|
|||
---|---|---|---|
#18+
а, прекрасно, вроде то, что надо ... |
|||
:
Нравится:
Не нравится:
|
|||
07.04.2013, 21:30 |
|
3 формы, 3-я должна быть модальной относит. 2-й но не перекрывать доступ к 1-й
|
|||
---|---|---|---|
#18+
Не, придрался. Если щелкнуть не по самой Form2, а по "Form2" в панели задач, то она получает-таки фокус, хотя и поверх не вылазит. ... |
|||
:
Нравится:
Не нравится:
|
|||
07.04.2013, 21:30 |
|
3 формы, 3-я должна быть модальной относит. 2-й но не перекрывать доступ к 1-й
|
|||
---|---|---|---|
#18+
ах ты, блин не заметил косяк ... |
|||
:
Нравится:
Не нравится:
|
|||
07.04.2013, 21:37 |
|
3 формы, 3-я должна быть модальной относит. 2-й но не перекрывать доступ к 1-й
|
|||
---|---|---|---|
#18+
Можно спрятать Form2 из таскбара, пока отображается Form3. Когда-то мы уже обсуждали, как это сделать. Например, код Form2: Код: 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.
код Form3: Код: vbnet 1. 2. 3. 4.
... |
|||
:
Нравится:
Не нравится:
|
|||
07.04.2013, 22:42 |
|
3 формы, 3-я должна быть модальной относит. 2-й но не перекрывать доступ к 1-й
|
|||
---|---|---|---|
#18+
Недожал немного :) Вот так правильнее: Например, код Form2: Код: vbnet 1. 2. 3.
код Form3: Код: 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.
... |
|||
:
Нравится:
Не нравится:
|
|||
07.04.2013, 22:56 |
|
3 формы, 3-я должна быть модальной относит. 2-й но не перекрывать доступ к 1-й
|
|||
---|---|---|---|
#18+
Дмитрий77, Модальное окно одно для всего приложения и действует на всё приложение. То, чего ты хочешь, не бывает в природе. ... |
|||
:
Нравится:
Не нравится:
|
|||
07.04.2013, 23:00 |
|
3 формы, 3-я должна быть модальной относит. 2-й но не перекрывать доступ к 1-й
|
|||
---|---|---|---|
#18+
Извиняюсь за спам, исправил опечатку в Form3 код Form2 (без изменений): Код: vbnet 1. 2. 3.
код Form3 (исправлено Form_Load): Код: 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.
... |
|||
:
Нравится:
Не нравится:
|
|||
07.04.2013, 23:04 |
|
3 формы, 3-я должна быть модальной относит. 2-й но не перекрывать доступ к 1-й
|
|||
---|---|---|---|
#18+
ZVI, прятать Form2 из TaskBar я не хочу. За тот код с шапкой спасибо. MasterZiv, >Модальное окно одно для всего приложения и действует на всё приложение то что я это понял практически сразу, следует из моего 3-го поста: >Модальная, по определению блокирует "ВСЕ". Поэтому сейчас речь идет о ПСЕВДОмодальности. Дело осталось возможно за малым: Когда щелкаешь на кнопке "Form2" TaskBar и Form3 модальная, то 1) Кнопка нажимается 2) Кнопка "отскакивает" и "фокус" возвращается в Form3 (Form3-заголовок активируется) В случае "почти рабочего" примера с ПСЕВДО, при нажатии на кнопке "Form2" TaskBar 1) Кнопка нажимается (как и в случае выше) НО 2) Кнопка НЕ "отскакивает" и при отжатии мышки активируется заголовок Form2 (а не Form3) Думаю: надо сабклассить Form2 1) понять событие "нажатия кнопки TaskBar" 2) понять что послать и какому окну (Form2 ? Form3) в ответ на п.(1), чтоб сразу "отжать "кнопку "Form2" на TaskBar сдается мне что WM_ACTIVATEAPP что-то вокруг вот этого Код: vbnet 1. 2. 3. 4. 5. 6. 7.
Но конкретно с этим не взлетело (кнопка на Taskbar остается нажатой). Вот если здесь довести до ума, то будет "как надо". MasterZiv, м.б. дашь идею, VB тут как бы ни причем. ... |
|||
:
Нравится:
Не нравится:
|
|||
07.04.2013, 23:28 |
|
3 формы, 3-я должна быть модальной относит. 2-й но не перекрывать доступ к 1-й
|
|||
---|---|---|---|
#18+
Дмитрий77, Я драм идею, не маяться дурью, а переделать как-то интерфейс по-другому. Если тебе такое нужно, значит тебе нужно, чтобы первое окно было доступно, второе тоже, одновременно, а третье, "МОДАЛЬНОЕ", доступно вместе с первым, но вместо второго. Так так и сделай, два немодальных окна, второе состоит из двух, которые меняют друг друга, например, на двух вкладках. ... |
|||
:
Нравится:
Не нравится:
|
|||
08.04.2013, 11:02 |
|
3 формы, 3-я должна быть модальной относит. 2-й но не перекрывать доступ к 1-й
|
|||
---|---|---|---|
#18+
MasterZiv, >Так так и сделай, два немодальных окна, второе состоит из двух, которые меняют друг друга, например, на двух вкладках Нет, так не пойдет. Form1 - основное окно приложения Form2 -окно мониторинга определенного функционала (можно сделать как отдельный exe, но по ряду причин это крайне неудобно) Form3 -окно настроек этого функционала (работа этого функционала отображается в Form2), там и так Tabstrip, его логично вызывать из Form2. Да, изначально была идея лепить все в Form2, но это громоздко и некрасиво. Т.е. надо сделать именно как хочу. И в принципе почти сделал, и никакой дури в этом не вижу. Давайте локализуем задачу. Я убрал Form1. Form3 вызывается немодально и пока она в работе, Form2.enabled=false. Кнопка "Form2" на Taskbar нужна, она подымает наверх Form2+Form3, если прикрыто "другими" окнами. И делает это правильно. Единственная проблемка: "фокус" (заголовок активирован) переходит на Form2, а не на Form3 и кнопка "Form2" на Taskbar остается нажатой. Так вот как с этим побороться? Во вложении тест с Form2+Form3(без Form1) +сабклассинг Form2 -пока не знаю что там делать. В принципе на эту мелочь можно забить... ... |
|||
:
Нравится:
Не нравится:
|
|||
08.04.2013, 16:23 |
|
3 формы, 3-я должна быть модальной относит. 2-й но не перекрывать доступ к 1-й
|
|||
---|---|---|---|
#18+
Короче сделал. На время отображения Form3, надо сабклассить Form2: Код в Form3: Код: vbnet 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12.
Далее ловится некое волшебное (не упомянутое нигде в MSDN и т.п., я не нашел) сообщение: Код: vbnet 1.
и применяется любой из вариантов: Код: vbnet 1. 2. 3. 4. 5. 6. 7. 8. 9. 10.
Во вложенном примере добавил еще Form4, код такой: Код: 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.
Есть тонкость: 1) Form3 может вызывать другие ПСЕВДОмодальные, активной надо сделать ту, которая самая верхняя в данный момент. Найти ее (следуя логике приложения) довольно легко: Код: vbnet 1. 2. 3.
2) В API -без которых можно обойтись я чуть подзарылся по след. причине: Формой "верхнего уровня" может быть какой-нибудь диалог типа "Open File", вызываемый из Form3. Тогда поможет что-то типа: Код: vbnet 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21.
Понять бы еще что это за WM_ХЗ... google не помог ... |
|||
:
Нравится:
Не нравится:
|
|||
08.04.2013, 21:35 |
|
|
start [/forum/topic.php?fid=60&msg=38216292&tid=2157051]: |
0ms |
get settings: |
8ms |
get forum list: |
15ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
29ms |
get topic data: |
10ms |
get forum data: |
2ms |
get page messages: |
51ms |
get tp. blocked users: |
1ms |
others: | 277ms |
total: | 401ms |
0 / 0 |