在 case 语句中使用字符串

在 case 语句中使用字符串

非常遗憾 Delphi 的 case 语句不支持字符串, 但我觉得这也可能是基于效率的考量;
如果非要在 case 中使用字符串, 也不是不可以变通, 这里提供了五种方法.


本例效果图:


代码文件:


unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ExtCtrls;

type
  TForm1 = class(TForm)
    RadioGroup1: TRadioGroup;
    Button1: TButton;
    Button2: TButton;
    Button3: TButton;
    Button4: TButton;
    Button5: TButton;
    Button6: TButton;
    procedure FormCreate(Sender: TObject);
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure Button3Click(Sender: TObject);
    procedure Button4Click(Sender: TObject);
    procedure Button5Click(Sender: TObject);
    procedure Button6Click(Sender: TObject);
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

uses TypInfo; {操作枚举用}

{初始化一个单选组, 用于测试}
procedure TForm1.FormCreate(Sender: TObject);
begin
  RadioGroup1.Items.CommaText := ‘a,bb,ccc,dddd‘;
  RadioGroup1.ItemIndex := 0;
end;

{这是 case 语句比较常规的用法}
procedure TForm1.Button1Click(Sender: TObject);
begin
  case RadioGroup1.ItemIndex of
    0: Color := clRed;
    1: Color := clYellow;
    2: Color := clLime;
    3: Color := clBlue;
  end;
end;

{方法一: 假如要 case 的字符串的长度不同}
procedure TForm1.Button2Click(Sender: TObject);
var
  str: string;
begin
  str := RadioGroup1.Items[RadioGroup1.ItemIndex];
  case Length(str) of
    1 : Color := clRed;
    2 : Color := clYellow;
    3 : Color := clLime;
    4 : Color := clBlue;
  end;
end;

{方法二: 假如要 case 的字符串的第一个字母不同, case 是支持字符的}
procedure TForm1.Button3Click(Sender: TObject);
var
  str: string;
begin
  str := RadioGroup1.Items[RadioGroup1.ItemIndex];
  case str[1] of
    ‘a‘: Color := clRed;
    ‘b‘: Color := clYellow;
    ‘c‘: Color := clLime;
    ‘d‘: Color := clBlue;
  end;
end;

{方法三: 借用 TStringList}
procedure TForm1.Button4Click(Sender: TObject);
var
  List: TStringList;
  str: string;
begin
  List := TStringList.Create;
  List.Text := RadioGroup1.Items.Text;

  str := RadioGroup1.Items[RadioGroup1.ItemIndex];
  case List.IndexOf(str) of
    0: Color := clRed;
    1: Color := clYellow;
    2: Color := clLime;
    3: Color := clBlue;
  end;

  List.Free;
end;

{方法四: 借用枚举}
type
  TMyEnum = (a, bb, ccc, dddd);

procedure TForm1.Button5Click(Sender: TObject);
var
  MyEnum: TMyEnum;
  str: String;
begin
  str := RadioGroup1.Items[RadioGroup1.ItemIndex];

  MyEnum := TMyEnum(GetEnumvalue(TypeInfo(TMyEnum), str));
  case MyEnum of
    a    : Color := clRed;
    bb   : Color := clYellow;
    ccc  : Color := clLime;
    dddd : Color := clBlue;
  end;
end;

{方法五: 利用对比字符串返回的整数, 这种方法并不太可靠, 但在某种情况下会更灵活}
procedure TForm1.Button6Click(Sender: TObject);
var
  str: string;
begin
  str := RadioGroup1.Items[RadioGroup1.ItemIndex];
  case CompareStr(str, ‘a‘) of
    0: Color := clRed;
    1: Color := clYellow;
    2: Color := clLime;
    3: Color := clBlue;
  end;
end;

end.

窗体文件:


object Form1: TForm1
  Left = 0
  Top = 0
  Caption = ‘Form1‘
  ClientHeight = 111
  ClientWidth = 265
  Color = clBtnFace
  Font.Charset = DEFAULT_CHARSET
  Font.Color = clWindowText
  Font.Height = -11
  Font.Name = ‘Tahoma‘
  Font.Style = []
  OldCreateOrder = False
  Position = poDesktopCenter
  OnCreate = FormCreate
  PixelsPerInch = 96
  TextHeight = 13
  object Button1: TButton
    Left = 16
    Top = 15
    Width = 75
    Height = 25
    Caption = ‘Button1‘
    TabOrder = 0
    OnClick = Button1Click
  end
  object Button2: TButton
    Left = 97
    Top = 15
    Width = 75
    Height = 25
    Caption = ‘Button2‘
    TabOrder = 1
    OnClick = Button2Click
  end
  object Button3: TButton
    Left = 16
    Top = 46
    Width = 75
    Height = 25
    Caption = ‘Button3‘
    TabOrder = 2
    OnClick = Button3Click
  end
  object RadioGroup1: TRadioGroup
    Left = 178
    Top = 8
    Width = 80
    Height = 94
    Caption = ‘RadioGroup1‘
    TabOrder = 3
  end
  object Button4: TButton
    Left = 97
    Top = 46
    Width = 75
    Height = 25
    Caption = ‘Button4‘
    TabOrder = 4
    OnClick = Button4Click
  end
  object Button5: TButton
    Left = 16
    Top = 77
    Width = 75
    Height = 25
    Caption = ‘Button5‘
    TabOrder = 5
    OnClick = Button5Click
  end
  object Button6: TButton
    Left = 97
    Top = 77
    Width = 75
    Height = 25
    Caption = ‘Button6‘
    TabOrder = 6
    OnClick = Button6Click
  end
end
时间: 2024-08-17 00:38:15

在 case 语句中使用字符串的相关文章

Switch Case语句中多个值匹配同一个代码块的写法

switch ($p) { case 'home': case '': $current_home = 'current'; break; case 'users.online': case 'users.location': case 'users.featured': case 'users.new': case 'users.browse': case 'users.search': case 'users.staff': $current_users = 'current'; break

C语言中switch...case语句中break的重要性

在C语言中switch...case语句是经常用到的,下面我介绍一下在使用该语句时候需要注意的一个细节问题.话不多说,直接举例子: 例子1: switch(fruit) { case 1:printf("apple"); break; case 2:printf("banana"); break; case 3:printf("orange"); break; case 4:printf("pear"); break; cas

在switch中的case语句中声明变量会被提前

原文链接:http://my.oschina.net/u/2000201/blog/514384 本人今天在编写工具类时,无意之间发现,在Java的Swith语句的case语句中声明局部变量时出现了一个奇怪的问题. 废话少说,先列出例子,一看便知. 情景一:case 1中声明变量x,case 2中不能再声明变量x switch (1) { case 1: int x = 1; break; case 2: int x = 2;// 编译器会提示:Duplicate local variable

switch case语句中能否作用在String,long上

在之前的eclipse中使用switch的case语句时是只能为(byte,short,char)int类型或枚举类型.但在jdk1.7以后 在case语句中是可以使用String 以及long 等类型的 然后再控制台输入"好"之后 跟据所提供的值对应输出了case值.所以String,long可以作用在switch当中 原文地址:https://www.cnblogs.com/JXun/p/9338583.html

java7 switch语句中使用字符串的背后原理

先看下代码及反编译后的代码: /**  * @author doctor  *  * @time 2015年3月28日 下午3:26:06  */ public class StringForSwitch { @Rule public ExpectedException ex = ExpectedException.none(); @Test public void test_string_switch() { String result=""; switch ("docto

sql语句中截取字符串

今天在开发过程中因为要用到合并单元格,在程序里实现了以后,查出来的数据太长,都把格式撑大了,后来想想可以在sql语句查询的时候就截取,就去网上找了一下,挺好用,就转了过来: 合并单元格: /// <summary>    /// 合并GridView中某列相同信息的行(单元格)    /// </summary>    /// <param name="GridView1">GridView</param>    /// <para

c# sql在where查询语句中使用字符串变量与int型变量

使用where语句访问数据库时where语句用上文中以及定义过的变量来查询. string sql3 = string.Format("update Ships set ContainerNum='"+list1[0].ContainerNum+"' where Name='"+list[0].ShipName+"'"); Ships是表名  ContainerNum是表中字段名 list1[0].ContainerNum是上文的一个Int 类型

【特性】select语句中使用字符串链接获取字段值失败

坑1 在一个多行的表中,想把其中的一个字段值拿出来,组成一个字符串供后面使用. 按照以往,自己就如以下这么写了: declare @sql varchar(8000) set @sql='insert into XXX values(' select @sql=@sql+''','''+ field from YY 然后没有得到想要的所有行的字符串,第一行之后就没有了. 排查问题: 1. 自己仔细查看了数据,并打印出来,发现这个字段有换行. 于是自己又用replace把字段field的换行符,结

[sql]在case语句中不同情况下then的数据的数据类型不一致ORA-00932: inconsistent datatypes: expected NUMBER got CHAR

ORA-00932: inconsistent datatypes: expected NUMBER got CHAR 00932. 00000 -  "inconsistent datatypes: expected %s got %s" 1 CASE XXXXX.FILE_TYPE 2 WHEN '0' THEN NVL(TX_CNT,0) 3 ELSE XXXXX.TOT_TX_CNT 4 END ACT_TX_CNT, TX_CNT为NUMBER型,是GROUP BY 后的计数