unit U_BaseOptions;

interface

uses
  Windows, U_LNG, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, RzButton, ExtCtrls, RzPanel, StdCtrls, Mask, RzEdit, RzTabs,
  RzRadChk, RzCmboBx,

  U_BaseCommon, U_BaseConstants, U_Common, siComp, siLngLnk, ComCtrls, RzSpnEdt,
  Buttons, RzLabel{Tolik -- 02/03/2017 }, iniFiles, RzRadGrp,
  USCS_Main;

type
  TF_BaseOptions = class(TForm)
    gbOkCancel: TRzGroupBox;
    RzBitBtn1: TRzBitBtn;
    RzBitBtn2: TRzBitBtn;
    lng_Forms: TsiLangLinked;
    pnMain: TRzPanel;
    pcMain: TRzPageControl;
    tsPaths: TRzTabSheet;
    RzGroupBox1: TRzGroupBox;
    edNBPath: TRzEdit;
    btChoiceNBPath: TRzButton;
    RzGroupBox2: TRzGroupBox;
    edPMPath: TRzEdit;
    btChoicePMPath: TRzButton;
    tsNormBase: TRzTabSheet;
    RzGroupBox3: TRzGroupBox;
    Label1: TLabel;
    Label2: TLabel;
    cbMainCurrency: TRzComboBox;
    cbSecondCurrency: TRzComboBox;
    btChoiceMainCurrency: TRzButton;
    btChoiceSecondCurrency: TRzButton;
    cbDisableEditUserBase: TRzCheckBox;
    tvSettingTypes: TTreeView;
    lbTitleNormBase: TLabel;
    tsCommon: TRzTabSheet;
    lbTitleCommon: TLabel;
    tsReportDesigner: TRzTabSheet;
    lbTitleProjMan: TLabel;
    Label4: TLabel;
    cbRepDesignLang: TRzComboBox;
    RzGroupBox4: TRzGroupBox;
    cbControlComplectByProducer: TRzCheckBox;
    cbControlJoinByNetType: TRzCheckBox;
    cbControlJoinByProperties: TRzCheckBox;
    cbControlComplectByProperties: TRzCheckBox;
    cbRemindToBackUpBase: TRzCheckBox;
    pnRemindForBackUpBase: TRzPanel;
    Label5: TLabel;
    Label6: TLabel;
    seRemindToBackUpBaseTime: TRzSpinEdit;
    Label7: TLabel;
    cbUOM: TRzComboBox;
    tsColor: TRzTabSheet;
    lbTitleColor: TLabel;
    RzGroupBox5: TRzGroupBox;
    tcColorObjects: TRzTabControl;
    cbColorObjectStandart: TRzCheckBox;
    pnColorObject: TRzPanel;
    lbColorObjectBack: TLabel;
    lbColorObjectFont: TLabel;
    ceColorObjectBack: TRzColorEdit;
    ceColorObjectFont: TRzColorEdit;
    tsEnvironmentOptions: TRzTabSheet;
    lbEnvironmentOptionsTitle: TLabel;
    Label3: TLabel;
    ceZeroPriceComponent: TRzColorEdit;
    ScrollBox1: TScrollBox;
    RzGroupBox6: TRzGroupBox;
    Label8: TLabel;
    btChoiceDirProjects: TSpeedButton;
    Label9: TLabel;
    btChioceDirCompons: TSpeedButton;
    Label10: TLabel;
    btChoiceDirFilters: TSpeedButton;
    Label11: TLabel;
    btChoiceedDirBackgLayers: TSpeedButton;
    Label12: TLabel;
    btChoiceDirArchPlans: TSpeedButton;
    Label13: TLabel;
    btChioceDirDXF: TSpeedButton;
    Label14: TLabel;
    btChoiceDirOtherSettings: TSpeedButton;
    edDirProjects: TRzEdit;
    edDirCompons: TRzEdit;
    edDirFilters: TRzEdit;
    edDirBackgLayers: TRzEdit;
    edDirArchPlans: TRzEdit;
    edDirDXF: TRzEdit;
    edDirOtherSettings: TRzEdit;
    Label15: TLabel;
    btChoiceedDirPictures: TSpeedButton;
    edDirPictures: TRzEdit;
    Label16: TLabel;
    btChoiceDirPageFrames: TSpeedButton;
    edDirPageFrames: TRzEdit;
    gbLiteVersion: TRzGroupBox;
    cbLiteVersion: TRzCheckBox;
    cbUseLiteFunctional: TRzCheckBox;
    cbUseVerticalTraces: TRzCheckBox;
    Label17: TLabel;
    edDirTempFolder: TRzEdit;
    btChoiceDirTempFolder: TSpeedButton;
    cbAllowConvertInterfaces: TRzCheckBox;
    RzGroupBox7: TRzGroupBox;
    ckbCurrConvNB2PMTarget: TRzRadioButton;
    ckbCurrConvNB2PMSource: TRzRadioButton;
    cbSendInfo: TRzCheckBox;
    tsImport: TRzTabSheet;
    lbImport: TLabel;
    RzLabel3: TRzLabel;
    cbImportSplinesByControlPoints: TRzCheckBox;
    RzLabel4: TRzLabel;
    RzLabel1: TRzLabel;
    RzLabel2: TRzLabel;
    RzLabel5: TRzLabel;
    RzLabel6: TRzLabel;
    RzLabel7: TRzLabel;
    RzLabel8: TRzLabel;
    edMaxSplinePointsCount: TEdit;
    edMaxSplinePartsCount: TEdit;
    edMaxPolyLinePoinsCount: TEdit;
    cbConnectTraceOnClickPoint: TRzCheckBox;
    cbMoveRouteToPointObject: TRzCheckBox;
    tsExport: TRzTabSheet;
    lbExport: TLabel;
    Label19: TLabel;
    edLineTypeScale: TEdit;
    cbDropObjbyOneClick: TRzCheckBox;
    Label18: TLabel;
    cbStoreLastPaths: TRzCheckBox;
    cbScaleRasterImages: TRzCheckBox;
    ts3D: TRzTabSheet;
    lb3D: TLabel;
    cbCorrect3DModelMaterial: TRzCheckBox;
    tsElectrical: TRzTabSheet;
    lbElectrical: TLabel;
    cbTraceElectric: TRzCheckBox;
    cbShowAutoCreatedGuides: TRzCheckBox;
    cbAllowDropCableToRoute: TRzCheckBox;
    cbAutoRouteCable: TRzCheckBox;
    cbAutoAddNetworkEquipment: TRzCheckBox;
    tsReserv: TRzTabSheet;
    lbReserv: TLabel;
    Label21: TLabel;
    mdFtpConnect: TMemo;
    procedure btChoiceMainCurrencyClick(Sender: TObject);
    procedure btChoiceSecondCurrencyClick(Sender: TObject);
    procedure cbMainCurrencyChange(Sender: TObject);
    procedure cbSecondCurrencyChange(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure tvSettingTypesChange(Sender: TObject; Node: TTreeNode);
    procedure cbRemindToBackUpBaseClick(Sender: TObject);
    procedure gbOkCancelResize(Sender: TObject);
    procedure tcColorObjectsChange(Sender: TObject);
    procedure cbColorObjectStandartClick(Sender: TObject);
    procedure ceColorObjectBackChange(Sender: TObject);
    procedure ceColorObjectFontChange(Sender: TObject);
    procedure btChoiceDirClick(Sender: TObject);
    procedure cbLiteVersionClick(Sender: TObject);
    procedure cbUseLiteFunctionalClick(Sender: TObject);
    procedure edMaxSplinePointsCountKeyPress(Sender: TObject; var Key: Char);

    procedure edMaxSplinePartsCountKeyPress(Sender: TObject; var Key: Char);
    procedure edMaxPolyLinePoinsCountKeyPress(Sender: TObject; var Key: Char);
    procedure FormShow(Sender: TObject);
    procedure cbConnectTraceOnClickPointClick(Sender: TObject);
    procedure Label18Click(Sender: TObject);
  private
    FOldMCurrecy: TCurrency;
    FOldSCurrecy: TCurrency;

    //FOldDisableEditing: Boolean;

    FMCurrecy: TCurrency;
    FSCurrecy: TCurrency;


    FActiveColorsInfo: PColorsInfo;
    FEditColorObjects: TColorObjectsIni;

    FEnvDirEdits: TList;
    FEnvDirButtons: TList;

    //FNewRatio : Double;
    //FOldMRatio: Double;
    //FNewMRatio: Double;

    function AddElementTypeToTree(AText: String; AIndex: Integer; ATabSheet: TRzTabSheet; ATitleLabel: TLabel): TTreeNode;
    procedure AddColorObjectToPageControl(ACaption: String; AColorsInfo: PColorsInfo);
    procedure AddEnvDirControlsToList(AEdit: TRzEdit; AButton: TSpeedButton; ADirType: Integer);
    function GetNodeBySettingTypeIndex(ASettingTypeIndex: Integer): TTreeNode;
    function GetTabSheetBySettingTypeIndex(ASettingTypeIndex: Integer): TRzTabSheet;
    procedure OpenCurrencyForm(AComboBoxChange, AComboBoxNotChange: TRzComboBox; var AChangeCurr,
                    AOtherCurr: TCurrency{; var AChangeFlag: Boolean});
    procedure ChangeComboBox(AComboChange, AComboSecond: TRzComboBox; {AID_NotChangeCurrency: Integer;}
                    var AChangeCurr, AOtherCurr: TCurrency{; var AChangeFlag: Boolean});
    function  CheckSameCurrencies(AID_CurrChanged, AID_CurrNotChanged: Integer;
                    ANameChanged: String): Boolean;

    procedure LoadEnvDirs;
    Procedure LoadEnvDirsByDefault; // Tolik 01/08/2019-- сбросить значение путей на стандартные (по умолчанию)
    procedure SaveEnvDirs;
    procedure SetControlsByActiveColorsInfo;
    procedure SetControlsByLite(AOnClickSender: TObject=nil);
    procedure UpdateCurrency;
    procedure UpdateDisablingEdit;
  public
    GForm: TForm;

    function ChangeOptions(ASettingTypeIndex: Integer): Boolean;
    procedure HideTabSheet(ATabSheet: TRzTabSheet);

    constructor Create(AOwner: TComponent; AForm: TForm);
    destructor  Destroy; override;
  end;
// Tolik --
var
  PSplinePointCount: Integer = 500;
  PPolyLinePointCount: Integer = 500;
  PSplinePartsCount: Integer = 6;
  PImportSplineByControlPoints: Boolean = False;
  PLineTypeScale: Double = 400;
//
//var
//  F_BaseOptions: TF_BaseOptions;

implementation
Uses U_BaseSettings, Unit_DM_scs, DB, U_CaseForm, U_MAIN, U_SCSComponent;

{$R *.dfm}

{ TF_BaseOptions }

procedure TF_BaseOptions.ChangeComboBox(AComboChange, AComboSecond: TRzComboBox;
  {AIDSecondCombo: Integer;} var AChangeCurr, AOtherCurr: TCurrency{;
  var AChangeFlag: Boolean});
var
  //ID_ChangeCurr: Integer;
  NewID: Integer;
  IDSecondCombo: Integer;
  NameChangeCurr: String;
begin
  NewID := GetIDFromComboBoxRz(AComboChange);
  IDSecondCombo := GetIDFromComboBoxRz(AComboSecond);
  if NewID = IDSecondCombo then
  begin
    SelectItemByIDinComboRz(AComboSecond, AChangeCurr.ID);
    AOtherCurr := GetCurrencyByID(AChangeCurr.ID, TF_Main(GForm).DM.Query_Select);
  end;
  AChangeCurr := GetCurrencyByID(NewID, TF_Main(GForm).DM.Query_Select);

  //04.03.2011 //if Not GCanChangeCombo then
//  //  Exit;
//
//  ID_ChangeCurr := GetIDFromComboBoxRz(AComboChange);
//  NameChangeCurr := AComboChange.Text;
//  if Not CheckSameCurrencies(ID_ChangeCurr, AIDSecondCombo, NameChangeCurr) then
//  begin
//    NewID := GetIDFromComboBoxRz(AComboChange);
//    //DataSetLocateByID(F_NormBase.DM.DataSet_CURRENCY, NewId);
//    //AChangeCurr := GetCurrencyFromDataSet(F_NormBase.DM.DataSet_CURRENCY);
//
//    AChangeCurr := GetCurrencyByID(NewID, TF_Main(GForm).DM.Query_Select);
//  end
//  else
//    SelectItemByIDinComboRz(AComboChange, AChangeCurr.ID);
//    {begin
//        CCount := AComboChange.Items.Count;
//        for i := 0 to CCount - 1 do
//          if (AComboChange.Properties.Items.Objects[i] as TIDGuidObject).ID = AChangeCurr.ID then
//            begin
//                AComboChange.ItemIndex := i;
//                break;
//            end;
//    end; }
end;

function TF_BaseOptions.CheckSameCurrencies(AID_CurrChanged,
  AID_CurrNotChanged: Integer; ANameChanged: String): Boolean;
begin
  Result := false;
  if AID_CurrChanged = AID_CurrNotChanged then
  begin
    Result := true;
    MessageModal(cBaseOptions_Msg1_1+' "' +
               ANameChanged  + '" '+cBaseOptions_Msg1_2, cBaseOptions_Msg1_3,
               MB_OK or MB_ICONINFORMATION);
  end;
end;

constructor TF_BaseOptions.Create(AOwner: TComponent; AForm: TForm);
begin
    GForm := AForm;
    inherited Create(AOwner);
end;

destructor TF_BaseOptions.Destroy;
begin
  ClearComboBoxRz(cbRepDesignLang);
  ClearComboBoxRz(cbUOM);

  FreeAndNil(FEnvDirEdits);
  FreeAndNil(FEnvDirButtons);
  
  inherited;
end;

function TF_BaseOptions.AddElementTypeToTree(AText: String; AIndex: Integer; ATabSheet: TRzTabSheet; ATitleLabel: TLabel): TTreeNode;
var
  Node: TTreeNode;
begin
  Node := tvSettingTypes.Items.Add(nil, AText);
  Node.Data := ATabSheet;
  ATitleLabel.Caption := AText;
end;

procedure TF_BaseOptions.AddColorObjectToPageControl(ACaption: String; AColorsInfo: PColorsInfo);
var
  TabCollectionItem: TRzTabCollectionItem;
begin
  TabCollectionItem := tcColorObjects.Tabs.Add;
  TabCollectionItem.Caption := ACaption;
  TabCollectionItem.Tag := Integer(AColorsInfo);
end;

procedure TF_BaseOptions.AddEnvDirControlsToList(AEdit: TRzEdit; AButton: TSpeedButton; ADirType: Integer);
begin
  AEdit.Tag := ADirType;
  AEdit.ShowHint := true;
  AButton.Tag := ADirType;
  AButton.Hint := cBaseOptions_Msg5;
  AButton.ShowHint := true;
  FEnvDirEdits.Add(AEdit);
  FEnvDirButtons.Add(AButton);
end;

procedure TF_BaseOptions.HideTabSheet(ATabSheet: TRzTabSheet);
var
  Node: TTreeNode;
  i: Integer;
begin
  //*** Удалить Ветвь, связянную с ATabSheet
  i := 0;
  while i <= tvSettingTypes.Items.Count - 1 do
  begin
    Node := tvSettingTypes.Items[i];
    if Node.Data = ATabSheet then
      Node.Delete
    else
      Inc(i);
  end;
  ATabSheet.TabVisible := false;

  //*** Если отобр-ся, тек-й
  if pcMain.ActivePage = ATabSheet then
    tvSettingTypesChange(tvSettingTypes, tvSettingTypes.Selected);
end;

function TF_BaseOptions.GetNodeBySettingTypeIndex(ASettingTypeIndex: Integer): TTreeNode;
var
  TabSheet: TRzTabSheet;
  i: Integer;
  Node: TTreeNode;
begin
  Result := nil;
  TabSheet := GetTabSheetBySettingTypeIndex(ASettingTypeIndex);
  if TabSheet <> nil then
    for i := 0 to tvSettingTypes.Items.Count - 1 do
    begin
      Node := tvSettingTypes.Items[i];
      if Node.Data = TabSheet then
      begin
        Result := Node;
        Break; //// BREAK ////
      end;
    end;
end;

function TF_BaseOptions.GetTabSheetBySettingTypeIndex(ASettingTypeIndex: Integer): TRzTabSheet;
begin
  Result := nil;
  case ASettingTypeIndex of
    stiCommon:
      Result := tsCommon;
    stiNormBase:
      Result := tsNormBase;
    stiReportDesigner:
      Result := tsReportDesigner;
    // Tolik 03/10/2019 --
    stiImport:
      Result := tsImport;
    stiExport:
      Result := tsExport;
    sti3D:
      Result := ts3D;
    stiElectrical:
      Result := tsElectrical; // Tolik 03/02/2021 --
    //
  end;
end;

procedure TF_BaseOptions.OpenCurrencyForm(AComboBoxChange,
  AComboBoxNotChange: TRzComboBox; var AChangeCurr,
  AOtherCurr: TCurrency{; var AChangeFlag: Boolean});
var ID_Curr : Integer;
    IDNew: Integer;
    Accept: Boolean;

    OnChangeCombo1: TNotifyEvent;
    OnChangeCombo2: TNotifyEvent;
begin
    Accept := false;
    OnChangeCombo1 := AComboBoxChange.OnChange;
    OnChangeCombo2 := AComboBoxNotChange.OnChange;
    try
      with F_NormBase do
      begin
        //SearchRecord(DM.DataSet_Currency, 'ID', AChangeCurr.ID);
        //DataSetLocateByID(DM.DataSet_Currency, AChangeCurr.ID);
        //ID_Curr := DM.DataSet_Currency.FN('ID').AsInteger;
        ID_Curr := GetIDFromComboBoxRz(AComboBoxChange);
        F_CaseForm.GIDNotDel := AOtherCurr.ID;
        F_CaseForm.GIDToLocate := AChangeCurr.ID;
        //F_CaseForm.GViewKind := vkCurrency;

        //GCanChangeCombo := false;
        //if F_NormBase.F_CaseForm.ShowModal = mrOK then
        if F_NormBase.F_CaseForm.Execute(vkCurrency, fmEdit) then
        begin
          IDNew := F_NormBase.DM.DataSet_CURRENCY.FN('ID').AsInteger;
          if IDNew = AOtherCurr.ID then
            AOtherCurr := AChangeCurr;
          AChangeCurr := GetCurrencyFromDataSet(F_NormBase.DM.DataSet_CURRENCY); //F_NormBase.DM.GetCurrency;
          FillComboBoxRz(AComboBoxChange, F_NormBase, false, tnCurrency, fnID, fnName, '', AChangeCurr.ID);
          Accept := true;

          //04.03.2011 if Not CheckSameCurrencies(IDNew, AOtherCurr.ID,
          //        F_NormBase.DM.DataSet_CURRENCY.FN('Name').AsString) then
          //begin
          //  AChangeCurr := GetCurrencyFromDataSet(F_NormBase.DM.DataSet_CURRENCY); //F_NormBase.DM.GetCurrency;
          //  FillComboBoxRz(AComboBoxChange, F_NormBase, false, tnCurrency, fnID, fnName, '', AChangeCurr.ID);
          //  //AChangeFlag := true;
          //  Accept := true;
          //end;
        end;
        FillComboBoxRz(AComboBoxNotChange, F_NormBase, false, tnCurrency, fnID, fnName, '', AOtherCurr.ID);

        if Accept = false then
          FillComboBoxRz(AComboBoxChange, F_NormBase, false, tnCurrency, fnID, fnName, '', ID_Curr);
        //GCanChangeCombo := true;
      end;
    finally
      AComboBoxChange.OnChange := OnChangeCombo1;
      AComboBoxNotChange.OnChange := OnChangeCombo2;
    end;
end;

procedure TF_BaseOptions.btChoiceMainCurrencyClick(Sender: TObject);
begin
  OpenCurrencyForm(cbMainCurrency, cbSecondCurrency, FMCurrecy, FSCurrecy{, FChangeMCurrency});
end;

procedure TF_BaseOptions.btChoiceSecondCurrencyClick(Sender: TObject);
begin
  OpenCurrencyForm(cbSecondCurrency, cbMainCurrency, FSCurrecy, FMCurrecy{, FChangeSCurrency});
end;

function TF_BaseOptions.ChangeOptions(ASettingTypeIndex: Integer): Boolean;
var
  OnChangeCombo1: TNotifyEvent;
  OnChangeCombo2: TNotifyEvent;
  OldRepDesignLangFile: String;
  NodeSetting: TTreeNode;
  // Tolik -- 02/03/2017 --
  Ini: TIniFile;
  UserLineTypeScale: double; // Tolik 10/07/2019 --
  //
begin
  Result := false;
  try
    with TF_Main(GForm) do
    begin
      //*** Валюты
      FOldMCurrecy := TF_Main(GForm).DM.GetCurrencyByType(ctMain);
      FOldSCurrecy := TF_Main(GForm).DM.GetCurrencyByType(ctSecond);

      FMCurrecy := FOldMCurrecy;
      FSCurrecy := FOldSCurrecy;

      OnChangeCombo1 := cbMainCurrency.OnChange;
      OnChangeCombo2 := cbSecondCurrency.OnChange;
      try
        FillComboBoxRz(cbMainCurrency, F_NormBase, false, tnCurrency, fnID, fnName, '', FMCurrecy.ID);
        FillComboBoxRz(cbSecondCurrency, F_NormBase, false, tnCurrency, fnID, fnName, '', FSCurrecy.ID);
      finally
        cbMainCurrency.OnChange := OnChangeCombo1;
        cbSecondCurrency.OnChange := OnChangeCombo2;
      end;

      // Ед изм
      SelectItemByIDinComboRz(cbUOM, GNBSettings.UOM);

      ceZeroPriceComponent.SelectedColor := GSCSIni.NB.ColorZeroPriceComponent;

      //*** Запретить редактирование пользовательской базы
      cbDisableEditUserBase.Checked := GSCSIni.NB.DisableEdit;

      //*** контроль компоновки-подключения
      cbControlJoinByNetType.Checked := GSCSIni.NB.ControlJoinByNetType;
      cbControlComplectByProducer.Checked := GSCSIni.NB.ComplectControlByProducer;
      cbControlJoinByProperties.Checked := GSCSIni.NB.ControlJoinByProperties;
      cbControlComplectByProperties.Checked := GSCSIni.NB.ControlComplectByProperties;

      //*** Закинуть Язык ддизайнера отчетов
      OldRepDesignLangFile := GSCSIni.PM.RepDesignLanguageFile;
      if GSCSIni.PM.RepDesignLanguageFile <> '' then
        SelectItemByGUIDinComboRz(cbRepDesignLang, GSCSIni.PM.RepDesignLanguageFile)
      else
        SelectItemByGUIDinComboRz(cbRepDesignLang, fnRepDesignLangRus);

      //*** Резервирование Баз
      cbRemindToBackUpBase.Checked := GSCSIni.NB.RemindToBackUpBase;
      seRemindToBackUpBaseTime.Value := GSCSIni.NB.RemindToBackUpBaseTime;
      cbRemindToBackUpBaseClick(cbRemindToBackUpBase);

      // Лайт версия
      cbLiteVersion.Checked := GLiteVersion;
      cbUseLiteFunctional.Checked := GUseLiteFunctional;
      cbAllowConvertInterfaces.Checked := GAllowConvertInterfToUniversal;
      SetControlsByLite;

      // Использовать вертикальные трассы
      cbUseVerticalTraces.Checked := GUseVerticalTraces;
      cbDropObjbyOneClick.Checked := GDropObjByOneClick; // располагать объект в 1 клик
      cbShowAutoCreatedGuides.Checked := GShowAutoCreatedGuides; // отображать автоматически созданные направляющие
      cbStoreLastPaths.Checked :=  GStoreLastPaths; // сохранять последние пути
      cbScaleRasterImages.Checked := GAutoScaleRasterImages; // масштабировать растровые изображения, превышающие размер листа (Tolik 09/08/2019 -- )
      cbSendInfo.Checked := GSendInfo;
      cbAllowDropCableToRoute.Checked := GAllowDropCableToRoute; //Tolik 28/05/2021 -- разрешить дроп кабеля на трассы
      cbAutoRouteCable.Checked := GAutoRouteCableAfterTraceCreation; // Tolik 09/08/2021 - вызывать автотрассировку кабеля после автоматического создания трасс
      cbAutoAddNetworkEquipment.Checked := GAutoAddNetworkEquipment; // Tolik 26/03/2024
      //23.08.2012
      if GSCSIni.NB.CurrencyConvertionNB2PM = cckByTarget then
        ckbCurrConvNB2PMTarget.Checked := true
      else
      if GSCSIni.NB.CurrencyConvertionNB2PM = cckBySource then
        ckbCurrConvNB2PMSource.Checked := true;

      //*** Перейти на нужный элемент справочника
      NodeSetting := GetNodeBySettingTypeIndex(ASettingTypeIndex);
      if NodeSetting <> nil then
        tvSettingTypes.Selected := NodeSetting;

      FEditColorObjects := GSCSIni.Colors;
      tcColorObjectsChange(tcColorObjects);

      LoadEnvDirs;

      // Tolik 02/03/2017 -- прочитать настройки для импорта DWG/DXF
      // Tolik -- 02/03/2017 --
      Ini := nil;
      try
       // ProgIni := TInifile.Create(fnSCSIniFile);
       Ini := TInifile.Create(GetIniPath);
      except
        on E: Exception do
        begin
        //  AddExceptionToLog('F_BaseOption.Create', 'IniFile open error! ', E.Message);
          Ini := nil;
        end;
      end;
      // Tolik 10/07/2019 --
      //if (Ini <> nil) and Ini.SectionExists('ImportDxf') then
      if (Ini <> nil)  then
      begin
        //
        if Ini.SectionExists('ImportDxf') then
        begin
          edMaxSplinePointsCount.Text := Ini.ReadString('ImportDxf', 'SplinePointCount', '500');
          edMaxSplinePartsCount.Text := Ini.ReadString('ImportDxf',  'SplinePartsCount', '6');
          edMaxPolyLinePoinsCount.Text := Ini.ReadString('ImportDxf',  'PolyLinePointCount', '500');

          cbImportSplinesByControlPoints.checked := Ini.ReadBool('ImportDxf', 'ImportSplineByControlPoints', false);
          //Ini.Free;
        end
        else
        begin
          edMaxSplinePointsCount.Text := '450';
          edMaxSplinePartsCount.Text := '6';
          edMaxPolyLinePoinsCount.Text := '500';
          cbImportSplinesByControlPoints.checked := false;
        end;

        if Ini.SectionExists('ExportDxf') then
        begin
          edLineTypeScale.Text := Ini.ReadString('ExportDxf', 'LineTypeScale', '400');
        end;
        // Tolik 03/03/2021 --
        cbTraceElectric.Checked := GCallElectricAutoTraceMaster;
        if Ini.SectionExists('Electrical') then
        begin
          //cbTraceElectric.Checked := Ini.ReadBool('Electrical', 'TraceElectrical', false);
          cbTraceElectric.Checked := Ini.ReadBool('Electrical', 'TraceElectrical', true);
        end;
        //
        //Tolik 02/01/2025 --  резервное копирование
        mdFtpConnect.Text := GFtpConnectStr;
        if Ini.SectionExists('ReservFtp') then
        begin
          //cbTraceElectric.Checked := Ini.ReadBool('Electrical', 'TraceElectrical', false);
          mdFtpConnect.Text := Ini.ReadString('ReservFtp', 'ConnectString', '');
        end
        else
          mdFtpConnect.Text := '';
        //
      end;
      // на дурака
      if StrToInt(edMaxSplinePointsCount.Text) < 1 then
        edMaxSplinePointsCount.Text := '50';
      if StrToInt(edMaxSplinePartsCount.Text) < 1 then
        edMaxSplinePartsCount.Text := '6';
      if strtoint(edMaxPolyLinePoinsCount.Text) < 1 then
        edMaxPolyLinePoinsCount.Text := '50';
      //
      //Tolik -- 04/05/2017 --
      if ini <> nil then
      begin
        cbConnectTraceOnClickPoint.Checked := Ini.ReadBool('General', 'ConnectTraceOnClickPoint', false);
        cbMoveRouteToPointObject.Checked := Ini.ReadBool('General', 'MoveRouteToPointObject', false);
        //cbMoveRouteToPointObject.Enabled := cbConnectTraceOnClickPoint.Checked;
        ini.free;
      end
      else
      begin
        cbConnectTraceOnClickPoint.Checked := False;
        cbMoveRouteToPointObject.Checked := False;
        //cbMoveRouteToPointObject.Enabled := False;
      end;
      //
      if Self.ShowModal = mrOk then
      begin
        Result := true;
        Screen.Cursor := crHourGlass;
        BeginProgress;
        try
          //*** NormBase
          if GSCSIni.NB.DisableEdit <> cbDisableEditUserBase.Checked then
            TF_Main(GForm).EnableDisableEdit(Not cbDisableEditUserBase.Checked and CheckWriteNBByUser);
          if GSCSIni.NB.ColorZeroPriceComponent <> ceZeroPriceComponent.SelectedColor then
            TF_Main(GForm).DefineNodesFontColorByZeroPriceComponents(ceZeroPriceComponent.SelectedColor);

          GSCSIni.NB.ColorZeroPriceComponent := ceZeroPriceComponent.SelectedColor;
          GSCSIni.NB.DisableEdit := cbDisableEditUserBase.Checked;

          GSCSIni.NB.ControlJoinByNetType := cbControlJoinByNetType.Checked;
          GSCSIni.NB.ComplectControlByProducer := cbControlComplectByProducer.Checked;
          GSCSIni.NB.ControlJoinByProperties := cbControlJoinByProperties.Checked;
          GSCSIni.NB.ControlComplectByProperties := cbControlComplectByProperties.Checked;
          GSCSIni.NB.RemindToBackUpBase := cbRemindToBackUpBase.Checked;
          GSCSIni.NB.RemindToBackUpBaseTime := Trunc(seRemindToBackUpBaseTime.Value);

          //23.08.2012
          if ckbCurrConvNB2PMTarget.Checked then
            GSCSIni.NB.CurrencyConvertionNB2PM := cckByTarget
          else if ckbCurrConvNB2PMSource.Checked then
            GSCSIni.NB.CurrencyConvertionNB2PM := cckBySource;

          // Лайт версия
          TF_Main(GForm).SetControlsByUseLiteFunctional(cbLiteVersion.Checked, cbUseLiteFunctional.Checked, true);
          WriteSetting(fnSCSIniFile, dtBoolean, scGeneral, idtLiteVersion, cbLiteVersion.Checked);
          WriteSetting(fnSCSIniFile, dtBoolean, scGeneral, idtUseLiteFunctional, cbUseLiteFunctional.Checked);

          GAllowConvertInterfToUniversal := cbAllowConvertInterfaces.Checked;
          WriteSetting(fnSCSIniFile, dtBoolean, scGeneral, idtAllowConvertInterfToUniversal, GAllowConvertInterfToUniversal);

          {$IF NOT Defined(TELECOM)}
            //31.03.2011 // Лайт версия
            //31.03.2011 TF_Main(GForm).SetControlsByUseLiteFunctional(cbLiteVersion.Checked, cbUseLiteFunctional.Checked, true);
            //31.03.2011 WriteSetting(fnSCSIniFile, dtBoolean, scGeneral, idtLiteVersion, cbLiteVersion.Checked);
            //31.03.2011 WriteSetting(fnSCSIniFile, dtBoolean, scGeneral, idtUseLiteFunctional, cbUseLiteFunctional.Checked);

            WriteSetting(fnSCSIniFile, dtBoolean, scGeneral, idtUseVerticalTraces, cbUseVerticalTraces.Checked);
            WriteSetting(fnSCSIniFile, dtBoolean, scGeneral, idtDropObjByOneClick, cbDropObjbyOneClick.Checked);
            WriteSetting(fnSCSIniFile, dtBoolean, scGeneral, idtShowAutoCreatedGuides, cbShowAutoCreatedGuides.Checked);//Tolik 26/03/2021 --
            WriteSetting(fnSCSIniFile, dtBoolean, scGeneral, idtStoreLastPaths, cbStoreLastPaths.Checked);
            WriteSetting(fnSCSIniFile, dtBoolean, scGeneral, idtAutoScaleRasterImages, cbScaleRasterImages.Checked); // Tolik 09/08/2019 -*-
            WriteSetting(fnSCSIniFile, dtBoolean, scGeneral, idtAllowDropCableToRoute, cbAllowDropCableToRoute.Checked); // Tolik 09/08/2019 -*-
            WriteSetting(fnSCSIniFile, dtBoolean, scGeneral, idtAutoRouteCableAfterTraceCreation, cbAutoRouteCable.Checked); // Tolik 09/08/2019 -*-
            WriteSetting(fnSCSIniFile, dtBoolean, scGeneral, idtAutoAddNetworkEquipment, cbAutoAddNetworkEquipment.Checked); // Tolik 26/03/2024 -*-

            GUseVerticalTraces := cbUseVerticalTraces.Checked;
          {$IFEND}
          GAutoRouteCableAfterTraceCreation := cbAutoRouteCable.Checked; // Tolik 09/08/2021 --
          GAutoAddNetworkEquipment := cbAutoAddNetworkEquipment.Checked; // Tolik 26/03/2024 --

          GDropObjByOneClick := cbDropObjbyOneClick.Checked; // Tolik -- 01/08/2019 --
          GShowAutoCreatedGuides := cbShowAutoCreatedGuides.Checked; // Tolik 26/03/2021 --

          GStoreLastPaths := cbStoreLastPaths.Checked; // Tolik -- 01/08/2019
          GAutoScaleRasterImages := cbScaleRasterImages.Checked;
          GAllowDropCableToRoute := cbAllowDropCableToRoute.Checked; // Tolik 28/05/2021 --
          // Tolik - -03/05/2017 --
          WriteSetting(fnSCSIniFile, dtBoolean, scGeneral, 'ConnectTraceOnClickPoint', cbConnectTraceOnClickPoint.Checked);
          GConnectTraceOnClickPoint := cbConnectTraceOnClickPoint.Checked;

          WriteSetting(fnSCSIniFile, dtBoolean, scGeneral, 'MoveRouteToPointObject', cbMoveRouteToPointObject.Checked);
          //GMoveRouteToPointObject := (cbMoveRouteToPointObject.Enabled and cbMoveRouteToPointObject.Checked);
          GMoveRouteToPointObject := cbMoveRouteToPointObject.Checked;
          //
          WriteSetting(fnSCSIniFile, dtBoolean, scGeneral, idtSendInfo, cbSendInfo.Checked);
          GSendInfo := cbSendInfo.Checked;

          UpdateCurrency;
          UpdateDisablingEdit;
          //WriteOptionsToINI;

          if GetIDFromComboBoxRz(cbUOM) <> GNBSettings.UOM then
          begin
            GNBSettings.UOM := GetIDFromComboBoxRz(cbUOM);
            UpdateTableFieldAllRec(TF_Main(GForm).DM.Query_Operat, tnSettings, fnUOM, GNBSettings.UOM);
            TF_Main(GForm).FUOM := GNBSettings.UOM;
            TF_Main(GForm).SetUOMToControls;
          end;

          //*** ProjMan
          GSCSIni.PM.RepDesignLanguageFile := GetGUIDFromComboBoxRz(cbRepDesignLang);
          if GSCSIni.PM.RepDesignLanguageFile <> OldRepDesignLangFile then
            if Assigned(TF_Main(GForm).FProjectMan.F_ResourceReport) then
              TF_Main(GForm).FProjectMan.F_ResourceReport.DefineRepDesignLanguage;

          GSCSIni.Colors := FEditColorObjects;
           // Tolik 02/03/2017 --
          Ini := TIniFile.Create(GetIniPath);
          if strtoint(edMaxSplinePointsCount.Text) > 1 then  // на дурака
            ini.WriteInteger('ImportDxf','SplinePointCount' , strtoint(edMaxSplinePointsCount.Text))
          else
            ini.WriteInteger('ImportDxf','SplinePointCount' , 50);
          if strtoint(edMaxSplinePartsCount.Text) > 0 then
            ini.WriteInteger('ImportDxf','SplinePartsCount' , strtoint(edMaxSplinePartsCount.Text))
          else
            ini.WriteInteger('ImportDxf','SplinePartsCount' , 6);
          if strtoint(edMaxPolyLinePoinsCount.Text) > 1 then
            ini.WriteInteger('ImportDxf','PolyLinePointCount' , strtoint(edMaxPolyLinePoinsCount.Text))
          else
            ini.WriteInteger('ImportDxf','PolyLinePointCount' , 50);
          ini.WriteBool('ImportDxf','ImportSplineByControlPoints', cbImportSplinesByControlPoints.checked);
          // Tolik 10/07/2019 -- Масштаб типа линии для импорта в DXF/DWG
          try
            UserLineTypeScale := StrToFloat_My(edLineTypeScale.Text);
          except
            on E: Exception do UserLineTypeScale := 400;
          end;
          ini.WriteFloat('ExportDxf','LineTypeScale', UserLineTypeScale);
          ini.WriteBool('3D', 'Correct3DModelMaterial', cbCorrect3DModelMaterial.Checked);
          // Tolik -- 02/03/2021 --
          ini.WriteBool('Electrical', 'TraceElectrical', cbTraceElectric.Checked);
          GCallElectricAutoTraceMaster := cbTraceElectric.Checked;
          //
          //Tolik 02/01/2025 -- резервное копирование
          ini.WriteString('ReservFtp', 'ConnectString', mdFtpConnect.Text);
          GFtpConnectStr := mdFtpConnect.Text;
          FSCS_Main.mnuReserv.Enabled := GFtpConnectStr <> '';
          //
          Ini.Free;
          //
          FNormBase.WriteOptionsToINI;
          FProjectMan.WriteOptionsToINI;
          WriteColors(GSCSIni);

          SaveEnvDirs;
        finally
          EndProgress;
          Screen.Cursor := crDefault;
        end;
      end;
    end;
  except
    on E: Exception do AddExceptionToLog('TF_BaseOptions.ChangeOptions: '+E.Message);
  end;
end;

procedure TF_BaseOptions.Label18Click(Sender: TObject);
begin
  LoadEnvDirsByDefault;
end;
// Tolik 01/08/2019 --
procedure TF_BaseOptions.LoadEnvDirsByDefault;
var
  i: Integer;
  DirEdit: TRzEdit;
begin
  for i := 0 to FEnvDirEdits.Count - 1 do
  begin
    DirEdit := TRzEdit(FEnvDirEdits[i]);
    DirEdit.Text := ExtractDirByCategoryTypeDefault(DirEdit.Tag);
    DirEdit.Hint := DirEdit.Text;
  end;
end;
//
procedure TF_BaseOptions.LoadEnvDirs;
var
  i: Integer;
  DirEdit: TRzEdit;
begin
  for i := 0 to FEnvDirEdits.Count - 1 do
  begin
    DirEdit := TRzEdit(FEnvDirEdits[i]);
    DirEdit.Text := ExtractDirByCategoryType(DirEdit.Tag);
    DirEdit.Hint := DirEdit.Text;
  end;
end;

procedure TF_BaseOptions.SaveEnvDirs;
var
  i: Integer;
  DirEdit: TRzEdit;
  DefPath: String;
begin
  for i := 0 to FEnvDirEdits.Count - 1 do
  begin
    DirEdit := TRzEdit(FEnvDirEdits[i]);

    DefPath := ExtractDefDirByCategoryType(DirEdit.Tag);
    if AnsiUpperCaseFileName(DefPath) = AnsiUpperCaseFileName(DirEdit.Text) then
      WriteEnvironmentDir(DirEdit.Tag, '')
    else
      WriteEnvironmentDir(DirEdit.Tag, DirEdit.Text);
  end;
end;

procedure TF_BaseOptions.SetControlsByActiveColorsInfo;
begin
  lbColorObjectBack.Enabled := FActiveColorsInfo.Active;
  ceColorObjectBack.Enabled := FActiveColorsInfo.Active;
  lbColorObjectFont.Enabled := FActiveColorsInfo.Active;
  ceColorObjectFont.Enabled := FActiveColorsInfo.Active;

  pnColorObject.Enabled := FActiveColorsInfo.Active;
end;

procedure TF_BaseOptions.SetControlsByLite(AOnClickSender: TObject=nil);
begin
  {IGOR} //D0000006315
(*
  cbUseLiteFunctional.Enabled := Not cbLiteVersion.Checked;
  cbAllowConvertInterfaces.Enabled := Not cbLiteVersion.Checked and cbUseLiteFunctional.Checked;

  if cbLiteVersion.Checked then
  begin
    cbUseLiteFunctional.Checked := true;
    cbAllowConvertInterfaces.Checked := true;
  end
  else
  if (AOnClickSender = cbLiteVersion) or (AOnClickSender = cbUseLiteFunctional) then
  begin
    if TRzCheckBox(AOnClickSender).Checked then
      cbAllowConvertInterfaces.Checked := true;
  end;
*)
end;

procedure TF_BaseOptions.UpdateCurrency;
var //ID_Component: Integer;
    //OldTick: Cardinal;
    //CurrTick: Cardinal;

    ChangedMCurrency: Boolean;
    ChangedSCurrency: Boolean;
            {
  procedure RefreshPriceFields(AFormBase: TForm; ATableName: String; APriceFields: TStringList);
  var IDList: TList;
      i, j: Integer;
      CurrID: Integer;
      PriceValue: Double;
  begin
      try
        try
          with TF_Main(AFormBase).DM do
          begin
            IDList := TList.Create;
            SetSQLToQuery(scsQSelect, ' select id from '+ATableName+' ');
            IntFieldToList(IDList, scsQSelect, fnID);

            for i := 0 to APriceFields.Count - 1 do
            begin
              scsQSelect.Close;
              scsQSelect.SQL.Clear;
              scsQSelect.SQL.Add(' select '+APriceFields.Strings[i]+' from '+ATableName+
                                   ' where id = :id ');

              scsQOperat.Close;
              scsQOperat.SQL.Clear;
              scsQOperat.SQL.Add(' update '+ATableName+' set '+
                                       APriceFields.Strings[i]+' = :PriceValue '+
                                   ' where id = :id ');
              for j := 0 to IDList.Count - 1 do
              begin
                CurrID := Integer(IDList.Items[j]^);
                scsQSelect.Close;
                scsQSelect.SetParamAsInteger('id', CurrID);
                scsQSelect.ExecQuery;

                PriceValue := 0;
                PriceValue := scsQSelect.GetFNAsFloat(APriceFields.Strings[i]);
                if PriceValue > 0 then
                begin
                  //PriceValue := PriceValue * (FirstCurr.Ratio / Curr1.Ratio);
                  //PriceValue := RoundIBD(PriceValue, 7);
                  PriceValue := GetPriceAfterChangeCurrency(PriceValue, FOldMCurrecy, FMCurrecy);

                  scsQOperat.Close;
                  scsQOperat.SetParamAsFloat('PriceValue', PriceValue);
                  scsQOperat.SetParamAsInteger('id', CurrID);
                  scsQOperat.ExecQuery;
                end;
              end;
            end;
          end;
        except
          on E: Exception do AddExceptionToLog('TF_ActiveCurrency.RefreshPriceFields: '+E.Message);
        end;
      finally
        FreeList(IDList);
      end;
  end;

  procedure RefreshPrices(AGDBMode: TDBKind);
  var ComponForm: TF_Main;
      //ID_Compon: Integer;
      ComponPriceFields: TStringList;
      NormsPriceFields: TStringList;
      NormResoureRelPriceFields: TStringList;
      ResourcesPriceFields: TStringList;
  begin
    try
      try
        ComponForm := nil;
        case AGDBMode of
            bkNormBase:
                ComponForm := F_NormBase;
            bkProjectManager:
                ComponForm := F_ProjMan;
        end;

        with ComponForm do
          begin
              ComponPriceFields := TStringList.Create;
              ComponPriceFields.Add(fnPriceSupply);
              ComponPriceFields.Add(fnPrice);
              ComponPriceFields.Add(fnPriceCalc);
              RefreshPriceFields(TForm(ComponForm), 'component', ComponPriceFields);

              NormsPriceFields := TStringList.Create;
              NormsPriceFields.Add('Cost');
              NormsPriceFields.Add('Total_Cost');
              RefreshPriceFields(TForm(ComponForm), 'norms', NormsPriceFields);

              NormResoureRelPriceFields := TStringList.Create;
              NormResoureRelPriceFields.Add('Cost');
              RefreshPriceFields(TForm(ComponForm), 'norm_resource_rel', NormResoureRelPriceFields);

              ResourcesPriceFields := TStringList.Create;
              ResourcesPriceFields.Add('Price');
              ResourcesPriceFields.Add(fnAdditionalPrice);
              RefreshPriceFields(TForm(ComponForm), 'resources', ResourcesPriceFields);

              if ComponForm.GDBMode = bkNormBase then
              begin
                RefreshPriceFields(TForm(ComponForm), 'nb_norm_resource_rel', NormResoureRelPriceFields);
                RefreshPriceFields(TForm(ComponForm), 'nb_resources', ResourcesPriceFields);
              end;
          end;
      except
        on E: Exception do AddExceptionToLog('RefreshPrices: '+E.Message);
      end;
    finally
      FreeAndNil(ComponPriceFields);
      FreeAndNil(NormsPriceFields);
      FreeAndNil(NormResoureRelPriceFields);
      FreeAndNil(ResourcesPriceFields);
    end;
  end;
        }

  procedure RefreshFromat(AGDBMode: TDBKind);
  var ComponForm: TF_Main;
      //ID_Compon: Integer;
  begin
      ComponForm := nil;
      case AGDBMode of
          bkNormBase:
              ComponForm := F_NormBase;
          bkProjectManager:
              ComponForm := F_ProjMan;
        end;

        with ComponForm do
          begin
              //LoadCurrencyFormat;
              SetCurrencyBriefToControls;
              Tree_Catalog.OnChange(Tree_Catalog, Tree_Catalog.Selected);
              //ShowPrice;
          end;
  end;

begin
  ChangedMCurrency := false;
  ChangedSCurrency := false;

  if Not CmpRecords(Integer(@FOldMCurrecy), Integer(@FMCurrecy), SizeOf(FOldMCurrecy), SizeOf(FOldMCurrecy)) then
    ChangedMCurrency := true;
  if Not CmpRecords(Integer(@FOldSCurrecy), Integer(@FSCurrecy), SizeOf(FOldSCurrecy), SizeOf(FOldSCurrecy)) then
    ChangedSCurrency := true;

  with TF_Main(GForm).DM do
  begin
    //DataSet_CURRENCY.DisableControls;
    try
      //OldTick := GetTickCount;
      if ChangedMCurrency or ChangedSCurrency then
      begin
        if ChangedMCurrency then
        begin
          ChengeCurrencyRatiosWithPrices(FOldMCurrecy, FMCurrecy, FSCurrecy, Query_Select, Query_Operat);
        end
        else
        if ChangedSCurrency then
        begin
          //*** Очистить поле с второй валютой
          SetSQLToFIBQuery(TF_Main(GForm).DM.Query_Operat, GetSQLByParams(qtUpdate, tnCurrency,
            fnMain+' = '''+IntTostr(ctSecond)+'''', nil, fnMain), false);
          TF_Main(GForm).DM.Query_Operat.ParamByName(fnMain).AsInteger := ctSimple;
          TF_Main(GForm).DM.Query_Operat.ExecQuery;

          //*** Установить поле с второй валютой
          SetSQLToFIBQuery(TF_Main(GForm).DM.Query_Operat, GetSQLByParams(qtUpdate, tnCurrency, fnID+' = :'+fnID, nil, fnMain), false);
          TF_Main(GForm).DM.Query_Operat.ParamByName(fnID).AsInteger := FSCurrecy.ID;
          TF_Main(GForm).DM.Query_Operat.ParamByName(fnMain).AsInteger := ctSecond;
          TF_Main(GForm).DM.Query_Operat.ExecQuery;
        end;
        TF_Main(GForm).GSCSBase.NBSpravochnik.LoadCurrencies;
      end;

      TF_Main(GForm).GCurrencyM := FMCurrecy;
      TF_Main(GForm).GCurrencyS := FSCurrecy;

      RefreshFromat(bkNormBase);

      //*** Валюта екущего проекта
      with F_ProjMan do
      begin
        if Assigned(GSCSBase.CurrProject) then
          if GSCSBase.CurrProject.Active then
            GSCSBase.CurrProject.UpdatePrices;
      end;

      //RefreshFromat(bkProjectManager);
      //CurrTick := GetTickCount - OldTick;
      //CurrTick := GetTickCount - OldTick;
    finally
      //DataSet_CURRENCY.EnableControls;
      EndProgress;
      Screen.Cursor := crDefault;
    end;
  end;
end;

procedure TF_BaseOptions.UpdateDisablingEdit;
begin
    with TF_Main(GForm) do
      EnableDisableEdit(Not cbDisableEditUserBase.Checked and CheckWriteNBByUser);
end;

procedure TF_BaseOptions.cbMainCurrencyChange(Sender: TObject);
begin
  ChangeComboBox(cbMainCurrency, cbSecondCurrency, {GetIDFromComboBoxRz(cbSecondCurrency),} FMCurrecy, FSCurrecy);
end;

procedure TF_BaseOptions.cbSecondCurrencyChange(Sender: TObject);
begin
  ChangeComboBox(cbSecondCurrency, cbMainCurrency, {GetIDFromComboBoxRz(cbMainCurrency),} FSCurrecy, FMCurrecy);
end;

procedure TF_BaseOptions.FormCreate(Sender: TObject);
  // Tolik --
  var ProgIni:  TIniFile;
  //
  procedure AddUOMToCombo(AUOM: Integer);
  begin
    AddIDGUIDToComboRz(AUOM, '', GetNameUOM(AUOM, false), cbUOM);
  end;

begin
  //Tolik 01/11/2019 --
  seRemindToBackUpBaseTime.Max := 0;
  seRemindToBackUpBaseTime.Min := 0;
  cbLiteVersion.Checked := False;
  {IGOR} //D0000006315
  cbLiteVersion.Enabled := False;
  cbAllowConvertInterfaces.Enabled := False;

  //*** Виды настоек
  tvSettingTypes.Items.Clear;
  AddElementTypeToTree(cBaseOptions_Msg2_1, stiCommon, tsCommon, lbTitleCommon);
  AddElementTypeToTree(cBaseOptions_Msg2_2, stiNormBase, tsNormBase, lbTitleNormBase);
  AddElementTypeToTree(cBaseOptions_Msg2_4, stiColor, tsColor, lbTitleColor);
  AddElementTypeToTree(cBaseOptions_Msg2_3, stiReportDesigner, tsReportDesigner, lbTitleProjMan);
  AddElementTypeToTree(cBaseOptions_Msg2_5, stiEnvironmentOptions, tsEnvironmentOptions, lbEnvironmentOptionsTitle);
  // Tolik -- 02/03/2017 --
  AddElementTypeToTree(cBaseOptions_Msg2_6, stiImport, tsImport, lbImport);
  //
  AddElementTypeToTree(cBaseOptions_Msg2_7, stiExport, tsExport, lbExport); // Tolik 11/07/2019
  AddElementTypeToTree(cBaseOptions_Msg2_8, sti3D, ts3D, lb3D); // Tolik 11/07/2019
  AddElementTypeToTree(cBaseOptions_Msg2_9, stiElectrical, tsElectrical, lbElectrical); // Tolik 02/03/2021 -- раздел настроек для электрики
  //
  AddElementTypeToTree(cBaseOptions_Msg2_10, stiReserv, tsReserv, lbReserv); // Tolik 28/12/2024 -- раздел настроек для резервного копирования
  tvSettingTypes.Selected := tvSettingTypes.Items[1];

  //*** Языки дезайнера отчетов
  AddIDGUIDToComboRz(lniRus, fnRepDesignLangRus, cBaseOptions_Msg3_1, cbRepDesignLang);
  AddIDGUIDToComboRz(lniUkr, fnRepDesignLangUkr, cBaseOptions_Msg3_2, cbRepDesignLang);

  // Единица измерения
  AddUOMToCombo(umSantimetr);
  AddUOMToCombo(umMetr);
  AddUOMToCombo(umInch);
  AddUOMToCombo(umFoot);

  {$IF (Defined (TRIAL_SCS) or Defined (FINAL_SCS)) and Not Defined(BASEADM_SCS) and Not Defined(SCS_PANDUIT)}
    cbUOM.ReadOnly := true;
  {$IFEND}

  // Стиль таб контрола
  tcColorObjects.RowOverlap := 1;
  tcColorObjects.TabStyle := tsRoundCorners;

  // Объекты для цветов
  ZeroMemory(@FEditColorObjects, SizeOf(TColorObjectsIni));
  tcColorObjects.Tabs.Clear;
  AddColorObjectToPageControl(cBaseOptions_Msg4_1, @FEditColorObjects.Resource);
  AddColorObjectToPageControl(cBaseOptions_Msg4_2, @FEditColorObjects.ResourceCompon);
  {$IF Not Defined(NORMSCS_PE) and Not Defined(SCS_SPA)}
    AddColorObjectToPageControl(cBaseOptions_Msg4_3, @FEditColorObjects.Norm);
  {$IFEND}
  AddColorObjectToPageControl(cNameTotalkolvo, @FEditColorObjects.TotalKolvo);
  tcColorObjects.TabIndex := 0; //tcColorObjectsChange(tcColorObjects);
  SetStyleToRZColorEdit(ceColorObjectBack);
  SetStyleToRZColorEdit(ceColorObjectFont);

  ceZeroPriceComponent.DefaultColorCaption := cColorEdit_DefaultColorCaption;
  ceZeroPriceComponent.CustomColorCaption := cColorEdit_CustomColorCaption;

  {$IF Defined(TELECOM)}
    //gbLiteVersion.Visible := false;
    cbUseVerticalTraces.Visible := false;
  {$IFEND}

  FEnvDirEdits := TList.Create;
  FEnvDirButtons := TList.Create;
  AddEnvDirControlsToList(edDirProjects, btChoiceDirProjects, dctProjs);
  AddEnvDirControlsToList(edDirCompons, btChioceDirCompons, dctCompons);
  AddEnvDirControlsToList(edDirOtherSettings, btChoiceDirOtherSettings, dctOtherSettings);
  AddEnvDirControlsToList(edDirFilters, btChoiceDirFilters, dctFilters);
  AddEnvDirControlsToList(edDirBackgLayers, btChoiceedDirBackgLayers, dctBackgLayers);
  AddEnvDirControlsToList(edDirArchPlans, btChoiceDirArchPlans, dctArchPlans);
  AddEnvDirControlsToList(edDirDXF, btChioceDirDXF, dctDXF);
  AddEnvDirControlsToList(edDirPictures, btChoiceedDirPictures, dctPictures);
  AddEnvDirControlsToList(edDirPageFrames, btChoiceDirPageFrames, dctStamps);
  AddEnvDirControlsToList(edDirTempFolder, btChoiceDirTempFolder, dctTemp);
  // Tolik -- 02/03/2017 --
  ProgIni := nil;
  try
   // ProgIni := TInifile.Create(fnSCSIniFile);
   ProgIni := TInifile.Create(GetIniPath);
  except
    on E: Exception do
    begin
    //  AddExceptionToLog('F_BaseOption.Create', 'IniFile open error! ', E.Message);
      ProgIni := nil;
    end;
  end;
  // Tolik 02/03/2021 --
  if (ProgIni <> nil) and   ProgIni.SectionExists('Electrical') then
  begin
    //cbTraceElectric.Checked := ProgIni.ReadBool('Electrical', 'TraceElectrical', false);
    cbTraceElectric.Checked := ProgIni.ReadBool('Electrical', 'TraceElectrical', true);
  end;
  //
  //Tolik 02/01/2025 --
  if (ProgIni <> nil) and ProgIni.SectionExists('ReservFtp') then
  begin
    mdFtpConnect.Text := ProgIni.ReadString('ReservFtp', 'ConnectString', '');
  end;
  //

  if (ProgIni <> nil) and   ProgIni.SectionExists('ImportDxf') then
  begin
    edMaxSplinePointsCount.Text := ProgIni.ReadString('ImportDxf', 'SplinePointCount', '500');
    edMaxSplinePartsCount.Text := ProgIni.ReadString('ImportDxf',  'PolyLinePointCount', '500');
    edMaxPolyLinePoinsCount.Text := ProgIni.ReadString('ImportDxf',  'SplinePartsCount', '6');
    cbImportSplinesByControlPoints.checked := ProgIni.ReadBool('ImportDxf', 'ImportSplineByControlPoints', false);
    //ProgIni.free;
  end
  else
  begin
    edMaxSplinePointsCount.Text := '450';
    edMaxSplinePartsCount.Text := '6';
    edMaxPolyLinePoinsCount.Text := '500';
    cbImportSplinesByControlPoints.checked := false;
  end;
  // Tolik -- 03/05/2017 --
  if (ProgIni <> nil) then
  begin
    cbConnectTraceOnClickPoint.Checked := ProgIni.ReadBool('General', 'ConnectTraceOnClickPoint', false);
    cbMoveRouteToPointObject.Checked := ProgIni.ReadBool('General', 'MoveRouteToPointObject', false);

    {if cbConnectTraceOnClickPoint.Checked then
      cbMoveRouteToPointObject.Enabled := True
    else
      cbMoveRouteToPointObject.Enabled := False;}
  end
  else
  begin
    cbConnectTraceOnClickPoint.Checked := False;
    cbMoveRouteToPointObject.Checked := False;
    //cbMoveRouteToPointObject.Enabled := False;
  end;
  //
  // на дурака
  if StrToInt(edMaxSplinePointsCount.Text) < 1 then
    edMaxSplinePointsCount.Text := '50';
  if StrToInt(edMaxSplinePartsCount.Text) < 1 then
    edMaxSplinePartsCount.Text := '6';
  if strtoint(edMaxPolyLinePoinsCount.Text) < 1 then
    edMaxPolyLinePoinsCount.Text := '50';
  //
  // Tolik 10/07/2019 -- Масштаб типа линий для експорта трасс в DXF/DWG
  if ((ProgIni <> nil) and ProgIni.SectionExists('ExportDxf')) then
  begin
    edLineTypeScale.Text := ProgIni.ReadString('ExportDxf', 'LineTypeScale', '400');
    //ProgIni.free;
  end
  else
    edLineTypeScale.Text := '400';
  //
  // Tolik 03/10/2019 -- 3D
  if ((ProgIni <> nil) and ProgIni.SectionExists('3D')) then
  begin
    cbCorrect3DModelMaterial.Checked := ProgIni.ReadBool('3D', 'Correct3DModelMaterial', true);
    ProgIni.free;
  end
  else
    cbCorrect3DModelMaterial.Checked := true;
  //
end;

procedure TF_BaseOptions.tvSettingTypesChange(Sender: TObject;
  Node: TTreeNode);
var
  TabSheet: TRzTabSheet;
begin
  if Node <> nil then
  begin
    TabSheet := Node.Data;
    if TabSheet <> nil then
      pcMain.ActivePage := TabSheet;
  end;
end;

procedure TF_BaseOptions.cbRemindToBackUpBaseClick(Sender: TObject);
begin
  seRemindToBackUpBaseTime.Enabled := cbRemindToBackUpBase.Checked;
end;

procedure TF_BaseOptions.gbOkCancelResize(Sender: TObject);
begin
  SetMiddleControlChilds(TControl(Sender), TControl(Self));
end;

procedure TF_BaseOptions.tcColorObjectsChange(Sender: TObject);
begin
  FActiveColorsInfo := PColorsInfo(tcColorObjects.Tabs[tcColorObjects.TabIndex].Tag);

  cbColorObjectStandart.OnClick := nil;
  ceColorObjectBack.OnChange := nil;
  ceColorObjectFont.OnChange := nil;
  try
    cbColorObjectStandart.Checked := Not FActiveColorsInfo.Active;
    ceColorObjectBack.SelectedColor := FActiveColorsInfo.Back;
    ceColorObjectFont.SelectedColor := FActiveColorsInfo.Font;
  finally
    cbColorObjectStandart.OnClick := cbColorObjectStandartClick;
    ceColorObjectBack.OnChange := ceColorObjectBackChange;
    ceColorObjectFont.OnChange := ceColorObjectFontChange;
  end;
  SetControlsByActiveColorsInfo;
end;

procedure TF_BaseOptions.cbColorObjectStandartClick(Sender: TObject);
begin
  FActiveColorsInfo.Active := Not cbColorObjectStandart.Checked;
  SetControlsByActiveColorsInfo;
end;

procedure TF_BaseOptions.ceColorObjectBackChange(Sender: TObject);
begin
  FActiveColorsInfo.Back := ceColorObjectBack.SelectedColor;
end;

procedure TF_BaseOptions.ceColorObjectFontChange(Sender: TObject);
begin
  FActiveColorsInfo.Font := ceColorObjectFont.SelectedColor;
end;

procedure TF_BaseOptions.btChoiceDirClick(Sender: TObject);
var
  DirEdit: TRzEdit;
  NewDirName: string;
begin
  DirEdit := TRzEdit(GetControlFromListByTag(FEnvDirEdits, TControl(Sender).Tag));
  if DirEdit <> nil then
  begin
    //NewDirName := TF_Main(GForm).BrowseNewDirName(cBaseOptions_Msg5,
    //                      DirEdit.Text,
    //                      '');
    NewDirName := BrowseDialog(cBaseOptions_Msg5, DirEdit.Text);

    if NewDirName <> '' then
    begin
      DirEdit.Text := NewDirName;
      DirEdit.Hint := NewDirName;
    end;
  end;
end;

procedure TF_BaseOptions.cbLiteVersionClick(Sender: TObject);
begin
  SetControlsByLite(Sender);
end;

procedure TF_BaseOptions.cbUseLiteFunctionalClick(Sender: TObject);
begin
  SetControlsByLite(Sender);
end;

procedure TF_BaseOptions.edMaxSplinePointsCountKeyPress(Sender: TObject; var Key: Char);
begin
   if not (Key in ['0'..'9']) then Key := #0;
end;


procedure TF_BaseOptions.edMaxSplinePartsCountKeyPress(Sender: TObject; var Key: Char);
begin
  if not (Key in ['0'..'9']) then Key := #0;
end;

procedure TF_BaseOptions.edMaxPolyLinePoinsCountKeyPress(Sender: TObject; var Key: Char);
begin
  if not (Key in ['0'..'9']) then Key := #0;
end;

procedure TF_BaseOptions.FormShow(Sender: TObject);
begin
 { PSplinePointCount: Integer = ReadSetting(fnSCSIniFile, dtBoolean, scImportDXF, SplinePointCount, 500);
  PPolyLinePointCount: Integer = ReadSetting(fnSCSIniFile, dtBoolean, scImportDXF, PolyLinePointCount, 500);
  PSplinePartsCount: Integer = ReadSetting(fnSCSIniFile, dtBoolean, scImportDXF, SplinePartsCount, 6);
  PImportSplineByControlPoints: := ReadSetting(fnSCSIniFile, dtBoolean, scImportDXF, ImportSplineByControlPoints, false);}
end;

procedure TF_BaseOptions.cbConnectTraceOnClickPointClick(Sender: TObject);
begin
  if not cbConnectTraceOnClickPoint.Checked then
  begin
    //cbMoveRouteToPointObject.Enabled := False;
    //GMoveRouteToPointObject := False;
  end
  else
  begin
    //cbMoveRouteToPointObject.Enabled := True;
    //GMoveRouteToPointObject := cbMoveRouteToPointObject.Checked;
  end;
end;

end.
