Dbnavigator의 취소 버튼기능을 구현해보려합니다.
문제는 마지막 세번째 procedure의 table1.cancel인데엽.
디비그리드를 이동하려고 눌렀을때 수정모드로 되어있고 저장을 하지 않았다면
메시지와 함께 취소를하며 바로 이전의 레코드로 다시 돌아와야하는데여.
이게 잘 안되는군요....
도움말을 보니깐 못하는 영어 어렵게 해석하다보니, post 되기 전에만 cancel이
먹힌다는것 같은데, 이게 말이되나요?? 포스트한것을 취소는 못하나엽?
DBedit나 Dbimage는 lostfocus될때 바로 post가 되어버리쟈나여~
// 수정모드로 연다.
procedure TForm1.btnedit(Sender: TObject);
begin
dbedit1.Enabled:= true;
dbedit1.SetFocus;
dbedit1.selectall;
end;
// 저장(post)시킨다.
procedure TForm1.btnsave(Sender: TObject);
begin
try
table1.edit;
table1.Fields[1].AsString := dbedit1.Text;
table1.Fields[0].Assign(dbimage1.picture.Bitmap);
table1.Post;
showmessage('saved');
table1.Refresh;
dbedit1.Enabled:=false;
except
on E:Edbengineerror do
showmessage('Cannot Save with multiple data..');
end;
end;
// DBGrid를 이용해서 레코드 이동을 시도하려할때 만약 수정모드로 열려있는데
저장하지 않고 이동하려했다면 메시지를 출력하면서 이동전의 모습으로 돌아감을
구현....
procedure TForm1.DBGrid1CellClick(Column: TColumn);
begin
if dbedit1.Enabled = true then
begin
messagedlg('수정모드로 열려있습니다. 먼저 저장하십시오',mtconfirmation,[mbok],0);
table1.cancel --->>> 바로 이부분을 어케 손대야할쥐... 암담~
end
end;
> Dbnavigator의 취소 버튼기능을 구현해보려합니다.
> 문제는 마지막 세번째 procedure의 table1.cancel인데엽.
> 디비그리드를 이동하려고 눌렀을때 수정모드로 되어있고 저장을 하지 않았다면
> 메시지와 함께 취소를하며 바로 이전의 레코드로 다시 돌아와야하는데여.
> 이게 잘 안되는군요....
> 도움말을 보니깐 못하는 영어 어렵게 해석하다보니, post 되기 전에만 cancel이
> 먹힌다는것 같은데, 이게 말이되나요?? 포스트한것을 취소는 못하나엽?
> DBedit나 Dbimage는 lostfocus될때 바로 post가 되어버리쟈나여~
>
> // 수정모드로 연다.
> procedure TForm1.btnedit(Sender: TObject);
> begin
> dbedit1.Enabled:= true;
> dbedit1.SetFocus;
> dbedit1.selectall;
> end;
>
> // 저장(post)시킨다.
> procedure TForm1.btnsave(Sender: TObject);
> begin
> try
> table1.edit;
> table1.Fields[1].AsString := dbedit1.Text;
> table1.Fields[0].Assign(dbimage1.picture.Bitmap);
> table1.Post;
> showmessage('saved');
> table1.Refresh;
> dbedit1.Enabled:=false;
> except
> on E:Edbengineerror do
> showmessage('Cannot Save with multiple data..');
> end;
> end;
>
> // DBGrid를 이용해서 레코드 이동을 시도하려할때 만약 수정모드로 열려있는데
> 저장하지 않고 이동하려했다면 메시지를 출력하면서 이동전의 모습으로 돌아감을
> 구현....
> procedure TForm1.DBGrid1CellClick(Column: TColumn);
> begin
> if dbedit1.Enabled = true then
> begin
> messagedlg('수정모드로 열려있습니다. 먼저 저장하십시오',mtconfirmation,[mbok],0);
>
> table1.cancel --->>> 바로 이부분을 어케 손대야할쥐... 암담~
>
> end
> end;
>
>
>
전체 흐름은 이해가 안되서, 단편적인 답변을 해보겠습니다.
if table1.State in [dsInssert, dsEdit] then table1.post
else table1.cancel; //데이터셋이 열려있으면 저장하고, 그렇지 않으면 취소.
그리고, 한번 저장되면 되돌려 놓을수 없는걸로 알고있습니다.
되돌리는 기능을 구현하려면 커밋, 롤백을 해야하는데요..
이것을 위해서는 Database콤포를 이용해야 합니다. 이 콤포에 테이블을 지정해놓고,
Database컴포넌트의 메서드를 이용하게 됩니다.
StartTransaction과 commit, rollback메서드. 트랜잭션을 이용하면
임시버퍼에 저장해놓았다가 커밋시에는 버퍼의 내용을 데이터셋에
완전히 집어넣어버리고, 롤백메서드 사용시에 버퍼를 비우고 저장을 취소합니다.
이걸 다 하려면, 전체적으로 데이터셋 연결을 다 바꿔줘야 할것같습니다.
부족한부분은 지나가시는 고수분께서 보충설명부탁합니다.