我从VC转换过来一段代码,一个消息和消息相应的操作。
首先注册消息,然后调用一函数可以进入消息相应操作,要结束消息相应时也是调用
一个函数。问题就在这,我如果在程序退出前,即在onclose操作前执行了结束消息相应
的函数则一切正常,但如果在onclose中执行这个函数则报内存地址错误。这个结束函数也会先相应消息,进入一次消息处理操作中的。但VC中就没这个现象。好奇怪!有谁帮帮忙。谢谢了
首先注册消息,然后调用一函数可以进入消息相应操作,要结束消息相应时也是调用
一个函数。问题就在这,我如果在程序退出前,即在onclose操作前执行了结束消息相应
的函数则一切正常,但如果在onclose中执行这个函数则报内存地址错误。这个结束函数也会先相应消息,进入一次消息处理操作中的。但VC中就没这个现象。好奇怪!有谁帮帮忙。谢谢了
我遇到过的情况和你类似,
我原先以为form在销毁时,肯定是先把它所有的子控件以及以它为owner的类都释放掉
但是实际情况好象并不是这样的
我以前做过一个VCL,如果拖到窗体上,程序退出时就会出错
只好在VCL里,知道它的parentform,然后在它的onclosequery里把我的vcl先释放掉,才解决
附简易代码
const
REAM_STREAM = WM_USER + 600;
在formCreatez 中注册消息
RegisterStreamNotify(Form1.Handle, REAM_STREAM); //注册消息
进入消息循环StartStream;
退出Stopstream;
就是这个Stopstream函数如果在close之前调用则无错,但如果在onclose中执行则报错。
VC中则没有此现象
const
REAM_STREAM = WM_USER + 600;
procedure TFrmMain.FormCreate(Sender: TObject);
begin
RegisterStreamNotifyMessage(Handle, REAM_STREAM);
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
StartStreamCapture;
end;
procedure TForm1.Button3Click(Sender: TObject);
begin
StopStreamCapture;//在此执行正确,如象以下方式执行则报错
end;
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
StopStreamCapture;//报错
end;
但VC中则是在 OnClose中执行的StopStreamCapture,没有错误。百思不得其解。
附:转换Delphi前的VC库
int RegisterStreamNotifyMessage(HWND hWnd,UINT nMessageID);
int StartStreamCapture;
int StopStreamCapture;
procedure TCustomForm.Close;
var
CloseAction: TCloseAction;
begin
if fsModal in FFormState then
ModalResult := mrCancel
else
if CloseQuery then
begin
if FormStyle = fsMDIChild then
if biMinimize in BorderIcons then
CloseAction := caMinimize else
CloseAction := caNone
else
CloseAction := caHide;
DoClose(CloseAction);
if CloseAction <> caNone then
if Application.MainForm = Self then Application.Terminate
else if CloseAction = caHide then Hide
else if CloseAction = caMinimize then WindowState := wsMinimized
else Release;
end;
end;StopStreamCapture是怎么操作的呢
StopStreamCapture执行也会跑到消息处理函数中进行文件的写操作及关闭操作。
我该如何在OnClose中执行StopStreamCapture且不报错呢??
各位大侠,帮帮忙,解决在另给分
这个StopStreamCapture具体是个什么样的
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
StopStreamCapture;//报错
Application.ProcessMessage;
end;