• Delphi中的匿名方法


    Delphi及C++ Builder中底层的匿名方法及泛型

    目录

    Delphi及C++ Builder中底层的匿名方法及泛型

    1、System.SysUtils

    2、System.Classes

    3、System

    本客户相关博文,喜欢的就点个赞,鼓励我的原创技术写作:


            在js的世界里,基本就是大量的“回调”和“异步”函数,剩下的就是按照顺序执行的javascript代码,所以总的来说,js中无“同步模型”。正是因为如此,javascript在运行时没有“多余的”线程,它们都在同一个“线程”中工作。

           比如,任何第三方平台,凡是其API-Proxy代理服务器向你“代理转发(重定向)URL”,其响应结果,要么你在浏览器的导航器的地址栏中去取(Navigator.Location),要么你在响应头的redirect参数中去取,它们,都是异步的。

           Delphi及C++ Builder中,可以在发http请求时,传入一个“泛型的匿名方法”或“匿名的事件处理函数”的回调方法,在线程的“同步函数”中,调用该“回调”方法。得到“异步请求”的结果,并用此回调方法对该结果进行处理。

           Delphi及C++ Builder的世界里,有太多太多的处理机制,底层的构造,罗列如下,以期在不同的应用场景,进行灵活使用:

    1、System.SysUtils

    通用的匿名方法的定义描述类型:

    // Generic Anonymous method declarations
    type

      // 匿名方法:
      TProc = reference to procedure;
      TProc = reference to procedure (Arg1: T);
      TProc = reference to procedure (Arg1: T1; Arg2: T2);
      TProc = reference to procedure (Arg1: T1; Arg2: T2; Arg3: T3);
      TProc = reference to procedure (Arg1: T1; Arg2: T2; Arg3: T3; Arg4: T4);

      // 匿名函数:

      TFunc = reference to function: TResult;
      TFunc = reference to function (Arg1: T): TResult;
      TFunc = reference to function (Arg1: T1; Arg2: T2): TResult;
      TFunc = reference to function (Arg1: T1; Arg2: T2; Arg3: T3): TResult;
      TFunc = reference to function (Arg1: T1; Arg2: T2; Arg3: T3; Arg4: T4): TResult;

      // 匿名断言:

      TPredicate = reference to function (Arg1: T): Boolean;

    通用方法指针:

    /* Generic procedure pointer */

      TProcedure = procedure;

    2、System.Classes

    标准事件类型:

    /* Standard events */
    type
      TNotifyEvent = procedure(Sender: TObject) of object;
      TGetStrProc = procedure(const S: string) of object;

    我加的,自定义事件类型的描述模型:

      TCustomizeEvent = procedure(const aString:string; aClassObject:TObject) of Object;

    // 比如,线程类中的带类事件标识字符串、类的参数的事件类型

    // 另:除这两个参数以外,还可以有N个泛型参数

    带线程(线程ID、事件或强制队列处理、线程方法及过程)的匿名方法:

    TOnSynchronizeProc = reference to procedure (AThreadID: TThreadID; var AQueueEvent: Boolean; var AForceQueue: Boolean; var AMethod: TThreadMethod; var AProcedure: TThreadProcedure); 

    线程结构体(记录)及其指针的描述模型:

    type
        PSynchronizeRecord = ^TSynchronizeRecord;
        TSynchronizeRecord = record
          FThread: TObject;
          FMethod: TThreadMethod;
          FProcedure: TThreadProcedure;
          FSynchronizeException: TObject;
          FExecuteAfterTimestamp: Int64;
          procedure Init(AThread: TObject; const AMethod: TThreadMethod); overload;
          procedure Init(AThread: TObject; const AProcedure: TThreadProcedure); overload;
        end;

    任意线程(包括主线程、子线程、嵌套的线程)或类的方法:

    /* TThread */

    线程或类的匿名(的隐形)事件:

      TThreadMethod = procedure of object; // 隐式地包含了aClassObject:TObject事件参数

    线程中的匿名方法或类中的匿名方法(的指针):

      TThreadProcedure = reference to procedure;

    3、System

    方法类型的通用指针记录(以指针为字段的结构体)及其指针:


      PMethod = ^TMethod;
      TMethod = record
        Code, Data: Pointer;
      public
        class operator Equal(const Left, Right: TMethod): Boolean; inline;
        class operator NotEqual(const Left, Right: TMethod): Boolean; inline;
        class operator GreaterThan(const Left, Right: TMethod): Boolean; inline;
        class operator GreaterThanOrEqual(const Left, Right: TMethod): Boolean; inline;
        class operator LessThan(const Left, Right: TMethod): Boolean; inline;
        class operator LessThanOrEqual(const Left, Right: TMethod): Boolean; inline;
      end; 

    泛型的动态数组 :

    TArray = array of T;

    枚举及泛型枚举接口及其泛型比较接口的描述模型:


      IEnumerator = interface(IInterface)
        function GetCurrent: TObject;
        function MoveNext: Boolean;
        procedure Reset;
        property Current: TObject read GetCurrent;
      end;

      IEnumerable = interface(IInterface)
        function GetEnumerator: IEnumerator;
      end;

      IEnumerator = interface(IEnumerator)
        [HPPGEN('virtual T __fastcall GetCurrentT(void) = 0')]
        function GetCurrent: T;
        [HPPGEN('__property T Current = {read=GetCurrentT}')]
        property Current: T read GetCurrent;
      end;

      IEnumerable = interface(IEnumerable)
        [HPPGEN('virtual System::DelphiInterface > __fastcall GetEnumeratorT(void) = 0')]
        function GetEnumerator: IEnumerator;
      end;

      IComparable = interface(IInterface)
        function CompareTo(Obj: TObject): Integer;
      end;

      IComparable = interface(IComparable)
        function CompareTo(Value: T): Integer;
      end;

      IEquatable = interface(IInterface)
        function Equals(Value: T): Boolean;
      end;
     

    New一个任意(结构体的)指针:

    var
      SyncProc: TSyncProc;         // : record
      SyncProcPtr: PSyncProc;    // : ^SyncProc

    New(SyncProcPtr)

    本客户相关博文,喜欢的就点个赞,鼓励我的原创技术写作:

    1.《软件的基本是要处理好”算法“及其基础(一)流-字-字符(包括某个数字、字母、符号和某个汉字等)-字符串-字节动态数组-字节-整数之间的转化关系和算法》

    2.《软件的基本是要处理好”算法“及其基础(二)delphi系统原子函数及方法》

    3.《软件的基本是要处理好”算法“及其基础(三)delphi 10.4.1字符串工具单元及其函数》

    4.《时间、计时相关方法之 -软件的基本是要处理好”算法“及其基础(四)》

    5、《delphi异步与javascript》 ​​​​​​​

  • 相关阅读:
    IPV6的内容
    雷达传感器感应模块,人体存在感控方案,助力产品智能化触发联动
    企业风险管理策略终极指南
    如何开发一款基于 vite+vue3 的在线表格系统(下)
    Mysql_13 事务
    C语言学生成绩管理系统
    第七章集合与字典作业
    Error: Google Play requires that apps target API level 26 or higher. 两种解决办法
    17.应用负载压力测试
    vue中使用swiper的时候第二轮事件不会触发
  • 原文地址:https://blog.csdn.net/pulledup/article/details/128165650