zoukankan      html  css  js  c++  java
  • 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 希望内容对你所有帮助,谢谢!
  • 相关阅读:
    斐波那契数列 的两种实现方式(Java)
    单链表反转
    单链表合并
    两个有序list合并
    list去重 转载
    RemoveAll 要重写equals方法
    Java for LeetCode 138 Copy List with Random Pointer
    Java for LeetCode 137 Single Number II
    Java for LeetCode 136 Single Number
    Java for LeetCode 135 Candy
  • 原文地址:https://www.cnblogs.com/guorongtao/p/15127044.html
Copyright © 2011-2022 走看看