1

我想编写一个过滤日期的 SQL 查询,使用 ComboBox 的内容,在后者中我想要字母中的月份,但我必须使用数字进行查询,所以我使用了以下代码:

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;

我想知道是否可以简化这一点。

4

3 回答 3

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子句会引发异常。这样,您至少会发现该月份是否以某种方式未被识别。

于 2013-05-14T15:49:23.000 回答
1
 Param := ComboBox1.ItemIndex + 1
于 2013-05-14T15:49:30.650 回答
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;

与大卫相比,它的好处是它是独立的,因为它不需要TComboBox以正确的顺序填充字符串。

另请注意,使用SameText使函数不区分大小写。例如,SePtEmBeR将映射到9.

当然,在实际应用程序中,您可能希望本地化月份名称,这不是最佳选择,但如果不是这种情况,那么这个解决方案非常简洁。

于 2013-05-14T16:33:53.223 回答