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、示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
{ 关于变量、常量、资源的声明 }
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:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
{ 关于 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:  

1
2
3
4
5
6
7
8
9
10
11
{ 定义一个同地址变量 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  更新时间:

posted on   滔Roy  阅读(507)  评论(0编辑  收藏  举报

编辑推荐:
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
阅读排行:
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报

导航

点击右上角即可分享
微信分享提示