2009-06-26 27 views
8

Tôi không biết liệu câu hỏi này có thể được trả lời ở đây hay không, nhưng tôi hy vọng điều đó sẽ xảy ra. Tôi đã viết một trình soạn thảo văn bản đơn giản trong Delphi 7 phục vụ như IDE chính của tôi để viết mã C trong Windows. Tôi chạy Windows trong máy ảo và tôi cần thứ gì đó nhẹ. Trong mọi trường hợp, nó sử dụng một TpageControl nhận được một tab mới bất cứ khi nào bạn mở hoặc tạo một tập tin mới. Khá chuẩn. Bây giờ, TPageControl dưới Delphi không có tài sản bằng phẳng.Làm cho một căn hộ TPageControl ở Delphi 7

NO Tôi không có ý thiết lập các phong cách tab để tsButtons hoặc tsFlatButtons

biên giới không thể được thiết lập để "none" và có vẻ khá xấu khi bạn thêm một trình soạn thảo văn bản vào sự kiểm soát tab.

Có cách nào để tạo căn hộ TpageControl không?

EDIT:

Trên một PageControl mã nguồn mở hỗ trợ bằng ở đây là những gì tôi tìm thấy:

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; 

Vấn đề là khi tôi đã cố gắng một cái gì đó tương tự về việc áp dụng chính nó sẽ không hoạt động. Nó thậm chí sẽ không biên dịch.

Trả lời

11

Khi các tab được vẽ dưới dạng các nút, không có đường viền được vẽ xung quanh khu vực hiển thị, do đó, hãy đặt thuộc tính Style thành tsButtons hoặc tsFlatButtons. (Đối với các lập trình viên không phải VCL, điều này tương đương với việc bao gồm kiểu cửa sổ tcs_Buttons trên điều khiển tab.)

Cách khác là sử dụng TNotebook. Nó giữ các trang, nhưng nó không làm bất kỳ bức tranh nào cả. Bạn sẽ phải tự cung cấp các tab, chẳng hạn như bằng cách đặt chiều cao của điều khiển tab bằng với chiều cao của các tab hoặc bằng cách sử dụng TTabSet. (TTabSet có sẵn tại Delphi 2005; Tôi không chắc về Delphi 7.)

Về mã bạn tìm thấy, sẽ hữu ích nếu bạn chỉ ra lý do tại sao nó không biên dịch, hoặc nếu bạn cung cấp liên kết đến bạn tìm thấy nó, vì tôi cho rằng lỗi biên dịch là vì nó đề cập đến các trường hoặc thuộc tính của lớp tùy chỉnh chứ không phải là lớp chứng khoán. Đây là những gì bạn có thể thử để đặt nó trong mã của riêng bạn, mà không cần phải viết một điều khiển tùy chỉnh.

Làm cho hai tờ khai mới trong dạng của bạn như thế này:

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

Trong xử lý sự kiện của hình thức OnCreate, chuyển nhượng mà phương pháp để sở hữu WindowProc sự kiểm soát của trang:

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

Bây giờ thực hiện điều đó phương pháp và xử lý các messsage 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; 

Bạn có thể điền vào ba trường hợp khác nếu cần. Tcm_AdjustRect là số nhận dạng tin nhắn được khai báo trong đơn vị CommCtrl. Nếu bạn không có thông điệp đó trong đơn vị đó, hãy tự khai báo; giá trị của nó là 4904.

Tôi nghi ngờ điều này không ngăn điều khiển vẽ đường viền của nó.Thay vào đó, nó gây ra các TTabSheet chứa để phát triển lớn hơn một chút và che phủ biên giới.

+1

sử dụng các nút phẳng nên làm các trick. Tôi thường xuyên sử dụng nó. – Hemant

+0

Cảm ơn, nhưng như tôi đã đề cập trên câu hỏi của tôi, tôi không muốn tsFlatButtons. – wonderer

+0

Sau đó sử dụng các nút không phẳng. Vấn đề là kiểm soát trang đi bằng phẳng khi các tab là các nút, bất kể loại nút nào. –

2

Bạn luôn có thể sử dụng giải pháp thương mại. Tôi rất muốn giới thiệu Raize components, hỗ trợ TPageControls phẳng với các tab. Bộ thành phần rất dễ làm việc và hỗ trợ nhiều cải tiến hình ảnh theo ý kiến ​​của tôi, mang lại cảm giác tốt hơn cho bất kỳ ứng dụng nào.

screen shot of tTPageControl with flat borders

+0

Cảm ơn. Nhưng 1) Tôi đã tìm thấy một giải pháp và 2) vì đây là một chương trình cá nhân tôi không thấy cần phải trả tiền cho một compoment – wonderer

1

Thả hai TPageControl s, một với các tab như Tab s, với chiều cao toàn cầu bằng các tab, và một với flatbuttons và Tabvisible thuộc tính thiết lập là false, mà sẽ được sắp xếp dưới cái đầu tiên. Sau đó, hãy chắc chắn rằng sự thay đổi tab trên TPagecontrol đầu tiên làm cho các tab cũng thay đổi trong tab thứ hai.

0

Tôi đang sử dụng Delphi XE8 và sau đây dường như làm các trick:

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

Sẽ được tốt đẹp nếu mọi người giải thích downvotes của họ. – uberlaufer

+1

Tôi bấm downvote trong quá trình xem xét, bởi vì câu hỏi là về 'Delphi 7' không phải 'Delphi XE8'. Tôi không biết, các phiếu bầu được thêm vào trong quá trình đánh giá, sẽ không bị xóa sau khi quá trình đánh giá kết thúc (câu trả lời được xuất bản hoặc bị xóa). Rất tiếc, tôi không thể hủy đăng ký ngay bây giờ. – agabrys

+2

Không sao cả. Tôi chỉ tò mò và tôi muốn nói nếu nó có thể giúp một người tình cờ khi điều này, cùng với nó được đánh dấu rõ ràng là phiên bản mà mối quan tâm này, tôi cá nhân thích câu trả lời liên quan như vậy được khuyến khích. Nhưng tôi mới ở đây và chưa hoàn toàn quen thuộc với toàn bộ cấu trúc của trang web và các quy ước về cách xử lý nó. Cảm ơn các phản hồi anyways! – uberlaufer

Các vấn đề liên quan