2

このスクリプトを想像してみてください。

var s = TStrings.Create;
s.Add('Line 1');
s.Add('Line 2');

procedure MyProc;
begin
  if s.count = 2 then
  // ...
end;

スクリプトを実行すると、変数「s」が作成されます。スクリプトが完了した後、「MyProc」を呼び出したいと思います。

...
Exec := Program.CreateNewExecution;
Exec.BeginProgram;
Exec.RunProgram(0);
if Exec.ProgramState in [psRunning, psRunningStopped] then
begin
  Func := Exec.Info.Func['MyProc']; 
  Func.Call([]);
  Exec.EndProgram; 
end;

MyProcから「s」にアクセスするとエラーが発生します。DWSのガベージコレクターはすでに文字列リストを解放したと思います。これは正しいですか?「s」を存続させるために何かできることはありますか?

4

1 に答える 1

2

EndProgram を呼び出す前に、その変数をクリーンアップしないでください。

問題を説明できることの 1 つは、最初にスクリプトがエラーなしでコンパイルされなかった場合です (Program.Msgs を確認すると、エラーが含まれているはずです)。

于 2011-05-19T13:35:57.397 に答える