2012-10-16 35 views
6

Tôi có một ứng dụng, được xây dựng trong Delphi 2007, với TDateTimePicker trên biểu mẫu. Bộ chọn ngày tháng này có thuộc tính ShowCheckbox được đặt thành True, bên cạnh ngày hoặc giờ hiển thị hộp kiểm, được chọn tự động bất cứ khi nào người dùng chọn ngày hoặc khi ngày hoặc giờ được thay đổi theo mã. Trạng thái của hộp kiểm này cũng có thể được kiểm soát theo cách thủ công bởi người dùng và trạng thái của nó có thể được xác định bởi thuộc tính Checked.Tại sao TDateTimePicker.Check trả lại luôn đúng trên Windows 7?

Các mã sau đây cho thấy làm thế nào để xác định trạng thái của hộp kiểm này trong OnChange sự kiện:

procedure TForm1.FormCreate(Sender: TObject); 
begin 
    DateTimePicker1.ShowCheckbox := True; 
end; 

procedure TForm1.DateTimePicker1Change(Sender: TObject); 
begin 
    ShowMessage('Checked: ' + BoolToStr(DateTimePicker1.Checked, True)); 
end; 

Đoạn mã trên làm việc như mong đợi trên Windows XP, nhưng trên Windows 7, Checked lợi nhuận bất động sản luôn Đúng bất kể trạng thái thực của hộp kiểm đó.

Tại sao Checked trả lại thuộc tính luôn đúng, ngay cả khi hộp kiểm không được chọn? Có cách nào để sửa chữa hoặc giải quyết vấn đề này bằng cách nào đó không?

P.S. Ứng dụng của tôi sử dụng các chủ đề Windows

Trả lời

9

Đây là một known issue trong việc thực hiện kiểm soát trình chọn thời gian ngày Delphi (cố định trong Delphi 2009, như @Remy đã chỉ ra trong nhận xét của mình). Để truy vấn trạng thái của hộp chọn bộ chọn ngày giờ nên được sử dụng hoặc DTM_GETSYSTEMTIME tin nhắn, hoặc các DateTime_GetSystemtime vĩ mô, mà nội bộ gửi tin nhắn này. Nếu thông báo (hoặc macro) trả về giá trị GDT_VALID và kiểu DTS_SHOWNONE được sử dụng (trong Delphi khi thuộc tính ShowCheckbox là True), nó cho biết hộp kiểm của kiểm soát được chọn và điều khiển đó chứa ngày giờ hợp lệ.

Dưới đây là ví dụ về cách sử dụng vĩ mô nêu để xác định tình trạng hộp kiểm:

uses 
    CommCtrl; 

procedure TForm1.DateTimePicker1Change(Sender: TObject); 
var 
    SysTime: SYSTEMTIME; 
begin 
    if DateTime_GetSystemTime(DateTimePicker1.Handle, @SysTime) = GDT_VALID then 
    ShowMessage('Check box is checked!') 
    else 
    ShowMessage('Check box is not checked!'); 
end; 

Vì vậy, bạn có thể làm cho một hàm helper như thế này để workaround thi Delphi sai:

uses 
    CommCtrl; 

function IsDateTimePickerChecked(ADateTimePicker: TDateTimePicker): Boolean; 
var 
    SysTime: SYSTEMTIME; 
begin 
    Result := DateTime_GetSystemTime(ADateTimePicker.Handle, @SysTime) = GDT_VALID; 
end; 

procedure TMyForm.ButtonOneClick(Sender: TObject); 
begin 
    if IsDateTimePickerChecked(DateTimePicker1) then 
    ShowMessage('Check box is checked!') 
    else 
    ShowMessage('Check box is not checked!'); 
end; 
+3

Cảm ơn đã làm việc quyến rũ :) – Re0sless

+1

"Sự cố đã biết" đã được khắc phục trong D2009. –

+0

Có bất kỳ vấn đề nào về hệ điều hành với cách này hay không, nó có hoạt động giống với XP, VISTA và 7 không? – mwhobrey

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