2012-12-20 14 views
5

Tôi có một hình thức với ba thành phần chính:Làm cách nào để ngăn chặn hai điều khiển căn chỉnh đến dưới cùng từ thứ tự đảo ngược?

  1. Một FlowPanel được thiết lập để Dồn icon về khách hàng
  2. Một FlowPanel thứ hai thiết lập để Dồn icon về dưới
  3. Một Statusbar thiết lập để Dồn icon về Bottom.

Mọi thứ bắt đầu trông tuyệt vời. Nhưng FlowPanel được căn chỉnh ở phía dưới cũng được đặt thành AutoSize. Nó chứa một bảng điều khiển có thể tự sụp đổ. Bảng điều khiển bên trong chứa thông tin tóm tắt mà người dùng có thể quyết định ẩn. Điều này giảm kích thước của FlowPanel đến một kích thước rất nhỏ nhưng không hoàn toàn biến mất. Vẫn còn một nút mà người dùng có thể mở rộng lại bảng tóm tắt.

Sự cố xảy ra khi bảng điều khiển được mở rộng lại khiến FlowPanel phát triển. Tại thời điểm đó, thứ tự của thanh trạng thái và FlowPanel được đảo ngược. Cả hai đều được thiết lập để căn chỉnh phía dưới nhưng bây giờ thanh trạng thái nằm trên FlowPanel của tôi.

Tôi có thể sao chép điều này trong một ứng dụng thử nghiệm mà không có bảng điều khiển Thu gọn chỉ bằng cách đặt nút trên biểu mẫu để xem chiều cao của bảng điều khiển dòng dưới cùng. Nếu chiều cao được tăng, thứ tự thay đổi. Nếu nó bị giảm thì mọi thứ vẫn theo cùng một thứ tự. Mã duy nhất trong biểu mẫu thử nghiệm của tôi là:

FlowPanel2.Height := FlowPanel2.Height * 2; 

Tôi cũng đã thử nghiệm bảng điều khiển dưới cùng này là một TPanel thông thường thay vì FlowPanel có cùng kết quả.

Bất kỳ ý tưởng nào về lý do điều này xảy ra và cách ngăn chặn điều đó?

Moving Status bar image

+4

Một quirck khá nổi tiếng và gây kích thích về căn chỉnh và tương tác tự động hóa. Thêm một trình xử lý sự kiện OnResize, trong đó bạn đặt đỉnh của thanh trạng thái thành chiều cao của vùng chứa + 1 hoặc chiều cao + đỉnh của bảng điều khiển cần theo sau. (nhìn vào LOLCats, do đó, một bình luận và không phải là một câu trả lời). –

+0

@Mark: Này, bạn đã ** mũ ** của tôi!:-P –

Trả lời

8

Giải pháp của tôi:

  1. Đặt một Statusbar vào mẫu và sắp xếp vào đáy
  2. Đặt một Panel (Container_Panel) vào mẫu và sắp xếp để khách hàng
  3. Đặt FlowPanel trên Container_Panel và sắp xếp vào đáy
  4. Đặt một FlowPanel trên Container_Panel và căn chỉnh cho Khách hàng

Bây giờ bạn sẽ không gặp vấn đề gì với thêm nữa

+2

Một tùy chọn khác giúp loại bỏ sự cần thiết của 'Container_Panel' là sử dụng' Align = alCustom' để thực hiện căn chỉnh tùy chỉnh. Nhưng đối với các phiên bản không hỗ trợ 'alClient', hoặc bạn không muốn viết bất kỳ mã nào cho nó, thì phương thức' Container_Panel' hoạt động tốt, với chi phí sử dụng thêm một xử lý 'HWND'. –

7

Tôi đôi khi cũng có điều này. Giải pháp của tôi là đặt đầu của điều khiển sẽ ở dưới cùng thành giá trị "đủ lớn" - giống như OtherControl.Top + OtherControl.Height + 1 sẽ hoạt động hoặc thậm chí MaxInt IIRC.

1

Nếu bạn sẵn sàng chi tiêu một số tiền, tôi khuyên bạn nên sử dụng DevExpress 'ExpreeLayoutControl (hoặc một cái gì đó tương tự). Nó là một công cụ tuyệt vời cho cả hai hình thức đơn giản và phức tạp, và ngoài việc giải quyết những rắc rối phiền hà như vấn đề bạn đang gặp phải, nó cung cấp một loạt các lợi ích khác.

+0

-1. Đây không phải là câu trả lời cho câu hỏi. Đó là lúc tốt nhất một bình luận cho thấy một thành phần thương mại thiết lập như là một thay thế. (Nó sẽ là tốt như thông tin bổ sung * sau * câu trả lời của bạn, nhưng là nội dung độc lập nó không phải là một câu trả lời.) –

+0

@KenWhite: Tôi đồng ý, và tôi đã nghi ngờ nếu tôi nên đăng nó như là một câu trả lời. Nó sẽ, như bạn nói, phù hợp hơn như một bình luận. Nhưng tôi quyết định đăng tất cả như vậy, vì nó là một giải pháp tốt cho Mark Elders '_problem_, mặc dù nó không phải là câu trả lời cho _question_ của anh ấy. –

+0

@KenWhite Tôi nghĩ rằng những người kiểm duyệt đôi khi hơi quá khắc nghiệt với mọi người. Tôi nghĩ rằng, miễn là mọi thứ không được đưa ra khỏi tầm tay, bạn nên chấp nhận một vài "ít hơn hoàn hảo" ý kiến ​​hoặc câu trả lời, mà không cảm thấy ngay lập tức cần phải gửi bình luận sửa chữa. Kiểm duyệt là một điều tốt, và về tổng thể tôi nghĩ rằng bạn đang làm một công việc tốt, nhưng sức mạnh của việc trở thành một người kiểm duyệt/quản trị viên không nên bị lạm dụng. – Elling