首页 Delphi 正文
  • 本文约1532字,阅读需8分钟
  • 1126
  • 0
举报该广告
delphi嵌入python delphi for in

delphi嵌入python delphi for in

摘要

Java和C#里面的For In用起来真爽,我们Delphin也不用眼红了,从D2005起,Delphi里面也有这个功能了.


首先我们要知道哪些类型可以用For In吧,下面就是:

  • for Element in ArrayExpr do Stmt;      数组
  • for Element in StringExpr do Stmt;    字符串
  • for Element in SetExpr do Stmt;         集合
  • for Element in CollectionExpr do Stmt;   集合
  • for Element in Record do Stmt;         结构体

我们来看例子:

view source

print?

1    type
02    THuangJacky = (hjA,hjB,hjC,hjD); 
03    TJackyHuang = record
04        a,b,c:Integer; 
05    end; 
06    const
07        stringExpr='HuangJacky'; 
08        arrayExpr:array[0..5] of Integer= (1,2,3,4,5,6); 
09        setExpr:set of THuangJacky = [hjA,hjB,hjD]; 
10    procedure TForm1.FormCreate(Sender: TObject); 
11    var
12        I:Integer; 
13        C:Char; 
14        D:THuangJacky; 
15        F:TComponent; 
16    begin
17    for c in stringExpr do
18        ShowMessage(C); 
19    for i in arrayExpr do
20        ShowMessage(IntToStr(i)); 
21    for d in setExpr do
22        ShowMessage(IntToStr(Ord(d))); 
23    for F in Self do
24        ShowMessage(f.Name); 
25    end;

是不是很爽呀?哈哈,Delphi也与时俱进呀.

之前写了类助手文章中,老赵问是不是扩展方法,因为对C#没有了解到这么多,所以不知道.
那么我们在Java中要For In必须实现Iterator吧.
那么Delphi的会不会也要呢?
是的,如果我们要自己的类支持For In的话,就必须满足下面的条件:
1 必须有个公共方法GetEnumerator(),这个方法返回值是一个类,接口或者记录体.
2 上面返回的类,接口或者记录体中又必须有公共方法MoveNext(),这个方法的返回值是Boolean.
3 1中返回的类,接口或者记录体中必须有一个只读的属性Current,类型要和集合中的元素一样.

说了这么多,看个例子:

view source

    type
02      TMyIntArray = array of Integer; 
03      
04      TMyEnumerator = class
05        Values: TMyIntArray; 
06        Index:  Integer; 
07      public
08        constructor Create; 
09        function GetCurrent: Integer; 
10        function MoveNext:   Boolean; 
11        property Current:    Integer read GetCurrent; 
12      end; 
13      
14      TMyContainer  = class
15      public
16       function GetEnumerator: TMyEnumerator; 
17      end; 
18      
19    constructor TMyEnumerator.Create; 
20    begin
21      inherited Create; 
22      Values := TMyIntArray.Create(100, 200, 300); 
23      Index := -1; 
24    end; 
25      
26    function TMyEnumerator.MoveNext: Boolean; 
27    begin
28      if Index < High(Values) then
29        begin
30          Inc(Index); 
31          Result := True; 
32        end
33      else
34        Result := False; 
35    end; 
36      
37    function TMyEnumerator.GetCurrent: Integer; 
38    begin
39      Result := Values[Index]; 
40    end; 
41      
42    function TMyContainer.GetEnumerator: TMyEnumerator; 
43    begin
44      Result := TMyEnumerator.Create; 
45    end; 
46      
47    var
48      MyContainer: TMyContainer; 
49      I: Integer; 
50      
51      Counter: Integer; 
52      
53    begin
54      MyContainer := TMyContainer.Create; 
55      
56      Counter := 0; 
57      for I in MyContainer do
58        Inc(Counter, I); 
59      
60      WriteLn('Counter = ', Counter); 
61    end.

 

 

Java和C#里面的For In用起来真爽,我们Delphin也不用眼红了,从D2005起,Delphi里面也有这个功能了.


首先我们要知道哪些类型可以用For In吧,下面就是:

for Element in ArrayExpr do Stmt; 数组 for Element in StringExpr do Stmt; 字符串 for Element in SetExpr do Stmt; 集合 for Element in CollectionExpr do Stmt; 集合 for Element in Record do Stmt; 结构体
我们来看例子:

view source

print?

1    type
02    THuangJacky = (hjA,hjB,hjC,hjD); 
03    TJackyHuang = record
04        a,b,c:Integer; 
05    end; 
06    const
07        stringExpr='HuangJacky'; 
08        arrayExpr:array[0..5] of Integer= (1,2,3,4,5,6); 
09        setExpr:set of THuangJacky = [hjA,hjB,hjD]; 
10    procedure TForm1.FormCreate(Sender: TObject); 
11    var
12        I:Integer; 
13        C:Char; 
14        D:THuangJacky; 
15        F:TComponent; 
16    begin
17    for c in stringExpr do
18        ShowMessage(C); 
19    for i in arrayExpr do
20        ShowMessage(IntToStr(i)); 
21    for d in setExpr do
22        ShowMessage(IntToStr(Ord(d))); 
23    for F in Self do
24        ShowMessage(f.Name); 
25    end;

是不是很爽呀?哈哈,Delphi也与时俱进呀.

之前写了类助手文章中,老赵问是不是扩展方法,因为对C#没有了解到这么多,所以不知道.那么我们在Java中要For In必须实现Iterator吧.那么Delphi的会不会也要呢?是的,如果我们要自己的类支持For In的话,就必须满足下面的条件:1 必须有个公共方法GetEnumerator(),这个方法返回值是一个类,接口或者记录体.2 上面返回的类,接口或者记录体中又必须有公共方法MoveNext(),这个方法的返回值是Boolean.3 1中返回的类,接口或者记录体中必须有一个只读的属性Current,类型要和集合中的元素一样.

说了这么多,看个例子:

view source

   type
02      TMyIntArray = array of Integer; 
03      
04      TMyEnumerator = class
05        Values: TMyIntArray; 
06        Index:  Integer; 
07      public
08        constructor Create; 
09        function GetCurrent: Integer; 
10        function MoveNext:   Boolean; 
11        property Current:    Integer read GetCurrent; 
12      end; 
13      
14      TMyContainer  = class
15      public
16       function GetEnumerator: TMyEnumerator; 
17      end; 
18      
19    constructor TMyEnumerator.Create; 
20    begin
21      inherited Create; 
22      Values := TMyIntArray.Create(100, 200, 300); 
23      Index := -1; 
24    end; 
25      
26    function TMyEnumerator.MoveNext: Boolean; 
27    begin
28      if Index < High(Values) then
29        begin
30          Inc(Index); 
31          Result := True; 
32        end
33      else
34        Result := False; 
35    end; 
36      
37    function TMyEnumerator.GetCurrent: Integer; 
38    begin
39      Result := Values[Index]; 
40    end; 
41      
42    function TMyContainer.GetEnumerator: TMyEnumerator; 
43    begin
44      Result := TMyEnumerator.Create; 
45    end; 
46      
47    var
48      MyContainer: TMyContainer; 
49      I: Integer; 
50      
51      Counter: Integer; 
52      
53    begin
54      MyContainer := TMyContainer.Create; 
55      
56      Counter := 0; 
57      for I in MyContainer do
58        Inc(Counter, I); 
59      
60      WriteLn('Counter = ', Counter); 
61    end.

📱 扫码关注公众号

公众号二维码

扫描二维码关注我们,获取更多精彩内容
实时更新 · 干货满满

收藏

扫描二维码,在手机上阅读
评论
更换验证码
友情链接