На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
! ПРАВИЛА РАЗДЕЛА · FAQ раздела Delphi · Книги по Delphi
Пожалуйста, выделяйте текст программы тегом [сode=pas] ... [/сode]. Для этого используйте кнопку [code=pas] в форме ответа или комбобокс, если нужно вставить код на языке, отличном от Дельфи/Паскаля.
Следующие вопросы задаются очень часто, подробно разобраны в FAQ и, поэтому, будут безжалостно удаляться:
1. Преобразовать переменную типа String в тип PChar (PAnsiChar)
2. Как "свернуть" программу в трей.
3. Как "скрыться" от Ctrl + Alt + Del (заблокировать их и т.п.)
4. Как прочитать список файлов, поддиректорий в директории?
5. Как запустить программу/файл?
... (продолжение следует) ...

Вопросы, подробно описанные во встроенной справочной системе Delphi, не несут полезной тематической нагрузки, поэтому будут удаляться.
Запрещается создавать темы с просьбой выполнить какую-то работу за автора темы. Форум является средством общения и общего поиска решения. Вашу работу за Вас никто выполнять не будет.


Внимание
Попытки открытия обсуждений реализации вредоносного ПО, включая различные интерпретации спам-ботов, наказывается предупреждением на 30 дней.
Повторная попытка - 60 дней. Последующие попытки бан.
Мат в разделе - бан на три месяца...
Модераторы: jack128, D[u]fa, Shaggy, Rouse_
  
> Аналог PageControl по функциональности? Замена многооконности? , Месяц писал прогу в Windows7 с отключ. виз. эффектами, включил блин, PageControl белый то! Посоветуйте аналог плиз
    Добрый день!!!

    Очень нужна Ваша помощь и совет!

    Месяц делал программу в Windows7 с отключенными визуальными эффектами, захотел глаз порадовать и увидеть как же программа будет со вкл. эффектами выглядеть, включил - а табы у PageControl белые! Ну некрасиво вообще никак. Программа состоит из 6 отдельных главных частей, можно по окнам распределить, но не хочу я многооконное приложение, неэффективно. Можно стиль tsFlatButtons применить, но не хочу я такие кнопки :)

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

    Делал как-то такую штуку: PageControl-у стиль tsFlatButtons, кнопки табов скрываем и получаем типа панелей невидимых, можно переключатся между ними. Как бы подходит, но не хотел бы уже такое применять. Может лучше решение есть.

    Вот классно было бы как в Utorrent. Если у кого-то есть (2.2.1), зайдите в настройки>конфигурация, слева ТриВью, щелкая по элементам справа идёт смена панелей - вот что это? Может быть то, что я описывал выше.

    Что посоветуете Уважаемые?

    Попутный вопрос (чтоб этот Windows7 провалился), у меня форма в дизайн-тайме высотой в 600 пикс., а в работе прога где-то 590, что за ерунда? Заголовок что ли сожрал часть высоты?
    Сообщение отредактировано: maxefficiently -
      У торрента treeview + pagecontol скорей всего
      Остальное, включаешь темы в windows 7 и делай прогу свою.
      А вот потом отключай, когда закончишь.
        не хочется использовать pagecontol в режиме tsFlatButtons с отключенными кнопками для табов, так как все визуальные элементы потом сместятся вверх на высоту отключенных кнопок, конечно не самая большая проблема, но неудобно. Но, в принципе, Utorrent сделал то, что мне надо.
        Сообщение отредактировано: maxefficiently -
          Так используй фреймы (TFrame).
          Как пример их использования может подойти демо от все тех же AlphaControls
            Цитата maxefficiently @
            Вот классно было бы как в Utorrent. Если у кого-то есть (2.2.1), зайдите в настройки>конфигурация, слева ТриВью, щелкая по элементам справа идёт смена панелей - вот что это?

            В мюшке все диалоги - ресурсы, изначально "как бы" самостоятельные окна, им уже в рантайме присваивают свойство CHILD_WINDOW (если не ошибаюсь), и они работают как панели (т.е. встраиваются в общее окно настроек). Ну а дальше их просто показывают/скрывают по активации узла дерева.
            В принципе, PageControl без кнопок даст тебе то же самое. Правда, от дебильного белого фона этим не избавишься.
            Остальные решения (панели, фреймы, ...) плохи тем, что чтобы в дизайн-тайме переключаться между ними, нужна куча усилий.

            Добавлено
            Можешь поискать сторонний аналог этого компонента или заюзать альфаскин. Можно сделать ресурсами, если в окне не предполагается нестандартных контролов и не пугает низкоуровневое WinAPI. Можно даже напихать в окно кучу панелей, чтоб лежали на форме рядком, а при запуске проги уже создавать нужную конфигурацию окна
              Цитата Fr0sT @
              Остальные решения (панели, фреймы, ...) плохи тем, что чтобы в дизайн-тайме переключаться между ними, нужна куча усилий

              Есть еще древний TNotebook (в D7 сидит на вкладке Win3.1), если его конечно в последних версиях не "ликвидировали как класс" ;)
              Сообщение отредактировано: leo -
                Думаю, он с темами 7ки явно дружит не лучше Pagecontrol ))))
                  у меня этот "нотебук" глючил с темами в ХР при включенном doublebuffered, че уж про 7ку говорить
                    Значит самое лучшее решение это TFrame.
                    А чтобы переключаться нужно менять свойство Visible.

                    Может кто-то знает какой механизм переключения между фреймами является оптимальным? И ещё вопросик: как располагать контролы на фреймах что бы на форме выглядели ровно, если выравнивание у фрейма alClient. Я смотрю вроде на главной форме можно контролы на фрейме перемещать.
                    Сообщение отредактировано: maxefficiently -
                      Цитата maxefficiently @
                      Может кто-то знает какой механизм переключения между фреймами является оптимальным? И ещё вопросик: как располагать контролы на фреймах что бы на форме выглядели ровно, если выравнивание у фрейма alClient. Я смотрю вроде на главной форме можно контролы на фрейме перемещать.


                      Цитата VahaC @
                      Так используй фреймы (TFrame).
                      Как пример их использования может подойти демо от все тех же AlphaControls
                        Возможно кто-то знает, в Utorrent, меню слева, что это? CategoryPanel\TreeView?

                        Добавлено
                        VahaC, я четно говоря не могу врубиться что там написано, там много лишнего, анимацию вставили и т.п.
                          Я такое делаю на TreeView + PageControl. Самый обычный PageControl с обычными вкладками. Только в FormCreate добавляю:

                          ExpandedWrap disabled
                            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:

                          ExpandedWrap disabled
                            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:

                          ExpandedWrap disabled
                            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 выглядит примерно так:

                          ExpandedWrap disabled
                            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;
                            CodeMonkey, а в чем разница использования PageContol и Frame?
                              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 ставить. Но зато неудобно будет по вкладкам бегать.
                                Цитата CodeMonkey @
                                Но зато неудобно будет по вкладкам бегать.

                                Вполне терпимо. Выбирать нужную вкладку можно в окне Structure. Ведь в Design-time не так часто приходится бегать по вкладкам.
                                  А с Фреймами тяжелее работать? Их тяжелее переключать?
                                    Каждый фрейм это как отдельная форма
                                      VahaC, я понял :) мне интересно что легче использовать и что эффективнее и что более правильнее.

                                      Добавлено
                                      Сейчас конечно намного легче мне использовать PageControl так как вся программа на нем построена :) Но если Фреймы такие классные, то я не поленюсь переделать
                                        Цитата maxefficiently @
                                        что легче использовать

                                        то к чему привык и то с чем есть опыт работы

                                        Цитата maxefficiently @
                                        и что эффективнее и что более правильнее.

                                        а это уже смотря с какой колокольни смотреть
                                          ну если у меня на 1-й вкладке в среднем 10 кнопок, 1-н ЛистВью, ПрогессБар, пару ГроупБоксов, пару ЧекБоксов, Лейблов штук с 6, бывает РичЭдит+Мемо то нормально ПэйджКонтрол использовать?
                                            Да без разницы, по большому счету. Но вот удобное переключение в дизайн-тайм только у табконтрола
                                            Сообщение отредактировано: Fr0sT -
                                              Понял, вопрос по ходу :) В Utorrent-е меню слева (найти содержимое, торренты, рассылки, приложения) - что это за контрол? Переходя по ним идет смена TabSheet или Frame.
                                                CodeMonkey, Вы привели в пример код связывания TreeView + PageControl, а вот это не тоже самое (только короче):
                                                procedure TForm1.TreeView1Change(Sender: TObject; Node: TTreeNode);
                                                begin
                                                PageControl1.ActivePageIndex := Node.Index;
                                                end;
                                                ???
                                                  я у себя всегда делаю вот так

                                                  ExpandedWrap disabled
                                                    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;
                                                    то конечно не я придумал, человек подсказал ТУТ :) Но вроде работет нормально.
                                                      Делать можно по-разному.

                                                      Цитата maxefficiently @
                                                      а вот это не тоже самое (только короче)


                                                      Если узлы в дереве не по порядку, то этот код не подойдёт. А они будут не по порядку, потому что по мере развития и вкладки будут добавляться и узлы в дерево. Вот только узел в середину дерева ты вставить можешь, а вкладка добавляется только в конец. Конечно, можно использовать и этот код, но тогда надо будет вручную править DFM.

                                                      Цитата VahaC @
                                                      я у себя всегда делаю вот так


                                                      У меня примерно так же бывает. До первой вложенной категории.
                                                        Цитата CodeMonkey @
                                                        Вот только узел в середину дерева ты вставить можешь, а вкладка добавляется только в конец. Конечно, можно использовать и этот код, но тогда надо будет вручную править DFM.

                                                        А после добавления установить вкладке нужный PageIndex?
                                                          Цитата CodeMonkey @
                                                          До первой вложенной категории

                                                          Так если на Node.Data посадить соответствующий Page, то можно делать хоть какую вложенность
                                                            Цитата leo @
                                                            А после добавления установить вкладке нужный PageIndex?


                                                            Гы. Не знал :)

                                                            Цитата Fr0sT @
                                                            Так если на Node.Data посадить соответствующий Page, то можно делать хоть какую вложенность


                                                            Я может чего не уловил, но у человека код автоматически создаёт узлы в дереве по вкладкам. По-моему, это означает линейность (одноуровневость) создаваемых узлов. Чтобы были вложенные категории, нужна какая-то древовидная структура, формируемая вручную, которая в этом случае не наблюдается.
                                                              Цитата CodeMonkey @
                                                              Я может чего не уловил, но у человека код автоматически создаёт узлы в дереве по вкладкам

                                                              В данном случае да, но это ведь касается только генерации самого дерева. Если нарастить алгоритм для создания вложенности, то все по-прежнему будет работать как надо
                                                                Да, кстати, есть проблемка использования PageControl-a. Tab-ы-то с границей в 4 пикселя и никак не убрать такое дело, поэтому если делаю выравнивание alClient, то граница в 4 пикселя образовывается. Это очень нехорошо, как убрать?
                                                                1 пользователей читают эту тему (1 гостей и 0 скрытых пользователей)
                                                                0 пользователей:


                                                                Рейтинг@Mail.ru
                                                                [ Script execution time: 0,0847 ]   [ 15 queries used ]   [ Generated: 18.07.25, 01:05 GMT ]