
![]() |
Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
|
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[216.73.216.207] |
![]() |
|
![]() |
|
|
Добрый день!!!
Очень нужна Ваша помощь и совет! Месяц делал программу в Windows7 с отключенными визуальными эффектами, захотел глаз порадовать и увидеть как же программа будет со вкл. эффектами выглядеть, включил - а табы у PageControl белые! Ну некрасиво вообще никак. Программа состоит из 6 отдельных главных частей, можно по окнам распределить, но не хочу я многооконное приложение, неэффективно. Можно стиль tsFlatButtons применить, но не хочу я такие кнопки ![]() Можно не обязательно что-то как PageControl, можно принципиально другой визуальный элемент, главное аналог "многосторонности" сделать. Не хотелось бы конечно использовать сторонние компоненты, но, как пример, в AlphaControls есть штука типа сменяющихся панелей. Делал как-то такую штуку: PageControl-у стиль tsFlatButtons, кнопки табов скрываем и получаем типа панелей невидимых, можно переключатся между ними. Как бы подходит, но не хотел бы уже такое применять. Может лучше решение есть. Вот классно было бы как в Utorrent. Если у кого-то есть (2.2.1), зайдите в настройки>конфигурация, слева ТриВью, щелкая по элементам справа идёт смена панелей - вот что это? Может быть то, что я описывал выше. Что посоветуете Уважаемые? Попутный вопрос (чтоб этот Windows7 провалился), у меня форма в дизайн-тайме высотой в 600 пикс., а в работе прога где-то 590, что за ерунда? Заголовок что ли сожрал часть высоты? |
Сообщ.
#2
,
|
|
|
У торрента treeview + pagecontol скорей всего
Остальное, включаешь темы в windows 7 и делай прогу свою. А вот потом отключай, когда закончишь. |
Сообщ.
#3
,
|
|
|
не хочется использовать pagecontol в режиме tsFlatButtons с отключенными кнопками для табов, так как все визуальные элементы потом сместятся вверх на высоту отключенных кнопок, конечно не самая большая проблема, но неудобно. Но, в принципе, Utorrent сделал то, что мне надо.
|
Сообщ.
#4
,
|
|
|
Так используй фреймы (TFrame).
Как пример их использования может подойти демо от все тех же AlphaControls |
Сообщ.
#5
,
|
|
|
Цитата maxefficiently @ Вот классно было бы как в Utorrent. Если у кого-то есть (2.2.1), зайдите в настройки>конфигурация, слева ТриВью, щелкая по элементам справа идёт смена панелей - вот что это? В мюшке все диалоги - ресурсы, изначально "как бы" самостоятельные окна, им уже в рантайме присваивают свойство CHILD_WINDOW (если не ошибаюсь), и они работают как панели (т.е. встраиваются в общее окно настроек). Ну а дальше их просто показывают/скрывают по активации узла дерева. В принципе, PageControl без кнопок даст тебе то же самое. Правда, от дебильного белого фона этим не избавишься. Остальные решения (панели, фреймы, ...) плохи тем, что чтобы в дизайн-тайме переключаться между ними, нужна куча усилий. Добавлено Можешь поискать сторонний аналог этого компонента или заюзать альфаскин. Можно сделать ресурсами, если в окне не предполагается нестандартных контролов и не пугает низкоуровневое WinAPI. Можно даже напихать в окно кучу панелей, чтоб лежали на форме рядком, а при запуске проги уже создавать нужную конфигурацию окна |
Сообщ.
#6
,
|
|
|
Цитата Fr0sT @ Остальные решения (панели, фреймы, ...) плохи тем, что чтобы в дизайн-тайме переключаться между ними, нужна куча усилий Есть еще древний TNotebook (в D7 сидит на вкладке Win3.1), если его конечно в последних версиях не "ликвидировали как класс" ![]() |
Сообщ.
#7
,
|
|
|
Думаю, он с темами 7ки явно дружит не лучше Pagecontrol ))))
|
Сообщ.
#8
,
|
|
|
у меня этот "нотебук" глючил с темами в ХР при включенном doublebuffered, че уж про 7ку говорить
|
![]() |
|
|
Значит самое лучшее решение это TFrame.
А чтобы переключаться нужно менять свойство Visible. Может кто-то знает какой механизм переключения между фреймами является оптимальным? И ещё вопросик: как располагать контролы на фреймах что бы на форме выглядели ровно, если выравнивание у фрейма alClient. Я смотрю вроде на главной форме можно контролы на фрейме перемещать. |
Сообщ.
#10
,
|
|
|
Цитата maxefficiently @ Может кто-то знает какой механизм переключения между фреймами является оптимальным? И ещё вопросик: как располагать контролы на фреймах что бы на форме выглядели ровно, если выравнивание у фрейма alClient. Я смотрю вроде на главной форме можно контролы на фрейме перемещать. Цитата VahaC @ Так используй фреймы (TFrame). Как пример их использования может подойти демо от все тех же AlphaControls |
Сообщ.
#11
,
|
|
|
Возможно кто-то знает, в Utorrent, меню слева, что это? CategoryPanel\TreeView?
Добавлено VahaC, я четно говоря не могу врубиться что там написано, там много лишнего, анимацию вставили и т.п. |
Сообщ.
#12
,
|
|
|
Я такое делаю на TreeView + PageControl. Самый обычный PageControl с обычными вкладками. Только в FormCreate добавляю:
![]() ![]() for I := 0 to PageControl1.PageCount - 1 do PageControl1.Pages[I].TabVisible := False; Вот и всё. Вот тебе и Notebook в Win32. А TreeView я заполняю элементами, им устанавливаю ImageIndex <> 0 (в Design-time). А Tab-ы у меня имеют Tag <> 0. Ну и в OnChange для TreeView: ![]() ![]() procedure TForm1.TreeView1Change(Sender: TObject; Node: TTreeNode); var B: Boolean; begin // Не помню, вызываются ли они сами, или надо руками вызывать. Пусть будет руками: B := True; if Assigned(PageControl1.OnChanging) then PageControl1.OnChanging(PageControl1, B); if B then begin SetActivePage(TreeView1.Selected); if Assigned(PageControl1.OnChange) then PageControl1.OnChange(PageControl1); end; end; Где SetActivePage: ![]() ![]() procedure TForm1.SetActivePage(const ASelected: TTreeNode); begin if TreeView1.Selected <> ASelected then begin ASelected.Expand(True); ASelected.MakeVisible; TreeView1.OnChange := nil; try TreeView1.Selected := ASelected; finally TreeView1.OnChange := OptionsMenuChange; end; end; if (ASelected = nil) or (ASelected.Data = nil) then PageControl.ActivePage := TabDummy // TabDummy - это полностью пустая Tab на PageControl else PageControl.ActivePage := TTabSheet(ASelected.Data); end; Т.е. вкладки выбираются/переключаются автоматически - по совпадению Tag и его замены в TreeView (ImageIndex). Ну и FormCreate выглядит примерно так: ![]() ![]() procedure TForm1.FormCreate(Sender: TObject); procedure SetupPageControls; procedure AssignTab(const ATabSheet: TTabSheet;); var X: Integer; begin for X := 0 to TreeView1.Items.Count - 1 do // ImageIndex is a replacement for the Tag property if TreeView1.Items[X].ImageIndex = ATabSheet.Tag then TreeView1.Items[X].Data := Pointer(ATabSheet); end; procedure HideTabSheets; var I: Integer; begin for I := 0 to PageControl1.PageCount - 1 do PageControl1.Pages[I].TabVisible := False; end; begin for I := 0 to PageControl1.PageCount - 1 do AssignTab(PageControl1.Pages[X]); HideTabSheets; end; begin SetupPageControls; end; |
Сообщ.
#13
,
|
|
|
CodeMonkey, а в чем разница использования PageContol и Frame?
|
Сообщ.
#14
,
|
|
|
PageControl - всё в одном окне. Frame - много окон (по окну на вкладку).
Наверное, второе будет удобнее для тьмы настроек, но мне обычно удобнее первое - всё в одном окне, нормальные вкладки, удобно переключать. Может быть это потому, что с TFrame мало работал. Но был наслышан о проблемах с ним в некоторых версиях Delphi. Цитата Fr0sT @ Правда, от дебильного белого фона этим не избавишься. tsFlatButtons Добавлено Не увидел: Цитата maxefficiently @ не хочется использовать pagecontol в режиме tsFlatButtons с отключенными кнопками для табов, так как все визуальные элементы потом сместятся вверх на высоту отключенных кнопок, конечно не самая большая проблема, но неудобно. Ну ты в Design-time работай с tpBottom + tsTabs, а d Run-time переключай в tpTop + tsFlatButtons. Конечно, и на этот вариант можно ругнуться: мол, в run-time область будет больше, чем deisgn-time. Да, верно, но за это мы получаем удобство переключения вкладок. Если же всё равно не нравится - TabVisible можно отключать прямо в Design-time. Тогда и области будут совпадать полностью и стиль можно сразу в tsButtons ставить. Но зато неудобно будет по вкладкам бегать. |
Сообщ.
#15
,
|
|
|
Цитата CodeMonkey @ Но зато неудобно будет по вкладкам бегать. Вполне терпимо. Выбирать нужную вкладку можно в окне Structure. Ведь в Design-time не так часто приходится бегать по вкладкам. |
Сообщ.
#16
,
|
|
|
А с Фреймами тяжелее работать? Их тяжелее переключать?
|
Сообщ.
#17
,
|
|
|
Каждый фрейм это как отдельная форма
|
Сообщ.
#18
,
|
|
|
VahaC, я понял
![]() Добавлено Сейчас конечно намного легче мне использовать PageControl так как вся программа на нем построена ![]() |
Сообщ.
#19
,
|
|
|
Цитата maxefficiently @ что легче использовать то к чему привык и то с чем есть опыт работы Цитата maxefficiently @ и что эффективнее и что более правильнее. а это уже смотря с какой колокольни смотреть |
Сообщ.
#20
,
|
|
|
ну если у меня на 1-й вкладке в среднем 10 кнопок, 1-н ЛистВью, ПрогессБар, пару ГроупБоксов, пару ЧекБоксов, Лейблов штук с 6, бывает РичЭдит+Мемо то нормально ПэйджКонтрол использовать?
|
Сообщ.
#21
,
|
|
|
Да без разницы, по большому счету. Но вот удобное переключение в дизайн-тайм только у табконтрола
|
Сообщ.
#22
,
|
|
|
Понял, вопрос по ходу
![]() |
Сообщ.
#23
,
|
|
|
CodeMonkey, Вы привели в пример код связывания TreeView + PageControl, а вот это не тоже самое (только короче):
procedure TForm1.TreeView1Change(Sender: TObject; Node: TTreeNode); begin PageControl1.ActivePageIndex := Node.Index; end; ??? |
Сообщ.
#24
,
|
|
|
я у себя всегда делаю вот так
![]() ![]() procedure TForm1.FormCreate(Sender: TObject); var i : Integer; Node : TTreenode; begin TreeView1.HideSelection:=false; PageControl1.ActivePageIndex := TabSheet1.PageIndex; for i := 0 to PageControl1.PageCount - 1 do begin Node := TreeView1.Items.Add(nil, PageControl1.Pages[i].Caption); Node.Data := PageControl1.Pages[i]; //ассоциируем узел с страницей Node.ImageIndex := PageControl1.Pages[i].ImageIndex; Node.SelectedIndex := Node.ImageIndex; PageControl1.Pages[i].Tag := Integer(Node); // ассоциируем страницу с узлом end; end; procedure TForm1.PageControl1Change(Sender: TObject); begin TreeView1.Selected := TTreeNode(Pointer(PageControl1.ActivePage.tag));// Доступ к ассоциированному узлу через страницу end; procedure TForm1.TreeView1Change(Sender: TObject; Node: TTreeNode); begin PageControl1.ActivePage := TTabSheet(Node.data);// Доступ к ассоциированной странице через узел end; |
Сообщ.
#26
,
|
|
|
Делать можно по-разному.
Цитата maxefficiently @ а вот это не тоже самое (только короче) Если узлы в дереве не по порядку, то этот код не подойдёт. А они будут не по порядку, потому что по мере развития и вкладки будут добавляться и узлы в дерево. Вот только узел в середину дерева ты вставить можешь, а вкладка добавляется только в конец. Конечно, можно использовать и этот код, но тогда надо будет вручную править DFM. Цитата VahaC @ я у себя всегда делаю вот так У меня примерно так же бывает. До первой вложенной категории. |
Сообщ.
#27
,
|
|
|
Цитата CodeMonkey @ Вот только узел в середину дерева ты вставить можешь, а вкладка добавляется только в конец. Конечно, можно использовать и этот код, но тогда надо будет вручную править DFM. А после добавления установить вкладке нужный PageIndex? |
Сообщ.
#28
,
|
|
|
Цитата CodeMonkey @ До первой вложенной категории Так если на Node.Data посадить соответствующий Page, то можно делать хоть какую вложенность |
Сообщ.
#29
,
|
|
|
Цитата leo @ А после добавления установить вкладке нужный PageIndex? Гы. Не знал ![]() Цитата Fr0sT @ Так если на Node.Data посадить соответствующий Page, то можно делать хоть какую вложенность Я может чего не уловил, но у человека код автоматически создаёт узлы в дереве по вкладкам. По-моему, это означает линейность (одноуровневость) создаваемых узлов. Чтобы были вложенные категории, нужна какая-то древовидная структура, формируемая вручную, которая в этом случае не наблюдается. |
Сообщ.
#30
,
|
|
|
Цитата CodeMonkey @ Я может чего не уловил, но у человека код автоматически создаёт узлы в дереве по вкладкам В данном случае да, но это ведь касается только генерации самого дерева. Если нарастить алгоритм для создания вложенности, то все по-прежнему будет работать как надо |
Сообщ.
#31
,
|
|
|
Да, кстати, есть проблемка использования PageControl-a. Tab-ы-то с границей в 4 пикселя и никак не убрать такое дело, поэтому если делаю выравнивание alClient, то граница в 4 пикселя образовывается. Это очень нехорошо, как убрать?
|