unit U_AddInterface; interface uses Windows, U_LNG, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, cxLookAndFeelPainters, StdCtrls, cxButtons, cxMaskEdit, cxSpinEdit, cxControls, cxContainer, cxEdit, cxTextEdit, cxDropDownEdit, cxButtonEdit, U_BaseCommon, cxRadioGroup, cxCheckBox, cxCurrencyEdit, Mask, RzEdit, cxGroupBox, ExtCtrls, RzPanel, DB, cxStyles, cxCustomData, cxGraphics, cxFilter, cxData, cxDataStorage, cxDBData, cxGridLevel, cxClasses, cxGridCustomView, cxGridCustomTableView, cxGridTableView, cxGridDBTableView, cxGrid, RzButton, kbmMemTable, cxColorComboBox, ActnList, ActnMan, Menus, XPMenu, cxDBLookupComboBox, cxImage, cxMemo, ComCtrls, ToolWin, RzRadChk, RzTabs, RzRadGrp, U_BaseConstants, U_SCSLists, cxCalc, siComp, siLngLnk, Buttons, cxLookAndFeels, cxNavigator, PlatformDefaultStyleActnCtrls; type TF_AddInterface = class(TForm) Panel_Main: TRzPanel; Panel_OkCancel: TRzPanel; Label1: TLabel; Label_KolvoAdd: TLabel; Label_Mul2: TLabel; Label_ValueI: TLabel; Label4: TLabel; SpinEdit_Kolvo: TcxSpinEdit; ComboBox_Name: TcxComboBox; Button_NameInterfce: TcxButton; CurrencyEdit_ValueI: TcxCurrencyEdit; ColorEdit: TRzColorEdit; Button_Help: TcxButton; SpinEdit_Npp: TcxSpinEdit; Label_Npp: TLabel; Label_Notice: TLabel; Edit_Notice_: TcxTextEdit; gbPortInterfaes: TRzGroupBox; DSrcPortInterfRels: TDataSource; mtPortInterfRels: TkbmMemTable; ActionManager1: TActionManager; Act_AddPortInterface: TAction; Act_EditPortInterface: TAction; Act_DelPortInterface: TAction; pmPortInterfaces: TPopupMenu; pmnuAdd: TMenuItem; pmnuEdit: TMenuItem; pmnuDel: TMenuItem; tbInternalConnection: TToolBar; tbAdd: TToolButton; tbEdit: TToolButton; tbDelete: TToolButton; cbApplyForAllNoRelPorts: TRzCheckBox; ToolButton4: TToolButton; pcIsLine: TRzPageControl; tsIsLine: TRzTabSheet; tsIsPoint: TRzTabSheet; GroupBox_NppPort: TRzGroupBox; Label_NppPort: TLabel; SpinEdit_NppPort: TcxSpinEdit; pcIsPair: TRzPageControl; tsIsPairTrue: TRzTabSheet; tsIsPairFalse: TRzTabSheet; Label_lbPairKolvo: TLabel; Label_PairKolvo: TLabel; Label_NppSide: TLabel; SpinEdit_NppSide: TcxSpinEdit; gbTypeI: TRzGroupBox; rbTypeFunctional: TcxRadioButton; rbTypeConstructive: TcxRadioButton; gbKind: TRzGroupBox; rbKindNoSplit: TcxRadioButton; rbKindSplit: TcxRadioButton; gbGender: TRzGroupBox; rbGenderMale: TcxRadioButton; rbGenderFemale: TcxRadioButton; gbSignType: TRzGroupBox; rbSignTypeProject: TcxRadioButton; rbSignTypeActive: TcxRadioButton; pcInternalRelation: TRzPageControl; tsPortInterfRel: TRzTabSheet; tsInternalInterfConn: TRzTabSheet; grid_PortInterfRels: TcxGrid; GT_PortInterfRels: TcxGridDBTableView; GT_PortInterfRelsName: TcxGridDBColumn; GT_PortInterfRelsUnitInterfKolvo: TcxGridDBColumn; GL_PortInterfRels: TcxGridLevel; GT_InterfInternalConn: TcxGridDBTableView; GL_InterfInternalConn: TcxGridLevel; grid_InterfInternalConn: TcxGrid; mtInterfInternalConnection: TkbmMemTable; dsrcInterfInternalConnection: TDataSource; GT_InterfInternalConnName: TcxGridDBColumn; GT_InterfInternalConnGender: TcxGridDBColumn; GT_InterfInternalConnKolvo: TcxGridDBColumn; Act_AddInterfInternalConn: TAction; Act_EditInterfInternalConn: TAction; Act_DelInterfInternalConn: TAction; lng_Forms: TsiLangLinked; Edit_Notice: TcxMemo; pnSectionSideValue: TRzPanel; btSectionSide: TSpeedButton; cbSectionSide: TcxComboBox; Label2: TLabel; CheckBox_Multiple: TRzCheckBox; CheckBox_IsPair: TRzCheckBox; CheckBox_IsPort: TRzCheckBox; CheckBox_IsUserPort: TRzCheckBox; Button_OK: TRzBitBtn; Button_Cancel: TRzBitBtn; cbConnectToAnyGender: TRzCheckBox; XP_Menu1: TXPMenu; procedure ComboBox_Type_I_KeyPress(Sender: TObject; var Key: Char); procedure FormHide(Sender: TObject); procedure FormShow(Sender: TObject); procedure Button_OKClick(Sender: TObject); procedure SpinEdit_KolvoPropertiesChange(Sender: TObject); procedure Button_NameInterfceClick(Sender: TObject); procedure FormCreate(Sender: TObject); procedure ComboBox_NameKeyPress(Sender: TObject; var Key: Char); procedure ComboBox_Type_IPropertiesChange(Sender: TObject); procedure Label_Mul2Click(Sender: TObject); procedure Button_HelpClick(Sender: TObject); procedure CheckBox_IsPortPropertiesChange(Sender: TObject); procedure SpinEdit_NppPortPropertiesChange(Sender: TObject); procedure CheckBox_IsUserPortPropertiesChange(Sender: TObject); procedure RadioGroup_TypeIPropertiesChange(Sender: TObject); procedure SpinEdit_NppThreadPropertiesValidate(Sender: TObject; var DisplayValue: Variant; var ErrorText: TCaption; var Error: Boolean); procedure SpinEdit_NppPortPropertiesValidate(Sender: TObject; var DisplayValue: Variant; var ErrorText: TCaption; var Error: Boolean); procedure Button_CancelClick(Sender: TObject); procedure CheckBox_IsPairPropertiesChange(Sender: TObject); procedure FormDestroy(Sender: TObject); procedure FormClose(Sender: TObject; var Action: TCloseAction); procedure Act_AddPortInterfaceExecute(Sender: TObject); procedure Act_EditPortInterfaceExecute(Sender: TObject); procedure Act_DelPortInterfaceExecute(Sender: TObject); procedure CheckBox_MultiplePropertiesChange(Sender: TObject); procedure SpinEdit_KolvoPropertiesValidate(Sender: TObject; var DisplayValue: Variant; var ErrorText: TCaption; var Error: Boolean); procedure rbTypeFunctionalClick(Sender: TObject); procedure GT_InterfInternalConnGenderGetDisplayText( Sender: TcxCustomGridTableItem; ARecord: TcxCustomGridRecord; var AText: String); procedure pcInternalRelationChange(Sender: TObject); procedure Act_AddInterfInternalConnExecute(Sender: TObject); procedure Act_EditInterfInternalConnExecute(Sender: TObject); procedure Act_DelInterfInternalConnExecute(Sender: TObject); procedure ComboBox_NamePropertiesChange(Sender: TObject); procedure btSectionSideClick(Sender: TObject); private { Private declarations } GForm: TForm; FDataSource: TDataSource; FCurrNpp: Integer; FmeInterfaceRel: TmeInterfaceRel; FCurrInterfID: Integer; FCurrInterfGUID: string; FReadOnly: Boolean; FInterfRelIDsForKolvo: TIntList; FInterfRelKolvosForKolvo: TIntList; FUOMMin: Integer; procedure ApplyCurrPortInterfsForOthetWithOutPortInterfs; //procedure DefineInterfaceKolvoByPortKolvo(AIDInterfRel, ANewPortKolvo, AUnitInterfKolvo: Integer); //procedure DefineInterfacesKolvoByDeletedPortInterfRels; //procedure DefineInterfacesKolvoByPortKolvo(ANewPortKolvo: Integer; AOnlyForNewPortInterfRels: Boolean); //procedure DefineInterfRelIDsForKolvo(AClearPrevios: Boolean); //procedure DefineInterfacesKolvoByPortKolvo(ANewPortKolvo: Integer); procedure DefineInternalRelControls; procedure DefineNotice; procedure EnableControlsInterfInternalConn; procedure EnableControlsPortInterfRel; procedure MakeEditInterfInternalConnWizard(AMakeEdit: TMakeEdit); procedure MakeEditPortInterfaceRelWizard(AMakeEdit: TMakeEdit); procedure MakeEditPortInterfaceRel(AMakeEdit: TMakeEdit; AMemTable: TkbmMemTable; AIDPort, AIDInterfRel, AUnitInterfKolvo: Integer; AInterfName: String); procedure OnChangeInterfName; procedure ShowPairKolvo; // Сбросить связб с противоположным интерфейсом procedure ThrowDownIDAdverse(AIDInterfRel, AIDAdverse, ANewTypeI: Integer; AMemTable: TkbmMemTable); public { Public declarations } GFormMode : TFormMode; GID_Interface: Integer; GGUIDInterface: string; GTypeInterface: Integer; GNppPort: Integer; GIsLineCompon: Integer; GKolvo: Integer; GName: String; GDeletedPortInterfRelIDs: TIntList; property ReadOnly: Boolean read FReadOnly write FReadOnly; procedure SetControls; function GetInterfRel(var AmeInterfaceRel: TmeInterfaceRel; AFormMode: TFormMode; AReadOnly: Boolean = false): Boolean; Constructor Create(AOwner: TComponent; AForm: TForm); Destructor Destroy; override; end; { var F_AddInterface: TF_AddInterface; } implementation Uses Unit_DM_SCS, U_CaseForm, U_MAIN, U_AnswerToQuast, U_MakeEditPortInterfRel, U_SCSComponent; {$R *.dfm} procedure TF_AddInterface.FormCreate(Sender: TObject); var i: Integer; begin FReadOnly := false; GDeletedPortInterfRelIDs := TIntList.Create; FInterfRelIDsForKolvo := TIntList.Create; FInterfRelKolvosForKolvo := TIntList.Create; gbPortInterfaes.Constraints.MinHeight := gbPortInterfaes.Height; SetStyleToRZColorEdit(ColorEdit); //FillComboBox(ComboBox_Name, F_NormBase.DM.DataSet_INTERFACE, 'ID', 'Name'); CurrencyEdit_ValueI.Properties.DisplayFormat := GetDisplayFormatForFloat; CurrencyEdit_ValueI.Properties.DecimalPlaces := FloatPrecision; with TF_Main(GForm).DM do begin for i := 0 to MemTable_PortInterfRel.FieldDefs.Count - 1 do mtPortInterfRels.FieldDefs.Add(MemTable_PortInterfRel.FieldDefs[i].Name, MemTable_PortInterfRel.FieldDefs[i].DataType, MemTable_PortInterfRel.FieldDefs[i].Size); for i := 0 to mtInterfInternalConn.FieldDefs.Count - 1 do begin mtInterfInternalConnection.FieldDefs.Add(mtInterfInternalConn.FieldDefs[i].Name, mtInterfInternalConn.FieldDefs[i].DataType, mtInterfInternalConn.FieldDefs[i].Size); end; end; end; procedure TF_AddInterface.FormShow(Sender: TObject); begin Case GFormMode of fmMake: begin //CurrencyEdit_ValueI.Value := 1; ComboBox_Name.SetFocus; end; fmEdit: with TF_Main(GForm).FNormBase.DM do begin //Self.SpinEdit_Kolvo.Value := GKolvo; //RadioGroup_TypeI.ItemIndex := GTypeInterface; //ComboBox_Type_I.ItemIndex := GTypeInterface; end; end; end; procedure TF_AddInterface.Button_NameInterfceClick(Sender: TObject); var ID_Interf: Integer; NewID_Interf: Integer; GUIDInterf: String; //ModalRes: TModalResult; begin ID_Interf := GetIDFromComboBox(ComboBox_Name); GUIDInterf := GetGUIDFromComboBox(ComboBox_Name); {F_NormBase.F_CaseForm.Tree_InterfType.Selected := F_NormBase.F_CaseForm.Tree_InterfType.TopItem; SearchRecord(F_NormBase.DM.DataSet_INTERFACE, 'ID', ID_Interf); F_NormBase.F_CaseForm.GFormMode := GFormMode; F_NormBase.F_CaseForm.GViewKind := vkInterface; ModalRes := F_NormBase.F_CaseForm.ShowModal; NewID_Interf := F_NormBase.DM.DataSet_INTERFACE.FN('ID').AsInteger; } ComboBox_Name.Properties.OnChange := nil; if TF_Main(GForm).GDBMode = bkNormBase then begin NewID_Interf := F_NormBase.DM.GetInterfaceIDFromGuide(ID_Interf, GFormMode); //F_NormBase.DM.SelectInterfaceByType; if NewID_Interf <> -1 then FillComboBox(ComboBox_Name, F_NormBase, true, tnInterface, fnID, fnName, '', NewID_Interf) else FillComboBox(ComboBox_Name, F_NormBase, true, tnInterface, fnID, fnName, '', ID_Interf); end else if TF_Main(GForm).GDBMode = bkProjectManager then begin if ShowCurrProjectProperties(vkInterface, GUIDInterf) then if TF_Main(GForm).GSCSBase.CurrProject.Spravochnik.LastInterface <> nil then begin TF_Main(GForm).GSCSBase.CurrProject.Spravochnik.LoadInterfacesToStrings(ComboBox_Name.Properties.Items, true); SelectItemByGUIDinCombo(ComboBox_Name, TF_Main(GForm).GSCSBase.CurrProject.Spravochnik.LastInterface.GUID); end; end; ComboBox_Name.Properties.OnChange := ComboBox_NamePropertiesChange; OnChangeInterfName; end; procedure TF_AddInterface.ComboBox_Type_I_KeyPress(Sender: TObject; var Key: Char); begin Key := #0; Beep; end; procedure TF_AddInterface.FormHide(Sender: TObject); begin // ##### При Следующем вsзове, Отображать эту форму в средине Главной ##### //F_AddInterface.Position := poMainFormCenter; end; constructor TF_AddInterface.Create(AOwner: TComponent; AForm: TForm); begin GForm := AForm; inherited Create(AOwner); end; destructor TF_AddInterface.Destroy; begin inherited; end; procedure TF_AddInterface.SetControls; var VisibleValue: Boolean; MultipleName: String; begin {if (GFormMode = fmMake) and (GIsLineCompon = biTrue) and (RadioGroup_TypeI.ItemIndex = itFunctional) then begin Label_Mul2.Visible := true; Label_lbPairKolvo.Visible := true; Label_PairKolvo.Visible := true; end; else begin Label_Mul2.Visible := false; Label_lbPairKolvo.Visible := false; Label_PairKolvo.Visible := false; end;} CheckBox_IsPair.Visible := false; CheckBox_IsPort.Visible := false; Label_Mul2.Visible := false; Label_lbPairKolvo.Visible := false; Label_PairKolvo.Visible := false; Label_Npp.Visible := false; SpinEdit_Npp.Visible := false; Label_NppSide.Visible := false; SpinEdit_NppSide.Visible := false; if GFormMode = fmMake then begin if GIsLineCompon = biTrue then begin //if RadioGroup_TypeI.ItemIndex = itFunctional then if rbTypeFunctional.Checked then begin CheckBox_IsPair.Visible := true; if (CheckBox_IsPair.Checked) and (CheckBox_IsPair.Visible) then begin Label_Mul2.Visible := true; Label_lbPairKolvo.Visible := true; Label_PairKolvo.Visible := true; ShowPairKolvo; end; if Not CheckBox_IsPair.Checked then begin Label_NppSide.Visible := true; SpinEdit_NppSide.Visible := true; end; end; end else if GIsLineCompon = biFalse then begin if rbTypeFunctional.Checked then CheckBox_IsPort.Visible := true; end; end else if GIsLineCompon = biTrue then if rbTypeFunctional.Checked then if (FmeInterfaceRel.ID_Adverse = 0) then begin pcIsPair.ActivePage := tsIsPairFalse; Label_NppSide.Visible := true; SpinEdit_NppSide.Visible := true; end; if GFormMode = fmEdit then if TF_Main(GForm).GDBMode = bkProjectManager then begin Label_Npp.Enabled := true; SpinEdit_Npp.Enabled := true; end; //*** Количество отображать только для функционала, или создаваемого конструктива VisibleValue := false; if rbTypeFunctional.Checked or (rbTypeConstructive.Checked and (GFormMode = fmMake)) then VisibleValue := true; Label_KolvoAdd.Visible := VisibleValue; SpinEdit_Kolvo.Visible := VisibleValue; VisibleValue := false; MultipleName := CMultiplePoinInterface; if (GIsLineCompon = biTrue) and (rbTypeConstructive.Checked) then begin MultipleName := GetNameInterfaceMultipleForLine; //CMultipleLineInterface; if CheckBox_Multiple.Checked then VisibleValue := true; end; CheckBox_Multiple.Caption := MultipleName; Label_ValueI.Visible := VisibleValue; CurrencyEdit_ValueI.Visible := VisibleValue; //pnSectionSideValue.Visible := rbTypeFunctional.Checked; { if (GIsLineCompon = biTrue) and (RadioGroup_TypeI.ItemIndex = itConstructive) then begin Label_ValueI.Visible := true; CurrencyEdit_ValueI.Visible := true; //CurrencyEdit_ValueI.Value := 1; //CheckBox_Multiple.Visible := false; end else begin Label_ValueI.Visible := false; CurrencyEdit_ValueI.Visible := false; end; } {if (GIsLineCompon = biTrue) and (ComboBox_Type_I.ItemIndex = itFunctional) then ColorEdit.Visible := true else ColorEdit.Visible := false;} Panel_Main.Enabled := Not FReadOnly; tbInternalConnection.Enabled := Not FReadOnly; grid_PortInterfRels.Enabled := Not FReadOnly; grid_InterfInternalConn.Enabled := Not FReadOnly; end; function TF_AddInterface.GetInterfRel(var AmeInterfaceRel: TmeInterfaceRel; AFormMode: TFormMode; AReadOnly: Boolean = false): Boolean; var ModalRes: TModalResult; OldmeInterfaceRel: TmeInterfaceRel; StrIsVisibleFilter: string; begin Result := false; FUOMMin := ConvertUOMToMin(TF_Main(GForm).FUOM); FReadOnly := AReadOnly; GFormMode := AFormMode; GGUIDInterface := ''; FmeInterfaceRel := AmeInterfaceRel; FCurrInterfID := FmeInterfaceRel.ID_INTERFACE; FCurrInterfGUID := FmeInterfaceRel.GUIDInterface; GDeletedPortInterfRelIDs.Clear; AmeInterfaceRel.ServiceIsPair := false; AmeInterfaceRel.ServiceApplyForAllNoRelPorts := false; if AmeInterfaceRel.IsLineCompon = biTrue then pcIsLine.ActivePage := tsIsLine else if AmeInterfaceRel.IsLineCompon = biFalse then pcIsLine.ActivePage := tsIsPoint; Label_ValueI.Caption := cNameVolumeB + ', '+GetNameUOM(FUOMMin, true, false)+'2'; Label_Mul2.Visible := false; GIsLineCompon := AmeInterfaceRel.IsLineCompon; FDataSource := AmeInterfaceRel.DataSource; FCurrNpp := 0; if AFormMode = fmEdit then begin GID_Interface := AmeInterfaceRel.ID_INTERFACE; GGUIDInterface := AmeInterfaceRel.GUIDInterface; GKolvo := AmeInterfaceRel.KOLVO; GTypeInterface := AmeInterfaceRel.TYPEI; FCurrNpp := AmeInterfaceRel.Npp; CheckBox_Multiple.Checked := IntToBool(AmeInterfaceRel.Multiple); {if AmeInterfaceRel.Multiple = biTrue then CheckBox_Multiple.Checked := true else CheckBox_Multiple.Checked := false;} end; CheckBox_IsPort.Visible := false; GroupBox_NppPort.Visible := false; //Label_NppPort.Visible := false; //SpinEdit_NppPort.Visible := false; //CheckBox_IsUserPort.Visible := false; //*** Интерфейсный порт CheckBox_IsPort.Checked := IntToBool(AmeInterfaceRel.IsPort); {if AmeInterfaceRel.IsPort = biTrue then CheckBox_IsPort.Checked := true else CheckBox_IsPort.Checked := false;} Label_NppPort.Enabled := false; SpinEdit_NppPort.Enabled := false; CheckBox_IsUserPort.Enabled := false; SetControls; rbTypeFunctional.Checked := false; rbTypeConstructive.Checked := false; rbKindNoSplit.Checked := false; rbKindSplit.Checked := false; rbGenderMale.Checked := false; rbGenderFemale.Checked := false; rbSignTypeProject.Checked := false; rbSignTypeActive.Checked := false; mtPortInterfRels.Active := false; mtInterfInternalConnection.Active := false; //pcIsLine.ActivePage := nil; //rgSignType.ItemIndex := AmeInterfaceRel.SignType - 1; ComboBox_Name.Properties.OnChange := nil; if TF_Main(GForm).GDBMode = bkNormBase then begin //*** Не отображать невидимые интерфейсы для компонент в не рабочей версии StrIsVisibleFilter := ''; if Not IsShowUnvisibleInterface then begin if AFormMode = fmMake then StrIsVisibleFilter := GetSQLForIsVisible(tnInterface) else if AFormMode = fmEdit then StrIsVisibleFilter := GetSQLForIsVisibleWithFieldIntValue(tnInterface, fnID, AmeInterfaceRel.ID_INTERFACE); end; FillComboBox(ComboBox_Name, F_NormBase, true, tnInterface, fnID, fnName, '', 0, '', StrIsVisibleFilter); end else if TF_Main(GForm).GDBMode = bkProjectManager then begin ComboBox_Name.Properties.BeginUpdate; try TF_Main(GForm).GSCSBase.CurrProject.Spravochnik.LoadInterfacesToStrings(ComboBox_Name.Properties.Items, true); finally ComboBox_Name.Properties.EndUpdate; end; end; cbSectionSide.Properties.BeginUpdate; try TF_Main(GForm).FNormBase.DM.LoadInputStringsToTStrings(cbSectionSide.Properties.Items, stDimensions); finally cbSectionSide.Properties.EndUpdate; end; case AFormMode of fmMake: begin Caption := cAddInterface_Msg2_1; //(GForm as TF_Main).DM.DataSet_INTERFACE.First; SelectItemByIDinCombo(ComboBox_Name, 0); //FillComboBox(ComboBox_Name, F_NormBase, true, tnInterface, fnID, fnName, '', 0); //GID_Interface :=F_NormBase.DM.DataSet_INTERFACE.FN('ID').AsInteger; ComboBox_Name.ItemIndex := 0; SpinEdit_Kolvo.Value := 1; Label_PairKolvo.Caption := IntToStr(SpinEdit_Kolvo.Value); CheckBox_Multiple.Checked := false; Label_Npp.Enabled := false; SpinEdit_Npp.Enabled := false; //RadioGroup_Kind.ItemIndex := 0; rbTypeFunctional.Checked := true; rbKindNoSplit.Checked := true; rbSignTypeProject.Checked := true; Label_KolvoAdd.Visible := true; //Label_KolvoInterf.Visible := true; SpinEdit_Kolvo.Visible := true; CurrencyEdit_ValueI.Value := 1; ColorEdit.SelectedColor := ColorEdit.DefaultColor; CheckBox_IsPort.Visible := Not IntToBool(AmeInterfaceRel.IsLineCompon); CheckBox_IsPort.Enabled := true; //GroupBox_NppPort.Visible := Not IntToBool(AmeInterfaceRel.IsLineCompon); Edit_Notice.Text := ''; cbConnectToAnyGender.Checked := false; cbSectionSide.Text := ''; AmeInterfaceRel.IsUserPort := biFalse; AmeInterfaceRel.ValueI := 0; end; fmEdit: begin Self.Caption := cAddInterface_Msg2_2; //DataSet_Interface.Locate(fnID, GID_Interface, []); if GGUIDInterface <> '' then SelectItemByGUIDinCombo(ComboBox_Name, GGUIDInterface) else SelectItemByIDinCombo(ComboBox_Name, GID_Interface); //FillComboBox(ComboBox_Name, F_NormBase, true, tnInterface, fnID, fnName, '', GID_Interface); SpinEdit_Kolvo.Value := AmeInterfaceRel.Kolvo; SpinEdit_Kolvo.Visible := AmeInterfaceRel.TypeI = itFunctional; Label_KolvoAdd.Visible := SpinEdit_Kolvo.Visible; SpinEdit_NppSide.Value := AmeInterfaceRel.Side; //RadioGroup_Kind.ItemIndex := AmeInterfaceRel.Kind; if GTypeInterface = itFunctional then rbTypeFunctional.Checked := true else if GTypeInterface = itConstructive then rbTypeConstructive.Checked := true; if AmeInterfaceRel.Kind = ikNoSplit then rbKindNoSplit.Checked := true else if AmeInterfaceRel.Kind = ikSplit then rbKindSplit.Checked := true; if AmeInterfaceRel.GENDER = gtMale then rbGenderMale.Checked := true else if AmeInterfaceRel.GENDER = gtFemale then rbGenderFemale.Checked := true; if AmeInterfaceRel.SignType = oitProjectible then rbSignTypeProject.Checked := true else if AmeInterfaceRel.SignType = oitActive then rbSignTypeActive.Checked := true; //Label_KolvoInterf.Visible := false; CurrencyEdit_ValueI.Value := RoundCP(FloatInUOM(AmeInterfaceRel.ValueI, umSM, FUOMMin, 2)); ColorEdit.SelectedColor := AmeInterfaceRel.Color; SpinEdit_Npp.Value := AmeInterfaceRel.Npp; //GroupBox_IsPort.Visible := false; //CheckBox_IsPort.Visible := false; Edit_Notice.Text := AmeInterfaceRel.Notice; cbConnectToAnyGender.Checked := IntToBool(AmeInterfaceRel.ConnToAnyGender); cbSectionSide.Text := AmeInterfaceRel.SideSection; CheckBox_IsPort.Visible := AmeInterfaceRel.IsPort = biTrue; CheckBox_IsPort.Enabled := false; //*** Интерфейсный Порт if TF_Main(GForm).GDBMode = bkProjectManager then if AmeInterfaceRel.IsPort = biTrue then begin GNppPort := AmeInterfaceRel.NppPort; //GroupBox_IsPort.Visible := true; //Label_NppPort.Visible := True; //SpinEdit_NppPort.Visible := true; //Label_NppPort.Enabled := true; //SpinEdit_NppPort.Enabled := true; CheckBox_IsUserPort.Enabled := true; SpinEdit_NppPort.Value := GNppPort; CheckBox_IsUserPort.Visible := true; CheckBox_IsUserPort.Checked := IntToBool(AmeInterfaceRel.IsUserPort); end; end; end; case AmeInterfaceRel.IsPort of biTrue: tsInternalInterfConn.Caption := cAddInterface_Msg8_2; biFalse: tsInternalInterfConn.Caption := cAddInterface_Msg8_1; end; ComboBox_Name.Properties.OnChange := ComboBox_NamePropertiesChange; CheckBox_IsPortPropertiesChange(CheckBox_IsPort); cbApplyForAllNoRelPorts.Checked := false; //mtPortInterfRels.Active := false; if Assigned(AmeInterfaceRel.mtPortInterfRel) then begin mtPortInterfRels.Active := true; if AFormMode = fmEdit then mtPortInterfRels.LoadFromDataSet(AmeInterfaceRel.mtPortInterfRel, []); EnableControlsPortInterfRel; end; //DefineInterfRelIDsForKolvo(true); TF_Main(GForm).DM.DefineInterfRelIDsForKolvo(true, FInterfRelIDsForKolvo, FInterfRelKolvosForKolvo, FmeInterfaceRel.mtPortInterfRel); //*** Подключение интерфейсами //mtInterfInternalConnection.Active := false; if Assigned(AmeInterfaceRel.mtInterfInternalConnect) then begin AmeInterfaceRel.mtInterfInternalConnect.MasterSource := nil; AmeInterfaceRel.mtInterfInternalConnect.MasterFields := ''; AmeInterfaceRel.mtInterfInternalConnect.DetailFields := ''; if AmeInterfaceRel.DataSource <> nil then begin AmeInterfaceRel.mtInterfInternalConnect.MasterFields := fnID; AmeInterfaceRel.mtInterfInternalConnect.DetailFields := fnIDPort; AmeInterfaceRel.mtInterfInternalConnect.MasterSource := AmeInterfaceRel.DataSource; end; mtInterfInternalConnection.Active := true; if AFormMode = fmEdit then mtInterfInternalConnection.LoadFromDataSet(AmeInterfaceRel.mtInterfInternalConnect, []); EnableControlsInterfInternalConn; end; DefineInternalRelControls; pcInternalRelationChange(pcInternalRelation); ModalRes := ShowModal; if (ModalRes = mrOk) and (Not FReadOnly) then begin //*** применить не сохраненные параметры ValidateActiveFormControl(Self); //---------------------------------------- OldmeInterfaceRel := AmeInterfaceRel; AmeInterfaceRel.NAME := ComboBox_Name.Text; AmeInterfaceRel.ID_INTERFACE := GetIDFromComboBox(ComboBox_Name); //GID_Interface; AmeInterfaceRel.GUIDInterface := GetGUIDFromComboBox(ComboBox_Name); AmeInterfaceRel.KOLVO := SpinEdit_Kolvo.Value; if rbTypeFunctional.Checked then AmeInterfaceRel.TYPEI := itFunctional else if rbTypeConstructive.Checked then AmeInterfaceRel.TYPEI := itConstructive; if rbKindNoSplit.Checked then AmeInterfaceRel.Kind := ikNoSplit else if rbKindSplit.Checked then AmeInterfaceRel.Kind := ikSplit; if rbGenderMale.Checked then AmeInterfaceRel.GENDER := gtMale else if rbGenderFemale.Checked then AmeInterfaceRel.GENDER := gtFemale; if rbSignTypeProject.Checked then AmeInterfaceRel.SignType := oitProjectible else if rbSignTypeActive.Checked then AmeInterfaceRel.SignType := oitActive; AmeInterfaceRel.Multiple := BoolToInt(CheckBox_Multiple.Checked); {if CheckBox_Multiple.Checked then AmeInterfaceRel.Multiple := biTrue else AmeInterfaceRel.Multiple := biFalse;} if (GIsLineCompon = biTrue) and (rbTypeConstructive.Checked) then AmeInterfaceRel.ValueI := FloatInUOM(CurrencyEdit_ValueI.Value, FUOMMin, umSM, 2); AmeInterfaceRel.Color := ColorEdit.SelectedColor; AmeInterfaceRel.Notice := Edit_Notice.Text; AmeInterfaceRel.Count := 1; if (AFormMode = fmMake) then begin if AmeInterfaceRel.TYPEI = itFunctional then begin if (AmeInterfaceRel.IsLineCompon = biTrue) and (CheckBox_IsPair.Checked) then AmeInterfaceRel.Count := 2; //AmeInterfaceRel.KOLVO * 2; end else if AmeInterfaceRel.TYPEI = itConstructive then begin AmeInterfaceRel.Count := AmeInterfaceRel.KOLVO; AmeInterfaceRel.KOLVO := 1; end; end; if AmeInterfaceRel.IsLineCompon = biTrue then if AmeInterfaceRel.TYPEI = itFunctional then AmeInterfaceRel.Side := SpinEdit_NppSide.Value; //*** Интерфейсный порт case GFormMode of fmMake: begin AmeInterfaceRel.ServiceIsPair := CheckBox_IsPair.Checked; //AmeInterfaceRel.Side := SpinEdit_NppSide.Value; AmeInterfaceRel.IsPort := BoolToInt(CheckBox_IsPort.Checked); {if CheckBox_IsPort.Checked = True then AmeInterfaceRel.IsPort := biTrue else AmeInterfaceRel.IsPort := biFalse;} end; fmEdit: begin if TF_Main(GForm).GDBMode = bkProjectManager then if AmeInterfaceRel.IsPort = biTrue then begin AmeInterfaceRel.IsUserPort := BoolToInt(CheckBox_IsUserPort.Checked); if CheckBox_IsUserPort.Checked then AmeInterfaceRel.NppPort := SpinEdit_NppPort.Value; end; AmeInterfaceRel.Npp := SpinEdit_Npp.Value; if AmeInterfaceRel.TYPEI = itConstructive then begin AmeInterfaceRel.Kolvo := 1; if OldmeInterfaceRel.TypeI <> AmeInterfaceRel.TypeI then begin ThrowDownIDAdverse(AmeInterfaceRel.ID, AmeInterfaceRel.ID_Adverse, AmeInterfaceRel.TypeI, AmeInterfaceRel.mtInterfaces); AmeInterfaceRel.ID_Adverse := 0; AmeInterfaceRel.NumPair := 0; AmeInterfaceRel.Side := 0; end; end; //*** Переопределить номера пар интерфейсов if (AmeInterfaceRel.IsLineCompon = biTrue) and (OldmeInterfaceRel.Kolvo <> AmeInterfaceRel.Kolvo) and Assigned(AmeInterfaceRel.mtInterfaces) then TF_Main(GForm).DM.DefineInterfaceNumPairs(AmeInterfaceRel.mtInterfaces, @AmeInterfaceRel); end; end; AmeInterfaceRel.ConnToAnyGender := BoolToInt(cbConnectToAnyGender.Checked); AmeInterfaceRel.SideSection := ''; if cbSectionSide.Visible then AmeInterfaceRel.SideSection := cbSectionSide.Text; if Assigned(AmeInterfaceRel.mtPortInterfRel) then if CheckBox_IsPort.Checked then begin if AFormMode = fmEdit then TF_Main(GForm).DM.DeleteRecords(TDataSet(AmeInterfaceRel.mtPortInterfRel)); mtPortInterfRels.SaveToDataSet(AmeInterfaceRel.mtPortInterfRel); ////*** Подогнать количество интерфейсов под количество текущего порта TF_Main(GForm).DM.DefineInterfRelIDsForKolvo(false, FInterfRelIDsForKolvo, FInterfRelKolvosForKolvo, mtPortInterfRels); TF_Main(GForm).DM.DefineInterfacesKolvoByPortKolvo(AmeInterfaceRel.Kolvo, mtPortInterfRels, AmeInterfaceRel.mtInterfaces, FInterfRelIDsForKolvo, FInterfRelKolvosForKolvo); if cbApplyForAllNoRelPorts.Checked then begin ApplyCurrPortInterfsForOthetWithOutPortInterfs; AmeInterfaceRel.ServiceApplyForAllNoRelPorts := true; end; end; if Assigned(AmeInterfaceRel.mtInterfInternalConnect) then begin if AFormMode = fmEdit then TF_Main(GForm).DM.DeleteRecords(TDataSet(AmeInterfaceRel.mtInterfInternalConnect)); mtInterfInternalConnection.SaveToDataSet(AmeInterfaceRel.mtInterfInternalConnect); end; Result := true; end else Result := false; //*** Доступ ко всем if Assigned(AmeInterfaceRel.mtInterfInternalConnect) then begin AmeInterfaceRel.mtInterfInternalConnect.MasterSource := nil; AmeInterfaceRel.mtInterfInternalConnect.MasterFields := ''; AmeInterfaceRel.mtInterfInternalConnect.DetailFields := ''; end; end; procedure TF_AddInterface.Button_OKClick(Sender: TObject); var MessgError: String; CanOk: Boolean; procedure AddErrorMsg(AMessage: String); begin MessgError := MessgError + #13+ ' -'+AMessage; CanOk := false; end; begin ModalResult := mrOk; CanOk := true; MessgError := cSetNextParameters+':'+#13; if ComboBox_Name.Text = '' then AddErrorMsg(cNameInterface); if Not rbTypeFunctional.Checked and Not rbTypeConstructive.Checked then AddErrorMsg(cNameInterfaceType); if Not rbGenderMale.Checked and Not rbGenderFemale.Checked then AddErrorMsg(cNameInterfaceGender); if Not CanOk then begin MessageModal(MessgError, Caption, MB_OK or MB_ICONINFORMATION); ModalResult := mrNone; end; end; procedure TF_AddInterface.SpinEdit_KolvoPropertiesChange(Sender: TObject); begin try if SpinEdit_Kolvo.Value < 0 then SpinEdit_Kolvo.Value := 1; //*** Контроль количества интерфейсов на порту if (SpinEdit_Kolvo.Value > 1) and mtPortInterfRels.Active and (mtPortInterfRels.RecordCount > 1) then begin MessageModal(CControlPortInterfRelCount +' '+cbMessage10, ApplicationName, MB_ICONINFORMATION or MB_OK); SpinEdit_Kolvo.Value := 1; end; ShowPairKolvo; //DefinePortInterfRelActions; except on E: Exception do AddExceptionToLog('TF_AddInterface.SpinEdit_KolvoPropertiesChange: '+E.Message); end; end; procedure TF_AddInterface.ComboBox_NameKeyPress(Sender: TObject; var Key: Char); begin //key := #0; //Beep; end; // ##### Изменение типа интерфейса ##### procedure TF_AddInterface.ComboBox_Type_IPropertiesChange(Sender: TObject); begin SetControls; end; procedure TF_AddInterface.Label_Mul2Click(Sender: TObject); begin with TF_Main(GForm).F_AnswerToQuast do begin GCaption := ''; GAnswer := cAddInterface_Msg3; ShowModal; end; end; procedure TF_AddInterface.Button_HelpClick(Sender: TObject); begin with TF_Main(GForm).F_AnswerToQuast do begin GCaption := cAddInterface_Msg4_1; GAnswer := cAddInterface_Msg4_2; {'У компоненты линейного типа интерфейсы должны быть'+#13+ 'с обоих сторон, поетому количество интерфейсов будет умножаться на 2.';} ShowContextHelp(GCaption, GAnswer); end; end; // ##### Изменение значения "Интерфейсный порт" ##### procedure TF_AddInterface.CheckBox_IsPortPropertiesChange(Sender: TObject); var CanShowNppPort: Boolean; begin CanShowNppPort := false; try case CheckBox_IsPort.Checked of true: begin case GFormMode of fmMake: Caption := cAddInterface_Msg5_1; fmEdit: Caption := cAddInterface_Msg5_2; end; rbTypeFunctional.Checked := true; rbKindSplit.Checked := true; //RadioGroup_Gender.ItemIndex := 1 - gtFemale; gbTypeI.Enabled := false; //RadioGroup_TypeI.Enabled := false; gbKind.Enabled := false; //RadioGroup_Kind.Enabled := false; //RadioGroup_Gender.Enabled := false; end; false: begin case GFormMode of fmMake: Caption := cAddInterface_Msg6_1; fmEdit: Caption := cAddInterface_Msg6_2; end; gbTypeI.Enabled := true; //RadioGroup_TypeI.Enabled := true; gbKind.Enabled := true; //RadioGroup_Kind.Enabled := true; //RadioGroup_Gender.Enabled := true; end; end; Label_NppPort.Enabled := CheckBox_IsPort.Checked; SpinEdit_NppPort.Enabled := CheckBox_IsPort.Checked; CheckBox_IsUserPort.Enabled := CheckBox_IsPort.Checked; if TF_Main(GForm).GDBMode = bkProjectManager then if CheckBox_IsPort.Checked then if GFormMode = fmEdit then CanShowNppPort := true; GroupBox_NppPort.Visible := CanShowNppPort; CheckBox_Multiple.Visible := Not CheckBox_IsPort.Checked; DefineInternalRelControls; except on E: Exception do AddExceptionToLog('TF_AddInterface.CheckBox_IsPortPropertiesChange: '+E.Message); end; end; procedure TF_AddInterface.SpinEdit_NppPortPropertiesChange( Sender: TObject); begin //CheckBox_IsUserPort.Properties.OnChange := nil; CheckBox_IsUserPort.Checked := (Round(SpinEdit_NppPort.Value) <> GNppPort) or (FmeInterfaceRel.IsUserPort = biTrue); //CheckBox_IsUserPort.Properties.OnChange := CheckBox_IsUserPortPropertiesChange; end; procedure TF_AddInterface.CheckBox_IsUserPortPropertiesChange( Sender: TObject); begin if Not TRzCheckBox(Sender).Checked then begin SpinEdit_NppPort.Properties.OnChange := nil; SpinEdit_NppPort.Value := GNppPort; SpinEdit_NppPort.Properties.OnChange := SpinEdit_NppPortPropertiesChange; end; end; procedure TF_AddInterface.RadioGroup_TypeIPropertiesChange( Sender: TObject); begin if GIsLineCompon = biTrue then if rbTypeFunctional.Checked then CheckBox_IsPair.Checked := true; SetControls; end; // ##### Контроль номера жилы ##### procedure TF_AddInterface.SpinEdit_NppThreadPropertiesValidate( Sender: TObject; var DisplayValue: Variant; var ErrorText: TCaption; var Error: Boolean); var RecNo: Integer; //i: Integer; begin Error := false; ErrorText := ''; {//*** Проверка на "0" if DisplayValue = 0 then begin Error := true; ShowMessageByType(Self.Handle, smtDisplay, 'Номер жилы не может иметь нулевое значение', Application.Title, MB_OK or MB_ICONINFORMATION); ModalResult := mrNone; Exit; ///// EXIT //// end; } {if Integer(DisplayValue) < 0 then begin Error := true; Exit; //// EXIT //// end; } if Assigned(FDataSource) then with FDataSource do begin if DataSet.RecordCount > 0 then // Tolik 28/12/2019 -- begin RecNo := DataSet.RecNo; DataSet.DisableControls; try DataSet.First; while Not DataSet.Eof do begin if DataSet.FieldByName(fnNpp).AsInteger <> FCurrNpp then if DataSet.FieldByName(fnNpp).AsInteger = DisplayValue then begin Error := true; ShowMessageByType(Self.Handle, smtDisplay, cAddInterface_Msg7, Application.Title, MB_OK or MB_ICONINFORMATION); ModalResult := mrNone; Exit; ///// EXIT //// end; DataSet.Next; end; finally DataSet.RecNo := RecNo; DataSet.EnableControls; end; end; end; end; procedure TF_AddInterface.SpinEdit_NppPortPropertiesValidate( Sender: TObject; var DisplayValue: Variant; var ErrorText: TCaption; var Error: Boolean); begin ErrorText := ''; if DisplayValue < 0 then Error := true; end; procedure TF_AddInterface.Button_CancelClick(Sender: TObject); begin ModalResult := mrCancel; Close; end; procedure TF_AddInterface.CheckBox_IsPairPropertiesChange(Sender: TObject); begin if CheckBox_IsPair.Checked then pcIsPair.ActivePage := tsIsPairTrue else pcIsPair.ActivePage := tsIsPairFalse; SetControls; end; procedure TF_AddInterface.FormDestroy(Sender: TObject); begin ClearComboBox(ComboBox_Name); GDeletedPortInterfRelIDs.Free; DeactiveDataSets(Self); end; procedure TF_AddInterface.FormClose(Sender: TObject; var Action: TCloseAction); begin try TF_Main(GForm).F_AnswerToQuast.Close; except end; end; procedure TF_AddInterface.ApplyCurrPortInterfsForOthetWithOutPortInterfs; var CurrPortInterRels: TList; InterfRelsInPorts: TIntList; ptrPortInterfRel: PPortInterfRel; PortInterfRel: TPortInterfRel; PortRecNo: Integer; InterfRelRecNo: Integer; i: Integer; IDInterfRel: Integer; KolvoInterfRel: Integer; begin //Tolik 28/12/2019 -- if mtPortInterfRels.RecordCount = 0 then exit; // InterfRelsInPorts := TIntList.Create; CurrPortInterRels := TList.Create; PortRecNo := FmeInterfaceRel.mtPorts.RecNo; InterfRelRecNo := FmeInterfaceRel.mtInterfaces.RecNo; try //*** Отобрать тек-е связи с интерфейсами mtPortInterfRels.First; while Not mtPortInterfRels.Eof do begin GetMem(ptrPortInterfRel, SizeOf(TPortInterfRel)); TF_Main(GForm).DM.LoadFromMemTableToPortInterfRel(ptrPortInterfRel, mtPortInterfRels); ptrPortInterfRel.IDInterface := TF_Main(GForm).DM.GetIDInterfaceByIDInterfRelFromMemTable(ptrPortInterfRel.IDInterfRel, FmeInterfaceRel.mtInterfaces, nil); ptrPortInterfRel.UnitInterfKolvo := TF_Main(GForm).DM.GetIntFromTableByID(tnInterfaceRelation, fnKolvo, ptrPortInterfRel.IDInterfRel, qmPhisical); CurrPortInterRels.Add(ptrPortInterfRel); mtPortInterfRels.Next; end; //*** Отобрать все связанные с портами интерфейсы FmeInterfaceRel.mtPorts.First; while Not FmeInterfaceRel.mtPorts.Eof do begin if FmeInterfaceRel.mtPorts.FieldByName(fnIsNative).AsBoolean = true then begin FmeInterfaceRel.mtPortInterfRel.First; while Not FmeInterfaceRel.mtPortInterfRel.Eof do begin InterfRelsInPorts.Add(FmeInterfaceRel.mtPortInterfRel.FieldByName(fnIDInterfRel).AsInteger); FmeInterfaceRel.mtPortInterfRel.Next; end; end; FmeInterfaceRel.mtPorts.Next; end; //*** Насыпать в порты, в которых нет связей, аналог. связи с тек. FmeInterfaceRel.mtPorts.First; while Not FmeInterfaceRel.mtPorts.Eof do begin if FmeInterfaceRel.mtPorts.FieldByName(fnIsNative).AsBoolean = true then if FmeInterfaceRel.mtPortInterfRel.RecordCount = 0 then for i := 0 to CurrPortInterRels.Count - 1 do begin ptrPortInterfRel := CurrPortInterRels[i]; PortInterfRel := ptrPortInterfRel^; //*** Найти не используемый в портах интерфейс IDInterfRel := 0; IDInterfRel := TF_Main(GForm).DM.GetIDInterfRelByIDInterfaceFromMTThatNoInList(PortInterfRel.IDInterface, PortInterfRel.UnitInterfKolvo, FmeInterfaceRel.mtInterfaces, InterfRelsInPorts); if IDInterfRel <> 0 then begin PortInterfRel.IDInterfRel := IDInterfRel; MakeEditPortInterfaceRel(meMake, FmeInterfaceRel.mtPortInterfRel, FmeInterfaceRel.mtPorts.FieldByName(fnID).AsInteger, PortInterfRel.IDInterfRel, PortInterfRel.UnitInterfKolvo, F_NormBase.GSCSBase.NBSpravochnik.GetInterfaceNameByID(PortInterfRel.IDInterface)); InterfRelsInPorts.Add(PortInterfRel.IDInterfRel); end; end; FmeInterfaceRel.mtPorts.Next; end; finally InterfRelsInPorts.Free; FreeList(CurrPortInterRels); FmeInterfaceRel.mtPorts.RecNo := PortRecNo; FmeInterfaceRel.mtInterfaces.RecNo := InterfRelRecNo; end; end; { procedure TF_AddInterface.DefineInterfaceKolvoByPortKolvo(AIDInterfRel, ANewPortKolvo, AUnitInterfKolvo: Integer); var InterfRelRecNo: Integer; InterfKolvo: Integer; begin InterfRelRecNo := FmeInterfaceRel.mtInterfaces.RecNo; try InterfKolvo := AUnitInterfKolvo; if ANewPortKolvo > 0 then InterfKolvo := InterfKolvo * ANewPortKolvo; //*** Найти интефейс связанный с портом FmeInterfaceRel.mtInterfaces.First; while Not FmeInterfaceRel.mtInterfaces.Eof do begin //*** Если интерфейс нашелся, то изменить его количество if FmeInterfaceRel.mtInterfaces.FieldByName(fnID).AsInteger = AIDInterfRel then begin FmeInterfaceRel.mtInterfaces.Edit; FmeInterfaceRel.mtInterfaces.FieldByName(fnIsModified).AsBoolean := true; FmeInterfaceRel.mtInterfaces.FieldByName(fnKolvo).AsInteger := InterfKolvo; FmeInterfaceRel.mtInterfaces.Post; Break; //// BREAK //// end; FmeInterfaceRel.mtInterfaces.Next; end; finally FmeInterfaceRel.mtInterfaces.RecNo := InterfRelRecNo; end; end; procedure TF_AddInterface.DefineInterfacesKolvoByDeletedPortInterfRels; var i: Integer; begin for i := 0 to GDeletedPortInterfRelIDs.Count - 1 do DefineInterfaceKolvoByPortKolvo(GDeletedPortInterfRelIDs[i], 0, GDeletedPortInterfRelKolvos[i]); end; procedure TF_AddInterface.DefineInterfacesKolvoByPortKolvo(ANewPortKolvo: Integer; AOnlyForNewPortInterfRels: Boolean); var PortInterfRelRecNo: Integer; InterfRelRecNo: Integer; PortIDInterfRel: Integer; UnitInterfKolvo: Integer; begin if (ANewPortKolvo > 0) and (FmeInterfaceRel.mtPortInterfRel.RecordCount > 0) then begin PortInterfRelRecNo := FmeInterfaceRel.mtPortInterfRel.RecNo; InterfRelRecNo := FmeInterfaceRel.mtInterfaces.RecNo; try //*** Перебор связей портов с интерфейсами FmeInterfaceRel.mtPortInterfRel.First; while Not FmeInterfaceRel.mtPortInterfRel.Eof do begin if (Not AOnlyForNewPortInterfRels) or FmeInterfaceRel.mtPortInterfRel.FieldByName(fnIsNew).AsBoolean then begin PortIDInterfRel := FmeInterfaceRel.mtPortInterfRel.FieldByName(fnIDInterfRel).AsInteger; UnitInterfKolvo := FmeInterfaceRel.mtPortInterfRel.FieldByName(fnUnitInterfKolvo).AsInteger; if UnitInterfKolvo > 0 then DefineInterfaceKolvoByPortKolvo(PortIDInterfRel, ANewPortKolvo, UnitInterfKolvo); end; FmeInterfaceRel.mtPortInterfRel.Next; end; finally FmeInterfaceRel.mtPortInterfRel.RecNo := PortInterfRelRecNo; FmeInterfaceRel.mtInterfaces.RecNo := InterfRelRecNo; end; end; end; } procedure TF_AddInterface.DefineInternalRelControls; var CanShow: Boolean; begin CanShow := false; //if CheckBox_IsPort.Checked then // if (SpinEdit_Kolvo.Value = 1) or (GFormMode = fmEdit) then tsPortInterfRel.TabVisible := CheckBox_IsPort.Checked; if tsPortInterfRel.TabVisible then pcInternalRelation.ActivePage := tsPortInterfRel else pcInternalRelation.ActivePage := tsInternalInterfConn; //tsInternalInterfConn.cli //if CheckBox_IsPort.Checked then if rbTypeFunctional.Checked then CanShow := true; if gbPortInterfaes.Visible <> CanShow then begin gbPortInterfaes.Visible := CanShow; if CanShow then Height := Height + gbPortInterfaes.Height else Height := Height - gbPortInterfaes.Height; end; cbConnectToAnyGender.Visible := rbTypeFunctional.Checked; cbApplyForAllNoRelPorts.Visible := FmeInterfaceRel.ServiceShowApplyForAllNoRelPorts and (TF_Main(GForm).GDBMode = bkNormBase); end; procedure TF_AddInterface.DefineNotice; var Spravochnik: TSpravochnik; IDInterf: Integer; GUIDInterf: String; SprInterface: TNBInterface; OldInterfNoticeFromSpr: String; begin try OldInterfNoticeFromSpr := ''; //*** Определить текущий справочник Spravochnik := nil; if TF_Main(GForm).GDBMode = bkNormBase then Spravochnik := TF_Main(GForm).GSCSBase.NBSpravochnik else if TF_Main(GForm).GDBMode = bkProjectManager then Spravochnik := TF_Main(GForm).GSCSBase.CurrProject.Spravochnik; if Spravochnik <> nil then begin //*** Определить предыдущий интерфейс на данный момент SprInterface := Spravochnik.GetInterfaceByID(FCurrInterfID); if SprInterface = nil then SprInterface := Spravochnik.GetInterfaceByGUID(FCurrInterfGUID); if SprInterface <> nil then OldInterfNoticeFromSpr := SprInterface.Description; if (Edit_Notice.Text = '') or (Edit_Notice.Text = OldInterfNoticeFromSpr) then begin IDInterf := GetIDFromComboBox(ComboBox_Name); GUIDInterf := GetGUIDFromComboBox(ComboBox_Name); SprInterface := Spravochnik.GetInterfaceByID(IDInterf); if SprInterface = nil then SprInterface := Spravochnik.GetInterfaceByGUID(GUIDInterf); if SprInterface <> nil then Edit_Notice.Text := SprInterface.Description; {if TF_Main(GForm).GDBMode = bkNormBase then begin Edit_Notice.Text := TF_Main(GForm).DM.GetStringFromTableByID(tnInterface, fnDescription, IDInterf, qmPhisical); end else if TF_Main(GForm).GDBMode = bkProjectManager then begin SprInterface := TF_Main(GForm).GSCSBase.CurrProject.Spravochnik.GetInterfaceByGUID(GUIDInterf); if SprInterface <> nil then Edit_Notice.Text := SprInterface.Description; end;} end; end; except on E: Exception do AddExceptionToLogEx('TF_AddInterface.DefineNotice', E.Message); end; end; { //*** Определить исходное количество интерфейса, которые связаны с портами procedure TF_AddInterface.DefineInterfRelIDsForKolvo(AClearPrevios: Boolean); var i: Integer; PortInterfRelRecNo: Integer; begin if AClearPrevios then begin FInterfRelIDsForKolvo.Clear; FInterfRelKolvosForKolvo.Clear; end; if FmeInterfaceRel.mtPortInterfRel.RecordCount > 0 then begin PortInterfRelRecNo := FmeInterfaceRel.mtPortInterfRel.RecNo; try FmeInterfaceRel.mtPortInterfRel.First; while Not FmeInterfaceRel.mtPortInterfRel.Eof do begin if FInterfRelIDsForKolvo.IndexOf(FmeInterfaceRel.mtPortInterfRel.FieldByName(fnIDInterfRel).AsInteger) = -1 then begin FInterfRelIDsForKolvo.Add(FmeInterfaceRel.mtPortInterfRel.FieldByName(fnIDInterfRel).AsInteger); FInterfRelKolvosForKolvo.Add(FmeInterfaceRel.mtPortInterfRel.FieldByName(fnUnitInterfKolvo).AsInteger); end; FmeInterfaceRel.mtPortInterfRel.Next; end; finally FmeInterfaceRel.mtPortInterfRel.RecNo := PortInterfRelRecNo; end; end; end; procedure TF_AddInterface.DefineInterfacesKolvoByPortKolvo(ANewPortKolvo: Integer); var InterfRelRecNo: Integer; InterfKolvo: Integer; i: Integer; begin if FmeInterfaceRel.mtInterfaces.RecordCount > 0 then begin //*** Доопределить интерфейсы и их количества DefineInterfRelIDsForKolvo(false); InterfRelRecNo := FmeInterfaceRel.mtInterfaces.RecNo; try for i := 0 to FInterfRelIDsForKolvo.Count - 1 do begin InterfKolvo := FInterfRelKolvosForKolvo[i]; //*** Найти связь этого интерфейса в порте if (FmeInterfaceRel.mtPortInterfRel.Locate(fnIDInterfRel, FInterfRelIDsForKolvo[i], [])) and (ANewPortKolvo > 0) then InterfKolvo := InterfKolvo * ANewPortKolvo; //*** Найти сам интерфейс, и изменить его количество, если необходимо if FmeInterfaceRel.mtInterfaces.Locate(fnID, FInterfRelIDsForKolvo[i], []) then if FmeInterfaceRel.mtInterfaces.FieldByName(fnKolvo).AsInteger <> InterfKolvo then begin FmeInterfaceRel.mtInterfaces.Edit; FmeInterfaceRel.mtInterfaces.FieldByName(fnIsModified).AsBoolean := true; FmeInterfaceRel.mtInterfaces.FieldByName(fnKolvo).AsInteger := InterfKolvo; FmeInterfaceRel.mtInterfaces.Post; end; end; finally FmeInterfaceRel.mtInterfaces.RecNo := InterfRelRecNo; end; end; end; } procedure TF_AddInterface.EnableControlsInterfInternalConn; var EnableEditDel: Boolean; begin EnableEditDel := false; if mtInterfInternalConnection.Active then if mtInterfInternalConnection.RecordCount > 0 then EnableEditDel := true; Act_EditInterfInternalConn.Enabled := EnableEditDel; Act_DelInterfInternalConn.Enabled := EnableEditDel; end; procedure TF_AddInterface.EnableControlsPortInterfRel; var EnableEditDel: Boolean; begin EnableEditDel := false; if CheckBox_IsPort.Checked then if mtPortInterfRels.Active then if mtPortInterfRels.RecordCount > 0 then EnableEditDel := true; Act_EditPortInterface.Enabled := EnableEditDel; Act_DelPortInterface.Enabled := EnableEditDel; end; procedure TF_AddInterface.MakeEditInterfInternalConnWizard(AMakeEdit: TMakeEdit); var IgnoreIDPort: Integer; begin IgnoreIDPort := -1; if GFormMode = fmEdit then IgnoreIDPort := FmeInterfaceRel.ID; with TF_Main(GForm) do begin if CreateFMakeEditPortInterfRel.SelectInterfForInternalConn(AMakeEdit, FmeInterfaceRel, mtInterfInternalConnection, IgnoreIDPort) then begin case AMakeEdit of meMake: begin mtInterfInternalConnection.Append; mtInterfInternalConnection.FieldByName(fnIsNew).AsBoolean := true; mtInterfInternalConnection.FieldByName(fnIsModified).AsBoolean := false; end; meEdit: begin mtInterfInternalConnection.Edit; mtInterfInternalConnection.FieldByName(fnIsModified).AsBoolean := true; end; end; if mtInterfInternalConnection.State <> dsBrowse then begin mtInterfInternalConnection.FieldByName(fnRelType).AsInteger := rtInterfInternalConn; mtInterfInternalConnection.FieldByName(fnIDPort).AsInteger := FmeInterfaceRel.ID; mtInterfInternalConnection.FieldByName(fnIDInterfRel).AsInteger := F_MakeEditPortInterfRel.mtInterfaces.FieldByName(fnID).AsInteger; mtInterfInternalConnection.FieldByName(fnGender).AsInteger := F_MakeEditPortInterfRel.mtInterfaces.FieldByName(fnGender).AsInteger; mtInterfInternalConnection.FieldByName(fnUnitInterfKolvo).AsInteger := F_MakeEditPortInterfRel.mtInterfaces.FieldByName(fnKolvo).AsInteger; mtInterfInternalConnection.FieldByName(fnName).AsString := F_MakeEditPortInterfRel.mtInterfaces.FieldByName(fnName).AsString; mtInterfInternalConnection.Post; end; end; end; end; procedure TF_AddInterface.MakeEditPortInterfaceRelWizard(AMakeEdit: TMakeEdit); var IgnoreIDPort: Integer; begin IgnoreIDPort := -1; if GFormMode = fmEdit then IgnoreIDPort := FmeInterfaceRel.ID; with TF_Main(GForm) do begin if CreateFMakeEditPortInterfRel.Execute(AMakeEdit, FmeInterfaceRel, mtPortInterfRels, IgnoreIDPort) then begin MakeEditPortInterfaceRel(AMakeEdit, mtPortInterfRels, FmeInterfaceRel.ID, F_MakeEditPortInterfRel.mtInterfaces.FieldByName(fnID).AsInteger, F_MakeEditPortInterfRel.mtInterfaces.FieldByName(fnKolvo).AsInteger, F_MakeEditPortInterfRel.mtInterfaces.FieldByName(fnName).AsString); end; end; end; procedure TF_AddInterface.MakeEditPortInterfaceRel(AMakeEdit: TMakeEdit; AMemTable: TkbmMemTable; AIDPort, AIDInterfRel, AUnitInterfKolvo: Integer; AInterfName: String); begin case AMakeEdit of meMake: begin AMemTable.Append; AMemTable.FieldByName(fnIsNew).AsBoolean := true; AMemTable.FieldByName(fnIsModified).AsBoolean := false; end; meEdit: begin AMemTable.Edit; AMemTable.FieldByName(fnIsModified).AsBoolean := true; end; end; if AMemTable.State <> dsBrowse then begin AMemTable.FieldByName(fnRelType).AsInteger := rtPortInterfRel; AMemTable.FieldByName(fnIDPort).AsInteger := AIDPort; AMemTable.FieldByName(fnIDInterfRel).AsInteger := AIDInterfRel; AMemTable.FieldByName(fnUnitInterfKolvo).AsInteger := AUnitInterfKolvo; AMemTable.FieldByName(fnName).AsString := AInterfName; AMemTable.Post; end; end; procedure TF_AddInterface.OnChangeInterfName; begin DefineNotice; FCurrInterfID := GetIDFromComboBox(ComboBox_Name); FCurrInterfGUID := GetGUIDFromComboBox(ComboBox_Name); end; procedure TF_AddInterface.ShowPairKolvo; begin Label_PairKolvo.Caption := IntToStr(Round(SpinEdit_Kolvo.Value)); end; procedure TF_AddInterface.ThrowDownIDAdverse(AIDInterfRel, AIDAdverse, ANewTypeI: Integer; AMemTable: TkbmMemTable); var //SavedBookMark: String; SavedBookMark: TBookMark; FindedCount: Integer; begin if Assigned(AMemTable) then if AMemTable.Active then begin //SavedBookMark := AMemTable.Bookmark; SavedBookMark := AMemTable.GetBookmark; AMemTable.DisableControls; try FindedCount := 0; AMemTable.First; while Not AMemTable.Eof do begin if (AMemTable.FieldByName(fnID).AsInteger = AIDInterfRel) or (AMemTable.FieldByName(fnID).AsInteger = AIDAdverse) then begin AMemTable.Edit; AMemTable.FieldByName(fnIDAdverse).AsInteger := 0; AMemTable.FieldByName(fnNumPair).AsInteger := 0; TF_Main(GForm).DM.DefineInterfaceNumPairsStr(AMemTable, 0, AMemTable.FieldByName(fnKolvo).AsInteger); AMemTable.FieldByName(fnSide).AsInteger := 0; AMemTable.FieldByName(fnTypeI).AsInteger := ANewTypeI; AMemTable.FieldByName(fnIsModified).AsBoolean := true; AMemTable.Post; Inc(FindedCount); // 2 - количество параметров if FindedCount = 2 then Break; //// BREAK //// end; AMemTable.Next; end; //AMemTable.Bookmark := SavedBookMark; if SavedBookMark <> nil then begin AMemTable.GotoBookmark(SavedBookMark); AMemTable.FreeBookmark(SavedBookMark); end; finally AMemTable.EnableControls; end; end; end; procedure TF_AddInterface.Act_AddPortInterfaceExecute(Sender: TObject); begin if (mtPortInterfRels.RecordCount = 0) or (SpinEdit_Kolvo.Value = 1) then MakeEditPortInterfaceRelWizard(meMake) else MessageModal(CControlPortInterfRelCount, ApplicationName, MB_ICONINFORMATION or MB_OK); EnableControlsPortInterfRel; end; procedure TF_AddInterface.Act_EditPortInterfaceExecute(Sender: TObject); begin MakeEditPortInterfaceRelWizard(meEdit); end; procedure TF_AddInterface.Act_DelPortInterfaceExecute(Sender: TObject); var InterfName: String; begin InterfName := mtPortInterfRels.FieldByName(fnName).AsString; if MessageModal(cQuastRemoveInterface+' "'+InterfName+'"?', Application.Title, MB_ICONQUESTION or MB_YESNO) = IDYES then begin if mtPortInterfRels.FieldByName(fnIsNew).AsBoolean = false then begin GDeletedPortInterfRelIDs.Add(mtPortInterfRels.FieldByName(fnID).AsInteger); end; mtPortInterfRels.Delete; EnableControlsPortInterfRel; end; end; procedure TF_AddInterface.CheckBox_MultiplePropertiesChange( Sender: TObject); begin SetControls; end; procedure TF_AddInterface.SpinEdit_KolvoPropertiesValidate(Sender: TObject; var DisplayValue: Variant; var ErrorText: TCaption; var Error: Boolean); begin //if (DisplayValue > 1) and mtPortInterfRels.Active and (mtPortInterfRels.RecordCount > 1) then // begin // DisplayValue := TcxSpinEdit(Sender).Value; // MessageModal(CControlPortInterfRelCount + // ' Чтобы увеличить количество, удалите связи с интерфейсами, оставив не больше одной.', // ApplicationName, MB_ICONINFORMATION or MB_OK); // end; end; procedure TF_AddInterface.rbTypeFunctionalClick(Sender: TObject); begin if GIsLineCompon = biTrue then if rbTypeFunctional.Checked then CheckBox_IsPair.Checked := true; DefineInternalRelControls; SetControls; end; procedure TF_AddInterface.GT_InterfInternalConnGenderGetDisplayText( Sender: TcxCustomGridTableItem; ARecord: TcxCustomGridRecord; var AText: String); begin AText := GetInterfaceGenderName(AText); end; procedure TF_AddInterface.pcInternalRelationChange(Sender: TObject); var ActAdd: TAction; ActEdit: TAction; ActDel: TAction; begin ActAdd := nil; ActEdit := nil; ActDel := nil; if pcInternalRelation.ActivePage = tsPortInterfRel then begin ActAdd := Act_AddPortInterface; ActEdit := Act_EditPortInterface; ActDel := Act_DelPortInterface; end else if pcInternalRelation.ActivePage = tsInternalInterfConn then begin ActAdd := Act_AddInterfInternalConn; ActEdit := Act_EditInterfInternalConn; ActDel := Act_DelInterfInternalConn; end; tbAdd.Action := ActAdd; tbEdit.Action := ActEdit; tbDelete.Action := ActDel; pmnuAdd.Action := ActAdd; pmnuEdit.Action := ActEdit; pmnuDel.Action := ActDel; end; procedure TF_AddInterface.Act_AddInterfInternalConnExecute( Sender: TObject); begin if GFormMode = fmEdit then begin MakeEditInterfInternalConnWizard(meMake); EnableControlsInterfInternalConn; end else if GFormMode = fmMake then MessageModal(cbMessage11, ApplicationName, MB_OK or MB_ICONINFORMATION); end; procedure TF_AddInterface.Act_EditInterfInternalConnExecute( Sender: TObject); begin MakeEditInterfInternalConnWizard(meEdit); end; procedure TF_AddInterface.Act_DelInterfInternalConnExecute( Sender: TObject); var Quest: String; InterfName: String; begin Quest := cQuastDisconnectInterface; case FmeInterfaceRel.IsPort of biTrue: Quest := cQuastDisconnectPort; biFalse: Quest := cQuastDisconnectInterface; end; InterfName := mtInterfInternalConnection.FieldByName(fnName).AsString; if MessageModal(Quest+' "'+InterfName+'"?', Application.Title, MB_ICONQUESTION or MB_YESNO) = IDYES then begin if mtInterfInternalConnection.FieldByName(fnIsNew).AsBoolean = false then begin GDeletedPortInterfRelIDs.Add(mtInterfInternalConnection.FieldByName(fnID).AsInteger); end; mtInterfInternalConnection.Delete; EnableControlsInterfInternalConn; end; end; procedure TF_AddInterface.ComboBox_NamePropertiesChange(Sender: TObject); begin OnChangeInterfName; end; procedure TF_AddInterface.btSectionSideClick(Sender: TObject); begin TF_Main(GForm).FNormBase.DM.SendTextToInputStringsWithAddToTStrings(cbSectionSide.Text, stDimensions, true, cbSectionSide.Properties.Items); end; end.