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

請問觸發DBNavigator使得SpeedButton->Enable

尚未結案
t0288542
中階會員


發表:216
回覆:254
積分:94
註冊:2004-10-06

發送簡訊給我
#1 引用回覆 回覆 發表時間:2004-11-18 14:28:51 IP:61.221.xxx.xxx 未訂閱
請問~    目前表單有幾個元件(DBNavigator / SpeedButton) DBNavigator元件 : 首筆 / 上筆 / 下筆 / 尾筆 / 修改 / 儲存 / 取消 SpeedButton元件 : 查詢 / 離開    需求 :  當程式執行時,選擇某筆資料按'修改' -> 首筆/上筆/下筆/尾筆 ; 查詢/離開鍵 所顯示是'Enable'不可按. 當按'儲存'或'取消'時,資料異動完成,查詢/離開鍵才可按選.     謝謝 ^^
cashxin2002
版主


發表:231
回覆:2555
積分:1937
註冊:2003-03-28

發送簡訊給我
#2 引用回覆 回覆 發表時間:2004-11-18 14:53:16 IP:202.62.xxx.xxx 未訂閱
您好﹗    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

發送簡訊給我
#3 引用回覆 回覆 發表時間:2004-11-18 15:02:39 IP:210.64.xxx.xxx 未訂閱
 
  case Button of
    nbInsert, nbEdit:BitBtn1.Enabled:=False;
    else
      BitBtn1.Enabled:=True;
  end;
tonytop
中階會員


發表:6
回覆:114
積分:89
註冊:2003-12-04

發送簡訊給我
#4 引用回覆 回覆 發表時間:2004-11-18 15:05:14 IP:210.64.xxx.xxx 未訂閱
Sorry,剛忘了讓妳知道在哪個事件下加入程式碼了  
 
procedure TForm1.DBNavigator1BeforeAction(Sender: TObject;
  Button: TNavigateBtn);
begin
  case Button of
    nbInsert, nbEdit:BitBtn1.Enabled:=False;
    else
      BitBtn1.Enabled:=True;
  end;
end;
好想冬眠
seaturn99
版主


發表:69
回覆:427
積分:214
註冊:2003-08-25

發送簡訊給我
#5 引用回覆 回覆 發表時間:2004-11-18 15:14:11 IP:220.130.xxx.xxx 未訂閱
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

發送簡訊給我
#6 引用回覆 回覆 發表時間:2004-11-18 16:19:59 IP:61.221.xxx.xxx 未訂閱
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

發送簡訊給我
#7 引用回覆 回覆 發表時間:2004-11-18 16:40:13 IP:220.130.xxx.xxx 未訂閱
引言: 請問~再加上類似 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

發送簡訊給我
#8 引用回覆 回覆 發表時間:2004-11-19 10:59:53 IP:61.221.xxx.xxx 未訂閱
SouthWind您好~    謝謝~我有試著利用你提供的方法~ 但是似乎發現訊息告知說~ Undeclared identifier:'SpeedButton4'~是不是表示未定義此元件~ 我該如何去作~另外有中文online在那裡可取得~謝謝~  如圖是執行後發生錯誤~ 謝謝~麻煩~^^
t0288542
中階會員


發表:216
回覆:254
積分:94
註冊:2004-10-06

發送簡訊給我
#9 引用回覆 回覆 發表時間:2004-11-19 11:17:04 IP:61.221.xxx.xxx 未訂閱
請問~ procedure TForm1.DBNavigator1Click(Sender: TObject; Button: TNavigateBtn); var   dbnav:TDBNavigator;   NavBtn:TNavButton; begin :    SpeedButton4.Enabled := false //加入至此procedure是正常 : end; 但是於procedure EditModeSpeBtn去定義 SpeedButton4卻是有問題~為什麼呢
seaturn99
版主


發表:69
回覆:427
積分:214
註冊:2003-08-25

發送簡訊給我
#10 引用回覆 回覆 發表時間:2004-11-19 11:37:37 IP:220.130.xxx.xxx 未訂閱
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

發送簡訊給我
#11 引用回覆 回覆 發表時間:2004-11-19 13:19:22 IP:61.221.xxx.xxx 未訂閱
SouthWind 您好:    謝謝~我了解您意思~ procedure TForm1.EditModeSpeedBtn(AEnable:boolean); 我己標示為TForm1似乎依然是相同問題~ 或者是 TForm1.EditModeSpeBtn(...)需要作宣告呢~ 因為EditModeSpeBtn是不存在~ ^^
seaturn99
版主


發表:69
回覆:427
積分:214
註冊:2003-08-25

發送簡訊給我
#12 引用回覆 回覆 發表時間:2004-11-19 13:40:07 IP:220.130.xxx.xxx 未訂閱
引言: 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

發送簡訊給我
#13 引用回覆 回覆 發表時間:2004-11-19 14:50:27 IP:61.221.xxx.xxx 未訂閱
謝謝SouthWind~ 對於Delphi我是真有點頭昏,不知道有些東西到底要放在那裡~ 不好意思~才一直不停在請教各位~ 請問是放在以下描述內~問題還是相同滴~   private     Str : String;      public     { Public declarations }     procedure EditModeSpeedBtn(AEnable:boolean); ^^
seaturn99
版主


發表:69
回覆:427
積分:214
註冊:2003-08-25

發送簡訊給我
#14 引用回覆 回覆 發表時間:2004-11-19 14:57:15 IP:220.130.xxx.xxx 未訂閱
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

發送簡訊給我
#15 引用回覆 回覆 發表時間:2004-11-19 15:11:40 IP:61.221.xxx.xxx 未訂閱
謝謝SouthWind~ 真是麻煩您~己經OK~ ^^
系統時間:2024-06-26 7:11:36
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!