Dbgrid問題 |
尚未結案
|
lilisn
一般會員 發表:35 回覆:62 積分:24 註冊:2003-03-09 發送簡訊給我 |
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 發送簡訊給我 |
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 發送簡訊給我 |
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 發送簡訊給我 |
|
cmj
高階會員 發表:15 回覆:242 積分:226 註冊:2002-06-12 發送簡訊給我 |
以上修改試試看建盡量在adoquery事件中做處理有必要才在dbgrid事件中做處理,才不容易出錯引言: 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 |
lilisn
一般會員 發表:35 回覆:62 積分:24 註冊:2003-03-09 發送簡訊給我 |
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 發送簡訊給我 |
//按妳的程式來修改,看起來怪怪的,main3WDBGrid1ColExit會執行2次 //若有問題請傳程式與table結構引言: 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. |
lilisn
一般會員 發表:35 回覆:62 積分:24 註冊:2003-03-09 發送簡訊給我 |
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 發送簡訊給我 |
引言:看不懂妳的片段程式最好有完整程式碼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 發送簡訊給我 |
引言: [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 發送簡訊給我 |
引言:引言: [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 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |