|  | @@ -24,6 +24,8 @@ type
 | 
	
		
			
				|  |  |      procedure sdvBillsMeasureAfterClose(Sender: TObject);
 | 
	
		
			
				|  |  |      procedure sdvBillsMeasureAfterValueChanged(AValue: TsdValue);
 | 
	
		
			
				|  |  |      procedure sdvBillsMeasureCurrentChanged(ARecord: TsdDataRecord);
 | 
	
		
			
				|  |  | +    procedure sdvBillsMeasureBeforeValueChange(AValue: TsdValue;
 | 
	
		
			
				|  |  | +      const NewValue: Variant; var Allow: Boolean);
 | 
	
		
			
				|  |  |    private
 | 
	
		
			
				|  |  |      FProjectData: TObject;
 | 
	
		
			
				|  |  |      FBillsData: TBillsData;
 | 
	
	
		
			
				|  | @@ -434,7 +436,7 @@ begin
 | 
	
		
			
				|  |  |    if not CheckValidData then
 | 
	
		
			
				|  |  |      Allow := False;
 | 
	
		
			
				|  |  |    if not Allow then Exit;
 | 
	
		
			
				|  |  | -  
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |    vNode := TBillsIDTreeNode(BillsMeasureTree.FindNode(GetBillsID));
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |    CheckLockedData;
 | 
	
	
		
			
				|  | @@ -1085,4 +1087,89 @@ begin
 | 
	
		
			
				|  |  |      Result := ANode;
 | 
	
		
			
				|  |  |  end;
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +procedure TBillsMeasureData.sdvBillsMeasureBeforeValueChange(
 | 
	
		
			
				|  |  | +  AValue: TsdValue; const NewValue: Variant; var Allow: Boolean);
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +   function CheckParentExist(ANode: TBillsIDTreeNode): Boolean;
 | 
	
		
			
				|  |  | +   var
 | 
	
		
			
				|  |  | +     vParent: TBillsIDTreeNode;
 | 
	
		
			
				|  |  | +   begin
 | 
	
		
			
				|  |  | +     Result := False;
 | 
	
		
			
				|  |  | +     vParent := TBillsIDTreeNode(ANode.Parent);
 | 
	
		
			
				|  |  | +     while Assigned(vParent) and not Result do
 | 
	
		
			
				|  |  | +     begin
 | 
	
		
			
				|  |  | +       if vParent.Rec.IsGatherZJJL.AsBoolean then
 | 
	
		
			
				|  |  | +         Result := True;
 | 
	
		
			
				|  |  | +       vParent := TBillsIDTreeNode(vParent.Parent);
 | 
	
		
			
				|  |  | +     end;
 | 
	
		
			
				|  |  | +   end;
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +   procedure CancelParentCheck(ANode: TBillsIDTreeNode);
 | 
	
		
			
				|  |  | +   var
 | 
	
		
			
				|  |  | +     vParent: TBillsIDTreeNode;
 | 
	
		
			
				|  |  | +   begin
 | 
	
		
			
				|  |  | +     vParent := TBillsIDTreeNode(ANode.Parent);
 | 
	
		
			
				|  |  | +     while Assigned(vParent) do
 | 
	
		
			
				|  |  | +     begin
 | 
	
		
			
				|  |  | +       if vParent.Rec.IsGatherZJJL.AsBoolean then
 | 
	
		
			
				|  |  | +         vParent.Rec.IsGatherZJJL.AsBoolean := False;
 | 
	
		
			
				|  |  | +       vParent := TBillsIDTreeNode(vParent.Parent);
 | 
	
		
			
				|  |  | +     end;
 | 
	
		
			
				|  |  | +   end;
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +   function CheckChildrenExist(ANode: TBillsIDTreeNode): Boolean;
 | 
	
		
			
				|  |  | +   var
 | 
	
		
			
				|  |  | +     iChild: Integer;
 | 
	
		
			
				|  |  | +     vChild: TBillsIDTreeNode;
 | 
	
		
			
				|  |  | +   begin
 | 
	
		
			
				|  |  | +     Result := False;
 | 
	
		
			
				|  |  | +     for iChild := 0 to ANode.ChildCount - 1 do
 | 
	
		
			
				|  |  | +     begin
 | 
	
		
			
				|  |  | +       vChild := TBillsIDTreeNode(ANode.ChildNodes[iChild]);
 | 
	
		
			
				|  |  | +       if vChild.Rec.IsGatherZJJL.AsBoolean or CheckChildrenExist(vChild) then
 | 
	
		
			
				|  |  | +       begin
 | 
	
		
			
				|  |  | +         Result := True;
 | 
	
		
			
				|  |  | +         Break;
 | 
	
		
			
				|  |  | +       end;
 | 
	
		
			
				|  |  | +     end;
 | 
	
		
			
				|  |  | +   end;
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +   procedure CancelChildrenCheck(ANode: TBillsIDTreeNode);
 | 
	
		
			
				|  |  | +   var
 | 
	
		
			
				|  |  | +     iChild: Integer;
 | 
	
		
			
				|  |  | +     vChild: TBillsIDTreeNode;
 | 
	
		
			
				|  |  | +   begin
 | 
	
		
			
				|  |  | +     for iChild := 0 to ANode.ChildCount - 1 do
 | 
	
		
			
				|  |  | +     begin
 | 
	
		
			
				|  |  | +       vChild := TBillsIDTreeNode(ANode.ChildNodes[iChild]);
 | 
	
		
			
				|  |  | +       if vChild.Rec.IsGatherZJJL.AsBoolean then
 | 
	
		
			
				|  |  | +         vChild.Rec.IsGatherZJJL.AsBoolean := False
 | 
	
		
			
				|  |  | +       else
 | 
	
		
			
				|  |  | +         CancelChildrenCheck(vChild);
 | 
	
		
			
				|  |  | +     end;
 | 
	
		
			
				|  |  | +   end;
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +var
 | 
	
		
			
				|  |  | +  vNode: TBillsIDTreeNode;
 | 
	
		
			
				|  |  | +begin
 | 
	
		
			
				|  |  | +  vNode := TBillsIDTreeNode(BillsMeasureTree.FindNode(AValue.Owner.ValueByName('ID').AsInteger));
 | 
	
		
			
				|  |  | +  if SameText(AValue.FieldName, 'IsGatherZJJL') and NewValue then
 | 
	
		
			
				|  |  | +  begin
 | 
	
		
			
				|  |  | +    if CheckParentExist(vNode) then
 | 
	
		
			
				|  |  | +    begin
 | 
	
		
			
				|  |  | +      if QuestMessage('父项已勾选,继续将取消父项勾选。') then
 | 
	
		
			
				|  |  | +        CancelParentCheck(vNode)
 | 
	
		
			
				|  |  | +      else
 | 
	
		
			
				|  |  | +        Allow := False;
 | 
	
		
			
				|  |  | +    end
 | 
	
		
			
				|  |  | +    else if CheckChildrenExist(vNode) then
 | 
	
		
			
				|  |  | +    begin
 | 
	
		
			
				|  |  | +      if QuestMessage('子项已勾选,继续将取消子项勾选。') then
 | 
	
		
			
				|  |  | +        CancelChildrenCheck(vNode)
 | 
	
		
			
				|  |  | +      else
 | 
	
		
			
				|  |  | +        Allow := False;
 | 
	
		
			
				|  |  | +    end;
 | 
	
		
			
				|  |  | +  end;
 | 
	
		
			
				|  |  | +end;
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |  end.
 |