Изготовление квартиры TPageControl в Дельфи 7 - PullRequest
8 голосов
/ 26 июня 2009

Я не знаю, можно ли здесь ответить на этот вопрос, но я надеюсь, что так и будет. Я написал простой текстовый редактор в Delphi 7, который служит моей основной IDE для написания кода на C под Windows. Я запускаю Windows на виртуальной машине, и мне нужно что-то легкое. В любом случае он использует TpageControl, который получает новую вкладку каждый раз, когда вы открываете или создаете новый файл. Довольно стандартный. Теперь TPageControl под Delphi не имеет плоского свойства.

НЕТ, я не имею в виду установку стиля вкладки на tsButtons или tsFlatButtons

границы не могут быть установлены на «none», и это выглядит довольно плохо, когда вы добавляете текстовый редактор в элемент управления tab.

Есть ли способ сделать TpageControl плоским?

EDIT

На PageControl с открытым исходным кодом, который поддерживает flat, вот что я нашел:

procedure TCustomTabExtControl.WndProc(var Message: TMessage);
begin
  if(Message.Msg=TCM_ADJUSTRECT) and (FFlat) then
   begin
    Inherited WndProc(Message);
    Case TAbPosition of
    tpTop : begin
    PRect(Message.LParam)^.Left:=0;
    PRect(Message.LParam)^.Right:=ClientWidth;
    PRect(Message.LParam)^.Top:=PRect(Message.LParam)^.Top-4;
    PRect(Message.LParam)^.Bottom:=ClientHeight;
  end;
    tpLeft : begin
    PRect(Message.LParam)^.Top:=0;
    PRect(Message.LParam)^.Right:=ClientWidth;
    PRect(Message.LParam)^.Left:=PRect(Message.LParam)^.Left-4;
    PRect(Message.LParam)^.Bottom:=ClientHeight;
  end;
    tpBottom : begin
    PRect(Message.LParam)^.Left:=0;
    PRect(Message.LParam)^.Right:=ClientWidth;
    PRect(Message.LParam)^.Bottom:=PRect(Message.LParam)^.Bottom-4;
    PRect(Message.LParam)^.Top:=0;
  end;
    tpRight : begin
    PRect(Message.LParam)^.Top:=0;
    PRect(Message.LParam)^.Left:=0;
    PRect(Message.LParam)^.Right:=PRect(Message.LParam)^.Right-4;
    PRect(Message.LParam)^.Bottom:=ClientHeight;
    end;
  end;
 end else Inherited WndProc(Message);

end;

Дело в том, что когда я пробовал что-то похожее в основном приложении, это не сработало. Это даже не скомпилируется.

Ответы [ 4 ]

12 голосов
/ 26 июня 2009

Когда вкладки отображаются в виде кнопок, вокруг области отображения не отображается граница, поэтому установите для свойства Style значение tsButtons или tsFlatButtons. (Для программистов, не являющихся VCL, это эквивалентно включению стиля окна tcs_Buttons в элемент управления с вкладками.)

Альтернативой является использование TNotebook. Он держит страницы, но не рисует вообще. Вы должны предоставить вкладки самостоятельно, например, установив высоту элемента управления вкладками равной высоте вкладок, или используя TTabSet. (TTabSet доступен в Delphi 2005; я не уверен насчет Delphi 7.)

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

Сделайте две новые декларации в вашей форме следующим образом:

FOldTabProc: TWndMethod;
procedure TabWndProc(var Msg: TMessage);

В обработчике события OnCreate формы назначьте этот метод свойству WindowProc элемента управления страницы:

FOldTabProc := PageControl1.WindowProc;
PageControl1.WindowProc := TabWndProc;

Теперь реализуйте этот метод и обработайте сообщение tcm_AdjustRect:

procedure TForm1.TabWndProc(var Msg: TMessage);
begin
  FOldTabProc(Msg);
  if Msg.Msg = tcm_AdjustRect then begin
    case PageControl1.TabPosition of
      tpTop: begin
        PRect(Msg.LParam)^.Left := 0;
        PRect(Msg.LParam)^.Right := PageControl1.ClientWidth;
        Dec(PRect(Msg.LParam)^.Top, 4);
        PRect(Msg.LParam)^.Bottom := PageControl1.ClientHeight;
      end;
    end;
  end;
end;

Вы можете заполнить остальные три случая, если они вам нужны. Tcm_AdjustRect - это идентификатор сообщения, объявленный в модуле CommCtrl . Если у вас нет этого сообщения в этом блоке, объявите его сами; его значение составляет 4904.

Я подозреваю, что это не мешает элементу управления рисовать свои границы. Скорее, это заставляет содержащийся TTabSheet становиться немного больше и покрывать границы.

2 голосов
/ 26 июня 2009

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

screen shot of tTPageControl with flat borders
(источник: raize.com )

1 голос
/ 09 мая 2013

Отбросьте два TPageControl с, один с вкладками как Tab с, с глобальной высотой, равной вкладкам, и один с плоскими кнопками и Tabvisible свойствами, установленными в значение false, которое будет выровнено под первым. Затем убедитесь, что смена вкладок на первом TPagecontrol заставляет вкладки меняться и на втором.

0 голосов
/ 14 октября 2015

Я использую Delphi XE8, и, кажется, следующее помогает:

ATabControl.Tabs.Clear;
ATabControl.Style := TTabStyle.tsFlatButtons;
ATabControl.Brush.Color := clWhite;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...