線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:945
推到 Plurk!
推到 Facebook!

debug

尚未結案
QOO10
初階會員


發表:59
回覆:89
積分:29
註冊:2002-12-25

發送簡訊給我
#1 引用回覆 回覆 發表時間:2003-02-18 11:22:55 IP:61.229.xxx.xxx 未訂閱
下列程式 datablock 是繼承 panel ,希望能在 onenter 時設定其 onwner 下之 dsmaster (tdatasource) 的 dataset property ,但在此單原看都有 設成功,但在換 dataset 時觸發 dsmasterdatachange 時關查又沒換成 不知為何??    procedure TDataBlock.OnEnter(sender:Tobject); var   aObject,aDatasource,vDatasource,bObject:Tobject;   i:integer;   propInfo:PPropInfo; begin   aObject := Tcomponent(sender).Owner;   while not (aObject Is TForm) do     aObject := Tcomponent(sender).Owner;   if Autolink then   begin     aDatasource:=Tcomponent(aObject).FindComponent('dsMaster');     if aDatasource <> nil then     begin       if (aDataSource is TDataSource) then       begin         i:=0;         while i <= TWinControl(sender).ControlCount-1  do         begin           bObject := TWinControl(sender).controls[i];           PropInfo:=GetPropInfo(bObject.ClassInfo,'DataSource');           if propInfo <> nil then           begin             vDatasource:=GetObjectProp(TWinControl(sender).controls[i],propInfo);             if vDataSource <> nil then             begin                  TDataSource(aDataSource).DataSet:=TDataSource(vDataSource).dataset;                    exit;             end;           end;           i := i + 1;         end;       end       else       begin         showmessage('dsMaster Type Error!!');         Application.Terminate;       end;     end;   end; end;   
QOO10
初階會員


發表:59
回覆:89
積分:29
註冊:2002-12-25

發送簡訊給我
#2 引用回覆 回覆 發表時間:2003-02-18 11:27:27 IP:61.229.xxx.xxx 未訂閱
引言: 下列程式 datablock 是繼承 panel ,希望能在 onenter 時設定其 onwner 下之 dsmaster (tdatasource) 的 dataset property ,但在此單原看都有 設成功,但在換 dataset 時觸發 dsmasterdatachange 時關查又沒換成 不知為何?? procedure TDataBlock.OnEnter(sender:Tobject); var aObject,aDatasource,vDatasource,bObject:Tobject; i:integer; propInfo:PPropInfo; begin aObject := Tcomponent(sender).Owner; while not (aObject Is TForm) do aObject := Tcomponent(sender).Owner; if Autolink then begin aDatasource:=Tcomponent(aObject).FindComponent('dsMaster'); if aDatasource <> nil then begin if (aDataSource is TDataSource) then begin i:=0; while i <= TWinControl(sender).ControlCount-1 do begin bObject := TWinControl(sender).controls[i]; PropInfo:=GetPropInfo(bObject.ClassInfo,'DataSource'); if propInfo <> nil then begin vDatasource:=GetObjectProp(TWinControl(sender).controls[i],propInfo); if vDataSource <> nil then begin TDataSource(aDataSource).DataSet:=TDataSource(vDataSource).dataset; exit; end; end; i := i 1; end; end else begin showmessage('dsMaster Type Error!!'); Application.Terminate; end; end; end; end; sorry !! TDataSource(aDataSource).DataSet:=TDataSource(vDataSource).dataset; 此行 利用 watch list 看是有將 dsmaster.dataset 換了 但下列確 show 舊值!! procedure TTSMutitbfrm.dsMasterDataChange(Sender: TObject; Field: TField); begin showmessage( Tdataset(tdatasource(sender).DataSet).name) end;
QOO10
初階會員


發表:59
回覆:89
積分:29
註冊:2002-12-25

發送簡訊給我
#3 引用回覆 回覆 發表時間:2003-02-18 11:38:34 IP:61.229.xxx.xxx 未訂閱
引言:
引言: 下列程式 datablock 是繼承 panel ,希望能在 onenter 時設定其 onwner 下之 dsmaster (tdatasource) 的 dataset property ,但在此單原看都有 設成功,但在換 dataset 時觸發 dsmasterdatachange 時關查又沒換成 不知為何?? procedure TDataBlock.OnEnter(sender:Tobject); var aObject,aDatasource,vDatasource,bObject:Tobject; i:integer; propInfo:PPropInfo; begin aObject := Tcomponent(sender).Owner; while not (aObject Is TForm) do aObject := Tcomponent(sender).Owner; if Autolink then begin aDatasource:=Tcomponent(aObject).FindComponent('dsMaster'); if aDatasource <> nil then begin if (aDataSource is TDataSource) then begin i:=0; while i <= TWinControl(sender).ControlCount-1 do begin bObject := TWinControl(sender).controls[i]; PropInfo:=GetPropInfo(bObject.ClassInfo,'DataSource'); if propInfo <> nil then begin vDatasource:=GetObjectProp(TWinControl(sender).controls[i],propInfo); if vDataSource <> nil then begin TDataSource(aDataSource).DataSet:=TDataSource(vDataSource).dataset; exit; end; end; i := i 1; end; end else begin showmessage('dsMaster Type Error!!'); Application.Terminate; end; end; end; end; sorry !! TDataSource(aDataSource).DataSet:=TDataSource(vDataSource).dataset; 此行 利用 watch list 看是有將 dsmaster.dataset 換了 但下列確 show 舊值!! procedure TTSMutitbfrm.dsMasterDataChange(Sender: TObject; Field: TField); begin showmessage( Tdataset(tdatasource(sender).DataSet).name) end;
sorry 弄錯了!!是 procedure TTSMutitbfrm.dsMasterDataChange(Sender: TObject; Field: TField); begin showmessage( Tdataset(tdatasource(sender).DataSet).name); showmessage( dsMaster.dataset.name); // dsmaster.dataset:=Tdataset(tdatasource(sender).DataSet; end; 兩者答案不同但我確定 from 上只有一個 dsmaster !!之前有網友 回答但我還是不太懂我要如何解決!!我只知利用 dsmaster.dataset:=Tdataset(tdatasource(sender).DataSet; 補此洞但,我想知道為何如此??
ccchen
版主


發表:61
回覆:940
積分:1394
註冊:2002-04-15

發送簡訊給我
#4 引用回覆 回覆 發表時間:2003-02-20 09:54:17 IP:61.219.xxx.xxx 未訂閱
1. 對不起,原文未縮排, 看不懂, 幫你縮排了一下 2. showmessage( Tdataset(tdatasource(sender).DataSet).name); showmessage( dsMaster.dataset.name); 顯示不同結果, 是否有繼續debug下去, 第二次再進入此Event時仍不同嗎? 還是只是在換DataSet時驅動此Event有不同結果, 之後就正確了呢
QOO10
初階會員


發表:59
回覆:89
積分:29
註冊:2002-12-25

發送簡訊給我
#5 引用回覆 回覆 發表時間:2003-02-20 10:24:58 IP:61.229.xxx.xxx 未訂閱
引言: 1. 對不起,原文未縮排, 看不懂, 幫你縮排了一下 2. showmessage( Tdataset(tdatasource(sender).DataSet).name); showmessage( dsMaster.dataset.name); 顯示不同結果, 是否有繼續debug下去, 第二次再進入此Event時仍不同嗎? 還是只是在換DataSet時驅動此Event有不同結果, 之後就正確了呢
謝謝您幫我重排,下次我會流意,是的我沒次更換 dataset 時在 onenter 利用 watch list 看 TDataSource(aDataSource).name 是 'dsmaster' TDataSource(aDataSource).dataset.name 都已跟換新的 dataset 但到TTSMutitbfrm.dsMasterDataChange(Sender: TObject; Field: TField); 時 dsmaster.dataset.name 又回舊值,但tdataource(sender).dataset 確是新值,於是我目前只補了一行來補洞"dsmaster:=tdatasource(sender) 但奇怪的是為何如此??
ccchen
版主


發表:61
回覆:940
積分:1394
註冊:2002-04-15

發送簡訊給我
#6 引用回覆 回覆 發表時間:2003-02-20 11:45:21 IP:61.219.xxx.xxx 未訂閱
應該是不會有問題才對, 不過onDataChange被觸發之時機很多, 檢查看看是否被多次觸發, 或者可將其他DataSet,DataSource之Event均暫時终止試試
系統時間:2024-04-20 22:02:44
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!