procedure TYzdjMainFM.RzGroup1Items4Click(Sender: TObject); var FrArchives:TFrArchives; OldFr:TComponent; begin FindOldFr(OldFr); if Assigned(OldFr) then FreeAndNil(OldFr); FrArchives:=TFrArchives.Create(self); FrArchives.Name:='FrArchives'; FrArchives.Parent:=RzPanel2; FrArchives.Align:=alclient; FrArchives.SetFocus; FrArchives.Show; end;
procedure TYzdjMainFM.RzGroup1Items5Click(Sender: TObject); var FrFinanReg:TFrFinanReg; OldFr:TComponent; begin FindOldFr(OldFr); if Assigned(OldFr) then FreeAndNil(OldFr); FrFinanReg:=TFrFinanReg.Create(self); FrFinanReg.Name:='FrFinanReg'; FrFinanReg.Parent:=RzPanel2; FrFinanReg.Align:=alClient; FrFinanReg.SetFocus; FrFinanReg.Show; end;
三、怎样避免内存访问错误
一是必须 FrFinanReg.SetFocus;防止子窗口焦点乱跑,这个是内嵌窗口的通病,
二是创建前必须先在内存里寻找是否有该Frame的实例,如果没有才创建。
这里必须对前面已经创建的各类Frame对象进行销毁。
Procedure TYzdjMainFM.FindOldFr(var OldFr:TComponent); begin if FindComponent('FrArchives')<>nil then OldFr:=FindComponent('FrArchives'); if FindComponent('FrFinanReg')<>nil then OldFr:=FindComponent('FrFinanReg');
private { Private declarations } public { Public declarations } procedure AfterConstruction; override; //类似OnCreate事件 procedure BeforeDestruction; override; //类型OnDestroy事件 end;
但是没有onclose。
//初始化,给DBComboBoxEh1添加下拉选项
procedure TFrArchives.AfterConstruction; var TempFdq:TFdquery; begin inherited;//这个必须写在第一句 TempFdq:=TFdquery.Create(self); TempFdq.Connection:=MainDataMd.FDConnection1; TempFdq.Open('select * from dmArchtype order by xh'); while not TempFdq.Eof do begin DBComboBoxEh1.Items.Add(TempFdq.Fields[1].asstring); TempFdq.Next; end; end;
----------------------------------------------
-
procedure CloseChildForm(Hand:THandle); var iIndex:Integer; begin for iIndex := 0 to Application.ComponentCount-1 do begin if Application.Components[iIndex] is TForm then if (Application.Components[iIndex] as TForm).Handle<>Hand then (Application.Components[iIndex] as TForm).Close; end; end;
----------------------------------------------
-