Delphi 系統[6]關鍵字和保留字 var、 threadvar、 const、 resourcestring、absolute
阿新 • • 發佈:2021-08-11
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 希望內容對你所有幫助,謝謝!