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

时间:2021-08-11
本文章向大家介绍Delphi 系统[6]关键字和保留字 var、 threadvar、 const、 resourcestring、absolute ,主要包括Delphi 系统[6]关键字和保留字 var、 threadvar、 const、 resourcestring、absolute 使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

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

1、定义:

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

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 希望内容对你所有帮助,谢谢!

原文地址:https://www.cnblogs.com/guorongtao/p/15127044.html