【问题标题】:How to simplify setting a variable multiple times?如何简化多次设置变量?
【发布时间】:2013-05-14 15:44:58
【问题描述】:

我想编写一个过滤日期的 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;

我想知道是否可以简化此操作。

【问题讨论】:

  • 我假设你的组合中只有几个月 => Param := Combobox1.ItemIndex + 1;

标签: delphi


【解决方案1】:

您应该使用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 的风险。作为一条一般性建议,我建议您始终在 if 这样的语句中包含 else 子句,并且您的 else 子句会引发异常。这样,您至少会发现是否以某种方式无法识别月份。

【讨论】:

  • 我刚刚对你的回答投了赞成票,因为它和我的一样,我的浏览器已经缓存了页面,当我完成并发布它时,你已经在我面前发布了,所以对于某些人来说,我看到了'已经复制了你的答案,以避免我删除并支持你的。谢了:)
  • @Diego 是的,我完全理解。除了你刚才描述的,我没有想到其他任何事情。
【解决方案2】:
 Param := ComboBox1.ItemIndex + 1

【讨论】:

    【解决方案3】:

    另一种解决方案如下:

    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

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

    【讨论】:

    • 如果您想要本地化名称,请使用 SysUtils 中的名称或声明它们的任何位置。我希望你永远不要以随机顺序显示月份。 ;-)
    • @David:不是随机的,但有些人会这样做thedailywtf.com/Articles/…
    猜你喜欢
    • 2019-11-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-25
    • 1970-01-01
    相关资源
    最近更新 更多