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