`

delphi中case of问题

 
阅读更多

case a of 这个的a只能是整型数字呀!您可以这样做,用ComboBox1.ItemIndex属性来做:

i:= ComboBox1..ItemIndex;
case i of
0: ADOTable1.FieldByName('pid').AsString:= '0';//对应***部
1: ADOTable1.FieldByName('pid').AsString:= '1';//对应人事部
2: ADOTable1.FieldByName('pid').AsString:= '2';//财务部
3: ADOTable1.FieldByName('pid').AsString:= '3';//技术部
----------------------------------------------
针对您的补充,回答:
问题补充:i:=ComboBox1.ItemIndex; 报错Incompatible, types:'string' and 'Integer'//没有定义i,您必须先定义i:integer;
case i of 报错Ordinal type required
0: ADOTable1.FieldByName('pid').AsString:= 1; 报错Incompatible types:'string' and 'Integer'// 用‘’把1括起来,因为是字符串的。
1: ADOTable1.FieldByName('pid').AsString:= 2; 同上// 用‘’把2括起来,因为是字符串的。
2: ADOTable1.FieldByName('pid').AsString:= 3; 同上// 用‘’把3括起来,因为是字符串的。

 

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

 

 

 

只用过几天的vb,   不知道vb怎样.


对于in来判断一个字符串是否在集合中,你可以绕一下,不用集合,使用AnsiIndexStr。

比如:
S   :=   'ABC ';
case   AnsiIndexStr(S,   [ 'ABC ',   'DEF ',   'GHI '])   of
    0:   //ABC
    ;
    1:   //DEF
    ;
    2:   //GHI
    ;
end;

in是二进制操作符,相当于test指令,相当于判断(element   and   elements)   >   0。如果允许string
作为集合的元素,那么首先集合会变成一个Variant   array,因为集合的成员已经不能用位来
表示这么简单了,这样的话,你声明一个简单集合,在不支持字符串的情况下可能只需要1个
字节,如果支持string的话,就会大得多,而且集合操作极其低速,因为要对variant   array
进行操作,要判断数组的长度,元素的类型。这当然比不上的位操作来得快,也许你到时候
又要抱怨为什么它的in操作为什么这么慢了,集合要占这么多内存,你甚至也会像这里的一
位大佬那样说,pascal太次了。

对于为什么case只接受有序类型(枚举也是有序类型),不接受其他类型如字符串,大概原因可
能和字符串不能作为集合元素的原因相同。

至于为什么不能使用:
case   Sender   of
    Button1:   stmt1;
    Button2:   stmt2;
    ...
end;
的原因,我想可能是语义问题。

如果不限制判别式为常量表达式,会导致语义二义性,
如果Button1或Button2是变量或函数调用,那么运行时,Button1和Button2有可能等值。那
么当Sender   =   Button1   =   Button2时,到底执行stmt1,   还是执行stmt2呢?

你还是可以绕一下,这样调用:

if   Sender   is   TComponent   then
    case   TComponent(Sender).Tag   of
        1:   //Button1
        ;
        2:   //Button2
        ;
        ...
    end;
当然前提是各个Button的tag是unique的。

除了二义性,还有一个是优化的问题,如果限制使用常量表达式,则代码通常较为有效一点。

像这样的语句:
case   TComponent(Sender).Tag   of
    1:   stmt1;
    3:   stmt3;
    5:   stmt5;
    ...
    n:   stmtn;
else
    stmt_else;
end;

当case分支足够长,编译的大概会像这样编指令序列:
编译器预先计算好这样一个指令偏移表:
jmp_offset[1..n]   =   (
        addr_of_stmt1   -   addr_of_stmt_else,             //for   case   1
        0                                                                 ,             //for   case   2
        addr_of_stmt3   -   addr_of_stmt_else,             //for   case   3
        0                                                                 ,             //for   case   4
        addr_of_stmt5   -   addr_of_stmt_else,             //for   case   5
        ...,
        addr_of_stmtn   -   addr_of_stmt_else               //for   case   n
);   //如果else的机会较小则可能会以addr_of_stmt1来作为基地址

register   :=   TComponent(Sender).Tag;
compare   register,   0
if   less_or_equal   then   goto   stmt_else
compare   register,   n
if   great_than   then   goto   stmt_else
goto   addr_of_stmt_else   +   jmp_offset[register]


但是允许变量判别式的话,
case   Sender   of
    Button1:   stmt1;
    Button3:   stmt3;
    Button5:   stmt5;
    ...
    ButtonN:   stmtN;
else
    stmt_else;
end;

则指令序列类似于:
register   :=   Sender;
compare   register,   button1
if   equal   then   goto   stmt1
compare   register,   button3
if   equal   then   goto   stmt3
compare   register,   button5
if   equal   then   goto   stmt5
...
compare   register,   ButtonN
if   equal   then   goto   stmtN

 

分享到:
评论

相关推荐

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

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

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

    在Delphi编程环境中,`case`语句是一种强大的控制流结构,它允许程序根据不同的条件执行不同的代码块。本教程将深入探讨`case`语句在Delphi中的高级应用,结合实际示例来帮助理解其功能和用法。 首先,我们要明白`...

    Delphi7使用case语句实现反汇编

    在Delphi7这个经典的集成开发环境中,我们可以利用其强大的 Pascal 语言特性,如 `case` 语句来实现这一功能。`case` 语句在 Delphi 中用于执行多分支选择,根据特定条件执行不同的代码块。 首先,我们需要了解 ...

    Delphi高级Case语句应用实例

    摘要:Delphi源码,数据库应用,Case用法 Delphi高级Case语句应用实例,演示如何使用Case语句打开数据表,带有SQLSERVER测试数据文件,在Database文件夹下,测试前请自行附加。 运行环境:Delphi+MSSQL

    delphi中调用 xml

    case Reader.NodeType of ntElement: // 处理开始元素 ntEndElement: // 处理结束元素 else // 处理其他类型的节点 end; end; Reader.Active := False; end; ``` 4. **XML数据绑定**:Delphi还支持XML...

    delphi编译错误中文手册

    4. **Case label outside of range of case expression**:在CASE语句中,所有的标签必须落在表达式的可能值范围内。如果标签超出了这个范围,编译器将无法确定匹配项。 5. **Circular unit reference to **:当一...

    DELPHI程序中如何判断操作系统多久没有任何操作.zip_delphi_delphi 无边框窗体常见问题

    case Message.Msg of WM_KEYDOWN, WM_KEYUP, WM_SYSKEYDOWN, WM_SYSKEYUP, WM_LBUTTONDOWN, WM_LBUTTONUP, WM_RBUTTONDOWN, WM_RBUTTONUP, WM_MBUTTONDOWN, WM_MBUTTONUP, WM_MOUSEMOVE, WM_MOUSEWHEEL: ...

    delphi面试题.doc

    14. 错误的 case 语句是 case x <= 2.0 of 0: x := 0; 1: x := 1 end,因 case 表达式类型不一致。 知识点:Delphi case 语句、类型检查 15. 循环执行次数是 6。 知识点:Delphi 循环语句、循环执行次数计算 16....

    推荐:Delphi程序员面试笔试题目《后附有答案》.pdf,这是一份不错的文件

    Delphi 中的 Case 语句可以用来实现多分支选择。例如,CASE x<=2.0 OF 0:x:=0; 1:x:=1 END; 是一个合法的 Case 语句。 15. 循环执行 Delphi 中的循环执行可以使用 WHILE 语句或 FOR 语句。例如,WHILE y; 是一个...

    delphi设计模式示例

    在软件开发中,设计模式是解决常见问题的经过验证的解决方案,它们代表了最佳实践,并且在各种编程语言中都有应用,包括Delphi。本示例将深入探讨如何在Delphi中实现和利用设计模式。 1. **单例模式**:单例模式...

    delphi多语言Demo

    case LanguageComboBox.ItemIndex of 0: ResourceStringTable1.LangID := 0; // English (United States) 1: ResourceStringTable1.LangID := 768; // French (France) // ... Add more language options here ...

    cxLookupComboBox_delphi_

    case I of 0: ShowMessage('Column1: ' + Item.Data[I].ToString); 1: ShowMessage('Column2: ' + Item.Data[I].ToString); 2: ShowMessage('Column3: ' + Item.Data[I].ToString); end; end; end else ...

    Delphi获取当前磁盘信息和磁盘空间信息

    case GetDriveType(PChar(DriveLetter + ':')) of DRIVE_UNKNOWN: Result := '未知'; DRIVE_NO_ROOT_DIR: Result := '无根目录'; DRIVE_REMOVABLE: Result := '可移动'; DRIVE_FIXED: Result := '固定'; DRIVE...

    delphi设置全局快捷键判断鼠标按键

    在Delphi编程环境中,设置全局快捷键和判断鼠标按键是两个关键功能,它们可以极大地提升应用程序的交互性和用户友好性。下面将详细讲解如何在Delphi中实现这些功能。 首先,我们来讨论如何设置全局快捷键。全局...

    delphi 图像识别技术(逐行扫描识别)

    case Str of '.ico': begin Icon := TIcon.Create; try Icon.LoadFromFile(PicFileName); Result.Handle := Icon.Handle; finally Icon.Free; end; end; '.jpg', '.jpeg': begin Jpeg1 := TJPEGImage....

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

    case FieldType of 'Integer': Fields.Add(FieldName, ftInteger, FieldSize); 'String': Fields.Add(FieldName, ftString, FieldSize); 'Blob': Fields.Add(FieldName, ftBlob, FieldSize); end; end; ...

    在Delphi中使用串口控件MSComm的0字符接收例程祥解

    case MSComm1.CommEvent of comEvReceive: begin while MSComm1.InBufferCount > 0 do // 输入 FIFO 不为空 begin str := MSComm1.Input; // 从 FIFO 中只取 1 个字符,因为 MSComm1.InputLen := 1 if str = ...

    Delphi抓取鼠标形状的源码..rar

    case Message.Msg of WM_SETCURSOR: begin if Message.WParam = HTCLIENT then begin // 设置自定义光标 Message.Result := 1; // 表示已处理该消息 end else inherited; // 其他情况交给父类处理 end; ...

    Delphi_2009_2010_XE_泛型使用全集(队_栈_字典_列表_对象列表)

    case Action of cnAdded: ShowMessageFmt('Add: %d', [Item]); cnRemoved: ShowMessageFmt('Remove: %d', [Item]); cnExtracted: ShowMessageFmt('Extract: %d', [Item]); end; end; procedure TForm1.Button1...

    delphi 热键实例

    case Message.Msg of WM_HOTKEY: begin // 这里处理热键被触发的逻辑 if Message.WParam = FHotKeyId then // 比如弹出一个消息框显示热键已被触发 ShowMessage('热键Ctrl+Shift+A已被按下'); end; end; ...

Global site tag (gtag.js) - Google Analytics