• Delphi 系统[6]关键字和保留字 var、 threadvar、 const、 resourcestring、absolute


    Delphi 系统[6]关键字和保留字 var、 threadvar、 const、 resourcestring、absolute  

    1、定义:

    • var :声明变量,或者声明函数的参数为传址参数。
    • const :声明常量,或者声明函数的参数为常量参数。
    • resourcestring :声明资源字符串。
    • threadvar :声明一个线程内变量,此变量仅供各个线程内部使用。如果在线程外初始化该变量,则初始化的内容不会被传入线程内,当线程创建时,该变量为空,且被认为是线程内的私有变量,与线程外的该变量互不干扰,与其它线程内的该变量也互不干扰。
      • threadvar 必须声明为全局变量,然后在各个线程内使用。
      • 在线程内使用的 threadvar 必须在线程结束前手动释放其占用的空间。
      • 比如 S := ''; 即将字符串资源释放。关于资源释放,Delphi 没有更多解释。
    • absolute :定义一个变量与另一个变量地址相同。您可以创建与另一个变量位于同一地址的新变量。为此,在新变量的声明中,将指令absolute放在类型名称之后,后跟现有(先前声明的)变量的名称。

    2、示例:

    { 关于变量、常量、资源的声明 }
    procedure TForm1.Button1Click(Sender: TObject);
    resourcestring
      rsBCap = '测试TaoRoy(&G)';     { 声明资源字符串 }
    const
      conMax = 10;   { 声明常量 }
    var                     {声明变量 }
      iNum: Integer;
      bFlag: Boolean;
    begin
      Button1.Caption := rsBCap;
      
      Randomize;   //初始化
      iNum := Random(11);
      bFlag := iNum >= conMax;
      Caption := IntToStr(iNum) + ' - ' + BoolToStr(bFlag, True);
    end;

     threadvar:

    { 关于 threadvar 和 var}
    unit Form1Unit;
    interface
    uses
      Windows, Messages, SysUtils, Variants,
      Classes, Graphics, Forms, Dialogs, StdCtrls;
    type
      TForm1 = class(TForm)
        Button1: TButton;
        procedure Button1Click(Sender: TObject);
      private
        { Private declarations }
      public
        { Public declarations }
      end;
    var
      Form1: TForm1;
    implementation
    {R   *.DFM} 
    { NOTE: 将GlobalStr 的定义由 var 改为 threadvar 来观察不同 } 
    var { 线程内外共用此变量 } 
    // threadvar  { 线程内将创建此变量的一个副本,线程内外此变量互不干扰 } 
      GlobalStr: string; 
    type 
      TTLSThread = class(TThread) 
      private 
        FNewStr: String; 
      protected 
        procedure Execute; override; 
      public 
        constructor Create; overload; 
        constructor Create(const ANewStr: String); overload; 
      end; 
     
    procedure SetShowStr(const S: String; const sTitle: string = ''); 
    begin 
      if S = '' then 
        MessageBox(0,
    PChar(GlobalStr), PChar(sTitle), MB_OK) 
      else 
        GlobalStr := S; 
    end; 
     
    constructor TTLSThread.Create; 
    begin 
      inherited Create(False); 
    end; 
     
    constructor TTLSThread.Create(const ANewStr: String); 
    begin 
      FNewStr := ANewStr; 
      inherited Create(False); 
    end; 
     
    procedure TTLSThread.Execute; 
    begin 
      FreeOnTerminate := True; 
      SetShowStr(FNewStr); 
      SetShowStr('', '线程内 - 线程执行时'); 
    end; 
     
    procedure TForm1.Button1Click(Sender: TObject); 
    begin 
      SetShowStr('线程外的 GlobalStr 变量'); 
      SetShowStr('', '线程外 - 线程创建前'); 
     
      TTLSThread.Create('线程内的 GlobalStr 若为 threadvar 类型,则与线程外的GlobalStr 无关'); 
      Sleep(100); 
     
      SetShowStr('', '线程外 - 线程创建后,观察GlobalStr 在线程内外是否不同'); 
    end; 
     
    end. 
    

    absolute:  

    { 定义一个同地址变量 absolute } 
    { 下面的代码声明了变量sLen 的起始地址与 ShortStrig 型变量 sStr相同,由于 ShortString 的第 0 个位置保存了字符串的长度,所以 sLen 的值即为字符串的长度值。 } 
    {注意:不能在 absolute 声明中初始化变量,也不能将 absolute 与任何其他指令组合。}
    procedure TForm1.Button1Click(Sender: TObject); 
    var 
      sStr: ShortString; 
      sLen: Byte absolute sStr; 
    begin 
      sStr := '1234567890'; 
      Caption := IntToStr(sLen);   //输出:10
    end; 
    

      

     

    创建时间:2021.08.11  更新时间:

    博客园 滔Roy https://www.cnblogs.com/guorongtao 希望内容对你所有帮助,谢谢!
  • 相关阅读:
    Unity周记: 2020.09.07-09.13
    Unity周记: 2020.08.31-09.06
    CF1060F Shrinking Tree
    洛谷P6783 [Ynoi2008] rrusq
    洛谷P5644 [PKUWC2018] 猎人杀
    洛谷P1587 [NOI2016] 循环之美
    洛谷P4466 [国家集训队] 和与积
    集合幂级数杂题
    Flink基础(49):FLINK SQL(25) 内置函数(七)表值函数
    Flink基础(48):FLINK SQL(24) 内置函数(六)条件函数
  • 原文地址:https://www.cnblogs.com/guorongtao/p/15127044.html
Copyright © 2020-2023  润新知