zoukankan      html  css  js  c++  java
  • System.TPtrWrapper 指针包装器


    不知什么时候 System 单元有了 TPtrWrapper 结构体, 它提供了非常小的一点功能: 指针(Pointer)与指针地址(NativeInt)的转换.

    很显然, 以前常用的 Integer(P) 或 Ptr(Number) 已经不适用与 64 位了, 这时使用 TPtrWrapper 应该是更方便,更保险的选择.

    发现在 Delphi 新的源码中, 几乎就把 TPtrWrapper 当做指针来使用了.

    {TPtrWrapper 全功能测试}
    procedure TForm1.FormCreate(Sender: TObject);
    var
      num: Integer;
      p: Pointer;
      Address: NativeInt;
      PW1,PW2,PW3: TPtrWrapper;
      b: Boolean;
    begin
      p := @num;
    
      //建立方法 1
      PW1 := TPtrWrapper.Create(p);
      Address := PW1.ToInteger;           //ToInteger
    
      //建立方法 2
      PW2 := TPtrWrapper.Create(Address);
      PInteger(PW2.ToPointer)^ := 123;    //ToPointer
      ShowMessage(IntToStr(num)); //123
    
      //建立方法 3
      PW3 := TPtrWrapper.NilValue;
    
      //Equal 运算
      b := PW1 = PW2;
      ShowMessage(BoolToStr(b, True));
    
      //NotEqual 运算
      b := PW1 <> PW3;
      ShowMessage(BoolToStr(b, True));
    
      //作为结构的 TPtrWrapper, 其起始位置存放的就是指针
      p := Pointer(PW1);
      ShowMessage(IntToStr(PInteger(p)^)); //123
    
      //既如此, 也就可以直接把一个地址数, 或指针直接强制转换为 TPtrWrapper 了
      PW3 := TPtrWrapper(Address);
      ShowMessage(IntToStr(Integer(PW3))); //类似于 1244823
    end;
    

  • 相关阅读:
    UISegmentedControl分段控件
    手势识别器
    delegate代理设计模式
    target/action设计模式
    响应者链
    事件处理
    屏幕旋转
    混编ObjectiveC++
    AES128加密
    您不能拷贝项目“”,因为它的名称太长或包括的字符在目的宗卷上无效。
  • 原文地址:https://www.cnblogs.com/del/p/3130629.html
Copyright © 2011-2022 走看看