2009-06-26 5 views
8

이 질문에 대한 답변을 드릴 수 있을지 모르겠지만 희망합니다. 필자는 Windows에서 C 코드를 작성하기위한 기본 IDE로 사용되는 Delphi 7에서 간단한 텍스트 편집기를 작성했습니다. VM에서 Windows를 실행하고 빛이 필요했습니다. 어쨌든 새 파일을 열거 나 만들 때마다 새 탭을 가져 오는 TpageControl을 사용합니다. 꽤 표준. 이제 Delphi에서 TPageControl은 플랫 속성을 갖지 않습니다.Delphi 7에서 TPageControl을 평평하게 만들기

NO 내가 tsButtons 또는 tsFlatButtons 경계를 설정할 수 없습니다

에 탭 스타일을 설정하는 의미하지 않는다 "없음"으로하고 탭 컨트롤에 텍스트 편집기를 추가 할 때 아주 나쁜 보인다.

TpageControl을 플랫하게 만들 수있는 방법이 있습니까?

편집 : 여기에 평면 지원하는 오픈 소스 PageControl에

내가 무엇을 발견 :

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; 

나는 그것이 작동하지 않습니다 기본 응용 프로그램에서 비슷한 시도 할 때 일입니다. 그것은 심지어 컴파일되지 않습니다.

답변

11

탭을 단추로 그릴 때 테두리 주위에 테두리가 표시되지 않으므로 Style 속성을 tsButtons 또는 tsFlatButtons으로 설정하십시오. (비 VCL 프로그래머의 경우 이것은 탭 컨트롤에 tcs_Buttons 창 스타일을 포함하는 것과 같습니다.)

다른 방법으로는 TNotebook을 사용하는 것입니다. 그것은 페이지를 보유하고 있지만 전혀 그림을 그리지 않습니다. 탭 컨트롤의 높이를 탭 높이와 같게 설정하거나 TTabSet을 사용하여 탭을 직접 제공해야합니다. (TTabSet은 Delphi 2005에서 사용할 수 있으며, Delphi 7에 대해서는 잘 모르겠습니다.)

찾은 코드에 대해서는 컴파일되지 않은 이유를 설명하거나 당신이 그것을 찾았습니다. 왜냐하면 컴파일 에러는 주식이나 커스텀 클래스의 필드 나 속성을 참조하기 때문입니다. 여기에 사용자 정의 컨트롤을 작성하지 않고도 코드에 직접 넣을 수있는 방법이 있습니다. 폼의 OnCreate 이벤트 핸들러에서

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

할당 페이지 컨트롤의 WindowProc 재산에 그 방법 :

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

이 지금을 구현

이처럼 형태에서 두 개의 새로운 선언을 확인 방법 및 처리 :

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_AdjustRectCommCtrl 단위로 선언 된 메시지 식별자입니다. 그 유닛에 메시지가 없다면 직접 선언하십시오. 그것의 가치는 4904입니다.

나는 그것이 국경을 그릴 때 컨트롤을 멈추지 않을 것으로 생각합니다.오히려 포함 된 TTabSheet이 조금 커져서 테두리를 은폐하게 만듭니다.

+1

트릭을 할해야 평면 버튼을 사용합니다. 나는 자주 사용한다. – Hemant

+0

고마워,하지만 내 질문에 내가 tsFlatButtons 싶지 않아 언급했다. – wonderer

+0

그런 다음 평평하지 않은 버튼을 사용하십시오. 요점은 탭이 어떤 종류의 단추 이건 관계없이 페이지 컨트롤이 평평해진다는 점입니다. –

2

항상 상용 솔루션을 사용할 수 있습니다. 탭이있는 평면 TPageControls를 지원하는 Raize components을 강력히 추천합니다. 컴포넌트 세트는 사용하기가 매우 쉽고, 제 시각적으로 어떤 응용 프로그램에 대해서도 더 나은 느낌을 줄 수있는 수많은 시각적 개선을 지원합니다.

screen shot of tTPageControl with flat borders

+0

감사합니다. 하지만 1) 이미 해결책을 찾았습니다. 2) 개인용 프로그램이므로 컴팩 트를 지불 할 필요가 없습니다. – wonderer

1

드롭 TPageControl 개의 탭에 해당하는 글로벌 높이 S, S Tab 같은 탭 중 하나, 및 제 1 하나에 정렬 될 false로 설정하고 flatbuttons Tabvisible 특성 하나. 그런 다음 첫 번째 TPagecontrol에서 탭을 변경하면 두 번째 탭에서도 탭이 변경됩니다.

0

는 델파이 XE8를 사용하고 있는데 다음은 트릭을 할 것 같다

ATabControl.Tabs.Clear; 
ATabControl.Style := TTabStyle.tsFlatButtons; 
ATabControl.Brush.Color := clWhite; 
+0

사람들이 다운 워드를 설명하면 좋을까요? – uberlaufer

+1

질문은 'Delphi XE8'이 아니라 'Delphi 7'에 관한 것이므로 검토하는 동안 downvote를 클릭했습니다. 나는 검토 과정에서 추가 된 투표가 검토 과정을 마친 후 삭제되지 않는다는 것을 알지 못했습니다 (답변 게시 또는 제거). 불행히도 지금은 언ote을 수 없습니다. – agabrys

+2

문제 없습니다. 나는 단지 호기심이 많았고 아마도이 문제에 걸려 넘어지는 사람을 돕는 것이라면이 버전에 분명히 표시되어있는 것처럼 개인적으로 그러한 관련 답변을 장려하는 편이 낫다고 말하고 싶습니다. 그러나 저는 여기에서 새로 왔으며 사이트의 전체 구조와 그것을 다루는 방법에 관한 규칙을 완벽하게 잘 알고 있지 않습니다. 어쨌든 피드백에 감사드립니다! – uberlaufer

관련 문제