[dws-developer] VclWrappers and Destructors (Andreas?)
Brought to you by:
hhernler,
mackermann
From: Mark <mnm...@co...> - 2004-04-15 03:16:20
|
Andreas & others, Mark here. I've been quiet, I know. I was trying to add fix the destructor issue that we discussed some time ago. Here is the problem as I see it. Any insight or direction is appreciated. Taken from dws2ClassesLib.pas: <DELPHI> TMeth_TFileStream_Create = class(TAnonymousMethod, ICallable) procedure Execute(var ExternalObject: TObject); override; end; [...] procedure TMeth_TFileStream_Create.Execute; begin //constructor TFileStream.Create(const FileName: String; Mode: Integer); if not Assigned(ExternalObject) then ExternalObject := TFileStream.Create(Info['FileName'], Info['Mode']); end; </DELPHI> The problem is that the script object's constructor implemented through the TMeth_TFileStream_Create class. The real issue is that if the instance is ALREADY created (ie. RegisterExternalObject) then we DON'T want the script object to destroy it when it scopes out. I don't have any way to add a flag to say "Yes, I want this instance auto-cleaned up." I've looked into changing some code in dws2Functions.pas for TAnonymousMethod.Call(...) to test if we are about to call a constructor and the ExternalObject goes from "nil" to "not nil" then flag the IScriptObject as needing to free the class. However, this is a nasty hack and is very ugly. I hate ugly code and I hate even more writing it! If you can point me to a better solution I would really appreciate it. I really do want to fix it the right way. It is an issue for me when you have a TFileStream and the Delphi object instance isn't freed until the Host application closes. It ends up holding locks on the file. -Mark E. |