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

Dbgrid問題

尚未結案
lilisn
一般會員


發表:35
回覆:62
積分:24
註冊:2003-03-09

發送簡訊給我
#1 引用回覆 回覆 發表時間:2003-05-18 12:45:12 IP:61.228.xxx.xxx 未訂閱
1.請問dbgrid enter鍵如何做到像tab鍵一樣,不管是dsinsert or dsbrowes 多能夠像tab鍵功能. 2.如何在dsinsert時 user觸發鍵盤 (key = 38 or key = 40 or mouse 時), 如何有procedure TmainForm2_3.main3WDBGrid1ColExit(Sender: TObject); 檢查功能? procedure TmainForm2_3.main3WDBGrid1ColExit(Sender: TObject); begin if main3ADOQuery1.State=dsBrowse then exit; if (main3WDBGrid1.SelectedField = main3ADOQuery1cusno) then if Length(main3ADOQuery1cusno.AsString) = 8 then if main3ADOQuery2.Locate('cusno',Main3ADOQuery1cusno.AsString,[]) then main3ADOQuery1.FieldByName('taxyear').AsString:=main3edit1.Text else begin showmessage('代號不存在'); main3adoquery1.Cancel; end;
cmj
高階會員


發表:15
回覆:242
積分:226
註冊:2002-06-12

發送簡訊給我
#2 引用回覆 回覆 發表時間:2003-05-18 17:08:32 IP:211.76.xxx.xxx 未訂閱
1.請問dbgrid enter鍵如何做到像tab鍵一樣,不管是dsinsert or dsbrowes
  多能夠像tab鍵功能.
Enter鍵模擬Tab鍵,可參考下列文章,即可解決    http://delphi.ktop.com.tw/topic.php?TOPIC_ID=27456    2.如何在dsinsert時 user觸發鍵盤 (key = 38 or key = 40 or mouse 時),
  如何有procedure TmainForm2_3.main3WDBGrid1ColExit(Sender: TObject);
  檢查功能?    觸發鍵盤在下列事件中處理
procedure TmainForm2_3.main3WDBGrid1KeyDown(Sender: TObject; var Key: Word;  Shift: TShiftState);
var DataSet:TDataSet;
begin
  DataSet:= TDBGrid(Sender).DataSource.DataSet;
  if (Key in [38,40]) and (DataSet.state=dsInsert) then
      main3WDBGrid1ColExit(Self);  //執行檢查功能
end;    觸發MOUSE在下列事件中依需求選擇處理
procedure TmainForm2_3.main3WDBGrid1MouseDown(Sender: TObject; Button: TMouseButton;  Shift: TShiftState; X, Y: Integer);
var DataSet:TDataSet;
begin
  DataSet:= TDBGrid(Sender).DataSource.DataSet;
  if DataSet.state=dsInsert then
      main3WDBGrid1ColExit(Self);  //執行檢查功能
end;    procedure TmainForm2_3.main3WDBGrid1MouseMove(Sender: TObject; Shift: TShiftState; ,  Y: Integer);
var DataSet:TDataSet;
begin
  DataSet:= TDBGrid(Sender).DataSource.DataSet;
  if DataSet.state=dsInsert then
      main3WDBGrid1ColExit(Self);  //執行檢查功能
end;    procedure TmainForm2_3.main3WDBGrid1MouseUp(Sender: TObject; Button: TMouseButton;  Shift: TShiftState; X, Y: Integer);
var DataSet:TDataSet;
begin
  DataSet:= TDBGrid(Sender).DataSource.DataSet;
  if DataSet.state=dsInsert then
      main3WDBGrid1ColExit(Self);  //執行檢查功能
end;    
發表人 - cmj 於 2003/05/18 17:11:51 發表人 - cmj 於 2003/05/18 19:15:07
lilisn
一般會員


發表:35
回覆:62
積分:24
註冊:2003-03-09

發送簡訊給我
#3 引用回覆 回覆 發表時間:2003-05-20 18:42:24 IP:61.228.xxx.xxx 未訂閱
procedure TmainForm2_3.main3WDBGrid1MouseMove(Sender: TObject; Shift: TShiftState; , Y: Integer); var DataSet:TDataSet; begin DataSet:= TDBGrid(Sender).DataSource.DataSet; if DataSet.state=dsInsert then main3WDBGrid1ColExit(Self); //執行檢查功能 end; 出現 error:access violation at address 00565c60 in module 'main.exe' read of address 000030 如果不執行 procedure TmainForm2_3.main3WDBGrid1MouseMove 就沒有問題, 不知沖途在那裡? --------------------------------------------------------------------- 另外當執行執行檢查功能 main3WDBGrid1ColExit(Self) receiveno.dbo key值(taxyear custno) , taxyear 是 main3edit1.Text代入固(因為'select * from receiveno where taxyear = ''' main3Edit1.Text ''' ') procedure TmainForm2_3.main3WDBGrid1ColExit(Sender: TObject); begin if main3ADOQuery1.State=dsBrowse then exit; if (main3WDBGrid1.SelectedField = main3ADOQuery1custno) then if Length(main3ADOQuery1custno.AsString) = 8 then if main3ADOQuery2.Locate('custno',Main3ADOQuery1custno.AsString, []) then begin main3ADOQuery1.Edit; main3ADOQuery1.FieldByName('taxyear').AsString:=main3edit1.Text; // 當custno在main3ADOQuery2找到填入 taxyear end else begin ///////////////// 在此showmessage('代號不存在') 之前出現 error message: cannot insert the value null into column taxyear,table 'company.dbo receiveno' column does not allow nulls insert fails ///////////////// showmessage('代號不存在'); main3adoquery1.Cancel; end; 謝謝 發表人 - lilisn 於 2003/05/20 18:44:31
chih
版主


發表:48
回覆:1186
積分:639
註冊:2002-04-02

發送簡訊給我
#4 引用回覆 回覆 發表時間:2003-05-20 19:01:07 IP:61.216.xxx.xxx 未訂閱
1.參考這篇的DosMove元件很方便.. http://delphi.ktop.com.tw/topic.php?topic_id=25454
cmj
高階會員


發表:15
回覆:242
積分:226
註冊:2002-06-12

發送簡訊給我
#5 引用回覆 回覆 發表時間:2003-05-20 20:06:54 IP:211.76.xxx.xxx 未訂閱
引言: procedure TmainForm2_3.main3WDBGrid1MouseMove(Sender: TObject; Shift: TShiftState; , Y: Integer); var DataSet:TDataSet; begin DataSet:= TDBGrid(Sender).DataSource.DataSet; if DataSet.state=dsInsert then main3WDBGrid1ColExit(Self); //執行檢查功能 end; 出現 error:access violation at address 00565c60 in module 'main.exe' read of address 000030 如果不執行 procedure TmainForm2_3.main3WDBGrid1MouseMove 就沒有問題, 不知沖途在那裡? --------------------------------------------------------------------- 另外當執行執行檢查功能 main3WDBGrid1ColExit(Self) receiveno.dbo key值(taxyear custno) , taxyear 是 main3edit1.Text代入固(因為'select * from receiveno where taxyear = ''' main3Edit1.Text ''' ') 妳是要離開某一Field時執行main3WDBGrid1ColExit不管是以mouse或鍵盤移勳到其他Field都自然執行main3WDBGrid1ColExit,所以不用在 main3WDBGrid1MouseMove main3WDBGrid1MouseDown main3WDBGrid1MouseUp 以上三個事件寫檢查程式碼,所以上紅色部份請刪除 procedure TmainForm2_3.main3WDBGrid1ColExit(Sender: TObject); begin if main3ADOQuery1.State=dsBrowse then exit; if (main3WDBGrid1.SelectedField = main3ADOQuery1custno) then if Length(main3ADOQuery1custno.AsString) = 8 then if main3ADOQuery2.Locate('custno',Main3ADOQuery1custno.AsString,[]) then begin main3ADOQuery1.Edit; //此行應該不要因為main3ADOQuery1.state in [dsEdit,dsInsert] main3ADOQuery1.FieldByName('taxyear').AsString:=main3edit1.Text; // 當custno在main3ADOQuery2找到填入 taxyear end else begin ///////////////// 在此showmessage('代號不存在') 之前出現 error message: cannot insert the value null into column taxyear,table 'company.dbo receiveno' column does not allow nulls insert fails 這是taxyear欄位在存檔時不允許null值,解決方法 改main3ADOQuery1對應Table之taxyear,允許null. 或 main3ADOQuery1.BeforePost事件中加 if mainin3ADOQuery1.FieldByName('taxyear').AsString='' then //有可能是null mainin3ADOQuery1.FieldByName('taxyear').AsString:=''; 或 main3ADOQuery1.NewRecord事件中加 mainin3ADOQuery1.FieldByName('taxyear').AsString:=''; ///////////////// showmessage('代號不存在'); main3adoquery1.Cancel; //此行應該不要 end; 謝謝 發表人 - lilisn 於 2003/05/20 18:44:31
以上修改試試看建盡量在adoquery事件中做處理有必要才在dbgrid事件中做處理,才不容易出錯
lilisn
一般會員


發表:35
回覆:62
積分:24
註冊:2003-03-09

發送簡訊給我
#6 引用回覆 回覆 發表時間:2003-05-21 00:34:37 IP:61.228.xxx.xxx 未訂閱
procedure TmainForm2_3.main3WDBGrid1KeyDown(Sender: TObject; var Key: Word; Shift: TShiftState); var DataSet:TDataSet; begin DataSet:= TDBGrid(Sender).DataSource.DataSet; if (Key in [38,40]) and (DataSet.state=dsInsert) then main3ADOQuery1BeforePost(???? ); // ??? 放什麼; end; procedure TmainForm2_3.main3ADOQuery1BeforePost(DataSet: TDataSet); begin if not main3ADOQuery2.Locate('custno',Main3ADOQuery1custno.AsString,[]) then showmessage('代號不存在'); abort; end; end.
cmj
高階會員


發表:15
回覆:242
積分:226
註冊:2002-06-12

發送簡訊給我
#7 引用回覆 回覆 發表時間:2003-05-21 01:18:08 IP:211.76.xxx.xxx 未訂閱
引言: procedure TmainForm2_3.main3WDBGrid1KeyDown(Sender: TObject; var Key: Word; Shift: TShiftState); var DataSet:TDataSet; begin DataSet:= TDBGrid(Sender).DataSource.DataSet; if (Key in [38,40]) and (DataSet.state=dsInsert) then main3WDBGrid1ColExit(Sender); //執行檢查功能,筆誤self改sender end; procedure TmainForm2_3.main3ADOQuery1BeforePost(DataSet: TDataSet); begin //main3ADOQuery1 is DataSet so if DataSet.FieldByName('taxyear').AsString='' then //taxyear有可能是null,防止taxyear不允許null產生錯誤 DataSet.FieldByName('taxyear').AsString:=''; end; end.
//按妳的程式來修改,看起來怪怪的,main3WDBGrid1ColExit會執行2次 //若有問題請傳程式與table結構
lilisn
一般會員


發表:35
回覆:62
積分:24
註冊:2003-03-09

發送簡訊給我
#8 引用回覆 回覆 發表時間:2003-05-21 09:39:53 IP:61.228.xxx.xxx 未訂閱
main3WDBGrid1ColExit已修改,沒有locate.......... procedure TmainForm2_3.main3WDBGrid1ColExit(Sender: TObject); begin if main3ADOQuery1.State=dsBrowse then exit; if (main3WDBGrid1.SelectedField = main3ADOQuery1custno) then if Length(main3ADOQuery1custno.AsString) = 8 then main3ADOQuery1.FieldByName('taxyear').AsString:=main3edit1.Text; end; procedure TmainForm2_3.main3ADOQuery1BeforePost(DataSet: TDataSet); begin if not main3ADOQuery2.Locate('custno',Main3ADOQuery1custno.AsString, []) then showmessage('代號不存在'); abort; 或 if DataSet.FieldByName('taxyear').AsString='' then DataSet.FieldByName('taxyear').AsString:=''; end; 也可以 procedure TmainForm2_3.main3WDBGrid1KeyDown(Sender: TObject; var Key: Word; Shift: TShiftState); var DataSet:TDataSet; begin DataSet:= TDBGrid(Sender).DataSource.DataSet; if (Key in [38,40]) and (DataSet.state=dsInsert) then main3ADOQuery1BeforePost(???); 用sender or self 有? 用self [Error] :Incompatible types: 'TDataSet' and 'TmainForm2_3' 用 sender [Error] : Incompatible types: 'TDataSet' and 'TObject' end; 謝謝cmj 發表人 - lilisn 於 2003/05/21 18:41:18
cmj
高階會員


發表:15
回覆:242
積分:226
註冊:2002-06-12

發送簡訊給我
#9 引用回覆 回覆 發表時間:2003-05-21 19:28:48 IP:211.76.xxx.xxx 未訂閱
引言:
main3WDBGrid1ColExit已修改,沒有locate..........
procedure TmainForm2_3.main3WDBGrid1ColExit(Sender: TObject);
begin
if main3ADOQuery1.State=dsBrowse then
   exit;  
if (main3WDBGrid1.SelectedField = main3ADOQuery1custno) then
   if Length(main3ADOQuery1custno.AsString) = 8 then
      main3ADOQuery1.FieldByName('taxyear').AsString:=main3edit1.Text;
end;    procedure TmainForm2_3.main3ADOQuery1BeforePost(DataSet: TDataSet);
begin
  if DataSet.FieldByName('taxyear').AsString='' then 
     DataSet.FieldByName('taxyear').AsString:='';
end; 
procedure TmainForm2_3.main3WDBGrid1KeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
var DataSet:TDataSet;
begin
  DataSet:= TDBGrid(Sender).DataSource.DataSet;
  if (Key in [38,40]) and (DataSet.state=dsInsert) then
     main3ADOQuery1BeforePost(???);//為何要有此行???  
     //main3ADOQuery1BeforePost乃記錄存檔前會執行的事件,不用呼叫
end;
謝謝cmj
發表人 - lilisn 於 2003/05/21  18:41:18
看不懂妳的片段程式最好有完整程式碼
lilisn
一般會員


發表:35
回覆:62
積分:24
註冊:2003-03-09

發送簡訊給我
#10 引用回覆 回覆 發表時間:2003-05-22 17:34:44 IP:61.228.xxx.xxx 未訂閱
引言: [quote] [code] procedure TmainForm2_3.main3WDBGrid1ColExit(Sender: TObject); begin if main3ADOQuery1.State=dsBrowse then exit; if (main3WDBGrid1.SelectedField = main3ADOQuery1custno) then if Length(main3ADOQuery1custno.AsString) = 8 then ------------------------------------------------------------------- // main3WDBGrid1ColExit已沒有做locate('custno' 檢查 ** locate放置 main3ADOQuery1BeforePost 檢查ADOQuer2是否有輸入後custno ** 沒有 abort -------------------------------------------------------------------- main3ADOQuery1.FieldByName('taxyear').AsString:=main3edit1.Text; end; procedure TmainForm2_3.main3ADOQuery1BeforePost(DataSet: TDataSet); begin if DataSet.FieldByName('taxyear').AsString='' then DataSet.FieldByName('taxyear').AsString:=''; 此段程式dsinsert時按上下鍵離開時,custno代號不存在會insert //不可 行 -------------------------------------------------------------------- 我把locate.. 放入 main3ADOQuery1BeforePost 內 if not main3ADOQuery2.Locate('custno',Main3ADOQuery1custno.AsString, []) then showmessage('代號不存在'); abort; // 不管user 按上,下,tab鍵離開該dbgrid(custno)filed時都會檢查 end; 至於main3WDBGrid1KeyDown key in[38,40] 檢查就免了 cmj 2003/5/20發表 以上修改試試看建盡量在adoquery事件中做處理有必要才在dbgrid事件中做處理,才不容易出錯 體會cmj真言 我就在adoquery->BeforePost做檢查就可以了(符合我設計)萬事OK 另外2003/5/18 cmj 請問dbgrid enter鍵如何做到像tab鍵一樣,不管是dsinsert or dsbrowes 多能夠像tab鍵功能.Enter鍵模擬Tab鍵,可參考下列文章,即可解決 http://delphi.ktop.com.tw/topic.php?TOPIC_ID=27456 download 掛上專案測試後沒問題,可是每次離開delphi後馬上在開起delphi 專案 按F9 Run 會出現 [Fatal Error] main.dpr(18): File not found: 'DosMove.dcu'. 要Remove dosmove後在載入run就可以了,可是一離開delphi7在進入delphi7又 要again 不知為什咪? //PS.delphi7的dclusr.dpk 有dosmove ,元件HomeMadeu也有 DosMove
cmj
高階會員


發表:15
回覆:242
積分:226
註冊:2002-06-12

發送簡訊給我
#11 引用回覆 回覆 發表時間:2003-05-22 22:37:54 IP:211.76.xxx.xxx 未訂閱
引言:
引言: [quote] [code] 另外2003/5/18 cmj 請問dbgrid enter鍵如何做到像tab鍵一樣,不管是dsinsert or dsbrowes 多能夠像tab鍵功能.Enter鍵模擬Tab鍵,可參考下列文章,即可解決 http://delphi.ktop.com.tw/topic.php?TOPIC_ID=27456 download 掛上專案測試後沒問題,可是每次離開delphi後馬上在開起delphi 專案 按F9 Run 會出現 [Fatal Error] main.dpr(18): File not found: 'DosMove.dcu'. 要Remove dosmove後在載入run就可以了,可是一離開delphi7在進入delphi7又 要again 不知為什咪? //PS.delphi7的dclusr.dpk 有dosmove ,元件HomeMadeu也有 DosMove Open main.dpr後 按Project -> Options -> Directories/Conditionals -> 把dosmove.pas所在路徑加入Search Path 以編譯時能找得到dosmove
lilisn
一般會員


發表:35
回覆:62
積分:24
註冊:2003-03-09

發送簡訊給我
#12 引用回覆 回覆 發表時間:2003-05-23 12:08:39 IP:61.228.xxx.xxx 未訂閱
感謝CMJ指導
系統時間:2024-05-04 19:10:33
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!