2009-05-25 61 views
7

Trước Delphi 2006 (tôi nghĩ) đã giới thiệu TFlowPanel và TGridPanel, tôi đã thực hiện một điều khiển tương tự về khái niệm. Nó vẫn làm một vài điều những điều khiển không làm, và khi nâng cấp mã của tôi để Delphi 2009, tôi quyết định thêm một vài cải tiến cho điều đó là tốt.Kéo và thả thiết kế thời gian trong Delphi?

Ngay bây giờ, thứ tự các điều khiển con được xác định theo thứ tự tạo của chúng. FlowPanel và GridPanel cho thấy một cách tốt hơn với ControlIndex và các thuộc tính được lọc khác, nhưng tôi đã tự hỏi nếu có một cách để xử lý kéo và thả sắp xếp lại trong thiết kế thời gian? Theo như tôi có thể nói, kéo một điều khiển chỉnh sửa và thả nó vào bảng điều khiển của tôi không gọi bất cứ điều gì mà tôi có thể truy cập vào lúc thiết kế.

Tôi đã tưởng tượng một cách để phát hiện hoạt động thả trực tiếp hoặc có thể phát hiện khi điều khiển được di chuyển để tôi có thể xác định nơi cần đi.

Bất kỳ ý tưởng nào?

Cập nhật: OK, đã hoạt động. Kiểm soát vùng chứa đã được ghi đè AlignControls để quản lý vị trí của các điều khiển. Khi bạn kéo điều khiển lồng nhau và thả nó, AlignControls lại được gọi. Sau đó tôi so sánh các tọa độ mới của điều khiển với các điều khiển khác trong danh sách và di chuyển nó đến vị trí thích hợp.

Có một vài vấn đề mà tôi phải làm việc (chủ yếu liên quan đến nhiều cuộc gọi đến AlignControls) nhưng khái niệm cơ bản là đủ đơn giản. Nhờ tất cả những người bình luận cho tất cả sự giúp đỡ.

+0

"thứ tự của các điều khiển con được xác định theo thứ tự tạo" Thứ tự là gì? Thứ tự tab? Bạn có muốn đặt tab cho chúng từ trên xuống dưới trong bảng điều khiển không? – Serguzest

+0

Ngay bây giờ, nếu bạn chọn bảng điều khiển và sau đó thêm các điều khiển vào nó, các điều khiển sẽ được trình bày theo thứ tự bạn đã thêm chúng. Để sắp xếp lại, bạn sẽ cắt và dán hoặc xem biểu mẫu dưới dạng văn bản và dịch chuyển chúng xung quanh. Bây giờ tôi đã thêm một thuộc tính ControlIndex là một TFlowPanel nhưng muốn người dùng điều khiển có thể chỉ cần kéo và thả để sắp xếp lại. Vì vậy, lấy Edit2 và thả nó sang bên trái của Edit1 và họ hoán đổi vị trí trên bảng điều khiển. –

Trả lời

5

Bạn không thể kéo điều khiển đã có trên biểu mẫu và thả nó vào bảng điều khiển của bạn. Kéo chỉ dành cho di chuyển điều khiển chứ không phải để thay đổi cấp độ gốc. Để thay đổi phụ huynh, cắt và dán.

Nếu điều khiển đã có trên bảng điều khiển của bạn và bạn muốn di chuyển nó đến vị trí khác trên bảng điều khiển của bạn, thì bảng điều khiển có thể kiểm soát bố cục bằng cách ghi đè phương pháp TWinControl.AlignControls. Khi điều khiển được di chuyển, phương thức SetBounds của nó được gọi, và trong số những thứ tha xảy ra là nó gọi AlignControl(Self) trên cửa sổ chính của nó. Điều đó gọi số AlignControls. Hãy xem trong các điều khiển .pas và bạn sẽ thấy rằng đó là một phương pháp phức tạp, nhưng đó là những gì chịu trách nhiệm cho bố cục của trẻ trên điều khiển và đó chính xác là những gì bạn định thay đổi.

+0

Hi Rob, Tôi nghĩ rằng tôi không quá rõ ràng về ý định kiểm soát của tôi bị rơi vào thùng chứa của tôi - hãy xem câu trả lời của tôi cho bình luận của John. Liên quan đến việc sử dụng AlignControls để xử lý sắp xếp lại, bạn hoàn toàn đúng. Tôi đang sử dụng AlignControls đã sắp xếp các trẻ em nhưng ngay bây giờ tôi hoàn toàn bỏ qua các thuộc tính bên trái và trên cùng. Mối quan tâm của tôi là việc đưa những người vào tài khoản sẽ làm cho nó khá khó khăn để xác định khi một điều khiển chỉ được thêm vào và khi người dùng đang cố gắng sắp xếp lại. Tôi sẽ cung cấp cho nó một mặc dù và báo cáo lại. –

0

Bạn đã cố gắng viết sự kiện "OnDragDrop" cho thành phần lưới của mình, nơi bạn kiểm tra xem thành phần của bạn có ở chế độ thiết kế không?

Tôi chưa viết thành phần như vậy, nhưng tôi không thấy lý do sự kiện không nên kích hoạt.

+0

Xin chào LeGEC. Tôi chưa thử OnDragDrop, nhưng dường như tất cả các sự kiện chuột khác đều bị chặn bởi trình thiết kế biểu mẫu, vì vậy bạn không bao giờ nhận được thông báo rằng một điều khiển đang được kéo. –

3

Có lẽ một số đề xuất này có thể hữu ích.

Bạn có thể kiểm soát lại cha mẹ trong nhà thiết kế mà không cần phải cắt và dán. Xem khung cấu trúc và chỉ cần kéo điều khiển trực quan vào nút của một phụ huynh khác trong ngăn cấu trúc. Nếu bạn có mọi thứ trong bảng tính, hãy kéo mọi thứ ra khỏi bảng điều khiển luồng và kéo chúng trở lại theo thứ tự bạn muốn.

(Bạn có thể tái mẹ BẤT CỨ kiểm soát hình ảnh theo cách này, mà không thay đổi bất cứ điều gì khác hơn là mẹ của nó. Tôi rất khuyên bạn nên làm theo cách này.)

Bạn có thể xem hình dưới dạng văn bản, và di chuyển trật tự khai xung quanh trong đó - nhưng rõ ràng bạn sẽ cần phải cẩn thận khi chỉnh sửa các tập tin "tài nguyên" trực tiếp.

Bạn có thể đặt thứ tự tab trong trình thiết kế để bạn có thể thực hiện một điều khiển khác dựa trên thứ tự tab hoạt động như bạn muốn. Bạn có thể nhấp chuột phải vào biểu mẫu và thay đổi thứ tự tạo của các điều khiển không trực quan, nhưng điều đó không hoạt động với các điều khiển trực quan.

+0

Cảm ơn, John. Câu hỏi của tôi thực sự liên quan đến việc có thể hỗ trợ nó từ bên trong một điều khiển tùy chỉnh - về cơ bản để kiểm soát xác định rằng một điều khiển khác đang bị rơi vào một vị trí tạo thành một phần của hình chữ nhật bị ràng buộc của điều khiển của tôi. Tôi đã có một số suy nghĩ thứ hai về điều này - ngoài việc không biết chính xác nơi bắt đầu, nó sẽ làm cho hành động điều khiển khác với các vùng chứa khác có thể gây nhầm lẫn cho một số người dùng kiểm soát. –

+1

Thay vào đó, bạn có thể muốn biến nó thành một trình soạn thảo thành phần - bật lên giao diện người dùng của riêng bạn từ một cú click chuột phải và sử dụng di chuyển lên/xuống cũ hoặc thực hiện thao tác kéo và thả trên điều khiển đó. –