From ba7be100e6b5e0b15f07fa60d40df25747599f8d Mon Sep 17 00:00:00 2001 From: f1iwq2 Date: Mon, 2 Aug 2021 10:41:27 +0200 Subject: [PATCH] V3.1 --- README.adoc | 14 + README.md | 4 - UnitConfig.dcu | Bin 128119 -> 137360 bytes UnitConfig.dfm | 367 ++++++++----- UnitConfig.pas | 1307 ++++++++++++++++++++++++++++----------------- UnitDebug.dcu | Bin 19025 -> 19022 bytes UnitPrinc.dcu | Bin 201566 -> 201615 bytes UnitPrinc.dfm | 6 +- UnitPrinc.pas | 154 +++--- UnitTCO.dcu | Bin 132317 -> 132215 bytes verif_version.dcu | Bin 9446 -> 10711 bytes verif_version.dfm | 27 +- verif_version.pas | 57 +- versions.txt | 5 +- 14 files changed, 1222 insertions(+), 719 deletions(-) create mode 100644 README.adoc delete mode 100644 README.md diff --git a/README.adoc b/README.adoc new file mode 100644 index 0000000..50b29e9 --- /dev/null +++ b/README.adoc @@ -0,0 +1,14 @@ +Signaux_complexes_GL +==================== + +Client signaux complexes pour CDM rail ou centrales pilotées par XpressNet +en USB ou Ethernet. +Fichiers sources. + +== Liens == + +:lien: http://cdmrail.free.fr/ForumCDR/viewtopic.php?f=77&t=3906#p50499 +:cdm: http://cdmrail.free.fr/SiteCDR/index.html + +* {lien} [Lien vers le fil] -- Forum de CDM rail +* {cdm} [Lin vers CDM rail] -- Site de CDM rail diff --git a/README.md b/README.md deleted file mode 100644 index 45b0381..0000000 --- a/README.md +++ /dev/null @@ -1,4 +0,0 @@ -# Signaux_complexes_GL -Client signaux complexes pour CDM rail ou centrales LENZ -Fichiers sources et exécutables. -http://cdmrail.free.fr/ForumCDR/viewtopic.php?f=77&t=3906#p50499 diff --git a/UnitConfig.dcu b/UnitConfig.dcu index 6d13a495a63b288f028c9fa0c13faf2a8f1e0078..9cb58cee5f8dd289c2fd228a45a85cdf21cf9c21 100644 GIT binary patch delta 50129 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 E0UOD$B>(^b delta 42625 zcmb?^4_uYi{r^4B^W5ihFBiBFARren1PTZQ2nGfw%5~bLq{O9VMM^qX}QUg75m1fP5Mg9rJLgK{W<4(E*Jl__I>@T z=Xsy=IiK@6pYu7N^Z&W@bZ5xt$1U~`Os0tc_>7q{=Ktg7HhX;h?(d(y*|Z_N>i)Wh zd28>#r|#aIRrl1Jo;-VV=j^7i#E@GWHY{1Y@cxEY>0tD|)IZ5b8hk8d z*Du1}QYJq?tz94HT5<3 zH~417AJwK#O4nYPv^2satt<$ssCnQ46#RgxPBX{tiF;@9vC?u=X6TanYd6%3>OTHI z`|57n^}D!JvUfCn^KJ7B%`SV{stw3jvvBde@`^u`(5zy!%Nn2tNS4KGH^6H3pe9(TbbDvQFi~z%O-?_8WrGQ ze4{9D{AW3>U6WqQoVBZohw(>|Cw4n#|>){%Nn#y%{U3Q*icim zWZq2yl3IPwJv9$D1mfW6>5knx4?M=ErIerzTpqQIuV+m1V~%b+PFo+MZOG`U4_9$9Ybt zE|GdOwXdcXYQD76{7+0btW0;TtgWtJ_rRSE8`ss`xdts_GIc7H5D}bEy|Te%TCZs5 z(~{VzmN>OE^`7)oF807ZS;t*0CpIBuWqLTwa;Kh$v-gKGvSl?~Z9M%gYo^R(bq8(^9O`nw7EXs>@cbjb!C%pG^B{L}a+> z2A2xQMwg3Cw`on8N!p?G1dH5o-zr#4`*V7RWjje3wL!`x?HjW#+BY(%X}4v#l{Y}w zT$u^lFEU)pkH#ZWT6ku-^523`Y{uW_QbGy5tn zCg*C)t3(@>(UOVUZ8=lapK%_oF=vrw_eJdMvST7<%&V=w|K6I$*C?&bqBZ5rizv`( zdx%zTMqPw>@N2JM6JqHO@Lr?+!6uQc zLl|Bj#$%HJ2InGeVgKCT5nODmRnF}IY7}W1<8}NrwX!^cM#Wp zS#X#7D@th6dJAT0cNRJ=2PwLT>=>)To3x)7<|&7W_f+8$%daW1&8TsRwsvNU@*9yj zUweOMxaIIg4AIv*E&W966xAU!dGo`xDaB^(>(^Q>?_MG8*VkIr-%?sXD&W?hElSen z6j{~xf=SbqBZz8w#V*Y;Q`LS{o~)_G)0E!{;sci7b7nJYlB^vpPPZJTc$tVN&Pulo zP`uX)i#WA)*V(iUv$8FJAli^syJq?%t!LKt%KL~vbKN547*Jb$-D1liF?1*pnxy2! zsv+9gb#c>sT}qBiy}9NA&zgqV9M#3@?nyu6V)s#xmoYEilYShyY6A^06(ufJTD$t5 zoIh)im!w$!Nb;D47npFJ&4M8UVr|+7B~vUPQd*@=SH_`bm1bE!;QUcR{mia~&Hk!A zU-#W1q-!6RHd_8fjJ+{B<67l^C}DK=BbJXSp+2Yv*UXKHgYFI0o((k^ATWEZT-`WK zTstH!a?T{}!|OAZKU4PbISVX*p@d4V@UDhAtC)J62%VY(jN~tq=FV165NQaVV3Jmq z6Qlj-T!-ajA~nVFx^&H5t^Sqb)VN7nW0s;Vn0K|d&|PFpTQ+}jh|`>8V!K-13&OOm zx425TTSBt!G?SODY^Zy%x}hfelP-{Kd~)AV!wCmKh+K>%0A_nEA=U_MM1RtujolJE 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 UX-v{6-SIe`wg*ByTy1gT|7yx)9{>OV diff --git a/UnitConfig.dfm b/UnitConfig.dfm index 3b97365..5e847ba 100644 --- a/UnitConfig.dfm +++ b/UnitConfig.dfm @@ -1,13 +1,13 @@ object FormConfig: TFormConfig - Left = 345 - Top = 219 + Left = 285 + Top = 127 Hint = 'Modifie les fichiers de configuration selon les s'#233'lections chois' + 'ies' BorderStyle = bsDialog Caption = 'Configuration g'#233'n'#233'rale' ClientHeight = 501 - ClientWidth = 854 + ClientWidth = 902 Color = clBtnFace Font.Charset = DEFAULT_CHARSET Font.Color = clWindowText @@ -21,7 +21,7 @@ object FormConfig: TFormConfig PixelsPerInch = 96 TextHeight = 13 object LabelInfo: TLabel - Left = 601 + Left = 649 Top = 416 Width = 29 Height = 16 @@ -34,7 +34,7 @@ object FormConfig: TFormConfig ParentFont = False end object Image1: TImage - Left = 600 + Left = 648 Top = 128 Width = 249 Height = 177 @@ -944,7 +944,7 @@ object FormConfig: TFormConfig Stretch = True end object Label11: TLabel - Left = 600 + Left = 648 Top = 32 Width = 244 Height = 31 @@ -957,7 +957,7 @@ object FormConfig: TFormConfig ParentFont = False end object ImageAig: TImage - Left = 600 + Left = 648 Top = 312 Width = 137 Height = 57 @@ -1229,7 +1229,7 @@ object FormConfig: TFormConfig Visible = False end object ImageTJD: TImage - Left = 720 + Left = 760 Top = 320 Width = 137 Height = 57 @@ -1365,7 +1365,7 @@ object FormConfig: TFormConfig Visible = False end object ImageTri: TImage - Left = 600 + Left = 648 Top = 336 Width = 145 Height = 65 @@ -1543,7 +1543,7 @@ object FormConfig: TFormConfig Caption = 'Verrouillable au carr'#233' :' end object Image2: TImage - Left = 720 + Left = 760 Top = 352 Width = 129 Height = 41 @@ -1773,9 +1773,9 @@ object FormConfig: TFormConfig object PageControl: TPageControl Left = 8 Top = 8 - Width = 585 + Width = 633 Height = 457 - ActivePage = TabSheetSig + ActivePage = TabSheetCDM Font.Charset = DEFAULT_CHARSET Font.Color = clBlack Font.Height = -11 @@ -1787,7 +1787,7 @@ object FormConfig: TFormConfig object TabSheetCDM: TTabSheet Caption = 'CDM Rail' object GroupBox1: TGroupBox - Left = 8 + Left = 16 Top = 8 Width = 273 Height = 81 @@ -1827,7 +1827,7 @@ object FormConfig: TFormConfig end end object GroupBox5: TGroupBox - Left = 8 + Left = 16 Top = 96 Width = 273 Height = 185 @@ -1900,7 +1900,7 @@ object FormConfig: TFormConfig end end object GroupBox6: TGroupBox - Left = 296 + Left = 320 Top = 8 Width = 273 Height = 169 @@ -1980,7 +1980,7 @@ object FormConfig: TFormConfig end end object GroupBox7: TGroupBox - Left = 296 + Left = 320 Top = 184 Width = 273 Height = 137 @@ -2036,7 +2036,7 @@ object FormConfig: TFormConfig end end object GroupBox8: TGroupBox - Left = 8 + Left = 16 Top = 288 Width = 273 Height = 113 @@ -2091,7 +2091,7 @@ object FormConfig: TFormConfig end end object GroupBox15: TGroupBox - Left = 296 + Left = 320 Top = 328 Width = 273 Height = 73 @@ -2120,9 +2120,9 @@ object FormConfig: TFormConfig object Label9: TLabel Left = 8 Top = 400 - Width = 297 + Width = 294 Height = 13 - Caption = 'Ces param'#232'tres sont utilis'#233's en fonctionnement sans CDM Rail' + Caption = 'Ces param'#232'tres sont utilis'#233's en fonctionnement sans CDM Rail' WordWrap = True end object GroupBox2: TGroupBox @@ -2260,55 +2260,54 @@ object FormConfig: TFormConfig object Memo1: TMemo Left = 312 Top = 8 - Width = 257 + Width = 297 Height = 97 BevelInner = bvLowered BevelKind = bkFlat BorderStyle = bsNone Lines.Strings = ( - '1. Port COM de l'#39'adresse USB de l'#39'interface ' - 'XpressNet.' - 'Attention de COM1 '#224' 9 - Si le port de l'#39'interface ' - 'USB>9, il faut le changer manuellement dans le ' - 'gestionnaire des p'#233'riph'#233'riques. Mettre 0 si inutilis'#233'e. ' - 'Le programme ne tentera pas de se connecter '#224' la ' - 'centrale si CDM rail est d'#233'tect'#233'.') + '1. Port COM de l'#39'adresse USB de l'#39'interface XpressNet.' + 'Attention de COM1 '#224' 9 - Si le port de l'#39'interface USB>9, il ' + 'faut le changer manuellement dans le gestionnaire des ' + 'p'#233'riph'#233'riques. ' + 'Mettre 0 si inutilis'#233'e. Le programme ne tentera pas de se ' + 'connecter '#224' la centrale si CDM rail est d'#233'tect'#233'.') ReadOnly = True TabOrder = 3 end object Memo2: TMemo Left = 312 Top = 112 - Width = 257 + Width = 297 Height = 97 BevelInner = bvLowered BevelKind = bkFlat BorderStyle = bsNone Lines.Strings = ( - '2. Valeur de temporisation entre deux octets ' - 'transf'#233'r'#233's '#224' l'#39'interface. Elle peut '#234'tre nulle. Pour ' - 'les interfaces s'#233'rie sans protocole (0) comme le ' - 'GENLI, il est conseill'#233' de la positionner '#224' une ' - 'valeur de l'#39'ordre de 30 (ms). Pour les interfaces avec ' - 'protocole mat'#233'riel RTS-CTS (2) cette ' - 'variable est ignor'#233'e.') + '2. Valeur de temporisation entre deux octets transf'#233'r'#233's '#224' ' + 'l'#39'interface. Elle peut '#234'tre nulle. ' + 'Pour les interfaces s'#233'rie sans protocole (0) comme le ' + 'GENLI, il est conseill'#233' de la positionner '#224' une valeur de ' + 'l'#39'ordre de 30 (ms). ' + 'Pour les interfaces avec protocole mat'#233'riel RTS-CTS (2) ' + 'cette variable est ignor'#233'e.') ReadOnly = True TabOrder = 4 end object Memo3: TMemo Left = 312 Top = 216 - Width = 257 + Width = 297 Height = 89 BevelInner = bvLowered BevelKind = bkFlat BorderStyle = bsNone Lines.Strings = ( - '3. Valeur maximale par tranche de 100 ms qui d'#233'finit ' - 'le temps d'#39'attente de la r'#233'ponse de l'#39'interface apr'#232's ' - 'une trame qui lui est transf'#233'r'#233'e. Cette valeur est '#224' ' - 'tester en fonction de votre interface. En cas de ' - 'd'#233'passement de la valeur, un message '#171' pas de ' + '3. Valeur maximale par tranche de 100 ms qui d'#233'finit le temps ' + 'd'#39'attente de la r'#233'ponse de l'#39'interface apr'#232's ' + 'une trame qui lui est transf'#233'r'#233'e. ' + 'Cette valeur est '#224' tester en fonction de votre interface. ' + 'En cas de d'#233'passement de la valeur, un message '#171' pas de ' 'r'#233'ponse de l'#39'interface '#187' sera affich'#233'.') ReadOnly = True TabOrder = 5 @@ -2316,17 +2315,17 @@ object FormConfig: TFormConfig object Memo4: TMemo Left = 312 Top = 312 - Width = 257 + Width = 297 Height = 73 BevelInner = bvLowered BevelKind = bkFlat BorderStyle = bsNone Lines.Strings = ( - '4. Pour l'#39'utilisation d'#39'interfaces s'#233'rie (GENLI), cette ' - 'valeur doit '#234'tre '#224' 0. Pour les interfaces utilisant ' - 'nativement de l'#39'USB, cette valeur doit '#234'tre '#224' 1. La ' - 'valeur 2 est utilis'#233'e exclusivement pour des ' - 'interfaces '#224' base d'#39'arduino pour xpressnet.') + '4. Pour l'#39'utilisation d'#39'interfaces s'#233'rie (GENLI), cette valeur ' + 'doit '#234'tre '#224' 0. Pour les interfaces utilisant nativement de ' + 'l'#39'USB, cette valeur doit '#234'tre '#224' 1. ' + 'La valeur 2 est utilis'#233'e exclusivement pour des interfaces '#224' ' + 'base d'#39'arduino pour xpressnet.') ReadOnly = True TabOrder = 6 end @@ -2397,11 +2396,25 @@ object FormConfig: TFormConfig Height = 13 Caption = 'LabelTJD1' end + object Label35: TLabel + Left = 0 + Top = 56 + Width = 134 + Height = 13 + Caption = 'Configuration des aiguillages' + end + object Label36: TLabel + Left = 232 + Top = 56 + Width = 86 + Height = 13 + Caption = 'Liste d'#39'initialisation' + end object GroupBox11: TGroupBox - Left = 280 + Left = 328 Top = 32 Width = 289 - Height = 353 + Height = 393 Caption = 'Description de l'#39'aiguillage' TabOrder = 0 object LabelAdresse: TLabel @@ -2433,7 +2446,7 @@ object FormConfig: TFormConfig end object GroupBox10: TGroupBox Left = 8 - Top = 96 + Top = 88 Width = 273 Height = 73 Caption = 'Vitesse de franchissement d'#233'vi'#233' :' @@ -2468,7 +2481,7 @@ object FormConfig: TFormConfig end object CheckInverse: TCheckBox Left = 16 - Top = 296 + Top = 269 Width = 137 Height = 17 Caption = 'Inversion de l'#39#233'tat CDM' @@ -2484,7 +2497,7 @@ object FormConfig: TFormConfig OnChange = EditAdrAigChange end object ComboBoxAig: TComboBox - Left = 72 + Left = 8 Top = 64 Width = 145 Height = 21 @@ -2500,9 +2513,9 @@ object FormConfig: TFormConfig end object GroupBox16: TGroupBox Left = 8 - Top = 176 + Top = 168 Width = 273 - Height = 105 + Height = 97 Caption = 'Repr'#233'sentation' TabOrder = 4 object LabelHG: TLabel @@ -2577,15 +2590,15 @@ object FormConfig: TFormConfig ParentFont = False end object LabelTJD1: TLabel - Left = 72 - Top = 84 + Left = 96 + Top = 76 Width = 52 Height = 13 Caption = 'LabelTJD1' end object LabelTJD2: TLabel - Left = 152 - Top = 84 + Left = 168 + Top = 76 Width = 52 Height = 13 Caption = 'LabelTJD1' @@ -2673,8 +2686,8 @@ object FormConfig: TFormConfig end end object ButtonRestaureAig: TButton - Left = 192 - Top = 296 + Left = 200 + Top = 56 Width = 75 Height = 25 Hint = @@ -2695,24 +2708,76 @@ object FormConfig: TFormConfig Visible = False OnChange = EditAigTripleChange end + object GroupBox21: TGroupBox + Left = 8 + Top = 288 + Width = 273 + Height = 97 + Caption = 'Initialisation de l'#39'aiguillage en mode autonome' + TabOrder = 7 + object Label37: TLabel + Left = 8 + Top = 26 + Width = 66 + Height = 13 + Caption = 'D'#233'vi'#233' ou droit' + end + object Label38: TLabel + Left = 8 + Top = 42 + Width = 129 + Height = 13 + Caption = 'Temporisation (1/10'#232'me s)' + end + object LabelDevie: TLabel + Left = 200 + Top = 24 + Width = 3 + Height = 13 + end + object EditDevDroit: TEdit + Left = 152 + Top = 18 + Width = 41 + Height = 21 + TabOrder = 0 + OnChange = EditDevDroitChange + end + object EditTempo10: TEdit + Left = 152 + Top = 40 + Width = 41 + Height = 21 + TabOrder = 1 + OnChange = EditTempo10Change + end + object CheckInvInit: TCheckBox + Left = 8 + Top = 64 + Width = 153 + Height = 17 + Caption = 'Pilotage invers'#233 + TabOrder = 2 + OnClick = CheckInvInitClick + end + end end object RichAig: TRichEdit Left = 0 - Top = 56 - Width = 265 - Height = 337 + Top = 72 + Width = 233 + Height = 353 Color = clBlack Font.Charset = DEFAULT_CHARSET Font.Color = clYellow Font.Height = -11 Font.Name = 'MS Sans Serif' Font.Style = [] - Lines.Strings = ( - 'RichAig') ParentFont = False ReadOnly = True - ScrollBars = ssVertical + ScrollBars = ssBoth TabOrder = 1 + WordWrap = False OnMouseDown = RichAigMouseDown end object ButtonNouvAig: TButton @@ -2742,6 +2807,23 @@ object FormConfig: TFormConfig TabOrder = 4 OnClick = ButtonAjSupClick end + object RichInitAig: TRichEdit + Left = 232 + Top = 72 + Width = 89 + Height = 353 + Color = clBlack + Font.Charset = DEFAULT_CHARSET + Font.Color = clYellow + Font.Height = -11 + Font.Name = 'MS Sans Serif' + Font.Style = [] + ParentFont = False + ReadOnly = True + ScrollBars = ssBoth + TabOrder = 5 + WordWrap = False + end end object TabSheetBranches: TTabSheet Caption = 'Branches' @@ -2756,7 +2838,7 @@ object FormConfig: TFormConfig 'la modifier - Valider la ligne apr'#232's modification' end object Label34: TLabel - Left = 408 + Left = 472 Top = 192 Width = 136 Height = 26 @@ -2764,7 +2846,7 @@ object FormConfig: TFormConfig WordWrap = True end object GroupBox20: TGroupBox - Left = 408 + Left = 464 Top = 24 Width = 153 Height = 161 @@ -2809,7 +2891,7 @@ object FormConfig: TFormConfig object RichBranche: TRichEdit Left = 0 Top = 24 - Width = 401 + Width = 457 Height = 401 Color = clBlack Font.Charset = DEFAULT_CHARSET @@ -2822,6 +2904,7 @@ object FormConfig: TFormConfig ParentFont = False ScrollBars = ssBoth TabOrder = 1 + WordWrap = False OnMouseDown = RichBrancheMouseDown end end @@ -2838,10 +2921,10 @@ object FormConfig: TFormConfig 'z sur une ligne pour afficher la description du signal' end object GroupBox12: TGroupBox - Left = 288 + Left = 336 Top = 40 Width = 281 - Height = 353 + Height = 385 Caption = 'Description du signal' TabOrder = 0 object ImageSignal: TImage @@ -2964,10 +3047,11 @@ object FormConfig: TFormConfig object MemoCarre: TMemo Left = 8 Top = 280 - Width = 241 - Height = 65 - ScrollBars = ssVertical + Width = 265 + Height = 89 + ScrollBars = ssBoth TabOrder = 0 + WordWrap = False OnChange = MemoCarreChange end object ComboBoxDec: TComboBox @@ -3052,7 +3136,7 @@ object FormConfig: TFormConfig OnChange = EditSuiv4Change end object CheckVerrouCarre: TCheckBox - Left = 104 + Left = 120 Top = 224 Width = 145 Height = 17 @@ -3115,8 +3199,8 @@ object FormConfig: TFormConfig object RichSig: TRichEdit Left = 0 Top = 56 - Width = 273 - Height = 337 + Width = 329 + Height = 369 Color = clBlack Font.Charset = DEFAULT_CHARSET Font.Color = clYellow @@ -3173,43 +3257,27 @@ object FormConfig: TFormConfig 'iquez sur une ligne pour afficher la description de l'#39'action' end object GroupBox13: TGroupBox - Left = 304 + Left = 360 Top = 32 Width = 257 Height = 385 Caption = 'Description de l'#39'actionneur ' TabOrder = 0 - object GroupBoxRadio: TGroupBox + object Label40: TLabel Left = 16 - Top = 24 - Width = 225 - Height = 65 - Caption = 'Type d'#39'actionneur ' - TabOrder = 0 - object RadioButtonLoc: TRadioButton - Left = 24 - Top = 24 - Width = 193 - Height = 17 - Caption = 'Fonction F pour locomotive' - TabOrder = 0 - OnClick = RadioButtonLocClick - end - object RadioButtonAccess: TRadioButton - Left = 24 - Top = 40 - Width = 161 - Height = 17 - Caption = 'Fonction F pour accessoire' - TabOrder = 1 - OnClick = RadioButtonAccessClick - end + Top = 328 + Width = 191 + Height = 26 + Caption = + 'Les accessoires ne sont utilisables qu'#39'en mode connect'#233' avec CDM' + + ' Rail' + WordWrap = True end object GroupBoxPN: TGroupBox - Left = 32 - Top = 80 + Left = -32 + Top = 24 Width = 225 - Height = 193 + Height = 289 Caption = 'Actionneurs gestion passage '#224' niveau' TabOrder = 2 object Label21: TLabel @@ -3253,6 +3321,13 @@ object FormConfig: TFormConfig Width = 137 Height = 2 end + object Label39: TLabel + Left = 8 + Top = 188 + Width = 30 + Height = 13 + Caption = 'Voie 4' + end object EditAdrFerme: TEdit Left = 120 Top = 24 @@ -3349,19 +3424,61 @@ object FormConfig: TFormConfig TabOrder = 11 OnChange = EditV3OChange end + object EditV4F: TEdit + Left = 64 + Top = 184 + Width = 41 + Height = 21 + TabOrder = 12 + OnChange = EditV4FChange + end + object EditV4O: TEdit + Left = 152 + Top = 184 + Width = 41 + Height = 21 + TabOrder = 13 + OnChange = EditV4OChange + end end - object GroupBoxAct: TGroupBox + object GroupBoxRadio: TGroupBox Left = 16 Top = 72 Width = 225 - Height = 249 + Height = 65 + Caption = 'Type d'#39'actionneur ' + TabOrder = 0 + object RadioButtonLoc: TRadioButton + Left = 24 + Top = 24 + Width = 193 + Height = 17 + Caption = 'Fonction F pour locomotive' + TabOrder = 0 + OnClick = RadioButtonLocClick + end + object RadioButtonAccess: TRadioButton + Left = 24 + Top = 40 + Width = 161 + Height = 17 + Caption = 'Fonction F pour accessoire' + TabOrder = 1 + OnClick = RadioButtonAccessClick + end + end + object GroupBoxAct: TGroupBox + Left = 16 + Top = 104 + Width = 225 + Height = 225 Caption = 'Actionneur fonction de locomotive ' TabOrder = 1 object GroupBox18: TGroupBox Left = 8 Top = 24 Width = 209 - Height = 97 + Height = 81 Caption = 'D'#233'clencheur ' TabOrder = 0 object LabelActionneur: TLabel @@ -3417,13 +3534,13 @@ object FormConfig: TFormConfig end object GroupBox19: TGroupBox Left = 8 - Top = 128 + Top = 112 Width = 209 Height = 105 Caption = 'Action ' TabOrder = 1 object LabelTempo: TLabel - Left = 40 + Left = 48 Top = 52 Width = 55 Height = 13 @@ -3447,8 +3564,8 @@ object FormConfig: TFormConfig Caption = #224 end object EditTempo: TEdit - Left = 128 - Top = 45 + Left = 112 + Top = 46 Width = 33 Height = 21 TabOrder = 0 @@ -3456,7 +3573,7 @@ object FormConfig: TFormConfig end object CheckRAZ: TCheckBox Left = 32 - Top = 72 + Top = 80 Width = 145 Height = 17 Caption = 'Remise '#224' 0 apr'#232's pilotage' @@ -3465,7 +3582,7 @@ object FormConfig: TFormConfig end object EditFonctionAccess: TEdit Left = 112 - Top = 15 + Top = 18 Width = 25 Height = 21 Hint = 'Num'#233'ro de fonction du d'#233'codeur du train' @@ -3476,7 +3593,7 @@ object FormConfig: TFormConfig end object EditEtatFoncSortie: TEdit Left = 160 - Top = 15 + Top = 18 Width = 25 Height = 21 TabOrder = 3 @@ -3488,7 +3605,7 @@ object FormConfig: TFormConfig object GroupBox14: TGroupBox Left = 0 Top = 32 - Width = 297 + Width = 345 Height = 185 Caption = 'Actionneurs locomotives ou accessoires' TabOrder = 1 @@ -3516,7 +3633,7 @@ object FormConfig: TFormConfig object RichAct: TRichEdit Left = 8 Top = 48 - Width = 281 + Width = 329 Height = 129 Color = clBlack Font.Charset = DEFAULT_CHARSET @@ -3526,16 +3643,17 @@ object FormConfig: TFormConfig Font.Style = [] ParentFont = False ReadOnly = True - ScrollBars = ssVertical + ScrollBars = ssBoth TabOrder = 2 + WordWrap = False OnMouseDown = RichActMouseDown end end object GroupBox17: TGroupBox Left = 0 Top = 232 - Width = 297 - Height = 185 + Width = 345 + Height = 193 Caption = 'Actionneurs passage '#224' niveau' TabOrder = 2 object ButtonNouvPN: TButton @@ -3562,8 +3680,8 @@ object FormConfig: TFormConfig object RichPN: TRichEdit Left = 8 Top = 48 - Width = 281 - Height = 129 + Width = 329 + Height = 137 Color = clBlack Font.Charset = DEFAULT_CHARSET Font.Color = clYellow @@ -3572,8 +3690,9 @@ object FormConfig: TFormConfig Font.Style = [] ParentFont = False ReadOnly = True - ScrollBars = ssVertical + ScrollBars = ssBoth TabOrder = 2 + WordWrap = False OnMouseDown = RichPNMouseDown end end diff --git a/UnitConfig.pas b/UnitConfig.pas index da3a060..7027ffe 100644 --- a/UnitConfig.pas +++ b/UnitConfig.pas @@ -217,6 +217,20 @@ type LabelResult: TLabel; Label34: TLabel; EditAigTriple: TEdit; + GroupBox21: TGroupBox; + Label37: TLabel; + Label38: TLabel; + EditDevDroit: TEdit; + EditTempo10: TEdit; + CheckInvInit: TCheckBox; + RichInitAig: TRichEdit; + Label35: TLabel; + Label36: TLabel; + LabelDevie: TLabel; + Label39: TLabel; + EditV4F: TEdit; + EditV4O: TEdit; + Label40: TLabel; procedure ButtonAppliquerEtFermerClick(Sender: TObject); procedure FormActivate(Sender: TObject); procedure FormCreate(Sender: TObject); @@ -294,6 +308,11 @@ type procedure ButtonVerifConfigClick(Sender: TObject); procedure MemoCarreChange(Sender: TObject); procedure EditAigTripleChange(Sender: TObject); + procedure EditDevDroitChange(Sender: TObject); + procedure EditTempo10Change(Sender: TObject); + procedure CheckInvInitClick(Sender: TObject); + procedure EditV4FChange(Sender: TObject); + procedure EditV4OChange(Sender: TObject); private { Déclarations privées } public @@ -333,7 +352,9 @@ var FormConfig: TFormConfig; AdresseIPCDM,AdresseIP,PortCom,recuCDM,residuCDM : string; portCDM,TempoOctet,TimoutMaxInterface,Valeur_entete,Port,protocole,NumPort, - LigneCliquee,AncLigneCliquee,LigneCliqueePN,AncLigneCliqueePN,clicMemo : integer; + LigneCliqueePN,AncLigneCliqueePN,clicMemo, + ligneclicAig,AncLigneClicAig,ligneClicSig,AncligneClicSig, + ligneClicBr,AncligneClicBr,ligneClicAct,AncLigneClicAct : integer; ack_cdm,clicliste,entreeTCO,affevt,config_modifie : boolean; function config_com(s : string) : boolean; @@ -341,7 +362,7 @@ function envoi_CDM(s : string) : boolean; procedure connecte_CDM; function place_id(s : string) : string; procedure decodeAig(s : string;var adr : integer;var B : char); -procedure sauve_config; +function sauve_config : boolean; Procedure aff_champs_sig_feux(index : integer); procedure decode_ligne_feux(chaine_signal : string;i : integer); function verif_coherence : boolean; @@ -357,22 +378,23 @@ uses UnitDebug,UnitPrinc, UnitTCO; function envoi_CDM(s : string) : boolean; var temps : integer; begin - if SocketCDM_connecte=false then begin envoi_CDM:=false;exit;end; - //Affiche('Envoi à CDM rail',clRed);Affiche(s,ClGreen); - if traceTrames then afficheDebug(s,clLime); - Formprinc.ClientSocketCDM.Socket.SendText(s); - // attend l'ack - ackCDM:=false;nackCDM:=false; - temps:=0; - repeat - inc(temps);Sleep(100); - Application.processMessages; - until ferme or ackCDM or nackCDM or (temps>30); // CDM répond < 1s - //Affiche(IntToSTR(temps),clyellow); - if not(ackCDM) or nack then - begin - Affiche('Pas de réponse de CDM Rail',clRed); - end; + if SocketCDM_connecte=false then begin envoi_CDM:=false;exit;end; + //Affiche('Envoi à CDM rail',clRed);Affiche(s,ClGreen); + if traceTrames then afficheDebug(s,clLime); + Formprinc.ClientSocketCDM.Socket.SendText(s); + // attend l'ack + ackCDM:=false;nackCDM:=false; + temps:=0; + repeat + inc(temps);Sleep(100); + Application.processMessages; + until ferme or ackCDM or nackCDM or (temps>30); // CDM répond < 1s + + if not(ackCDM) or nack then + begin + Affiche('Pas de réponse de CDM Rail',clRed); + end; + envoi_CDM:=ackCDM; end; @@ -393,7 +415,7 @@ begin feux[i].Img.Hint:=s; end; -// demande les services à CDM +// demande les services Com-IP à CDM function services_CDM : boolean; var s,ss : string; i : integer; @@ -416,9 +438,10 @@ begin ss:=format('%.*d',[3,i]) ; delete(s,26,3); insert(ss,s,26); - //Affiche(s,clyellow); - envoi_CDM(s);sleep(100); + envoi_CDM(s); + sleep(100); + if ack_cdm then begin s:='Services acceptés: '; @@ -439,8 +462,7 @@ var s : string; begin // déconnexion de l'ancienne liaison éventuelle Formprinc.ClientSocketCDM.Close; - // Initialisation de la comm socket CDM - //if CDM_connecte then begin Affiche('CDM déja connecté',Cyan);exit;end; + if AdresseIPCDM<>'0' then begin // ouverture du socket CDM @@ -538,6 +560,18 @@ begin config_com:=not( (copy(sa,1,3)<>'COM') or (NumPort>9) or (protocole=-1) or (protocole>4) or (i=0) ); end; +// transforme l'aiguillage du tableau init aiguillage en texte +function encode_init_aig(index : integer) : string; +var s : string; +begin + if index=0 then exit; + s:=IntToSTR(aiguillage[index].Adresse)+','; + s:=s+IntToSTR(aiguillage[index].posInit)+','; + s:=s+IntToSTR(aiguillage[index].temps)+','; + s:=s+intToSTR(aiguillage[index].inversion); + encode_init_aig:=s; +end; + // transforme l'aiguillage du tableau aiguillage en texte function encode_aig(index : integer): string; var s : string; @@ -607,7 +641,6 @@ begin encode_aig:=s; end; - // transforme l'aiguillage des champs graphiques en texte function encode_aig_gfx : string; var s,ss : string; @@ -716,7 +749,7 @@ end; // transforme le signal du tableau feux[] en texte function encode_sig_feux(i : integer): string; var s : string; - adresse,aspect,j,k,NfeuxDir,CondCarre,l,nc : integer; + adresse,aspect,j,k,NfeuxDir,CondCarre,nc : integer; begin // adresse adresse:=feux[i].adresse; @@ -787,11 +820,9 @@ begin if k1 then begin - adresse:=StrToINT(copy(s,1,j-1));Delete(s,1,j); // adresse de feu + // adresse de feu + val(s,adresse,erreur); + if adresse=0 then begin affiche('Erreur ligne '+s,clred);exit;end; + Delete(s,1,j); feux[i].adresse:=adresse; j:=pos(',',s); if j>1 then @@ -819,7 +853,7 @@ begin begin delete(sa,1,1); j:=pos(',',s); - l:=StrToInt(sa); // nombre de feux du signal directionnel + val(sa,l,erreur); // nombre de feux du signal directionnel if l>6 then begin Affiche('Ligne '+s+' 6 feux maximum pour un panneau directionnel',clred); @@ -863,14 +897,15 @@ begin else // feu de signalisation--------------------------------- begin - asp:=StrToInt(sa); //aspect + val(sa,asp,erreur); //aspect feux[i].aspect:=asp;Delete(s,1,j); if (asp=0) or (asp=6) or (asp>9) then Affiche('Fichier config.cfg: configuration aspect ('+intToSTR(asp)+') feu incorrecte à la ligne '+chaine_signal,clRed); j:=pos(',',s); if j>1 then begin Feux[i].FeuBlanc:=(copy(s,1,j-1))='1';delete(s,1,j);end; j:=pos(',',s); - if j=0 then begin Feux[i].decodeur:=StrToInt(s);end else begin Feux[i].decodeur:=StrToInt(copy(s,1,j-1));delete(s,1,j);end; + val(s,Feux[i].decodeur,erreur); + if j<>0 then delete(s,1,j); feux[i].Adr_el_suiv1:=0;feux[i].Adr_el_suiv2:=0;feux[i].Adr_el_suiv3:=0;feux[i].Adr_el_suiv4:=0; feux[i].Btype_Suiv1:=0;feux[i].Btype_Suiv2:=0;feux[i].Btype_Suiv3:=0;feux[i].Btype_Suiv4:=0; feux[i].Adr_det1:=0;feux[i].Adr_det2:=0;feux[i].Adr_det3:=0;feux[i].Adr_det4:=0; @@ -1167,18 +1202,17 @@ begin copie_commentaire; // [section init] est copié ici - if pos(section_init,lowercase(s))=0 then writeln(fichierN,section_init); - writeln(fichierN,s); - // valeurs des initialisations - repeat - readln(fichier,s); + // valeurs des initialisations aiguillages + writeln(fichierN,section_init); + for i:=1 to MaxAiguillage do + begin + s:=encode_init_aig(i); writeln(fichierN,s); - continue:=s[1]<>'0'; - until not(continue); - copie_commentaire; - - closefile(fichier); - closefile(fichierN); + end; + writeln(fichierN,'0,0,0,0'); + + closefile(fichierN); // config-gl.tmp + closefile(fichier); // config-gl.cfg // ----------------config.cfg ---------------------------- try @@ -1194,13 +1228,7 @@ begin // entête copie_commentaire; - // 2 variables inutilisées - //writeln(fichierN,'Log=0'); - //copie_commentaire; - // fichier log - //writeln(fichierN,'TraceDet=0'); - //copie_commentaire; - // Raz Signaux + // Raz Signaux if Raz_Acc_signaux then s:='1' else s:='0'; writeln(fichierN,'RazSignaux='+s); //copie_commentaire; @@ -1272,7 +1300,7 @@ begin end; // sauvegarder la config dans les fichiers cfg -procedure Sauve_config; +function Sauve_config : boolean; var i,erreur : integer; s : string; ChangeCDM,changeInterface,changeUSB,change_srv : boolean; @@ -1282,48 +1310,48 @@ begin with FormConfig do begin s:=EditAdrIPCDM.text; - if not(IpOk(s)) then begin labelInfo.Caption:='Adresse IP CDM rail incorrecte';exit;end; + if not(IpOk(s)) then begin labelInfo.Caption:='Adresse IP CDM rail incorrecte';sauve_config:=false;exit;end; ChangeCDM:=s<>AdresseIPCDM; adresseIPCDM:=s; // contrôle port CDM val(EditPortCDM.Text,i,erreur); - if i>65535 then begin labelInfo.Caption:='Port CDM rail incorrect';exit;end; + if i>65535 then begin labelInfo.Caption:='Port CDM rail incorrect';sauve_config:=false;exit;end; changeCDM:=(portCDM<>i) or ChangeCDM; portCDM:=i; // contrôle adresse IP interface s:=EditIPLenz.text; - if not(IpOk(s)) and (s<>'0') then begin labelInfo.Caption:='Adresse IP Lenz incorrecte';exit;end; + if not(IpOk(s)) and (s<>'0') then begin labelInfo.Caption:='Adresse IP Lenz incorrecte';sauve_config:=false;exit;end; changeInterface:=s<>AdresseIP; AdresseIP:=s; // contrôle port interface val(EditPortLenz.Text,i,erreur); - if i>65535 then begin labelInfo.Caption:='Port Interface incorrect';exit;end; + if i>65535 then begin labelInfo.Caption:='Port Interface incorrect';sauve_config:=false;exit;end; changeInterface:=changeInterface or (i<>port); port:=i; Val(editTempoAig.Text,i,erreur); - if i>3000 then begin labelInfo.Caption:='Temporisation de séquencement incorrecte ';exit;end; + if i>3000 then begin labelInfo.Caption:='Temporisation de séquencement incorrecte ';sauve_config:=false;exit;end; Tempo_Aig:=i; // contrôle protocole interface COM3:57600,N,8,1,2 s:=EditComUSB.Text; - if not(config_com(s)) then begin labelInfo.Caption:='Protocole série USB Interface incorrect';exit;end; + if not(config_com(s)) then begin labelInfo.Caption:='Protocole série USB Interface incorrect';sauve_config:=false;exit;end; changeUSB:=portcom<>s; portcom:=s; val(EditTempoOctetUSB.text,i,erreur); - if erreur<>0 then begin labelInfo.Caption:='Valeur temporisation octet incorrecte';exit;end; + if erreur<>0 then begin labelInfo.Caption:='Valeur temporisation octet incorrecte';sauve_config:=false;exit;end; TempoOctet:=i; val(EditTempoReponse.text,i,erreur); - if erreur<>0 then begin labelInfo.Caption:='Valeur temporisation de réponse interface';exit;end; + if erreur<>0 then begin labelInfo.Caption:='Valeur temporisation de réponse interface';sauve_config:=false;exit;end; TimoutMaxInterface:=i; val(EditNbDetDist.text,i,erreur); - if (erreur<>0) or (i<3) then begin labelInfo.Caption:='Valeur nombre de détecteurs trop distants incorrecte';exit;end; + if (erreur<>0) or (i<3) then begin labelInfo.Caption:='Valeur nombre de détecteurs trop distants incorrecte';sauve_config:=false;exit;end; Nb_Det_Dist:=i; if RadioButton1.checked then Valeur_entete:=0; @@ -1402,18 +1430,19 @@ begin genere_config; Affiche('Configuration sauvegardée dans les fichiers',clLime); config_modifie:=false; + sauve_config:=true; end; procedure TFormConfig.ButtonAppliquerEtFermerClick(Sender: TObject); begin - sauve_config; - formConfig.close; - // TCO + if sauve_config then formConfig.close; + // TCO if avectco and not(entreeTCO) then begin //créée la fenêtre TCO non modale FormTCO:=TformTCO.Create(nil); FormTCO.show; + FormPrinc.ButtonAffTCO.Visible:=true; end; end; @@ -1438,7 +1467,8 @@ begin Label18.Visible:=false; GroupBoxPN.Visible:=false; GroupBoxAct.Visible:=false; - + GroupBoxRadio.Visible:=false; + EditP1.ReadOnly:=false; EditP2.ReadOnly:=false; EditP3.ReadOnly:=false; @@ -1502,19 +1532,30 @@ begin EditPointe_BG.Text:=''; EditDevie_HD.Text:=''; - lignecliquee:=0; - AncLigneCliquee:=-1; - + ligneclicSig:=0; + AncLigneClicSig:=-1; + ligneclicAct:=0; + AncLigneClicAct:=-1; + ligneclicAig:=0; + AncLigneClicAig:=-1; + lignecliqueePN:=0; + AncLigneCliqueePN:=-1; + // remplit les 4 fenêtres de config des aiguillages branches signaux, actionneurs // aiguillages RichAig.Clear; + RichInitAig.Clear; for i:=1 to MaxAiguillage do begin s:=encode_aig(i); RichAig.Lines.Add(s); RE_ColorLine(RichAig,RichAig.lines.count-1,ClAqua); - Aiguillage[Index_Aig(i)].modifie:=false; + Aiguillage[i].modifie:=false; + // valeurs d'init + s:=encode_init_aig(i); + RichInitAig.Lines.Add(s); + RE_ColorLine(RichInitAig,RichInitAig.lines.count-1,ClAqua); end; // branches @@ -1525,7 +1566,7 @@ begin s:=Branche[i]; RichBranche.Lines.Add(s); RE_ColorLine(RichBranche,RichBranche.lines.count-1,ClAqua); - end; + end; // signaux RichSig.clear; @@ -1538,15 +1579,15 @@ begin for i:=1 to NbreFeux do begin s:=encode_sig_feux(i); // encode la ligne depuis le tableau feux - //Affiche(s,clwhite); + //Affiche(s,clwhite); if s<>'' then begin RichSig.Lines.Add(s); RE_ColorLine(RichSig,RichSig.lines.count-1,ClAqua); - Feux[i].modifie:=false; - end; + Feux[i].modifie:=false; + end; end; - + // actionneurs Train ou accessoire RichAct.Clear; for i:=1 to maxTablo_act do @@ -1556,9 +1597,9 @@ begin begin RichAct.Lines.Add(s); RE_ColorLine(RichAct,RichAct.lines.count-1,ClAqua); - end; - end; - + end; + end; + // actionneurs PN RichPN.Clear; for i:=1 to NbrePN do @@ -1568,8 +1609,8 @@ begin begin RichPN.Lines.Add(s); RE_ColorLine(RichPN,RichPN.lines.count-1,ClAqua); - end; - end; + end; + end; //l'onglet affiché est sélectionné à l'appel de la fiche dans l'unité UnitPrinc clicListe:=false; @@ -1612,18 +1653,17 @@ begin B:='Z'; end; -// affiche le graphisme de l'aiguillage en fonction depuis le tablo en index +// affiche le graphisme de l'aiguillage en fonction du tablo en index procedure Aff_champs_aig_tablo(index : integer); -var Adresse,Adr2,id2,erreur : integer; +var Adresse,Adr2,id2,erreur,position : integer; tjd,tri,tjs : boolean; s,ss : string; B : char; begin - - s:=Uppercase(formConfig.RichAig.Lines[index-1]); + s:=Uppercase(formConfig.RichAig.Lines[index-1]); //Affiche(s,clLime); if s='' then exit; - + Val(s,Adresse,erreur); // Récupérer l'adresse de l'aiguillage if adresse=0 then exit; @@ -1642,9 +1682,9 @@ begin ImageAffiche.Picture.Bitmap.TransparentColor:=clblue; ImageAffiche.Transparent:=true; // tjd - if tjd or tjs then + if tjd or tjs then begin - if tjd then ComboBoxAig.ItemIndex:=1; + if tjd then ComboBoxAig.ItemIndex:=1; if tjs then ComboBoxAig.ItemIndex:=2; ImageAffiche.Picture.BitMap:=Imagetjd.Picture.Bitmap; labelBG.Caption:='S'; @@ -1751,6 +1791,15 @@ begin end; end; end; + + position:=aiguillage[index].posinit; + if position=const_inconnu then formconfig.EditDevDroit.text:='I'; + if position=const_droit then formconfig.EditDevDroit.text:='D'; + if position=const_devie then formconfig.EditDevDroit.text:='S'; + formconfig.EditTempo10.text:=InttoSTr(aiguillage[index].temps); + formconfig.EditTempo10.text:=InttoSTr(aiguillage[index].temps); + formconfig.CheckInvInit.Checked:=aiguillage[index].inversion=1; + clicListe:=false; end; @@ -1758,6 +1807,7 @@ procedure champs_type_pn; begin with formconfig do begin + GroupBoxRadio.Visible:=false; GroupBoxAct.Visible:=false; GroupBoxPN.Top:=24; GroupBoxPN.Left:=16; @@ -1772,7 +1822,10 @@ procedure champs_type_loco; begin with formconfig do begin - GroupBoxAct.Top:=104; + GroupBoxRadio.Visible:=true; + GroupBoxRadio.top:=20; + GroupBoxRadio.Left:=16; + GroupBoxAct.Top:=104; GroupBoxAct.Left:=16; CheckRaz.Visible:=false; GroupBoxAct.Caption:='Actionneur de fonction F de locomotive'; @@ -1782,13 +1835,16 @@ begin RadioButtonAccess.Checked:=false; GroupBoxAct.Visible:=true; GroupBoxPN.Visible:=false; - end; + end; end; procedure champs_type_act; begin with formconfig do begin + GroupBoxRadio.Visible:=true; + GroupBoxRadio.top:=20; + GroupBoxRadio.Left:=16; GroupBoxAct.Top:=104; GroupBoxAct.Left:=16; GroupBoxAct.Caption:='Actionneur d''accessoire'; @@ -1799,7 +1855,7 @@ begin RadioButtonAccess.Checked:=true; GroupBoxAct.Visible:=true; GroupBoxPN.Visible:=false; - end; + end; end; // mise à jour des champs du signal d'après le tableau feux @@ -1810,15 +1866,15 @@ begin if Affevt then affiche('Aff_champs_sig_feux('+intToSTR(index)+')',clyellow); i:=index; FormConfig.EditAdrSig.text:=InttoSTr(feux[i].adresse); - + with formconfig.ImageSignal do begin - Picture.Bitmap.TransparentMode:=tmAuto; + Picture.Bitmap.TransparentMode:=tmAuto; Picture.Bitmap.TransparentColor:=clblue; Transparent:=true; picture.Bitmap:=Select_dessin_feu(feux[i].aspect); - end; - + end; + with formconfig do begin MemoCarre.Lines.Clear; @@ -1876,29 +1932,23 @@ begin else begin EditDet4.Text:='';EditSuiv4.Text:='';end; checkVerrouCarre.Checked:=feux[i].VerrouCarre; - - // conditions supplémentaires du carré par aiguillages - CondCarre:=Length(feux[i].condcarre[1]); // nombre de conditions (nombre de parenthèses ex 3 pour (A21S,A6D)(A30S,A20D)(A1D,A2S,A3D) + + // conditions supplémentaires du carré par aiguillages l:=1; - if condCarre<>0 then - begin - while condCarre<>0 do + repeat + nc:=Length(feux[i].condcarre[l])-1 ; + s:=''; + for k:=1 to nc do begin - s:=''; - nc:=Length(feux[i].condcarre[l])-1 ; // nombre d'aiguillages dans la parenthèse A21,S,A6,D = 4 - for k:=1 to nc do - begin - s:=s+'A'+IntToSTR(feux[i].condcarre[l][k].Adresse)+feux[i].condcarre[l][k].PosAig; - if k6); + // scrolle le MemoCarre sur la première ligne + MemoCarre.SelStart:=0; + MemoCarre.Perform(EM_SCROLLCARET,0,0); end else begin // directionnel @@ -1927,81 +1977,66 @@ begin MemoCarre.SelStart:=0; MemoCarre.Perform(EM_SCROLLCARET,0,0); end; - end; + end; end; // mise à jour des champs graphiques des actionneurs d'après l'index du richAct Procedure aff_champs_act(i : integer); var etatact, adresse,sortie,fonction,tempo,access : integer; - s,s2,ss : string; + s,s2 : string; begin if affevt then affiche('Aff_champs_act('+intToSTR(i)+')',clyellow); - s:=Uppercase(FormConfig.RichAct.Lines[i]); - //Affiche(s,clyellow); + s:=Uppercase(FormConfig.RichAct.Lines[i]); if s='' then exit; - inc(i); // passer en index tablo - // actionneur fonction F locomotive ou Accessoire + + fonction:=Tablo_actionneur[i].fonction; + Access:=Tablo_actionneur[i].accessoire; + + // Actionneur fonction F loco + if Tablo_actionneur[i].loco then + begin + Formconfig.radioButtonLoc.Checked:=true; + Formconfig.radioButtonAccess.Checked:=false; + etatAct:=Tablo_actionneur[i].etat ; + //etatFonc:=Tablo_actionneur[i]. + Adresse:=Tablo_actionneur[i].actionneur; + s2:=Tablo_actionneur[i].train; + tempo:=tablo_actionneur[i].Tempo; with formconfig do begin - GroupBoxAct.Top:=104; - GroupBoxAct.Left:=16; - - GroupBoxact.Visible:=true; - GroupBoxPN.Visible:=false; + champs_type_loco; + EditAct.text:=IntToSTR(Adresse); + editEtatActionneur.Text:=IntToSTR(etatAct); + EditTrain.Text:=s2; + editFonctionAccess.Text:=intToSTR(fonction); + editTempo.Text:=intToSTR(tempo); end; - - fonction:=Tablo_actionneur[i].fonction; - Access:=Tablo_actionneur[i].accessoire; + end; - // Actionneur fonction F loco - if Tablo_actionneur[i].loco then + // Actionneur accessoire + if Tablo_actionneur[i].act then + begin + champs_type_act; + Formconfig.radioButtonLoc.Checked:=false; + Formconfig.radioButtonAccess.Checked:=true; + etatAct:=Tablo_actionneur[i].etat ; + Adresse:=Tablo_actionneur[i].actionneur; + sortie:=Tablo_actionneur[i].sortie; + s2:=Tablo_actionneur[i].train; + tempo:=tablo_actionneur[i].Tempo; + with formconfig do begin - Formconfig.radioButtonLoc.Checked:=true; - Formconfig.radioButtonAccess.Checked:=false; - etatAct:=Tablo_actionneur[i].etat ; - //etatFonc:=Tablo_actionneur[i]. - Adresse:=Tablo_actionneur[i].actionneur; - s2:=Tablo_actionneur[i].train; - tempo:=tablo_actionneur[i].Tempo; - with formconfig do - begin - champs_type_loco; - - EditAct.text:=IntToSTR(Adresse); - editEtatActionneur.Text:=IntToSTR(etatAct); - EditTrain.Text:=s2; - editFonctionAccess.Text:=intToSTR(fonction); - //editEtat.Text:=intToSTR(etatAct); - editTempo.Text:=intToSTR(tempo); - end; - end; - - // Actionneur accessoire - if Tablo_actionneur[i].act then - begin - Formconfig.radioButtonLoc.Checked:=false; - Formconfig.radioButtonAccess.Checked:=true; - etatAct:=Tablo_actionneur[i].etat ; - Adresse:=Tablo_actionneur[i].actionneur; - sortie:=Tablo_actionneur[i].sortie; - s2:=Tablo_actionneur[i].train; - tempo:=tablo_actionneur[i].Tempo; - with formconfig do - begin - Champs_type_act; - - EditAct.text:=IntToSTR(Adresse); - CheckRaz.Checked:=Tablo_actionneur[i].Raz; - EditTrain.Text:=s2; - EditEtatActionneur.Text:=IntToSTR(etatAct); - editFonctionAccess.Text:=intToSTR(Access); - editEtatFoncSortie.Text:=intToSTR(sortie); - editTempo.Text:=intToSTR(tempo); - end; - end; - ss:='Actionneur '+InttoSTr(Adresse); + EditAct.text:=IntToSTR(Adresse); + CheckRaz.Checked:=Tablo_actionneur[i].Raz; + EditTrain.Text:=s2; + EditEtatActionneur.Text:=IntToSTR(etatAct); + editFonctionAccess.Text:=intToSTR(Access); + editEtatFoncSortie.Text:=intToSTR(sortie); + editTempo.Text:=intToSTR(tempo); + end; + end; end; // affiche les champs de l'actionneur PN en fonction du tableau en fonction de l'index du richedit @@ -2011,17 +2046,13 @@ var adresse,erreur,v : integer; s : string; begin if affevt then affiche('Aff_champs_PN('+intToSTR(i)+')',clyellow); - s:=Uppercase(FormConfig.RichPN.Lines[i]); + s:=Uppercase(FormConfig.RichPN.Lines[i]); if s='' then exit; - inc(i); // passer en index tableau - + // actionneur passage à niveau - if s[1]='(' then + if s[1]='(' then begin - with formconfig do - begin - champs_type_pn; - end; + champs_type_pn; // trouver l'index dans le tableau i:=pos('PN(',s); delete(s,1,i+2); @@ -2048,29 +2079,16 @@ begin begin EditV2F.text:=intToSTR(Tablo_PN[i].voie[2].ActFerme); EditV2O.text:=intToSTR(Tablo_PN[i].voie[2].ActOuvre); - { EditV2F.Visible:=true; - EditV2O.Visible:=true; - labelV2.Visible:=true;} end; if v>=3 then begin EditV3F.text:=intToSTR(Tablo_PN[i].voie[3].ActFerme); EditV3O.text:=intToSTR(Tablo_PN[i].voie[3].ActOuvre); - { EditV3F.Visible:=true; - EditV3O.Visible:=true; - labelV3.visible:=true;} end; - if v<3 then + if v>=4 then begin - { EditV3F.Visible:=false; - EditV3O.Visible:=false; - labelV3.visible:=false; } - end; - if v<2 then - begin - { EditV2F.Visible:=false; - EditV2O.Visible:=false; - labelV2.visible:=false; } + EditV4F.text:=intToSTR(Tablo_PN[i].voie[4].ActFerme); + EditV4O.text:=intToSTR(Tablo_PN[i].voie[4].ActOuvre); end; end; end @@ -2079,19 +2097,12 @@ end; procedure TFormConfig.PageControlChange(Sender: TObject); begin - lignecliquee:=-1; - anclignecliquee:=-1; - lignecliqueePN:=-1; - anclignecliqueePN:=-1; - - if PageControl.ActivePage=TabSheetAig then - begin - end; + end; // cliqué sur liste aiguillages procedure TFormConfig.RichAigMouseDown(Sender: TObject;Button: TMouseButton; Shift: TShiftState; X, Y: Integer); -var lc,ancAdresse,adresse,erreur : integer; +var i,lc,adresse,erreur : integer; s : string; begin clicliste:=true; @@ -2103,26 +2114,27 @@ begin //Affiche('numéro de la ligne cliquée '+intToStr(lc),clyellow); s:=Uppercase(Lines[lc]); // ligne cliquée if s='' then exit; - + Aig_supprime:=Aiguillage[lc+1]; // sauvegarde - AncLigneCliquee:=LigneCliquee; - ligneCliquee:=lc; - - if AncLigneCliquee<>-1 then + AncligneclicAig:=ligneclicAig; + ligneclicAig:=lc; + + if AncligneclicAig<>-1 then begin - val(FormConfig.RichAig.Lines[AncLigneCliquee],AncAdresse,erreur); - if aiguillage[lignecliquee+1].modifie then RE_ColorLine(Formconfig.RichAig,AncligneCliquee,ClWhite) else - RE_ColorLine(Formconfig.RichAig,AncligneCliquee,ClAqua); - end; + if aiguillage[ligneclicAig+1].modifie then RE_ColorLine(Formconfig.RichAig,AncligneclicAig,ClWhite) else + RE_ColorLine(Formconfig.RichAig,AncligneclicAig,ClAqua); + RE_ColorLine(Formconfig.RichInitAig,AncligneclicAig,ClAqua); + end; end; - Val(s,Adresse,erreur); // Adresse de l'aguillage if adresse=0 then exit; - RE_ColorLine(Formconfig.RichAig,ligneCliquee,Clyellow); + RE_ColorLine(Formconfig.RichAig,ligneclicAig,Clyellow); + i:=index_aig(Adresse); + RE_ColorLine(Formconfig.RichInitAig,i-1,Clyellow); - aff_champs_Aig_tablo(lignecliquee+1); + aff_champs_Aig_tablo(i); clicliste:=false; end; @@ -2134,36 +2146,36 @@ var s : string; begin if clicliste then exit; if affevt then affiche('Evt change HG',clyellow); - + if FormConfig.PageControl.ActivePage=FormConfig.TabSheetAig then with Formconfig do begin - s:=formconfig.RichAig.Lines[lignecliquee]; - Val(s,adrAig,erreur); + s:=formconfig.RichAig.Lines[ligneclicAig]; + Val(s,adrAig,erreur); //vérifier la syntaxe s:=Edit_HG.text; decodeAig(s,adr,B); - if ((B='S') or (B='P') or (B='D') or (B=#0) or (b='Z')) and (s<>'') then + if ((B='S') or (B='P') or (B='D') or (B=#0) or (b='Z')) and (s<>'') then begin - RE_ColorLine(RichAig,ligneCliquee,ClWhite); + RE_ColorLine(RichAig,ligneclicAig,ClWhite); Index:=Index_Aig(AdrAig); Aiguillage[index].modifie:=true; LabelInfo.caption:=''; // modifier la base de données de l'aiguillage if b=#0 then b:='Z'; - + Aiguillage[index].Adroit:=adr; Aiguillage[index].AdroitB:=B; - + // réencoder la ligne s:=encode_aig(index); - formconfig.RichAig.Lines[lignecliquee]:=s; + formconfig.RichAig.Lines[ligneclicAig]:=s; labelLigne.Caption:=s; end else LabelInfo.caption:='Erreur pointe aiguillage '+intToSTR(AdrAig); - end; - + end; + end; // on change la valeur de la description de la déviation de l'aiguillage @@ -2180,7 +2192,7 @@ begin if FormConfig.PageControl.ActivePage=FormConfig.TabSheetAig then with Formconfig do begin - s:=formconfig.RichAig.Lines[lignecliquee]; + s:=formconfig.RichAig.Lines[ligneclicAig]; Val(s,adrAig,erreur); //vérifier la syntaxe de P s:=EditDevie_HD.text; @@ -2194,7 +2206,7 @@ begin if ((B='S') or (B='P') or (B='D') or (B=#0) or (b='Z')) and (s<>'') then begin // aiguillage normal ou triple - RE_ColorLine(RichAig,ligneCliquee,ClWhite); + RE_ColorLine(RichAig,ligneclicAig,ClWhite); Aiguillage[index].modifie:=true; LabelInfo.caption:=''; // modifier la base de données de l'aiguillage @@ -2203,7 +2215,7 @@ begin Aiguillage[Index].ADevieB:=B; // réencoder la ligne s:=encode_aig(Index); - formconfig.RichAig.Lines[lignecliquee]:=s; + formconfig.RichAig.Lines[ligneclicAig]:=s; labelLigne.Caption:=s; end else @@ -2232,7 +2244,6 @@ end; procedure change_Droit; var AdrAig,adr,erreur,index,modele,adr2 : integer; b : char; - tjd : boolean; s : string; begin // cliqué sur le edit droit aiguillage @@ -2243,7 +2254,7 @@ begin if FormConfig.PageControl.ActivePage=FormConfig.TabSheetAig then with Formconfig do begin - s:=formconfig.RichAig.Lines[lignecliquee]; + s:=formconfig.RichAig.Lines[ligneclicAig]; Val(s,adrAig,erreur); //vérifier la syntaxe de P s:=EditDroit_BD.text; @@ -2253,15 +2264,9 @@ begin modele:=aiguillage[index].modele; if (modele=1) or (modele=4) then begin - if ((B='S') or (B='P') or (B='D') or (B=#0) or (b='Z')) and (s<>'') then + if ((B='S') or (B='P') or (B='D') or (B=#0) or (b='Z')) and (s<>'') then begin - tjd:=pos('TJD',s)<>0; - if tjd then - begin - val(EditP1.Text,AdrAig,erreur); // adresse de pointe de la tjd = adresse à utiliser - end; - - RE_ColorLine(RichAig,ligneCliquee,ClWhite); + RE_ColorLine(RichAig,ligneclicAig,ClWhite); Aiguillage[Index].modifie:=true; LabelInfo.caption:=''; // modifier la base de données de l'aiguillage @@ -2270,14 +2275,14 @@ begin Aiguillage[index].ADroitB:=B; // réencoder la ligne s:=encode_aig(Index); - formconfig.RichAig.Lines[lignecliquee]:=s; + formconfig.RichAig.Lines[ligneclicAig]:=s; labelLigne.Caption:=s; end else begin LabelInfo.caption:='Erreur droit aiguillage '+intToSTR(AdrAig); end; - end; + end; if (modele=2) or (modele=3) then begin // TJD/TJS @@ -2308,7 +2313,7 @@ begin if FormConfig.PageControl.ActivePage=FormConfig.TabSheetAig then with Formconfig do begin - s:=formconfig.RichAig.Lines[lignecliquee]; + s:=formconfig.RichAig.Lines[ligneclicAig]; Val(s,adrAig,erreur); //vérifier la syntaxe de P @@ -2316,10 +2321,10 @@ begin decodeAig(s,adr,B); if ((B='S') or (B='P') or (B='D') or (B=#0) or (b='Z')) and (s<>'') then begin - // RichAig.SelStart:=Perform(EM_LINEINDEX,ligneCliquee,0); // début de la sélection + // RichAig.SelStart:=Perform(EM_LINEINDEX,ligneclicAig,0); // début de la sélection // RichAig.SelLength:=Length(s) ; // fin de la sélection //SetFocus; - RE_ColorLine(RichAig,ligneCliquee,ClWhite); + RE_ColorLine(RichAig,ligneclicAig,ClWhite); Index:=Index_Aig(AdrAig); normal:=aiguillage[index].modele=1; tjd:=aiguillage[index].modele=2; @@ -2337,7 +2342,7 @@ begin Aiguillage[index].APointeB:=B; // réencoder la ligne s:=encode_aig(index); - formconfig.RichAig.Lines[lignecliquee]:=s; + formconfig.RichAig.Lines[ligneclicAig]:=s; labelLigne.Caption:=s; end; if tjd or tjs then @@ -2345,9 +2350,8 @@ begin Aiguillage[index].ADevie:=adr; Aiguillage[index].ADevieB:=B; s:=encode_aig(index); - formconfig.RichAig.Lines[lignecliquee]:=s; + formconfig.RichAig.Lines[ligneclicAig]:=s; labelLigne.Caption:=s; - end; end else @@ -2383,7 +2387,7 @@ begin if FormConfig.PageControl.ActivePage=FormConfig.TabSheetAig then with Formconfig do begin - s:=formconfig.RichAig.Lines[lignecliquee]; + s:=formconfig.RichAig.Lines[ligneclicAig]; Val(s,adrAig,erreur); //vérifier la syntaxe de P s:=EditDevieS2.text; @@ -2391,7 +2395,7 @@ begin if ((B='S') or (B='P') or (B='D') or (B=#0) or (b='Z')) and (s<>'') then begin - RE_ColorLine(RichAig,ligneCliquee,ClWhite); + RE_ColorLine(RichAig,ligneclicAig,ClWhite); Index:=Index_Aig(AdrAig); Aiguillage[index].modifie:=true; LabelInfo.caption:=''; @@ -2401,7 +2405,7 @@ begin Aiguillage[index].ADevie2B:=B; // réencoder la ligne s:=encode_aig(index); - formconfig.RichAig.Lines[lignecliquee]:=s; + formconfig.RichAig.Lines[ligneclicAig]:=s; labelLigne.Caption:=s; end else @@ -2419,12 +2423,12 @@ begin // récupérer l'adresse de l'aiguillage cliqué if clicliste then exit; if affevt then affiche('Evt change pointe',clyellow); - s:=formconfig.RichAig.Lines[lignecliquee]; + s:=formconfig.RichAig.Lines[ligneclicAig]; Val(s,adrAig,erreur); if checkInverse.Checked then aiguillage[Index_Aig(adraig)].InversionCDM:=1 else aiguillage[Index_Aig(adraig)].InversionCDM:=0; // réencoder la ligne s:=encode_aig(Index_Aig(AdrAig)); - formconfig.RichAig.Lines[lignecliquee]:=s; + formconfig.RichAig.Lines[ligneclicAig]:=s; labelLigne.Caption:=s; end; @@ -2434,14 +2438,14 @@ var AdrAig,erreur,index : integer; begin if clicliste then exit; if affevt then affiche('Evt RadioBouton sans vitesse',clyellow); - s:=formconfig.RichAig.Lines[lignecliquee]; + s:=formconfig.RichAig.Lines[ligneclicAig]; Val(s,adrAig,erreur); if AdrAig=0 then exit; index:=Index_Aig(AdrAig); aiguillage[index].vitesse:=0; aiguillage[index].modifie:=true; s:=encode_aig(index); - formconfig.RichAig.Lines[lignecliquee]:=s; + formconfig.RichAig.Lines[ligneclicAig]:=s; labelLigne.Caption:=s; end; @@ -2451,14 +2455,14 @@ var AdrAig,erreur,index : integer; begin if clicliste then exit; if affevt then affiche('Evt RadioBouton vitesse 30',clyellow); - s:=formconfig.RichAig.Lines[lignecliquee]; + s:=formconfig.RichAig.Lines[ligneclicAig]; Val(s,adrAig,erreur); if AdrAig=0 then exit; index:=Index_Aig(AdrAig); aiguillage[index].vitesse:=30; aiguillage[index].modifie:=true; s:=encode_aig(index); - formconfig.RichAig.Lines[lignecliquee]:=s; + formconfig.RichAig.Lines[ligneclicAig]:=s; labelLigne.Caption:=s; end; @@ -2468,14 +2472,14 @@ var AdrAig,erreur,index : integer; begin if clicliste then exit; if affevt then affiche('Evt RadioBouton vitesse 60',clyellow); - s:=formconfig.RichAig.Lines[lignecliquee]; + s:=formconfig.RichAig.Lines[ligneclicAig]; Val(s,adrAig,erreur); if AdrAig=0 then exit; index:=Index_Aig(AdrAig); aiguillage[Index].vitesse:=60; aiguillage[Index].modifie:=true; s:=encode_aig(index); - formconfig.RichAig.Lines[lignecliquee]:=s; + formconfig.RichAig.Lines[ligneclicAig]:=s; labelLigne.Caption:=s; end; @@ -2486,13 +2490,13 @@ begin // Affiche(IntToStr(ComboBoxDec.ItemIndex),clyellow); if clicListe then exit; - if NbreFeux-1 then + if AncligneclicSig<>-1 then begin - val(FormConfig.RichSig.Lines[AncLigneCliquee],AncAdresse,erreur); - if feux[lignecliquee+1].modifie then RE_ColorLine(Formconfig.RichSig,AncligneCliquee,ClWhite) else - RE_ColorLine(Formconfig.RichSig,AncligneCliquee,ClAqua); - end; + val(FormConfig.RichSig.Lines[AncLigneClicSig],AncAdresse,erreur); + if feux[ligneClicSig+1].modifie then RE_ColorLine(Formconfig.RichSig,AncLigneClicSig,ClWhite) else + RE_ColorLine(Formconfig.RichSig,AncLigneClicSig,ClAqua); + end; end; - + Val(s,Adresse,erreur); // Adresse du signal if adresse=0 then exit; - RE_ColorLine(Formconfig.RichSig,ligneCliquee,Clyellow); + RE_ColorLine(Formconfig.RichSig,ligneClicSig,Clyellow); aff_champs_sig_feux(lc+1); clicliste:=false; @@ -2538,8 +2541,8 @@ procedure TFormConfig.EditDet1Change(Sender: TObject); var s : string; i,erreur : integer; begin - if clicliste or (lignecliquee<0) then exit; - s:=RichSig.Lines[lignecliquee]; + if clicliste or (ligneClicSig<0) then exit; + s:=RichSig.Lines[ligneClicSig]; if affevt then Affiche('Evt Détecteur 1',clOrange); if FormConfig.PageControl.ActivePage=FormConfig.TabSheetSig then @@ -2549,11 +2552,11 @@ begin Val(s,i,erreur); if erreur<>0 then begin LabelInfo.caption:='Erreur détecteur1 ';exit;end; LabelInfo.caption:=' '; - feux[lignecliquee+1].Adr_det1:=i; - maj_hint_feu(lignecliquee+1); - s:=encode_sig_feux(lignecliquee+1); - RichSig.Lines[lignecliquee]:=s; - feux[lignecliquee+1].modifie:=true; + feux[ligneClicSig+1].Adr_det1:=i; + maj_hint_feu(ligneClicSig+1); + s:=encode_sig_feux(ligneClicSig+1); + RichSig.Lines[ligneClicSig]:=s; + feux[ligneClicSig+1].modifie:=true; end; end; @@ -2561,7 +2564,7 @@ procedure TFormConfig.EditSuiv1Change(Sender: TObject); var s : string; i,erreur : integer; begin - if clicliste or (comboBoxAsp.Itemindex>=6) or (lignecliquee<0) then exit; + if clicliste or (comboBoxAsp.Itemindex>=6) or (ligneClicSig<0) then exit; if affevt then Affiche('Evt suivant1',clOrange); if FormConfig.PageControl.ActivePage=FormConfig.TabSheetSig then with Formconfig do @@ -2573,19 +2576,19 @@ begin begin if (s[erreur]='A') and (erreur=1) then begin - feux[lignecliquee+1].Btype_suiv1:=2; // type de l'élément suivant (1=détecteur 2=aig ou TJD ou TJS 4=tri + feux[ligneClicSig+1].Btype_suiv1:=2; // type de l'élément suivant (1=détecteur 2=aig ou TJD ou TJS 4=tri delete(s,erreur,1); Val(s,i,erreur); end else begin LabelInfo.caption:='Erreur élément suivant 1';exit;end; end - else feux[lignecliquee+1].Btype_suiv1:=1; + else feux[ligneClicSig+1].Btype_suiv1:=1; LabelInfo.caption:=' '; - feux[lignecliquee+1].Adr_el_suiv1:=i; - s:=encode_sig_feux(lignecliquee+1); - RichSig.Lines[lignecliquee]:=s; - maj_hint_feu(lignecliquee+1); + feux[ligneClicSig+1].Adr_el_suiv1:=i; + s:=encode_sig_feux(ligneClicSig+1); + RichSig.Lines[ligneClicSig]:=s; + maj_hint_feu(ligneClicSig+1); end; end; @@ -2593,7 +2596,7 @@ procedure TFormConfig.EditDet2Change(Sender: TObject); var s : string; i,erreur : integer; begin - if clicliste then exit; + if clicliste or (ligneClicSig<0) then exit; if affevt then Affiche('Evt detecteur 2',clOrange); if FormConfig.PageControl.ActivePage=FormConfig.TabSheetSig then @@ -2604,26 +2607,26 @@ begin Val(s,i,erreur); if erreur<>0 then begin LabelInfo.caption:='Erreur détecteur2 ';exit;end; LabelInfo.caption:=' '; - feux[lignecliquee+1].Adr_det2:=i; - maj_hint_feu(lignecliquee+1); - s:=encode_sig_feux(lignecliquee+1); - RichSig.Lines[lignecliquee]:=s; - feux[lignecliquee+1].modifie:=true; + feux[ligneClicSig+1].Adr_det2:=i; + maj_hint_feu(ligneClicSig+1); + s:=encode_sig_feux(ligneClicSig+1); + RichSig.Lines[ligneClicSig]:=s; + feux[ligneClicSig+1].modifie:=true; end; end; procedure TFormConfig.CheckVerrouCarreClick(Sender: TObject); var s : string; begin - if clicliste then exit; + if clicliste or (ligneClicSig<0) then exit; if affevt then Affiche('Evt Verrou carré',clOrange); if FormConfig.PageControl.ActivePage=FormConfig.TabSheetSig then begin - feux[lignecliquee+1].VerrouCarre:=checkVerrouCarre.Checked; - s:=encode_sig_feux(lignecliquee+1); - RichSig.Lines[lignecliquee]:=s; - feux[lignecliquee+1].modifie:=true; + feux[ligneClicSig+1].VerrouCarre:=checkVerrouCarre.Checked; + s:=encode_sig_feux(ligneClicSig+1); + RichSig.Lines[ligneClicSig]:=s; + feux[ligneClicSig+1].modifie:=true; end; end; @@ -2631,7 +2634,7 @@ procedure TFormConfig.EditSuiv2Change(Sender: TObject); var s : string; erreur,i: integer; begin - if clicliste or (comboBoxAsp.Itemindex>=6) then exit; + if clicliste or (comboBoxAsp.Itemindex>=6) or (ligneClicSig<0) then exit; if affevt then Affiche('Evt Element suivant2',clOrange); if FormConfig.PageControl.ActivePage=FormConfig.TabSheetSig then @@ -2644,18 +2647,18 @@ begin begin if (s[erreur]='A') and (erreur=1) then begin - feux[lignecliquee+1].Btype_suiv2:=2; // type de l'élément suivant (1=détecteur 2=aig ou TJD ou TJS 4=tri + feux[ligneClicSig+1].Btype_suiv2:=2; // type de l'élément suivant (1=détecteur 2=aig ou TJD ou TJS 4=tri delete(s,erreur,1); Val(s,i,erreur); end else begin LabelInfo.caption:='Erreur élément suivant 2';exit;end; end - else feux[lignecliquee+1].Btype_suiv2:=1; + else feux[ligneClicSig+1].Btype_suiv2:=1; LabelInfo.caption:=' '; - feux[lignecliquee+1].Adr_el_suiv2:=i; - s:=encode_sig_feux(lignecliquee+1); - RichSig.Lines[lignecliquee]:=s; + feux[ligneClicSig+1].Adr_el_suiv2:=i; + s:=encode_sig_feux(ligneClicSig+1); + RichSig.Lines[ligneClicSig]:=s; end; end; @@ -2664,7 +2667,7 @@ procedure TFormConfig.EditDet3Change(Sender: TObject); var s : string; i,erreur : integer; begin - if clicliste then exit; + if clicliste or (ligneClicSig<0) then exit; if affevt then Affiche('Evt Detecteur 3',clOrange); if FormConfig.PageControl.ActivePage=FormConfig.TabSheetSig then with Formconfig do @@ -2673,11 +2676,11 @@ begin if s='' then exit; Val(s,i,erreur);if erreur<>0 then begin LabelInfo.caption:='Erreur détecteur3 ';exit;end; LabelInfo.caption:=' '; - feux[lignecliquee+1].Adr_det3:=i; - maj_hint_feu(lignecliquee+1); - s:=encode_sig_feux(lignecliquee+1); - RichSig.Lines[lignecliquee]:=s; - feux[lignecliquee+1].modifie:=true; + feux[ligneClicSig+1].Adr_det3:=i; + maj_hint_feu(ligneClicSig+1); + s:=encode_sig_feux(ligneClicSig+1); + RichSig.Lines[ligneClicSig]:=s; + feux[ligneClicSig+1].modifie:=true; end; end; @@ -2685,7 +2688,7 @@ procedure TFormConfig.EditSuiv3Change(Sender: TObject); var s : string; erreur,i : integer; begin - if clicliste or (comboBoxAsp.Itemindex>=6) then exit; + if clicliste or (comboBoxAsp.Itemindex>=6) or (ligneClicSig<0) then exit; if FormConfig.PageControl.ActivePage=FormConfig.TabSheetSig then with Formconfig do @@ -2697,18 +2700,18 @@ begin begin if (s[erreur]='A') and (erreur=1) then begin - feux[lignecliquee+1].Btype_suiv3:=2; // type de l'élément suivant (1=détecteur 2=aig ou TJD ou TJS 4=tri + feux[ligneClicSig+1].Btype_suiv3:=2; // type de l'élément suivant (1=détecteur 2=aig ou TJD ou TJS 4=tri delete(s,erreur,1); Val(s,i,erreur); end else begin LabelInfo.caption:='Erreur élément suivant 3';exit;end; end - else feux[lignecliquee+1].Btype_suiv3:=1; + else feux[ligneClicSig+1].Btype_suiv3:=1; LabelInfo.caption:=' '; - feux[lignecliquee+1].Adr_el_suiv3:=i; - s:=encode_sig_feux(lignecliquee+1); - RichSig.Lines[lignecliquee]:=s; + feux[ligneClicSig+1].Adr_el_suiv3:=i; + s:=encode_sig_feux(ligneClicSig+1); + RichSig.Lines[ligneClicSig]:=s; end; end; @@ -2716,7 +2719,7 @@ procedure TFormConfig.EditDet4Change(Sender: TObject); var s : string; i,erreur : integer; begin - if clicliste then exit; + if clicliste or (ligneClicSig<0) then exit; if FormConfig.PageControl.ActivePage=FormConfig.TabSheetSig then with Formconfig do @@ -2725,11 +2728,11 @@ begin if s='' then exit; Val(s,i,erreur);if erreur<>0 then begin LabelInfo.caption:='Erreur détecteur4 ';exit;end; LabelInfo.caption:=' '; - feux[lignecliquee+1].Adr_det4:=i; - maj_hint_feu(lignecliquee+1); - s:=encode_sig_feux(lignecliquee+1); - RichSig.Lines[lignecliquee]:=s; - feux[lignecliquee+1].modifie:=true; + feux[ligneClicSig+1].Adr_det4:=i; + maj_hint_feu(ligneClicSig+1); + s:=encode_sig_feux(ligneClicSig+1); + RichSig.Lines[ligneClicSig]:=s; + feux[ligneClicSig+1].modifie:=true; end; end; @@ -2737,7 +2740,7 @@ procedure TFormConfig.EditSuiv4Change(Sender: TObject); var s : string; erreur,i : integer; begin - if clicliste or (comboBoxAsp.Itemindex>=6) then exit; + if clicliste or (comboBoxAsp.Itemindex>=6) or (ligneClicSig<0) then exit; if FormConfig.PageControl.ActivePage=FormConfig.TabSheetSig then with Formconfig do @@ -2749,18 +2752,18 @@ begin begin if (s[erreur]='A') and (erreur=1) then begin - feux[lignecliquee+1].Btype_suiv4:=2; // type de l'élément suivant (1=détecteur 2=aig ou TJD ou TJS 4=tri + feux[ligneClicSig+1].Btype_suiv4:=2; // type de l'élément suivant (1=détecteur 2=aig ou TJD ou TJS 4=tri delete(s,erreur,1); Val(s,i,erreur); end else begin LabelInfo.caption:='Erreur élément suivant 4';exit;end; end - else feux[lignecliquee+1].Btype_suiv1:=1; + else feux[ligneClicSig+1].Btype_suiv1:=1; LabelInfo.caption:=' '; - feux[lignecliquee+1].Adr_el_suiv4:=i; - s:=encode_sig_feux(lignecliquee+1); - RichSig.Lines[lignecliquee]:=s; + feux[ligneClicSig+1].Adr_el_suiv4:=i; + s:=encode_sig_feux(ligneClicSig+1); + RichSig.Lines[ligneClicSig]:=s; end; end; @@ -2782,9 +2785,9 @@ begin LabelInfo.caption:='Erreur adresse actionneur';exit end else LabelInfo.caption:=' '; - tablo_actionneur[lignecliquee+1].actionneur:=act; - s:=encode_act_loc(lignecliquee+1); - RichAct.Lines[lignecliquee]:=s; + tablo_actionneur[ligneClicAct+1].actionneur:=act; + s:=encode_act_loc(ligneClicAct+1); + RichAct.Lines[ligneClicAct]:=s; end; end; end; @@ -2794,7 +2797,6 @@ procedure TFormConfig.RichActMouseDown(Sender: TObject; var ligne : integer; begin clicliste:=true; - GroupBoxRadio.Visible:=true; LabelInfo.caption:=''; with RichAct do @@ -2802,11 +2804,11 @@ begin ligne:=Perform(EM_LINEFROMCHAR,-1,0); // numéro de la lignée cliquée if ligne-1 then RE_ColorLine(RichAct,AncligneCliquee,ClAqua); - AncLigneCliquee:=Ligne; - ligneCliquee:=ligne; - RE_ColorLine(Formconfig.RichAct,LigneCliquee,ClYellow); - Aff_champs_Act(lignecliquee); + if AncligneClicAct<>-1 then RE_ColorLine(RichAct,AncligneClicAct,ClAqua); + AncligneClicAct:=Ligne; + ligneClicAct:=ligne; + RE_ColorLine(Formconfig.RichAct,ligneClicAct,ClYellow); + Aff_champs_Act(ligneClicAct); end; end; clicliste:=false; @@ -2830,9 +2832,9 @@ begin LabelInfo.caption:='Erreur état actionneur';exit end else LabelInfo.caption:=' '; - tablo_actionneur[lignecliquee+1].etat:=etat; - s:=encode_act_loc(lignecliquee+1); - RichAct.Lines[lignecliquee]:=s; + tablo_actionneur[ligneClicAct+1].etat:=etat; + s:=encode_act_loc(ligneClicAct+1); + RichAct.Lines[ligneClicAct]:=s; end; end; end; @@ -2853,9 +2855,9 @@ begin LabelInfo.caption:='Erreur train';exit end else LabelInfo.caption:=' '; - tablo_actionneur[lignecliquee+1].train:=train; - s:=encode_act_loc(lignecliquee+1); - RichAct.Lines[lignecliquee]:=s; + tablo_actionneur[ligneClicAct+1].train:=train; + s:=encode_act_loc(ligneClicAct+1); + RichAct.Lines[ligneClicAct]:=s; end; end; end; @@ -2878,11 +2880,11 @@ begin LabelInfo.caption:='Erreur fonction actionneur';exit end else LabelInfo.caption:=' '; - if radioButtonLoc.Checked then tablo_actionneur[lignecliquee+1].fonction:=fonction; - if RadioButtonAccess.Checked then Tablo_Actionneur[lignecliquee+1].accessoire:=fonction; + if radioButtonLoc.Checked then tablo_actionneur[ligneClicAct+1].fonction:=fonction; + if RadioButtonAccess.Checked then Tablo_Actionneur[ligneClicAct+1].accessoire:=fonction; - s:=encode_act_loc(lignecliquee+1); - RichAct.Lines[lignecliquee]:=s; + s:=encode_act_loc(ligneClicAct+1); + RichAct.Lines[ligneClicAct]:=s; end; end; end; @@ -2905,9 +2907,9 @@ begin LabelInfo.caption:='Erreur Etat actionneur';exit end else LabelInfo.caption:=' '; - tablo_actionneur[lignecliquee+1].sortie:=etat; - s:=encode_act_loc(lignecliquee+1); - RichAct.Lines[lignecliquee]:=s; + tablo_actionneur[ligneClicAct+1].sortie:=etat; + s:=encode_act_loc(ligneClicAct+1); + RichAct.Lines[ligneClicAct]:=s; end; end; @@ -2931,9 +2933,9 @@ begin LabelInfo.caption:='Erreur Tempo actionneur';exit end else LabelInfo.caption:=' '; - tablo_actionneur[lignecliquee+1].tempo:=tempo; - s:=encode_act_loc(lignecliquee+1); - RichAct.Lines[lignecliquee]:=s; + tablo_actionneur[ligneClicAct+1].tempo:=tempo; + s:=encode_act_loc(ligneClicAct+1); + RichAct.Lines[ligneClicAct]:=s; end; end; end; @@ -2948,9 +2950,9 @@ begin begin if radioButtonAccess.Checked then begin - tablo_actionneur[lignecliquee+1].raz:=CheckRAZ.checked; - s:=encode_act_loc(lignecliquee+1); - RichAct.Lines[lignecliquee]:=s; + tablo_actionneur[ligneClicAct+1].raz:=CheckRAZ.checked; + s:=encode_act_loc(ligneClicAct+1); + RichAct.Lines[ligneClicAct]:=s; end; end; end; @@ -2959,8 +2961,8 @@ procedure TFormConfig.EditAdrSigChange(Sender: TObject); var s : string; i, erreur : integer; begin - if affevt then Affiche('Evt adresse signal',clOrange); if clicliste then exit; + if affevt then Affiche('Evt adresse signal',clOrange); // attention interférence avec clic droit propriétés sur un signal qui génère un evt sur ce contrôle if FormConfig.PageControl.ActivePage=FormConfig.TabSheetSig then with Formconfig do @@ -2969,10 +2971,10 @@ begin Val(s,i,erreur); if erreur<>0 then begin LabelInfo.caption:='Erreur adresse signal ';exit;end; LabelInfo.caption:=' '; - feux[lignecliquee+1].adresse:=i; - s:=encode_sig_feux(lignecliquee+1); - RichSig.Lines[lignecliquee]:=s; - Feux[lignecliquee+1].Lbl.caption:='@'+IntToSTR(i); + feux[ligneClicSig+1].adresse:=i; + s:=encode_sig_feux(ligneClicSig+1); + RichSig.Lines[ligneClicSig]:=s; + Feux[ligneClicSig+1].Lbl.caption:='@'+IntToSTR(i); end; end; @@ -2988,7 +2990,7 @@ begin begin s:=EditAdrAig.Text; Val(s,i,erreur); - index:=lignecliquee+1; + index:=ligneclicAig+1; if index=0 then exit; modele:=aiguillage[index].modele; @@ -3008,7 +3010,7 @@ begin aiguillage[index].adresse:=i; aiguillage[index].modifie:=true; - formconfig.RichAig.Lines[lignecliquee]:=s; + formconfig.RichAig.Lines[ligneclicAig]:=s; labelLigne.caption:=s; end; if (modele=2) or (modele=3) then @@ -3038,6 +3040,9 @@ begin formconfig.RichAig.Lines[index-1]:=s; end; end; + s:=encode_init_aig(index); + formconfig.RichInitAig.Lines[index-1]:=s; + end; procedure TFormConfig.ComboBoxAspChange(Sender: TObject); @@ -3057,12 +3062,12 @@ begin 5 : aspect:=9; else aspect:=i+6; end; - index:=lignecliquee+1; // index du feu + index:=ligneClicSig+1; // index du feu if NbreFeux0) or (lignecliquee>=0) then + if (Feu_supprime.adresse<>0) or (ligneClicSig>=0) then begin clicListe:=true; - index:=lignecliquee+1; + index:=ligneClicSig+1; feux[index]:=Feu_supprime; - RichSig.Lines[lignecliquee]:=encode_sig_feux(index); + RichSig.Lines[ligneClicSig]:=encode_sig_feux(index); aff_champs_sig_feux(index); // réaffiche les champs Maj_Hint_feu(index); // change l'image du feu dans la feuille graphique principale @@ -3120,7 +3125,7 @@ var champ,i,erreur : integer; begin // rendre visible le groupbox Actionneur fonction F loco if clicListe then exit; - i:=ligneCliquee+1; + i:=ligneClicAct+1; if AffEvt then Affiche('RadioLoc '+IntToSTR(i),clyellow); Tablo_Actionneur[i].loco:=true; @@ -3140,7 +3145,7 @@ begin Tablo_actionneur[i].tempo:=champ; tablo_actionneur[i].Raz:=checkRaz.checked; s:=encode_act_loc(i); - RichAct.Lines[lignecliquee]:=s; + RichAct.Lines[ligneClicAct]:=s; end; procedure TFormConfig.RadioButtonAccessClick(Sender: TObject); @@ -3149,7 +3154,7 @@ var champ,i,erreur : integer; begin // rendre visible le groupbox Actionneur fonction F loco if clicListe then exit; - i:=ligneCliquee+1; + i:=ligneClicAct+1; if AffEvt then Affiche('RadioAccessoire '+IntToSTR(i),clyellow); Tablo_Actionneur[i].loco:=false; @@ -3169,22 +3174,21 @@ begin Tablo_actionneur[i].tempo:=champ; tablo_actionneur[i].Raz:=checkRaz.checked; s:=encode_act_loc(i); - RichAct.Lines[lignecliquee]:=s; + RichAct.Lines[ligneClicAct]:=s; end; - procedure TFormConfig.RichPNMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); var ligne : integer; begin clicliste:=true; + LabelInfo.caption:=''; editV1F.Text:='';editV1O.Text:=''; editV2F.Text:='';editV2O.Text:=''; editV3F.Text:='';editV3O.Text:=''; - - GroupBoxRadio.Visible:=true; - LabelInfo.caption:=''; - + editV4F.Text:='';editV4O.Text:=''; + editAdrFerme.Text:='';EditCmdFerme.text:=''; + editAdrOuvre.Text:='';EditCdeOuvre.text:=''; with RichPN do begin ligne:=Perform(EM_LINEFROMCHAR,-1,0); // numéro de la lignée cliquée @@ -3195,7 +3199,7 @@ begin ligneCliqueePN:=ligne; RE_ColorLine(RichPN,LigneCliqueePN,ClYellow); Aff_champs_PN(lignecliqueePN); - end; + end; end; clicliste:=false; end; @@ -3215,9 +3219,9 @@ begin begin LabelInfo.caption:='Erreur adresse actionneur ferme';exit end else LabelInfo.caption:=' '; - tablo_PN[lignecliquee+1].AdresseFerme:=act; - s:=encode_act_PN(lignecliquee+1); - RichPN.Lines[lignecliquee]:=s; + tablo_PN[lignecliqueePN+1].AdresseFerme:=act; + s:=encode_act_PN(lignecliqueePN+1); + RichPN.Lines[lignecliqueePN]:=s; end; end; @@ -3235,9 +3239,9 @@ begin begin if s='-' then act:=1 else act:=2; LabelInfo.caption:=' '; - tablo_PN[lignecliquee+1].CommandeFerme:=act; - s:=encode_act_PN(lignecliquee+1); - RichPN.Lines[lignecliquee]:=s; + tablo_PN[lignecliqueePN+1].CommandeFerme:=act; + s:=encode_act_PN(lignecliqueePN+1); + RichPN.Lines[lignecliqueePN]:=s; end else LabelInfo.caption:='Erreur Commande ferme actionneur';exit @@ -3259,9 +3263,9 @@ begin begin LabelInfo.caption:='Erreur adresse actionneur ouvre';exit end else LabelInfo.caption:=' '; - tablo_PN[lignecliquee+1].AdresseOuvre:=act; - s:=encode_act_PN(lignecliquee+1); - RichPN.Lines[lignecliquee]:=s; + tablo_PN[lignecliqueePN+1].AdresseOuvre:=act; + s:=encode_act_PN(lignecliqueePN+1); + RichPN.Lines[lignecliqueePN]:=s; end; end; @@ -3279,9 +3283,9 @@ begin begin if s='-' then act:=1 else act:=2; LabelInfo.caption:=' '; - tablo_PN[lignecliquee+1].CommandeOuvre:=act; - s:=encode_act_PN(lignecliquee+1); - RichPN.Lines[lignecliquee]:=s; + tablo_PN[lignecliqueePN+1].CommandeOuvre:=act; + s:=encode_act_PN(lignecliqueePN+1); + RichPN.Lines[lignecliqueePN]:=s; end else LabelInfo.caption:='Erreur Commande ouvre actionneur';exit @@ -3349,11 +3353,11 @@ begin end else LabelInfo.caption:=' '; i:=lignecliqueePN+1; tablo_PN[i].voie[2].ActFerme:=act; - s:=encode_act_PN(i); V2valide:=(EditV2O.text<>'') and (EditV2F.text<>''); NbVoies:=tablo_PN[i].NbVoies; if V2Valide and (NbVoies=1) then tablo_PN[i].NbVoies:=2; if not(V2Valide) then tablo_PN[i].NbVoies:=1; + s:=encode_act_PN(i); RichPN.Lines[lignecliqueePN]:=s; end; @@ -3377,15 +3381,13 @@ begin end else LabelInfo.caption:=' '; i:=lignecliqueePN; tablo_PN[i].voie[2].ActOuvre:=act; - s:=encode_act_PN(i); V2valide:=(EditV2O.text<>'') and (EditV2F.text<>''); NbVoies:=tablo_PN[i].NbVoies; if V2Valide and (NbVoies=1) then tablo_PN[i].NbVoies:=2; if not(V2Valide) then tablo_PN[i].NbVoies:=1; - + s:=encode_act_PN(i); RichPN.Lines[lignecliqueePN]:=s; end; - end; procedure TFormConfig.EditV3FChange(Sender: TObject); @@ -3406,11 +3408,11 @@ begin end else LabelInfo.caption:=' '; i:=lignecliqueePN+1; tablo_PN[i].voie[3].ActFerme:=act; - s:=encode_act_PN(i); V3valide:=(EditV3O.text<>'') and (EditV3F.text<>''); NbVoies:=tablo_PN[i].NbVoies; if V3Valide and (NbVoies=2) then tablo_PN[i].NbVoies:=3; if not(V3Valide) then tablo_PN[i].NbVoies:=2; + s:=encode_act_PN(i); RichPN.Lines[lignecliqueePN]:=s; end; end; @@ -3433,11 +3435,11 @@ begin end else LabelInfo.caption:=' '; i:=lignecliqueePN+1; tablo_PN[i].voie[3].ActOuvre:=act; - s:=encode_act_PN(i); V3valide:=(EditV3O.text<>'') and (EditV3F.text<>''); NbVoies:=tablo_PN[i].NbVoies; if V3Valide and (NbVoies=2) then tablo_PN[i].NbVoies:=3; if not(V3Valide) then tablo_PN[i].NbVoies:=2; + s:=encode_act_PN(i); RichPN.Lines[lignecliqueePN]:=s; end; end; @@ -3456,7 +3458,7 @@ begin Tablo_actionneur[maxtablo_act].loco:=true; s:=encode_act_loc(i); - if AncLigneCliquee<>-1 then RE_ColorLine(RichAct,AncligneCliquee,ClAqua); + if ligneClicAct<>-1 then RE_ColorLine(RichAct,ligneClicAct,ClAqua); // ajouter et scroller en fin with richAct do @@ -3469,8 +3471,8 @@ begin GroupBoxRadio.Visible:=true; LabelInfo.caption:=''; - LigneCliquee:=i-1; - AncLigneCliquee:=LigneCliquee; + LigneClicAct:=i-1; + AncligneClicAct:=ligneClicAct; Aff_champs_Act(maxTablo_act-1); clicliste:=false; config_modifie:=true; @@ -3489,7 +3491,7 @@ begin Tablo_PN[i].NbVoies:=1; s:=encode_act_pn(i); - if AncLigneCliqueePN<>-1 then RE_ColorLine(RichPN,AncligneCliqueePN,ClAqua); + if LigneCliqueePN<>-1 then RE_ColorLine(RichPN,ligneCliqueePN,ClAqua); // ajouter et scroller en fin with richPN do @@ -3515,7 +3517,7 @@ var i,index,adr : integer; begin if affevt then affiche('Evt bouton Sup acc',clyellow); - i:=lignecliquee; + i:=ligneClicAct; if (i=-1) then exit; index:=i+1; // passe en index tableau @@ -3546,8 +3548,8 @@ begin RE_ColorLine(RichAct,RichAct.lines.count-1,ClAqua); end; end; - lignecliquee:=-1; - AncLigneCliquee:=-1; + AncligneClicAct:=-1; + ligneClicAct:=-1; end; procedure TFormConfig.ButtonSupPNClick(Sender: TObject); @@ -3601,10 +3603,11 @@ begin feux[i].Aspect:=3; feux[i].decodeur:=0; feux[i].verrouCarre:=false; + cree_image(i); //Affiche('Feu 999 créé',clyellow); s:=encode_sig_feux(i); - if AncLigneCliquee<>-1 then RE_ColorLine(RichSig,AncligneCliquee,ClAqua); + if ligneClicSig<>-1 then RE_ColorLine(RichSig,ligneClicSig,ClAqua); // ajouter et scroller en fin with richSig do @@ -3616,8 +3619,8 @@ begin end; LabelInfo.caption:=''; - LigneCliquee:=i-1; - AncLigneCliquee:=LigneCliquee; + ligneClicSig:=i-1; + AncligneClicSig:=ligneClicSig; Aff_champs_Sig_feux(i); clicliste:=false; config_modifie:=true; @@ -3628,7 +3631,7 @@ var i,index : integer; s : string; begin if affevt then affiche('Evt bouton Sup Feu',clyellow); - i:=lignecliquee; + i:=ligneClicSig; if (i=-1) then exit; index:=i+1; // passe en index tableau @@ -3664,8 +3667,8 @@ begin RE_ColorLine(RichSig,RichSig.lines.count-1,ClAqua); end; end; - lignecliquee:=-1; - AncLigneCliquee:=-1; + ligneClicSig:=-1; + AncligneClicSig:=-1; clicliste:=false; end; @@ -3674,6 +3677,7 @@ var s : string; begin if feu_supprime.adresse<>0 then begin + clicliste:=true; inc(NbreFeux); feux[NbreFeux]:=Feu_supprime; Feu_Supprime.adresse:=0; // dévalider le feu sauvegardé @@ -3682,21 +3686,37 @@ begin // réafficher le rechedit s:=encode_Sig_Feux(NbreFeux); if s<>'' then - with RichSig do begin - Lines.Add(s); - RE_ColorLine(RichSig,RichSig.lines.count-1,ClAqua); - lignecliquee:=-1; - AncLigneCliquee:=-1; - SetFocus; - Selstart:=RichSig.GetTextLen-1; - Perform(EM_SCROLLCARET,0,0); + with RichSig do + begin + Lines.Add(s); + Affiche(s,clyellow); + RE_ColorLine(RichSig,RichSig.lines.count-1,ClYellow); + ligneClicSig:=NbreFeux-1; + AncligneClicSig:=-1; + SetFocus; + Selstart:=RichSig.GetTextLen-1; + Perform(EM_SCROLLCARET,0,0); + end; + Aff_champs_sig_feux(NbreFeux); end; + clicListe:=false; end; end; +// renvoie l'index d'un détecteur +function trouve_detecteur(adresse : integer) : integer; +var i : integer; +begin + i:=0; + repeat + inc(i); + until (adresse_detecteur[i]=adresse) or (i>NDetecteurs); + if adresse_detecteur[i]=adresse then trouve_detecteur:=i else trouve_detecteur:=0; +end; + function verif_coherence : boolean; -var i,j,aig,adr,adr2,detect,modele : integer; +var i,j,k,l,aig,adr,adr2,detect,modele,condcarre,nc : integer; ok : boolean; begin // vérification de la cohérence1 @@ -3712,11 +3732,11 @@ begin begin //affiche('trouvé aig '+intToSTR(detect),clyellow); modele:=aiguillage[Index_Aig(detect)].modele; - if (modele=0) then + if (modele=0) then begin Affiche('Erreur 1: Aiguillage '+intToStr(detect)+' non décrit mais présent en branche '+intToStr(i)+' pos. '+intToSTR(j),clred); ok:=false; - end; + end; end; j:=j+1; until((modele=0) and (detect=0)); @@ -3807,7 +3827,7 @@ begin if adr=aiguillage[i].Adresse then begin affiche('Erreur 6 : aiguillage '+intToSTR(adr)+' défini deux fois',clred); - ok:=false; + ok:=false; end; end; end; @@ -3826,6 +3846,167 @@ begin end; end; + // cohérence 5 ; vérifie si les aiguillages définis en condition supplémentaires de carré existent + for j:=1 to NbreFeux do + begin + l:=1; + repeat + nc:=Length(feux[j].condcarre[l])-1 ; + for k:=1 to nc do + begin + adr:=feux[j].condcarre[l][k].Adresse; // adresse de l'aiguillage + if index_aig(adr)=0 then + begin + Affiche('Avertissement : Aig '+intToSTR(adr)+' défini dans les cond de carré du signal '+intToSTR(feux[j].adresse)+' mais non existant',clOrange); + ok:=false; + end; + end; + inc(l); + until (nc<=0) or (l>6); + end; + + // cohérence 6 : vérifier si les détecteurs et les aiguillages associés aux signaux existent + for j:=1 to NbreFeux do + begin + i:=feux[j].Adr_det1; + if i<>0 then + begin + if trouve_detecteur(i)=0 then + begin + ok:=false; + Affiche('Erreur : Détecteur '+intToSTR(i)+' non existant mais associé au signal '+IntToSTR(feux[j].adresse),clred); + end; + end; + + i:=feux[j].Adr_det2; + if i<>0 then + begin + if trouve_detecteur(i)=0 then + begin + ok:=false; + Affiche('Erreur : Détecteur '+intToSTR(i)+' non existant mais associé au signal '+IntToSTR(feux[j].adresse),clred); + end; + end; + + i:=feux[j].Adr_det3; + if i<>0 then + begin + if trouve_detecteur(i)=0 then + begin + ok:=false; + Affiche('Erreur : Détecteur '+intToSTR(i)+' non existant mais associé au signal '+IntToSTR(feux[j].adresse),clred); + end; + end; + + i:=feux[j].Adr_det4; + if i<>0 then + begin + if trouve_detecteur(i)=0 then + begin + ok:=false; + Affiche('Erreur : Détecteur '+intToSTR(i)+' non existant mais associé au signal '+IntToSTR(feux[j].adresse),clred); + end; + end; + + // élement suivant 1 + i:=feux[j].Adr_el_suiv1; + k:=feux[j].Btype_suiv1; + if i<>0 then + begin + if k=1 then // détecteur + begin + if trouve_detecteur(i)=0 then + begin + ok:=false; + Affiche('Erreur : Détecteur '+intToSTR(i)+' non existant mais associé au signal '+IntToSTR(feux[j].adresse),clred); + end; + end; + if (k>=2) then + begin + // aiguillage + if index_aig(i)=0 then + begin + ok:=false; + Affiche('Erreur : aiguillage '+intToSTR(i)+' non existant mais associé au signal '+IntToSTR(feux[j].adresse),clred); + end; + end; + end; + + // élement suivant 2 + i:=feux[j].Adr_el_suiv2; + k:=feux[j].Btype_suiv2; + if i<>0 then + begin + if k=1 then // détecteur + begin + if trouve_detecteur(i)=0 then + begin + ok:=false; + Affiche('Erreur : Détecteur '+intToSTR(i)+' non existant mais associé au signal '+IntToSTR(feux[j].adresse),clred); + end; + end; + if (k>=2) then + begin + // aiguillage + if index_aig(i)=0 then + begin + ok:=false; + Affiche('Erreur : aiguillage '+intToSTR(i)+' non existant mais associé au signal '+IntToSTR(feux[j].adresse),clred); + end; + end; + end; + + // élement suivant 3 + i:=feux[j].Adr_el_suiv3; + k:=feux[j].Btype_suiv3; + if i<>0 then + begin + if k=1 then // détecteur + begin + if trouve_detecteur(i)=0 then + begin + ok:=false; + Affiche('Erreur : Détecteur '+intToSTR(i)+' non existant mais associé au signal '+IntToSTR(feux[j].adresse),clred); + end; + end; + if (k>=2) then + begin + // aiguillage + if index_aig(i)=0 then + begin + ok:=false; + Affiche('Erreur : aiguillage '+intToSTR(i)+' non existant mais associé au signal '+IntToSTR(feux[j].adresse),clred); + end; + end; + end; + + // élement suivant 4 + i:=feux[j].Adr_el_suiv4; + k:=feux[j].Btype_suiv4; + if i<>0 then + begin + if k=1 then // détecteur + begin + if trouve_detecteur(i)=0 then + begin + ok:=false; + Affiche('Erreur : Détecteur '+intToSTR(i)+' non existant mais associé au signal '+IntToSTR(feux[j].adresse),clred); + end; + end; + if (k>=2) then + begin + // aiguillage + if index_aig(i)=0 then + begin + ok:=false; + Affiche('Erreur : aiguillage '+intToSTR(i)+' non existant mais associé au signal '+IntToSTR(feux[j].adresse),clred); + end; + end; + end; + + end; + + verif_coherence:=ok; end; @@ -3840,13 +4021,14 @@ begin aiguillage[i].modele:=1; aiguillage[i].modele:=1; aiguillage[i].AdroitB:='Z'; aiguillage[i].AdevieB:='Z'; - aiguillage[i].DdroitB:='Z'; aiguillage[i].DdevieB:='Z'; + aiguillage[i].DdroitB:='D'; aiguillage[i].DdevieB:='S'; // préparation pour TJD/S aiguillage[i].ApointeB:='Z'; - aiguillage[i].Adevie2B:='Z'; + aiguillage[i].Adevie2B:='Z'; + aiguillage[i].posInit:=const_inconnu; + aiguillage[i].Temps:=5; - //Affiche('Feu 999 créé',clyellow); s:=encode_Aig(i); - if AncLigneCliquee<>-1 then RE_ColorLine(RichAig,AncligneCliquee,ClAqua); + if ligneClicAig<>-1 then RE_ColorLine(RichAig,ligneClicAig,ClAqua); // scroller à la fin with richAig do begin @@ -3855,10 +4037,19 @@ begin Selstart:=RichAig.GetTextLen-1; Perform(EM_SCROLLCARET,0,0); end; - + + s:=encode_init_aig(i); + with richInitAig do + begin + Lines.add(s); + SetFocus; + Selstart:=RichInitAig.GetTextLen-1; + Perform(EM_SCROLLCARET,0,0); + end; + LabelInfo.caption:='Aiguillage '+intToSTR(aiguillage[i].Adresse)+' créé'; - LigneCliquee:=i-1; - AncLigneCliquee:=LigneCliquee; + ligneClicAig:=i-1; + AncligneClicAig:=ligneClicAig; Aff_champs_aig_tablo(i); clicliste:=false; config_modifie:=true; @@ -3869,7 +4060,7 @@ procedure TFormConfig.BoutSupAigClick(Sender: TObject); var i,index,index2 : integer; s : string; begin - i:=lignecliquee; + i:=ligneClicAig; if (i=-1) then exit; index:=i+1; // passe en index tableau @@ -3905,6 +4096,7 @@ begin config_modifie:=true; RichAig.Clear; + RichInitAig.Clear; // réafficher le richsig for i:=1 to MaxAiguillage do @@ -3914,10 +4106,13 @@ begin begin RichAig.Lines.Add(s); RE_ColorLine(RichAig,RichAig.lines.count-1,ClAqua); - end; + s:=encode_Init_Aig(i); + RichInitAig.Lines.Add(s); + RE_ColorLine(RichInitAig,RichInitAig.lines.count-1,ClAqua); + end; end; - lignecliquee:=-1; - AncLigneCliquee:=-1; + ligneClicAig:=-1; + AncligneClicAig:=-1; clicliste:=false; end; @@ -3932,7 +4127,7 @@ begin if FormConfig.PageControl.ActivePage=FormConfig.TabSheetAig then with Formconfig do begin - s:=formconfig.RichAig.Lines[lignecliquee]; + s:=formconfig.RichAig.Lines[ligneClicAig]; Val(s,adrAig,erreur); //vérifier la syntaxe de P @@ -3949,7 +4144,7 @@ begin if (B='D') and (adr<>0) then begin LabelInfo.caption:=''; - RE_ColorLine(RichAig,ligneCliquee,ClWhite); + RE_ColorLine(RichAig,ligneClicAig,ClWhite); Index:=Index_Aig(AdrAig); Aiguillage[index].modifie:=true; @@ -3976,10 +4171,10 @@ begin editAdrAig.Text:=IntToSTR(adr); clicListe:=false; s:=encode_aig(index); - formconfig.RichAig.Lines[lignecliquee]:=s; + formconfig.RichAig.Lines[ligneClicAig]:=s; labelLigne.Caption:=s; s:=encode_aig(index); - formconfig.RichAig.Lines[lignecliquee]:=s; + formconfig.RichAig.Lines[ligneClicAig]:=s; // changer l'homologue adr2:=aiguillage[index].Ddroit; index:=index_aig(Adr2); @@ -4004,7 +4199,7 @@ begin if FormConfig.PageControl.ActivePage=FormConfig.TabSheetAig then with Formconfig do begin - s:=formconfig.RichAig.Lines[lignecliquee]; + s:=formconfig.RichAig.Lines[ligneClicAig]; Val(s,adrAig,erreur); //vérifier la syntaxe @@ -4021,7 +4216,7 @@ begin if (B='S') and (adr<>0) then begin LabelInfo.caption:=''; - RE_ColorLine(RichAig,ligneCliquee,ClWhite); + RE_ColorLine(RichAig,ligneClicAig,ClWhite); Index:=Index_Aig(AdrAig); Aiguillage[index].modifie:=true; @@ -4049,7 +4244,7 @@ begin editAdrAig.Text:=IntToSTR(adr); clicListe:=false; s:=encode_aig(index); - formconfig.RichAig.Lines[lignecliquee]:=s; + formconfig.RichAig.Lines[ligneClicAig]:=s; labelLigne.Caption:=s; // changer l'homologue adr2:=aiguillage[index].Ddroit; @@ -4075,7 +4270,7 @@ begin if FormConfig.PageControl.ActivePage=FormConfig.TabSheetAig then with Formconfig do begin - s:=formconfig.RichAig.Lines[lignecliquee]; + s:=formconfig.RichAig.Lines[ligneClicAig]; Val(s,adrAig,erreur); //vérifier la syntaxe @@ -4092,7 +4287,7 @@ begin if (B='S') and (adr<>0) then begin LabelInfo.caption:=''; - RE_ColorLine(RichAig,ligneCliquee,ClWhite); + RE_ColorLine(RichAig,ligneClicAig,ClWhite); Index:=Index_Aig(AdrAig); Aiguillage[index].modifie:=true; @@ -4115,7 +4310,7 @@ begin aiguillage[index].DdevieB:=B; s:=encode_aig(index); - formconfig.RichAig.Lines[lignecliquee]:=s; + formconfig.RichAig.Lines[ligneClicAig]:=s; labelLigne.Caption:=s; // changer l'homologue @@ -4177,7 +4372,7 @@ begin if FormConfig.PageControl.ActivePage=FormConfig.TabSheetAig then with Formconfig do begin - s:=formconfig.RichAig.Lines[lignecliquee]; + s:=formconfig.RichAig.Lines[ligneClicAig]; Val(s,adrAig,erreur); //vérifier la syntaxe @@ -4194,7 +4389,7 @@ begin if (B='D') and (adr<>0) then begin LabelInfo.caption:=''; - RE_ColorLine(RichAig,ligneCliquee,ClWhite); + RE_ColorLine(RichAig,ligneClicAig,ClWhite); Index:=Index_Aig(AdrAig); Aiguillage[index].modifie:=true; @@ -4217,7 +4412,7 @@ begin aiguillage[index].DdevieB:=B; s:=encode_aig(index); - formconfig.RichAig.Lines[lignecliquee]:=s; + formconfig.RichAig.Lines[ligneClicAig]:=s; labelLigne.Caption:=s; // changer l'homologue @@ -4238,36 +4433,48 @@ begin begin inc(MaxAiguillage); aiguillage[MaxAiguillage]:=Aig_supprime; - Aig_Supprime.adresse:=0; // dévalider le feu sauvegardé + Aig_Supprime.adresse:=0; // dévalider l'aiguillage sauvegardé Aig_Supprime.modele:=0; - + clicListe:=true; config_modifie:=true; - // réafficher le rechedit et scroller à la fin - s:=encode_Aig(MaxAiguillage); + // réafficher les rechedit et scroller à la fin + s:=encode_Aig(MaxAiguillage); // ligne de l'aiguillage if s<>'' then with RichAig do begin RichAig.Lines.Add(s); - RE_ColorLine(RichAig,RichAig.lines.count-1,ClAqua); - lignecliquee:=-1; - AncLigneCliquee:=-1; + RE_ColorLine(RichAig,RichAig.lines.count-1,clYellow); SetFocus; Selstart:=RichAig.GetTextLen-1; Perform(EM_SCROLLCARET,0,0); end; + s:=encode_Init_Aig(MaxAiguillage); // ligne de l'initialisation + if s<>'' then + with RichInitAig do + begin + Lines.Add(s); + RE_ColorLine(RichInitAig,RichInitAig.lines.count-1,ClYellow); + SetFocus; + Selstart:=RichInitAig.GetTextLen-1; + Perform(EM_SCROLLCARET,0,0); + ligneClicAig:=MaxAiguillage-1; + AncligneClicAig:=-1; + end; + Aff_champs_aig_tablo(MaxAiguillage); end; + clicListe:=false; end; procedure TFormConfig.ButtonRestaureAigClick(Sender: TObject); var index : integer; begin - if (Aig_supprime.adresse<>0) or (lignecliquee>=0) then + if (Aig_supprime.adresse<>0) or (ligneclicAig>=0) then begin clicListe:=true; - index:=lignecliquee+1; + index:=ligneclicAig+1; Aiguillage[index]:=Aig_supprime; - RichAig.Lines[lignecliquee]:=encode_Aig(index); + RichAig.Lines[ligneclicAig]:=encode_Aig(index); aff_champs_Aig_tablo(index); // réaffiche les champs clicListe:=false; end; @@ -4278,12 +4485,12 @@ var s: string; i : integer; begin if clicListe then exit; - if MaxAiguillageLignecliquee then + if AncligneClicBr<>ligneClicBr then begin - if AncLigneCliquee<>-1 then + if AncligneClicBr<>-1 then begin - RE_ColorLine(RichBranche,AncligneCliquee,ClAqua); + RE_ColorLine(RichBranche,AncligneClicBr,ClAqua); end; - RE_ColorLine(RichBranche,LigneCliquee,ClYellow); + RE_ColorLine(RichBranche,ligneClicBr,ClYellow); selStart:=curseur; // remettre le curseur en position initiale end; end; @@ -4461,7 +4668,7 @@ end; procedure TFormConfig.ButtonVerifConfigClick(Sender: TObject); var s : string; begin - if verif_coherence then + if verif_coherence then begin s:='La configuration est ok'; labelResult.Caption:=s; @@ -4477,11 +4684,11 @@ var s,sO: string; c : char; dir : boolean; begin - if (lignecliquee<0) or clicListe then exit; + if (ligneClicSig<0) or clicListe then exit; if affevt then affiche('Evt MemoCarre change',clyellow); clicMemo:=MemoCarre.Perform(EM_LINEFROMCHAR,-1,0); // numéro de la ligne du curseur - aspect:=feux[lignecliquee+1].aspect; + aspect:=feux[ligneClicSig+1].aspect; dir:=aspect>10; if dir and (clicMemo>aspect-10) then @@ -4520,18 +4727,18 @@ begin if adr=0 then exit; c:=s[erreur]; // S ou D if (c<>'D') and (c<>'S') then begin LabelInfo.Caption:='Erreur manque D ou S : '+sO;exit;end; - setlength(feux[lignecliquee+1].AigDirection[ligne],j+1); // augmenter le tableau dynamique - feux[lignecliquee+1].AigDirection[ligne][j].PosAig:=c; - feux[lignecliquee+1].AigDirection[ligne][j].Adresse:=adr; + setlength(feux[ligneClicSig+1].AigDirection[ligne],j+1); // augmenter le tableau dynamique + feux[ligneClicSig+1].AigDirection[ligne][j].PosAig:=c; + feux[ligneClicSig+1].AigDirection[ligne][j].Adresse:=adr; delete(s,1,erreur); // supprime jusque D if length(s)<>0 then if s[1]=',' then delete(s,1,1); inc(j); until s='' else - setlength(feux[lignecliquee+1].AigDirection[ligne],0); + setlength(feux[ligneClicSig+1].AigDirection[ligne],0); end; - s:=encode_sig_feux(lignecliquee+1); - RichSig.Lines[lignecliquee]:=s; + s:=encode_sig_feux(ligneClicSig+1); + RichSig.Lines[ligneClicSig]:=s; end else @@ -4551,20 +4758,20 @@ begin if adr=0 then exit; c:=s[erreur]; // S ou D if (c<>'D') and (c<>'S') then begin LabelInfo.Caption:='Erreur manque D ou S : '+sO;exit;end; - setlength(feux[lignecliquee+1].condCarre[ligne],j+1); - feux[lignecliquee+1].condCarre[ligne][j].PosAig:=c; - feux[lignecliquee+1].condCarre[ligne][j].Adresse:=adr; + setlength(feux[ligneClicSig+1].condCarre[ligne],j+1); + feux[ligneClicSig+1].condCarre[ligne][j].PosAig:=c; + feux[ligneClicSig+1].condCarre[ligne][j].Adresse:=adr; delete(s,1,erreur); // supprime jusque D if length(s)<>0 then if s[1]=',' then delete(s,1,1); inc(j); until s='' else - setlength(feux[lignecliquee+1].condCarre[ligne],0); + setlength(feux[ligneClicSig+1].condCarre[ligne],0); end; end; - s:=encode_sig_feux(lignecliquee+1); - RichSig.Lines[lignecliquee]:=s; + s:=encode_sig_feux(ligneClicSig+1); + RichSig.Lines[ligneClicSig]:=s; LabelInfo.Caption:=''; end; @@ -4579,7 +4786,7 @@ begin begin s:=EditAigTriple.Text; Val(s,i,erreur); - index:=lignecliquee+1; + index:=ligneclicAig+1; if index=0 then exit; modele:=aiguillage[index].modele; @@ -4596,12 +4803,142 @@ begin s:=encode_aig_gfx; aiguillage[index].AdrTriple:=i; aiguillage[index].modifie:=true; - formconfig.RichAig.Lines[lignecliquee]:=s; + formconfig.RichAig.Lines[ligneclicAig]:=s; labelLigne.caption:=s; end; end; end; +procedure TFormConfig.EditDevDroitChange(Sender: TObject); +var s : string; + i : integer; +begin + if clicliste or (ligneclicAig<0) then exit; + + if FormConfig.PageControl.ActivePage=FormConfig.TabSheetAig then + with Formconfig do + begin + s:=EditDevDroit.Text; + i:=0; + if s<>'' then + begin + case s[1] of + 'D' : begin i:=const_droit;labelDevie.Caption:='Droit';end; + 'S' : begin i:=const_devie;labelDevie.Caption:='Dévié';end; + 'I' : begin i:=const_inconnu;labelDevie.Caption:='Non définie';end; + else begin i:=0;labelDevie.Caption:='Erreur';end; + end; + end; + if i=0 then + begin + LabelInfo.caption:='Erreur position d''initialisation : D, S ou I'; + exit; + end; + + LabelInfo.caption:=''; + s:=encode_aig_gfx; + aiguillage[ligneclicAig+1].PosInit:=i; + aiguillage[ligneclicAig+1].modifie:=true; + formconfig.RichAig.Lines[ligneclicAig]:=s; + labelLigne.caption:=s; + + s:=encode_init_aig(ligneclicAig+1); + RichInitAig.lines[ligneclicAig]:=s; + end; +end; + +procedure TFormConfig.EditTempo10Change(Sender: TObject); +var s : string; + i,erreur : integer; +begin + if clicliste or (ligneclicAig<0) then exit; + + if FormConfig.PageControl.ActivePage=FormConfig.TabSheetAig then + with Formconfig do + begin + s:=EditTempo10.Text; + Val(s,i,erreur); + + LabelInfo.caption:=''; + s:=encode_aig_gfx; + aiguillage[ligneclicAig+1].temps:=i; + aiguillage[ligneclicAig+1].modifie:=true; + formconfig.RichAig.Lines[ligneclicAig]:=s; + labelLigne.caption:=s; + + s:=encode_init_aig(ligneclicAig+1); + RichInitAig.lines[ligneclicAig]:=s; + end; +end; + +procedure TFormConfig.CheckInvInitClick(Sender: TObject); +var adrAig,erreur : integer; + s : string; +begin + // récupérer l'adresse de l'aiguillage cliqué + if clicliste or (ligneclicAig<0) then exit; + if affevt then affiche('Evt change InvInit',clyellow); + s:=formconfig.RichAig.Lines[ligneclicAig]; + Val(s,adrAig,erreur); + if checkInvInit.Checked then aiguillage[Index_Aig(adraig)].Inversion:=1 else aiguillage[Index_Aig(adraig)].Inversion:=0; + // réencoder la ligne + s:=encode_init_aig(Index_Aig(AdrAig)); + formconfig.RichInitAig.Lines[ligneclicAig]:=s; +end; + +procedure TFormConfig.EditV4FChange(Sender: TObject); +var s : string; + act,erreur,NbVoies,i : integer; + V4valide : boolean; +begin + if clicliste then exit; + if affevt then affiche('Evt EditV4F Change',clyellow); + if FormConfig.PageControl.ActivePage=FormConfig.TabSheetAct then + with Formconfig do + begin + s:=EditV4F.Text; + Val(s,act,erreur); + if (erreur<>0) and (s<>'') then + begin + LabelInfo.caption:='Erreur adresse actionneur voie 4 ferme';exit + end else LabelInfo.caption:=' '; + i:=lignecliqueePN+1; + tablo_PN[i].voie[4].ActFerme:=act; + V4valide:=(EditV4O.text<>'') and (EditV4F.text<>''); + NbVoies:=tablo_PN[i].NbVoies; + if V4Valide and (NbVoies<=3) then tablo_PN[i].NbVoies:=4; + if not(V4Valide) then tablo_PN[i].NbVoies:=3; + s:=encode_act_PN(i); + RichPN.Lines[lignecliqueePN]:=s; + end; +end; + +procedure TFormConfig.EditV4OChange(Sender: TObject); +var s : string; + i,act,erreur,NbVoies : integer; + V4valide : boolean; +begin + if clicliste then exit; + if affevt then affiche('Evt EditV4O Change',clyellow); + if FormConfig.PageControl.ActivePage=FormConfig.TabSheetAct then + with Formconfig do + begin + s:=EditV4O.Text; + Val(s,act,erreur); + if (erreur<>0) and (s<>'') then + begin + LabelInfo.caption:='Erreur adresse actionneur voie 4 ouvre';exit + end else LabelInfo.caption:=' '; + i:=lignecliqueePN+1; + tablo_PN[i].voie[4].ActOuvre:=act; + V4valide:=(EditV4O.text<>'') and (EditV4F.text<>''); + NbVoies:=tablo_PN[i].NbVoies; + if V4Valide and (NbVoies<=3) then tablo_PN[i].NbVoies:=4; + if not(V4Valide) then tablo_PN[i].NbVoies:=3; + s:=encode_act_PN(i); + RichPN.Lines[lignecliqueePN]:=s; + end; +end; begin end. diff --git a/UnitDebug.dcu b/UnitDebug.dcu index 64db52169206662af18ba0309c49f30feca6b5b1..68029ed713ad5d01d16bf7b1fce793bd21968e76 100644 GIT binary patch delta 179 zcmcaOh4I`JM(+Cz4E%mx3=FU4{NKne=_<;wmYIQxp_XYQh-zfo38EM#Tf0^;C$C_e zyv;R&kzq2wn?Lj6uWXYO-Ex^9Pi3Ec(M^$AdouInuRuCmnQ5|wyP_3?Eh|u`FPkff z`pD)9qH@^+LDXKBP!QF~773zS*%h4JDPM(+Cz4E%v!3=GSAe{STKbQM=v%gn&UP|LItL^U$)1X0?PnI~JiRxm4@ zuuk6M8o|gknb*yqxw(;ba=cqE^I;{n$>-e^nYkyhPX6qs$fU|MS=?RG%2}J)mKCVk zm(3MKEnds!38Hh^0zni*D2Qxiiv&@vY_Sk36+|&jE^=2FV%A{p1o2+7O$1S^t(iBk IbYIE@0M|b#EdT%j diff --git a/UnitPrinc.dcu b/UnitPrinc.dcu index b70fc2e5991ba9f5f44d65c1a696de17b463a5ee..ae820f9a18f84c2d296032c402d392a33bb481e7 100644 GIT binary patch delta 20372 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 Uq1q`yeWL_XV_&Tp_i@ty1Mq`QM*si- delta 20579 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 diff --git a/UnitPrinc.dfm b/UnitPrinc.dfm index 89183ec..d13659c 100644 --- a/UnitPrinc.dfm +++ b/UnitPrinc.dfm @@ -1,6 +1,6 @@ object FormPrinc: TFormPrinc - Left = 58 - Top = 217 + Left = 55 + Top = 177 Width = 1212 Height = 664 Caption = 'Client TCP-IP CDM Rail ou USB - syst'#232'me LENZ' @@ -1434,6 +1434,7 @@ object FormPrinc: TFormPrinc ReadOnly = True ScrollBars = ssBoth TabOrder = 7 + WordWrap = False OnChange = FenRichChange end object GroupBox2: TGroupBox @@ -1600,6 +1601,7 @@ object FormPrinc: TFormPrinc end object Vrifierlacohrence: TMenuItem Caption = 'V'#233'rifier la coh'#233'rence' + Hint = 'V'#233'rifie la coh'#233'rence de la configuration' OnClick = VrifierlacohrenceClick end object N8: TMenuItem diff --git a/UnitPrinc.pas b/UnitPrinc.pas index 51c7575..f667db9 100644 --- a/UnitPrinc.pas +++ b/UnitPrinc.pas @@ -208,6 +208,7 @@ type TBranche = record Adresse : integer; modele : integer; // 0=n'existe pas 1=aiguillage 2=TJD 3=TJS 4=aiguillage triple position, // position actuelle : 1=dévié 2=droit (centrale LENZ) + posInit, // position d'initialisation Adrtriple, // 2eme adresse pour un aiguillage triple temps, // temps de pilotage (durée de l'impulsion en x 100 ms) inversion : integer; // positionné dans fichier config_gl section_init @@ -238,9 +239,9 @@ type TBranche = record // si modifié en mode config modifie : boolean ; - end; + end; -TFeu = record +TFeu = record adresse, aspect : integer; // adresse du feu, aspect (2 feux..9 feux 12=direction 2 feux .. 16=direction 6 feux) Img : TImage; // Pointeur sur structure TImage du feu Lbl : TLabel; // pointeur sur structure Tlabel du feu @@ -268,12 +269,12 @@ TFeu = record posAig : char; end; CondCarre : array[1..6] of array of record // conditions supplémentaires d'aiguillages en position pour le carré - // attention les données sont stockée en adresse 1 du tableau dynamique + // attention les données sont stockées en adresse 1 du tableau dynamique Adresse : integer; // aiguillage posAig : char; end; end; - + Taccessoire = (aig,feu); TMA = (valide,devalide); @@ -289,7 +290,7 @@ var TraceListe,clignotant,nack,Maj_feux_cours,configNulle,LanceCDM,AvecInitAiguillages : boolean; CDMhd : THandle; - + FormPrinc: TFormPrinc; ack,portCommOuvert,traceTrames,AffMem,AfficheDet,CDM_connecte,SocketCDM_connecte, Raz_Acc_signaux,AvecInit,AvecTCO,terminal,Srvc_Aig,Srvc_Det,Srvc_Act, @@ -1261,6 +1262,7 @@ var TypeFeu : integer; const espY = 15;//40; // espacement Y entre deux lignes de feux begin TypeFeu:=feux[rang].aspect; + if typeFeu<=0 then exit; Feux[rang].Img:=Timage.create(Formprinc.ScrollBox1); with Feux[rang].Img do begin @@ -2247,10 +2249,10 @@ begin begin ancien_tablo_signalCplx[adresse]:=EtatSignalCplx[adresse]; code:=EtatSignalCplx[adresse]; - code_to_aspect(code,aspect,combine); + code_to_aspect(code,aspect,combine); s:='Signal LDT: ad'+IntToSTR(adresse)+'='+chaine_signal(code); if traceSign then affiche(s,clOrange); - if Affsignal then afficheDebug(s,clOrange); + if Affsignal then afficheDebug(s,clOrange); if (aspect=semaphore) or (aspect=vert) or (aspect=carre) or (aspect=jaune) then mode:=1 else mode:=2; @@ -2294,7 +2296,6 @@ var combine,aspect,code : word; s : string; begin - code:=etatsignalcplx[adresse]; if (ancien_tablo_signalCplx[adresse]<>EtatSignalCplx[adresse]) then //; && (stop_cmd==FALSE)) begin ancien_tablo_signalCplx[adresse]:=EtatSignalCplx[adresse]; @@ -2390,7 +2391,7 @@ begin end; // vérifier si on quitte le rouge - if Option_demarrage then + if Option_demarrage then begin a:=ancien_tablo_signalCplx[adr]; b:=EtatSignalCplx[adr]; @@ -2415,14 +2416,14 @@ begin end; end; end; - + ancien_tablo_signalCplx[adr]:=EtatSignalCplx[adr]; //*** // allume les signaux du feu dans la fenêtre de droite Dessine_feu_mx(Feux[i].Img.Canvas,0,0,1,1,adr,1); // allume les signaux du feu dans le TCO - if AvecTCO then + if AvecTCO then begin for y:=1 to NbreCellY do for x:=1 to NbreCellX do @@ -2430,42 +2431,41 @@ begin if TCO[x,y].Bimage=30 then begin adresse:=TCO[x,y].adresse; // vérifie si le feu existe dans le TCO - a:=EtatsignalCplx[adresse]; // a = état binaire du feu aspect:=TCO[x,y].aspect; - case aspect of + case aspect of 2 : ImageFeu:=Formprinc.Image2feux; 3 : ImageFeu:=Formprinc.Image3feux; 4 : ImageFeu:=Formprinc.Image4feux; 5 : ImageFeu:=Formprinc.Image5feux; 7 : ImageFeu:=Formprinc.Image7feux; 9 : ImageFeu:=Formprinc.Image9feux; - else ImageFeu:=Formprinc.Image3feux; - end; - x0:=(tco[x,y].x-1)*LargeurCell; // coordonnées XY du feu - y0:=(tco[x,y].y-1)*HauteurCell; - TailleY:=ImageFeu.picture.BitMap.Height; // taille du feu d'origine (verticale) - TailleX:=ImageFeu.picture.BitMap.Width; - Orientation:=TCO[x,y].FeuOriente; - // réduction variable en fonction de la taille des cellules - calcul_reduction(frx,fry,round(TailleX*LargeurCell/ZoomMax),round(tailleY*HauteurCell/ZoomMax),TailleX,TailleY); + else ImageFeu:=Formprinc.Image3feux; + end; + x0:=(tco[x,y].x-1)*LargeurCell; // coordonnées XY du feu + y0:=(tco[x,y].y-1)*HauteurCell; + TailleY:=ImageFeu.picture.BitMap.Height; // taille du feu d'origine (verticale) + TailleX:=ImageFeu.picture.BitMap.Width; + Orientation:=TCO[x,y].FeuOriente; + // réduction variable en fonction de la taille des cellules + calcul_reduction(frx,fry,round(TailleX*LargeurCell/ZoomMax),round(tailleY*HauteurCell/ZoomMax),TailleX,TailleY); - // décalage en X pour mettre la tete du feu alignée sur le bord droit de la cellule pour les feux tournés à 90G - if orientation=2 then - begin - if aspect=9 then x0:=x0+round(10*frX); - if aspect=7 then x0:=x0+round(10*frX); - if aspect=5 then begin x0:=x0+round(10*frX);y0:=y0+HauteurCell-round(tailleX*frY); end; - if aspect=4 then begin x0:=x0+round(10*frX);y0:=y0+HauteurCell-round(tailleX*frY); end; - if aspect=3 then begin x0:=x0+round(10*frX);y0:=y0+HauteurCell-round(tailleX*frY); end; - if aspect=2 then begin x0:=x0+round(10*frX);y0:=y0+HauteurCell-round(tailleX*frY); end; - end; + // décalage en X pour mettre la tete du feu alignée sur le bord droit de la cellule pour les feux tournés à 90G + if orientation=2 then + begin + if aspect=9 then x0:=x0+round(10*frX); + if aspect=7 then x0:=x0+round(10*frX); + if aspect=5 then begin x0:=x0+round(10*frX);y0:=y0+HauteurCell-round(tailleX*frY); end; + if aspect=4 then begin x0:=x0+round(10*frX);y0:=y0+HauteurCell-round(tailleX*frY); end; + if aspect=3 then begin x0:=x0+round(10*frX);y0:=y0+HauteurCell-round(tailleX*frY); end; + if aspect=2 then begin x0:=x0+round(10*frX);y0:=y0+HauteurCell-round(tailleX*frY); end; + end; // Dessine_feu_mx(PCanvasTCO,x0,y0,frx,fry,adresse,orientation); Dessine_feu_mx(PCanvasTCO,tco[x,y].x,tco[x,y].y,frx,fry,adresse,orientation); - end; - end; - end; - end; -end; + end; + end; + end; + end; +end; end; // pilotage des signaux @@ -2563,7 +2563,6 @@ procedure trouve_detecteur(detecteur : integer); var NBranche,i : integer; begin Nbranche:=1; - i:=1; repeat i:=index_detecteur(detecteur,Nbranche); if i=0 then inc(NBranche); @@ -2579,7 +2578,6 @@ procedure trouve_aiguillage(adresse : integer); var NBranche,i : integer; begin Nbranche:=1; - i:=1; repeat i:=index_aiguillage(Adresse,Nbranche); if i=0 then inc(NBranche); @@ -2637,7 +2635,6 @@ var s,sa,chaine,SOrigine: string; if esp<>0 then delete(s,esp,1); until esp=0; lit_ligne:=s; - //Affiche(s,clWhite); end; procedure compile_section_init; @@ -2650,14 +2647,16 @@ var s,sa,chaine,SOrigine: string; if j>1 then begin begin - adresse:=StrToINT(copy(s,1,j-1));Delete(s,1,j); // adresse aiguillage + Val(s,adresse,erreur); + Delete(s,1,j); // adresse aiguillage if (adresse>0) and (AvecInitAiguillages) then begin j:=pos(',',s); - position:=StrToInt(copy(s,1,j-1));Delete(S,1,j);// position aiguillage + Val(s,position,erreur); + Delete(S,1,j);// position aiguillage if (position<1) or (position>2) then position:=1; index:=Index_Aig(adresse); - aiguillage[index].position:=position; + aiguillage[index].posInit:=position; // temporisation aiguillage j:=pos(',',s);if j=0 then j:=length(s); @@ -2704,6 +2703,7 @@ begin Aiguillage[i].modele:=0 ; // sans existence Aiguillage[i].adresse:=0; Aiguillage[i].position:=const_inconnu; // position inconnue + Aiguillage[i].PosInit:=const_inconnu; // position inconnue Aiguillage[i].temps:=5 ; Aiguillage[i].inversion:=0; Aiguillage[i].inversionCDM:=0; @@ -2715,7 +2715,6 @@ begin Ancien_detecteur[i]:=false; end; - Affiche('lecture du fichier de configuration config.cfg',clyellow); {$I+} try @@ -3140,7 +3139,7 @@ begin s:='';i:=0; end; end; - + end; if length(sa)>1 then if (sa[1]='F') then @@ -3367,6 +3366,7 @@ begin AvecInitAiguillages:=s='1'; end; + // taille de la fenetre sa:=uppercase(fenetre_ch)+'='; i:=pos(sa,s); if i<>0 then @@ -3378,6 +3378,7 @@ begin if fenetre=1 then Formprinc.windowState:=wsMaximized; end; + // temporisation aiguillages sa:=uppercase(Tempo_Aig_ch)+'='; i:=pos(sa,s); if i<>0 then @@ -3388,7 +3389,6 @@ begin val(s,Tempo_Aig,erreur); end; - i:=pos(uppercase(section_init),s); if i<>0 then begin @@ -3418,7 +3418,6 @@ begin delete(s,i,length(sa)); trouve_NOTIF_VERSION:=true; // vérification de la version au démarrage - i:=0; val(s,i,erreur); notificationVersion:=i=1; end; @@ -3431,7 +3430,6 @@ begin delete(s,i,length(sa)); trouve_TCO:=true; // vérification de la version au démarrage - i:=0; val(s,i,erreur); AvecTCO:=i=1; end; @@ -3444,7 +3442,6 @@ begin trouve_CDM:=true; delete(s,i,length(sa)); // vérification de la version au démarrage - i:=0; val(s,i,erreur); LanceCDM:=i=1; end; @@ -3466,7 +3463,6 @@ begin inc(nv); trouve_serveur_interface:=true; delete(s,i,length(sa)); - i:=0; val(s,i,erreur); ServeurInterfaceCDM:=i; end; @@ -3478,7 +3474,6 @@ begin inc(nv); trouve_retro:=true; delete(s,i,length(sa)); - i:=0; val(s,i,erreur); ServeurRetroCDM:=i; end; @@ -3490,7 +3485,6 @@ begin inc(nv); trouve_NbDetDist:=true; delete(s,i,length(sa)); - i:=0; val(s,i,erreur); if i<2 then begin i:=2;Affiche('Attention '+nb_det_dist_ch+' ramené à '+IntToSTR(i),clOrange); end; Nb_Det_Dist:=i; @@ -4449,6 +4443,7 @@ end; // renvoie vrai si les aiguillages déclarés dans la définition du signal sont mal positionnés +// (conditions suppplémentares) function cond_carre(adresse : integer) : boolean; var i,l,k,NCondCarre,adrAig,index : integer; resultatET,resultatOU: boolean; @@ -4469,9 +4464,12 @@ begin //s2:=s2+'A'+IntToSTR(feux[i].condcarre[l][k].Adresse)+feux[i].condcarre[l][k].PosAig+' '; AdrAig:=feux[i].condcarre[l][k].Adresse; index:=index_aig(adrAig); - if nivDebug=3 then AfficheDebug('Contrôle aiguillage '+IntToSTR(AdrAig),clyellow); - resultatET:=((aiguillage[index].position=const_devie) and (feux[i].condcarre[l][k].PosAig='S') or (aiguillage[index].position=const_droit) and (feux[i].condcarre[l][k].PosAig='D')) - and resultatET; + if index<>0 then + begin + if nivDebug=3 then AfficheDebug('Contrôle aiguillage '+IntToSTR(AdrAig),clyellow); + resultatET:=((aiguillage[index].position=const_devie) and (feux[i].condcarre[l][k].PosAig='S') or (aiguillage[index].position=const_droit) and (feux[i].condcarre[l][k].PosAig='D')) + and resultatET; + end; end; //if resultatET then Affiche('VRAI',clyellow) else affiche('FAUX',clred); inc(l); @@ -6269,7 +6267,7 @@ begin j:=posEx(',',PortCom,j+1); j:=posEx(',',PortCom,j+1); - confStCom:=copy(portCom,i+1,j-i-1); //Affiche(ConfStCom,clred); + confStCom:=copy(portCom,i+1,j-i-1); Settings:=ConfStCom; // COMx:vitesse,n,8,1 Affiche('Demande ouverture COM'+intToSTR(NumPort)+':'+ConfStCom+' protocole '+IntToSTR(protocole),CLYellow); if protocole>=4 then Handshaking:=0 {0=aucun 1=Xon-Xoff 2=cts 3=RTS-Xon-Xoff 4=5=protocoles "maison"} @@ -6786,7 +6784,7 @@ begin index:=index_aig(i); if aiguillage[index].modele<>0 then // si l'aiguillage existe begin - pos:=aiguillage[index].position; + pos:=aiguillage[index].posInit; s:='Init aiguillage '+intToSTR(i)+'='+intToSTR(pos); if pos=1 then s:=s+' (dévié)' else s:=s+' (droit)'; Affiche(s,cyan); @@ -7139,7 +7137,7 @@ procedure TFormPrinc.MenuConnecterEthernetClick(Sender: TObject); begin if AdresseIP<>'0' then begin - Affiche('Demande de connexion de l''interface Lenz en ethernet '+AdresseIP+':'+IntToSTR(Port),clyellow); + Affiche('Demande de connexion de l''interface XpressNet en ethernet sur '+AdresseIP+':'+IntToSTR(Port),clyellow); ClientSocketLenz.port:=port; ClientSocketLenz.Address:=AdresseIP; ClientSocketLenz.Open; @@ -7422,7 +7420,6 @@ begin // Tempo_chgt_feux:=10; // demander la mise à jour des feux end; - // évènement détecteur posDT:=pos('CMDACC-ST_DT',commandeCDM); if posDT<>0 then @@ -7592,10 +7589,9 @@ begin DeConnecterUSB.enabled:=true; ConnecterCDMRail.enabled:=true; end; - - + procedure TFormPrinc.Codificationdesfeux1Click(Sender: TObject); -var i,j,k,l,CondCarre,NfeuxDir : integer; +var i,j,k,l,CondCarre,NfeuxDir,nc : integer; s,s2 : string; begin Affiche('Codification interne des feux',Cyan); @@ -7612,31 +7608,29 @@ begin s:=s+' Det='+IntToSTR(feux[i].Adr_det1); s:=s+' El_Suiv1='+IntToSTR(feux[i].Adr_el_suiv1)+' Type suiv1='+intToSTR(feux[i].Btype_suiv1); case feux[i].Btype_suiv1 of - 1 : s:=s+' (détecteur)'; - 2 : s:=s+' (aiguillage ou TJD-S)'; - 4 : s:=s+' (aiguillage triple)'; - 5 : s:=s+' (aiguillage bis)'; + 1 : s:=s+' (détecteur) '; + 2 : s:=s+' (aiguillage ou TJD-S) '; + 4 : s:=s+' (aiguillage triple) '; + 5 : s:=s+' (aiguillage bis) '; end; if feux[i].decodeur=6 then - s:=s+' Cible unisemaf='+intToSTR(feux[i].Unisemaf); + s:=s+'Cible unisemaf= '+intToSTR(feux[i].Unisemaf); // conditions sur carré - CondCarre:=Length(feux[i].condcarre[1]); l:=1; - s2:=''; - while condCarre<>0 do - begin - if condcarre<>0 then dec(condcarre); - for k:=1 to condCarre do + repeat + nc:=Length(feux[i].condcarre[l])-1 ; + if (nc>0) and (l=1) then begin Affiche(s,clYellow);s:='';end; // pour afficher sur 2 lignes + for k:=1 to nc do begin - s2:=s2+'A'+IntToSTR(feux[i].condcarre[l][k].Adresse)+feux[i].condcarre[l][k].PosAig+' '; + s:=s+'A'+IntToSTR(feux[i].condcarre[l][k].Adresse)+feux[i].condcarre[l][k].PosAig; + if k0 then s:=s+'/'; + until (nc<=0) or (l>6); end + else // feu directionnel begin @@ -7862,7 +7856,7 @@ begin // dans le tableau des PN for i:=1 to NbrePN do begin - s:='PN'+intToSTR(i)+' Adresse fermeture PN='+IntToSTR(Tablo_PN[i].AdresseFerme); + s:='PN'+intToSTR(i)+' Adresse fermeture PN='+IntToSTR(Tablo_PN[i].AdresseFerme); s:=s+' Adresse ouverture PN='+IntToSTR(Tablo_PN[i].AdresseOuvre); Affiche(s,clyellow); s:=' Commande fermeture='+intToSTR(Tablo_PN[i].commandeFerme); @@ -7981,7 +7975,7 @@ begin Tformconfig.create(nil); formconfig.PageControl.ActivePage:=formconfig.TabSheetSig; //Affiche(intToSTR(index),clOrange); - lignecliquee:=index-1; + ligneClicSig:=index-1; formconfig.showmodal; formconfig.close; end; diff --git a/UnitTCO.dcu b/UnitTCO.dcu index 10045c636fbe630aa6ae8c5e84c158a426bcf3cd..d5d8ac28ef3f31024d8334954888c46798e3015c 100644 GIT binary patch delta 1200 zcmY+CYe_+4|xa zj|EW?MSYNvk~a$}!H}T9fo7Uh#HLQ?E`dlFS?4(ialId&-+uq++}`uf+oW2!t;!rD zB=M3mj-0l`!5YWgToTtpcGRqLoOjk%>?zw;bNs?7)@jdFD3rnKABnHB6&+Et)}27u z#i^9(Kigs~!qseOUkh`Wgd_#PsDq2Ka4V3VN-LaD-3T0^1g93&u<)sQf7VJWcwJTNQ#MQJU!uqX8vQr2WGW2u$rCkW0n`8 zqSi?mR7)q5m~>>j5E9)o1?eEs{Zn8#Dm}*RhVcb&wefMrc0{MKlV@F6ea3Et-}s4V zU$E*;9z?2Xh-Y4`Hq$u5Zt^1t{X7LmcIHKa>}kki8y}kH`(H*7dS8S+!ls2K`*|w9POO+A_l?5ZWye5YW!@aJPVS7RuR>cLM4F?-d4EC{cHS zpR7&5BQP(Zo8!GAfg=Lf88%2>4Zd^!xPVWxOR4l%n|07T_5I`{X|%A7`C%Lqrx&Gyl0Pqft|n^;a71N zLFmf}tY=|g1U8pSejQucVVOfzTILbbFRV=#(4(xt`qYxZB?)V{MUNn~ J@BImM%|CmtMJ)gT delta 1329 zcmY+?e@xVM7zgn0^LdW@lGjbZfV*p&L;;KR%a8cc@NAs;2NE%e+oV4*yOAr)!4$2b zvy1+aF#gQ2V2%^bGY7}Cue8$UAFRxK8XiX7?~$%(*`t3YG+Jl>qw{qcQ0@8|h^ zKKK3Jeg8QUA8L!wxTa~VLnfu2Il5fa=>F~nO&!-ZHCo(z-r85YrD|j2&bnL>Mu-6>e733#G z&!|o(#<=DA5h?Ey90VJE!zeq_^OxD&R_bP9BV}BHW);-wq}VY=N#oF|$`yUZV)~?+ z%C2(J+M!cO3eSuR?4N-BfF;i%&4u6~4lnEU_9RrG->&G}Nj~*tApaVqm_ehLr=dgT zZl~+h;7rhh34GHRvO+=^Z_oY%E+u$gH#a15qi;i#pi#n2NITpXcT|$o=!o)Zlv6@m zoKNr?-9qq*uZ2FNM>ubs7xMb$I&BOJVdE#^@n7U>&lwTc=3Egx?_o$R&$%H~=7fdx zSHVPQZ-Sv3%rwrz5n43^S>U4l8AyYAati}=fSao48Tx`FPF+SC;s&-_Of)MUj7PGD zd7nmwVa`|Y>a;zYy^=kDEAn$j%Zg4vhhZBITai+4aj|8cqBm~ws3p%t?NVT|PUocX zf2b(L1;mqi_5sE$RKuU-Wt6v-e&;R@uf);6(%0yf+kCT0)W~G!FX@%Z{D_ANs-w80 z)Ct~#ox+nIq;tGj!32$ozA0LgGc zhuK3&#sXv|;+y8uRNiQHmJ9ug8n}(Smvs7g0UUgn-3w5@8rJm5xM_30pdF9!@9%dg zdOE^?q3n}lDmTQ{}?9BJuFit$}vI;!|iNc`EF7#I5S~2K)R%l8I JTwerA`VZ!Ag<}8! diff --git a/verif_version.dcu b/verif_version.dcu index a6790de1fe251d82472a046761306015ca19eec7..7f6f3fa26d47c510fb5f7991221ff921049c8df9 100644 GIT binary patch delta 4239 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 Jk#Izg{{Y9A+gtzu delta 2948 zcmZ`*4Qx}_6~57@k^Rm#&g`)EK5Tbq7ae^CYX{CQ^JxGew+?UN<(7fhw?Z7 zL=-_Ciaj;+yb(;Qbw3qMV=C1;ky56RHB&~nYU?_Ls%k}}tO#wuHZ(<3CS_9=@7!mb zWtC>@e&_Ey=bm%?;`pQ8ciZisFy^>h#h9gge%FNEQ=yP#;gZonSPvc`jOfEdb^XD? zyL-R6lTY=rixc*xWid&ZSL3| z4R^Fe4xMbo%b6XHM>D4!!T5u|M(hkkBE5$K5%w1{c0V8SNA-aSyFo^GZ&>dgibmM) z`Wh`;26`hAVqK-cli}Wxklq(zKOjz)zgo^HWMB5a95UIg63LZSI;zF z*AT2_jaL7V9_&W~1g}qk#iQ^^u_K znq~>=eIY#%4px;cYM?uvOoPKtr=lr=a5xYP2c2^ob{`mt9URaD!Rm{erTajPHbVN@ zOvxjcEmmP?U^i!e`$&E3d4X#kd-TCTxLbZqhF12sDS>@$3|Xy%Iv;b;2=T6FQahMc zWvoGKV)Y?ls%5+oQpL%eml^BQV-5&er?)7v2&`)XZ{%n2!xOR>rY-|H_ zB>KrWwpp5FJWWR0_h9Ba$@|ik_T8WHnDWN@oA3JWv6TOQ%J;yCCgvOoJ5kA%PMVgp z*<6lP<2n7$30cIy^yzS(Imsv~H5O$$vMa5JBgdoRcYTM z1&oxju$-@RVdkX*BjwAbrG4?Glz%?YS)938Af)}b3+uks zbK^TFkKbmFWPl19fn3kGdamaK9Td3byZ&*{jZbdB>Nt6a?mb7R@MtWhI_GEJE|f0R zJ*(*yFDy%<6zHBy_D)N{ads7&lom^BL$pqC)PcBk$x`slzsSTT+ge#j0 zu26`yY-}NvAel}s5PycAygc8qbE)~qC-YH->N-=%o_?#K{na_GDw%9Wc|&2WGjo*` zWGwn*s9uqG%!js-Oeg0*b;o>WtJmw@Pch@B^>h37?(H8}Ls#V=O^$8O{NC$PZa$Ox zQ_nk@tam&!{pdlc&wNI!B5c;QOJ_AZkIxFGm<0o~(7-B?q&%u|zJTy6gaL#hgnuD~ z5ta~^5e_4K6`>8`J%lcVT?k)B_zA)<5S~ML7oi&=i10Opmk_>=@EXF)2ptIDMtB|J zM+i?L{21XPLi|mHw-ELt>_eDFIEXNVa2DbF2tPphA;K|)O$gsW_##3xLMy^4gwqIH z5zZid3tMgd+$??KIYQI4>$;N^Av0sE(sz zrRlAr%9wmZt+GZqc?nm6Bov8Ok}5CfcD|aID(h%T>qHe_L-xFz+%En(u97Jaxytz8 zRerk+{$S&GY(Z!=A_%rcN%(~qKg{Pg;V^T=;gvox{bdx=xJ`!XX#6s@ zC_gJ%nwDko)(9E5k+1lnls9zpDp+m!LWN|F|B_}{E#y5m(xudBpM{{sd!AHFNMVXY{5Ap0hHm;G8+F!o->DJbek6 zJnjl%6$)qWDQS8=O=Kcxo+8PwEsKffW)P*GOzzOBiQu>!k5ilYtv0c5Rlp zt3~3d&%kyAJ0%{W<~Td*mw0Ti#20!bj`d1>F(5IaOMGuo;`?7QFlONM1|B!?gv9v! zNhz+48<>`OeL~^~lLo$G;P)hcc+S8J62G))c|*zyaajs>MPiefm7-Ie*}q0;NIz@V zi8*8=r5i;fHi<^tX0bupEc%z5=xi3FN|P9klXGr)Bb_EXEkc{1pF?3?oZv0U)Y7DQ zT}g@}u{0; - if trouve_version then s2:=s; + if trouve_version then begin s2:=s;zone_comm:=true;end; end; if not(trouve_zip) then begin i:=pos('.zip',s); trouve_zip:=i<>0; - if trouve_zip then - s3:=s; + if trouve_zip then begin s3:=s;zone_comm:=false;end; + end; + // commentaire en gras + if zone_comm then + begin + i:=pos('bold">',s)+6;i2:=posEx('
',s,i+1); + if i<>6 then + begin + inc(ncomm); + comm[ncomm]:=UTF8Decode(copy(s,i,i2-i)); + Delete(s,1,i2-1); + j:=0; + repeat + i:=pos('
',s)+6;i3:=posEx('',s,i+1);i2:=posEx('
',s,i+1); + inc(ncomm); + if i20 then delete(s3,i,1); // supprimer le . s3:='http://cdmrail.free.fr/ForumCDR'+s3 ; - aff(s3); // lien dans s3 // changer le . en , s:=Version_p; @@ -161,12 +188,20 @@ begin val(s,V_publie,erreur); if erreur<>0 then exit; val(s2,V_utile,erreur); if erreur<>0 then exit; - + if V_utile0 then + begin + Aff('Nouveautés de la V'+version_p+' de Signaux_Complexes_GL :'); + Aff(' '); + for i:=1 to ncomm do aff(comm[i]); + end; if MessageDlg(s+'. Voulez-vous la télécharger?',mtConfirmation,[mbYes,mbNo],0)=mrYes then begin // récupérer depuis la variable d'environnement windows USERPROFILE le repertoire de la session ouverte diff --git a/versions.txt b/versions.txt index 207610f..c249013 100644 --- a/versions.txt +++ b/versions.txt @@ -56,7 +56,10 @@ version 3.0 : Ajout des fonctions Nouveau / supprimer feu, accessoires dans le Tous les éléments des feux, aiguillages, branches et actionneurs peuvent être modifiés depuis le panneau. Nécessite de nommer les sections dans le fichier config.cfg Il n'est donc plus nécessaire de modifier les fichiers de configuration. - +version 3.1 : Renforcement de la vérification de la configuration. + Modification de la liste d'initialisation des aiguillages en mode autonome. + Indépendance des modifications entre les onglets du panneau de configuration. +