全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:1337
推到 Plurk!
推到 Facebook!

webbrowser 与Dbgrid不兼容

尚未結案
zhuangquanmin
一般會員


發表:5
回覆:6
積分:2
註冊:2005-04-13

發送簡訊給我
#1 引用回覆 回覆 發表時間:2005-05-21 14:38:55 IP:220.162.xxx.xxx 未訂閱
小弟在一窗口中放下一个Dbgrid和一个Webbrowser,运行过程中,只要在Webbrowser上点击过一次,然后点击Dbgrid,Dbgrid未能获得焦点,点击其他控件一切正常,请高手帮忙,已经搞了三天了,还没解决。 發表人 - zhuangquanmin 於 2005/05/21 22:53:21
wameng
版主


發表:31
回覆:1336
積分:1188
註冊:2004-09-16

發送簡訊給我
#2 引用回覆 回覆 發表時間:2005-05-24 12:17:20 IP:61.222.xxx.xxx 未訂閱
會出現這個原因,主要是 TWebBrowser 的Bug 。 他多重繼承了TWinControl 卻不處理 TControl 類的 Focus。 導致 DBGrid 在判斷自己是否為 Focused 狀態出了問題。 瞭解了原因後,要解決就容易許多。 1. 修改 DBGrid 越過檢查 AcquireFocus 2. 在DocumentComplete事件重新確認Focus的處理。 procedure TForm1.WebBrowser1DocumentComplete(Sender: TObject; const pDisp: IDispatch; var URL: OleVariant); begin WebBrowser1.SetFocus; end; 使用這個方法,或需有時仍會。主要是時機的不同。 參考 ~~~~~~~~~~~ 難得聰明,常常糊塗。 ~~~~~~~~~~~
zhuangquanmin
一般會員


發表:5
回覆:6
積分:2
註冊:2005-04-13

發送簡訊給我
#3 引用回覆 回覆 發表時間:2005-05-26 20:40:19 IP:220.162.xxx.xxx 未訂閱
谢谢大哥,我已经参照以下代码,重写一个新的控件解决了这个问题,但不知还有没有更好的办法。这段代码对跟我遇到同样问题的人有帮助。 unit FixedDBGrid; interface uses Winprocs,wintypes, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, Grids, DBGrids; type TFixedDBGrid = class(TDBGrid) private { Private declarations } protected { Protected declarations } public { Public declarations } procedure WMRButtonDown(var Message: TWMRButtonDown); message WM_RBUTTONDOWN; procedure WMLButtonDown(var Message: TWMLButtonDown); message WM_LBUTTONDOWN; published { Published declarations } end; procedure Register; implementation procedure TFixedDBGrid.WMRButtonDown(var Message: TWMRButtonDown); begin winprocs.SetFocus(handle); {remember that winprocs in Delphi 1 only!} inherited; end; procedure TFixedDBGrid.WMLButtonDown(var Message: TWMLButtonDown); begin winprocs.SetFocus(handle); {remember that winprocs in Delphi 1 only!} inherited; end; procedure Register; begin RegisterComponents('Samples', [TFixedDBGrid]); end; end.
pcernet
初階會員


發表:69
回覆:113
積分:41
註冊:2002-11-29

發送簡訊給我
#4 引用回覆 回覆 發表時間:2005-05-27 09:07:21 IP:61.218.xxx.xxx 未訂閱
這個問題板上已經有兩篇以上的文章了! 但好像都沒有人提出完整可行的源碼! unit FixedDBGrid; interface uses Winprocs,wintypes, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, Grids, DBGrids; type TFixedDBGrid = class(TDBGrid) private { Private declarations } protected { Protected declarations } public { Public declarations } procedure WMRButtonDown(var Message: TWMRButtonDown); message WM_RBUTTONDOWN; procedure WMLButtonDown(var Message: TWMLButtonDown); message WM_LBUTTONDOWN; published { Published declarations } end; procedure Register; implementation procedure TFixedDBGrid.WMRButtonDown(var Message: TWMRButtonDown); begin winprocs.SetFocus(handle); {remember that winprocs in Delphi 1 only!} inherited; end; procedure TFixedDBGrid.WMLButtonDown(var Message: TWMLButtonDown); begin winprocs.SetFocus(handle); {remember that winprocs in Delphi 1 only!} inherited; end; procedure Register; begin RegisterComponents('Samples', [TFixedDBGrid]); end; end. 僅供參考!
pcernet
初階會員


發表:69
回覆:113
積分:41
註冊:2002-11-29

發送簡訊給我
#5 引用回覆 回覆 發表時間:2005-06-01 10:09:05 IP:61.218.xxx.xxx 未訂閱
unit FixedDBGrid; interface uses Winprocs,wintypes, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, Grids, DBGrids; type TFixedDBGrid = class(TDBGrid) private { Private declarations } protected { Protected declarations } public { Public declarations } procedure WMRButtonDown(var Message: TWMRButtonDown); message WM_RBUTTONDOWN; procedure WMLButtonDown(var Message: TWMLButtonDown); message WM_LBUTTONDOWN; published { Published declarations } end; procedure Register; implementation procedure TFixedDBGrid.WMRButtonDown(var Message: TWMRButtonDown); begin winprocs.SetFocus(handle); {remember that winprocs in Delphi 1 only!} inherited; end; procedure TFixedDBGrid.WMLButtonDown(var Message: TWMLButtonDown); begin winprocs.SetFocus(handle); {remember that winprocs in Delphi 1 only!} inherited; end; procedure Register; begin RegisterComponents('Samples', [TFixedDBGrid]); end; end. 將上面源碼存成.pas,安裝Component。 加入元件之後,程式是將控件註冊在Samples,在Samples找到FixedDBGrid直接當成DBGrid使用即可! 應該可以,再不行的話建議用ExpressQuantumGrid.Suite控件,保證可以,但是編譯之後,執行檔大了三倍。
系統時間:2024-06-29 17:04:58
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!