无意中到了VCL的下面部分,有几个写法不明白(是写法不明白,我没想分析VCL,就算是一小段也太复杂了)。procedure TBitBtn.SetKind(Value: TBitBtnKind);
begin
  if Value <> FKind then
  begin
    if Value <> bkCustom then
    begin
      Default := Value in [bkOK, bkYes];
      Cancel := Value in [bkCancel, bkNo];      if ((csLoading in ComponentState) and (Caption = '')) or
        (not (csLoading in ComponentState)) then
      begin
        if BitBtnCaptions[Value] <> nil then
          Caption := LoadResString(BitBtnCaptions[Value]);
      end;      ModalResult := BitBtnModalResults[Value];
      TButtonGlyph(FGlyph).Glyph := GetBitBtnGlyph(Value);
      NumGlyphs := 2;
      FModifiedGlyph := False;
    end;
    FKind := Value;
    Invalidate;
  end;
end;哎,水平太初级了,上面有一句
Default := Value in [bkOK, bkYes]; 其中 Value in [bkOK, bkYes] 是什么写法,我只见过 IF VALUE IN [X,Y] 这样的,是不是Value in [bkOK, bkYes] 直接得到一个BOOLEAN的值?哎我一般也就写成IF VALUE IN [X,Y]真没想到还可以那样写。另外找到有下面定意,这个是WINDOWS规定的么?再接着CTRL+MOUSECLICK就没有了。
TBitBtnKind = (bkCustom, bkOK, bkCancel, bkHelp, bkYes, bkNo, bkClose,
    bkAbort, bkRetry, bkIgnore, bkAll);
我不明白的是()里的这些值,是WINDOWS系统本身这么规定的还是DELPHI里特有的写法,那如果是DELPHI规定的,最终与OS接触时怎么处理的,因为OS是用C写的,这些值一定不叫bkCustom, bkOK, bkCancel 那是由哪处理的呢?我们能找到源头么?像在VCL源码里找一样。

解决方案 »

  1.   

    Value in [bkOK, bkYes]是个布尔表达式,返回一个布尔值,当然可以将它赋给布尔类型的变量;
    TBitBtnKind = (bkCustom, bkOK, bkCancel, bkHelp, bkYes, bkNo, bkClose,bkAbort, bkRetry, bkIgnore, bkAll)是定义枚举类型
      

  2.   

    Default := Value in [bkOK, bkYes];
    意思相当于:
    if Value in [bkOK, bkYes] Then
      Default := True
    Else
      Default := False;
      

  3.   

    VCL自己封装了很多东西,上面那个枚举定义就是一个例子。Value in [...] 是集合的写法。[...]表示集合,这个不是定义。Value和集合中的数据类型是一样的。in 是运算符,检查元素是否是集合中的一项。另外,类似的还有:if Answer in ['y', 'Y'] then ...if (i in [0..9]) then ...if (c in ['a'..'z', 'A'..'Z', '_']) then ...后面两种是结合了“子界”的写法。