`

Delphi在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;
ps:稍做解释:GetEnumvalue 函数返回一个字符串对应的枚举型的值在某枚举类型

中的位置(要知道枚举类型是有顺序的,要不怎么叫顺序类型呢:-)),然后通过

一个强制类型转换将这个值转化为枚举型。于是就实现了把字符串转化为枚举型的操作


{方法五: 利用对比字符串返回的整数, 这种方法并不太可靠, 但在某种情况下会更灵活}
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.

===========================================

在case语句中使用字符串  
(**** 转载敬请注明-本文出处:南山古桃(nsgtao)的百度空间:http://hi.baidu.com/nsgtao/ ****)
在 case 语句中使用字符串 --- by 熊恒(beta)

我今天要介绍的是一个比较另类的方法。大家都知道,case 语句只能对顺序类型
(ordinal type)管用,那么我们先看一下顺序类型到底有那些呢:1)整型;2)字
符型;3)枚举型。
于是也就演化出三种在 case 语句里面使用字符串的方法(耐心看下去哦,最后一
种方法才是今天的重点:-p):

假如我们的具体应用如下(理想的,但是错误的写法):

str := 'Chongqing';
case str of // 编译器将在这一行制止你 :-(
'Beijing': ShowMessage('First');
'Tianjing': ShowMessage('Second');
'Shanghai': ShowMessage('Third');
'Chongqing': ShowMessage('Forth');
else ShowMessage('Other');
end;

(**** 转载敬请注明-本文出处:南山古桃(nsgtao)的百度空间:http://hi.baidu.com/nsgtao/ ****)
法一:字符串转为整型
这应该是比较通行的方法了,主要是利用 TStringList。先把备选的字符串挨个
Add 进去,然后调用其 IndexOf 方法。该方法返回一个整数,表示待找字符串出
现在列表中的位置:

//var strList: TStringList;

strList := TStringList.Create;
strList.Add('Beijing');
strList.Add('Tianjing');
strList.Add('Shanghai');
strList.Add('Chongqing');
str := 'Chongqing';
case strList.IndexOf(str) of
0: ShowMessage('First');
1: ShowMessage('Second');
2: ShowMessage('Third');
3: ShowMessage('Forth');
else ShowMessage('Other');
end;
strList.Free;

可以看到,这是比较麻烦的方法了,不过你可得记住这个方法,因为后面的讨论
将会讲到,这是最通用的方法。
另:当然,把字符串转化为整型后用于 case 不只这一种方法。另一种是通过把
备选项全部转化为等长度后合并为一个字符串,然后用 Pos 函数返回某字符串的
位置。在此不再累述,请查阅《程序员》杂志(具体哪一期不记得了:-()。

(**** 转载敬请注明-本文出处:南山古桃(nsgtao)的百度空间:http://hi.baidu.com/nsgtao/ ****)
法二:字符串转为字符型

这应该是最简单的一种方法,不过局限性比较大。如果你的备选项的第 N 个字
符(N 应为常数)都互不相同,那么你赚到了。这样,就可以通过取出这个字符,
来唯一标识你的字符串:

str := 'Chongqing';
case str[1] of // 第一个字符都不同,所以取出第一个进行比较
'B': ShowMessage('First');
'T': ShowMessage('Second');
'S': ShowMessage('Third');
'C': ShowMessage('Forth');
else ShowMessage('Other');
end;

不过如果你的备选项没有这样的特性,那么你就无缘使用这种方法了。

(**** 转载敬请注明-本文出处:南山古桃(nsgtao)的百度空间:http://hi.baidu.com/nsgtao/ ****)
法三:字符串转为枚举型

这种方法主要用到 RTTI 的特性。该方法的主要思路是,先把所有的备选项声名
为一个枚举类型的值,那么我们只要把要找的字符串也转换为枚举型,那么就可以
用 case 语句了。那么通过什么办法把一个字符串转化为枚举型呢?往下看:

// uses TypInfo; // 记得引用这个单元
// type TMyStrSel = (Beijing, Tianjing, Shanghai, Chongqing);
// 注意,上面这个定义不能放在某个函数内部哦,那样的话,它就没有运行类信息了
// var strSel: TMyStrSel;

str := 'Chongqing';
strSel := TMyStrSel(GetEnumValue(TypeInfo(TMyStrSel), str));
case strSel of
Beijing: ShowMessage('First');
Tianjing: ShowMessage('Second');
Shanghai: ShowMessage('Third');
Chongqing: ShowMessage('Forth');
else ShowMessage('Other');
end;

稍做解释:GetEnumValue 函数返回一个字符串对应的枚举型的值在某枚举类型
中的位置(要知道枚举类型是有顺序的,要不怎么叫顺序类型呢:-)),然后通过
一个强制类型转换将这个值转化为枚举型。于是就实现了把字符串转化为枚举型的
操作。

可以看到,在 case 语句这一段,我们的使用和理想中的使用方法几乎是一样的!
毕竟枚举类型可以做到见名知意嘛。的确比用前两种方法看起来直观得多。

当然,这并不是万能的方法,如果你的备选项有一个不符合 Delphi 的变量名命
名法则(如'AK-47'或中文等),则不能将其声明为一个枚举型,于是就不能使用这
个方法。如果是这样你就只能使用前两种方法了。极端的情况下,至少你还有第一
种方法可以使用 :-) 但在不少的场合,这种方法还是适用的。


Case 语句中使用字符串
作者:

function CaseString (const s: string;
                     const x: array of string): Integer;
var i: Integer;
begin
Result:= -1; // Default return parameter
for i:= Low (x) to High (x) do begin
if s = x[i] then begin Result:= i; Exit; end;
end;
end;

search:= 'delphi3000';
case CaseString (search, ['delphi3000',
                           'delphipages',
                           'Torry's']) of
0: s:= 'Excellent!';
1: s:= 'Good source';
2: s:= 'Not bad!';
end;
/////////////////////////////////

const MatchingStrings = '*First*Second*Third*';
var sString: string;
...

// sString has the data you want to test
case pos('*'+sString+'*',MatchingStrings) of
   1:    // This is the match for 'First'
   7:    // This is the match for 'Second'
   14:   // This is the match for 'Third'
   else // In this case there were no matches
   end;

 

 

unit Unit1;

interface

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

type
TForm1 = class(TForm)
    btn1: TButton;
    grp1: TGroupBox;
    rb1: TRadioButton;
    rb2: TRadioButton;
    procedure btn1Click(Sender: TObject);
private
    { Private declarations }
public
    { Public declarations }
end;

type TASK=(blue,green,black,white,maroon);

var
Form1: TForm1;

const
   Taskzhaowang:TASK=blue;
   Taskneizheng:TASK=green;

implementation

{$R *.dfm}

procedure asdf(t:task) ;
begin
case t of
     blue:
        ShowMessage('ZhaoWang:'+inttostr(Ord(t)));
     green:
        ShowMessage('NeiZhneg:'+inttostr(Ord(t)));
end;
end;

procedure TForm1.btn1Click(Sender: TObject);
begin
if(rb1.Checked) then asdf(Taskzhaowang);
if(rb2.Checked) then asdf(Taskneizheng);
end;

end.

分享到:
评论

相关推荐

    Delphi开发技巧之-字符串

    在 Case 语句中使用字符串 在Delphi中使用正规表达式 字符串左右填充字符 扩展Pos函数 改变常量值 映射字符串到指定记录 格式化字符串为CGI请求 格式化文件大小 格式化秒为hh mm ss 检查一个字符串是否为有效Email...

    Delphi中sql语句的使用总结

    在Delphi中使用SQL语句是与数据库进行交互的重要手段之一。本文将详细介绍如何在Delphi环境中构造和执行SQL查询,并给出具体的示例来帮助理解。 #### 一、基本SQL查询的构建 在Delphi中,通过`TADOQuery`组件来...

    Delphi高级Case语句应用实例..rar

    3. **类型枚举**:在Delphi中,`case`语句可以与枚举类型一起使用,方便处理特定类型的值: ```delphi type TColor = (clRed, clGreen, clBlue, clYellow); var ColorChoice: TColor; begin ColorChoice := ...

    delphi的case使用实例源码 delphi新手必看

    在Delphi编程中,`case`语句是一种重要的流程控制结构,它允许程序根据不同的条件执行不同的代码块。本篇文章将深入探讨`case`语句的使用实例,这对于Delphi新手来说是不可或缺的知识。 首先,我们需要理解`case`...

    Delphi 实现大写转小写的实例源代码.rar

    在 Delphi 编程环境中,实现字符串的大写转小写操作是常见的字符处理任务。这个实例源代码提供了直观的学习材料,让我们深入理解 Delphi 中如何处理字符串以及内存映射技术。下面将详细解释该实例涉及的关键知识点。...

    Delphi XE4 语言指南.pdf

    语句章节讲解了Delphi中的各种基本语句结构,包括赋值语句、例程调用、goto语句、复合语句、if语句、case语句、repeat语句、while语句、for语句和for-in语句。这些语句构成了Delphi程序的基础,决定了程序执行的逻辑...

    Delphi中JSon_SuperObject_使用数据集与JSON对象互转

    通过上述实现,我们能够方便地在Delphi中使用`JSon_SuperObject`组件来实现数据集与JSON之间的相互转换。这种方法不仅简化了数据传输的过程,而且提高了数据处理的灵活性和效率。对于需要频繁与Web服务交互的应用...

    Delphi XE4 语言指南

    Delphi中的语句用于执行程序的操作,包括赋值语句、例程调用、控制流程语句(如if语句、case语句、while语句、for语句)等。 7. 例程 例程是程序中的基本执行单元,可以是过程(procedure)或函数(function)。...

    delphi模拟试题6.docx

    本文总结了 Delphi 编程相关的知识点,涵盖了 Delphi 的基本概念、数据类型、变量、运算符、控制结构、函数、数组、字符串、文件输入/输出、异常处理、对象oriented 编程、数据库编程等方面。 1. Delphi 基本概念 ...

    delphi 开发经验技巧宝典源码

    0050 如何在字符串中使用单引号 32 0051 结构对象的定义与使用 32 0052 使用数组为TlistView组件动态创建字段 33 0053 解决程序的死锁问题 34 0054 怎样实现接口委托 34 0055 在Delphi中使用汇编 35 ...

    delphi课程实际说明书

    2.5 **P67 break, continue 例题**:讲解在循环中使用`break`和`continue`语句来控制循环流程。 2.6 **P67 作用域例题**:深入理解变量的作用域规则,包括局部变量、全局变量和方法参数。 2.7 **P84 例题**:可能...

    Delphi常用语法和控件用法

    6. **字符串操作**:Delphi的`String`类型是可变的,你可以直接修改字符串中的字符,例如`String[1] := 'A'`。此外,`String`类型还可以与其他控件属性兼容,如`Edit1.Text`。 7. **常用控件**:Delphi的VCL...

    delphi 开发经验技巧宝典源码06

    0050 如何在字符串中使用单引号 32 0051 结构对象的定义与使用 32 0052 使用数组为TlistView组件动态创建字段 33 0053 解决程序的死锁问题 34 0054 怎样实现接口委托 34 0055 在Delphi中使用汇编 35 ...

    delphi 将汉字翻译成拼音缩写的函数

    遍历输入字符串中的每个字符,如果是一个汉字(Unicode 编码在 #160 及以上),则计算其在 `HZCode` 数组中的位置,从而得到对应的拼音首字母。如果不是汉字,则直接保留原字符。 `GetPyFitstChar` 函数则是针对...

    Delphi程序设计习题.pdf

    13. 条件语句和循环:文档中展示了如何使用case语句来处理不同的条件分支,以及循环结构的可能使用(尽管文档中没有具体的循环示例)。 14. 变量声明和赋值:文档中展示了如何声明变量(如x1, x2, y),以及如何...

    delphi 汉字转拼音

    1. 函数接收一个字符串 `hzchar`,长度至少为两个字节,因为汉字在 Unicode 中通常由两个字节表示。 2. 使用 `case` 语句,将汉字的 Unicode 值(由 `hzchar[1]` 和 `hzchar[2]` 组成)与预定义的范围进行比较。 3. ...

    Delphi_10_Seattle_入门手册

    2. **控制结构**:掌握流程控制语句,如if-then-else、for循环和while循环,以及如何使用case语句进行多分支选择。 3. **函数与过程**:理解函数和过程的定义、调用,以及参数传递的不同方式(按值、按引用或按需)...

    Delphi 5 经典教程

    2.10.2 case语句 48 2.11 循环 49 2.11.1 for循环 49 2.11.2 while循环 49 2.11.3 repeat...until 50 2.11.4 Break()过程 50 2.11.5 Continue()过程 50 2.12 过程和函数 50 2.13 作用域 50 2.14 单元 55 2.14.1 uses...

Global site tag (gtag.js) - Google Analytics