請問觸發DBNavigator使得SpeedButton->Enable |
尚未結案
|
t0288542
中階會員 發表:216 回覆:254 積分:94 註冊:2004-10-06 發送簡訊給我 |
|
cashxin2002
版主 發表:231 回覆:2555 積分:1937 註冊:2003-03-28 發送簡訊給我 |
您好﹗ SpeedButton元件的部分比較好處理﹐用程式碼控制即可﹐如下﹕
將程式碼寫入DataSet資料集元件的AfterScroll和DataSource元件的 OnStateChange事件中﹕ begin SpeedButton1.Enable := Not (DataSource1.DataSet.State In [dsInsert, dsEdit]); //SpeedButton1指查詢鍵 SpeedButton2.Enable := Not (DataSource1.DataSet.State In [dsInsert, dsEdit]); //SpeedButton2指离開鍵 end; 但DBNavigator元件沒有相關的屬性設定可以控制﹐您可自訂一組SpeedButton元 件配合使用限制來達到此目的 Private {Private declarations} Procedure Set; //為自訂的程式作宣告 Public {Public declarations} end; var Form1.Tform1; implementation {$R*.dfm} ProcedureTform1.Set; //自訂的程式內容 begin sbFirst.Enabled:=(DataSource1.DataSet.State=dsBrowse) and (not DataSource1.DataSet.Bof); //此處選擇使用DataSource1.DataSet 而不直接使用資料集元件是為了 //方便以后更換資料集元件﹒若以前編譯程式碼時是使用Ttable元件﹐現 //在要換成Tquery元件﹐只需要將資料集元件修改即可﹐而不需要更改此 //處的程式碼﹐提升程式碼的可攜性 sbPrior.Enabled := (DataSource1.DataSet.State=dsBrowse) and (not DataSource1.DataSet.Bof); sbNext.Enabled:=(DataSource1.DataSet.State=dsBrowse) and (not DataSource1.DataSet.Eof); sbLast.Enabled:=(DataSource1.DataSet.State=dsBrowse) and (not DataSource1.DataSet.Eof); sbInsert.Enabled:=(DataSource1.DataSet.State=dsBrowse); sbDelete.Enabled:=(DataSource1.DataSet.State=dsBrowse) and ((not DataSource1.DataSet.Bof) or (not DataSource1.DataSet.Eof)); sbEdit.Enabled:=(DataSource1.DataSet.State=dsBrowse) and ((not DataSource1.DataSet.Bof) or (not DataSource1.DataSet.Eof)); SpeedButton1.Enable := Not (DataSource1.State in [dsInsert, dsEdit]); SpeedButton2.Enable := Not (DataSource1.DataSet.State In [dsInsert, dsEdit]); end; 將以上的程式碼加在資料集的AfterScroll事件和DataSource的OnStateChange 事件中即可﹐例如﹕ ProcedureTform1.DataSource1StateChange(Sender:Tobject); begin Set; end; ProcedureTform1.Table1AfterScrool(DataSet:TDataSet); begin Set; end;========================= 我是您的朋友﹐有您真好﹗ =========================
------
忻晟 |
tonytop
中階會員 發表:6 回覆:114 積分:89 註冊:2003-12-04 發送簡訊給我 |
|
tonytop
中階會員 發表:6 回覆:114 積分:89 註冊:2003-12-04 發送簡訊給我 |
|
seaturn99
版主 發表:69 回覆:427 積分:214 註冊:2003-08-25 發送簡訊給我 |
t0288542 您好 : 簡單的 procedure 給您參考 :
procedure EditModeNavBtn(Adbnav:TDBNavigator;AEnable:boolean); var i:integer; NavBtn:TNavButton; begin for i:= Adbnav.ComponentCount-1 downto 0 do if Adbnav.Components[i] is TNavButton then begin NavBtn := Adbnav.Components[i] as TNavButton; case NavBtn.Index of nbFirst, nbPrior, nbNext, nbLast, nbEdit : NavBtn.Enabled := AEnable; end; end; end; procedure TForm1.DBNavigator1Click(Sender: TObject; Button: TNavigateBtn); var dbnav:TDBNavigator; NavBtn:TNavButton; begin if Sender is TDBNavigator then begin dbnav := Sender as TDBNavigator; if Button=nbEdit then begin EditModeNavBtn(dbnav,false); // 再加上類似 EditModeNavBtn 的procedure 關閉 speedbtn .. end; end; end;同理, EditModeNavBtn(dbnav,true); 就在您要執行的 Onclick Button 做 Enable 的動作即可.. ---- 我只會兩件事,這也不會,那也不會 眼見不一定為真 ---- |
t0288542
中階會員 發表:216 回覆:254 積分:94 註冊:2004-10-06 發送簡訊給我 |
SouthWind 您好~ procedure TForm1.DBNavigator1Click(Sender: TObject; Button: TNavigateBtn);
var
dbnav:TDBNavigator;
NavBtn:TNavButton;
begin
if Sender is TDBNavigator then
begin
dbnav := Sender as TDBNavigator; if Button=nbEdit then
begin
EditModeNavBtn(dbnav,false);
// 再加上類似 EditModeNavBtn 的procedure 關閉 speedbtn ..
end;
end;
end; 請問~再加上類似 EditModeNavBtn 的procedure 關閉 speedbtn這一段~
我是不是只要改個procedure EditModeNavBtn名稱~ procedure EditModeNavBtnSpe(Adbnav:TDBNavigator;AEnable:boolean);
var
i:integer;
NavBtn:TNavButton;
begin
for i:= Adbnav.ComponentCount-1 downto 0 do
if Adbnav.Components[i] is TNavButton then
begin
NavBtn := Adbnav.Components[i] as TNavButton;
case NavBtn.Index of
//這裡改放
SpeedButton4,
SpeedButton5
end;
end;
end; 不好意思~好像有問題~我那裡有設錯嗎~><"
|
seaturn99
版主 發表:69 回覆:427 積分:214 註冊:2003-08-25 發送簡訊給我 |
引言: 請問~再加上類似 EditModeNavBtn 的procedure 關閉 speedbtn這一段~ 我是不是只要改個procedure EditModeNavBtn名稱~ procedure EditModeNavBtnSpe(Adbnav:TDBNavigator;AEnable:boolean); var i:integer; NavBtn:TNavButton; begin for i:= Adbnav.ComponentCount-1 downto 0 do if Adbnav.Components[i] is TNavButton then begin NavBtn := Adbnav.Components[i] as TNavButton; case NavBtn.Index of //這裡改放 SpeedButton4, SpeedButton5 end; end; end; 不好意思~好像有問題~我那裡有設錯嗎~><"t0288542 您好 : procedure EditModeNavBtn(Adbnav:TDBNavigator;AEnable:boolean); var i:integer; NavBtn:TNavButton; begin for i:= Adbnav.ComponentCount-1 downto 0 do if Adbnav.Components[i] is TNavButton then begin NavBtn := Adbnav.Components[i] as TNavButton; case NavBtn.Index of nbFirst, nbPrior, nbNext, nbLast, nbEdit : NavBtn.Enabled := AEnable; end; end; end; procedure TForm1.EditModeSpeedBtn(AEnable:boolean); begin SpeedButton4.Enabled := AEnable; SpeedButton5.Enabled := AEnable; end; procedure TForm1.DBNavigator1Click(Sender: TObject; Button: TNavigateBtn); var dbnav:TDBNavigator; NavBtn:TNavButton; begin if Sender is TDBNavigator then begin dbnav := Sender as TDBNavigator; if Button=nbEdit then begin EditModeNavBtn(dbnav,false); EditModeSpeedBtn(false); end; end; end;藍色標示部份就是我註解,沒有寫出來的部份 在 Post/Cancel 按下,執行 EditModeNavBtn(dbnav,true); EditModeSpeedBtn(true); 再恢復狀態即可 .. 不過您會發現,我的 Code 在 DataSet 狀態改變的時候,即使 EditModeNavBtn(dbnav,true); 沒有執行,一些 NavButton 還是會回復成對的狀態... 所以上面的做法不算優雅,從 DataSet 的狀態改變與 Action 發生去著手,會比較優雅,不過上面的寫法比較簡單直覺,應該是可以解決您的問題 紅色的標示的地方,有兩個錯誤 : 1. 那是 pure procedure ,所以他認不得 SpeedBtton4/5 Object 2. case NavBtn.Index of 內的 Index 是 TNavigateBtn (enum type) 您可以查查 Online Help ,只有制定的 NavBtton Value .. ---- 我只會兩件事,這也不會,那也不會 眼見不一定為真 ---- 發表人 - SouthWind 於 2004/11/18 16:43:51 |
t0288542
中階會員 發表:216 回覆:254 積分:94 註冊:2004-10-06 發送簡訊給我 |
|
t0288542
中階會員 發表:216 回覆:254 積分:94 註冊:2004-10-06 發送簡訊給我 |
|
seaturn99
版主 發表:69 回覆:427 積分:214 註冊:2003-08-25 發送簡訊給我 |
t0288542 您好 : SpeedButton (查詢/關閉 按鈕)是您定義在 TForm 的元件,所以您利用 pure procedure 是認不得的,錯誤如同上面我所指出的,注意到我藍色標示的地方是 procedure TForm1.EditModeSpeedBtn(AEnable:boolean); 了嗎?? 中文 Online Help 目前就我知道是沒有,只能靠 google 與 key word 碰運氣看能不能找到對應的解釋,大部分的資訊都還在原版的 Help 中尋得..
在 procedure EditModeNavBtn(Adbnav:TDBNavigator;AEnable:boolean); 我取了巧,我將 TDBNavigator 當參數傳進去,由於 SpeedButton 是數個獨立的 Object ,所以利用 pure procedure 處裡並不方便 (除非傳 array) . 您已經找到另個解法了,讓它成為 TForm 的 method procedure 就可以寫在一起了,可以讓程式碼看起來更簡潔一點 .. PS. EditModeNavBtn 一時亂取名,後來發現取得不恰當,您斟酌修改之.. ---- 我只會兩件事,這也不會,那也不會 眼見不一定為真 ---- |
t0288542
中階會員 發表:216 回覆:254 積分:94 註冊:2004-10-06 發送簡訊給我 |
|
seaturn99
版主 發表:69 回覆:427 積分:214 註冊:2003-08-25 發送簡訊給我 |
引言: SouthWind 您好: 謝謝~我了解您意思~ procedure TForm1.EditModeSpeedBtn(AEnable:boolean); 我己標示為TForm1似乎依然是相同問題~ 或者是 TForm1.EditModeSpeBtn(...)需要作宣告呢~ 因為EditModeSpeBtn是不存在~ ^^t0288542 您好 : TForm1 Class 的 private 或 public 宣告區段內 要加上宣告 procedure EditModeSpeedBtn(AEnable:boolean); 您可能太依賴 Wizard 了囉 .. ---- 我只會兩件事,這也不會,那也不會 眼見不一定為真 ---- |
t0288542
中階會員 發表:216 回覆:254 積分:94 註冊:2004-10-06 發送簡訊給我 |
|
seaturn99
版主 發表:69 回覆:427 積分:214 註冊:2003-08-25 發送簡訊給我 |
t0288542 您好 :
interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, DB, ADODB, ExtCtrls, DBCtrls, Grids, DBGrids, Buttons; type TForm1 = class(TForm) ADOQuery1: TADOQuery; DBNavigator1: TDBNavigator; ADOTable1: TADOTable; ADOConnection1: TADOConnection; DataSource1: TDataSource; DBGrid1: TDBGrid; SpeedButton4: TSpeedButton; SpeedButton5: TSpeedButton; procedure FormCreate(Sender: TObject); procedure DBNavigator1Click(Sender: TObject; Button: TNavigateBtn); private { Private declarations } procedure EditModeSpeedBtn(AEnable:boolean); public { Public declarations } end; var Form1: TForm1;要放在包含 SpeedButton 的 Form Class 內才行,請參考以上範例 .. Delphi 編譯器,會提供一些錯誤訊息,也能提供您做判斷錯誤點的參考.. ---- 我只會兩件事,這也不會,那也不會 眼見不一定為真 ---- |
t0288542
中階會員 發表:216 回覆:254 積分:94 註冊:2004-10-06 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |