【发布时间】:2020-01-20 13:25:04
【问题描述】:
我有这些控件 TDateTimePicker、TComboBox、Tedit 和 TButton。默认情况下禁用 TButton。我想要实现的是在所有其他控件都已填充或不为空时启用 TButton。
使用以下代码,填充时以 TDateTimePicker 开头的所有 3 个控件都没有任何问题,它按预期工作。
当我填充 TComboxBox 后跟 TEdit 时出现错误,即使 TDateTimePicker 尚未填充,它也会启用 TButton。反之亦然,我将填充 TEdit,然后填充 TComboBox,它启用了 TButton。
从下面的代码中,我预计 TButton 不会启用,除非所有 3 个控件都被填充。
我(一整天)一直在试图弄清楚这个错误是如何发生的。
我会感谢那里的任何人帮助我解决这个问题。
procedure TfrmHolidays.EnableSaveButton;
begin
if (edtHolidayName.Text <> NullAsStringValue) and (cmbHolidayType.ItemIndex <> -1)and (dtpHolidayDate.Date <> 0) then
begin
btnHolidaySave.Enabled := True;
end
else
begin
btnHolidaySave.Enabled := False;
end;
end;
procedure TfrmHolidays.dtpHolidayDateChange(Sender: TObject);
begin
EnableSaveButton;
end;
procedure TfrmHolidays.cmbHolidayTypeChange(Sender: TObject);
begin
EnableSaveButton;
end;
procedure TfrmHolidays.edtHolidayNameChange(Sender: TObject);
begin
EnableSaveButton; // triggers enable btnHolidaySave button
end;
顺便说一句,我有更多与使 TDateTimePicker 为空白相关的代码,我认为这没有问题。我还尝试在 If 语句中嵌套每个条件,但仍然出现错误。此外,我一次测试了每个条件,它工作正常。
更新: 以下是我初始化 dtpHolidayDate.Date 的方式:
procedure TfrmHolidays.FormCreate(Sender: TObject);
begin
DateTime_SetFormat(dtpHolidayDate.Handle, ' ');
FDTMDateEmpty := True;
end;
procedure TfrmHolidays.dtpHolidayDateCloseUp(Sender: TObject);
begin
DateTime_SetFormat(dtpHolidayDate.Handle, PChar('MMM dd yyyy (ddd)'));
end;
procedure TfrmHolidays.dtpHolidayDateChange(Sender: TObject);
begin
FDTMDateEmpty := False;
EnableSaveButton; // same and updated procedure above
end;
【问题讨论】:
-
调试EnableSaveButton过程,看看dtpHolidayDate.Date的值是多少
-
AFAIK,TDateTimePicker 使用当前日期时间初始化。我们看不到初始化 TDateTimePicker 的代码,因此 dtpHolidayDate.Date 0 可能从一开始就返回 true。您还应该告诉我们您的 Delphi 版本,因为根据所使用的 Delphi,某些控件的行为会有所不同。
-
TDateTimePicker 默认没有空值。你必须做点什么like this。
-
与您描述的问题无关,但我会写
edtHolidayName.Text <> ''而不是edtHolidayName.Text <> NullAsStringValue。此处无需涉及变体。 -
在程序执行时使用调试器检查各种变量和属性的值。如果你这样做了,那么你就会知道发生了什么,所以我只能假设你还没有学会如何调试。没有这项技能,就不可能成为一名有效的程序员。让学习如何调试成为您的使命。
标签: delphi