DLL动态链接库生成的窗体,能否在点击该窗体内的一个按钮时自动退出啊??给分!(200)

  • 主题发起人 主题发起人 asonlife
  • 开始时间 开始时间
A

asonlife

Unregistered / Unconfirmed
GUEST, unregistred user!
DLL动态链接库生成的窗体,能否在点击该窗体内的一个按钮时自动退出啊??请求帮助,绝对给分,分不够再加都行![:)]
 
重复贴啊~~
 
呵呵,比较急,发了两次,不同类目下。不要紧,两个帖子400分照给。
 
try...finally from.free这样行不行啊?
 
try.. form.ShowModal;.finally form.free;此模式适合dll中的模式窗体,如果是非模式窗体,就会出错了~~按楼主的意思,需要在主窗体加载此dll时,将此dll的句柄传回dll中,然后用FreeLibrary释放dll~~另非模式窗体的onclose事件中要写aciton:=cafree;
 
我把意思再表达一下:我使用的是封装成的FR_Report.dll,再通过FFReport.pas在Delphi中调用,感觉非常方便和顺手。但是最近有个问题,就是希望能实现弹出打印的预览窗口后,点击“打印”按钮后,该预览窗口也自动关闭掉,这样就能防止再次打印的问题。但是现在必须先点击“打印”按钮,然后再点击“关闭”按钮才能关闭掉这个预览窗口。请问有什么好的办法能解决此问题吗?我听说封装成DLL的控件很难改。也不知道这个控件是谁开发的,所以请求大家的帮助,多谢多谢再多谢!!谁使用过更要帮助帮助我哦!![:)]!
 
你的意思是在预览中点了打印之后自动关闭预览窗口吧?这个控件是有有源代码的.你把frxPreview.pas 和dfm拷到本地文件夹中,然后在以下位置加入CLOSEprocedure TfrxPreviewForm.PrintBClick(Sender: TObject);begin FPreview.Print; Enabled := True;///Close;end;然后重新编译你的DLL,然后再试一下看如何
 
TO:louemusic我用的这个控件,只有两个文件,FR_Report.dll和FFReport.pas。前者是实现打印过程的封装DLL,后者是加载和使用DLL的PAS文件。并无frxPreview.pas和dfm文件呀,我如何编译呢?听说DLL无法编译,这却是如何是好?
 
application.terminate
 
噢原来是别人封好的DLL你没有源码呀?不知道你的预览窗口用的模式窗口还是非模式窗口?
 
嗯,louemusiuc:要不我把空间打个压缩包给你,你帮我看看,行吗?如果行,请留个Email或QQ!
 
好的,25884636@QQ.COM
 
关键是别人设计程序的时候只有他自己知道何时打印完毕啊,你不知道,就不能随即关闭了!
 
to wql:并不探测何时打印的问题,只要点击了“打印”按钮,不管打印成功与否,均自动关闭预览窗口。
 
如果没有理解错误请将此文件加入到你的 uses之中unit uHackFr;interfaceuses Windows,Messages,Classes,ComCtrls,Forms;procedure HackFr;procedure UnHackFr; implementationuses SysUtils;{ TStubClass }type TStubClass=class class procedure HackClick(Sender:TObject); end;var M:TNotifyEvent; Btn:TToolButton; hk:Integer;function HookPrintB(TB:TToolBar):Boolean;var I:Integer;begin for I:=0 to TB.ControlCount-1 do if CompareStr(TB.Controls.Name,'PrintB')=0then begin Btn:=TToolButton(TB.Controls); Break; end; Result:=Btn=nil; if not Result then begin M:=TNotifyEvent(Btn.OnClick); Btn.OnClick:=TStubClass.HackClick; end;end; function EProp(h:hwnd;str:pchar;data:integer):LongBool;stdcall;begin if (data<>0) and(Btn=nil)then try Result:=HookPrintB(TToolBar(data)); except Result:=false; end;end;function CallWndProc(code,w,l:integer):integer;stdcall;var P:PCWPStruct; c:array[0..255]of char;begin if code=HC_ACTION then begin P:=Pointer(l); case P.message of WM_CREATE:begin GetClassName(P.hwnd,c,255); if SameText(c,'TToolBar')then begin Btn:=nil; EnumProps(P.hwnd,@EProp); end; end; end; end else result:=CallNextHookEx(hk,code,w,l);end;class procedure TStubClass.HackClick(Sender: TObject);begin TNotifyEvent(M)(Btn); TForm(Btn.Owner).Close;end;procedure HackFr;begin hk:=SetWindowsHookEx(WH_CALLWNDPROC,@CallWndProc,HInstance,GetCurrentThreadId);end;procedure UnHackFr;begin UnhookWindowsHookEx(hk);end;initialization HackFr;finalization UnHackFr;end.
 
好,我试试看,谢谢你!
 
to:louemusic您好,感谢您帮我,不过我按照您的以上语句,添加到use中,点击预览窗口的打印按钮时,半天没有反映,好些死机,等待了大概4分钟左右,提示如下错误:Project E:/ku/yhbys.exe faulted with message: 'access violation at 0x7c92eddc:write of address 0x00040e74'. Process Stopped. Use Step or Run to continue.请问是何原因,您调试是好的吗?[:)]
 
我调试是好的,你可以建一个空工程加载那个DLL和这个PAS文件试一下会不会报错呢
 
或者,在FR_FileReport('*.fr3',al,vars,false);之前加入HackFr,在FR_FileReport之后加入UnHackFr.然后把 uHackFr.pas中的Initialization 和 finalization去掉试试看
 
louemusic:昨天我按照你的方法均测试过,还是报错,包括新建个工程,也一样。能否把你的源代码发给我,我参谋参谋呢?我的Email: asonsoft@126.com
 
后退
顶部