Kingwolves

Impossible is nothing ...

星期二, 四月 18, 2006

Delphi 2006 (For In语句) 详解

在Delphi 2005就已经加入了For element in collection do statement语法,可以用来历遍一个集合、数组等等,下面这个是For in 支持的类型:


  • Classes.TList
  • Classes.TCollection
  • Classes.TStrings
  • Classes.TInterfaceList
  • Classes.TComponent
  • Menus.TMenuItem
  • ActnList.TCustomActionList
  • DB.TFields
  • ComCtrls.TListItems
  • ComCtrls.TTreeNodes
  • ComCtrls.TToolBar



  • 首先来看一个简单的例子:

    procedure ShowListStr(StrList: TStrings);
    var
    tmpStr: String;
    begin
    for tmpStr in StrList do
    ShowMessage(tmpStr); //这样就可以历遍整个SrList的值了,比以前用for i to do 快了很多吧
    end;
    再看看这个:(数组历遍)
    type
     TIntArray = array[0..9] of Integer;
     TGenericIntArray = array of Integer;

    var
     IntArray1: array[0..9] of Integer = (1, 2, 3, 4, 5, 6, 7, 8, 9, 10);
     IntArray2: array[1..2] of TIntArray = ((11, 12, 13, 14, 15, 16, 17, 18, 19, 20),
                        (21, 22, 23, 24, 25, 26, 27, 28, 29, 30));
     IntArrayTemp: TIntArray;
     IGenericIntArray: TGenericIntArray;
     i: integer;
    begin
     for i in IntArray1 do
     begin
      ShowMessage(IntToStr(i)); //这样便可以历遍这个数组,不用再用for High Low等等函数了
     end;

     for i in IntArray2 do //多维数组的历遍
      for i in IGenericIntArray do
      begin
       ShowMessage(IntToStr(i));
      end;
    end;

    看了后是不是觉得历遍一个数组比以前方便多了.
    再看看For in 在字符串中的应用:
    var
     C: Char;
     Str1,Str2: String;
    begin
     Str1 := 'Hello Everybody,I am Kevin...';
     Str2 := '';
     for C in S1 do
    //这样就已经历遍了一个字符串,并进行了拆解...
      Str2 := Str2 + C;

     if Str1 = Str2 then
      ShowMessage('Success!');
    end;

    再看看如何历遍集合型的数据类型的:
    type
     TMyThing = (one, two, three);
     TMySet = set of TMyThing;
     TCharSet = set of Char;
    var
     MySet: TMySet;
     MyThing: TMyThing;
     CharSet: TCharSet;
     C: Char;
    begin
     MySet := [one, two, three];
     for MyThing in MySet do
    //历遍集合
     begin
     // 做相关的处理
     end;

     CharSet := [#0..#255];
     for C in CharSet do
     begin
     // 做相关的处理
     end;
    end.

    下面这个更加有用,历遍类
    这个类必须实现一个公用的方法为:GetEnumerator(),此方法返回的是一个类.而另一个类必须实现一个公用的方法为:MoveNext()和一个名为Current的属性.方法返回类型为Boolean;看例子:
    type
     TMyIntArray = array of Integer;

     TMyEnumerator = class
      Values: TMyIntArray;
      Index: Integer;
     public
      constructor Create;
      function GetCurrent: Integer;
      function MoveNext: Boolean; //这个为实现的MoveNext方法
      property Current: Integer read GetCurrent;
    end;

    TMyContainer = class
     public
     function GetEnumerator: TMyEnumerator; //这个为实现的GetEnumerator的方法.
    end;

    constructor TMyEnumerator.Create;
    begin
     inherited Create;
     Values := TMyIntArray.Create(100, 200, 300);
     Index := -1;
    end;

    function TMyEnumerator.MoveNext: Boolean;
    begin
    if Index < High(Values) then
    begin
    Inc(Index);
    Result := True;
    end
    else
    Result := False;

    end;

    function TMyEnumerator.GetCurrent: Integer;
    begin
    Result := Values[Index];
    end;
    function TMyContainer.GetEnumerator: TMyEnumerator;
    begin
    Result := TMyEnumerator.Create;
    end;

    var
     MyContainer: TMyContainer;
     I: Integer;
     Counter: Integer;
    begin
     MyContainer := TMyContainer.Create;

     for I in MyContainer do //历遍,并把TMyEnumerator的Current进行累加...
     Inc(Counter, I);

     ShowMessage(IntToStr(Counter)); //值为600
    end.
    从上面可以看到通过Current就可以实现很大功能了,我们只需把Current的类型变一个,就可以做到很方便的功能.
    总结,从For In语法看到,可以给我们编码时带来很多方便...


    0 条评论:

    发表评论

    订阅 博文评论 [Atom]

    << 主页