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

AfterScroll事件重復執行

答題得分者是:yorkland
double9999
一般會員


發表:8
回覆:12
積分:4
註冊:2004-12-09

發送簡訊給我
#1 引用回覆 回覆 發表時間:2005-02-25 17:29:06 IP:218.79.xxx.xxx 未訂閱
各位大大,在下有禮了 開發環境windows xp delphi7 Sql server 2000,使用delphi的ClientDataSet控件,用cxGrid來顯示數據, 問題:我們在ClientDataSet的AfterScroll中寫了代碼,但在formShow的時候,該代碼就被多次(= 記錄條數 4)調用,用call stack來debug,誰來調用了這段代碼,沒有發現調用者,估計可能是cxDataControl, 各位大大有什麽指教? 發表人 - double9999 於 2005/02/25 17:32:38
yorkland
高階會員


發表:2
回覆:138
積分:108
註冊:2004-12-17

發送簡訊給我
#2 引用回覆 回覆 發表時間:2005-02-25 18:27:08 IP:220.130.xxx.xxx 未訂閱
我想cxGrid在逐行繪製內容時, 應該是得動用到AfterScroll的程序吧。
P.D.
版主


發表:571
回覆:3881
積分:3666
註冊:2006-10-31

發送簡訊給我
#3 引用回覆 回覆 發表時間:2005-02-25 23:21:41 IP:61.71.xxx.xxx 未訂閱
引言: 各位大大,在下有禮了 開發環境windows xp delphi7 Sql server 2000,使用delphi的ClientDataSet控件,用cxGrid來顯示數據, 問題:我們在ClientDataSet的AfterScroll中寫了代碼,但在formShow的時候,該代碼就被多次(= 記錄條數 4)調用,用call stack來debug,誰來調用了這段代碼,沒有發現調用者,估計可能是cxDataControl, 各位大大有什麽指教? 發表人 - double9999 於 2005/02/25 17:32:38
不知道你onshow時的程式碼有做何種動作 我記憶中, open會觸發一次, .first 也會觸發一次
StrongLemon
高階會員


發表:10
回覆:166
積分:105
註冊:2004-04-18

發送簡訊給我
#4 引用回覆 回覆 發表時間:2005-02-26 05:00:37 IP:211.74.xxx.xxx 未訂閱
您好:回答如下 1.如果你有source 請修正下面這段
cxDBData.pas    procedure TcxDBDataController.LoadStorage;
var
  OldBeforeScroll:TDataSetNotifyEvent;/930804
  OldAfterScroll:TDataSetNotifyEvent;//930804 當然你也可以加入其他DataSet不想觸發的事件,但必須避免有其他影響
begin
  //930804
  OldBeforeScroll:=nil;
  OldAfterScroll:=nil;
  if Assigned(DataSet) then
  begin
    OldBeforeScroll:=DataSet.BeforeScroll;
    OldAfterScroll:=DataSet.AfterScroll;
    DataSet.BeforeScroll:=nil;
    DataSet.AfterScroll:=nil;
  end;
  //930804
  SaveKeys;
  try
    inherited LoadStorage;
    Provider.ResetPostLocateFlag;
  finally
    RestoreKeys;
    //930804
    if Assigned(DataSet) then
    begin
      DataSet.BeforeScroll:=OldBeforeScroll;
      DataSet.AfterScroll:=OldAfterScroll;
      OldBeforeScroll:=nil;
      OldAfterScroll:=nil;
    end;
    //930804
  end;
end;
2.沒有source時 請宣告一個LockCount:Integer; 初始值LockCount:=0 在不想觸發事件處加入
procedure TForm1.SQLQuery1AfterScroll(DataSet: TDataSet);
begin
  if LockCount>0 then exit;
end;
在做某事不想觸發該事件
Inc(LockCount);
try
  //do something
finally
  Dec(LockCount);
  //最後如果你想要執行AfterScroll事件,那就
  SQLQuery1AfterScroll(SQLQuery1); 
end;
3.或者也可以這樣寫
var
  OldBeforeScroll:TDataSetNotifyEvent;
  OldAfterScroll:TDataSetNotifyEvent;
begin
  OldBeforeScroll:=SQLQuery1.BeforeScroll;
  OldAfterScroll:=SQLQuery1.AfterScroll;
  SQLQuery1.BeforeScroll:=nil;
  SQLQuery1.AfterScroll:=nil;
try
  //do something
finally
  SQLQuery1.BeforeScroll:=OldBeforeScroll;
  SQLQuery1.AfterScroll:=OldAfterScroll;
  OldBeforeScroll:=nil;
  OldAfterScroll:=nil;
end;
GrandRURU
站務副站長


發表:234
回覆:1651
積分:1742
註冊:2005-06-21

發送簡訊給我
#5 引用回覆 回覆 發表時間:2014-05-13 09:09:26 IP:59.120.xxx.xxx 訂閱
我也遇到相同的問題

DevExpress 客服是這樣回答的:
cxGrid & Dataset AfterScroll problem


[code delphi]
...
procedure TForm1.AfterScroll(DataSet: TDataSet); begin
if not DataSet.ControlsDisabled then
begin
//Your code
...
end;
end;
[/code]

系統時間:2017-10-23 19:20:57
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!