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 6d13a49..9cb58ce 100644 Binary files a/UnitConfig.dcu and b/UnitConfig.dcu differ 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 64db521..68029ed 100644 Binary files a/UnitDebug.dcu and b/UnitDebug.dcu differ diff --git a/UnitPrinc.dcu b/UnitPrinc.dcu index b70fc2e..ae820f9 100644 Binary files a/UnitPrinc.dcu and b/UnitPrinc.dcu differ 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 10045c6..d5d8ac2 100644 Binary files a/UnitTCO.dcu and b/UnitTCO.dcu differ diff --git a/verif_version.dcu b/verif_version.dcu index a6790de..7f6f3fa 100644 Binary files a/verif_version.dcu and b/verif_version.dcu differ diff --git a/verif_version.dfm b/verif_version.dfm index e6f50b6..1ea7542 100644 --- a/verif_version.dfm +++ b/verif_version.dfm @@ -1,28 +1,31 @@ object FormVersion: TFormVersion - Left = 497 - Top = 186 - Width = 468 - Height = 194 + Left = 197 + Top = 230 + BorderIcons = [] + BorderStyle = bsDialog Caption = 'V'#233'rification de version' - Color = clBtnFace + ClientHeight = 213 + ClientWidth = 644 + Color = clNavy Font.Charset = ANSI_CHARSET Font.Color = clBlack Font.Height = -16 Font.Name = 'Arial Narrow' Font.Style = [] OldCreateOrder = False - Position = poScreenCenter OnCreate = FormCreate PixelsPerInch = 96 TextHeight = 20 object Memo1: TMemo - Left = 16 - Top = 32 - Width = 425 - Height = 105 + Left = 0 + Top = 0 + Width = 641 + Height = 209 + BorderStyle = bsNone + Color = clNavy Font.Charset = ANSI_CHARSET - Font.Color = clBlack - Font.Height = -13 + Font.Color = clYellow + Font.Height = -19 Font.Name = 'Arial Narrow' Font.Style = [] ParentFont = False diff --git a/verif_version.pas b/verif_version.pas index 021091f..cd5b36c 100644 --- a/verif_version.pas +++ b/verif_version.pas @@ -4,7 +4,7 @@ interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, - Dialogs, StdCtrls , ComCtrls ,WinInet, ExtCtrls; + Dialogs, StdCtrls , ComCtrls ,WinInet, ExtCtrls , StrUtils; type TFormVersion = class(TForm) @@ -23,7 +23,7 @@ var Lance_verif : integer; verifVersion,notificationVersion : boolean; -Const Version='3.0'; // sert à la comparaison de la version publiée +Const Version='3.1'; // sert à la comparaison de la version publiée implementation @@ -100,10 +100,11 @@ end; procedure verifie_version; var s,s2,s3,Version_p,Url,LocalFile : string; - trouve_version,trouve_zip : boolean; + trouve_version,trouve_zip,zone_comm : boolean; fichier : text; - i,j,erreur : integer; + i,j,erreur,Ncomm,i2,i3 : integer; V_publie,V_utile : real; + comm : array[1..10] of string; begin //Affiche('vérifie version',clLime); if not(AvecInit) then exit ; @@ -112,6 +113,8 @@ begin LocalFile:='page.txt'; trouve_version:=false; trouve_zip:=false; + zone_comm:=false; + Ncomm:=0; if DownloadURL_NOCache(Url,localFile) then begin AssignFile(fichier,LocalFile); @@ -124,18 +127,43 @@ begin begin i:=pos('version ',s); trouve_version:=i<>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. +