我想使用ComboBox的内容编写一个过滤日期的SQL查询,后者我想用字母表示月份,但我必须使用数字作为查询,所以我使用了这段代码:
procedure TAdh_Filter.RadioButton3Click(Sender: TObject);
var Param : integer;
begin
if ComboBox1.Text = 'January' then begin Param := 1; end
else if ComboBox1.Text = 'February' then begin Param := 2; end
else if ComboBox1.Text = 'March' then begin Param := 3; end
else if ComboBox1.Text = 'April' then begin Param := 4; end
else if ComboBox1.Text = 'May' then begin Param := 5; end
else if ComboBox1.Text = 'June' then begin Param := 6; end
else if ComboBox1.Text = 'July' then begin Param := 7; end
else if ComboBox1.Text = 'August' then begin Param := 8; end
else if ComboBox1.Text = 'September' then begin Param := 9; end
else if ComboBox1.Text = 'October' then begin Param := 10; end
else if ComboBox1.Text = 'November' then begin Param := 11; end
else if ComboBox1.Text = 'December' then begin Param := 12; end
end;
我想知道是否可以简化这一点。
答案 0 :(得分:4)
您应该使用具有csDropDownList
样式的组合框。这意味着只能选择添加到组合中的值。在这种情况下,您可以从ItemIndex
中读取所需的值。
procedure TAdh_Filter.RadioButton3Click(Sender: TObject);
var
Param : integer;
begin
Param := ComboBox1.ItemIndex + 1;
end;
如果您使用任何其他风格的组合框,则用户可以通过键入组合来输入无效月份。这听起来好像不适合你。但是,如果出于某种原因,您不想使用csDropDownList
,则需要将月份文本转换为索引,并包含有效性检查。如果您确实需要这样做,那么您可以使用@bummi在此处提供的代码来简化与问题中的代码相比的问题:Convert month name to number in Delphi?
另请注意,您的代码存在无法设置Param
的风险。作为一条一般性建议,我建议您始终在else
语句中包含if
子句,并且您的else
子句会引发异常。这样你至少会发现,不知何故,月份是否被识别出来。
答案 1 :(得分:1)
Param := ComboBox1.ItemIndex + 1
答案 2 :(得分:1)
以下是另一种解决方案:
const
MonthNames: array[1..12] of string = ('januari', 'februari', 'mars',
'april', 'maj', 'juni', 'juli', 'augusti', 'september', 'oktober',
'november', 'december');
function MonthToIndex(const MonthName: string): integer;
var
i: Integer;
begin
for i := low(MonthNames) to high(MonthNames) do
if SameText(MonthNames[i], MonthName) then
Exit(i);
raise Exception.CreateFmt('Unknown month "%s".', [MonthName]);
end;
这对David的好处是,它是独立的,因为它不需要TComboBox
以正确的顺序填充字符串。
另请注意,使用SameText
会使函数不区分大小写。例如,SePtEmBeR
将映射到9
。
当然,在实际的应用程序中,您可能希望本地化的月份名称,然后这不是最佳的,但如果不是这样,那么这个解决方案非常简洁。