| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > VB .NET > Почему дочерняя форма не едет влево |
| Автор: transparent 21.6.2011, 16:49 |
| Захотел я сделать как в студии VS. А именно если у Вас окошко свойств находится в состояние "автоматически скрывать" - то когда наводишь на панельку мышь - то выезжает окошко свойств (допустим это форма 2) Так вот, решил я так же сделать.. С помощью АПИ функции SetParent сделал вторую форму дочерней по отношению к главной(первой), и при загрузки второй формы(а вызвается она наведением мыши на бутон на первой форме) - поставил включение таймера - а в таймере что то вроде этого Me.left -=1 .. Но форма почему то вообще вниз и вправо улезает, при чем так присходит как если из главной формы установить родителя (при помощь Сетпарент), так и из второй (при загрузке второй формы - вторая форма устанавливается как дочерняя) Почему она не двигается влево как положенно? ПС, Если не использовать АПИ функцию то код для отправления второй формы влево - работает нормально....Но не подходит, так как нужно чтобы форма 2 не выходила за рамки первой формы, и могла заходить за края первой формы(так красивее вообщем) |
| Автор: diadiavova 21.6.2011, 19:43 |
| Загрузи вот этот проект http://sourceforge.net/projects/dockpanelsuite/ и не парься. То, что ты хочешь сделать на самом деле не так просто реализуется. |
| Автор: transparent 21.6.2011, 20:04 |
| diadiavova, И что мне дает этот проект? Верю что не просто так. Но если бы мне понять почему так окно не правильно едет, то было бы легче справиться, по крайней мере в моем направлении |
| Автор: transparent 21.6.2011, 21:29 | ||
я скачал там тока ехешник и длл |
| Автор: diadiavova 21.6.2011, 21:33 |
| Там на панели навигации есть пункт Code Добавлено через 2 минуты и 50 секунд А точнее скачай отсюда http://sourceforge.net/projects/dockpanelsuite/files/DockPanel%20Suite/2.4.0/ Качай ту ссылку, в имени которой присутствует слово Source |
| Автор: transparent 21.6.2011, 21:38 |
| не пойму где...Там есть только один пунктик с code и то там не одно слово |
| Автор: diadiavova 21.6.2011, 21:39 |
| Ну вот по этой ссылке грузи http://sourceforge.net/projects/dockpanelsuite/files/DockPanel%20Suite/2.4.0/DockPanel_2.4_Source.zip/download |
| Автор: transparent 21.6.2011, 21:40 |
| Слушай, Дядь Вов, а почему почти все примеры в МСДН сделаны с console...Это предполагает что примеры нужно запускать как "консольное приложение" (то есть наверно не запускать , а создавать не винформс а консольное приложение"), да? Добавлено через 3 минуты и 32 секунды оо, спасиб, теперь есть, там тока c#? |
| Автор: diadiavova 21.6.2011, 21:54 | ||||
Не все. Просто для примера это удобнее: ничего лишнего и на надо объяснять что должно быть на форме.
Если ты хочешь скопипастить и чтоб работало, то да. Но вообще примеры даются для того, чтобы ты мог разобраться в вопросе и написать свой код: хошь в консоли, хошь в винформе, хош в впф, или как угодно еще. Да. Можешь поискать еще, на сорсфорже или на кодплексе. Это называется интерфейс Doking. В принципе есть и другие реализации, но под винформы это лучшее, что мне попадалось. |
| Автор: transparent 21.6.2011, 21:58 |
| спасибо, погляжу, а что такое впф |
| Автор: diadiavova 21.6.2011, 22:00 |
| http://msdn.microsoft.com/ru-ru/library/ms754130.aspx |
| Автор: transparent 21.6.2011, 22:08 |
| спасиб, погляжу, это же не то же что и WMI? WMI это же скрипт? а это что в 2 словах? |
| Автор: diadiavova 21.6.2011, 22:12 |
Замена винформам. |
| Автор: transparent 22.6.2011, 18:38 |
| Коду конечно обалделдеть скока.... А в моем случае с простенькой панелькой не поможешь Дядь Вов Задача то ерунда, нужно лишь понять почему форма не едет влево при SetParent |
| Автор: diadiavova 22.6.2011, 18:58 |
Возможно потому, что это не предусмотрено? |
| Автор: transparent 24.6.2011, 15:26 | ||||
вызываю форм2 из форм1 как то так
Это происходит загрузка второй формы, которая сразу же становится дочерней, и встает справого края первой формы, и должна двигаться влево, а она двигается вправо Если не использовать Сетпарент функцию то все в порядке как и должно быть...Но там мне не нравится, да и писать дополнительно нужно...ЧТобы форма вторая не была видна сначала а потом покускам начала проявляться и был эффект как в студии.... А сетпарентом этого делать ненужно, форма2 является дочерней(как если бы мы сделал мди проект), и если она за краем формы 1 - то ее правый край(формы2) не виден, в отличие если бы форма2 была не дочерней, она бы просто вставала рядом с форм1 и ехала.. Можете хотя бы потестить у себя, может чего надумаете, а? |
| Автор: diadiavova 24.6.2011, 15:41 |
| transparent, можешь хотя бы объяснить зачем ты этим занимаешься? Ты ведь видел реализацию, там все не так просто, неужели тебе мало? Я могу объяснить как разместить форму внутри другого контейнера(если тебе это нужно, хотя я не уверен, что понял чего ты хочешь), только зачем тебе это? |
| Автор: transparent 24.6.2011, 16:14 |
| Объясни если можешь! Буду рад. А зачем?Ну хочу чтобы форма ехала и всего то...А при применении этой функции все сбивается нафик..И меня это бесит, вот и пытаюсь разобраться в чем дело Я же не пытаюсь сделать как в том проекте на #, мне это хотя бы реализовать.. |
| Автор: diadiavova 24.6.2011, 16:22 |
| У формы есть свойство TopLevelControl (если не ошибаюсь с названием). Если ты установишь его в Fale, то сможешь добавить в любой контейнер тем же способом, которым добавляется любой другой контрол( добавлением формы в коллекцию Controls контейнера или присвоением контейнера свойству Parent формы). |
| Автор: transparent 24.6.2011, 17:23 |
| show(me) не подойдет добавить так ? |
| Автор: diadiavova 24.6.2011, 17:35 |
Если тебя устроит результат, делай так. Зачем ты тогда спрашиваешь как сделать, если у тебя есть свое решение? |
| Автор: transparent 24.6.2011, 19:16 |
| затем что такой результат не устраивает Добавлено через 11 минут и 6 секунд топлевел, топлевелконтрол, поюзал, нифига не выходит со вторым вообще, а с первым пропадает форма либо первая, либо вторая |
| Автор: diadiavova 24.6.2011, 21:27 |
С каким вторым? С каким первым? Ты о чем вообще? |
| Автор: transparent 24.6.2011, 22:18 |
| способом! Я не понял как ты хотел сделать. Я сделал так. Form2.Toplevel = false - и форма2 пропадает при загрузке, а ToplevelControl - получает родительский элемент.... |
| Автор: diadiavova 24.6.2011, 22:23 |
| Сделай так же как в аттаче. |
| Автор: transparent 24.6.2011, 23:41 |
| Dim f2 As New Form2 f2.TopLevel = False Me.Controls.Add(f2) f2.Show() Вообще все исчезает... Ты создаешь новую форму...А у меня она уже создана... |
| Автор: diadiavova 25.6.2011, 00:00 |
И что ты предлагаешь, чтобы у меня в приложении появлялась форма из твоего приложения что ли? Сделай так же. Почему у меня ничего не исчезает? Запусти мой проект из папки дебаг и посмотри, там все появляется. |
| Автор: transparent 25.6.2011, 01:35 |
| да запускал я..думаешь совсем чтоли дуб...если мы с тобой плохо понимаем друг друга, это еще не говорит о том что кто то из нах странный, это я думаю мягкоговоря, и ты понимаешь что ты так думаешь на меня а я на тебя... Я дотошный, а ты не можешь сразу ответить на обычные вещи, хоть и в обученических целях. У твоего проекта все в порядке. Но мне нужен другой результат. Если испольщзовать твой код, то моя форма пропадает, если же поменять переменные объектов(имена) то происходит практически тоже самое) Что тут необчного? Мне нужно чтобы вторая форма отобразилась в контейнере первой, и не выходила за рамки первой, не просто по указанию, а потому что она является дочерней, со всеми истекающими отсюда(всегда поверх родильской, если задвинуть за грань первой - то дочерняя на половину пропадет(на ту половину на которую завели за край первой))....ну и т.д. А ты предложил создание новой формы и т.д. А моя форма уже создана. И с ней это не проходит...НО имхо я могу и тормозить и не догонять, я человек, тем более дотошный, бу |
| Автор: diadiavova 25.6.2011, 08:59 | ||||||||
![]() Ты однозначно странный, даже не сомневайся. Если бы не думал, что ты странный, то уже забанил бы тебя за троллинг.
Да я тебе сразу отвечаю и причем по нескольку раз, а ты один хрен переспрашиваешь. Возьми тему про функции, я тебе что непонятно сразу объяснил, что после Return возвращается результат, а после присвоения нет? И перечитай, какую белиберду ты после этого начал писать? Или в теме про конфиг, ну несколько раз написал, что не из папки дебаг удалил файл, так нет же опять 25 - "а помнишь, ты писал, что удалил из дебага?". Ты считаешь это нормально? Еще при живом общении можно подумать, что ты чего-то не расслышал, но здесь кто мешает перечитать, если не понял с первого раза?
Я понятия не имею, какой именно результат тебе нужен. Я тебе написал, что если тебе надо разместить форму в другом контейнере, то могу описать как это сделать и там ничего не было о том, что напишу как получить тот результат, который тебе нужен. Скорей всего она просто находится за пределами видимости, установи локейшн так чтобы она не вылазила за пределы контейнера.
А что по-твоему должно измениться при изменении имен? Каким образом имена должны влиять на поведение
А ты в моем примере пробовал двигать дочернюю форму? |
| Автор: transparent 25.6.2011, 12:28 |
| пробовал..Хорошо получается. Попробуй создать форму (в дизайнере), а потом с ней проделать тоже самое |
| Автор: diadiavova 25.6.2011, 14:58 | ||
По-твоему я это пробую впервые что ли? |
| Автор: diadiavova 25.6.2011, 15:18 |
| Вот тебе пример. Любуйся. |
| Автор: transparent 26.6.2011, 20:23 |
| ну я все так же и сделал, но у меня она куда то исчезает.....МОжет и правду у нее координаты уносятся |
| Автор: diadiavova 26.6.2011, 20:52 | ||
Почему не работает у тебя я тебе расскажу когда свой хрустальный шар найду. |
| Автор: transparent 26.6.2011, 21:36 |
| вообщем если вызываю этим способом из тоолстрип то формы исчезают. Сейчас на кнопку поставил, и все нормально, но на форме ричтекстбокс - и он его перекрывал, почему? То есть форма2 была под ричтекстбоксом.. |
| Автор: diadiavova 26.6.2011, 21:43 |
| Это зависит от порядка добавления элементов в форму: если ричтекстбокс ты добавил позже, то он будет сверху. Вообще у всех контролов(включая форму) есть методы BringToFront и SendToBack. Вызови у своей формы первый из них и она окажется сверху. |
| Автор: transparent 29.6.2011, 18:44 |
| diadiavova, А почему теперь когда я ставлю какой нить код в событие(формы2) допустим нажатия мышки по форме 2 - то код не срабатывает, ? И как сие исправить? |
| Автор: diadiavova 29.6.2011, 18:49 | ||
Потому что ты что-то делаешь неправильно Сделать правильно. |
| Автор: transparent 29.6.2011, 20:02 | ||||
| сделал как ты и писал Вызываю вторую форму из первой формы по клику по кнопке
Форма появилась. Все нормально. Пытаюсь сделать так: когда мышь ушла с формы2 то форма2 закрывается, да или просто месадж хотя бы отобразит
|
| Автор: diadiavova 29.6.2011, 22:29 | ||
Надо же: достаточно было дать телепатический ответ на твой телепатический вопрос, как ты сразу все понял.
В данном случае ты подписываешься на событие главной формы, той в которой написан код, да и закрываешь ты тоже ее. Разве ты не понимаешь, что каждое событие связано с каким-то объектом? У главной формы свой набор событий, у дочерней - свой, пусть они даже одинаковые, но происходят в разное время. Тебе надо подписаться на событие дочерней формы и закрывать тоже ее, а не главную. Для этого объявлять переменную надо на уровне класса, а не внутри метода и с ключевым словом WithEvents. Тогда она будет доступна в списке объектов и студия создаст обработчик. Можно сделать и внутри метода, но с помощью оператора AddHandler (смотри в документации). И не Close, а chF.Close, если ты хочешь закрыть именно ее. |
| Автор: transparent 30.6.2011, 17:54 | ||
| не получается...:( Пробовал по разному...но все это больше смахивает на бред Так я тоже пробовал chF.Close,
Хотя бы главная закрылась И на уровне класса объявлял, и обработчики добавлял(не единовременно) Мне кажется тут дело в toplevel and controls.add...или нет? Но в любом случае я что то делаю не так... Приводить примеры тут не буду, так как я быстро набрасывал код в проект и стирал, дабы написать следующий Можешь привести рабочий пример, плиз |
| Автор: diadiavova 30.6.2011, 20:27 | ||||||
Вот это пишешь на уровне класса
Вот это в обработчике события Load главной формы
Так выглядит обработчик
Почти все скопировал у тебя, малость изменив. Если не сработает, попробуй с другим событием(например Click), поскольку я не знаю наверняка, поддерживает ли форма MouseLive |
| Автор: diadiavova 30.6.2011, 21:44 |
| Я попробовал это сделать сам и поначалу тоже возникла эта проблема. Потом оказалось, что дело было в том, что сама форма там была не видна. То есть она была залита другим контролом и по сути на саму форму не попадала мышь, поэтому события не происходили. |
| Автор: transparent 1.7.2011, 13:37 | ||||
Все это я и так делал
Вот и у меня таже проблема... Только вторая форма видна, и мышь на нее нажимается(по крайней мере ее можно смело таскать), а вот события нажатия не происходит И что же ты в итоге сделал? Ты мне это на задачку оставил что ли? Может на нее нужно фокус передать , отя это не пройдет, она может иполучит фокус, да только его все равно мы не увидим Так как же ты это дело исправил? |
| Автор: diadiavova 1.7.2011, 13:52 | ||||
При чем тут видна или нет? И при чем тут можно ее таскать или нет? Я же пояснил, что значит была не видна форма
Если у тебя на форме, например, расположена какая-нибудь панель, то мышкой ты водишь не над формой, а над этой панелью и происходят события панели, а не формы. Чониясна? События формы происходить будут только если видна клиентская часть формы, то есть та, на которой расположены контролы. |
| Автор: transparent 1.7.2011, 16:45 |
| ну и как исправить ситуацию? я не могу понять |
| Автор: diadiavova 1.7.2011, 17:04 |
Вообще-то ситуацию ты как бы и не описал. Для того, чтобы отлавливалось вышеозначенное событие, тебе придется либо очистить форму, либо отлавливать события тех элементов управления, которые на ней расположены. Вообще в винформах такая задача общего решения не имеет. Тут надо смотреть по конкретному случаю. Но общий принцип в том, что отлавливаешь события контролов, расположенных на форме. В впф все проще. |
| Автор: transparent 2.7.2011, 12:59 |
| да что же это такое люди творится то а... Ты можешь кодом помочь? чтобы я понял как можно сделать так:- Вызвал я вторую форму - далее навел на нее мышь, после того как мышь увел - эта (вторая) форма исчезла(клосе, найд, не важно).. |
| Автор: diadiavova 2.7.2011, 13:30 |
Не думаю, что тебе это поможет. Я тебе проблему разжевал уже просто дальше некуда. Могу просто выложить пример, в котором будет простейший код и все будет работать, но готов биться об заклад, что ты тут же нарисуешься и начнешь жаловаться, что мой пример работает, а твой не хочет. Ты не читаешь, что я тебе пишу, а ждешь готовых решений, а когда получаешь их, просто не можешь ими воспользоваться. Я тебе объяснил причину, но что тебе еще надо я понять не могу. Пример тебе выкладываю, поскольку он элементарен, но вообще помогать тебе, честно говоря не хочется: во-первых, ты не понимаешь ответов и еще возмущаешься, что тебе не разжевали; а во-вторых, ты уже изрядно меня утомил. Я вообще думаю, что программирование - это не твое, не стоит тебе этим заниматься. |
| Автор: transparent 2.7.2011, 15:10 | ||
спасибо, посмотрю
больше я тебя не потревожу |
| Автор: diadiavova 2.7.2011, 15:32 |
А ты меня и так не тревожишь. Вопросы задавай, тут и кроме меня есть и другие участники, которые могут ответить. |