2015-02-05 82 views
1

我有一组数据库复选框,并在末尾有一个“以上都不是”框。我想要做的是,如果点击“以上都不是”,则清除其余部分。如果它已被选中,并且任何其他人被点击,则清除“以上都不是”框。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

你为什么要发布你更新的数据?这当然会在数据保存时造成不一致? – 2015-02-06 09:27:08

回答

0

好的......我想通了。如果有人感兴趣,这里是结束代码。

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”处理程序解决了您的问题,那么您在别处有代码来响应数据更改而触发这些事件?如果是这样的话,那么你所做的全部就是用更多的膏药来修补漏水的设计。 (请参阅我对上述问题的评论。) – 2015-02-06 09:26:26

+0

实际上发生的事情都是递归调用自己。没有别的东西叫做处理程序。 – 2015-02-06 14:48:03

相关问题