zoukankan      html  css  js  c++  java
  • 使用for in 循环数据集

    在DELPHI没有FOR IN的语法时,我们要使用如下代码枚举数据集中的每个内容:

    cds.First;
    
    while not cds.eof do begin
    
     ...
    
     cds.Next;
    
    end;
    View Code

    最少要四句,而且字数有些多.如果程序中大量使用这个,代码看起来总是不舒服.

    在DELPHI XE,可以利用XE对 FOR IN 扩展,建立新的扩展,使用起来好象有点动态语言的味道:

    unit faDataSetEx;
    
    interface
    
    uses
      DB,ADODB,Variants,SysUtils,StrUtils,Controls,System.Types,Classes,DBClient;
    
    type
    
      TFieldsEx = class helper for TFields
      private
        function GetFV (Index :String) :Variant;
        procedure SetFV (Index :String; const Value :Variant);
      public
        property FV[Index :String] :Variant read GetFV write SetFV; default;
      end;
    
      TDataSetEnumerator = class
      private
        FFirst   :boolean;
        FDataSet :TDataSet;
        function GetCurrent :TFields;
      public
        constructor Create (dataset :TDataSet);
    
        function MoveNext :boolean;
        property Current :TFields read GetCurrent;
      end;
    
      TDataSetEx = class helper for TDataSet
      public
        function GetEnumerator :TDataSetEnumerator;
      end;
    
    implementation
    
    { TDataSetEx }
    
    function TDataSetEx.GetEnumerator :TDataSetEnumerator;
    begin
      Result := TDataSetEnumerator.Create (Self);
    end;
    
    { TDataSetEnumerator }
    
    constructor TDataSetEnumerator.Create (dataset :TDataSet);
    begin
      FDataSet := dataset;
    
      FFirst := True;
    
    end;
    
    function TDataSetEnumerator.GetCurrent :TFields;
    begin
      Result := FDataSet.Fields;
    end;
    
    function TDataSetEnumerator.MoveNext :boolean;
    begin
      if FFirst then begin
        FFirst := False;
        FDataSet.First;
      end
      else
        FDataSet.Next;
    
      Result := not FDataSet.eof;
    end;
    
    { TFieldsEx }
    
    function TFieldsEx.GetFV (Index :String) :Variant;
    begin
      Result := FieldByName (Index).Value;
    end;
    
    procedure TFieldsEx.SetFV (Index :String; const Value :Variant);
    begin
      FieldByName (Index).Value := Value;
    end;
    
    end.
    faDataSetEx

    有了上面单元的代码,我们可以这样枚举数据集的每个行:

    var
      d :TFields;
    begin
      for d in cds1 do begin
        cds1.edit;
        d['a']:='abc';
        cds1.post;
      end;
    end;

    相当方便........

  • 相关阅读:
    开源协议
    markdown 语法和工具
    mac 终端 使用ftp命令
    谷歌囧大了!安统镜卓5.0刷入遇到system.img系像找不到
    linux下vi命令大全
    python编码处理:unicode字节串转成中文 各种字符串举例说明
    优秀前端资源备忘录
    mousewheel滚轮事件
    bootstrap插件之Carousel
    初识Node.js
  • 原文地址:https://www.cnblogs.com/IDELPHI/p/8497232.html
Copyright © 2011-2022 走看看