2016-08-24 13 views
0

나는 여러 개의 탭 시트를 가지고 있습니다. 이 dbgrid를 조작하기위한 버튼이있는 Dbgrid가 포함 된 내 PageControl의 각 탭 시트.Delphi Dbgrid 레코드 삭제

가끔 단추 제거를 클릭하면 내 DBGrid가 변경되지 않습니다. 삭제 후, 내 DBgrid에서 내 값을 참조하십시오.

If MyTable.recordcount > 0 then 
begin 
str := 'Value of name field/**' + MyTable.FieldByName('Name').AsString+'**/'; 
If Application.MessageBox(PChar(str), PChar('NAME'), MB_OKCANCEL + MB_ICONQUESTION) = IDOK then 
begin 
     MyTable.Delete; 
end; 
end; 

내가 삭제 한 후

MyTable.Refresh; 

를 추가하려고하지만 그것은 작동하지 않습니다. MessageBox의 myfield 값이 정확합니다!

이 문제는 MyDBgrid에서 다른 탭 시트를 선택할 때 나타납니다. 내 DBGrid에 포커스의 문제가 될 수 있습니까? 내 DBGrid (dsBrowser, dsEdit, ...)의 상태의 문제 일 수 있습니까?

============================================== ===========

내가 BeforeDelete 이벤트 및 AfterDelete 이벤트에 대한 로그를 만들려고 :

Log(1,'------------------------------------After Del'); 
Log(1,Format('DataSet.IsEmpty:%s',[BoolToStr1(DataSet.IsEmpty)])); 
Log(1,Format('DataSet.State:%d',[Ord(DataSet.State)])); 
Log(1,'--------'); 
Log(1,Format('DataSet.RecNo:%d',[DataSet.RecNo])); 
Log(1,Format('DataSet.TabSheet:%s',[DataSet.FieldByName('TabSheetName').AsString])); 
Log(1,Format('DataSet.FieldName:%s',[DataSet.FieldByName('FieldName').AsString])); 
Log(1,Format('DataSet.FieldId:%s',[DataSet.FieldByName('FieldId').AsString])); 

내가 tabsheet를 사용 AfterDelete 이벤트에

Log(1,'------------------------------------Before Del'); 
Log(1,Format('DataSet.IsEmpty:%s',[BoolToStr1(DataSet.IsEmpty)])); 
Log(1,Format('DataSet.State:%d',[Ord(DataSet.State)])); 
Log(1,'--------'); 
Log(1,Format('DataSet.RecNo:%d',[DataSet.RecNo])); 
Log(1,Format('DataSet.TabSheet:%s',[DataSet.FieldByName('TabSheetName').AsString])); 
Log(1,Format('DataSet.FieldName:%s',[DataSet.FieldByName('FieldName').AsString])); 
Log(1,Format('DataSet.FieldId:%s',[DataSet.FieldByName('FieldId').AsString])); 

을 로 :

03를 포함하는 행을 삭제 데이터 세트가 변경되지 (filedname 및 fieldID가 변경되지 /를 RECNO 특성 변화가) : 10

나는 당신이 내 로그에서 볼 수있는이 로그를

------------------------------------Before Del 
DataSet.IsEmpty:False 
DataSet.State:1 
-------- 
DataSet.RecNo:7 
DataSet.TabSheet:tabsheet_0 
DataSet.FieldName: 
DataSet.FieldId:03 
------------------------------------After Del 
DataSet.IsEmpty:False 
DataSet.State:1 
-------- 
DataSet.RecNo:6 
DataSet.TabSheet:tabsheet_0 
DataSet.FieldName: 
DataSet.FieldId:03 

을 구하십시오. 문제가 간헐적이기 때문에 독자가 당신을 위해 그렇게 할 수 없기 때문에

+0

죄송합니다. 귀하의 q가 귀하의 문제를 적절하게 설명하고 있다고 생각하지 않습니다.a) 스크린 샷을 다시보십시오. 탭 시트가 DBGrid의 일부인 이유는 무엇입니까? b) DBGrid의 LH 데이터 열이 선택된 행에서 비어있는 이유는 무엇입니까? c) 그리고 표시되는 로그 : RecNo 6가 성공적으로 삭제 된 경우입니까? 그렇다면 기록을 삭제하지 않을 때의 로그가 더 좋을 것입니다. d) DBGrid가 포함 된 형식의 특성을 기록하는 데 데이터 집합이 사용 되었습니까? 와우, 네 q는 네가하는 일에 대한 명확한 생각을주지 않는다. – MartynA

+0

Btw, 나는이 도움이 필요하다면 MCVE를 q에 포함시켜야한다고 생각합니다. - http : //stackoverflow.com/help/mcve를 참조하십시오. – MartynA

+0

@MartynA 도움을 주셔서 감사합니다 ... 분명히하려고.> 내가 현재 탭 시트를 변경하고 직접 선택한 새 탭 시트의 행을 제거하려고 할 때 오류를 재현 할 수 있기 때문에 탭 시트에 대해 이야기합니다.이 경우 삭제가 올바르게 수행되지 않습니다 ... B>이 셀은 비어 있습니다.이 셀에 아무것도 넣지 않습니다. C> RecNo = 6을 볼 수 있지만 fieldname과 fieldId는 변경되지 않고 DBgrid 인터페이스는 변경되지 않았습니다. D> MyDbgrid 새 탭 시트를 만들 때 추가됩니다 (새 탭 시트를 추가하면 DBGrid가 포함 된 클래스를 인스턴스화합니다. 모든 버튼). – userPro

답변

0

, 당신은 스스로를 디버깅해야합니다.

먼저 로깅 기능을 설정하고 데이터 집합의 BeforeDeleteAfterDelete 이벤트에서 호출해야합니다. 현재 데이터 세트 행의 ID, 데이터 세트의 상태 (dsBrowse, dsEdit 등) 및 관련성이 있다고 생각되는 항목 (예 : 활성 탭 시트의 ID)을 기록하고 어떤 상황에서 발견 할 수 있는지 확인해야합니다. 삭제가 실패합니다. 로깅 호출 결과를 양식의 TMemo에 기록 할 수 있습니다.

IME, 그것은 데이터 세트가 dsBrowse 상태에있는 경우에만 삭제를 허용하는 것이 좋습니다입니다.

그런데 데이터 집합이 dsInsert 또는 dsSetKey 상태 인 경우 삭제 작업이 자동으로 중단된다는 사실을 알고 있다고 생각합니까? 설명해 드린 것부터 문제가 발생할 때 dsInsert 상태인지 여부를 조사하여 디버깅을 시작합니다. 물론 데이터 세트가 dsInsert 상태가되면 BeforeInsert 이벤트를 포착하여 거기에서 로깅 기능을 호출하여 파악할 수 있습니다.