如何简化多次设置变量?

时间:2013-05-14 15:44:59

标签: delphi

我想使用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;

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

3 个答案:

答案 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

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