呜~救命!谁能帮忙看看这个错误?(50)

  • 主题发起人 主题发起人 macrolen
  • 开始时间 开始时间
M

macrolen

Unregistered / Unconfirmed
GUEST, unregistred user!
//重新创建窗体procedure TFMain.NewWeb(Index_: Integer; Url: string; Sender: TWinControl);begin FormWebBrowser := TFormWebBrowser.Create(Self); FormWebBrowser.Parent := Sender; FormWebBrowser.Web.Navigate(Url); FormWebBrowser.Show; PageControlEx.ActivePageIndex := Index_;end;//最小化后释放窗体procedure TFMain.RzTrayIconMinimizeApp(Sender: TObject);var i:integer;begin for i:=FMain.ComponentCount-1 downto 0 do begin if (FMain.components is TFormWebBrowser) then FMain.components.Free; end;end;//窗体恢复的代码procedure TFMain.RestoreAppClick(Sender: TObject);begin NewWeb(0, Url, Page1); RzTrayIcon.RestoreApp;end;/////////////////////////////////////////////////////////////////////////////////动态创建的FormWebBrowser窗体中有个Webbrowser,也是动态创建的:procedure TFormWebBrowser.FormCreate(Sender: TObject);begin try Web := TWebBrowser.Create(nil); Web.Align := alClient; finally TControl(Web).Parent := Self; end;end;我用上面的方法动态创建窗体到主窗体的PageControl各个页上(PageControl上个各页是事先设好的),点击不同的按钮就创建个FormWebBrowser到一个页上。当程序最小化到托盘时释放掉他们,当主程序恢复时再重新创建。问题是频繁创建释放后有时候程序最小化后点击托盘图标想恢复时会出现错误:Access violation at address 6F206461...,有时又不会出现,是什么问题呢?
 
WEB控件只能简单玩玩。除非本身有点基础水平,懂接口,否则遇到问题,没法解决的。
 
D2007的托盘图标有问题,自己找个老点的托盘源代码就OK了
 
托盘组件我用的是Raize5.2 for D7的,有问题吗?
 
其实,这是因为不熟悉对TWinControl.SetParent造成的。例如:
代码:
TControl(Web).Parent := Self;
在SetParent以后,父总是在一个TList里维护当前的所有子,当父对象释放时,
代码:
  I := ControlCount;  while I <> 0 do  begin    Instance := Controls[I - 1];    Remove(Instance);    Instance.Destroy;    I := ControlCount;  end;
所有的子也会被同时释放。这很容易理解,就是古语说的:皮之不存,毛将存焉?所以,很明显,如果Sender先进入Destroy,有部分的FormWebBrowser被释放了两次,解决的办法:1、解除父子关系,手动创建手动释放2、全交由父来释放
 
Sender是PageControl上的TabSheet,不是动态创建的,也不想动态创建。是FMain.components.Free;前要先解除父子关系再释放么?代码该怎么改呢?
 
两个问题: 1. 为何不用Frame, 而用Form? 2. 为何最小化后需要释放窗体?
 
可能是内存释放后又重复调用了
 

Similar threads

S
回复
0
查看
906
SUNSTONE的Delphi笔记
S
S
回复
0
查看
884
SUNSTONE的Delphi笔记
S
S
回复
0
查看
1K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
911
SUNSTONE的Delphi笔记
S
后退
顶部