2015-02-05 4 views
1

끝에 "none above the above"상자가있는 db 확인란 그룹이 있습니다. 내가하고 싶은 것은 "위의 어느 것도"클릭하지 않으면, 나머지는 지워집니다. 이미 선택되어 있고 다른 하나를 클릭하면 "위의 항목 없음"상자를 지우십시오.Delphi TDBCheckBoxes 간의 독점 관계를 유지하는 방법

procedure TformLOC30v15.chkC0900AClick(Sender: TObject); 

begin 
if chkC0900Z.Checked = True then 
begin 

    if not(tblMNLOC30.State in [dsEdit, dsInsert]) then 
     tblMNLOC30.Edit; 
    tblmnloc30.FieldByName('C0900Z').AsString := ''; 
    tblmnloc30.Post; 
    tblMNLOC30.Edit; 
end; 
end; 

procedure TformLOC30v15.chkC0900ZClick(Sender: TObject); 
begin 
if chkC0900Z.Checked = True then 
begin 
    if not(tblMNLOC30.State in [dsEdit, dsInsert]) then 
     tblMNLOC30.Edit; 
    tblmnloc30.FieldByName('C0900A').AsString := ''; 
    tblmnloc30.FieldByName('C0900B').AsString := ''; 
    tblmnloc30.FieldByName('C0900C').AsString := ''; 
    tblmnloc30.FieldByName('C0900D').AsString := ''; 
    tblmnloc30.FieldByName('c0900Z').AsString := 'True'; 
    tblmnloc30.Post; 
    tblMNLOC30.Edit; 
end; 
end; 

이 대부분 작동하지만 "위의 어느 것도"를 선택하지 않은 경우, 그리고 다른 상자는 선택을 취소, 클릭 만, 클릭 된 상자를 클릭하지 않는 한 선택되지 않습니다 다시. 왜 이런 일이 일어나는 지 아는 사람이 있습니까? 고맙습니다.

+0

왜 업데이트 한 데이터를 게시하고 있습니까? 확실히 이것은 데이터가 저장 될 때 불일치가 발생합니까? –

답변

0

ok ... 알아 냈습니다. 누군가가 관심이 있다면 여기에 최종 코드가 있습니다.

procedure TformLOC30v15.chkC0900AClick(Sender: TObject); 

begin 
(Sender as TDBCheckBox).OnClick := nil; 
chkC0900Z.OnClick := nil; 
if chkC0900Z.Checked = True then 
begin 
    if not(tblMNLOC30.State in [dsEdit, dsInsert]) then 
     tblMNLOC30.Edit; 
    tblmnloc30.FieldByName('C0900Z').AsString := ''; 
    tblmnloc30.FieldByName((Sender as TDBCheckBox).DataField).AsString := 'True'; 
    tblmnloc30.Post; 
    tblMNLOC30.Edit; 
end; 
    (Sender as TDBCheckBox).OnClick := chkC0900AClick; 
    chkC0900Z.OnClick := chkC0900ZClick; 
end; 

procedure TformLOC30v15.chkC0900ZClick(Sender: TObject); 
begin 
chkC0900A.OnClick :=nil; 
chkC0900b.OnClick :=nil; 
chkC0900c.OnClick :=nil; 
chkC0900d.OnClick :=nil; 
chkC0900z.OnClick := nil; 
if chkC0900Z.Checked = True then 
begin 
    if not(tblMNLOC30.State in [dsEdit, dsInsert]) then 
     tblMNLOC30.Edit; 
    tblmnloc30.FieldByName('C0900A').AsString := ''; 
    tblmnloc30.FieldByName('C0900B').AsString := ''; 
    tblmnloc30.FieldByName('C0900C').AsString := ''; 
    tblmnloc30.FieldByName('C0900D').AsString := ''; 
    tblmnloc30.FieldByName('c0900Z').AsString := 'True'; 
    tblmnloc30.Post; 
    tblMNLOC30.Edit; 
end; 
chkC0900Z.OnClick := chkC0900ZClick; 
chkC0900A.OnClick := chkC0900AClick; 
chkC0900b.OnClick := chkC0900AClick; 
chkC0900c.OnClick := chkC0900AClick; 
chkC0900d.OnClick := chkC0900AClick; 
end; 
+0

'OnClick' 핸들러를 지우면 문제가 해결되면 다른 곳에서 데이터 변경에 대한 응답으로 이러한 이벤트를 트리거하는 코드가있는 것 같습니다. 이 경우 실제로 누출 된 디자인을 패치하기 위해 더 많은 고약을 사용하고 있습니다. (위의 질문에 대한 내 의견을 참조하십시오.) –

+0

사실 두 가지 모두 재귀 적으로 호출하고있었습니다. 핸들러를 호출하는 것은 없습니다. –

관련 문제