1. 程式人生 > 其它 >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 希望內容對你所有幫助,謝謝!