Как вы справляетесь с несколькими TPanel во время разработки? - PullRequest
6 голосов
/ 27 апреля 2011

У меня есть несколько TPanel на моей основной форме, которые я показываю / скрываю в зависимости от опций, которые выбирает пользователь.Проблема в том, что во время разработки мне приходится постоянно перемещать их, чтобы редактировать.Есть ли более простой / лучший способ, чтобы другие справились с этой ситуацией?

Ответы [ 7 ]

10 голосов
/ 27 апреля 2011

Если одновременно видна только одна панель, то вы можете использовать TPageControl для упорядочивания вещей. Вы можете щелкнуть вкладки, чтобы выбрать, с кем работать во время разработки, а затем скрыть вкладки во время выполнения или скрыть вкладки все время и выбирать страницы, задав свойство ActivePage .

4 голосов
/ 27 апреля 2011

Используйте Структурную панель , чтобы найти нужную, а затем перенесите ее на передний план.

Структурная панель http://edn.embarcadero.com/article/images/33289/8.png

(Но неследуйте приведенному выше примеру Embarcadero, дайте своим элементам управления значимые имена, чтобы их было легче отличить друг от друга.)

3 голосов
/ 28 апреля 2011

Предупреждение, которое я обнаружил при выполнении Panel1.Visible: = false во время выполнения, состоит в том, что он портится с макетом.
Решение, которое я нашел, заключается в следующем:

//Design time
//-----------
Panel1.BevelOuter:= bvNone; //Make the panel look flat.

//Run time when hiding the panel
//------------------------------
procedure HidePanel(APanel: TPanel);
var
  H,W: integer;
begin
  case APanel.Align of 
    alTop, alBottom: begin
      APanel.Tag:= Max(APanel.Tag, APanel.Height);
      APanel.Height:= 1;
    end; {alTop, alBottom:}
    alLeft, alRight: begin
      APanel.Tag:= Max(APanel.Tag, APanel.Width);
      Panel1.Width:= 1;
    end; {alLeft, alRight:}
    alNone: begin
      H:= Max(APanel.Tag and $FFFF, APanel.Height);
      W:= Max((APanel.Tag shl 16) and $FFFF0000, APanel.Width shl 16);
      APanel.Tag:= (H or W);
      APanel.Height:= 1;
      APanel.Width:= 1;
    end; {alNone} 
    //alClient: do nothing
  end;
end;

//Run time when restoring the panel
//---------------------------------
procedure UnhidePanel(APanel: TPanel);
var
  H,W: integer;
begin
  case APanel.Align of 
    alTop, alBottom: begin
      APanel.Height:= APanel.Tag;  
      APanel.Tag:= 0;
    end; {alTop, alBottom:}
    alLeft, alRight: begin
      APanel.Width:= APanel.Tag;
      APanel.Tag:= 0;
    end; {alLeft, alRight:}
    alNone: begin
      H:= APanel.Tag and $FFFF;
      W:= APanel.Tag shr 16;
      APanel.Height:= H;
      APanel.Width:= W;
      APanel.Tag:= 0;
    end; {alNone}
    //alClient: do nothing
  end; {case}
end;

Простое скрытие панелей может испортить тщательное выравнивание, которое вы создали в Designtime
(особенно при использовании сплиттеров) .
Этот код предотвращает это.
Это действительно работает тольковизуально, когда на панели не установлены скосы и цвет панели соответствует цвету элемента управления, над которым он находится.

3 голосов
/ 27 апреля 2011

Если панели расположены друг над другом, вы можете изменить их порядок, щелкнув правой кнопкой мыши одну из них и выбрав Control->Bring to Front или Control->Send to Back в контекстном меню.

2 голосов
/ 27 апреля 2011

Я выбираю рамку или панель, используя «Инспектор объектов», затем в главном меню нажимаю «Правка» -> «Вывести на передний план»

(аналогично открытию вида структуры)

1 голос
/ 27 апреля 2011

Для этой цели гораздо проще использовать кадры.Я обычно создаю их во время выполнения и добавляю их в форму по мере необходимости.Это также делает код намного более читабельным, поскольку вы можете использовать одни и те же имена компонентов (например, ed_Name или l_Welcome) в разных кадрах, не сталкиваясь с именами, вместо того, чтобы иметь ed_NameForPanel1, ed_NameForPanel3 и т. Д.

1 голос
/ 27 апреля 2011

Я также использовал TPageControl, и я держал вкладки видимыми во время разработки.Это дало мне удобство разработки (нажав на вкладки, которые я хочу).Затем во время выполнения я скрываю вкладки страниц и переключаю активные страницы в элементе управления страницы, используя код, как способ переключения видимой панели.Однако это привело к появлению ужасно огромных и сложных форм, что, в свою очередь, стало причиной многих проблем.

В вашем случае я бы посоветовал вам рассмотреть рефакторинг каждой панели в ее собственную форму или фрейм.Я предпочел бы использовать формы, а не фреймы, и причины этого хорошо известны и хорошо документированы в мире Delphi.

В моих наиболее хорошо структурированных приложениях каждая "панель" (реализующая с использованием TFormхотя не TFrame) разделен на разные блоки, и это решает как ваши проблемы управления во время разработки, так и приводит к более хорошо структурированному общему решению.

Хотя я думаю, что Панель структуры (кто-то еще указалout) очень помогает вам, когда вы хотите работать с формами, которые настолько сложны, что обычные визуальные инструменты дизайнера становятся все труднее использовать, также стоит подумать о том, чтобы разбить вашу форму, когда вы достигнете этой точки«убывающей отдачи» от использования конструктора форм, что превращается в одну супер-супер-сложную форму.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...