unit U_Kalc;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, RzRadChk, RzButton, StdCtrls, Mask, RzEdit, RzSpnEdt, ExtCtrls,
  RzPanel, RzTabs, exgrid, RapTree, FlytreePro, ActnList, Menus, RzRadGrp,
  DB, kbmMemTable, cxStyles, cxCustomData, cxGraphics, cxFilter, cxData,
  cxDataStorage, cxEdit, cxDBData, cxGridLevel, cxClasses, cxControls,
  cxGridCustomView, cxGridCustomTableView, cxGridTableView,
  cxGridDBTableView, cxGrid, cxSpinEdit, cxTextEdit, cxProgressBar,
  cxDBLookupComboBox, Buttons,
  U_Kalc_DM, U_BaseCommon, cxContainer, cxMaskEdit, cxDropDownEdit, cxLookupEdit,
  cxDBLookupEdit, cxDBExtLookupComboBox, RzCmboBx, cxCheckComboBox,
  cxCheckBox, cxCurrencyEdit, cxColorComboBox, cxMemo, xmldom, Provider,
 // QGrids,
  U_BaseConstants, U_SCSComponent,
  XMLIntf, {XMLDom, } XMLDoc,//MSXML2_TLB,
   ToolWin, ComCtrls, ImgList, RzGroupBar, siComp, siLngLnk,
  cxGridBandedTableView, cxGridDBBandedTableView, cxLookAndFeels,
  U_Common_Classes, cxLookAndFeelPainters, cxNavigator;
//const // for captions
//    strCalcCapt1 = 'Ширина этажа, ';
//    strCalcCapt2 = 'Длина этажа, ';
//    strCalcCapt3 = 'Высота этажа, ';
//    strCalcCapt4 = 'Общая площадь, ';
//    strCalcCapt5 = 'Рабочая площадь , ';
//    strCalcCapt6 = 'Средняя S комнаты, ';
//    strCalcCapt7 = 'Ср. ширина комнаты, ';
//    strCalcCapt8 = 'Ср. длина комнаты, ';
//    strCalcCapt9 = 'Площадь для 1 РМ, ';
//    strCalcCapt10 = 'Расстояние от кросса к самому близкому  РМ, ';
//    strCalcCapt11 = 'Расстояние от кросса к самому дальнему  РМ, ';
//    strCalcCapt12 = 'Расход короба на 1 РМ, ';
//    strCalcCapt13 = 'Расход короба на 1 комнату, ';
//    strCalcCapt14 = '=                          ';
//    strCalcCapt15 = 'К-во кабеля в упаковке, ';
//    strCalcCapt16 = 'Высота размещения РМ, ';
//    strCalcCapt17 = 'Запас для выполнения разделки кабеля, ';
//    strCalcCapt18 = 'Высота подвесного потолка, ';

const
    idwCC = 1;   //'Прокладка кабельных каналов (м)';
    idwCable  = 2; // 'Укладка кабеля (м)';
    idwRM = 3;  //'Установка робочего места (шт.)';
    idwShelf = 4; // 'Монтаж шкафа (шт.)';
    idwPP = 5; //'Монтаж патч-панели в шкаф/стойку (шт.)';
    idwOrg = 6; //'Монтаж организатора в шкаф /стойку (шт.) ';
    idwCrossPort = 7; //'Кроссировка (1 порт)';
    idwTestPort = 8; //'Тестирование соединений (1 порт)';
    idwProectPort = 9; //'Проектные работы  (1 порт)';
    idwTransport = 10; //'Транспортные расходы';
    idwAnother = 11; //'Другие пусконаладочные работы';
    idwKoef = 12; //'Коэфициент  на работы (согласно особому характеру работ)';
const //для типа отчётной строки
    idTypePozMaterial = '1';
    idTypePozWorks = '2';

type
  T_KalcDocument = class(TMyObject)
   // CoXML: CoDOMDocument;
    Xml: TXMLDocument;
    TopNode: IDOMDocument;
    RootNode: IDomNode;
//    FNodeList: IXMLDOMNodeList;
    FOwner: TForm;
  private
    //coXML: CoDOMDocument;
    FName: string;
    procedure InitXMl;
    procedure AddParamToXMl(AName: string; Value: string = '');
    procedure AddToXmlGrid(AGrid: TcxGridDBTableView);
    procedure LoadGridFromXML(AGrid: TcxGridDBTableView);

  public
    constructor Create(AOwner:  TObject; AFileName: string = '');
    destructor Destroy; override;
    procedure SaveComponentValue(AComponent: TComponent);
    procedure LoadComponentValue(AComponent: TComponent);
    procedure CreateXML(AFieldName: string);
    procedure SaveToFile(AFileName: string);
    procedure LoadFromFile(AFileName: string);

  end;

  TF_Kalc = class(TForm)
    Main_PageControl: TRzPageControl;
    TabProject: TRzTabSheet;
    TabComponent: TRzTabSheet;
    RMGroup: TRzGroupBox;
    BuildGroupBox5: TRzGroupBox;
    Label2: TLabel;
    vKolRM: TRzSpinEdit;
    Label1: TLabel;
    vKolPortForRM: TRzSpinEdit;
    vKKolDopMest: TRzSpinEdit;
    Label3: TLabel;
    Label4: TLabel;
    vKolFloor: TRzSpinEdit;
    Label5: TLabel;
    vWidthFloor: TRzSpinEdit;
    Label6: TLabel;
    vLengthFloor: TRzSpinEdit;
    Label7: TLabel;
    vSTotalPlase: TRzSpinEdit;
    vKSWorkPlase: TRzSpinEdit;
    Label8: TLabel;
    vSWorkPlase: TRzSpinEdit;
    Label9: TLabel;
    Label10: TLabel;
    vSKab_Edit: TRzSpinEdit;
    Label11: TLabel;
    vHeighFloor: TRzSpinEdit;
    Label13: TLabel;
    vSForRM: TRzSpinEdit;
    Label14: TLabel;
    vTotalKolRM: TRzSpinEdit;
    vTotalKolPort: TRzSpinEdit;
    Label15: TLabel;
    Label16: TLabel;
    StaticText1: TStaticText;
    StaticText2: TStaticText;
    vKolRMForFloor: TFlyTreeViewPro;
    pmForGrid: TPopupMenu;
    ActionList1: TActionList;
    actAddRecord: TAction;
    actAddRecord1: TMenuItem;
    actDelRecord: TAction;
    N1: TMenuItem;
    RzGroupBox3: TRzGroupBox;
    TypeConnectEuipment_RadioGroup: TRzRadioGroup;
    CableCanalSheet: TRzTabSheet;
    actAddCableCanal: TAction;
    actDelCableCanal: TAction;
    TabSheet1: TRzTabSheet;
    RzPanel1: TRzPanel;
    RzPanel2: TRzPanel;
    AllComponent_GridDBTableView1: TcxGridDBTableView;
    AllComponent_GridLevel1: TcxGridLevel;
    AllComponent_Grid: TcxGrid;
    AllComponent_Grid_Name: TcxGridDBColumn;
    AllComponent_Grid_Arcticul: TcxGridDBColumn;
    AllComponent_Grid_Kolvo: TcxGridDBColumn;
    AllComponent_Grid_Cost: TcxGridDBColumn;
    AllComponent_Grid_price: TcxGridDBColumn;
    RzGroupBox4: TRzGroupBox;
    Label36: TLabel;
    vKolReservCable: TRzSpinEdit;
    Label37: TLabel;
    vKolPortForMCable: TRzSpinEdit;
    actAddCable: TAction;
    actDelCable: TAction;
    vKolPKForRM: TRzSpinEdit;
    Label39: TLabel;
    TypeWayCC_Panel: TRzPanel;
    TypeWeyCC_PageControl: TRzPageControl;
    CableInFloor_Sheet: TRzTabSheet;
    CableUnderCeil_Sheet: TRzTabSheet;
    CableInCC_Sheet: TRzTabSheet;
    TypeWayCC_TopPanel: TRzPanel;
    FixCableWey_ComboBox: TRzComboBox;
    Label22: TLabel;
    CCForFloor_Grid: TcxGrid;
    CCForFloor_GridTableView: TcxGridDBTableView;
    CCForFloor_Grid_ID: TcxGridDBColumn;
    CCForFloor_Grid_Name: TcxGridDBColumn;
    CCForFloor_Grid_Articul: TcxGridDBColumn;
    CCForFloor_Grid_Price: TcxGridDBColumn;
    CCForFloor_Grid_Percent: TcxGridDBColumn;
    CCForFloor_GridLevel: TcxGridLevel;
    Label23: TLabel;
    RzGroupBox1: TRzGroupBox;
    ScrollBox1: TScrollBox;
    FormulaFloor_Group: TRzRadioGroup;
    FormulaFloor1_Panel: TRzPanel;
    Label43: TLabel;
    Label44: TLabel;
    vFormulaFloor1_X: TRzSpinEdit;
    vFormulaFloor1_Y: TRzSpinEdit;
    FormulaFloor2_Panel: TRzPanel;
    Label42: TLabel;
    Label45: TLabel;
    vFormulaFloor2_X: TRzSpinEdit;
    Label46: TLabel;
    vKolRooms: TRzSpinEdit;
    Label40: TLabel;
    vWidthRoom: TRzSpinEdit;
    Label41: TLabel;
    vLengthRoom: TRzSpinEdit;
    CCUnderCeil_Grid: TcxGrid;
    CCUnderCeil_GridTableView: TcxGridDBTableView;
    CCUnderCeil_Grid_id: TcxGridDBColumn;
    CCUnderCeil_Grid_Name: TcxGridDBColumn;
    CCUnderCeil_Grid_Articul: TcxGridDBColumn;
    CCUnderCeil_Grid_price: TcxGridDBColumn;
    CCUnderCeil_Grid_Percent: TcxGridDBColumn;
    CCUnderCeil_GridLevel: TcxGridLevel;
    vHeigthFalseCeil: TRzSpinEdit;
    Label12: TLabel;
    Label48: TLabel;
    FormulaUnderCail_Group: TRzGroupBox;
    ScrollBox2: TScrollBox;
    FormulaUnderCail_RadioGroup: TRzRadioGroup;
    FormulaUnderCail1_Panel: TRzPanel;
    Label49: TLabel;
    Label50: TLabel;
    vFormulaUnderCeil1_X: TRzSpinEdit;
    vFormulaUnderCeil1_Y: TRzSpinEdit;
    FormulaUnderCail2_Panel: TRzPanel;
    Label51: TLabel;
    vFormulaUnderCeil2_X: TRzSpinEdit;
    FormulaDekorCC_Group: TRzGroupBox;
    ScrollBox3: TScrollBox;
    FormulaDekorCC_RadioGroup: TRzRadioGroup;
    FormulaDekorCC1_Panel: TRzPanel;
    Label53: TLabel;
    Label54: TLabel;
    FormulaDekorCC2_Panel: TRzPanel;
    Label56: TLabel;
    vFormulaDekorCC2_X: TRzSpinEdit;
    Label55: TLabel;
    Label59: TLabel;
    vHeigthCC: TRzSpinEdit;
    RzGroupBox5: TRzGroupBox;
    ScrollBox4: TScrollBox;
    FormulaInCC_Group: TRzRadioGroup;
    FormulaInCC3_Panel: TRzPanel;
    Label65: TLabel;
    vFormulaInCC3_X: TRzSpinEdit;
    Label57: TLabel;
    Label66: TLabel;
    vFormulaInCC3_Y: TRzSpinEdit;
    FormulaInCC1_Panel: TRzPanel;
    Label63: TLabel;
    Label64: TLabel;
    Label17: TLabel;
    vFormulaInCC1_X: TRzSpinEdit;
    Openwir_Sheet: TRzTabSheet;
    ElPointFix_Grid: TcxGrid;
    ElPointFix_GridTableView: TcxGridDBTableView;
    ElPointFix_Grid_id: TcxGridDBColumn;
    ElPointFix_Grid_Name: TcxGridDBColumn;
    ElPointFix_Grid_Articul: TcxGridDBColumn;
    ElPointFix_Grid_Price: TcxGridDBColumn;
    ElPointFix_Grid_Percent: TcxGridDBColumn;
    ElPointFix_GridLevel: TcxGridLevel;
    Label60: TLabel;
    RzGroupBox6: TRzGroupBox;
    ScrollBox5: TScrollBox;
    OpenWir_RadioGroup: TRzRadioGroup;
    MetodOpenWir1_panel: TRzPanel;
    Label61: TLabel;
    vMetodOpenWir1_Rashod: TRzSpinEdit;
    Label70: TLabel;
    FormulaInCC2_Panel: TRzPanel;
    Label68: TLabel;
    Label69: TLabel;
    Label72: TLabel;
    vFormulaInCC2_X: TRzSpinEdit;
    Label31: TLabel;
    vDistShot: TRzSpinEdit;
    vDistLong: TRzSpinEdit;
    Label21: TLabel;
    Label47: TLabel;
    Label73: TLabel;
    Label74: TLabel;
    ZakazchikName_Edit: TRzEdit;
    PodradchikName_edit: TRzEdit;
    Curr_ComboBox: TcxComboBox;
    actExit: TAction;
    EIncludHarProj: TRzCheckBox;
    CC_PopupMenu: TPopupMenu;
    MenuItem1: TMenuItem;
    MenuItem2: TMenuItem;
    Cable_PopupMenu: TPopupMenu;
    MenuItem3: TMenuItem;
    MenuItem4: TMenuItem;
    OpenDialog1: TOpenDialog;
    SaveDialog1: TSaveDialog;
    ToolBar1: TToolBar;
    OpenFile_Btn: TRzBitBtn;
    SaveFile_Btn: TRzBitBtn;
    ClearProject_Btn: TRzBitBtn;
    gbFloorsProperties: TRzGroupBox;
    gbSquare: TRzGroupBox;
    gbRoomProperties: TRzGroupBox;
    ToolBar2: TToolBar;
    tbOpen: TToolButton;
    tbSave: TToolButton;
    tbClear: TToolButton;
    ImageList1: TImageList;
    pcComponentTypes: TRzPageControl;
    tsWorkPlaces: TRzTabSheet;
    CostRMGrid: TcxGrid;
    CostRMGridTableView: TcxGridDBTableView;
    ID_Column: TcxGridDBColumn;
    Name_Column: TcxGridDBColumn;
    Articul_Column: TcxGridDBColumn;
    Price_Column: TcxGridDBColumn;
    CostRMGrid_Kolvo: TcxGridDBColumn;
    CostRMGridLevel1: TcxGridLevel;
    tsPathCords: TRzTabSheet;
    CostPK_Grid: TcxGrid;
    CostPKDBTableView: TcxGridDBTableView;
    CostPKColumn_ID: TcxGridDBColumn;
    CostPKColumn_Name: TcxGridDBColumn;
    CostPKColumn_Articul: TcxGridDBColumn;
    CostPKColumn_Price: TcxGridDBColumn;
    CostPK_Missing: TcxGridDBColumn;
    CostPK_Persent: TcxGridDBColumn;
    CostPK_GridLevel1: TcxGridLevel;
    tsPathPanals: TRzTabSheet;
    CostPP_Grid: TcxGrid;
    CostPP_GridDBTableView: TcxGridDBTableView;
    CostPP_GridColumn_ID: TcxGridDBColumn;
    CostPP_GridColumn_Name: TcxGridDBColumn;
    CostPP_GridColumn_Articul: TcxGridDBColumn;
    CostPP_GridColumn_Price: TcxGridDBColumn;
    CostPP_GridLevel1: TcxGridLevel;
    tsOrganizator: TRzTabSheet;
    CostOrg_Grid: TcxGrid;
    GT_CostOrg: TcxGridDBTableView;
    CostOrg_GridColumn_ID: TcxGridDBColumn;
    CostOrg_GridColumn_Name: TcxGridDBColumn;
    CostOrg_GridColumn_Articul: TcxGridDBColumn;
    CostOrg_GridColumn_Price: TcxGridDBColumn;
    CostOrg_GridLevel1: TcxGridLevel;
    tsConsolidationPoints: TRzTabSheet;
    StaticText3: TStaticText;
    CostShelf_Grid: TcxGrid;
    CostShelf_GridDBTableView: TcxGridDBTableView;
    CostShelf_GridColumn_Id: TcxGridDBColumn;
    CostShelf_GridColumnName: TcxGridDBColumn;
    CostShelf_GridColumnArticul: TcxGridDBColumn;
    CostShelf_GridColumn_Price: TcxGridDBColumn;
    CostShelf_GridLevel: TcxGridLevel;
    RzPanel4: TRzPanel;
    Label29: TLabel;
    vCm_Shelf: TRzSpinEdit;
    OnceShelfCheck: TRzCheckBox;
    StaticText7: TStaticText;
    ServFloor_ComboBox: TcxLookupComboBox;
    RzPanel5: TRzPanel;
    ECostShelfGridCheck: TRzCheckBox;
    RzPanel6: TRzPanel;
    pnShelfForFloorOpt: TRzPanel;
    FixAllEcxeptSelCheck: TRzCheckBox;
    ShelfForFloor_Grid: TcxGrid;
    ShelfForFloor_GridDBTableView: TcxGridDBTableView;
    ShelfForFloor_GridColumn_Floor: TcxGridDBColumn;
    ShelfForFloor_GridColumn_id_Shelf: TcxGridDBColumn;
    ShelfForFloor_GridColumn_Price: TcxGridDBColumn;
    ShelfForFloor_Grid_Id: TcxGridDBColumn;
    ShelfForFloor_GridLevel: TcxGridLevel;
    Splitter1: TSplitter;
    tsAdditionalEquipment: TRzTabSheet;
    RzPanel7: TRzPanel;
    Label30: TLabel;
    vCostDopEq: TRzSpinEdit;
    RzPanel8: TRzPanel;
    EDopEqGrid_Check: TRzCheckBox;
    DopEq_Grid: TcxGrid;
    DopEq_TableView: TcxGridDBTableView;
    DopEq_Grid_id: TcxGridDBColumn;
    DopEq_Grid_Name: TcxGridDBColumn;
    DopEq_Grid_Articul: TcxGridDBColumn;
    DopEq_Grid_Price: TcxGridDBColumn;
    DopEq_Kolvo: TcxGridDBColumn;
    DopEq_Level: TcxGridLevel;
    RzPanel9: TRzPanel;
    Label20: TLabel;
    vCPK: TRzSpinEdit;
    eKalcPKForRM_Check: TRzCheckBox;
    RzPanel10: TRzPanel;
    ECostPKGridCheck: TRzCheckBox;
    RzPanel11: TRzPanel;
    Label19: TLabel;
    vCPP: TRzSpinEdit;
    Label34: TLabel;
    vKolPortPP: TRzSpinEdit;
    RzPanel12: TRzPanel;
    ECostPPGrid_Check: TRzCheckBox;
    RzPanel13: TRzPanel;
    Label28: TLabel;
    vCOrg: TRzSpinEdit;
    RzPanel14: TRzPanel;
    ECostOrgGrid_Check: TRzCheckBox;
    RzPanel15: TRzPanel;
    RzPanel16: TRzPanel;
    Label18: TLabel;
    vCRM: TRzSpinEdit;
    RzPanel17: TRzPanel;
    ECostRMGrid_Check: TRzCheckBox;
    RzGroupBar1: TRzGroupBar;
    grComponentTypes: TRzGroup;
    pcChannelComponTypes: TRzPageControl;
    TabSheet2: TRzTabSheet;
    RzPanel18: TRzPanel;
    StaticText4: TStaticText;
    CableCanalGrid: TcxGrid;
    CableCanalGrid_TableView1: TcxGridDBTableView;
    CableCanalGrid_NPP: TcxGridDBColumn;
    CableCanalGrid_Name: TcxGridDBColumn;
    CableCanalGrid_Articul: TcxGridDBColumn;
    CableCanalGrid_Price: TcxGridDBColumn;
    CableCanalGrid_Percent: TcxGridDBColumn;
    CableCanalGridLevel1: TcxGridLevel;
    TabSheet4: TRzTabSheet;
    RzPanel19: TRzPanel;
    StaticText5: TStaticText;
    Cable_Grid: TcxGrid;
    Cable_Grid_DBTableView: TcxGridDBTableView;
    Cable_Grid_Name: TcxGridDBColumn;
    Cable_Grid_Articul: TcxGridDBColumn;
    Cable_Grid_Price: TcxGridDBColumn;
    Cable_Grid_Percent: TcxGridDBColumn;
    Cable_Grid_TypeUse: TcxGridDBColumn;
    Cable_GridLevel1: TcxGridLevel;
    RzPanel20: TRzPanel;
    Label35: TLabel;
    vKolCableInPark: TRzSpinEdit;
    Label33: TLabel;
    vHeigthRM: TRzSpinEdit;
    Label32: TLabel;
    vKolTehreserv: TRzSpinEdit;
    Label26: TLabel;
    vKCableRezerv: TRzSpinEdit;
    Label24: TLabel;
    vCableEndRezerv: TRzSpinEdit;
    gbChannelComponTypes: TRzGroupBar;
    RzPanel21: TRzPanel;
    grChannelComponTypes: TRzGroup;
    RzPanel22: TRzPanel;
    btCalc: TSpeedButton;
    btPrintReport: TSpeedButton;
    btEditReport: TSpeedButton;
    Clear_Btn: TSpeedButton;
    FixBtn: TSpeedButton;
    KolRMBtn: TSpeedButton;
    cxStyleRepository1: TcxStyleRepository;
    cxBackNormal: TcxStyle;
    cxBackDisabled: TcxStyle;
    Splitter2: TSplitter;
    RzGroupBox2: TRzGroupBox;
    ElementOfCC_Grid: TcxGrid;
    ElementOfCC_Grid_DBTableView: TcxGridDBTableView;
    id: TcxGridDBColumn;
    Npp_CC: TcxGridDBColumn;
    Id_Type: TcxGridDBColumn;
    Articul: TcxGridDBColumn;
    price: TcxGridDBColumn;
    rashod: TcxGridDBColumn;
    cxGridLevel1: TcxGridLevel;
    lng_Forms: TsiLangLinked;
    TabSheet3: TRzTabSheet;
    RzPanel3: TRzPanel;
    RzPanel23: TRzPanel;
    btClearPriceWorks: TSpeedButton;
    PriceWorks_Grid: TcxGrid;
    PriceWorks_TableView: TcxGridDBTableView;
    PriceWorks_Grid_Name: TcxGridDBColumn;
    PriceWorks_Grid_Price: TcxGridDBColumn;
    cxGridLevel2: TcxGridLevel;
    AllComponent_Grid_TypePoz: TcxGridDBColumn;
    cxFoter: TcxStyle;
    Label25: TLabel;
    vKoefDistShot: TRzSpinEdit;
    Label27: TLabel;
    vKoefDistLong: TRzSpinEdit;
    Label38: TLabel;
    procedure vKSWorkPlaseChange(Sender: TObject);
    procedure vWidthFloorChange(Sender: TObject);
    procedure vLengthFloorChange(Sender: TObject);
    procedure vSTotalPlaseChange(Sender: TObject);
    procedure vKolFloorChange(Sender: TObject);
    procedure vKolPortForRMChange(Sender: TObject);
    procedure vTotalKolRMChange(Sender: TObject);
    procedure vKolRMChange(Sender: TObject);
    procedure KolRMBtnClick(Sender: TObject);
   { procedure vKolRMForFloorEdited(Sender: TObject; Node: TFlyNode;
      var S: String);}
    procedure ECostRMGrid_CheckClick(Sender: TObject);
    procedure ECostPPGrid_CheckClick(Sender: TObject);
    procedure actAddRecordExecute(Sender: TObject);
    procedure ECostPKGridCheckClick(Sender: TObject);
    procedure actDelRecordExecute(Sender: TObject);
    procedure ECostOrgGrid_CheckClick(Sender: TObject);
    procedure ECostShelfGridCheckClick(Sender: TObject);
    procedure Main_PageControlChanging(Sender: TObject; NewIndex: Integer;
      var AllowChange: Boolean);
    procedure actAddCableCanalExecute(Sender: TObject);
    function GetFreePercent(count: integer): integer;
    function GetFreePercentForCable: Integer;
 //   Procedure InitTypeOfElementCC_MemTable;
 //   Procedure InitTypeUseCable_MemTable;
    procedure actDelCableCanalExecute(Sender: TObject);
    procedure CableCanalMemTableChange(Sender: TField);
    procedure CableCanalGrid_TableView1EditValueChanged(
      Sender: TcxCustomGridTableView; AItem: TcxCustomGridTableItem);
    procedure CableCanalMemTableAfterDelete(DataSet: TDataSet);
    procedure btCalcClick(Sender: TObject);
    procedure actAddCableExecute(Sender: TObject);
    procedure actDelCableExecute(Sender: TObject);
    procedure CableCanalGrid_TableView1KeyDown(Sender: TObject;
      var Key: Word; Shift: TShiftState);
    procedure Cable_Grid_DBTableViewKeyDown(Sender: TObject; var Key: Word;
      Shift: TShiftState);
    procedure CostRMGridKeyDown(Sender: TObject; var Key: Word;
      Shift: TShiftState);
    procedure FixBtnClick(Sender: TObject);
    procedure Clear_BtnClick(Sender: TObject);
    procedure EDopEqGrid_CheckClick(Sender: TObject);
    procedure DopEq_TableViewEditValueChanged(
      Sender: TcxCustomGridTableView; AItem: TcxCustomGridTableItem);
    procedure CostPP_GridDBTableViewEditValueChanged(
      Sender: TcxCustomGridTableView; AItem: TcxCustomGridTableItem);
    procedure GT_CostOrgEditValueChanged(
      Sender: TcxCustomGridTableView; AItem: TcxCustomGridTableItem);
    procedure Cable_Grid_DBTableViewEditValueChanged(
      Sender: TcxCustomGridTableView; AItem: TcxCustomGridTableItem);
    procedure vKKolDopMestChange(Sender: TObject);
    procedure FixCableWey_ComboBoxCloseUp(Sender: TObject);
    procedure FormulaFloor_GroupChanging(Sender: TObject;
      NewIndex: Integer; var AllowChange: Boolean);
    procedure FormulaUnderCail_RadioGroupChanging(Sender: TObject;
      NewIndex: Integer; var AllowChange: Boolean);
    procedure FormulaDekorCC_RadioGroupChanging(Sender: TObject;
      NewIndex: Integer; var AllowChange: Boolean);
    procedure FormulaInCC_GroupChanging(Sender: TObject; NewIndex: Integer;
      var AllowChange: Boolean);
    procedure ServFloor_ComboBoxPropertiesChange(Sender: TObject);
    procedure vWidthRoomChange(Sender: TObject);
    procedure vLengthRoomChange(Sender: TObject);
    procedure PrintClick(Sender: TObject);
    procedure actExitExecute(Sender: TObject);
    procedure btPrintReportClick(Sender: TObject);
    procedure btEditReportClick(Sender: TObject);
    procedure Curr_ComboBoxPropertiesChange(Sender: TObject);
    procedure vHeighFloorChange(Sender: TObject);
    procedure vSKab_EditChange(Sender: TObject);
    procedure vSForRMChange(Sender: TObject);
    procedure AllComponent_GridDBTableView1EditValueChanged(
      Sender: TcxCustomGridTableView; AItem: TcxCustomGridTableItem);
    procedure OpenFile_BtnClick(Sender: TObject);
    procedure SaveFile_BtnClick(Sender: TObject);
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
    procedure CostShelf_GridDBTableViewEditValueChanged(
      Sender: TcxCustomGridTableView; AItem: TcxCustomGridTableItem);
    procedure CostRMGridTableViewDragOver(Sender, Source: TObject; X,
      Y: Integer; State: TDragState; var Accept: Boolean);
    procedure CostRMGridTableViewDragDrop(Sender, Source: TObject; X,
      Y: Integer);
    procedure CostPKDBTableViewDragDrop(Sender, Source: TObject; X,
      Y: Integer);
    procedure CostPP_GridDBTableViewDragDrop(Sender, Source: TObject; X,
      Y: Integer);
    procedure GT_CostOrgDragDrop(Sender, Source: TObject; X,
      Y: Integer);
    procedure CostShelf_GridDBTableViewDragDrop(Sender, Source: TObject; X,
      Y: Integer);
    procedure DopEq_TableViewDragDrop(Sender, Source: TObject; X,
      Y: Integer);
    procedure CableCanalGrid_TableView1DragDrop(Sender, Source: TObject; X,
      Y: Integer);
    procedure ElPointFix_GridTableViewDragDrop(Sender, Source: TObject; X,
      Y: Integer);
    procedure CCForFloor_GridTableViewDragDrop(Sender, Source: TObject; X,
      Y: Integer);
    procedure CCUnderCeil_GridTableViewDragDrop(Sender, Source: TObject; X,
      Y: Integer);
    procedure AllComponent_GridDBTableView1FocusedItemChanged(
      Sender: TcxCustomGridTableView; APrevFocusedItem,
      AFocusedItem: TcxCustomGridTableItem);
    procedure AllComponent_Grid_pricePropertiesValidate(Sender: TObject;
      var DisplayValue: Variant; var ErrorText: TCaption;
      var Error: Boolean);
    procedure AllComponent_Grid_KolvoPropertiesValidate(Sender: TObject;
      var DisplayValue: Variant; var ErrorText: TCaption;
      var Error: Boolean);
    procedure Cable_Grid_DBTableViewDragDrop(Sender, Source: TObject; X,
      Y: Integer);
    procedure ClearProject_BtnClick(Sender: TObject);
    procedure grComponentTypesItems0Click(Sender: TObject);
    procedure grChannelComponTypesItems0Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure CostRMGridTableViewEditValueChanged(
      Sender: TcxCustomGridTableView; AItem: TcxCustomGridTableItem);
    procedure Name_ColumnPropertiesEditValueChanged(Sender: TObject);
    procedure DopEq_GridExit(Sender: TObject);
    procedure btClearPriceWorksClick(Sender: TObject);
    procedure AllComponent_Grid_TypePozGetDisplayText(
      Sender: TcxCustomGridTableItem; ARecord: TcxCustomGridRecord;
      var AText: String);
    procedure vKolRMForFloorEdited(Sender: TObject; Node: TFlyNode;
      var S: WideString);
  private
    { Private declarations }
    TotalKolCable, TotalKolCC: integer;
//    FCountCC, FCountECC: integer;
    procedure CalculateCC;
    procedure PutHaracterProjectInMT;
    procedure AddCCElements;

    procedure EnableTableView(ATableView: TcxGridDBTableView; AEnabled: Boolean);
    function GetKoefForWorks: double;

    procedure FixLabeles;
  public
    { Public declarations }
    Kalc_DM: TKalc_DM;
    KoefForWorks: double;
    ServerFloor: integer;
    procedure ClearProject;
    procedure AutoKomplectFloorByRM;
    function CmpFloorsWithKolRM: integer;
    //constructor Create(AOwner: TComponent);
    destructor Destroy; override;
    function CalculateProject: double;
    procedure AddRecordInReport(AName: string; AArticul: String; AKol: integer;
                                APrice, ACost: double; AidTypePoz: string = idTypePozMaterial);
    Procedure AddRecordInHaracterProject_MemTable(AName, AZnach: string);
    Function getCostOfProjectReportParams: TCostOfProjectReportParams;

    procedure Execute;

    function GetPriceForKalcFromDragCompon(ACompon: TSCSComponent): double;

    procedure PutToReportWork(AIdWorks: integer; AKolWorks: integer; AKoef: double = 1);
  end;

Const
  TempFile = 'spe.tmp';

const
  //название полей
  fnPercent = 'Percent';
  fnArticul = 'Articul';

Const
  //название свойств
  pnPORTCOUNT  = 'PORTCOUNT';

var
  F_Kalc: TF_Kalc;



implementation

uses Math, U_SCSLists, Treecoll, U_Main, U_ResourceReport, DBConsts, U_Common;
{$R *.dfm}
//***************************************************
function TF_Kalc.GetFreePercent(count: integer): integer;
var
  i: integer;
  RecNo: integer;
begin
  Result := 100;
//  RecNo := CableCanalMemTable.RecNo;
  Kalc_DM.CableCanalMemTable.First;
  for i := 0 to Count - 1 do
  begin
    Result := Result - Kalc_DM.CableCanalMemTable.FieldByName('Percent').AsInteger;
    if i = count then
    begin
    end
    else
      Kalc_DM.CableCanalMemTable.Next;
  end;
 end;
//****************************************************
//***************************************************
function TF_Kalc.GetFreePercentForCable: integer;
var
  i: integer;
  RecNo: integer;
  per1, per2: integer;
begin
  per1 := 100;
  per2 := 100;
  Result := -1;
//  RecNo := CableCanalMemTable.RecNo;
  Kalc_DM.Cable_MemTable.First;
  for i := 0 to Kalc_DM.Cable_MemTable.RecordCount - 1 do
  begin
    if Kalc_DM.Cable_MemTable.FieldByName('Id_Missing').AsInteger = tcuRaspred then
    begin
      Per1 := Per1 - Kalc_DM.Cable_MemTable.FieldByName('Percent').AsInteger;
    end
    else
      Per2 := Per2 - Kalc_DM.Cable_MemTable.FieldByName('Percent').AsInteger;
  Kalc_DM.Cable_MemTable.Next;
  end;
  if (per1 < 0) and ((Per2 >0) and (per2 <> 100))  then
  begin
    Result := 1;
  end
  else
  if (per1 > 0) and (Per2 < 0)  then
  begin
    Result := 2;
  end
  else
  if (per1 = 0) and ((Per2 = 0) or (per2 = 100)) then
  begin
    Result := 0;
  end;
  if (per1 < 0) and (per2 < 0) then
    Result := 3;
  if (per1 >0) and (result = -1) then
    result := 4;
  if (per2 >0) and (result = -1) then
    result := 5;
  if (per1 <0) and (result = -1) then
    result := 6;
  if (per2 <0) and (result = -1) then
    result := 7;
end;
//****************************************************

///*********------------------------******************
procedure TF_Kalc.CableCanalMemTableChange(Sender: TField);
begin
  if GetFreePercent(Kalc_DM.CableCanalMemTable.RecordCount)< 0 then
  begin
    StaticText4.Show;
  end
  else
  begin
    StaticText4.Hide;
  end;
end;
//****************************************************



procedure ValCostFromGrid(AEdit: TRzSpinEdit; ATable: TkbmMemTable);
var
  I, kolvo: integer;
  sum: double;
  val: double;
  KolvoFlag: boolean;
  Field: TField;
begin
   kolvo := 1;
   Field := ATable.FindField('Kolvo');
    if Field <> nil then
      KolvoFlag := true
    else
      KolvoFlag := false;
    Sum := 0;
    ATable.first;
    for i := 0 to ATable.RecordCount - 1 do
    begin
      if ATable.FieldByName('Price').AsString <> '' then
      begin
        if KolvoFlag then
          kolvo := ATable.FieldByName('Kolvo').AsInteger;
        if kolvo < 1 then
          kolvo := 1;
        val := ATable.FieldByName('Price').AsFloat;
        Sum := Sum +  Val * kolvo;
        kolvo := 1;
      end;
      ATable.Next;
    end;
  AEdit.Value := Sum;
end;

procedure TF_Kalc.DopEq_TableViewDragDrop(Sender, Source: TObject; X,
  Y: Integer);
var price: double;
begin
  price := GetPriceForKalcFromDragCompon(GDropComponent);
  U_Kalc_DM.AddRecordInMemTable(Kalc_DM.DopEq_MemTable, GDropComponent.Name, GDropComponent.ArticulProducer,Price,1);
 // TcxGridTableView(Sender).Refresh;
  ValCostFromGrid(vCostDopEq, Kalc_DM.DopEq_MemTable);
end;


function TF_Kalc.CmpFloorsWithKolRM: integer;
var
  KolRM, RMOfFloor, i: integer;
begin
  result := 0;
  KolRm := trunc(vTotalKolRM.Value);
  for i := 0 to vKolRMForFloor.Items.Count - 1 do
  begin
    if vKolRMForFloor.Items[i].Cells[1] = '' then
      RMOfFloor := 0
    else
      RMOfFloor := StrToInt(vKolRMForFloor.Items[i].Cells[1]);
    KolRM := KolRm - RMOfFloor;
  end;
  Result := KolRM; //* (-1);
end;

procedure TF_Kalc.AutoKomplectFloorByRM;
var
  KolRm,  KolFloor: integer;
  KolRmForFloor : integer;
  i, count: integer;
begin
  KolFloor := trunc(vKolFloor.Value);
  if KolFloor <= 0 then
    KolFloor := 1;
  KolRm := trunc(vTotalKolRM.Value);
  KolRmForFloor := trunc(KolRm / KolFloor);
  count := vKolRMForFloor.Items.Count -1;
  for i := 0 to Count do
  begin
    if i = Count then
    begin
      vKolRMForFloor.Items[i].Cells[1] := IntToStr(KolRmForFloor + KolRm mod KolFloor);
    end
    else
    begin
      vKolRMForFloor.Items[i].Cells[1] := IntToStr(KolRmForFloor);
    end;
  end;
end;
procedure TF_Kalc.vKSWorkPlaseChange(Sender: TObject);
var
  SVal: double;
begin
  If vSTotalPlase.Value <> 0 then
  begin
    SVal := vSTotalPlase.Value;
    vSWorkPlase.Value := SVal * vKSWorkPlase.Value / 100;
   // KolRMBtnClick(Self);
  end;
end;

procedure TF_Kalc.vWidthFloorChange(Sender: TObject);

begin
  vSTotalPlase.Value := vWidthFloor.Value * vLengthFloor.Value;
end;

procedure TF_Kalc.vLengthFloorChange(Sender: TObject);
begin
    vSTotalPlase.Value := vWidthFloor.Value * vLengthFloor.Value;
end;

procedure TF_Kalc.vSTotalPlaseChange(Sender: TObject);
begin
  vSWorkPlase.Value := vSTotalPlase.Value * vKSWorkPlase.Value / 100;
//  vKolRM.Value := vSWorkPlase.Value / vSKab_Edit.Value;
end;


procedure TF_Kalc.vKolFloorChange(Sender: TObject);
var
  RowCount, Val: integer;
  Count: integer;
begin
  if vKolFloor.Value <= vKolFloor.Max then
  begin
      vSTotalPlase.Value := vKolFloor.Value * vWidthFloor.Value * vLengthFloor.Value;
     // Sleep(100);
      vKolRooms.Value := trunc(vSWorkPlase.Value / vSKab_Edit.Value);
      //
      vKolRMForFloor.Items.BeginUpdate;
      try
        RowCount := vKolRMForFloor.Items.Count;
        Val := trunc(vKolFloor.Value);
        If VaL <= 0 then
          Val := 1;
        if RowCount < Val then
        begin
          For Count := RowCount to Val-1 do
          begin
            vKolRMForFloor.Items.Add(vKolRMForFloor.Items[count-1], IntToStr(Count+1) + cKalc_Msg1);
            Kalc_DM.AddShelfForFloor(IntToStr(Count+1) + cKalc_Msg1);
          end;
        end;
        if RowCount > Val then
        begin
          For Count := RowCount-1 downto Val do
          begin
            vKolRMForFloor.Items.Delete(vKolRMForFloor.Items[count]);
            Kalc_DM.ShelfForFloor_MemTable.Last;
            Kalc_DM.ShelfForFloor_MemTable.Delete;
          end;
        end;
        if vTotalKolRM.Value > 0 then
        begin
          AutoKomplectFloorByRM;
        end;
      finally
        vKolRMForFloor.Items.EndUpdate;
      end;
  end;
end;

procedure TF_Kalc.vKolPortForRMChange(Sender: TObject);
begin
  vTotalKolPort.Value := trunc(vTotalKolRM.Value * vKolPortForRM.Value);
 
end;

procedure TF_Kalc.vTotalKolRMChange(Sender: TObject);
begin
  vTotalKolPort.Value := trunc(vTotalKolRM.Value * vKolPortForRM.Value);
  AutoKomplectFloorByRM;
  if StaticText1.Visible then
  begin
    StaticText1.Hide;
    StaticText2.Hide;
  end;
end;

procedure TF_Kalc.vKolRMChange(Sender: TObject);
begin
 vTotalKolRM.Value := vKolRM.Value + trunc(vKolRM.Value * vKKolDopMest.Value/100);
end;

procedure TF_Kalc.vKolRMForFloorEdited(Sender: TObject; Node: TFlyNode;
  var S: WideString);
var razn: integer;
begin
  Node.Cells[1] := S;
  razn := CmpFloorsWithKolRM ;
  if razn <> 0 then
  begin
    StaticText1.Show;
    StaticText2.Caption := cKalc_Msg2 + IntToStr(razn);
    StaticText2.Show;
  end
  else
  begin
    StaticText1.Hide;
    StaticText2.Hide;
  end;
end;

procedure TF_Kalc.KolRMBtnClick(Sender: TObject);
begin
  vKolRM.Value := trunc(vKolRooms.Value *  trunc(vSKab_Edit.Value / vSForRM.Value));
end;

{procedure TF_Kalc.vKolRMForFloorEdited(Sender: TObject; Node: TFlyNode;
  var S: String);
var
  razn: integer;
begin
  Node.Cells[1] := S;
  razn := CmpFloorsWithKolRM ;
  if razn <> 0 then
  begin
    StaticText1.Show;
    StaticText2.Caption := cKalc_Msg2 + IntToStr(razn);
    StaticText2.Show;
  end
  else
  begin
    StaticText1.Hide;
    StaticText2.Hide;
  end;
end; }

procedure TF_Kalc.ECostRMGrid_CheckClick(Sender: TObject);
begin
  if ECostRMGrid_Check.Checked then
  begin
    CostRMGrid.Enabled := true;
    vCRM.Value := 0;
    vCRM.Enabled := False;
    if Kalc_DM.CostRM_MemTable.RecordCount > 0 then
      ValCostFromGrid(vCRM, Kalc_DM.CostRM_MemTable);

    //CostRMGridTableView.Styles.Background := nil; //cxBackNormal;
    EnableTableView(CostRMGridTableView, true);
  end
  else
  begin
    vCRM.Enabled := True;
    CostRMGrid.Enabled := false;

    //CostRMGridTableView.Styles.Background := cxBackDisabled;
    //CostRMGridTableView.Styles.Content := cxBackDisabled;
    EnableTableView(CostRMGridTableView, false);
  end;
end;

procedure TF_Kalc.ECostPPGrid_CheckClick(Sender: TObject);
begin
  if ECostPPGrid_Check.Checked then
  begin
    CostPP_Grid.Enabled := true;
    vCPP.Value := 0;
    vCPP.Enabled := false;
    if Kalc_DM.CostPP_MemTable.RecordCount > 0 then
      ValCostFromGrid(vCPP, Kalc_DM.CostPP_MemTable);

    EnableTableView(CostPP_GridDBTableView, true);
  end
  else
  begin
    CostPP_Grid.Enabled := false;
    vCPP.Enabled := true;

    EnableTableView(CostPP_GridDBTableView, false);
  end;
end;

procedure TF_Kalc.actAddRecordExecute(Sender: TObject);
var
  resultCmp, OstPer: integer;
begin
  if  CostRMGrid.IsFocused then
  begin
    U_Kalc_DM.AddRecordInMemTable(Kalc_DM.CostRM_MemTable, 'Компонент ' + IntToStr(Kalc_DM.CostRM_MemTable.RecordCount + 1), '', 0, 1 );
    CostRMGrid.Refresh;
  end;
  if CostPK_Grid.IsFocused then
  begin
    resultCmp := Kalc_DM.CmpPerFromCostPk_MemTable(OstPer);
    case resultCmp of
      1 : U_Kalc_DM.AddRecordInMemTable(Kalc_DM.CostPK_Memtable, cKalc_Msg4 + IntToStr(Kalc_DM.CostPK_MemTable.RecordCount + 1), '', 0, -1, OstPer, mpkCross);
      2,3 : U_Kalc_DM.AddRecordInMemTable(Kalc_DM.CostPK_Memtable, cKalc_Msg4 + IntToStr(Kalc_DM.CostPK_MemTable.RecordCount + 1), '', 0, -1, OstPer, mpkRM);
    end;
  end;
  if CostPP_Grid.IsFocused  then
  begin
    if Kalc_DM.CostPP_MemTable.RecordCount = 0 then
      U_Kalc_DM.AddRecordInMemTable(Kalc_DM.CostPP_MemTable, cKalc_Msg5 + IntToStr(Kalc_DM.CostPP_MemTable.RecordCount + 1));
  end;
  if CostOrg_Grid.IsFocused then
  begin
  if Kalc_DM.CostOrg_MemTable.RecordCount= 0 then
    U_Kalc_DM.AddRecordInMemTable(Kalc_DM.CostOrg_MemTable, cKalc_Msg6 + IntToStr(Kalc_DM.CostOrg_MemTable.RecordCount + 1));
  end;
  if CostShelf_Grid.IsFocused then
  begin
    U_Kalc_DM.AddRecordInMemTable(Kalc_DM.CostShelf_MemTable, cKalc_Msg7 + IntToStr(Kalc_DM.CostShelf_MemTable.RecordCount + 1));
  end;
  if DopEq_Grid.IsFocused then
  begin
    U_Kalc_DM.AddRecordInMemTable(Kalc_DM.DopEq_MemTable, cKalc_Msg8 + IntToStr(Kalc_DM.DopEq_MemTable.RecordCount + 1));
  end;
  if CCForFloor_Grid.IsFocused then
  begin
    OstPer := Kalc_DM.CmpPerFromCCFloor_MemTable;
    U_Kalc_DM.AddRecordInMemTable(Kalc_DM.CCFloor_MemTable, cKalc_Msg9 + IntToStr(Kalc_DM.CCFLoor_MemTable.RecordCount + 1),
                                   '', 0, -1, OstPer);
  end;
  if CCUnderCeil_Grid.IsFocused then
  begin
    OstPer := Kalc_DM.CmpPerFromCCUnderCeil_MemTable;
    U_Kalc_DM.AddRecordInMemTable(Kalc_DM.CCUnderCeil_MemTable, cKalc_Msg10 + IntToStr(Kalc_DM.CCUnderCeil_MemTable.RecordCount + 1),
                                   '', 0, -1, OstPer);
  end;
  if ElPointFix_Grid.IsFocused then
  begin
    OstPer := Kalc_DM.CmpPerFromElPointFix_MemTable;
    U_Kalc_DM.AddRecordInMemTable(Kalc_DM.ElPointFix_MemTable, cKalc_Msg11 + IntToStr(Kalc_DM.ElPointFix_MemTable.RecordCount + 1),
                                   '', 0, -1, OstPer);
  end;



end;

procedure TF_Kalc.ECostPKGridCheckClick(Sender: TObject);
begin
  if ECostPKGridCheck.Checked then
  begin
    CostPK_Grid.Enabled := true;
    vCPK.Value := 0;
    vCPK.Enabled := False;

    EnableTableView(CostPKDBTableView, true);
  end
  else
  begin
    CostPK_Grid.Enabled := false;
    vCPK.Enabled := True;

    EnableTableView(CostPKDBTableView, false);
  end;
end;

procedure TF_Kalc.actDelRecordExecute(Sender: TObject);
var
  price: double;
  id, i: integer;
  Kolvo: integer;
begin
  if CostRMGrid.IsFocused then
  begin
    Kolvo := 1;
    if Kalc_DM.CostRM_MemTable.RecordCount > 0 then
    begin
      if Kalc_DM.CostRM_MemTable.FieldByName('Price').AsString <> '' then
      begin
        price := Kalc_DM.CostRM_MemTable.FieldByName('Price').AsFloat;
        Kolvo := Kalc_DM.CostRM_MemTable.FieldByName('Kolvo').AsInteger;
        if Kolvo < 1 then
          Kolvo := 1;
      end;
      vCRM.Value := vCRM.Value - price * kolvo;
      Kalc_DM.CostRM_MemTable.Delete;
    end;
  end;
  if CostPK_Grid.IsFocused then
  begin
    if Kalc_DM.CostPK_MemTable.RecordCount > 0 then
    begin
      Kalc_DM.CostPK_MemTable.Delete;
    end;
  end;
  if CostPP_Grid.IsFocused  then
  begin
    if Kalc_DM.CostPP_MemTable.RecordCount > 0 then
    begin
      vCPP.Value := 0;
      Kalc_DM.CostPP_MemTable.Delete;
    end;
  end;
  if CostOrg_Grid.IsFocused  then
  begin
    if Kalc_DM.CostOrg_MemTable.RecordCount > 0 then
    begin
      vCOrg.Value := 0;
      Kalc_DM.CostOrg_MemTable.Delete;
    end;
  end;
  if CostShelf_Grid.IsFocused  then
  begin
    if Kalc_DM.CostShelf_MemTable.RecordCount > 0 then
    begin
      id := Kalc_DM.CostShelf_MemTable.FieldByName('Id').AsInteger;
      with  Kalc_DM.ShelfForFloor_MemTable do
      begin
        First;
        while Not Eof do
        begin
          if FieldbyName('id_shelf').AsInteger = id then
          begin
            Edit;
            FieldbyName('id_shelf').Clear;
            FieldbyName('price').Clear;
            Post;
          end;
          Next;
        end;
      end;
      Kalc_DM.CostShelf_MemTable.Delete;
    end;
  end;
  if DopEq_Grid.IsFocused then
  begin
    price := 0;
    kolvo := 1;
    if Kalc_DM.DopEq_MemTable.RecordCount > 0 then
    begin
      if Kalc_DM.DopEq_MemTable.FieldByName('price').AsString <> '' then
         price := Kalc_DM.DopEq_MemTable.FieldByName('price').AsFloat;
      Kolvo := Kalc_DM.DopEq_MemTable.FieldByName('Kolvo').AsInteger;
      if Kolvo < 1 then
        Kolvo := 1;
      vCostDopEq.Value := vCostDopEq.Value - price * kolvo;
      Kalc_DM.DopEq_MemTable.Delete;
    end;
  end;
  if CCForFloor_Grid.IsFocused then
  begin
    Kalc_DM.CCFloor_MemTable.Delete;
  end;
  if CCUnderCeil_Grid.IsFocused then
  begin
    Kalc_DM.CCUnderCeil_MemTable.Delete;
  end;
  if ElPointFix_Grid.IsFocused then
  begin
    Kalc_DM.ElPointFix_MemTable.Delete;
  end;
end;

procedure TF_Kalc.ECostOrgGrid_CheckClick(Sender: TObject);
begin
  if ECostOrgGrid_Check.Checked then
  begin
    CostOrg_Grid.Enabled := true;
    vCOrg.Value := 0;
    vCOrg.Enabled := false;
    if Kalc_DM.CostOrg_MemTable.RecordCount > 0 then
      ValCostFromGrid(vCOrg, Kalc_DM.CostOrg_MemTable);

    EnableTableView(GT_CostOrg, true);
  end
  else
  begin
    CostOrg_Grid.Enabled := false;
    vCOrg.Enabled := true;

    EnableTableView(GT_CostOrg, false);
  end;
end;

procedure TF_Kalc.ECostShelfGridCheckClick(Sender: TObject);
begin
  if ECostShelfGridCheck.Checked then
  begin
    vCm_Shelf.Value := 0;
    vCm_Shelf.Enabled := false;
    OnceShelfCheck.visible := false;
    CostShelf_Grid.Enabled := true;
    ShelfForFloor_Grid.Enabled := true;

    EnableTableView(CostShelf_GridDBTableView, true);
    EnableTableView(ShelfForFloor_GridDBTableView, true);
  end
  else
  begin
    vCm_Shelf.Enabled := true;
    OnceShelfCheck.Visible := true;
    CostShelf_Grid.Enabled := false;
    ShelfForFloor_Grid.Enabled := false;

    EnableTableView(CostShelf_GridDBTableView, false);
    EnableTableView(ShelfForFloor_GridDBTableView, false);
  end;
  CostShelf_Grid.Enabled := ECostShelfGridCheck.Checked;
  pnShelfForFloorOpt.Enabled := ECostShelfGridCheck.Checked;
end;

procedure TF_Kalc.Main_PageControlChanging(Sender: TObject;
  NewIndex: Integer; var AllowChange: Boolean);
var
  ActivePage: integer;
  OperTableView: TcxGridDBTableView;
begin
  //здесь нужно проверять контролы и заносить значения
  ActivePage := Main_PageControl.ActivePageIndex;
  OperTableView := Nil;
  if ActivePage = 4 then
  begin
    if AllComponent_Grid.Visible and F_Kalc.Visible then
      AllComponent_Grid.SetFocus;
    if AllComponent_GridDBTableView1.DataController.IsEditing then
      OperTableView := AllComponent_GridDBTableView1;
    //  AllowChange :=false;
  end;

  if ActivePage = 3 then
  begin
    if PriceWorks_Grid.Visible and F_Kalc.Visible then
      PriceWorks_Grid.SetFocus;
    if PriceWorks_TableView.DataController.IsEditing then
      OperTableView := PriceWorks_TableView;
      //AllowChange :=false;
  end;
  if ActivePage = 1 then
  begin
    if pcComponentTypes.Visible and F_Kalc.Visible then
    pcComponentTypes.SetFocus;
    if CostRMGridTableView.DataController.IsEditing then
     OperTableView := CostRMGridTableView;
    if CostPKDBTableView.DataController.IsEditing then
      OperTableView := CostPKDBTableView;
    if CostPP_GridDBTableView.DataController.IsEditing  then
      OperTableView := CostPP_GridDBTableView;
    if GT_CostOrg.DataController.IsEditing then
      OperTableView := GT_CostOrg;
    if CostShelf_GridDBTableView.DataController.IsEditing then
      OperTableView := CostShelf_GridDBTableView;
    if ShelfForFloor_GridDBTableView.DataController.IsEditing then
      OperTableView := ShelfForFloor_GridDBTableView;
    if DopEq_TableView.DataController.IsEditing then
      OperTableView := DopEq_TableView;


  end;
  if ActivePage = 2 then
  begin
    if  pcChannelComponTypes.Visible and F_Kalc.Visible then
      pcChannelComponTypes.SetFocus;
    if CCForFloor_GridTableView.DataController.IsEditing then
      OperTableView := CCForFloor_GridTableView;
    if CCUnderCeil_GridTableView.DataController.IsEditing then
      OperTableView := CCUnderCeil_GridTableView;
    if ElPointFix_GridTableView.DataController.IsEditing then
      OperTableView := CCUnderCeil_GridTableView;
    if CableCanalGrid_TableView1.DataController.IsEditing then
      OperTableView := CableCanalGrid_TableView1;
    if ElementOfCC_Grid_DBTableView.DataController.IsEditing then
      OperTableView := ElementOfCC_Grid_DBTableView;
    //then
//       AllowChange := false;
  end;
  if Assigned(OperTableView) then
    if OperTableView.DataController.IsEditing then
      begin
         AllowChange := false;
         OperTableView.DataController.Cancel;
         if not OperTableView.DataController.IsEditing then
           AllowChange := true;
      end;

  if ActivePage = 0 then
  begin
    if vKoefDistShot.Value + vKoefDistLong.Value > 100 then
    begin
      MessageModal(cKalc_Msg88, cKalc_Msg15, MB_ICONINFORMATION);
      AllowChange :=false;
      if vKoefDistShot.Visible and F_Kalc.Visible then
        vKoefDistShot.SetFocus;
    end;
  end;
end;


procedure TF_Kalc.actAddCableCanalExecute(Sender: TObject);
var
  FCountCC,Count: integer;
  Ost: integer;
  i, z : integer;
  NewCount: Integer;
begin
   FCountCC := 0;
   if Kalc_DM.CableCanalMemTable.RecordCount > 0 then
   begin
     Kalc_DM.CableCanalMemTable.Last;
     FCountCC := Kalc_DM.CableCanalMemTable.FieldbyName('Npp').AsInteger +1;
   end;


  with Kalc_DM.CableCanalMemTable  do
  begin
    Open;
    Ost := GetFreePercent(RecordCount);
    if Ost < 0 then
      Ost := 0;
    Append;
 //  FieldByName('Npp').AsInteger := FCountCC;
    if FCountCC = 0 then
      FieldByName('Name').AsString := cKalc_Msg12
    else
      FieldByName('Name').AsString := cKalc_Msg12 + ' ' + IntToStr(FCountCC);
    FieldByName('Price').AsFloat := 0;
    FieldByName('Percent').AsFloat := Ost;
    Post;
  end;
  AddCCElements;
end;

procedure TF_Kalc.actDelCableCanalExecute(Sender: TObject);
var
  npp: integer;
begin
  SetFocusToControl(CableCanalGrid);
  npp := Kalc_DM.CableCanalMemTable.FieldByName('Npp').AsInteger;
  Kalc_DM.ElemForCabcanal_MemTable.First;
  While not Kalc_DM.ElemForCabcanal_MemTable.Eof do
  begin
    if Kalc_DM.ElemForCabcanal_MemTable.FieldByName('Npp_CC').AsInteger = npp then Kalc_DM.ElemForCabcanal_MemTable.Delete
    else Kalc_DM.ElemForCabcanal_MemTable.Next;  end;Kalc_DM.CableCanalMemTable.Delete; end;
procedure TF_Kalc.CableCanalGrid_TableView1EditValueChanged(
  Sender: TcxCustomGridTableView; AItem: TcxCustomGridTableItem);
begin
 // Kalc_DM.CableCanalMemTable.Refresh;
  if GetFreePercent(Kalc_DM.CableCanalMemTable.RecordCount)< 0 then
  begin
    StaticText4.Show;
  end
  else
  begin
    StaticText4.Hide;
  end;
end;

procedure TF_Kalc.CableCanalMemTableAfterDelete(DataSet: TDataSet);
begin
if GetFreePercent(Kalc_DM.CableCanalMemTable.RecordCount)< 0 then
  begin
    StaticText4.Show;
  end
  else
  begin
    StaticText4.Hide;
  end;
end;

procedure TF_Kalc.btCalcClick(Sender: TObject);
begin
  CalculateProject;
end;

function TF_Kalc.CalculateProject: double;
var
  i: integer;
  Nodecells: string;
  Node: TFlyNode;
  CostRM: double;
  KolRM, KolPort, KolPortForRM: integer;
  KRezervCable, DistShot, DistLong, RezervCableEnd, KoefShot, KoefLong: double;
  KolCableInPark, {KolCableForMagistral, }KolCableForRm, KolReservCable: integer;
  KolPortForMCable, LengthMagCable : double;
  KableShtuk, KableShtukForFlor, KolCable : integer;
  CableShtukList: TIntList;
  KolPP, KolPPforPort: integer;
  PointedMCable, PointedRaspredCable: boolean;
  KolOrg: integer;
  KolPKForPort, KolPKForRM, TotalKolPK: integer;
  Kolvo, id_Shelf, TotalKolShelf: integer;
  KolEq: integer;
  CostProject: double;
  NameOfElementCC: String;
  KoefWorks: double;
  ///расчёт кабеля
  SredLengthCable: double;
  KolWorkCable, KolWorkConduit: double;
  function GetSredLength(ADistShot, ADistLong, AKoefShot, AKoefLong: double): double;
  var
    koefForSred, SredDist: double;
  begin
    //коэфициенты подлаются в целом виде
    koefForSred := 0;    SredDist := 0;
    if AKoefShot + AKoefLong < 100 then
    begin
      koefForSred := 100 - AKoefShot - AKoefLong;
      SredDist := (ADistShot + ADistLong)/2;
    end;
    Result := (ADistShot*AKoefShot + ADistLong*AKoefLong + koefForSred*SredDist)/100
  end;

  function LengthMCable(AList: TIntList): double;
  var
    HeigthFloor: double;
    TotalLenght: double;
    TotalKolCable: integer;
    i: integer;
  begin
    Result := 0;
    HeigthFloor := vHeighFloor.Value;
    TotalLenght := 0;
    for i := 0 to Alist.Count-1 do
    begin
       TotalLenght := TotalLenght + abs(ServerFloor - i - 1) * HeigthFloor * Alist[i];
    end;
    Result := TotalLenght;
  end;

  Function PointOnceShelf: boolean;
  var
    Flag : boolean;
  begin
    Result := True;
    Flag := False;
    with Kalc_DM.ShelfForFloor_MemTable do
    begin
      if RecordCount > 0 then
      begin
        First;
        while Not Eof do
        begin
          if not FieldByName('id_shelf').IsNull then
          begin
            if flag then
            begin
              Result := false;
              Break;
            end
            else
              Flag := True;
          end
          else
            Next;
        end;
      end;

    end;
  end;

begin
  Result := 0;
  KoefForWorks := GetKoefForWorks;

  CableShtukList := TIntList.Create;
  try
    //Подсчет стоимости РМ
    Kalc_DM.AllComponent_MemTable.Active := False;
    Kalc_DM.AllComponent_MemTable.Active := True;
    CostRM := vCRM.Value;
    KolEq := 1;
    KolRM := trunc(vTotalKolRM.Value);
    //работы по монтажу рм
    PutToReportWork(idwRM, KolRm,KoefForWorks);
    If ECostRMGrid_Check.Checked and (Kalc_DM.CostRM_MemTable.RecordCount > 0)   then
    begin
      with Kalc_DM.CostRM_MemTable do
      begin
        First;
        while not eof do
        begin
          if FieldByName('Kolvo').AsString = '' then
            KolEq := 1
          else
            KolEq := FieldByName('Kolvo').AsInteger;
          if kolEq < 1 then
            KolEq := 1;
          KolEq :=  trunc(KolEq * KolRM);
          AddRecordInReport( FieldByName('Name').AsString,
                             FieldByName('Articul').AsString,
                             KolEq,
                             FieldByName('Price').AsFloat,
                             KolRM * FieldByName('Price').AsFloat);
          Next;
          KolEq := 1;
        end;
      end;
    end
    else
    begin
      AddRecordInReport( cKalc_Msg93, '', KolRM, CostRM, KolRM * CostRM);
    end;
    //Подсчёт стоимости кабеля
    KolPort := trunc(vTotalKolPort.Value);
    KolPortForRM := trunc(vKolPortForRM.Value);
    KolPortForMCable := vKolPortForMCable.Value;
    DistShot := vDistShot.Value;
    DistLong := vDistLong.Value;
    KRezervCable := 1 + trunc(vKCableRezerv.Value)/100;
    RezervCableEnd := vCableEndRezerv.Value;
    KolCableInPark := trunc(vKolCableInPark.Value);
    //кабель для РМ
    KoefShot := vKoefDistShot.Value;
    KoefLong := vKoefDistLong.Value;
    SredLengthCable := GetSredLength(DistShot, DistLong, KoefShot, KoefLong);
    KolCableForRm :=trunc(ceil(KolPort / trunc(KolCableInPark / (SredLengthCable * KRezervCable + RezervCableEnd))) * KolCableInPark);
    //Кабель для магистралей
    LengthMagCable := 0;
    KolReservCable := trunc(vKolReservCable.Value);
    Kalc_DM.ShelfForFloor_MemTable.First;
    for i := 0 to vKolRMForFloor.Items.Count - 1 do
    begin
      if vKolRMForFloor.Items[i].Cells[1] <> ''then
        KableShtukForFlor := ceil( StrToFloat_My(vKolRMForFloor.Items[i].Cells[1])*KolPortForRM/KolPortForMCable)
      else
        KableShtukForFlor := 0;
      if KableShtukForFlor > 0 then
      begin
        if not(OnceShelfCheck.Checked and OnceShelfCheck.Enabled) then
        begin
          if Kalc_DM.ShelfForFloor_MemTable.FieldByName('id_shelf').IsNull then
          begin
             MessageModal(cKalc_Msg13 +' ' + IntToStr(i + 1) +  ' ' + cKalc_Msg14, cKalc_Msg15, MB_ICONINFORMATION) ;
             KableShtukForFlor := 0;
          end
          else
            KableShtukForFlor := KableShtukForFlor + KolReservCable;
        end
        else
         KableShtukForFlor := KableShtukForFlor + KolReservCable;
      end;
      if not Kalc_DM.ShelfForFloor_MemTable.Eof then
        Kalc_DM.ShelfForFloor_MemTable.Next;
      CableShtukList.Add(KableShtukForFlor);
    end;
   
    //если всё работает не с одной серверной
    if ((not OnceShelfCheck.Checked) or (Not OnceShelfCheck.Enabled)) and (vKolFloor.Value > 1) then
    begin
      //находим общую длину магистрального  кабеля
      LengthMagCable :=  LengthMCable(CableShtukList);
      PointedMCable := False;
      with Kalc_DM.Cable_MemTable do
      begin
        First;
        for i := 0 to RecordCount - 1 do
        begin
          if FieldByName('Id_Missing').AsInteger = tcuMagistral then
          begin
            PointedMCable := true;
            break;
          end;
          Next;
        end;
        if not PointedMCable then
        begin
          KolCableForRm := ceil(LengthMagCable + KolCableForRm);
     
        end;
        PointedRaspredCable := false;
        First;
        while Not Eof do
        begin
          if FieldByName('Id_Missing').AsInteger = tcuMagistral then
          begin
            KolCable := round(LengthMagCable * fieldByname('Percent').AsFloat / 100);
          end
          else
          begin
            PointedRaspredCable := true;
            KolCable := round(ceil(KolCableForRm * fieldByname('Percent').AsFloat /100/KolCableInPark)* KolCableInPark);
          end;
          AddRecordInReport( FieldByName('Name').AsString,
                             FieldByName('Articul').AsString,
                             KolCable,
                             FieldByName('Price').AsFloat,
                             KolCable * FieldByName('Price').AsFloat);
          Next;
        end;
      end;
    end
    else
    begin
      PointedRaspredCable := false;
      with Kalc_DM.Cable_MemTable do
      begin
        First;
        while Not Eof do
        begin
          if FieldByName('Id_Missing').AsInteger = tcuRaspred then
          begin
            PointedRaspredCable := true;
            KolCable := round(ceil(KolCableForRm * fieldByname('Percent').AsFloat / 100/KolCableInPark)* KolCableInPark);
            AddRecordInReport( FieldByName('Name').AsString,FieldByName('Articul').AsString,
                             KolCable, FieldByName('Price').AsFloat,  KolCable * FieldByName('Price').AsFloat);
         end;
        Next;
        end;
      end;
    end;
    if not PointedRaspredCable then
      MessageModal(cKalc_Msg87, cKalc_Msg15, MB_ICONINFORMATION);
      //заносим значение сумы всехч кабелей в переменную формы
    TotalKolCable := round(LengthMagCable + KolPort * SredLengthCable);
    //работы по прокладке кабеля
    PutToReportWork(idwCable, TotalKolCable, KoefForWorks);
    //количество патч панелей для проекта
     Case TypeConnectEuipment_RadioGroup.ItemIndex of
        0 : KolPPforPort := 2;
        1 : KolPPforPort := 1;
        2 : KolPPforPort := 3;
      end;
    if (OnceShelfCheck.Checked and OnceShelfCheck.Enabled) or PointOnceShelf then
    begin     //для всего проекта
      KolPP := trunc(ceil(trunc(vTotalKolPort.Value) / trunc(vKolPortPP.Value)) * KolPPforPort);
    end
    else
    begin
      KolPP := 0;              //определяем ПП для этажей
      for i := 0 to vKolRMForFloor.Items.Count - 1 do
      begin
        KolPP := KolPP + ceil(StrToInt(vKolRMForFloor.Items[i].Cells[1]) / trunc(vKolPortPP.Value)) * KolPPforPort;
      end;
      //определим количество ПП для магистарльных ПП
      KableShtuk := 0;
      For i := 0 to CableShtukList.Count - 1 do
      begin
        KableShtuk := KableShtuk + CableShtukList[i];
      end;
      KolPP := KolPP + ceil(KableShtuk / vKolPortPP.Value);

    end;
    if ECostPPGrid_Check.Checked and (Kalc_DM.CostPP_MemTable.RecordCount > 0) then
    begin
      with Kalc_DM.CostPP_MemTable do
      begin
        First;
        AddRecordInReport( FieldByName('Name').AsString,
                           FieldByName('Articul').AsString,
                           KolPP,
                           FieldByName('Price').AsFloat,
                           KolPP * FieldByName('Price').AsFloat);
      end;
    end
    else
    begin
      AddRecordInReport(cKalc_Msg16, '', KolPP, vCPP.Value, KolPP * vCPP.Value);
    end;
    //работы по установке патч-панелей
    PutToReportWork(idwPP, KolPP, KoefForWorks);
    //количество организаторов для проекта
    KolOrg := KolPP;
    if ECostOrgGrid_Check.Checked and (Kalc_DM.CostOrg_MemTable.RecordCount > 0) then
    begin
      with Kalc_DM.CostOrg_MemTable do
      begin
        First;
        AddRecordInReport( FieldByName('Name').AsString,
                           FieldByName('Articul').AsString,
                           KolOrg,
                           FieldByName('Price').AsFloat,
                           KolOrg * FieldByName('Price').AsFloat);
      end;
    end
    else
    begin
      AddRecordInReport(cKalc_Msg17, '', KolOrg, vCOrg.Value, KolOrg * vCOrg.Value);
    end;
    //работы по установке организаторов
    PutToReportWork(idwOrg, KolOrg, KoefForWorks);
    //Количество патчкордов для проекта
    Case TypeConnectEuipment_RadioGroup.ItemIndex of
        0 : KolPKforPort := 1;
        1 : KolPKforPort := 1;
        2 : KolPKforPort := 1;
      end;
    TotalKolPK := trunc(KolPP / KolPPforPort * vKolPortPP.Value);
    if eKalcPKForRM_Check.Checked  then
    begin
      KolPKForRM := trunc(vKolPKForRM.Value);
      TotalKolPK := TotalKolPK + trunc(KolRM * KolPKForRM);
    end;
    if ECostPKGridCheck.Checked and (Kalc_DM.CostPK_MemTable.RecordCount > 0) then
    begin
      with Kalc_DM.CostPK_MemTable  do
      begin
        First;
        AddRecordInReport( FieldByName('Name').AsString,
                           FieldByName('Articul').AsString,
                           TotalKolPK,
                           FieldByName('Price').AsFloat,
                           TotalKolPK * FieldByName('Price').AsFloat);
      end;
    end
    else
    begin
      AddRecordInReport(cKalc_Msg18, '', TotalKolPK, vCPK.Value, TotalKolPK * vCPK.Value);
    end;
    //Количество шкафов по проекту
    TotalKolShelf := 0;
    if not ECostShelfGridCheck.Checked or (Kalc_DM.CostShelf_MemTable.RecordCount < 1) then
    begin
      if OnceShelfCheck.Checked and OnceShelfCheck.Enabled then
      begin
        AddRecordInReport(cKalc_Msg19, '', 1, vCm_Shelf.Value, vCm_Shelf.Value);
        TotalKolShelf := 1;
      end
      else
      begin
        AddRecordInReport(cKalc_Msg19, '', trunc(vKolFloor.Value), vCm_Shelf.Value, vCm_Shelf.Value * trunc(vKolFloor.Value));
        TotalKolShelf := trunc(vKolFloor.Value);
      end;
    end
    else
      if Kalc_DM.CostShelf_MemTable.RecordCount > 0 then
      begin
        with Kalc_DM.CostShelf_MemTable do
        begin
          First;
          while Not Eof do
          begin
            id_Shelf := FieldByName('id').asInteger;
            Kolvo := 0;
            begin
              Kalc_DM.ShelfForFloor_MemTable.First;
              while Not Kalc_DM.ShelfForFloor_MemTable.Eof do
              begin
                if (Not Kalc_DM.ShelfForFloor_MemTable.FieldByName('id_shelf').IsNull)
                    and (Kalc_DM.ShelfForFloor_MemTable.FieldByName('id_shelf').AsInteger = id_Shelf)
                then
                begin
                  inc(kolvo);
                end;
                Kalc_DM.ShelfForFloor_MemTable.Next;
              end;
            end;
            if kolvo > 0 then
            begin
               TotalKolShelf := TotalKolShelf + Kolvo;
              AddRecordInReport(FieldByName('Name').AsString,
                              FieldByName('Articul').AsString,
                              Kolvo,
                              FieldByName('Price').AsFloat,
                              Kolvo * FieldByName('Price').AsFloat);
            end;
            Next;
          end;
        end;
      end;
    //Работы по монтажу шкафов
    PutToReportWork(idwShelf, TotalKolShelf, KoefForWorks);
    // Количество дополнительного оборудования
    If EDopEqGrid_Check.Checked and (Kalc_DM.DopEq_MemTable.RecordCount > 0) then
    begin
      with Kalc_DM.DopEq_MemTable do
      begin
        First;
        while not Eof do
        begin
          if FieldByName('Kolvo').AsString = '' then
            KolEq := 1
          else
            KolEq := FieldByName('Kolvo').AsInteger;
          if kolEq < 1 then
            KolEq := 1;

          AddRecordInReport( FieldByName('Name').AsString,
                             FieldByName('Articul').AsString,
                             KolEq,
                             FieldByName('Price').AsFloat,
                             KolEq * FieldByName('Price').AsFloat);
            Next;
        end;
      end;
     end
     else
     begin
       AddRecordInReport(cKalc_Msg20, '', 1, vCostDopEq.Value, vCostDopEq.Value);
     end;

    //Количество кабельных каналов
    //if FixCableWey_ComboBox.ItemIndex = 3 then
//    begin
//      with Kalc_DM.CableCanalMemTable do
//      begin
//        First;
//        while Not Eof do
//          actDelCableCanalExecute(Self);
//      end;
//    end;
     CalculateCC;
    //Подсчёт стоимости всего проекта
    CostProject := 0;
    with Kalc_DM.AllComponent_MemTable do
    begin
      First;
      while Not Eof do
      begin
        KolEq := FieldByName('Kolvo').AsInteger;
        CostProject := CostProject + KolEq * FieldByName('price').AsFloat;
        Next;
      end;
    end;
    Result := CostProject;
    //добавим остальные работы
    PutToReportWork(idwCrossPort,KolPort, KoefForWorks); //'Кроссировка (1 порт)';
    PutToReportWork(idwTestPort,KolPort, KoefForWorks); //'Тестирование соединений (1 порт)';
    PutToReportWork(idwProectPort, KolPort, KoefForWorks); //'Проектные работы  (1 порт)';
    PutToReportWork(idwTransport, 1, KoefForWorks); //'Транспортные расходы';
    PutToReportWork(idwAnother,1, KoefForWorks); //'Другие пусконаладочные работы';
    ///idwKoef = 12; //'Коэфициент  на работы (согласно особому характеру работ)';
    /////////////////////////////
    PutHaracterProjectInMt;
  finally
    CableShtukList.Free;
  end;
end;

procedure TF_Kalc.AddRecordInReport(AName: string; AArticul: String; AKol: integer;
          APrice, ACost: double; AidTypePoz: string = idTypePozMaterial);
begin
  with Kalc_DM.AllComponent_MemTable do
  begin
    Open;
    Append;
    FieldByName('Name').AsString := AName;
    FieldByName('Articul').AsString := AArticul;
    FieldByName('Kolvo').AsInteger := AKol;
    FieldByName('Price').AsFloat := APrice;
    FieldByName('Cost').AsFloat := ACost;
    FieldByName('TypePoz').AsString := AidTypePoz;
    post;
  end;
end;

procedure TF_Kalc.actAddCableExecute(Sender: TObject);
var
  Count: integer;
  Ost: integer;
  i, z : integer;
begin
  with Kalc_DM.Cable_MemTable  do
  begin
    Open;
    Append;
    FieldByName('Name').AsString := cKalc_Msg21 + IntToStr(Kalc_DM.Cable_MemTable.RecordCount + 1);
    FieldByName('Price').AsFloat := 0;
    FieldByName('Percent').AsInteger := 100;
    FieldByName('Id_Missing').AsInteger := tcuRaspred;
    Post;
  end;
  Ost := GetFreePercentForCable;
  if Ost > 0 then
    StaticText5.Show
  else
    StaticText5.Hide;
end;

procedure TF_Kalc.actDelCableExecute(Sender: TObject);
begin
  Kalc_DM.Cable_MemTable.Delete;
  if GetFreePercentForCable > 0 then
    StaticText5.Show
  else
    StaticText5.Hide;
end;

procedure TF_Kalc.CableCanalGrid_TableView1KeyDown(Sender: TObject;
  var Key: Word; Shift: TShiftState);
begin
   if key = 45 then //Insert
  begin
    actAddCableCanalExecute(Sender);
  end;
  if key = 46 then
  begin
    actDelCableCanalExecute(Sender);
  end;
end;

procedure TF_Kalc.Cable_Grid_DBTableViewKeyDown(Sender: TObject;
  var Key: Word; Shift: TShiftState);
begin
   if key = 45 then //Insert
  begin
    actAddCableExecute(Sender);
  end;
  if key = 46 then
  begin
    actDelCableExecute(Sender);
  end;
end;

procedure TF_Kalc.CostRMGridKeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
  if key = 45 then //Insert
  begin
    actAddRecordExecute(Sender);
  end;
  if key = 46 then
  begin
    actDelRecordExecute(Sender);
  end;
end;

procedure TF_Kalc.FixBtnClick(Sender: TObject);
var
  ID, id_Shelf: integer;
  Price: double;
begin
  id_Shelf := Kalc_DM.CostShelf_MemTable.FieldbyName('id').AsInteger;
  Price := Kalc_DM.CostShelf_MemTable.FieldbyName('price').AsFloat;
  if FixAllEcxeptSelCheck.Checked then
  begin
    with Kalc_DM.ShelfForFloor_MemTable do
    begin
      id := FieldbyName('id').AsInteger;
      First;
      while Not Eof do
      begin
        if id <> FieldbyName('id').AsInteger then
        begin
          Edit;
          FieldbyName('id_shelf').AsInteger := id_Shelf;
          FieldbyName('price').AsFloat :=  Price;
          Post;
        end;
        Next;
      end;
      First;
      MoveBy(ID);
    end;
    FixAllEcxeptSelCheck.Checked := false;
  end
  else
  begin
    with Kalc_DM.ShelfForFloor_MemTable do
    begin
      Edit;
      FieldbyName('Id_Shelf').AsInteger := id_Shelf;
      FieldbyName('price').AsFloat :=  Price;
      Post;
    end;
  end;
 ShelfForFloor_Grid.Refresh;
end;

procedure TF_Kalc.Clear_BtnClick(Sender: TObject);

begin
  with Kalc_DM.ShelfForFloor_MemTable do
    begin
      First;
      while Not Eof do
      begin
        Edit;
        FieldbyName('id_shelf').Clear;
        FieldbyName('price').Clear;
        Post;
        Next;
      end;
    end;
end;

procedure TF_Kalc.EDopEqGrid_CheckClick(Sender: TObject);
begin
  if EDopEqGrid_Check.Checked then
  begin
    DopEq_Grid.Enabled := true;
    vCostDopEq.Value := 0;
    if Kalc_DM.DopEq_MemTable.RecordCount > 0 then
      ValCostFromGrid(vCostDopEq, Kalc_DM.DopEq_MemTable);
  end
  else
    DopEq_Grid.Enabled := false;

  EnableTableView(DopEq_TableView, EDopEqGrid_Check.Checked);
end;

procedure TF_Kalc.DopEq_TableViewEditValueChanged(
  Sender: TcxCustomGridTableView; AItem: TcxCustomGridTableItem);
begin
  ValCostFromGrid(vCostDopEq, Kalc_DM.DopEq_MemTable);
end;

procedure TF_Kalc.CostPP_GridDBTableViewEditValueChanged(
  Sender: TcxCustomGridTableView; AItem: TcxCustomGridTableItem);
begin
  ValCostFromGrid(vCPP, Kalc_DM.CostPP_MemTable);
end;

procedure TF_Kalc.GT_CostOrgEditValueChanged(
  Sender: TcxCustomGridTableView; AItem: TcxCustomGridTableItem);
begin
  ValCostFromGrid(vCOrg, Kalc_DM.CostOrg_MemTable);
end;

procedure TF_Kalc.Cable_Grid_DBTableViewEditValueChanged(
  Sender: TcxCustomGridTableView; AItem: TcxCustomGridTableItem);
begin
 
  if GetFreePercentForCable > 0 then
    StaticText5.Show
  else
    StaticText5.Hide;
end;

procedure TF_Kalc.vKKolDopMestChange(Sender: TObject);
begin
   vTotalKolRM.Value := vKolRM.Value + trunc(vKolRM.Value * vKKolDopMest.Value/100);
end;

procedure TF_Kalc.FixCableWey_ComboBoxCloseUp(Sender: TObject);
begin
  case FixCableWey_ComboBox.ItemIndex of
    0: TypeWeyCC_PageControl.ActivePageIndex := 0;
    1: TypeWeyCC_PageControl.ActivePageIndex := 1;
    2: TypeWeyCC_PageControl.ActivePageIndex := 2;
    3: TypeWeyCC_PageControl.ActivePageIndex := 3;
  end;
end;

procedure TF_Kalc.FormulaFloor_GroupChanging(Sender: TObject;
  NewIndex: Integer; var AllowChange: Boolean);
begin
  Case NewIndex of
    0:begin
        FormulaFloor2_Panel.Enabled := False;
        FormulaFloor1_Panel.Enabled := true;
      end;
    1:begin
        FormulaFloor1_Panel.Enabled := False;
        FormulaFloor2_Panel.Enabled := true;
      end;
  end;

end;

procedure TF_Kalc.FormulaUnderCail_RadioGroupChanging(Sender: TObject;
  NewIndex: Integer; var AllowChange: Boolean);
begin
  Case NewIndex of
    0:begin
        FormulaUnderCail2_Panel.Enabled := False;
        FormulaUnderCail1_Panel.Enabled := true;
      end;
    1:begin
        FormulaUnderCail1_Panel.Enabled := False;
        FormulaUnderCail2_Panel.Enabled := true;
      end;
  end;
end;

procedure TF_Kalc.FormulaDekorCC_RadioGroupChanging(Sender: TObject;
  NewIndex: Integer; var AllowChange: Boolean);
begin
  Case NewIndex of
    0:begin
        FormulaDekorCC2_Panel.Enabled := False;
        FormulaDekorCC1_Panel.Enabled := true;
      end;
    1:begin
        FormulaDekorCC1_Panel.Enabled := False;
        FormulaDekorCC2_Panel.Enabled := true;
      end;
  end;
end;

procedure TF_Kalc.FormulaInCC_GroupChanging(Sender: TObject;
  NewIndex: Integer; var AllowChange: Boolean);
begin
  Case NewIndex of
    0:begin
        FormulaInCC2_Panel.Enabled := False;
        FormulaInCC3_Panel.Enabled := False;
        FormulaInCC1_Panel.Enabled := true;
      end;
    1:begin
        FormulaInCC1_Panel.Enabled := False;
        FormulaInCC3_Panel.Enabled := False;
        FormulaInCC2_Panel.Enabled := true;
      end;
    2:begin
        FormulaInCC1_Panel.Enabled := False;
        FormulaInCC2_Panel.Enabled := False;
        FormulaInCC3_Panel.Enabled := true;
      end;                     
  end;
end;

procedure TF_Kalc.ServFloor_ComboBoxPropertiesChange(Sender: TObject);
begin
  ServerFloor := ServFloor_ComboBox.EditValue;
end;

procedure TF_Kalc.CalculateCC;
var
  PerTehreservCC, KolCC, KolCCForRm: double;
  CCLength: integer;
  KolElemCC: integer;
  KoefWorks: double;
  KolDopCC: integer;
  procedure KalcElemOfCC(ACCLength: integer) ;
  var
    NameOfElementCC: string;
  begin
    while Not Kalc_DM.ElemForCabcanal_MemTable.Eof do
        begin
          KolElemCC := Ceil(ACCLength / 100 * Kalc_DM.ElemForCabcanal_MemTable.fieldByName('rashod').AsFloat);
          Kalc_DM.TypeOfElementCC_MemTable.First;
          Kalc_DM.TypeOfElementCC_MemTable.MoveBy(Kalc_DM.ElemForCabcanal_MemTable.FieldByName('id_type').AsInteger - 1);
          NameOfElementCC := Kalc_DM.TypeOfElementCC_MemTable.FieldByName('name').AsString + ' (' + Kalc_DM.CableCanalMemTable.FieldByName('Name').AsString + ')';
          AddRecordInReport(NameOfElementCC,
                            Kalc_DM.ElemForCabcanal_MemTable.FieldByName('Articul').AsString,
                            KolElemCC,
                            Kalc_DM.ElemForCabcanal_MemTable.FieldByName('price').AsFloat,
                            KolElemCC * Kalc_DM.ElemForCabcanal_MemTable.FieldByName('price').AsFloat);
          Kalc_DM.ElemForCabcanal_MemTable.Next;
        end;
  end;

  function CalcCCFloor: integer;
  var
    KolCCForFloor, Kolvo : integer;
    KolRM: integer;

    Function Metod1: integer;
    var
      LenghtRoom, WidthRoom, x, y: double;
      KolRooms: integer;
      KolRM: integer;
    begin
      Result := 0;
      KolRooms := trunc(vKolRooms.Value);
      LenghtRoom := vLengthRoom.Value;
      WidthRoom := vWidthRoom.Value;
      x := vFormulaFloor1_X.Value;
      y := vFormulaFloor1_Y.Value;
      Result := Ceil((LenghtRoom * x + WidthRoom * y) * KolRooms);
    end;

    Function Metod2: integer;
    var
      x: double;
      KolRooms: integer;
    begin
      Result := 0;
      x := vFormulaFloor2_X.Value;
      KolRooms := trunc(vKolRooms.Value);
      Result := Ceil(KolRooms * x );
    end;

  begin
    if Kalc_DM.CCFloor_MemTable.RecordCount > 0 then
    begin
      Case FormulaFloor_Group.ItemIndex of
        0: KolCCForFloor := Metod1;
        1: KolCCForFloor := Metod2;
      end;
      KolDopCC := KolCCForFloor;
      with Kalc_DM.CCFloor_MemTable do
      begin
        First;
        while Not Eof do
        begin
          Kolvo := ceil(KolCCForFloor * FieldByName('Percent').AsFloat / 100);
          AddRecordInReport( FieldByName('Name').AsString,
                           FieldByName('Articul').AsString,
                           Kolvo,
                           FieldByName('Price').AsFloat,
                           Kolvo * FieldByName('Price').AsFloat);
          Next;
        end;
      end;
      KolRM := trunc(vTotalKolRM.Value);
      Result := trunc(KolRM * vHeigthRM.Value);
    end;
  end;

  function CalcUndeCeil: integer;
  var
    Kolvo: integer;
    KolCCUnderCeil: integer;

    function Metod1ForUnderCeilCC: integer;
    var
      LenghtRoom, WidthRoom, x, y: double;
      KolRooms: integer;
      KolRM: integer;
    begin
      Result := 0;
      KolRooms := trunc(vKolRooms.Value);
      LenghtRoom := vLengthRoom.Value;
      WidthRoom := vWidthRoom.Value;
      x := vFormulaUnderCeil1_X.Value;
      y := vFormulaUnderCeil1_Y.Value;
      Result := Ceil(LenghtRoom * x + WidthRoom * y);
    end;

    Function Metod2ForUnderCeilCC: integer;
    var
      x: double;
      KolRooms: integer;
    begin
      Result := 0;
      x := vFormulaUnderCeil2_X.Value;
      KolRooms := trunc(vKolRooms.Value);
      Result := Ceil(KolRooms * x );
    end;

    Function Metod1ForDekorCC: integer;
    var
      KolRm: integer;
      HeigthFalseCeil, HeigthRM: Double;
    begin
      Result := 0;
      KolRm := trunc(vTotalKolRM.Value);
      HeigthFalseCeil := vHeigthFalseCeil.Value;
      HeigthRM := vHeigthRM.Value;
      Result := ceil(KolRm * (HeigthFalseCeil - HeigthRM));
    end;

    Function Metod2ForDekorCC: integer;
    var
      KolRooms: integer;
      LengthRoom, HeigthFalseCeil, HeigthRM: Double;
      x: double;
    begin
      Result := 0;
      x := vFormulaDekorCC2_X.Value;
      KolRooms := trunc(vKolRooms.Value);
      HeigthFalseCeil := vHeigthFalseCeil.Value;
      HeigthRM := vHeigthRM.Value;
      LengthRoom := vLengthRoom.Value;
      Result := ceil(KolRooms * (LengthRoom +  HeigthFalseCeil - HeigthRM));
    end;
  begin
    case FormulaUnderCail_RadioGroup.ItemIndex of
      0: KolCCUnderCeil := Metod1ForUnderCeilCC;
      1: KolCCUnderCeil := Metod2ForUnderCeilCC;
    end;
    case FormulaDekorCC_RadioGroup.ItemIndex of
      0: Result := Metod1ForDekorCC;
      1: Result := Metod2ForDekorCC;
    end;
    KolDopCC := KolCCUnderCeil;
    with Kalc_DM.CCUnderCeil_MemTable do
    begin
      First;
      while Not Eof do
      begin
        Kolvo := ceil(KolCCUnderCeil * FieldByName('Percent').AsFloat / 100);
        AddRecordInReport( FieldByName('Name').AsString,
                         FieldByName('Articul').AsString,
                         Kolvo,
                         FieldByName('Price').AsFloat,
                         Kolvo * FieldByName('Price').AsFloat);
        Next;
      end;
    end;
  end;
/////////////////////////////////////
  function CalcInCC: integer;
    function Metod1: integer;
     var
      x: double;
      KolRM: integer;
    begin
      Result := 0;
      x := vFormulaInCC1_X.Value;
      KolRM := trunc(vTotalKolRM.Value);
      Result := Ceil(KolRM * x );
    end;

    function Metod2: integer;
    var
      x: double;
      KolRooms: integer;
    begin
      Result := 0;
      x := vFormulaInCC2_X.Value;
      KolRooms := trunc(vKolRooms.Value);
      Result := Ceil(KolRooms * x);
    end;

    function Metod3: integer;
    var
      HeigthFalseCeil, HeigthRM: Double;
      LenghtRoom, WidthRoom, x, y: double;
      KolRooms: integer;
      KolRM: integer;
    begin
      Result := 0;
      HeigthFalseCeil := vHeigthFalseCeil.Value;
      HeigthRM := vHeigthRM.Value;
      KolRooms := trunc(vKolRooms.Value);
      LenghtRoom := vLengthRoom.Value;
      WidthRoom := vWidthRoom.Value;
      x := vFormulaInCC3_X.Value;
      y := vFormulaInCC3_Y.Value;
      Result := Ceil(LenghtRoom * y + WidthRoom * x + KolRm * (HeigthFalseCeil - HeigthRM));
    end;
  begin
    result := 0;
    Case FormulaInCC_Group.ItemIndex of
      0: Result := Metod1;
      1: Result := Metod2;
      2: Result := Metod3;
    end;
  end;
//////////////////////////////////////////////////
  function CalcOpenWir: integer;
   var
    KolPoint, kolvo: integer;

    function Metod1: integer;
    var
      Rashod,KolCableInBeam: double;

    begin
      Result := 0;
      Rashod := vMetodOpenWir1_Rashod.Value;
      //KolCableInBeam := vMetodOpenWir1_KolInBeam.Value;
      Result := ceil(TotalKolCable *  KolCableInBeam);
    end;
  begin
    result := 0;
    case OpenWir_RadioGroup.ItemIndex of
      0: KolPoint := Metod1;
    end;
    with Kalc_DM.ElPointFix_MemTable do
    begin
      First;
      while Not Eof do
      begin
        Kolvo := ceil(KolPoint * FieldByName('Percent').AsFloat / 100);
        AddRecordInReport( FieldByName('Name').AsString,
                         FieldByName('Articul').AsString,
                         KolPoint,
                         FieldByName('Price').AsFloat,
                         KolPoint * FieldByName('Price').AsFloat);
        Next;
      end;
    end;
  end;       
//////////////////////////////////////////////////
begin
  KolDopCC := 0;
  PerTehreservCC := vKolTehreserv.Value / 100;
  case FixCableWey_ComboBox.ItemIndex of
    0: CCLength := CalcCCFloor;
    1: CCLength := CalcUndeCeil;
    2: CCLength := CalcInCC;
    3: CCLength := CalcOpenWir;
  end;
  KolCC := CCLength + ceil(CCLength * PerTehreservCC);
  // работы по прокладке кабельного канала
  if FixCableWey_ComboBox.ItemIndex <> 3 then
  begin
    KoefWorks := KoefForWorks;
    TotalKolCC := CCLength + KolDopCC;
    PutToReportWork(idwCC, TotalKolCC,Koefworks);
  end;
  if FixCableWey_ComboBox.ItemIndex <> 3 then
    with Kalc_DM.CableCanalMemTable do
    begin
      First;
      while not Eof do
      begin
        CCLength := (Ceil(KolCC * FieldByName('percent').AsFloat / 100));
        AddRecordInReport( FieldByName('Name').AsString,
                           FieldByName('Articul').AsString,
                           CCLength,
                           FieldByName('Price').AsFloat,
                           CCLength * FieldByName('Price').AsFloat);
        KalcElemOfCC(CCLength);
        Next;
      end;
    end;
end;

procedure TF_Kalc.vWidthRoomChange(Sender: TObject);
var
  val: double;
begin
   val := vWidthRoom.Value;
  if val = 0 then
    val := 1;
  vSKab_Edit.Value := Val * vLengthRoom.Value;
end;

procedure TF_Kalc.vLengthRoomChange(Sender: TObject);
var
  val: double;
begin
  val := vLengthRoom.Value;
  if val = 0 then
    val := 1;
  vSKab_Edit.Value := vWidthRoom.Value * Val;
end;

procedure TF_Kalc.PrintClick(Sender: TObject);
var
  CostOfProjectReportParams: TCostOfProjectReportParams;
begin
  {PutHaracterProjectInMt;
  CostOfProjectReportParams := getCostOfProjectReportParams;
  F_ProjMan.F_ResourceReport.ShowPriorCostOfProjectReportWizard(Kalc_DM.AllComponent_MemTable, Kalc_DM.HaracterProject_MemTable,
    CostOfProjectReportParams, false);}
end;

procedure TF_Kalc.PutHaracterProjectInMT;
begin
    Kalc_DM.HaracterProject_MemTable.Active := False;
    Kalc_DM.HaracterProject_MemTable.Active := true;
    AddRecordInHaracterProject_MemTable(cKalc_Msg22, FloatToStr(vKolFloor.Value));
    AddRecordInHaracterProject_MemTable(cKalc_Msg23 + GetNameUOM2(F_NormBase.FUOM), FloatToStr(vSTotalPlase.Value));
    AddRecordInHaracterProject_MemTable(cKalc_Msg24, FloatToStr(vKSWorkPlase.Value)+ '%');
    AddRecordInHaracterProject_MemTable(cKalc_Msg25 + GetNameUOM2(F_NormBase.FUOM), FloatToStr(vKolFloor.Value));
    AddRecordInHaracterProject_MemTable(cKalc_Msg26 + GetNameUOM(F_NormBase.FUOM, true), FloatToStr(vHeighFloor.Value));
    AddRecordInHaracterProject_MemTable(cKalc_Msg27, FloatToStr(vKolRooms.Value));
    AddRecordInHaracterProject_MemTable(cKalc_Msg28 + GetNameUOM(F_NormBase.FUOM, true), FloatToStr(vWidthRoom.Value) + ' x ' + FloatToStr(vLengthRoom.Value));
    AddRecordInHaracterProject_MemTable(cKalc_Msg29 + GetNameUOM2(F_NormBase.FUOM), FloatToStr(vSKab_Edit.Value));
    AddRecordInHaracterProject_MemTable(cKalc_Msg30 + GetNameUOM2(F_NormBase.FUOM), FloatToStr(vSForRM.Value));
    AddRecordInHaracterProject_MemTable(cKalc_Msg31, FloatToStr(vKolRM.Value));
    AddRecordInHaracterProject_MemTable(cKalc_Msg32, FloatToStr(vKKolDopMest.Value));
    AddRecordInHaracterProject_MemTable(cKalc_Msg33, FloatToStr(vTotalKolRM.Value));
    AddRecordInHaracterProject_MemTable(cKalc_Msg34, FloatToStr(vKolPortForRM.Value));
    AddRecordInHaracterProject_MemTable(cKalc_Msg35, FloatToStr(vSKab_Edit.Value));
    if eKalcPKForRM_Check.Checked then
      AddRecordInHaracterProject_MemTable(cKalc_Msg36, FloatToStr(vKolPKForRM.Value));
    AddRecordInHaracterProject_MemTable(cKalc_Msg37 + GetNameUOM(F_NormBase.FUOM, true), FloatToStr(vHeigthRM.Value));
    AddRecordInHaracterProject_MemTable(cKalc_Msg38 + GetNameUOM(F_NormBase.FUOM, true), FloatToStr(vDistShot.Value));
    AddRecordInHaracterProject_MemTable(cKalc_Msg39 + GetNameUOM(F_NormBase.FUOM, true), FloatToStr(vDistLong.Value));
    AddRecordInHaracterProject_MemTable(cKalc_Msg91, FloatToStr(vKoefDistShot.Value));
    AddRecordInHaracterProject_MemTable(cKalc_Msg92, FloatToStr(vKoefDistLong.Value));

    case TypeConnectEuipment_RadioGroup.ItemIndex of
      0: AddRecordInHaracterProject_MemTable(cKalc_Msg40, cKalc_Msg41);
      1: AddRecordInHaracterProject_MemTable(cKalc_Msg40, cKalc_Msg42);
      2: AddRecordInHaracterProject_MemTable(cKalc_Msg40, cKalc_Msg43);
    end;
    AddRecordInHaracterProject_MemTable(cKalc_Msg44, FloatToStr(vKolPortForRM.Value));
    AddRecordInHaracterProject_MemTable(cKalc_Msg45, FloatToStr(vKolReservCable.Value));
    AddRecordInHaracterProject_MemTable(cKalc_Msg46, IntToStr(ServerFloor));
    if OnceShelfCheck.Checked and (not ECostShelfGridCheck.Checked) then
       AddRecordInHaracterProject_MemTable(cKalc_Msg47, cKalc_Msg48);
    AddRecordInHaracterProject_MemTable(cKalc_Msg49 + GetNameUOM(F_NormBase.FUOM, true), FloatToStr(vKolCableInPark.Value));
    AddRecordInHaracterProject_MemTable(cKalc_Msg50, FloatToStr(vKCableRezerv.Value) + '%');
    AddRecordInHaracterProject_MemTable(cKalc_Msg51 + GetNameUOM(F_NormBase.FUOM, true), FloatToStr(vCableEndRezerv.Value));
    AddRecordInHaracterProject_MemTable(cKalc_Msg52, FloatToStr(vKCableRezerv.Value) + '%');
    AddRecordInHaracterProject_MemTable(cKalc_Msg53, FixCableWey_ComboBox.Text);

    Case FixCableWey_ComboBox.ItemIndex of
      0:begin
          AddRecordInHaracterProject_MemTable(cKalc_Msg54,cKalc_Msg55);
          if Kalc_DM.CCFloor_MemTable.RecordCount > 0 then
            case FormulaFloor_Group.ItemIndex of
              0: AddRecordInHaracterProject_MemTable(cKalc_Msg56, cKalc_Msg57 + FloatToStr(vFormulaFloor1_X.Value) +
                                                       cKalc_Msg58 + FloatToStr(vFormulaFloor1_Y.Value) + cKalc_Msg59);
              1: AddRecordInHaracterProject_MemTable(cKalc_Msg56, cKalc_Msg60 + FloatToStr(vFormulaFloor2_X.Value) + cKalc_Msg61 + GetNameUOM(F_NormBase.FUOM, false));
            end;
        end;
      1:begin
          case FormulaDekorCC_RadioGroup.ItemIndex of
            0: AddRecordInHaracterProject_MemTable(cKalc_Msg54, cKalc_Msg62);
            1: AddRecordInHaracterProject_MemTable(cKalc_Msg54, cKalc_Msg63 + FloatToStr(vFormulaDekorCC2_X.Value) + cKalc_Msg64);
          end;
          if Kalc_DM.CCUnderCeil_MemTable.RecordCount > 0 then
            case FormulaUnderCail_RadioGroup.ItemIndex of
              0: AddRecordInHaracterProject_MemTable(cKalc_Msg65, cKalc_Msg66 + FloatToStr(vFormulaUnderCeil1_X.Value) +
                                                      cKalc_Msg67 + FloatToStr(vFormulaUnderCeil1_Y.Value) + cKalc_Msg68);
              1: AddRecordInHaracterProject_MemTable(cKalc_Msg65, cKalc_Msg69 + FloatToStr(vFormulaUnderCeil2_X.Value) + cKalc_Msg70 + GetNameUOM(F_NormBase.FUOM, false));
            end;
        end;
      2:begin
          case FormulaInCC_Group.ItemIndex of
            0: AddRecordInHaracterProject_MemTable(cKalc_Msg71, cKalc_Msg72);
            1: AddRecordInHaracterProject_MemTable(cKalc_Msg54, cKalc_Msg73 + FloatToStr(vFormulaInCC2_X.Value) + cKalc_Msg70);
            2: AddRecordInHaracterProject_MemTable(cKalc_Msg54, cKalc_Msg74 + FloatToStr(vFormulaInCC3_X.Value)
                                                    +  cKalc_Msg75 + FloatToStr(vFormulaInCC3_Y.Value) + ')' + #10#13 + cKalc_Msg76);
          end;
        end;
      3:begin
          case OpenWir_RadioGroup.ItemIndex of
            0: AddRecordInHaracterProject_MemTable(cKalc_Msg77, cKalc_Msg78 + cKalc_Msg79 + FloatToStr(vMetodOpenWir1_Rashod.Value) +')');
          end;
        end;
    end;
    if FixCableWey_ComboBox.ItemIndex <> 3 then
       AddRecordInHaracterProject_MemTable(cKalc_Msg90 + GetNameUOM(F_NormBase.FUOM, true), IntToStr(TotalKolCC));
    AddRecordInHaracterProject_MemTable(cKalc_Msg89+ GetNameUOM(F_NormBase.FUOM, true), IntToStr(TotalKolCable));
end;

procedure TF_Kalc.AddRecordInHaracterProject_MemTable(AName, AZnach: string);
begin
  with Kalc_DM.HaracterProject_MemTable do
  begin
    Append;
    FieldByName('Name').AsString := AName;
    FieldByName('Znach').AsString := AZnach;
    Post;
  end;
end;
//procedure TF_Kalc.Button2222Click(Sender: TObject);
//var
//  CostOfProjectReportParams: TCostOfProjectReportParams;
//begin
//  PutHaracterProjectInMt;
//  CostOfProjectReportParams := getCostOfProjectReportParams;
//  F_ProjMan.F_ResourceReport.ShowPriorCostOfProjectReportWizard(Kalc_DM.AllComponent_MemTable, Kalc_DM.HaracterProject_MemTable,
//    CostOfProjectReportParams, true);
//end;

procedure TF_Kalc.actExitExecute(Sender: TObject);
begin
   Self.Close;
end;

function TF_Kalc.getCostOfProjectReportParams: TCostOfProjectReportParams;
begin
  Result.ZakazchikName := ZakazchikName_Edit.Text;
  Result.PodradchikName := PodradchikName_edit.Text;
  Result.CurrencyName := Curr_ComboBox.Text;
end;

procedure TF_Kalc.btPrintReportClick(Sender: TObject);
var
  CostOfProjectReportParams: TCostOfProjectReportParams;
begin
  F_ProjMan.CreateFResourceReport;

  ValidateActiveFormControl(Self);
  CostOfProjectReportParams := getCostOfProjectReportParams;
  if EIncludHarProj.Checked then
    F_ProjMan.F_ResourceReport.ShowPriorCostOfProjectReportWizard(Kalc_DM.AllComponent_MemTable, Kalc_DM.HaracterProject_MemTable,
    CostOfProjectReportParams, true, false)
  else
    F_ProjMan.F_ResourceReport.ShowPriorCostOfProjectReportWizard(Kalc_DM.AllComponent_MemTable, Kalc_DM.HaracterProject_MemTable,
    CostOfProjectReportParams, false, false);

  ShowWindow(Handle, SW_MINIMIZE);
end;

procedure TF_Kalc.btEditReportClick(Sender: TObject);
var
  CostOfProjectReportParams: TCostOfProjectReportParams;
begin
  F_ProjMan.CreateFResourceReport;
  
  CostOfProjectReportParams := getCostOfProjectReportParams;
  if EIncludHarProj.Checked then
    F_ProjMan.F_ResourceReport.ShowPriorCostOfProjectReportWizard(Kalc_DM.AllComponent_MemTable, Kalc_DM.HaracterProject_MemTable,
    CostOfProjectReportParams, true, true)
  else
    F_ProjMan.F_ResourceReport.ShowPriorCostOfProjectReportWizard(Kalc_DM.AllComponent_MemTable, Kalc_DM.HaracterProject_MemTable,
    CostOfProjectReportParams, false, true);
end;


procedure TF_Kalc.Curr_ComboBoxPropertiesChange(Sender: TObject);
var
  FormatStr: string;
begin
 FormatStr :=  cKalc_Msg80 + Curr_ComboBox.EditText;
 AllComponent_GridDBTableView1.DataController.Summary.FooterSummaryItems[0].Format :=  FormatStr;
 AllComponent_GridDBTableView1.DataController.Summary.DefaultGroupSummaryItems[0].Format :=  FormatStr;
end;

procedure TF_Kalc.vHeighFloorChange(Sender: TObject);
var
  Heigth: double;
begin
  Heigth := vHeighFloor.Value;
  vHeigthCC.Max := Heigth;
  vHeigthRM.Max := Heigth;
  vHeigthFalseCeil.Max := Heigth;
end;

procedure TF_Kalc.vSKab_EditChange(Sender: TObject);
var
  val: double;
begin
   val := vSKab_Edit.Value;
   if val <= 0 then
     val := 1;
   vKolRooms.Value := trunc(vSWorkPlase.Value / val);
end;

procedure TF_Kalc.vSForRMChange(Sender: TObject);
begin
//  KolRMBtnClick(Self);
end;

procedure TF_Kalc.AllComponent_GridDBTableView1EditValueChanged(
  Sender: TcxCustomGridTableView; AItem: TcxCustomGridTableItem);
begin
  //with Kalc_DM.AllComponent_MemTable do
//  begin
//   Post;
//    Edit;
//    FieldByName(fnCost).AsFloat := FieldByName(fnKolvo).AsFloat * FieldByName(fnPrice).AsFloat;
//    Post;
//  end;
end;

{ T_KalcDocument }

procedure T_KalcDocument.AddParamToXMl(AName: string; Value : string = '');
var
  Node, Atr: IDomNode;
  Str: IDOMCharacterData;
begin
  Node := TopNode.createElement(Aname);

  if Value <> '' then
  begin
    Atr :=  TopNode.createAttribute('value');
    Atr.nodeValue :=  Value;   // создание техстового узла
    Node.attributes.setNamedItem(Atr);
  end;

  RootNode.appendChild(Node);
end;

procedure T_KalcDocument.AddToXmlGrid(AGrid: TcxGridDBTableView);
var
  MT: TkbmMemTable;
  FieldDefs: TFieldDefs;
  NameField, Value, str: string;
  i, j: integer;
  fieldNode, Node, RecordNode: IDOMNode;
  Text: IDOMCharacterData;
  CountTime: integer;
begin
  MT := TkbmMemTable(AGrid.DataController.DataSource.DataSet);
  FieldDefs := MT.FieldDefs;
 // if mt.State <> dsBrowse then
//  begin
//   //AGrid.DataController.Cancel;
////    AGrid.DataController.Controller.EditingController.Edit.EditValue :=  AGrid.DataController.Controller.EditingController.Edit.  ;
//   // F_Kalc.Name_ColumnPropertiesEditValueChanged(AGrid.DataController.Controller.EditingController.Edit);
//
////    AGrid.DataController.UpdateData;
//
//   // mt.CheckBrowseMode;
//    //MT.CheckActive;
//  //  MT.DataEvent(deCheckBrowseMode, 0);
//   // case mt.State of
////    dsEdit, dsInsert:
////      begin
////        mt.UpdateRecord;
////        if mt.Modified then mt.Post else mt.Cancel;
////      end;
////    end;
//   // CountTime := 0;
//
//    //end;
//  end; 
  Node := TopNode.getElementsByTagName(Agrid.Name).item[0];
  if (Node <> NIL) and (MT.RecordCount > 0)  then
  with MT do
  begin
    First;
    j := 1;
    while Not Eof do
    begin
      str := 'Record' + IntTostr(j);
      RecordNode := TopNode.createElement(Str);
      if RecordNode <> Nil then
      begin
        For i := 0 to FieldDefs.Count -1 do
        begin
          NameField := FieldDefs[i].Name;
          fieldNode := TopNode.createAttribute(NameField);
          fieldNode.nodeValue := FieldByName(NameField).AsString;
          RecordNode.attributes.setNamedItem(fieldNode);
        end;
        Node.appendChild(RecordNode);
        inc(j);
        Next;
      end;
    end;
  end;
end;

constructor T_KalcDocument.Create(AOwner: TObject; AFileName: string = '');
begin
  inherited Create();
  FOwner := TForm(AOwner);
  if AFileName <> '' then
  begin
    LoadFromFile(AFileName);
  end
  else
  begin
    CreateXML(AFileName);
  end;
  end;

procedure T_KalcDocument.CreateXML(AFieldName: string);

begin
  Xml := TXMLDocument.Create(nil);
  XML.Active := false;
  Xml.XML.Text := ('');
  XML.Active := true;
  TopNode := XML.DOMDocument;
  RootNode := TopNode.appendChild(topNode.createElement('params'));
//  Xml.documentElement;
  InitXMl;



end;

destructor T_KalcDocument.Destroy;
begin
  Xml.Free;
  inherited;
end;

procedure T_KalcDocument.InitXMl;
var
  i, Count : integer;
  Control: TControl;
  procedure AddControlsToXML(AControl: TComponent);
  var
    i,j: integer;
    PageControl: TRzPageControl;
  begin
    if (Acontrol is TcxCustomEdit) or (AControl is TcxGridDBTableView)
       or(AControl is TRzCustomEdit) or (Acontrol is TRzCustomCheckBox)
       or(Acontrol is TcxCustomComboBox) or(AControl is TCustomComboBox)
       or(Acontrol is TFlyTreeViewPro) or(Acontrol is TRzRadioGroup)
    then
    begin
      AddParamToXML(Acontrol.Name);
    end
  end;
begin
  with FOwner do
  begin
    count := ComponentCount;
    for i := 0 to Count - 1 do
    begin
   //   if Components[i] is TCustomControl then
        AddControlsToXML(Components[i]);
    end;
  end;
//  SaveToFile('max.xml');
end;

procedure T_KalcDocument.LoadComponentValue(AComponent: TComponent);
var
  Node, childNode: IDOMNode;
  Text: IDOMCharacterData;
  Str: string;
  i: integer;
  FlyTreeView: TFlyTreeViewPro;
  FlyNode: TFlyNode;
begin
  Node := TopNode.getElementsByTagName(AComponent.Name).item[0];
  if (Node <> Nil) then
  if node.attributes.length > 0 then
  begin
    Str := '';
    if AComponent is TRzCheckBox then
      TRzCheckBox(AComponent).Checked := StrToBool(Node.attributes.item[0].nodeValue);
    if AComponent is TRzCustomEdit then
      TRzCustomEdit(AComponent).EditText := Node.attributes.item[0].nodeValue;
    if AComponent is TRzRadioGroup then
    begin
      if Node.attributes.item[0].nodeValue = '' then
        TRzRadioGroup(AComponent).ItemIndex := 0
      else
        TRzRadioGroup(AComponent).ItemIndex := StrToInt(Node.attributes.item[0].nodeValue);
    end;
   if AComponent is TcxCustomEdit then
    begin
      if AComponent is TcxSpinEdit then
      begin
        TcxSpinEdit(AComponent).Value := StrToFloatU(Node.attributes.item[0].nodeValue);
      end
      else
        if (AComponent is TcxComboBox) then
        begin
          TcxComboBox(AComponent).ItemIndex := StrToInt(Node.attributes.item[0].nodeValue)
        end
        else
          TcxCustomEdit(AComponent).EditValue := Node.attributes.item[0].nodeValue;
    end;
    if AComponent is TFlyTreeViewPro then
    begin
      FlyTreeView := TFlyTreeViewPro(AComponent);
      For i:= FlyTreeView.Items.Count - 1 downto 1 do
      begin
        FlyTreeView.Items.Delete(FlyTreeView.Items[i]);
      end;
      For i := 0 to Node.attributes.length - 1 do
      begin
        if i <> 0  then
          FlyTreeView.Items.Add(FlyNode, IntToStr(i+1) + cKalc_Msg1);
        FlyNode := FlyTreeView.Items[FlyTreeView.Items.Count - 1];
        FlyNode.Cells[1] := Node.attributes.item[i].nodeValue;

      end;
    end
  end
  else
  begin
    if AComponent is TcxGridDBTableView then
      LoadGridFromXML(TcxGridDBTableView(AComponent));
  end;
end;

procedure T_KalcDocument.LoadGridFromXML(AGrid: TcxGridDBTableView);
var
  MT: TDataSet;
  FieldDefs: TFieldDefs;
  NameField, Value, str: string;
  i, j: integer;
  fieldNode, Node, RecordNode: IDOMNode;
  Text: IDOMCharacterData;
  NodeList: IDOMNodeList;
  count: integer;
begin

  MT :=  AGrid.DataController.DataSource.DataSet;
  MT.Active := false;
  MT.Active := True;
  FieldDefs := MT.FieldDefs;
  NodeList :=  TopNode.getElementsByTagName(Agrid.Name);

  Node :=  NodeList.item[0];
  //MT.Active := false;
  //MT.Active := true;
  if (Node <> NIL) then
  begin
    RecordNode := Node.firstChild;
    j := 1;
    while RecordNode <> Nil do
    begin
      MT.Append;
      for i := 0 to RecordNode.attributes.length-1 do
      begin
        fieldNode := RecordNode.attributes.item[i];
        MT.FieldByName(fieldNode.nodeName).AsString := fieldNode.nodeValue;
      end;
      MT.Post;
      RecordNode := RecordNode.nextSibling;
    end;
  end;
end;


procedure T_KalcDocument.LoadFromFile(AFileName: string);
var
  i: integer;
  AControl: TComponent;
begin
  TF_Kalc(FOwner).Kalc_DM.DisebleMasterDetail;
  try
    Xml := TXMLDocument.Create(nil);
    Xml.LoadFromFile(AFileName);
    Xml.Active := true;
    TopNode := Xml.DOMDocument;
    RootNode := TopNode.documentElement;
    if RootNode <> nil then
    begin

      for i := 0 to FOwner.ComponentCount - 1 do
      begin
        AControl := FOwner.Components[i];
        if (Acontrol is TcxCustomEdit) or (AControl is TcxGridDBTableView)
           or(AControl is TRzCustomEdit) or (Acontrol is TRzCustomCheckBox)
           or(Acontrol is TcxCustomComboBox) or(AControl is TCustomComboBox)
           or(Acontrol is TFlyTreeViewPro) or(Acontrol is TRzRadioGroup)
        then
          LoadComponentValue(AControl);
      end;
      TF_Kalc(FOwner).Kalc_DM.AllComponent_MemTable.Active := False;
      TF_Kalc(FOwner).Kalc_DM.AllComponent_MemTable.Active := True;
    end;
  Finally
    TF_Kalc(FOwner).Kalc_DM.EnableMasterDetail;
  end;
end;

procedure T_KalcDocument.SaveComponentValue(AComponent: TComponent);
var
  Atr,Node, childNode: IDOMNode;
  Text: IDOMCharacterData;
  Str: string;
  i: integer;
  FlyTreeView: TFlyTreeViewPro;
begin
  Str := '';
  if AComponent is TRzCustomEdit then
    Str := TRzCustomEdit(AComponent).EditText;
   if AComponent is TRzCheckBox then
    Str := BoolToStr(TRzCheckBox(AComponent).Checked);
  if AComponent is TRzRadioGroup then
    Str := IntToStr(TRzRadioGroup(AComponent).ItemIndex);
  if AComponent is TcxCustomEdit then
  begin
    if AComponent is TcxSpinEdit then
      Str := FloatToStrU(TcxSpinEdit(AComponent).Value)
    else
      if TcxCustomEdit(AComponent).EditValue = Null then
        Str := ''
      else
        if (AComponent is TcxComboBox) then
        begin
         str := IntToStr(TcxComboBox(AComponent).ItemIndex);
        end
        else
          Str := TcxCustomEdit(AComponent).EditValue;
  end;
  
  if Str <> '' then
  begin
    Node := TopNode.getElementsByTagName(AComponent.Name).item[0];
    Atr := TopNode.createAttribute('Value');
    Atr.nodeValue := Str;
    Node.attributes.setNamedItem(Atr);
   //TopNode.getElementById(AComponent.Name);
  //  Text := Xml.DOMDocument.createTextNode(Str);
  //  Node.appendChild(Text);

  end
  else
  begin
    if AComponent is TFlyTreeViewPro then
    begin
      Node := TopNode.getElementsByTagName(AComponent.Name).item[0];
      FlyTreeView := TFlyTreeViewPro(AComponent);
      For i:= 0 to FlyTreeView.Items.Count - 1 do
      begin
        str := 'Floor' + IntToStr(i + 1);
        Atr := TopNode.createAttribute(Str);
        Atr.nodeValue := FlyTreeView.Items[i].Cells[1];
        Node.attributes.setNamedItem(Atr);
      end;
    end;
    if AComponent is TcxGridDBTableView then
      AddToXmlGrid(TcxGridDBTableView(AComponent));
  end;
end;

procedure T_KalcDocument.SaveToFile(AFileName: string);
var
  i: integer;
begin
  TF_Kalc(FOwner).Kalc_DM.DisebleMasterDetail;
  try
    for i := 0 to FOwner.ComponentCount - 1 do
    begin
      SaveComponentValue(FOwner.Components[i]);
    end;
  finally
    TF_Kalc(FOwner).Kalc_DM.EnableMasterDetail;
  end;
  Xml.SaveToFile(AFileName);

end;

procedure TF_Kalc.OpenFile_BtnClick(Sender: TObject);
var
  x: T_KalcDocument;
  Name: TFileName;
  razn : integer;
begin
  OpenDialog1.Filter := cKalc_Msg81;
  OpenDialog1.Title := cKalc_Msg82;
  if OpenDialog1.Execute then
  begin
    Name := OpenDialog1.FileName;
    x := T_KalcDocument.Create(Self, Name);
    x.Destroy;

     //проверяем и выносим предупреждения
    if GetFreePercentForCable > 0 then
      StaticText5.Show
    else
      StaticText5.Hide;
    if GetFreePercent(Kalc_DM.CableCanalMemTable.RecordCount)< 0 then
    begin
      StaticText4.Show;
    end
    else
    begin
      StaticText4.Hide;
    end;
    razn := CmpFloorsWithKolRM ;
    if razn <> 0 then
    begin
      StaticText1.Show;
      StaticText2.Caption := cKalc_Msg2 + IntToStr(razn);
      StaticText2.Show;
    end
    else
    begin
      StaticText1.Hide;
      StaticText2.Hide;
    end;

  end;
end;

procedure TF_Kalc.SaveFile_BtnClick(Sender: TObject);
var
  x: T_KalcDocument;
  Name: TFileName;
begin

  SaveDialog1.Filter := cKalc_Msg83;
  SaveDialog1.Title := cKalc_Msg84;
  SaveDialog1.DefaultExt := '*.spe';
  If SaveDialog1.Execute then
  begin
    Name := SaveDialog1.FileName;
    x := T_KalcDocument.Create(Self);
    x.SaveToFile(Name);
    x.Destroy;
  end;



end;

procedure TF_Kalc.FormClose(Sender: TObject; var Action: TCloseAction);
var
  x: T_KalcDocument;
  ActivePage: integer;
  Error: Boolean;
begin
  ValidateActiveFormControl(Self);
  Error := true;
  ActivePage := Main_PageControl.ActivePageIndex;
  if ActivePage = 4 then
  begin
    if AllComponent_GridDBTableView1.DataController.IsEditing then
      Error :=false;
  end;
  if ActivePage = 3 then
  begin
    if PriceWorks_TableView.DataController.IsEditing then
      Error :=false;
  end;
  if ActivePage = 1 then
  begin
    if CostRMGridTableView.DataController.IsEditing
       or CostPKDBTableView.DataController.IsEditing
       or CostPP_GridDBTableView.DataController.IsEditing
       or GT_CostOrg.DataController.IsEditing
       or CostShelf_GridDBTableView.DataController.IsEditing
       or ShelfForFloor_GridDBTableView.DataController.IsEditing
       or DopEq_TableView.DataController.IsEditing
    then
       Error := false;
  end;
  if ActivePage = 2 then
  begin
    if CCForFloor_GridTableView.DataController.IsEditing
       or CCUnderCeil_GridTableView.DataController.IsEditing
       or ElPointFix_GridTableView.DataController.IsEditing
       or CableCanalGrid_TableView1.DataController.IsEditing
       or ElementOfCC_Grid_DBTableView.DataController.IsEditing
    then
       Error := false;
  end;

  try
    if Error then
    begin
      x := T_KalcDocument.Create(Self);
      x.SaveToFile(TempFile);
      x.Destroy;
    end
    else
      Action := caNone;
  except
    on E: Exception do AddExceptionToLogEx('TF_Kalc.FormClose', E.Message);
  end;
end;

procedure TF_Kalc.CostShelf_GridDBTableViewEditValueChanged(
  Sender: TcxCustomGridTableView; AItem: TcxCustomGridTableItem);
var
  price: double;
  id: integer;
begin
//  Kalc_DM.ShelfForFloor_MemTable.Refresh;
  Sender.DataController.Post;
  if AItem.Index = 3 then
  begin
    id := Kalc_DM.CostShelf_MemTable.FieldByName(fnID).AsInteger;
    price := Kalc_DM.CostShelf_MemTable.FieldByName(fnPrice).AsFloat;
    with Kalc_DM.ShelfForFloor_MemTable do
    begin
      First;
      while not Eof do
      begin
        if (not FieldByName('Id_Shelf').IsNull) and(id = FieldByName('Id_Shelf').AsInteger) then
        begin
          Edit;
          FieldByName(fnPrice).AsFloat := price;
          Post;
        end;
        Next;
      end;
    end;

  end;

end;

procedure TF_Kalc.CostRMGridTableViewDragOver(Sender, Source: TObject; X,
  Y: Integer; State: TDragState; var Accept: Boolean);
begin
  Accept := false;
  if Source is TTreeView then
    if TControl(Source).Owner is TF_Main then
    begin
      if TTreeView(Source).Selected <> nil then
      begin
        if IsComponentNode(TTreeView(Source).Selected) then
          if GDropComponent.ID <> 0 then
          begin
            Accept := true;
          end;
      end;
    end;
end;

procedure TF_Kalc.CostRMGridTableViewDragDrop(Sender, Source: TObject; X,
  Y: Integer);
var
  price: double;
  OldCurrency, NewCurrency: TCurrency;
begin
  if GDropComponent.IsLine = biFalse then
  begin
    with Kalc_DM.CostRM_MemTable do
    begin
      Append;
      FieldByName(fnName).AsString := GDropComponent.Name;
      FieldByName(fnArticul).AsString := GDropComponent.ArticulProducer;
      price := GetPriceForKalcFromDragCompon(GDropComponent);
      FieldByName(fnPrice).AsFloat := Price;
      FieldByName(fnKolvo).AsInteger := 1;
      Post;
    end;
//  TcxGridTableView(Sender).DataController.Refresh;
    ValCostFromGrid(vCRM, Kalc_DM.CostRM_MemTable);
  end;
end;

procedure TF_Kalc.CostPKDBTableViewDragDrop(Sender, Source: TObject; X,
  Y: Integer);
var
  OstPer,resultCmp: integer;
  price: double;
begin
  if GDropComponent.ComponentType.SysName = ctsnPatchCord then
  begin
    resultCmp := Kalc_DM.CmpPerFromCostPk_MemTable(OstPer);
    price := GetPriceForKalcFromDragCompon(GDropComponent);
    case resultCmp of
      1 :   U_Kalc_DM.AddRecordInMemTable(Kalc_DM.CostPK_MemTable, GDropComponent.Name, GDropComponent.ArticulProducer, Price, -1, OstPer, mpkCross);
      2,3 :   U_Kalc_DM.AddRecordInMemTable(Kalc_DM.CostPK_MemTable, GDropComponent.Name, GDropComponent.ArticulProducer, Price, -1,  OstPer, mpkRM);
    else
        U_Kalc_DM.AddRecordInMemTable(Kalc_DM.CostPK_MemTable, GDropComponent.Name, GDropComponent.ArticulProducer, Price, -1, 0, mpkCross);
    end;
  end;
  TcxGridTableView(Sender).DataController.Refresh;
end;

procedure TF_Kalc.CostPP_GridDBTableViewDragDrop(Sender, Source: TObject;
  X, Y: Integer);
var
  Prop: PProperty;
  i: integer;
  price: double;
begin
  if GDropComponent.ComponentType.SysName = ctsnPatchPanel then
  begin
    if Kalc_DM.CostPP_MemTable.RecordCount < 1 then
    begin
      price := GetPriceForKalcFromDragCompon(GDropComponent);
      U_Kalc_DM.AddRecordInMemTable(Kalc_DM.CostPP_MemTable, GDropComponent.Name, GDropComponent.ArticulProducer, Price);
      vCPP.Value := Price;
      For i := 0 to GDropComponent.Properties.Count - 1 do
      begin
        Prop := GDropComponent.Properties.Items[i];
        if prop.SysName = pnPORTCOUNT then
        begin
          vKolPortPP.Value := StrToInt(prop.Value);
          break;
        end;
      end;
    ValCostFromGrid(vCPP, Kalc_dm.CostPP_MemTable);
    //TcxGridTableView(Sender).DataController.Refresh;
   end;
 end;
end;

procedure TF_Kalc.GT_CostOrgDragDrop(Sender, Source: TObject;
  X, Y: Integer);
var
  price: double;
begin
  if GDropComponent.ComponentType.SysName = ctsnOrganizer then
  begin
    if Kalc_DM.CostOrg_MemTable.RecordCount < 1 then
    begin
      price := GetPriceForKalcFromDragCompon(GDropComponent);
      U_Kalc_DM.AddRecordInMemTable(Kalc_DM.CostOrg_MemTable, GDropComponent.Name, GDropComponent.ArticulProducer, Price);
    end;
    //TcxGridTableView(Sender).DataController.Refresh;
    ValCostFromGrid(vCOrg, Kalc_dm.CostOrg_MemTable);
  end;
end;

procedure TF_Kalc.CostShelf_GridDBTableViewDragDrop(Sender,
  Source: TObject; X, Y: Integer);
var
 price: double;
begin
  if GDropComponent.ComponentType.SysName = ctsnCupboard then
  begin
    price := GetPriceForKalcFromDragCompon(GDropComponent);
    U_Kalc_DM.AddRecordInMemTable(Kalc_DM.CostShelf_MemTable, GDropComponent.Name, GDropComponent.ArticulProducer, Price);
     TcxGridTableView(Sender).DataController.Refresh;
  end;
end;

procedure TF_Kalc.CableCanalGrid_TableView1DragDrop(Sender,
  Source: TObject; X, Y: Integer);
var
  per: integer;
  i: integer;
  CCConnector: PCableCanalConnector;
  Compon: TSCSComponent;
  price: double;

  Function GotoCableConnectorInMT(Id_typeCCConector: integer): boolean;
  var
   i: integer;
  begin
    result := true;
    Kalc_DM.ElemForCabcanal_MemTable.First;
    case Id_typeCCConector of
      contCork: begin
                  Kalc_DM.ElemForCabcanal_MemTable.MoveBy(4);
                end;
      contAnglePlane: begin
                      //  Kalc_DM.ElemForCabcanal_MemTable.MoveBy(2)
                      end;
      contAngleIn: begin
                     Kalc_DM.ElemForCabcanal_MemTable.MoveBy(1);
                   end;
      contAngleOut: begin
                      Kalc_DM.ElemForCabcanal_MemTable.MoveBy(2);
                    end;
      contConnector: begin
                        Kalc_DM.ElemForCabcanal_MemTable.MoveBy(3);
                      end;
      else
      begin
        Result := False;
      end;
    end;
  end;
begin
  If GDropComponent.ComponentType.SysName =  ctsnCableChannel then
  begin
    per := GetFreePercent(Kalc_DM.CableCanalMemTable.RecordCount);
   // inc(FCountCC);
    Kalc_DM.CableCanalMemTable.FieldByName(fnNpp);
    price := GetPriceForKalcFromDragCompon(GDropComponent);
    with Kalc_DM.CableCanalMemTable do
    begin
      Append;
     // FieldByName(fnNpp).AsInteger := FCountCC;
      FieldByName(fnName).AsString := GDropComponent.Name;
      FieldByName(fnArticul).AsString :=  GDropComponent.ArticulProducer;
      FieldByName(fnPrice).AsFloat := Price;
      FieldByName(fnPercent).AsInteger :=  per;
      Post;
    end;
    AddCCElements;
    Compon := TSCSComponent.Create(GDropComponent.ActiveForm);
    try
      for i := 0 to GDropComponent.CableCanalConnectors.Count - 1 do
      begin
        CCConnector := GDropComponent.CableCanalConnectors[i];
        if GotoCableConnectorInMT(CCConnector.ConnectorType) then
        begin
          Compon.LoadComponentByID(CCConnector.IDNBConnector);
          With Kalc_DM.ElemForCabcanal_MemTable do
          begin
            Edit;
            FieldByName(fnArticul).AsString := Compon.ArticulProducer;
            price := GetPriceForKalcFromDragCompon(Compon);
            FieldByName(fnPrice).AsFloat := price;
            Post;
          end;
        end;
      end;
    finally
      Compon.Free;
    end;
    if GetFreePercent(Kalc_DM.CableCanalMemTable.RecordCount)< 0 then
    begin
      StaticText4.Show;
    end
    else
    begin
      StaticText4.Hide;
    end;
  end;
end;

procedure TF_Kalc.AddCCElements;
var
  z: integer;
  FCountCC: integer;
begin
  Kalc_DM.TypeOfElementCC_MemTable.First;
  while not Kalc_DM.TypeOfElementCC_MemTable.Eof do
  begin
    FCountCC := Kalc_DM.CableCanalMemTable.FieldbyName(fnNpp).AsInteger;
    z := Kalc_DM.TypeOfElementCC_MemTable.FieldByName('ID').AsInteger;
    With Kalc_DM.ElemForCabcanal_MemTable do
    begin
      Append;
      //inc(FCountECC);
      // FieldByName('Id').AsInteger := FCountECC;
      FieldByName('Npp_CC').AsInteger := FCountCC;
      FieldByName('Id_Type').AsInteger := z;
      FieldByName('Price').AsFloat := 0;
      if z = 1 then
        FieldByName('Rashod').AsInteger := 6;
      if z = 2 then
        FieldByName('Rashod').AsFloat := 6;
      if z = 3 then
        FieldByName('Rashod').AsFloat := 2.5;
      if z = 4 then
        FieldByName('Rashod').AsFloat := 6;
      if z = 5 then
        FieldByName('Rashod').AsFloat := 7;
      post;
    end;
    Kalc_DM.TypeOfElementCC_MemTable.Next;
  end;
end;

procedure TF_Kalc.EnableTableView(ATableView: TcxGridDBTableView; AEnabled: Boolean);
begin
  if AEnabled then
  begin
    ATableView.Styles.Background := nil;
    ATableView.Styles.Content := nil;
  end
  else
  begin
    ATableView.Styles.Background := cxBackDisabled;
    ATableView.Styles.Content := cxBackDisabled;
  end;
end;

procedure TF_Kalc.ElPointFix_GridTableViewDragDrop(Sender, Source: TObject;
  X, Y: Integer);
var
  prop: PProperty;
  i: integer;
begin
  if GDropComponent.ComponentType.SysName = ctsnCableChannelAccessory then
  begin
    begin
      U_Kalc_DM.AddRecordInMemTable(Kalc_DM.ElPointFix_MemTable, GDropComponent.Name, GDropComponent.ArticulProducer, RoundX(GDropComponent.Price,2),-1, 0);
      For i := 0 to GDropComponent.Properties.Count - 1 do
      begin
        Prop := GDropComponent.Properties.Items[i];
        if prop.SysName = pnExpenseForMetr then
        begin
          vMetodOpenWir1_Rashod.Value := StrToFloatU(CorrectStrToFloat(prop.Value));
          break;
        end;
      end;
   
    //TcxGridTableView(Sender).DataController.Refresh;
   end;
 end;
end;

procedure TF_Kalc.CCForFloor_GridTableViewDragDrop(Sender, Source: TObject;
  X, Y: Integer);
begin
  if GDropComponent.ComponentType.SysName = ctsnCableChannel then
  begin
    U_Kalc_DM.AddRecordInMemTable(Kalc_DM.CCFloor_MemTable, GDropComponent.Name, GDropComponent.ArticulProducer, RoundX(GDropComponent.Price,2),-1, 0);
  end;
end;

procedure TF_Kalc.CCUnderCeil_GridTableViewDragDrop(Sender,
  Source: TObject; X, Y: Integer);
begin
  if GDropComponent.ComponentType.SysName = ctsnCableChannel then
  begin
    U_Kalc_DM.AddRecordInMemTable(Kalc_DM.CCUnderCeil_MemTable, GDropComponent.Name, GDropComponent.ArticulProducer, RoundX(GDropComponent.Price,2),-1, 0);
  end;
end;

procedure TF_Kalc.AllComponent_GridDBTableView1FocusedItemChanged(
  Sender: TcxCustomGridTableView; APrevFocusedItem,
  AFocusedItem: TcxCustomGridTableItem);
begin
//
end;

procedure TF_Kalc.AllComponent_Grid_pricePropertiesValidate(
  Sender: TObject; var DisplayValue: Variant; var ErrorText: TCaption;
  var Error: Boolean);
var
  price: Double;
begin
  price := DisplayValue;

  if price < 0 then
  begin
    Error := true;
  end
  else
  with Kalc_DM.AllComponent_MemTable do
  begin
    Edit;
    if FieldByName('TypePoz').AsString = idTypePozWorks then
      FieldByName(fnCost).AsFloat := FieldByName(fnKolvo).AsFloat * Price * getKoefForWorks
    else
      FieldByName(fnCost).AsFloat := FieldByName(fnKolvo).AsFloat * Price;
    FieldByName(fnPrice).AsFloat := price;
    Post;
  end;
end;

procedure TF_Kalc.AllComponent_Grid_KolvoPropertiesValidate(
  Sender: TObject; var DisplayValue: Variant; var ErrorText: TCaption;
  var Error: Boolean);
var
  kolvo: integer;
begin
  Kolvo := DisplayValue;
  if kolvo < 0 then
  begin
    Error := true;
  end
  else
    with Kalc_DM.AllComponent_MemTable do
    begin
      Edit;
      if FieldByName('TypePoz').AsString = idTypePozWorks then
        FieldByName(fnCost).AsFloat := FieldByName(fnPrice).AsFloat * Kolvo * getKoefForWorks
      else
        FieldByName(fnCost).AsFloat := FieldByName(fnPrice).AsFloat * Kolvo;
      FieldByName(fnKolvo).AsInteger := Kolvo;
      Post;
    end;
end;

procedure TF_Kalc.Cable_Grid_DBTableViewDragDrop(Sender, Source: TObject;
  X, Y: Integer);
var
  price: double;
begin
  if GDropComponent.ComponentType.SysName = ctsnCable then
  begin
    price := GetPriceForKalcFromDragCompon(GDropComponent);
    U_Kalc_DM.AddRecordInMemTable(Kalc_DM.Cable_MemTable, GDropComponent.Name, GDropComponent.ArticulProducer, Price,-1, 100, 0);
    if GetFreePercentForCable >= 0 then
      StaticText5.Show
    else
      StaticText5.Hide;
    end;
end;

destructor TF_Kalc.Destroy;
begin
  Kalc_DM.Free;
  inherited;
end;

procedure TF_Kalc.ClearProject_BtnClick(Sender: TObject);
begin
  ClearProject;
   //проверяем и выносим предупреждения
  StaticText5.Hide;
  StaticText4.Hide;
  StaticText1.Hide;
  StaticText2.Hide;

end;

procedure TF_Kalc.ClearProject;
var
  Component: TComponent;
  i, j, Count: integer;
  FlyTreeViewPro: TFlyTreeViewPro;
  Node: TFlyNode;
begin
  for i := 0 to ComponentCount - 1 do
  begin
    Component := Components[i];
    if (Component is TcxCustomEdit) then
    begin
      TcxCustomEdit(Component).EditValue := 0;
    end;
    if (Component is TcxGridDBTableView) then
    begin
      if (Component.Name <> 'PriceWorks_TableView' ) then
      begin
        TcxGridDBTableView(Component).DataController.DataSource.DataSet.Active := False;
        TcxGridDBTableView(Component).DataController.DataSource.DataSet.Active := True;
      end
      else
      begin
        btClearPriceWorksClick(Self)
      end;
    end;
    if (Component is TRzEdit) then
    begin
      TRzEdit(Component).EditText := '';
    end;

    if (Component is TRzSpinEdit) then
    begin
      TRzSpinEdit(Component).Value := 0;
    end;

    if (Component is TRzCheckBox) then
    begin
      TRzCheckBox(Component).Checked := False;
    end;

    if (Component is TcxComboBox) then
    begin
      TcxComboBox(Component).ItemIndex := 0;
    end;

    if (Component is TComboBox) then
    begin
      TComboBox(Component).ItemIndex := 0;
    end;

    if (Component is TFlyTreeViewPro) then
    begin
      FlyTreeViewPro := TFlyTreeViewPro(Component);
      Count := FlyTreeViewPro.Items.Count -1;
      For j := Count downto 1  do
      begin
        Node := FlyTreeViewPro.Items.GetLastNode;
        FlyTreeViewPro.Items.Delete(Node);
      end;
      FlyTreeViewPro.Items[0].Cells[1] := '1';
    end;
  end;
  Kalc_DM.AddShelfForFloor(cKalc_Msg85);
end;

procedure TF_Kalc.grComponentTypesItems0Click(Sender: TObject);
begin
  pcComponentTypes.ActivePage.TabVisible := false;
  pcComponentTypes.ActivePage := TRzTabSheet(TRzGroupItem(Sender).Tag);
  pcComponentTypes.ActivePage.TabVisible := true;
end;

procedure TF_Kalc.grChannelComponTypesItems0Click(Sender: TObject);
begin
  pcChannelComponTypes.ActivePage.TabVisible := false;
  pcChannelComponTypes.ActivePage := TRzTabSheet(TRzGroupItem(Sender).Tag);
  pcChannelComponTypes.ActivePage.TabVisible := true;
end;

procedure TF_Kalc.FormCreate(Sender: TObject);
//var
//  x : T_KalcDocument;


  procedure AddItemsToGroup(AGroup: TRzGroup; ASrcPageControl: TRzPageControl; AOnClick: TNotifyEvent);
  var
    i: Integer;
    TabSheet: TRzTabSheet;
    GroupItem: TRzGroupItem;
  begin
    AGroup.Items.Clear;
    for i := 0 to ASrcPageControl.PageCount - 1 do
    begin
      TabSheet := ASrcPageControl.Pages[i];
      TabSheet.TabVisible := false;

      GroupItem := AGroup.Items.Add;
      GroupItem.Caption := TabSheet.Caption;
      GroupItem.OnClick := AOnClick;
      GroupItem.Tag := Integer(TabSheet);
    end;
  //  if AGroup.Items.Count > 0 then
  //   pcComponentTypes.ActivePageIndex := 0;
     // AGroup.Items[0].Click;
  end;

begin
  try
    Kalc_DM :=TKalc_DM.Create(Self);
    
    //#From Oleg#
    if Main_PageControl.PageCount > 0 then
      Main_PageControl.ActivePage := Main_PageControl.Pages[0];
    AddItemsToGroup(grComponentTypes, pcComponentTypes, grComponentTypesItems0Click);

    //AddItemsToGroup(grChannelComponTypes, pcChannelComponTypes, grChannelComponTypesItems0Click);
    gbChannelComponTypes.Visible := false;
  except
    on E: Exception do AddExceptionToLogEx('TF_Kalc.Create', E.Message);
  end;
end;

procedure TF_Kalc.Execute;
var
  x : T_KalcDocument;
  StrList: TStringList;
  i, razn: integer;
  node : tflyNode;
  procedure SetDisplayFormat;
    function cutFormatToInt(AStr: string): string;
    //var len:integer;
    begin
      Result := AStr;
       delete(Result,3,4);
    end;

   begin
    {$IF Defined(SCS_PE) or Defined(SCS_SPA)}
     Node := vKolRMForFloor.Items.GetFirstNode;
     node.Cells[0] := strCalcCapt0;
    {$IFEND}
    TcxCurrencyEditProperties(Price_Column.Properties).DisplayFormat := GetDisplayFormatForFloat;
    TcxCurrencyEditProperties(CostPKColumn_Price.Properties).DisplayFormat := GetDisplayFormatForFloat;
    TcxCurrencyEditProperties(CostPP_GridColumn_Price.Properties).DisplayFormat := GetDisplayFormatForFloat;
    TcxCurrencyEditProperties(CostOrg_GridColumn_Price.Properties).DisplayFormat := GetDisplayFormatForFloat;
    TcxCurrencyEditProperties(CostShelf_GridColumn_Price.Properties).DisplayFormat := GetDisplayFormatForFloat;
    TcxCurrencyEditProperties(DopEq_Grid_Price.Properties).DisplayFormat := GetDisplayFormatForFloat;
    TcxCurrencyEditProperties(PriceWorks_Grid_Price.Properties).DisplayFormat := GetDisplayFormatForFloat;
    TcxCurrencyEditProperties(Cable_Grid_Price.Properties).DisplayFormat := GetDisplayFormatForFloat;
    TcxCurrencyEditProperties(Price.Properties).DisplayFormat := GetDisplayFormatForFloat;
    TcxCurrencyEditProperties(CableCanalGrid_Price.Properties).DisplayFormat := GetDisplayFormatForFloat;
    TcxCurrencyEditProperties(CCForFloor_Grid_Price.Properties).DisplayFormat := GetDisplayFormatForFloat;
    TcxCurrencyEditProperties(CCUnderCeil_Grid_price.Properties).DisplayFormat := GetDisplayFormatForFloat;
    TcxCurrencyEditProperties(ElPointFix_Grid_Price.Properties).DisplayFormat := GetDisplayFormatForFloat;
    TcxCurrencyEditProperties(AllComponent_Grid_price.Properties).DisplayFormat := GetDisplayFormatForFloat;
    TcxCurrencyEditProperties(ShelfForFloor_GridColumn_Price.Properties).DisplayFormat := GetDisplayFormatForFloat;
    TcxCurrencyEditProperties(Cable_Grid_Percent.Properties).DisplayFormat := cutFormatToInt(GetDisplayFormatForFloat);
    TcxCurrencyEditProperties(CableCanalGrid_Percent.Properties).DisplayFormat := cutFormatToInt(GetDisplayFormatForFloat);
    TcxCurrencyEditProperties(rashod.Properties).DisplayFormat := cutFormatToInt(GetDisplayFormatForFloat);
    TcxCurrencyEditProperties(CostRMGrid_Kolvo.Properties).DisplayFormat := cutFormatToInt(GetDisplayFormatForFloat);
    TcxCurrencyEditProperties(CostPK_Persent.Properties).DisplayFormat := cutFormatToInt(GetDisplayFormatForFloat);
    TcxCurrencyEditProperties(DopEq_Kolvo.Properties).DisplayFormat := cutFormatToInt(GetDisplayFormatForFloat);
    TcxCurrencyEditProperties(CCUnderCeil_Grid_Percent.Properties).DisplayFormat := cutFormatToInt(GetDisplayFormatForFloat);
    TcxCurrencyEditProperties(ElPointFix_Grid_Percent.Properties).DisplayFormat := cutFormatToInt(GetDisplayFormatForFloat);
    TcxCurrencyEditProperties(CCForFloor_Grid_Percent.Properties).DisplayFormat := cutFormatToInt(GetDisplayFormatForFloat);
    TcxCurrencyEditProperties(AllComponent_Grid_Kolvo.Properties).DisplayFormat := cutFormatToInt(GetDisplayFormatForFloat);
//              TcxCurrencyEditProperties(Cable_Grid_Price.Properties).DisplayFormat := GetDisplayFormatForFloat;
//             TcxCurrencyEditProperties(Cable_Grid_Price.Properties).DisplayFormat := GetDisplayFormatForFloat;
//              TcxCurrencyEditProperties(Cable_Grid_Price.Properties).DisplayFormat := GetDisplayFormatForFloat;
//             TcxCurrencyEditProperties(Cable_Grid_Price.Properties).DisplayFormat := GetDisplayFormatForFloat;
//              TcxCurrencyEditProperties(Cable_Grid_Price.Properties).DisplayFormat := GetDisplayFormatForFloat;

  end;
begin
  SetDisplayFormat;
  {$IF Defined(NORMSCS_PE) or Defined(SCS_SPA)}
    TabSheet3.TabVisible := false;
  {$IFEND}
  if Self.Visible then
  //Tolik 21/12/2019 --
  //  SetForegroundWindow(Self.Handle)
  begin
    SetForegroundWindow(Self.Handle);
    ShowWindow(Handle, SW_SHOWNORMAL); // после показа отчета -- сворачивается, при повторном вызове --
                                       // показывается уже свернутым, вот чтобы избежать такой фигни ...
                                       // нужно в любом случае показать в нормальном виде
  end
  //
  else
  begin
    Self.FormStyle := fsStayOnTop;
    try
      Screen.Cursor := crHourGlass;
      try
        FixLabeles;//установка подписей
        //установка названий столбцоа в vKolRMForFloor
        vKolRMForFloor.Columns[0].Caption := cKalc_Msg150;
        vKolRMForFloor.Columns[1].Caption := cKalc_Msg151;
        FixCableWey_ComboBox.ItemIndex := 2;
        TypeWeyCC_PageControl.ActivePage := CableInCC_Sheet;
        Curr_ComboBox.Properties.Items.Clear;
        StrList := GetCurrenciesNameBriefListFromNB;
        for i := 0 to StrList.Count - 1 do
        begin
          Curr_ComboBox.Properties.Items.AddObject(StrList.Strings[i], StrList.Objects[i]);
        end;
        Curr_ComboBox.ItemIndex := 0;
        ServFloor_ComboBox.EditValue := 0;
        ServerFloor := 0;
        //FCountCC := 0;
//        FCountECC := 0;
       // actAddCableCanalExecute(Self);
       // actAddCableExecute(Self);
        try
          if FileExists(TempFile) then
          begin
            x := T_KalcDocument.Create(Self, TempFile);
            x.Destroy;
          end
          else
          begin
            ClearProject;
          end;
        except
          MessageModal(cKalc_Msg86,cKalc_Msg15, MB_ICONWARNING );
          ClearProject;
        end;

        ECostRMGrid_CheckClick(ECostRMGrid_Check);
        ECostPKGridCheckClick(ECostPKGridCheck);
        ECostPPGrid_CheckClick(ECostPPGrid_Check);
        ECostOrgGrid_CheckClick(ECostOrgGrid_Check);
        ECostShelfGridCheckClick(ECostShelfGridCheck);
        EDopEqGrid_CheckClick(EDopEqGrid_Check);

       // if Main_PageControl.PageCount > 0 then
//          Main_PageControl.ActivePage := Main_PageControl.Pages[0];
        //проверяем и выносим предупреждения
        pcComponentTypes.ActivePage.TabVisible := True;
        if GetFreePercentForCable > 0 then
          StaticText5.Show
        else
          StaticText5.Hide;
        if GetFreePercent(Kalc_DM.CableCanalMemTable.RecordCount)< 0 then
        begin
          StaticText4.Show;
        end
        else
        begin
          StaticText4.Hide;
        end;
        razn := CmpFloorsWithKolRM ;
        if razn <> 0 then
        begin
          StaticText1.Show;
          StaticText2.Caption := cKalc_Msg2 + IntToStr(razn);
          StaticText2.Show;
        end
        else
        begin
          StaticText1.Hide;
          StaticText2.Hide;
        end;

      finally
        if Main_PageControl.PageCount > 0 then
          Main_PageControl.ActivePageIndex := 0;
        Screen.Cursor := crDefault;
      end;
    except
    end;
    Self.Show;
  end;
end;

procedure TF_Kalc.CostRMGridTableViewEditValueChanged(
  Sender: TcxCustomGridTableView; AItem: TcxCustomGridTableItem);
begin
   ValCostFromGrid(vCRM, Kalc_DM.CostRM_MemTable);
end;

procedure TF_Kalc.Name_ColumnPropertiesEditValueChanged(Sender: TObject);
var
  MemTable: TDataSet;
  Str: string;
  DBColumn: TcxGridDBColumn;
  GridTableView: TcxGridDBTableView;

begin
    Str := VarToStr(TcxCustomEdit(Sender).EditValue);
    GridTableView := TcxGridDBTableView(TCxGrid(TcxGridSite(TCxTextEdit(Sender).parent).Parent).ActiveView);
    MemTable := GridTableView.DataController.DataSet;
    dbColumn := TcxGridDBColumn(GridTableView.DataController.Controller.EditingItem);
   // GridTableView.DataController.FocusedRowIndex;
  //  Str := VarToStr(GridTableView.DataController.Controller.EditingController.Edit.EditValue);
    MemTable.FieldByName(DBColumn.DataBinding.FieldName).AsString := STr;
    GridTableView.DataController.Post;
end;

procedure TF_Kalc.DopEq_GridExit(Sender: TObject);
begin
  F_Kalc.DopEq_TableView.DataController.Post;
end;

function TF_Kalc.GetPriceForKalcFromDragCompon(ACompon: TSCSComponent): double;
var
  price: double;
  res1, res2: PObjectCurrencyRel;
  OldCurrency, NewCurrency: TCurrency;
  Index : integer;
begin
  try
    Result := RoundX(ACompon.Price, 2);
    index := Curr_ComboBox.ItemIndex;

    ZeroMemory(@OldCurrency, SizeOf(TCurrency));
    ZeroMemory(@NewCurrency, SizeOf(TCurrency));

    res1 := F_NormBase.DM.GetComponCurrencyByMainFld(ACompon.ID, ctMain);
    if Assigned(res1) then
    begin
      OldCurrency := res1^.Data;
    end;                         
    Res2 := F_NormBase.DM.GetComponCurrencyByCurrencyID(ACompon.id, Integer(Curr_ComboBox.Properties.Items.Objects[Index]) );
    if Assigned(Res2) then
    begin
      NewCurrency := Res2^.Data;
    end;
    if Assigned(res1) and Assigned(Res2) then
      Result := GetPriceAfterChangeCurrency(result, OldCurrency, NewCurrency, 2);
  finally
    FreeMem(res1);
    FreeMem(res2);
  end
end;

procedure TF_Kalc.btClearPriceWorksClick(Sender: TObject);
begin

 with Kalc_DM.PriceWorks_MemTable do
  begin
  //  if RecordCount = 0 then
      Kalc_DM.InitPriceWorks_MemTable;
    //else
//      while not Eof do
//      begin
//        First;
//        FieldByName('Price').AsFloat := 0;
//        Post;
//        Next;
//      end;
  end;
end;

procedure TF_Kalc.AllComponent_Grid_TypePozGetDisplayText(
  Sender: TcxCustomGridTableItem; ARecord: TcxCustomGridRecord;
  var AText: String);
begin
  if AText = idTypePozMaterial then
    AText := stTypePozMaterial
  else
    if AText = idTypePozWorks then
      AText := stTypePozWorks;
end;

procedure TF_Kalc.PutToReportWork(AIdWorks: integer; AKolWorks: integer; AKoef: double = 1);
var
  dNum: integer;
  NameWorks: string;
  CostWorks, PriceWorks: double;
  KOEF: double;
begin  
  {$IF NOT Defined(NORMSCS_PE) and NOT Defined(SCS_SPA)}
    PriceWorks := 0;
    with Kalc_DM.PriceWorks_MemTable do
    begin
      if Active then
      begin
        KOEF := FieldByName('Price').AsFloat;
        dNum := AIdWorks - RecNo;
        if dNum <> 0 then
           MoveBy(dNum);
        NameWorks := FieldByName('Name').AsString;
        PriceWorks := FieldByName('Price').AsFloat;
      end;
    end;
    if PriceWorks > 0 then
    begin
      CostWorks := PriceWorks * AKolWorks * Akoef;
      AddRecordInReport(NameWorks,'', AKolWorks, PriceWorks, CostWorks, idTypePozWorks);
    end;
  {$IFEND}  
end;

function TF_Kalc.GetKoefForWorks: double;
var
  KOEF: double;
begin
  try
    Koef := 0;
    with Kalc_DM.PriceWorks_MemTable do
    begin
      if Active then
      begin
        Last;
        KOEF := roundx(FieldByName('Price').AsFloat,3);
      end;
    end;
    if KOEF = 0 then
      Koef := 1;
    Result := KOEF;
  except
    on E: Exception do AddExceptionToLog('TF_Kalc.GetKoefForWorks: '+E.Message);
  end;
end;


procedure TF_Kalc.FixLabeles;
begin
  Label5.Caption := strCalcCapt1 + GetNameUOM(F_NormBase.FUOM, true, true);
  Label6.Caption := strCalcCapt2 + GetNameUOM(F_NormBase.FUOM, true, true);
  Label11.Caption := strCalcCapt3 + GetNameUOM(F_NormBase.FUOM, true, true);
  Label7.Caption := strCalcCapt4 + GetNameUOM2(F_NormBase.FUOM);
  Label9.Caption := strCalcCapt5 + GetNameUOM2(F_NormBase.FUOM);
  Label10.Caption := strCalcCapt6 + GetNameUOM2(F_NormBase.FUOM);
  Label40.Caption := strCalcCapt7 + GetNameUOM(F_NormBase.FUOM, true, true);
  Label41.Caption := strCalcCapt8 + GetNameUOM(F_NormBase.FUOM, true, true);
  Label13.Caption := strCalcCapt9 + GetNameUOM2(F_NormBase.FUOM);
  Label31.Caption := strCalcCapt10 + GetNameUOM(F_NormBase.FUOM, true, true);
  Label21.Caption := strCalcCapt11 + GetNameUOM(F_NormBase.FUOM, true, true);
  Label17.Caption := strCalcCapt12 + GetNameUOM(F_NormBase.FUOM, true, true);
  Label72.Caption := strCalcCapt13 + GetNameUOM(F_NormBase.FUOM, true, true);
 // Label52.Caption := GetNameUOM(F_NormBase.FUOM, true, false);
  Label12.Caption := strCalcCapt18 + GetNameUOM(F_NormBase.FUOM, true, true);
  Label35.Caption := strCalcCapt15 + GetNameUOM(F_NormBase.FUOM, true, true);
  Label45.Caption := strCalcCapt14 + GetNameUOM(F_NormBase.FUOM, true, false);
  Label33.Caption := strCalcCapt16 + GetNameUOM(F_NormBase.FUOM, true, true);
  Label24.Caption := strCalcCapt17 + GetNameUOM(F_NormBase.FUOM, true, true);
  Label59.Caption := strCalcCapt19 + GetNameUOM(F_NormBase.FUOM, true, true);
  Label38.Caption := GetNameUOM(F_NormBase.FUOM, true, false);
  Label70.Caption := strCalcCapt23 + GetNameUOM(F_NormBase.FUOM, true, false)+ strCalcCapt24; 
  ///таблички
  rashod.Caption := strCalcCapt20 + GetNameUOM(F_NormBase.FUOM, true, false)+strCalcCapt21;
  CableCanalGrid_Price.Caption := strCalcCapt22  + GetNameUOM(F_NormBase.FUOM, true, false);
  Cable_Grid_Price.Caption := strCalcCapt22  + GetNameUOM(F_NormBase.FUOM, true, false);

end;

end.
