Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Разработка 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
Код

public class MyUserControl:UserControl
{
//здесь код юзерконтрола
}

public class MyTabPage:TabPage
{
    public MyTabPage()
      {
          MyUserControl contetn = new MyUserControl();
          content.Dock = DockStyle.Fill;
          this.Controls.Add(content);
      }
}



Примерно так.

Автор: 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
Это не вложенные классы. А использование контейнеров - нормальная вещь(кстати: сама вкладка - тоже контейнер, и табконтрол - тоже). Если что-то смущает, то есть другой способ. Создаёшь нужный контент в юзверьконтроле, а потом копируешь код, сгенерированный дизайнером и вставляешь куда надо.

Автор: SmartBye 26.2.2009, 22:38
Цитата(diadiavova @  26.2.2009,  20:31 Найти цитируемый пост)
Это не вложенные классы. А использование контейнеров - нормальная вещь(кстати: сама вкладка - тоже контейнер, и табконтрол - тоже).

Смущает то, что в юзер контроле находится таб пейдж, а не наоборот.
Цитата(diadiavova @  26.2.2009,  20:31 Найти цитируемый пост)
Если что-то смущает, то есть другой способ. Создаёшь нужный контент в юзверьконтроле, а потом копируешь код, сгенерированный дизайнером и вставляешь куда надо. 

Ну этот код будет совсем неподдерживаемым =/

Автор: diadiavova 26.2.2009, 22:41
Цитата(SmartBye @  26.2.2009,  22:38 Найти цитируемый пост)
Смущает то, что в юзер контроле находится таб пейдж, а не наоборот.

А почему он у тебя там находится? smile 

Цитата(SmartBye @  26.2.2009,  22:38 Найти цитируемый пост)
Ну этот код будет совсем неподдерживаемым =/ 

А чем он отличается от того, который ты можешь "ручками" написать?

Автор: SmartBye 26.2.2009, 22:47
Цитата(diadiavova @  26.2.2009,  20:41 Найти цитируемый пост)
А почему он у тебя там находится?

Ой... Не туда посмотрел. Показалось, что таб пейдж вложен в юзер контрол =) Потому и понять ничего не мог =) Присмотрелся, вынес таб пейдж в отдельный файл и все понятно стало.


Цитата(diadiavova @  26.2.2009,  20:41 Найти цитируемый пост)
А чем он отличается от того, который ты можешь "ручками" написать?

Ну когда одна кнопочка на форме - это еще куда ни шло, а вот когда там много компонентов, то просто неприятно будет в этом копаться. Потому и встала проблема, что бы все это дело визуально редактировать.

Автор: 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,  21:16 Найти цитируемый пост)
Если ты об эстетической стороне, то ИМХО - дело вкуса. А вот сам процесс я себе слабо представляю. Сдирать шкуру с готовых  программ и запихивать во вкладки... 

Не, не сдирать. Просто в каждой вкладке буду писать заново код, используя исходники программ.

Автор: 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- @  27.2.2009,  08:14 Найти цитируемый пост)
Если я правильно понял, то у тебя есть несколько уже готовых написанных программ, и ты хочешь их объединить?

Ну их всеравно придется переписывать, так как писались они быстро и плохо. Писались из расчета - одна функция, одна программа.
Цитата(SaS1 @  27.2.2009,  16:45 Найти цитируемый пост)
Ещё есть один способ - написать свой небольшой фремворк, который сам кидает в контейнер контролы, выравнивает их по определённым правилам, выставляет шрифты , рамеры ивсё такое...

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

Автор: -Mikle- 28.2.2009, 19:39
Цитата(SmartBye @  28.2.2009,  02:24 Найти цитируемый пост)
Ну их всеравно придется переписывать, так как писались они быстро и плохо

Ну тогда UserControl наследованный от TabPage не плохое решение.


Цитата(Nestap @  27.2.2009,  22:59 Найти цитируемый пост)
а как в МДИ Форму?
я открываю форму в МДИ!(форм2)
как из форм2 открыть новую форму тоже в МДИ?? 


1. создаешь проект
2. у единственной там формы ставишь свойство IsMdiContainer = true
3. у формы, которая должна быть дочерней, ставишь свойство IsMdiChild = true
4. the end!

Вообще, если главная форма приложения имеет установленное свойство IsMdiContainer = тру, то любая форма в твоем приложении, которая имеет IsMdiChild = тру, будет дочерней независимо, откуда она открылась и количество дочерних окон не ограниченно.

Надеюсь вы об этом спрашивали?

Автор: Nestap 28.2.2009, 19:50
-Mikle-

вот у миня фрмСтарт главная : 
из ниё я опен:

Код

            frmIndicatori sd = new frmIndicatori();
            sd.MdiParent = this;
            sd.Show();



и дальше и  frmIndicatori 
как опен другую форму?
тоже чтоб било дочерней фрмСтарт ??

Автор: -Mikle- 28.2.2009, 22:28
я не понимаю, о чем ты спрашиваешь? об этом что-ли?

Код

    Form333 frm = new Form333();
    frm.MdiParent = this.MdiParent; // this в этом контексте будет твоя frmIndicatori
    frm.Show();


Добавлено @ 22:32
Ну или еще так:

Код

frm.MdiParent = Application.OpenForms[0];

Автор: Nestap 28.2.2009, 22:40
-Mikle-

ооо вот ето;

вот какой пустяк.... :-Д

большое спосиба
и извиняюсь за мой руссиан я не из росий и мне немношка труднее ...
 

Автор: -Mikle- 28.2.2009, 23:18
Цитата(Nestap @  1.3.2009,  01:40 Найти цитируемый пост)
ооо вот ето;

вот какой пустяк


Ничего страшного, бывает  smile 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)