Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
Форум программистов > Разработка Windows Forms > TabControl and TabPages |
Автор: SmartBye 26.2.2009, 19:47 |
Делаю программу, в которой решил, что каждая функция программы будет в отдельном табе. Т.е. программа сама по себе - один табконтрол, а функции в отдельных классах-табпейджах, которые я просто при загрузке программы добавляю туда. Хотелось бы узнать, можно ли как-то визуально спроектировать этот таб пейдж? Как будто я работаю с формой. Т.е. передо мной табпейдж, я кидаю в него кнопки, боксы и т.д., расставляю их мышкой и пишу код. Просто не хочется писать всю эту дребедень вручную( Попробовал сделать так: добавил в проект новый компонент, унаследовал его от таб пейджа, кинул на него кнопку для теста. Затем добавил на главной форме этот класс-компонент в таб контрол, но он оказался девственно чист =/ Подскажите, как удобнее это сделать? |
Автор: diadiavova 26.2.2009, 20:03 |
Создай контрол на базе UserControl'а, а на нужный табпэйдж кидай уже его. |
Автор: SmartBye 26.2.2009, 20:24 |
Не очень понял мысль. Мне нужно сделать так, что бы на главной странице был только табконтрол оригинальный и пустой. А в самом проекте были классы-компоненты (или что-то подобное) табпейджей, которые я просто добавлю в главной программе через usercontrol1.tabs.Add(new mytabpage1()); usercontrol1.tabs.Add(new mytabpage2()) и т.д. Это можно реализовать, если просто создать класс, унаследовав его от таб пейджа, но тогда приходится всю гуевскую работу прописывать вручную. |
Автор: diadiavova 26.2.2009, 20:31 |
Если тебе надо работу выполнить в дизайнере, то сделай всё на юзерконтроле? свойству Dock присвой значение Fill, а потом добавь его на табпэйдж(в коде). |
Автор: SmartBye 26.2.2009, 21:21 |
Создал два компонента, один из них наследованный от таб пейджа, другой от юзерконтрола. На юзер контрол накидал кнопочек для теста. Вот только теперь не пойму, как добавить юзер контрол на таб пейдж =/ |
Автор: diadiavova 26.2.2009, 21:29 | ||
Примерно так. |
Автор: SmartBye 26.2.2009, 21:36 |
Написав этот код, любой компонент на юзерконтроле вызывает исключение переполнения стека (+ [System.StackOverflowException] {Невозможно вычислить выражение, поскольку текущий поток находится в состоянии переполнения стека.} System.StackOverflowException), а если не добавлять компонентов на него, то исключение выбрасывает public MyTabPage() =( |
Автор: diadiavova 26.2.2009, 21:38 |
Погоди, сейчас попробую Добавлено через 13 минут и 33 секунды Всё работает. Там в коде я просто букафки местами поменял(опечатка, contetn вместо content), так что если скопипастить, то будет ошибка. |
Автор: SmartBye 26.2.2009, 21:55 |
Ну я, естественно, не копипастил. Просто привел аналогию с твоим кодом. Сейчас попробую описать оба класса в ручную, что бы не добавилось чего лишнего. |
Автор: diadiavova 26.2.2009, 21:57 |
А чо пример не посмотрел? |
Автор: SmartBye 26.2.2009, 22:26 |
Сделал аналогично, как у тебя в примере, вроде получилось. Спасибо. Но как-то оно все накручено больно. Я когда обдумывал все это, думал что должно получиться все более прозрачно. Может это вообще неправильный способ? А есть какой-то более подходящий? Кстати, насколько я знаю, делать вложенные классы не очень хорошо. Как-то можно избавиться от этого? |
Автор: diadiavova 26.2.2009, 22:31 |
Это не вложенные классы. А использование контейнеров - нормальная вещь(кстати: сама вкладка - тоже контейнер, и табконтрол - тоже). Если что-то смущает, то есть другой способ. Создаёшь нужный контент в юзверьконтроле, а потом копируешь код, сгенерированный дизайнером и вставляешь куда надо. |
Автор: diadiavova 26.2.2009, 22:41 | ||
А почему он у тебя там находится? ![]() А чем он отличается от того, который ты можешь "ручками" написать? |
Автор: SmartBye 26.2.2009, 22:47 | ||
Ой... Не туда посмотрел. Показалось, что таб пейдж вложен в юзер контрол =) Потому и понять ничего не мог =) Присмотрелся, вынес таб пейдж в отдельный файл и все понятно стало.
Ну когда одна кнопочка на форме - это еще куда ни шло, а вот когда там много компонентов, то просто неприятно будет в этом копаться. Потому и встала проблема, что бы все это дело визуально редактировать. |
Автор: diadiavova 26.2.2009, 22:54 |
А чо в них копаться...скопипастил и всё. Может только контейнер убрать(он для дизайнера нужен). Но вообще: первый вариант - более прямой. |
Автор: SmartBye 26.2.2009, 23:01 |
А как насчет самой идеи этого способа? Есть у меня несколько разных по функционалу программ, написанных для одного проекта. Накопилось их уже довольно много, поэтому решил их объединить в одну под общим интерфейсом. По одной функциональной программе в таб. До того, как начал разбираться со способом реализации, в голове виделось идеальным способом с точки зрения ооп. |
Автор: diadiavova 26.2.2009, 23:04 |
Ну тут далеко за примерами ходить не надо - Visual Studio. |
Автор: SmartBye 26.2.2009, 23:11 |
Я имею ввиду с точки зрения внутреннего дизайна. |
Автор: diadiavova 26.2.2009, 23:16 |
Если ты об эстетической стороне, то ИМХО - дело вкуса. А вот сам процесс я себе слабо представляю. Сдирать шкуру с готовых программ и запихивать во вкладки... |
Автор: SmartBye 26.2.2009, 23:23 | ||
Не, не сдирать. Просто в каждой вкладке буду писать заново код, используя исходники программ. |
Автор: diadiavova 26.2.2009, 23:28 |
Я не теоретик программирования, поэтому отношусь к этому вопросу просто: нужна тебе такая программа - пиши, нет - не пиши. |
Автор: SmartBye 26.2.2009, 23:38 |
В общем, тема для меня уже кажется исчерпана. Вопросов пока нету. Спасибо, большое, за помощь =) |
Автор: -Mikle- 27.2.2009, 10:14 |
Если я правильно понял, то у тебя есть несколько уже готовых написанных программ, и ты хочешь их объединить? Если так, то MDI тебе в помощь. С ним проще некуда. 1. создаешь новый проект 2. делаешь MDI форму 3. все готовые проекты добавляешь в солюшн нового проекта 4. и вызываешь просто формы из твоих проектов Ничего не придется переписывать, и, по моему, ничем не хуже идеи с табами, а для реализации проще и нагляднее. |
Автор: SaS1 27.2.2009, 18:45 |
SmartBye, Ещё есть один способ - написать свой небольшой фремворк, который сам кидает в контейнер контролы, выравнивает их по определённым правилам, выставляет шрифты , рамеры ивсё такое... Это конечно не совсем уж легко, но зато потом можно юзать его везде в своих прилагах. Это самый правильный подход тк. писать код руками для нескольких сотен контролов не станешь, но и выравнивать их мышькой тоже не сильно приятное занятие... |
Автор: Nestap 27.2.2009, 19:59 |
-Mikle-, а как в МДИ Форму? я открываю форму в МДИ!(форм2) как из форм2 открыть новую форму тоже в МДИ?? |
Автор: SmartBye 27.2.2009, 23:24 | ||||
Ну их всеравно придется переписывать, так как писались они быстро и плохо. Писались из расчета - одна функция, одна программа.
Вот это было бы шикарно. Сейчас всеравно пока только учусь. Неплохо было бы поухищряться. Вот только слабо себе все это представляю. Можно ли где-то примеры посмотреть, о чем Вы говорите? |
Автор: -Mikle- 28.2.2009, 19:39 | ||||
Ну тогда UserControl наследованный от TabPage не плохое решение.
1. создаешь проект 2. у единственной там формы ставишь свойство IsMdiContainer = true 3. у формы, которая должна быть дочерней, ставишь свойство IsMdiChild = true 4. the end! Вообще, если главная форма приложения имеет установленное свойство IsMdiContainer = тру, то любая форма в твоем приложении, которая имеет IsMdiChild = тру, будет дочерней независимо, откуда она открылась и количество дочерних окон не ограниченно. Надеюсь вы об этом спрашивали? |
Автор: Nestap 28.2.2009, 19:50 | ||
-Mikle-, вот у миня фрмСтарт главная : из ниё я опен:
и дальше и frmIndicatori как опен другую форму? тоже чтоб било дочерней фрмСтарт ?? |
Автор: -Mikle- 28.2.2009, 22:28 | ||||
я не понимаю, о чем ты спрашиваешь? об этом что-ли?
Добавлено @ 22:32 Ну или еще так:
|
Автор: Nestap 28.2.2009, 22:40 |
-Mikle-, ооо вот ето; вот какой пустяк.... :-Д большое спосиба и извиняюсь за мой руссиан я не из росий и мне немношка труднее ... |
Автор: -Mikle- 28.2.2009, 23:18 |
Ничего страшного, бывает ![]() |