Подчиненная форма закрывает остальные

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
sergey-911
Постоялец
Постоялец
 
Сообщения: 545
Зарегистрирован: 17.01.2005 (Пн) 19:10

Подчиненная форма закрывает остальные

Сообщение sergey-911 » 05.01.2007 (Пт) 6:27

Доброго времени суток уважаемые, с наступившим Новым годом 2007 Вас! :D

Столкнулся с проблемой. Есть MDI форма. Открываю в ней подчиненные Form1 и Form2. Как сделать, чтобы Form1 была всегда наверху? :roll:

P.S. В топике http://bbs.vbstreets.ru/viewtopic.php?t=3223 описан пример, как это реализовать в обычных (не MDI формах).
С уважением, Сергей.

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Сообщение Хакер » 05.01.2007 (Пт) 9:56

Установить свойсто MDIChild в True
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 05.01.2007 (Пт) 10:10

И чем это поможет?
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

schalexey
Обычный пользователь
Обычный пользователь
 
Сообщения: 96
Зарегистрирован: 18.02.2005 (Пт) 17:41
Откуда: Сургут

Сообщение schalexey » 05.01.2007 (Пт) 10:32

sergey-911 а чем способ плох:
Код: Выделить всё
Declare Function SetWindowPos Lib "user32" Alias "SetWindowPos" _
(ByVal hwnd As Long, ByVal hWndInsertAfter As Long, _
ByVal x As Long, ByVal y As Long, ByVal cx As Long, _
ByVal cy As Long, ByVal wFlags As Long) As Long

Private Sub Command1_Click()
SetWindowPos me.hwnd, -1, 0, 0, 200, 200, 0
'Устанавливает форму поверх всех окон, а также перемещает её в 'указанные координаты и задаёт указанный размер (200 на 200 пикселей)
End Sub


Так же и для простых окон работает.

sergey-911
Постоялец
Постоялец
 
Сообщения: 545
Зарегистрирован: 17.01.2005 (Пн) 19:10

Сообщение sergey-911 » 05.01.2007 (Пт) 16:34

Нет уважаемые. Оба способа не работают в MDI проекте. С обычными формами - всё нормально. С чилдреновскими - не пашет. Прикрепляю простенький пример MDI проекта, для Вашего удобства. :roll:
Вложения
MDI.rar
Пример для тестирования
(2.35 Кб) Скачиваний: 47
С уважением, Сергей.

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Сообщение Хакер » 05.01.2007 (Пт) 16:40

А может просто сделать одну форму owner-ом другой? Хотя это сделает лишние ненужные тебе возможности.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

sergey-911
Постоялец
Постоялец
 
Сообщения: 545
Зарегистрирован: 17.01.2005 (Пн) 19:10

Сообщение sergey-911 » 05.01.2007 (Пт) 16:50

Нужно сделать так, чтобы любая из двух подчинённых форм закрывала другую, причем доступ ко второй форме был недоступен для пользователя, как
Код: Выделить всё
Me.Show vbModal

при работе с обычными формами. :shock: :roll:
С уважением, Сергей.

sergey-911
Постоялец
Постоялец
 
Сообщения: 545
Зарегистрирован: 17.01.2005 (Пн) 19:10

Сообщение sergey-911 » 05.01.2007 (Пт) 16:58

А что даст
Код: Выделить всё
owner

?
Попробовал, эфеект накакой.
С уважением, Сергей.

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Сообщение Хакер » 05.01.2007 (Пт) 17:00

Ан нет. Овнером стать не получается.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 05.01.2007 (Пт) 17:12

IMDIPseudoParent.cls
Код: Выделить всё
Option Explicit

Public Sub RiseAndShine()
End Sub

Public Sub ShutDown()
End Sub


Form1
Код: Выделить всё

...
Implements IMDIPseudoParent
...

Public Sub ShowModal()
  Dim f As Form2

  Set f = New Form2
  Set f.MDIParent = Me
 
  Me.Enabled = False

  f.Show
End Sub


Private Sub IMDIPseudoParent_RiseAndShine()
  ...
 
  Me.Enabled = True
  Me.SetFocus

  ... 
End Sub

Private Sub IMDIPseudoParent_ShutDown()
  'N/a
End Sub



Form2
Код: Выделить всё

...

Private mMDIParent As IMDIPseudoParent

Public Property Set MDIParent(ByVal p As IMDIPseudoParent)
  Set mMDIParent = p
End Property


Private Sub Form_Unload(Cancel As Integer)
  ...
 
  If Not mMDIParent Is Nothing Then mMDIParent.RiseAndShine
 
  ...
End Sub
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

sergey-911
Постоялец
Постоялец
 
Сообщения: 545
Зарегистрирован: 17.01.2005 (Пн) 19:10

Сообщение sergey-911 » 05.01.2007 (Пт) 17:13

и я говорю, не получается
С уважением, Сергей.

schalexey
Обычный пользователь
Обычный пользователь
 
Сообщения: 96
Зарегистрирован: 18.02.2005 (Пт) 17:41
Откуда: Сургут

Сообщение schalexey » 05.01.2007 (Пт) 18:01

Самый глупый наверно способ :)
Поставить на форму таймер выставить интервал 100 и в событии таймера писать
Код: Выделить всё
me.zorder 0

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 05.01.2007 (Пт) 18:02

Ой, а как здорово получится, если таких форм будет две... :bounce:
Изображение

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Сообщение Хакер » 05.01.2007 (Пт) 18:02

schalexey
Глупость... Уж тогда писать пользователю "Не кликай на то окно, что под этим" :lol:
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

sergey-911
Постоялец
Постоялец
 
Сообщения: 545
Зарегистрирован: 17.01.2005 (Пн) 19:10

Сообщение sergey-911 » 05.01.2007 (Пт) 18:03

Спасибо GSerg за помощь.
Никак не получается разобраться... :(
Извини за назойливость. Не мог бы на примере выложить с небольшими комментариями...?
Для чего класс
Код: Выделить всё

Option Explicit

Public Sub RiseAndShine()
End Sub

Public Sub ShutDown()
End Sub

?
С уважением, Сергей.

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 05.01.2007 (Пт) 18:11

Для того, что потом Implements IMDIPseudoParent
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

sergey-911
Постоялец
Постоялец
 
Сообщения: 545
Зарегистрирован: 17.01.2005 (Пн) 19:10

Сообщение sergey-911 » 05.01.2007 (Пт) 18:17

GSerg
Вроде принцип я понял. Дочерняя фрма открывается активной, у другой свойство "Enabled" меняется на "False". Но форм-то не две, а гораздо больше в реальном проекте. Да не известно, какие из них открыты, а какие нет. Всем свойство "Enabled" меняеть на "False" не так-то удобно.
С уважением, Сергей.

sergey-911
Постоялец
Постоялец
 
Сообщения: 545
Зарегистрирован: 17.01.2005 (Пн) 19:10

Сообщение sergey-911 » 05.01.2007 (Пт) 18:18

Есть более элегантный способ. Я его видел 2 года назад на каком-то из форумов. Реализован на API, кода было - немало. Но я на тот момент не придал примеру значение за ненадобностью, а сейчас найти не могу... :(
С уважением, Сергей.

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 05.01.2007 (Пт) 18:21

Если тебе надо заблокировать доступ ко всем, сделай ту форму не-MDIChild.
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

sergey-911
Постоялец
Постоялец
 
Сообщения: 545
Зарегистрирован: 17.01.2005 (Пн) 19:10

Сообщение sergey-911 » 05.01.2007 (Пт) 18:24

GSerg
Всё-равно не понимаю, зачем класс, в котором две пустые процедуры, может я что не понимаю? Пришли плиз исходник, как это должно работать, если не так трудно.
С уважением, Сергей.

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 05.01.2007 (Пт) 18:27

Это не класс, а интерфейс. Который потом реализует форма.

Исходник написан полный, вместе с примером вызова.

А ты просто сделай одну форму не-MDIChild...
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

sergey-911
Постоялец
Постоялец
 
Сообщения: 545
Зарегистрирован: 17.01.2005 (Пн) 19:10

Сообщение sergey-911 » 05.01.2007 (Пт) 21:35

GSerg
Исходник написан полный, вместе с примером вызова.

А где исходник то?
А ты просто сделай одну форму не-MDIChild...

Не, все формы делаю в одном MDI окне. Так эстетичней. Зачем пользователя раздражать кучей всплывающих модальных форм. Ну это моё мнение, у каждого, на этот счёт может быть своё. Например, так в 1С реализовано. При редактировани данных в форме с таблицей, открывается не модальная, а чилдреновская форма. При этом всё хорошо, но пользователь может вернуться в редактируемую форму и накосячить в ней, удалив редактируемые данные, а потом вернуться в форму для редактирования данных и попытаться продолжить модификацию. При этом могут возникнуть косяки в БД, в зависимости от её структуры.
Чтобы избежать этого приходится кучу лишнего кода, проверяющего наличие данных в БД, в момент сохранения, обрабатывать ошибки...
Вот я и решил, что лучше при этом открывать чилддреновскую форму, которая будет всегда наверху, в то же время форма будет не модальной и не будет отличаться от других...
С уважением, Сергей.

sergey-911
Постоялец
Постоялец
 
Сообщения: 545
Зарегистрирован: 17.01.2005 (Пн) 19:10

Сообщение sergey-911 » 05.01.2007 (Пт) 21:44

Вот, нашел пример, про который говорил
http://jetprograms.narod.ru/program/download/mdi_lookup_position.zip
, немного под себя переделал. Результат выкладываю... Но всё-равно, мне этот вариант не нравится... :roll:
Всем спасибо за помощь и с наступающим Рождеством!
Тема до конца не исчерпана... :D
Вложения
MDI.rar
Результат
(3.35 Кб) Скачиваний: 32
С уважением, Сергей.

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 05.01.2007 (Пт) 21:47

Исходник-то в тексте ответа.

Ты определись, что тебе надо.
Если чтобы при работе с одной из форм нельзя было вернуться ко всем остальным, сделай только её не-MDIChild.
Если чтобы нельзя было вернуться к породившей форме, см. код.
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

sergey-911
Постоялец
Постоялец
 
Сообщения: 545
Зарегистрирован: 17.01.2005 (Пн) 19:10

Сообщение sergey-911 » 06.01.2007 (Сб) 0:06

Хотелось бы, конечно, чтобы нельзя было вернуться ко всем остальным. Но делая её не MDIChild, форма выходит из основного MDI - главного окна. А мне бы этого не хотелось!
С уважением, Сергей.

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 06.01.2007 (Сб) 0:16

А пусть будет дочерняя, но не MDIChild :-)
Изображение

sergey-911
Постоялец
Постоялец
 
Сообщения: 545
Зарегистрирован: 17.01.2005 (Пн) 19:10

Сообщение sergey-911 » 06.01.2007 (Сб) 0:24

tyomitch
А пусть будет дочерняя, но не MDIChild

Это как?
С уважением, Сергей.

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 06.01.2007 (Сб) 0:27

Добавь к стилю WS_CHILD
Изображение

sergey-911
Постоялец
Постоялец
 
Сообщения: 545
Зарегистрирован: 17.01.2005 (Пн) 19:10

Сообщение sergey-911 » 06.01.2007 (Сб) 22:55

tyomitch
Не доганяю. Можно по-подробнее!
С уважением, Сергей.

sergey-911
Постоялец
Постоялец
 
Сообщения: 545
Зарегистрирован: 17.01.2005 (Пн) 19:10

Сообщение sergey-911 » 14.01.2007 (Вс) 23:47

Доброго времени суток GSerg.
Помоги плиз разобраться с примером, присланным тобою (см. выше). Как не пытался - ошибки. Делаю не так. :( Сделай плиз работающий исходник. :oops: Извини за наглость...
С уважением, Сергей.

След.

Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: Google-бот и гости: 89

    TopList