當我將 proc 參考作為引數傳遞并想要將其分配給另一個 proc ref 變數(TMyRec.proc)時,它可能想要呼叫 proc 并分配結果......結果是一個 GPF。如何將傳遞的 proc ref 引數分配給另一個 proc ref?
示例:它只是圍繞作業播放。沒有分配為 procs 的實際任務。
單元5.pas:
unit Unit5;
interface
uses
Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls;
type
TForm5 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form5: TForm5;
implementation
{$R *.dfm}
type
TMyProc = reference to procedure ( i_ : integer );
PMyRec = ^TMyRec;
TMyRec = packed record
i : integer;
proc : TMyProc;
end;
procedure TForm5.Button1Click(Sender: TObject);
procedure createMyRec( i_ : integer; const proc_ : TMyProc );
var
pMR : PMyRec;
begin
getMem( pMR, sizeOf( TMyRec ) );
try
pMR^.i := i_;
pMR^.proc := proc_; // <--- GPF occures here
finally
FreeMem( pMR );
end;
end;
begin
createMyRec( 1, procedure ( i_ : integer ) begin end );
createMyRec( 2, procedure ( i_ : integer ) begin end );
end;
end.
單元5.dfm:
object Form5: TForm5
Left = 0
Top = 0
Caption = 'Form5'
ClientHeight = 441
ClientWidth = 624
Color = clBtnFace
Font.Charset = DEFAULT_CHARSET
Font.Color = clWindowText
Font.Height = -12
Font.Name = 'Segoe UI'
Font.Style = []
TextHeight = 15
object Button1: TButton
Left = 200
Top = 176
Width = 75
Height = 25
Caption = 'Button1'
TabOrder = 0
OnClick = Button1Click
end
end
uj5u.com熱心網友回復:
編譯器不應該嘗試呼叫該程序,因為沒有傳遞給它的輸入引數。
我懷疑真正的問題是您使用GetMem(),因為它不會將記錄的欄位初始化為零。因此,您嘗試分配給pMR^.proc它何時包含可能不是的不確定nil值。并且由于TMyProc是引擎蓋下的參考計數介面型別,編譯器嘗試Release()使用“舊”介面并崩潰。
pMR^.proc需要nil在分配給它之前。嘗試AllocMem()改用,因為它會將分配的記憶體清零。或者更好的是,New()改用。
此外,當使用GetMem()or時AllocMem(),您需要在釋放記憶體之前手動完成記錄,以便正確減少 'proc' 的參考計數以釋放匿名程序。您不必擔心這一點,New()因為Dispose()它將為您完成記錄。
嘗試這個:
procedure createMyRec( i_ : integer; const proc_ : TMyProc );
var
pMR : PMyRec;
begin
pMR := PMyRec( AllocMem( SizeOf( TMyRec ) ) );
try
pMR^.i := i_;
pMR^.proc := proc_;
finally
Finalize( pMR^ );
FreeMem( pMR );
end;
end;
或者:
procedure createMyRec( i_ : integer; const proc_ : TMyProc );
var
pMR : PMyRec;
begin
New( pMR );
try
pMR^.i := i_;
pMR^.proc := proc_;
finally
Dispose( pMR );
end;
end;
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/516715.html
標籤:德尔福
