2008-09-25 24 views
6

Tôi đang sử dụng menu bật lên ở Delphi. Tôi muốn sử dụng nó theo kiểu "nhóm radio" nếu người dùng chọn một mục được chọn và các mục khác không được chọn. Tôi đã thử sử dụng thuộc tính AutoCheck, nhưng điều này cho phép nhiều mục được kiểm tra. Có cách nào để đặt menu bật lên sao cho chỉ có một mục có thể được kiểm tra?Menu Delphi Popup Kiểm tra

Trả lời

5

Zartog là đúng, nhưng nếu bạn muốn giữ hộp kiểm, hãy gán sự kiện này cho mọi mục trong menu bật lên.

Lưu ý rằng mã này có vẻ hơi lông bởi vì nó không phụ thuộc vào việc biết tên của menu bật lên của bạn (do đó, tìm kiếm bằng "GetParentComponent").

procedure TForm2.OnPopupItemClick(Sender: TObject); 
var 
    i : integer; 
begin 
    with (Sender as TMenuItem) do begin 
    //if they just checked something... 
    if Checked then begin 
     //go through the list and *un* check everything *else* 
     for i := 0 to (GetParentComponent as TPopupMenu).Items.Count - 1 do begin 
     if i <> MenuIndex then begin //don't uncheck the one they just clicked! 
      (GetParentComponent as TPopupMenu).Items[i].Checked := False; 
     end; //if not the one they just clicked 
     end; //for each item in the popup 
    end; //if we checked something 
    end; //with 
end; 

Bạn có thể gán sự kiện trong thời gian chạy cho mỗi hộp cửa sổ bật lên vào mẫu của bạn như thế này (nếu bạn muốn làm điều đó):

procedure TForm2.FormCreate(Sender: TObject); 
var 
    i,j: integer; 
begin 
    inherited; 

    //look for any popup menus, and assign our custom checkbox handler to them 
    if Sender is TForm then begin 
    with (Sender as TForm) do begin 
     for i := 0 to ComponentCount - 1 do begin 
     if (Components[i] is TPopupMenu) then begin 
      for j := 0 to (Components[i] as TPopupMenu).Items.Count - 1 do begin 
      (Components[i] as TPopupMenu).Items[j].OnClick := OnPopupItemClick; 
      end; //for every item in the popup list we found 
     end; //if we found a popup list 
     end; //for every component on the form 
    end; //with the form 
    end; //if we are looking at a form 
end; 

Để đáp lại bình luận bên dưới câu trả lời này: Nếu bạn muốn yêu cầu ít nhất một mục cần kiểm tra, sau đó sử dụng mục này thay vì khối mã đầu tiên. Bạn có thể muốn đặt mục được chọn mặc định trong sự kiện oncreate.

procedure TForm2.OnPopupItemClick(Sender: TObject); 
var 
    i : integer; 
begin 
    with (Sender as TMenuItem) do begin 
    //go through the list and make sure *only* the clicked item is checked 
    for i := 0 to (GetParentComponent as TPopupMenu).Items.Count - 1 do begin 
     (GetParentComponent as TPopupMenu).Items[i].Checked := (i = MenuIndex); 
    end; //for each item in the popup 
    end; //with 
end; 
+0

Ông cũng nên thêm mã kiểm tra rằng ít nhất một mục menu được chọn và điều đó cho biết thêm người dùng kiểm tra lại bỏ chọn mục đã chọn. Điều đó phải đơn giản cho ví dụ của bạn. – gabr

+0

Tôi không chắc đó là mục tiêu của anh ấy, nhưng tôi đã thêm một khối để xử lý điều đó trong câu trả lời. Nó thực sự đơn giản hóa mọi thứ một chút. – JosephStyons

+1

Điều này chắc chắn không phải là cách để đi: chức năng này đã được tích hợp sẵn. Xem bài viết của Zartog và Gerry, và kết hợp cả hai. – onnodb

12

Để xử lý các mục menu bật lên (hoặc bất kỳ) khác như mục nhóm radio, hãy đặt thuộc tính 'RadioItem' thành đúng cho từng mục bạn muốn có trong nhóm radio.

Thay vì hiển thị dấu kiểm, nó sẽ hiển thị dấu đầu dòng theo mục đã chọn, nhưng nó sẽ hoạt động theo cách bạn muốn và dấu hiệu trực quan sẽ khớp với tiêu chuẩn cửa sổ.

4

Để phóng to trên bài đăng của Zartog: Menu bật lên trong Delphi (từ ít nhất D6) có thuộc tính GroupIndex cho phép bạn có nhiều bộ mục radio trong một menu. Đặt GroupIndex 1 cho nhóm đầu tiên, 2 cho một thứ hai, vv

Vì vậy: Set autocheck = True Set RadioItem = True Set GroupIndex nếu bạn cần nhiều hơn một nhóm các mặt hàng thanh

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