如何释放根据窗体名称找到的窗体对象呢?
如何释放根据窗体名称找到的窗体对象呢?
FreeAndNil(TForm(form1)); //不报错 FreeAndNil(TForm(FindGlobalComponent(strName)))); //报错,strName为窗体名称
var strName:string;begin strName:=...;//根据用户操作来取得窗体的名称(窗体为动态创建的) Tfrom(FindGlobalComponent(strName))).free; Tfrom(FindGlobalComponent(strName))):=nil; //这句报错 left side cannot be assigned to
var f:TForm;begin f:=TForm(FindGlobalComponent(strName)); freeandnil(f);
begin
if Result^.Key = Key then
Exit
else
Result := @Result^.Next;
end;
end;
function THXHashTable.HashOf(const Key: String): Cardinal;
var
I: Integer;
begin
Result := 0;
for I := 1 to Length(Key) do
Result := ((Result shl 2) or (Result shr (SizeOf(Result) * 8 - 2))) xor
Ord(Key[I]);
end;
function THXHashTable.GetValue(key: String): Tobject;
var
P: PHashItem;
begin
P := Find(Key)^;
if P <> nil then
Result := P^.Value else
Result := nil;
end;
procedure THXHashTable.SetValue(key: String; const Value: Tobject);
var
P: PHashItem;
begin
P := Find(Key)^;
if P <> nil then
P^.Value := Value;
end;
procedure THXHashTable.Delete(const Key: String);
var
P: PHashItem;
Prev: PPHashItem;
begin
Prev := Find(Key);
P := Prev^;
if P <> nil then
begin
Prev^ := P^.Next;
Dispose(P);
end;
end;
procedure THXHashTable.InitCompentValues(funcP:TInitComponent);
var
I: Integer;
P, N: PHashItem;
begin
for I := 0 to Length(Buckets) - 1 do
begin
P := Buckets[I];
while P <> nil do
begin
N := P^.Next;
funcP(TComponent(P^.value));
P := N;
end;
end;
end;
上面的InitCompentValues 是将你自己定义 的一个对控件操作的函数传入进行处理的一个函数。
[解决办法]
答案就在8#, 还有什么好讨论的...
正常做法是在各个窗体的Close或Destroy事件,让窗体为nil,麻烦就是每个窗体都要这么写
解决办法就是采用TList来管理你的所有窗体,在Close时,让TList中对应实例的地址为0即可(即nil)
下面是例子:
... private procedure ShowForm(frm:TForm;Pfrm:TFormClass); procedure MdiFormClose(Sender: TObject; var Action: TCloseAction); { Private declarations } public { Public declarations } end;var Form1: TForm1; FList: TStringList;implementationuses unit2,unit3;{$R *.dfm}procedure TForm1.MdiFormClose(Sender: TObject; var Action: TCloseAction);var frmIndex: Integer;begin Action:=caFree; if Sender is TForm then begin frmIndex := FList.IndexOf(TForm(Sender).Name); if frmIndex >= 0 then begin PWord(FList.Objects[frmIndex])^:=0; FList.Delete(frmIndex); end; end;end;procedure TForm1.ShowForm(frm:TForm;Pfrm:TFormClass);begin if not AsSigned(frm)then begin frm:=Pfrm.Create(self); frm.OnClose:=MdiFormClose; FList.AddObject(frm.Name, @frm); end; frm.Show;end;procedure TForm1.Button1Click(Sender: TObject);begin ShowForm(Form2,TForm2);end;procedure TForm1.Button2Click(Sender: TObject);begin ShowForm(Form3,TForm3);end;initialization FList := TStringList.Create;finalization FList.Free;end.