diff --git a/Notice d'utilisation des signaux_complexes_GL_V10.72.pdf b/Notice d'utilisation des signaux_complexes_GL_V10.75.pdf similarity index 82% rename from Notice d'utilisation des signaux_complexes_GL_V10.72.pdf rename to Notice d'utilisation des signaux_complexes_GL_V10.75.pdf index eb8af82..b0db561 100644 Binary files a/Notice d'utilisation des signaux_complexes_GL_V10.72.pdf and b/Notice d'utilisation des signaux_complexes_GL_V10.75.pdf differ diff --git a/UnitConfig.dfm b/UnitConfig.dfm index dec8a92..9a20af5 100644 --- a/UnitConfig.dfm +++ b/UnitConfig.dfm @@ -1573,7 +1573,7 @@ object FormConfig: TFormConfig Top = 8 Width = 633 Height = 505 - ActivePage = TabSheetActions + ActivePage = TabSheetSig Font.Charset = DEFAULT_CHARSET Font.Color = clBlack Font.Height = -11 @@ -1638,7 +1638,6 @@ object FormConfig: TFormConfig ParentShowHint = False ShowHint = True TabOrder = 1 - Text = '123' end object ButtonPFCDM: TButton Left = 16 @@ -2098,7 +2097,7 @@ object FormConfig: TFormConfig 'S'#233'lection du style d'#39#39'affichage - Le style sera chang'#233' '#224' la ferm' + 'eture de la fen'#234'tre'#39 Style = csDropDownList - ItemHeight = 0 + ItemHeight = 13 ParentShowHint = False ShowHint = True TabOrder = 0 @@ -2295,10 +2294,10 @@ object FormConfig: TFormConfig BevelInner = bvLowered BevelKind = bkFlat 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. ' + '3. Valeur maximale par tranche de 50 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 @@ -3140,21 +3139,6 @@ object FormConfig: TFormConfig object TabSheetSig: TTabSheet Caption = 'Signaux' ImageIndex = 4 - object Label15: TLabel - Left = 0 - Top = 8 - Width = 531 - Height = 13 - Caption = - 'Liste de mod'#233'lisation des signaux - cliquez sur une ligne pour a' + - 'fficher la description du signal' - Font.Charset = DEFAULT_CHARSET - Font.Color = clBlack - Font.Height = -11 - Font.Name = 'MS Sans Serif' - Font.Style = [fsBold] - ParentFont = False - end object Label35: TLabel Left = 72 Top = 436 @@ -3164,14 +3148,14 @@ object FormConfig: TFormConfig end object GroupBox12: TGroupBox Left = 328 - Top = 24 + Top = 8 Width = 297 - Height = 449 + Height = 465 Caption = 'Description du signal' TabOrder = 0 object ImageSignal: TImage Left = 8 - Top = 48 + Top = 64 Width = 81 Height = 105 end @@ -3190,30 +3174,30 @@ object FormConfig: TFormConfig end object LabelDec: TLabel Left = 92 - Top = 52 + Top = 76 Width = 53 Height = 13 Caption = 'D'#233'codeur: ' end object LabelDetAss: TLabel Left = 96 - Top = 104 + Top = 120 Width = 86 Height = 13 Caption = 'D'#233'tecteur associ'#233 end object LabelElSuiv: TLabel Left = 192 - Top = 104 + Top = 120 Width = 75 Height = 13 Caption = 'Element suivant' end object Label17: TLabel Left = 8 - Top = 326 - Width = 115 - Height = 52 + Top = 344 + Width = 128 + Height = 39 Hint = 'Permet d'#39'afficher un carr'#233' si les aiguillages sont dans les posi' + 'tions d'#233'crites ci dessous' @@ -3225,8 +3209,8 @@ object FormConfig: TFormConfig WordWrap = True end object Label24: TLabel - Left = 104 - Top = 124 + Left = 120 + Top = 140 Width = 8 Height = 13 Caption = '1' @@ -3238,8 +3222,8 @@ object FormConfig: TFormConfig ParentFont = False end object Label25: TLabel - Left = 104 - Top = 148 + Left = 120 + Top = 164 Width = 8 Height = 13 Caption = '2' @@ -3251,8 +3235,8 @@ object FormConfig: TFormConfig ParentFont = False end object Label26: TLabel - Left = 104 - Top = 172 + Left = 120 + Top = 188 Width = 8 Height = 13 Caption = '3' @@ -3264,8 +3248,8 @@ object FormConfig: TFormConfig ParentFont = False end object Label27: TLabel - Left = 104 - Top = 196 + Left = 120 + Top = 212 Width = 8 Height = 13 Caption = '4' @@ -3278,22 +3262,22 @@ object FormConfig: TFormConfig end object Label33: TLabel Left = 104 - Top = 76 + Top = 100 Width = 36 Height = 13 Caption = 'Aspect:' end object LabelUni: TLabel Left = 8 - Top = 176 + Top = 200 Width = 72 Height = 13 Caption = 'Spec Unisemaf' Visible = False end object Label43: TLabel - Left = 48 - Top = 160 + Left = 72 + Top = 176 Width = 38 Height = 16 Caption = 'Voies:' @@ -3306,8 +3290,8 @@ object FormConfig: TFormConfig end object Label69: TLabel Left = 152 - Top = 326 - Width = 107 + Top = 350 + Width = 122 Height = 39 Hint = 'Permet d'#39'afficher un feu blanc si les aiguillages sont dans les ' + @@ -3318,11 +3302,19 @@ object FormConfig: TFormConfig ShowHint = True WordWrap = True end + object Label15: TLabel + Left = 56 + Top = 44 + Width = 171 + Height = 13 + Caption = 'Temporisation commandes (x100mx)' + WordWrap = True + end object MemoCarre: TMemo Left = 8 - Top = 368 + Top = 392 Width = 137 - Height = 73 + Height = 65 Hint = 'Une ligne contient les conditions en ET. Les lignes sont cha'#238'n'#233'e' + 's en OU' @@ -3336,17 +3328,17 @@ object FormConfig: TFormConfig end object ComboBoxDec: TComboBox Left = 144 - Top = 48 + Top = 72 Width = 137 Height = 21 Style = csDropDownList - ItemHeight = 0 + ItemHeight = 13 TabOrder = 1 OnChange = ComboBoxDecChange end object EditDet1: TEdit Left = 136 - Top = 120 + Top = 136 Width = 41 Height = 21 Hint = 'D'#233'tecteur 1 (obligatoire) associ'#233' au signal' @@ -3357,7 +3349,7 @@ object FormConfig: TFormConfig end object EditSuiv1: TEdit Left = 200 - Top = 120 + Top = 136 Width = 41 Height = 21 Hint = @@ -3370,7 +3362,7 @@ object FormConfig: TFormConfig end object EditDet2: TEdit Left = 136 - Top = 144 + Top = 160 Width = 41 Height = 21 Hint = 'D'#233'tecteur 2 (optionnel) associ'#233' au signal' @@ -3381,7 +3373,7 @@ object FormConfig: TFormConfig end object EditSuiv2: TEdit Left = 200 - Top = 144 + Top = 160 Width = 41 Height = 21 Hint = @@ -3394,7 +3386,7 @@ object FormConfig: TFormConfig end object EditDet3: TEdit Left = 136 - Top = 168 + Top = 184 Width = 41 Height = 21 Hint = 'D'#233'tecteur 3 (optionnel) associ'#233' au signal' @@ -3405,7 +3397,7 @@ object FormConfig: TFormConfig end object EditSuiv3: TEdit Left = 200 - Top = 168 + Top = 184 Width = 41 Height = 21 Hint = @@ -3418,7 +3410,7 @@ object FormConfig: TFormConfig end object EditDet4: TEdit Left = 136 - Top = 192 + Top = 208 Width = 41 Height = 21 Hint = 'D'#233'tecteur 4 (optionnel) associ'#233' au signal' @@ -3429,7 +3421,7 @@ object FormConfig: TFormConfig end object EditSuiv4: TEdit Left = 200 - Top = 192 + Top = 208 Width = 41 Height = 21 Hint = @@ -3442,7 +3434,7 @@ object FormConfig: TFormConfig end object CheckVerrouCarre: TCheckBox Left = 136 - Top = 216 + Top = 240 Width = 137 Height = 17 Hint = @@ -3467,17 +3459,17 @@ object FormConfig: TFormConfig end object ComboBoxAsp: TComboBox Left = 144 - Top = 72 + Top = 96 Width = 137 Height = 21 Style = csDropDownList - ItemHeight = 0 + ItemHeight = 13 TabOrder = 2 OnChange = ComboBoxAspChange end object EditSpecUni: TEdit Left = 8 - Top = 192 + Top = 216 Width = 33 Height = 21 TabOrder = 14 @@ -3485,8 +3477,8 @@ object FormConfig: TFormConfig OnChange = EditSpecUniChange end object Buttonrestaure: TButton - Left = 24 - Top = 272 + Left = 32 + Top = 288 Width = 75 Height = 25 Hint = 'Restaure la configuration du feu d'#39'avant sa modification' @@ -3498,7 +3490,7 @@ object FormConfig: TFormConfig end object CheckBoxFB: TCheckBox Left = 136 - Top = 264 + Top = 288 Width = 153 Height = 17 Caption = 'Avec demande feu blanc' @@ -3506,8 +3498,8 @@ object FormConfig: TFormConfig OnClick = CheckBoxFBClick end object ButtonConfigSR: TButton - Left = 24 - Top = 296 + Left = 32 + Top = 312 Width = 75 Height = 25 Caption = 'Configuration' @@ -3517,7 +3509,7 @@ object FormConfig: TFormConfig end object CheckFVC: TCheckBox Left = 136 - Top = 232 + Top = 256 Width = 121 Height = 17 Hint = 'Remplace le feu vert par un feu vert clignotant' @@ -3529,7 +3521,7 @@ object FormConfig: TFormConfig end object CheckFRC: TCheckBox Left = 136 - Top = 248 + Top = 272 Width = 129 Height = 17 Hint = 'Remplace le s'#233'maphore par un feu rouge clignotant' @@ -3541,7 +3533,7 @@ object FormConfig: TFormConfig end object CheckBoxVersContrevoie: TCheckBox Left = 136 - Top = 280 + Top = 304 Width = 137 Height = 17 Hint = 'Permet d'#39'afficher le chevron si l'#39'aiguillage du signal est devi'#233 @@ -3553,7 +3545,7 @@ object FormConfig: TFormConfig end object CheckBoxContreVoie: TCheckBox Left = 136 - Top = 296 + Top = 320 Width = 129 Height = 17 Hint = 'Signal clignotant' @@ -3565,9 +3557,9 @@ object FormConfig: TFormConfig end object MemoBlanc: TMemo Left = 152 - Top = 368 + Top = 392 Width = 129 - Height = 73 + Height = 65 Hint = 'Une ligne contient les conditions en ET. Les lignes sont cha'#238'n'#233'e' + 's en OU' @@ -3579,8 +3571,8 @@ object FormConfig: TFormConfig OnChange = MemoBlancChange end object RadioGroupLEB: TRadioGroup - Left = 8 - Top = 224 + Left = 16 + Top = 248 Width = 113 Height = 41 Caption = 'Pilotage' @@ -3593,10 +3585,18 @@ object FormConfig: TFormConfig Visible = False OnClick = RadioGroupLEBClick end + object EditTempoSig: TEdit + Left = 240 + Top = 40 + Width = 33 + Height = 21 + TabOrder = 23 + OnChange = EditTempoSigChange + end end object ButtonNouvSig: TButton Left = 0 - Top = 32 + Top = 16 Width = 65 Height = 17 Caption = 'Nouveau' @@ -3605,7 +3605,7 @@ object FormConfig: TFormConfig end object ButtonSupSig: TButton Left = 72 - Top = 32 + Top = 16 Width = 65 Height = 17 Caption = 'Supprime' @@ -3614,7 +3614,7 @@ object FormConfig: TFormConfig end object ButtonInsSig: TButton Left = 144 - Top = 32 + Top = 16 Width = 153 Height = 17 Caption = 'Ajouter le signal supprim'#233 @@ -3642,7 +3642,7 @@ object FormConfig: TFormConfig end object ListBoxSig: TListBox Left = 0 - Top = 56 + Top = 48 Width = 321 Height = 337 Color = clBlack @@ -3779,7 +3779,7 @@ object FormConfig: TFormConfig Top = 56 Width = 193 Height = 21 - ItemHeight = 0 + ItemHeight = 13 TabOrder = 0 OnChange = ComboBoxDecodeurPersoChange end @@ -3798,7 +3798,7 @@ object FormConfig: TFormConfig Width = 145 Height = 21 Style = csDropDownList - ItemHeight = 0 + ItemHeight = 13 TabOrder = 2 OnChange = ComboBoxNationChange end @@ -3844,7 +3844,7 @@ object FormConfig: TFormConfig Width = 193 Height = 21 Style = csDropDownList - ItemHeight = 0 + ItemHeight = 13 TabOrder = 6 OnChange = ComboBoxDecCdeChange end @@ -4057,7 +4057,7 @@ object FormConfig: TFormConfig Top = 96 Width = 137 Height = 21 - ItemHeight = 0 + ItemHeight = 13 TabOrder = 2 OnChange = ComboBoxOperateurChange OnDrawItem = ComboBoxOperateurDrawItem @@ -4077,7 +4077,7 @@ object FormConfig: TFormConfig Top = 96 Width = 161 Height = 21 - ItemHeight = 0 + ItemHeight = 13 ParentShowHint = False ShowHint = True TabOrder = 4 @@ -4189,7 +4189,7 @@ object FormConfig: TFormConfig Width = 145 Height = 21 Style = csDropDownList - ItemHeight = 0 + ItemHeight = 13 TabOrder = 7 OnChange = ComboBoxFLChange end @@ -4739,7 +4739,7 @@ object FormConfig: TFormConfig Height = 21 Hint = 'Nom de l'#39'accessoire d'#233'fini dans l'#39'onglet "p'#233'riph'#233'riques COM/USB"' Style = csDropDownList - ItemHeight = 0 + ItemHeight = 13 ParentShowHint = False ShowHint = True TabOrder = 10 @@ -5099,7 +5099,7 @@ object FormConfig: TFormConfig Top = 16 Width = 337 Height = 457 - ActivePage = TabSheet1 + ActivePage = TtabSheetEt TabOrder = 3 object TabSheetTrGen: TTabSheet Caption = 'G'#233'n'#233'ral' @@ -6313,7 +6313,7 @@ object FormConfig: TFormConfig end object GroupBoxBR: TGroupBox Left = 312 - Top = 176 + Top = 120 Width = 260 Height = 121 Caption = 'Bouton rotatif' @@ -6389,7 +6389,7 @@ object FormConfig: TFormConfig end object GroupBoxBt: TGroupBox Left = 312 - Top = 320 + Top = 224 Width = 260 Height = 121 Caption = 'Bouton' @@ -6466,7 +6466,7 @@ object FormConfig: TFormConfig Width = 153 Height = 21 Style = csDropDownList - ItemHeight = 0 + ItemHeight = 13 TabOrder = 0 OnChange = ComboBoxUSBTrChange end diff --git a/UnitConfig.pas b/UnitConfig.pas index 4648312..df5e8df 100644 --- a/UnitConfig.pas +++ b/UnitConfig.pas @@ -1,6 +1,6 @@ Unit UnitConfig; -interface +interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, @@ -73,7 +73,6 @@ type TabSheetBranches: TTabSheet; Label14: TLabel; TabSheetSig: TTabSheet; - Label15: TLabel; TabSheetPN: TTabSheet; CheckBoxSrvSig: TCheckBox; Memo1: TMemo; @@ -511,6 +510,8 @@ type Label84: TLabel; LabelTitreTrain: TLabel; LabeledEditZone: TLabeledEdit; + EditTempoSig: TEdit; + Label15: TLabel; procedure ButtonAppliquerEtFermerClick(Sender: TObject); procedure FormCreate(Sender: TObject); procedure ListBoxAigMouseDown(Sender: TObject; Button: TMouseButton; @@ -810,6 +811,7 @@ type procedure LabeledEditVit2Change(Sender: TObject); procedure LabeledEditVit3Change(Sender: TObject); procedure LabeledEditZoneChange(Sender: TObject); + procedure EditTempoSigChange(Sender: TObject); private { Déclarations privées } @@ -1066,6 +1068,7 @@ procedure ComboBoxFL_mizajour; procedure clic_BRM; function crans_to_Vrcms(v,idTrain : integer) : single; procedure courbe_train(indexTrain : integer); +procedure cree_icone_train(i : integer); implementation @@ -1580,6 +1583,9 @@ begin end; end; + // tempo de retard au pilotage + s:=s+',T'+intToSTR(Signaux[i].Tempo); + encode_signal:=s; end; @@ -1623,6 +1629,7 @@ begin begin inc(NbreSignaux); Signaux[i].adresse:=adresse; + Signaux[i].Tempo:=0; tablo_Index_Signal[adresse]:=i; // stocker l'index provisoire avant tri j:=pos(',',s); if j>1 then @@ -1970,7 +1977,6 @@ begin val(s,j,erreur); delete(s,1,erreur); Signaux[i].na:=j; - end; end; @@ -1994,11 +2000,18 @@ begin if (j<0) or (j>5) then begin j:=5;affiche('Paramètre NA incorrect dans ligne '+chaine_signal,clred) - end; - Signaux[i].na:=j; - end; - end; - end; + end; + Signaux[i].na:=j; + end; + end; + if length(s)>1 then if s[1]='T' then + begin + delete(s,1,1); + val(s,j,erreur); + delete(s,1,erreur); + signaux[i].Tempo:=j; + end; + end; end; end; end; @@ -3090,6 +3103,21 @@ begin result:=s; end; +procedure cree_icone_train(i : integer); +begin + Trains[i].icone:=Timage.create(nil); + with Trains[i].icone do + begin + autosize:=true; + align:=alNone; + parent:=nil; + name:='IconeTrain'+intToSTR(i); + top:=0;left:=0; + width:=200; + height:=100; + end; +end; + // génère les informations calculées procedure genere_informations_BD; begin @@ -4495,7 +4523,9 @@ const LessThanValue=-1; if i<>0 then begin delete(s,i,1); - val(s,trains[ntrains].vitnominale,erreur); + val(s,i,erreur); + if i=0 then i:=trains[ntrains].vitMax; + trains[ntrains].vitnominale:=i; delete(s,1,erreur-1); end; @@ -4503,7 +4533,9 @@ const LessThanValue=-1; if i<>0 then begin delete(s,i,1); - val(s,trains[ntrains].vitralenti,erreur); + val(s,i,erreur); + if i=0 then i:=trains[ntrains].vitnominale div 2; + trains[ntrains].vitralenti:=i; delete(s,1,erreur-1); end; @@ -4514,18 +4546,7 @@ const LessThanValue=-1; i:=pos(',',s); if i=0 then i:=length(s)+1; trains[ntrains].NomIcone:=copy(s,1,i-1); - Trains[ntrains].icone:=Timage.create(nil); - - with Trains[ntrains].icone do - begin - autosize:=true; - align:=alNone; - parent:=nil; - name:='IconeTrain'+intToSTR(nTrains); - top:=0;left:=0; - width:=200; - height:=100; - end; + cree_icone_train(ntrains); Formprinc.ComboTrains.Items.Add(trains[ntrains].nom_train); delete(s,1,i-1); @@ -6633,6 +6654,8 @@ begin Signal_Sauve:=Signaux[index]; // sauvegarde + formconfig.listBoxSig.itemIndex:=index-1; + formconfig.listBoxSig.Selected[index-1]:=true; AncLigneClicSig:=ligneclicSig; ligneClicSig:=index-1; @@ -7356,6 +7379,9 @@ begin end; ButtonRdt.Caption:=s; + ListBoxTrains.ItemIndex:=index-1; + ListBoxTrains.selected[index-1]:=true; + editNomTrain.text:=Trains[index].nom_train; LabelTitreTrain.Caption:=Trains[index].nom_train; editAdresseTrain.Text:=intToSTR(trains[index].adresse); @@ -7798,18 +7824,22 @@ begin end else Affiche('Le fichier icône train '+s+' n''a pas été trouvé',clred); end; - cree_image_train(i); + cree_image_onglet_train(i); end; affecte_trains_config; // affecte les trains aux cantons + labeledEditVit1.Hint:='Vitesse en crans du coefficient V1'+#13+'(vitesse lente)'; + labeledEditVit2.Hint:='Vitesse en crans du coefficient V2'+#13+'(vitesse moyenne)'; + labeledEditVit3.Hint:='Vitesse en crans du coefficient V3'+#13+'(vitesse rapide)'; + with StringGridArr do begin Hint:='-'; ShowHint:=true; ColCount:=4; // nombre de colonnes RowCount:=NbDetArret+1; - Options := StringGridArr.Options + [goEditing]; + Options:=StringGridArr.Options + [goEditing]; // autorise la modification de la stringGrid ColWidths[0]:=0; // colonne grise invisible ColWidths[1]:=round(70/RedFonte); // Précédent ColWidths[2]:=round(70/RedFonte); // détecteur @@ -7820,7 +7850,7 @@ begin Cells[3,0]:='Temps (s)'; for i:=0 to RowCount-1 do RowHeights[i]:=18; - end; + end; {$IF CompilerVersion >= 28.0} labelD12.Visible:=true; @@ -8472,6 +8502,10 @@ begin begin ComboBoxDec.items.add(decodeur[i-1]); end; + EditTempoSig.Hint:='Temporisation de retard de l''affichage en dixièmes de secondes.'+#13+ + 'Ne fonctionne qu''en mode de pilotage asynchrone.'+#13+ + 'Voir paramètres avancés / pilotage des accessoires.'; + EditTempoSig.ShowHint:=true; // décodeurs personalisés for i:=1 to NbreDecPers do @@ -8612,7 +8646,7 @@ begin EditVitRalenti.Hint:='Vitesse après l''avertissement'+#13+'en crans'; EditVitNom.Hint:='Vitesse si voie libre'+#13+'en crans'; EditVitesseMaxi.Hint:='Vitesse maximale autorisée par le décodeur'+#13+'en crans'; - + i:=1; RichCdeDCCpp.clear; repeat @@ -9257,6 +9291,7 @@ begin if decodeur<>4 then RadioGroupLEB.Visible:=false; // plus tard !! if decodeur>=11 then ButtonConfigSR.Visible:=true; + editTempoSig.Text:=intToSTR(signaux[index].Tempo); case d of 2 : ComboBoxAsp.ItemIndex:=0; @@ -10127,6 +10162,26 @@ begin if affevt then Affiche('Evt ComboBox Decodeur',clOrange); end; +procedure TFormConfig.EditTempoSigChange(Sender: TObject); +var s : string; + i,erreur : integer; +begin + if clicliste or (ligneClicSig<0) then exit; + if FormConfig.PageControl.ActivePage=FormConfig.TabSheetSig then + with Formconfig do + begin + s:=EditTempoSig.Text; + Val(s,i,erreur); + if (s='') or (erreur<>0) or (i<0) then begin LabelInfo.caption:='Erreur temporisation signal ';exit;end; + LabelInfo.caption:=' '; + Signaux[ligneClicSig+1].Tempo:=i; + + s:=encode_signal(ligneClicSig+1); + ListBoxSig.Items[ligneClicSig]:=s; + Signaux[ligneClicSig+1].modifie:=true; + ListBoxSig.selected[ligneClicSig]:=true; + end; +end; procedure TFormConfig.EditDet1Change(Sender: TObject); var s : string; @@ -11209,6 +11264,7 @@ begin Signaux[i].SR[8].sortie0:=19; Signaux[i].SR[8].sortie1:=0; Signaux[i].Na:=4; + Signaux[i].Tempo:=0; cree_image_signal(i); s:=encode_signal(i); @@ -11301,12 +11357,13 @@ begin Parent:=Formprinc.ScrollBoxSig; // dire que l'image est dans la scrollBox1 Top:=(HtImg+espY+20)*((j-1) div NbreImagePLigne); // détermine les points d'origine Left:=10+ (LargImg+5)*((j-1) mod (NbreImagePLigne)); - Name:='ImageSignal'+IntToSTR(Signaux[j].adresse); + Name:='ImageSignal'+IntToSTR(j); Maj_Hint_Signal(j); end; with Signaux[j].Lbl do begin + Name:='LabelSignal'+intToSTR(j); Top:=HtImg+((HtImg+EspY+20)*((j-1) div NbreImagePLigne)); Left:=10+ (LargImg+5)*((j-1) mod (NbreImagePLigne)); caption:='@'+IntToSTR(Signaux[j].adresse); @@ -11314,7 +11371,7 @@ begin if Signaux[j].checkFB<>nil then with Signaux[j].CheckFB do begin - Name:='CheckBoxFB'+intToSTR(Signaux[j].adresse); + Name:='CheckBoxFB'+intToSTR(j); Hint:='Feu blanc'; Top:=HtImg+15+((HtImg+EspY+20)*((j-1) div NbreImagePLigne)); Left:=10+ (LargImg+5)*((j-1) mod (NbreImagePLigne)); @@ -14433,20 +14490,10 @@ begin VitNominale:=60; VitRalenti:=40; vitmax:=120; - icone:=Timage.create(nil); - with icone do - begin - Name:='IconeTrain'+intToSTR(nTrains); - autosize:=true; - align:=alNone; - parent:=nil; - top:=0;left:=0; - width:=200; - height:=100; - end; end; - clicListeTrains(ntrains); + cree_icone_train(nTrains); + ligneclicTrain:=ntrains-1; clicListe:=false; @@ -14463,7 +14510,8 @@ begin perform(WM_VSCROLL,SB_BOTTOM,0); end; - cree_image_Train(ntrains); + clicListeTrains(ntrains); + cree_image_onglet_Train(ntrains); // ajoute le compteur cree_GB_compteur(ntrains); @@ -16550,9 +16598,6 @@ begin if clicproprietesSig then clicListeSignal(IndexSignalClic); clicproprietesSig:=false; - if clicproprietesTrains then clicListeTrains(ligneclicTrain+1); - clicproprietesTrains:=false; - // aiguillages ListBoxAig.Clear; @@ -16584,6 +16629,8 @@ begin clear; for i:=1 to ntrains do items.Add(encode_train(i)); end; + if clicproprietesTrains then clicListeTrains(ligneclicTrain+1); + clicproprietesTrains:=false; tsbouton:=FormConfig.PageControl.ActivePage=TabSheetBouton; @@ -19672,7 +19719,6 @@ begin caption:=intToSTR(ValVitTrain[i]); end; - end; procedure TFormConfig.LabeledEditVit1Change(Sender: TObject); @@ -19742,10 +19788,6 @@ begin calcul_equations_coeff(ligneclicTrain+1); end; - - - - end. diff --git a/UnitDebug.dfm b/UnitDebug.dfm index a1c7af3..c7c9cb3 100644 --- a/UnitDebug.dfm +++ b/UnitDebug.dfm @@ -32,6 +32,7 @@ object FormDebug: TFormDebug Width = 872 Height = 677 HorzScrollBar.Visible = False + VertScrollBar.Position = 96 Anchors = [akLeft, akTop, akRight, akBottom] Color = clBtnFace ParentColor = False @@ -41,7 +42,7 @@ object FormDebug: TFormDebug 673) object LabelTitreDebug: TLabel Left = 475 - Top = 8 + Top = -88 Width = 131 Height = 18 Anchors = [akTop, akRight] @@ -55,7 +56,7 @@ object FormDebug: TFormDebug end object Label1: TLabel Left = 627 - Top = 10 + Top = -86 Width = 108 Height = 13 Anchors = [akTop, akRight] @@ -71,7 +72,7 @@ object FormDebug: TFormDebug end object RichDebug: TRichEdit Left = 0 - Top = 0 + Top = -96 Width = 454 Height = 753 Anchors = [akLeft, akTop, akRight] @@ -85,7 +86,7 @@ object FormDebug: TFormDebug end object ButtonRazTout: TButton Left = 465 - Top = 216 + Top = 120 Width = 97 Height = 25 Hint = @@ -100,7 +101,7 @@ object FormDebug: TFormDebug end object ButtonCop: TButton Left = 465 - Top = 248 + Top = 152 Width = 97 Height = 41 Anchors = [akTop, akRight] @@ -117,7 +118,7 @@ object FormDebug: TFormDebug end object ButtonAffEvtChrono: TButton Left = 465 - Top = 296 + Top = 200 Width = 97 Height = 33 Anchors = [akTop, akRight] @@ -128,7 +129,7 @@ object FormDebug: TFormDebug end object ButtonCherche: TButton Left = 465 - Top = 336 + Top = 240 Width = 97 Height = 25 Hint = 'Cherche la cha'#238'ne "erreur"' @@ -141,7 +142,7 @@ object FormDebug: TFormDebug end object ButtonEcrLog: TButton Left = 465 - Top = 184 + Top = 88 Width = 97 Height = 29 Anchors = [akTop, akRight] @@ -151,7 +152,7 @@ object FormDebug: TFormDebug end object ButtonRazTampon: TButton Left = 465 - Top = 368 + Top = 272 Width = 97 Height = 33 Anchors = [akTop, akRight] @@ -162,7 +163,7 @@ object FormDebug: TFormDebug end object ButtonRazLog: TButton Left = 465 - Top = 408 + Top = 312 Width = 97 Height = 33 Anchors = [akTop, akRight] @@ -173,7 +174,7 @@ object FormDebug: TFormDebug end object MemoEvtDet: TRichEdit Left = 570 - Top = 186 + Top = 90 Width = 272 Height = 263 Anchors = [akTop, akRight] @@ -184,7 +185,7 @@ object FormDebug: TFormDebug end object GroupBox5: TGroupBox Left = 462 - Top = 456 + Top = 360 Width = 380 Height = 57 Anchors = [akTop, akRight] @@ -251,7 +252,7 @@ object FormDebug: TFormDebug end object GroupBox6: TGroupBox Left = 462 - Top = 520 + Top = 424 Width = 380 Height = 52 Anchors = [akTop, akRight] @@ -328,7 +329,7 @@ object FormDebug: TFormDebug end object GroupBoxPrim: TGroupBox Left = 464 - Top = 584 + Top = 488 Width = 378 Height = 185 Anchors = [akTop, akRight] @@ -499,7 +500,7 @@ object FormDebug: TFormDebug end object GroupBox2: TGroupBox Left = 466 - Top = 28 + Top = -68 Width = 376 Height = 149 Anchors = [akTop, akRight] @@ -712,7 +713,7 @@ object FormDebug: TFormDebug end object EditNivDebug: TEdit Left = 751 - Top = 8 + Top = -88 Width = 49 Height = 21 Anchors = [akTop, akRight] diff --git a/UnitPrinc.dfm b/UnitPrinc.dfm index 8e68d96..36032a0 100644 --- a/UnitPrinc.dfm +++ b/UnitPrinc.dfm @@ -1,11 +1,11 @@ object FormPrinc: TFormPrinc - Left = -8 - Top = -8 + Left = 330 + Top = 216 Anchors = [akLeft, akTop, akRight] BorderStyle = bsNone Caption = 'Signaux complexes' - ClientHeight = 942 - ClientWidth = 1280 + ClientHeight = 513 + ClientWidth = 915 Color = clBtnFace Font.Charset = DEFAULT_CHARSET Font.Color = clWindowText @@ -23,8 +23,8 @@ object FormPrinc: TFormPrinc OnKeyDown = FormKeyDown OnResize = FormResize DesignSize = ( - 1280 - 942) + 915 + 513) PixelsPerInch = 96 TextHeight = 13 object LabelTitre: TLabel @@ -1432,7 +1432,7 @@ object FormPrinc: TFormPrinc Visible = False end object LabelClock: TLabel - Left = 1188 + Left = 823 Top = 0 Width = 85 Height = 22 @@ -5443,8 +5443,8 @@ object FormPrinc: TFormPrinc end object StatusBar1: TStatusBar Left = 0 - Top = 920 - Width = 1280 + Top = 491 + Width = 915 Height = 22 Panels = < item @@ -5963,7 +5963,7 @@ object FormPrinc: TFormPrinc Top = 200 Width = 393 Height = 265 - ActivePage = TabSheetComp + ActivePage = TabSheetSig Anchors = [] TabOrder = 5 OnChange = PageControlChange diff --git a/UnitPrinc.pas b/UnitPrinc.pas index 000e9ef..f96df66 100644 --- a/UnitPrinc.pas +++ b/UnitPrinc.pas @@ -4,12 +4,14 @@ unit Unitprinc; Programme signaux complexes Graphique Lenz Composants ClientSocket et ServeurSocket pour les connexions réseau socket + -------------------------------------------------------------- Delphi 7 : on utilise activeX Tmscomm pour les liaisons série/USB + -------------------------------------------------------------- Delphi 12 : Dans Outils / Options / Interface utilisateurs / Concerpteur de fiches / Haute résolution - Sélextionner Automatique (PPI de l'écran) et cocher "taille de la grille..." + Sélectionner Automatique (PPI de l'écran) et cocher "taille de la grille..." on utilise AsyncPro pour les liaisons série/USB - ce composant est compilable en 32 et en 64 bits. https://github.com/TurboPack/AsyncPro @@ -28,8 +30,7 @@ unit Unitprinc; LnsQueue.pas OoMisc.pas - un essai avec IdTCPClient (Indy) a été fait avec D7/D12. En D7 nécéssite le fichier Idtcpclient.dcu. - En D12 l'event Rx nécessite un thread et ne fonctionne pas bien. C'est ok en D7. + ------------------------------------------------- Options de compilation D7: options du debugger/exception du langage : décocher "arreter sur exceptions delphi" sinon une exception surgira au moment de l'ouverture du com @@ -91,8 +92,6 @@ unit Unitprinc; //{$D-} // pas d'information de debuggage : pas de débug possible //{$L-} // pas d'information sur les symboles locaux -{$DEFINE xAvecIdTCP} // le composant IdTCPClient n'a pas d'evt receive, il faut le traiter dans un thread -// il ne marche pas bien en version D12, l'évent RX provoque une violation au démarrage puis plus rien interface uses @@ -103,10 +102,6 @@ uses , psAPI // GetModuleFileNameEx - {$IFDEF AvecIdTCP} - ,IdTCPClient // client socket indy , ne marche pas bien - {$ENDIF} - {$IF CompilerVersion >= 28.0} // si delphi>=12 ,Vcl.Themes // pour les thèmes d'affichage (auric etc) ,Vcl.Styles.Ext // styles étendus @@ -476,105 +471,10 @@ type {$IF CompilerVersion >= 28.0} procedure DataReceived(const Data: TidBytes); {$ELSE} - procedure DataReceived(const Data: string); // réception interface socket indy + procedure DataReceived(const Data: string); {$IFEND} end; - {$IFDEF AvecIdTCP} - {$IF CompilerVersion >= 28.0} - // thread interface socket Indy D12, pour créer event en réception - TDataEventInterface=procedure(const Data: TidBytes) of object; - TreadingThreadInterface=class(TThread) - private - FClient: TIdTCPClient; - Fdata : Tidbytes; - FOnData: TDataEventInterface; - protected - procedure Execute; override; - public - constructor Create(AClient: TIdTCPClient); reintroduce; - property OnData: TDataEventInterface read FOnData write FOnData; - procedure DataReceived; - end; - - // thread périphérique1 D12 socket Indy - TDataEventPeriph1=procedure(const Data: TidBytes) of object; - TreadingThreadPeriph1=class(TThread) - private - FClient: TIdTCPClient; - Fdata : Tidbytes; - FOnData: TDataEventPeriph1; - protected - procedure Execute; override; - public - constructor Create(AClient: TIdTCPClient); reintroduce; - property OnData: TDataEventPeriph1 read FOnData write FOnData; - procedure DataReceived; - end; - - // thread périphérique2 D12 socket Indy - TDataEventPeriph2=procedure(const Data: TidBytes) of object; - TreadingThreadPeriph2=class(TThread) - private - FClient: TIdTCPClient; - Fdata : Tidbytes; - FOnData: TDataEventPeriph2; - protected - procedure Execute; override; - public - constructor Create(AClient: TIdTCPClient); reintroduce; - property OnData: TDataEventPeriph2 read FOnData write FOnData; - procedure DataReceived; - end; - - {$ELSE} - - // Thread interface Indy D7 - TDataEventInterface=procedure(const Data: string) of object; - TreadingThreadInterface=class(TThread) - private - FClient: TIdTCPClient; - FData: string; - FOnData: TDataEventInterface; - protected - procedure Execute; override; - public - constructor Create(AClient: TIdTCPClient); reintroduce; - property OnData: TDataEventInterface read FOnData write FOnData; - procedure DataReceived; - end; - - // Thread périph1 Indy D7 - TDataEventPeriph1=procedure(const Data: string) of object; - TreadingThreadPeriph1=class(TThread) - private - FClient: TIdTCPClient; - FData: string; - FOnData: TDataEventPeriph1; - protected - procedure Execute; override; - public - constructor Create(AClient: TIdTCPClient); reintroduce; - property OnData: TDataEventPeriph1 read FOnData write FOnData; - procedure DataReceived; - end; - - // Thread périph2 Indy D7 - TDataEventPeriph2=procedure(const Data: string) of object; - TreadingThreadPeriph2=class(TThread) - private - FClient: TIdTCPClient; - FData: string; - FOnData: TDataEventPeriph2; - protected - procedure Execute; override; - public - constructor Create(AClient: TIdTCPClient); reintroduce; - property OnData: TDataEventPeriph2 read FOnData write FOnData; - procedure DataReceived; - end; - {$IFEND} - {$ENDIF} const titre='Signaux complexes GL '; @@ -881,6 +781,7 @@ TSignal = record end; Na : integer; // nombre d'adresses du signal occupées par le décodeur CDF/SR/digikeijs/Belge DetAmont : TtabloDet; // tableau des détecteurs amonts, calculés à la lecture du fichier de config + Tempo : integer; // temporisation de retard au pilotage en x100 ms end; TPeripherique = record @@ -1059,7 +960,7 @@ tTrain = record end; -Ttache = array[1..MaxTaches] of record +Ttache = record typeTache : integer ; // 0:rien - 1:accessoire 2:vitesse train 3:fonction F 4:tempo traite : boolean; // traitement en cours tempo : integer; // tempo avant exécution de la commande @@ -1161,10 +1062,6 @@ var end; Adresse_detecteur : array[0..NbMaxDet] of integer; // adresses des détecteurs par index - {$IFDEF AvecIdTCP} - clientTCPInterface: tidtcpclient; - {$ENDIF} - Ecran : array[1..10] of record // écrans du pc x0,y0,larg,haut : integer; end; @@ -1174,7 +1071,7 @@ var PortDistant,PortLocal : integer; end; - taches : Ttache; + taches : array[1..MaxTaches] of Ttache; Actionneur_trouve : array[1..10] of integer; @@ -1359,12 +1256,6 @@ var Aig_supprime,Aig_sauve : TAiguillage; BrancheN : array[1..MaxBranches,1..MaxElBranches] of TBranche; chaine_recue : TchaineBIN; - {$IFDEF AvecIdTCP} //-----------composant Indy - ThreadInterface : TReadingThreadInterface; - ThreadPeriph1 : TReadingThreadPeriph1; - ThreadPeriph2 : TReadingThreadPeriph2; - ClientSocketIdInterface: tIdTCPClient; - {$ENDIF} ClientSocketInterface: TClientSocket; ClientInfo : TclientSocket; @@ -1409,7 +1300,7 @@ function verif_UniSemaf(adresse,UniSem : integer) : integer; function verif_LEB(adresse,UniSem : integer) : integer; function Select_dessin_Signal(TypeSignal : integer) : TBitmap; procedure cree_image_signal(rang : integer); -procedure cree_image_Train(rang : integer); +procedure cree_image_onglet_Train(rang : integer); procedure trouve_aiguillage(adresse : integer); procedure trouve_detecteur(detecteur : integer); function ProcessRunning(sExeName: String) : Boolean; @@ -1507,88 +1398,6 @@ uses UnitDebug, UnitPilote, UnitSimule, UnitTCO, UnitConfig, UnitModifAction, selection_train, UnitRouteTrains, UnitRoute, UnitMesure, UnitCompteur; -{$IFDEF AvecIdTCP} //------ composant indy socket réseau - // création thread interface - constructor TReadingThreadInterface.Create(AClient: TIdTCPClient); - begin - inherited Create(True); - FClient:=AClient; - end; - - procedure TReadingThreadInterface.Execute; - begin - while not Terminated do - begin - {$IF CompilerVersion >= 28.0} - Fclient.IOHandler.ReadBytes(Fdata,0,false); - if (FData <> nil) and Assigned(FOnData) then - {$ELSE} - FData := FClient.CurrentReadBuffer; - if (FData <> '') and Assigned(FOnData) then - {$IFEND} - Synchronize(DataReceived); - end; - end; - - procedure TReadingThreadInterface.DataReceived; - begin - if Assigned(FOnData) then FOnData(FData); - end; - - constructor TReadingThreadPeriph1.Create(AClient: TIdTCPClient); - begin - inherited Create(True); - FClient := AClient; - end; - - // création thread périphérique1 - procedure TReadingThreadPeriph1.DataReceived; - begin - if Assigned(FOnData) then FOnData(FData); - end; - - procedure TReadingThreadPeriph1.Execute; - begin - while not Terminated do - begin - {$IF CompilerVersion >= 28.0} - Fclient.IOHandler.ReadBytes(Fdata,0,false); - if (FData <> nil) and Assigned(FOnData) then - {$ELSE} - FData:=FClient.CurrentReadBuffer; - if (FData <> '') and Assigned(FOnData) then - {$IFEND} - Synchronize(DataReceived); - end; - end; - - // création thread périphérique2 - procedure TReadingThreadPeriph2.DataReceived; - begin - if Assigned(FOnData) then FOnData(FData); - end; - - constructor TReadingThreadPeriph2.Create(AClient: TIdTCPClient); - begin - inherited Create(True); - FClient := AClient; - end; - - procedure TReadingThreadPeriph2.Execute; - begin - while not Terminated do - begin - {$IF CompilerVersion >= 28.0} - Fclient.IOHandler.ReadBytes(Fdata,0,false); - if (FData <> nil) and Assigned(FOnData) then - {$ELSE} - FData := FClient.CurrentReadBuffer; - if (FData <> '') and Assigned(FOnData) then - {$IFEND} - Synchronize(DataReceived); - end; - end; -{$ENDIF} { procedure menu_interface(MA : TMA); @@ -2589,11 +2398,7 @@ begin // par socket (ethernet) if parSocketLenz or (etat_init_interface>=11) then begin - {$IFDEF AvecIdTCP} - ClientSocketIdInterface.IoHandler.write(RawToBytes(z,l)); // RawToBytes() convertit n'importe quoi en TidBytes - {$ELSE} ClientSocketInterface.Socket.SendBuf(z,l); - {$ENDIF} if not modetache then sleep(30); end; end; @@ -2688,11 +2493,7 @@ begin // par socket (ethernet) if parSocketLenz or (etat_init_interface>=11) then begin - {$IFDEF AvecIdTCP} - ClientSocketIdInterface.Socket.Send(TrameIF[0],l); - {$ELSE} ClientSocketInterface.Socket.SendBuf(TrameIF[0],l); - {$ENDIF} if not modetache then Sleep(30); end; end; @@ -5389,7 +5190,7 @@ begin Signaux[rang].Lbl:=Tlabel.create(Formprinc.ScrollBoxSig); with Signaux[rang].Lbl do begin - Name:='LabelSignal'+intToSTR(Signaux[rang].adresse); + Name:='LabelSignal'+intToSTR(rang); caption:=' '+IntToSTR(Signaux[rang].adresse); font.Style:=[fsBold]; Parent:=Formprinc.ScrollBoxSig; @@ -5409,7 +5210,7 @@ begin begin onClick:=formprinc.proc_checkBoxFB; // affecter l'adresse de la procédure de traitement quand on clique dessus Hint:='Feu blanc'; - Name:='CheckBoxFB'+intToSTR(adresse); // affecter l'adresse du feu pour pouvoir le retrouver dans la procédure + Name:='CheckBoxFB'+intToSTR(rang); // affecter l'adresse du feu pour pouvoir le retrouver dans la procédure caption:='dem FB'; font.color:=clBlack; Parent:=Formprinc.ScrollBoxSig; @@ -5595,7 +5396,7 @@ end; // cliqué train procedure tFormprinc.ImageTrainonclick(Sender : tObject); var P_component : tComponent; - i : integer; + i : integer; begin //Affiche('clic image train',clred); P_component:=sender as Tcomponent; @@ -5671,7 +5472,7 @@ end; // créée une image dans l'onglet trains , 2 label dynamiquement dans la partie droite pour un nouveau train déclaré dans le fichier de config // rang commence à 1 -procedure cree_image_Train(rang : integer); +procedure cree_image_onglet_Train(rang : integer); var i,adresse : integer; s : string; begin @@ -5982,7 +5783,7 @@ begin chaine_CDM_Acc:=so+s; end; -// met une tache en tableau taches[] pour le timer +// ajoute une tache en tableau taches[] pour le timer // ttache=1 : pilote accessoire... // temporisation pour le timer avant action // destinataire (1=CDM 2=XpressNet 3=Dccpp) @@ -10003,7 +9804,7 @@ begin end else begin - s:='Impossible de déterminer le passage de l''aiguillage '+intToSTR(adr); + s:='Erreur 841 : impossible de déterminer le passage de l''aiguillage '+intToSTR(adr); if (nivDebug=3) or ProcPrinc then AfficheDebug(s,clred); Affiche(s,clred); result:=9999; @@ -10124,7 +9925,7 @@ begin // extrémité 1 530 if (aiguillage[index].ADroit=prec) and (aiguillage[index].ADroitB=Aprec) then begin - if aiguillage[index].position=const_droit then + if aiguillage[index].position=const_droit then begin adr:=aiguillage[index].Ddroit; a:=aiguillage[index].DDroitB; @@ -10254,7 +10055,8 @@ begin (aiguillage[index2].position=const_droit) ) then begin // d'où vient ton sur la tjs - if BtypePrec=Aig then + // si on vient d'un aiguillage pas en pointe + if (BtypePrec=Aig) and (aiguillage[index].AdroitB<>'P') then begin if ( ((aiguillage[index].AdroitB)='S') and (aiguillage[index_aig(prec)].position=const_devie) ) or ( ((aiguillage[index].AdroitB)='D') and (aiguillage[index_aig(prec)].position=const_droit) ) @@ -10323,7 +10125,8 @@ begin end; // d'où vient ton sur la tjd - if BtypePrec=Aig then + // si on vient d'un aiguillage pas en pointe + if (BtypePrec=Aig) and (aiguillage[index].AdroitB<>'P') then begin if ( ((aiguillage[index].AdroitB)='S') and (aiguillage[index_aig(prec)].position=const_devie) ) or ( ((aiguillage[index].AdroitB)='D') and (aiguillage[index_aig(prec)].position=const_droit) ) @@ -10403,7 +10206,8 @@ begin exit; end; // d'où vient t-on sur la tjd - if BtypePrec=Aig then + // si on vient d'un aiguillage pas en pointe + if (BtypePrec=Aig) and (aiguillage[index].AdevieB<>'P') then begin if ( ((aiguillage[index].AdevieB)='S') and (aiguillage[index_aig(prec)].position=const_devie) ) or ( ((aiguillage[index].AdevieB)='D') and (aiguillage[index_aig(prec)].position=const_droit) ) @@ -10478,7 +10282,7 @@ begin and (aiguillage[index2].position=const_devie) then begin // d'où vient ton sur la tjd - if BtypePrec=Aig then + if (BtypePrec=Aig) and (aiguillage[index].AdevieB<>'P') then begin if ( ((aiguillage[index].AdevieB)='S') and (aiguillage[index_aig(prec)].position=const_devie) ) or ( ((aiguillage[index].AdevieB)='D') and (aiguillage[index_aig(prec)].position=const_droit) ) @@ -11876,6 +11680,7 @@ begin // trouver éléments avant le signal for i:=1 to MaxParcours do tabloDet[i]:=0; i:=index_signal(adresse); + if isDirectionnel(i) then exit; if i=0 then begin affiche('Erreur 842 : signal '+intToSTR(adresse)+' inconnu',clred); @@ -11893,6 +11698,10 @@ begin tq2:=det; el1:=Signaux[i].Adr_el_suiv1; tq1:=Signaux[i].Btype_suiv1; + if el1=0 then + begin + Affiche('Erreur le signal '+intToSTR(adresse)+' ne comporte pas d''élément suivant',clred); + end; end; 2 : begin el2:=Signaux[i].Adr_det2; @@ -11914,6 +11723,7 @@ begin end; end; + if el2<>0 then begin it:=0; @@ -12729,7 +12539,7 @@ begin sort:=false; repeat inc(j); - AdrSuiv:=suivant_alg3(prec,typeElPrec,actuel,typeELActuel,2); // arret sur aiguille en talon mal positionéne + AdrSuiv:=suivant_alg3(prec,typeElPrec,actuel,typeELActuel,2); // arret sur aiguille en talon mal positionnée if (AdrSuiv=9999) or (AdrSuiv=9996) or (AdrSuiv=9995) then // élément non trouvé ou position aiguillage inconnu ou buttoir begin; @@ -14020,7 +13830,7 @@ begin if AdrSuiv=0 then begin EtatDet:=Detecteur[actuel].etat and detect; - Pres_Train:=Pres_Train or etatDet; + Pres_Train:=Pres_Train or etatDet; // contrôle si détecteur à 1 et si mode détecteur if Pres_Train and (adrTr=0) then begin if roulage then AdrTr:=Detecteur[actuel].AdrTrain; @@ -18057,7 +17867,14 @@ var s: string; faire_event,inv,bjd,rf : boolean; prov,index,i,id,etatact,typ,adr : integer; begin - if AffAigDet then Affiche('Tick='+IntToSTR(tick)+' Event Aig '+intToSTR(adresse)+'='+intToSTR(pos),clorange); + if AffAigDet then + begin + s:='Tick='+IntToSTR(tick)+' Event Aig '+intToSTR(adresse)+'='+intToSTR(pos); + if pos=const_droit then s:=s+' [droit]'; + if pos=const_devie then s:=s+' [dévié]'; + + Affiche(s,clorange); + end; index:=index_aig(adresse); if index<>0 then begin @@ -18245,7 +18062,7 @@ end; // pilote accessoire sous condition, version taches par le timer function pilote_acc_sc_taches(adresse : integer;octet : byte;Acc : TAccessoire;adrTrain : integer) : boolean; -var groupe,temp,indexAig,AdrTrainLoc : integer ; +var groupe,temp,index,AdrTrainLoc : integer ; fonction,pilotage,pilotageCDM : byte; s : string; begin @@ -18256,20 +18073,21 @@ begin exit; end; pilotage:=octet; - indexAig:=index_aig(adresse); + if Acc=aigP then index:=index_aig(adresse); + if acc=Signal then Index:=Index_Signal(adresse); // test si pilotage aiguillage inversé if (acc=aigP) then begin - if indexAig<>0 then + if index<>0 then begin - AdrTrainLoc:=aiguillage[indexAig].AdrTrain; + AdrTrainLoc:=aiguillage[index].AdrTrain; if (AdrTrainLoc<>0) and (AdrTrain<>0) and (AdrTrainLoc<>AdrTrain) then begin Affiche('Pilotage impossible, l''aiguillage '+intToSTR(adresse)+' est réservé par le train @'+intToSTR(AdrTrainLoc),clred); Result:=false; exit; end; - if (aiguillage[indexAig].inversionCDM=1) then + if (aiguillage[index].inversionCDM=1) then begin if octet=1 then pilotage:=2 else pilotage:=1; end; @@ -18287,13 +18105,13 @@ begin s:=chaine_CDM_Acc(adresse,pilotageCDM); // pilotage actif de l'accessoire---------------- - tache(ttacheAcc,0,ttDestCDM,s); // TypeTache,tempo,destinataire,chaine - + if acc<>signal then tache(ttacheAcc,0,ttDestCDM,s) // TypeTache,tempo,destinataire,chaine + else tache(ttacheAcc,signaux[index].Tempo,ttDestCDM,s); // si l'accessoire est un signal et sans raz des signaux, sortir if (acc=signal) and not(Raz_Acc_signaux) then exit; if Acc=AigP then begin - temp:=aiguillage[indexAig].temps;if temp=0 then temp:=4; // mini pour pilotage en signaux LEB + temp:=aiguillage[index].temps;if temp=0 then temp:=4; // mini pour pilotage en signaux LEB end; // remise à 0 -------------- @@ -18301,7 +18119,7 @@ begin tache(ttacheAcc,temp,ttDestCDM,s); // TypeTache,tempo,destinataire,chaine // si l'accessoire est un aiguillage, temporiser suivant variable de séquenceent - if indexaig<>0 then tache(ttacheTempo,tempo_Aig div 100,0,''); + if index<>0 then tache(ttacheTempo,tempo_Aig div 100,0,''); result:=true; end; @@ -18328,7 +18146,9 @@ begin if debug_dec_sig and (acc=signal) then AfficheDebug('Tick='+IntToSTR(Tick)+' signal '+intToSTR(adresse)+' '+intToSTR(pilotage),clorange); //if avecAck then envoi(s) else envoi_ss_ack(s); // envoi de la trame avec/sans attente Ack - tache(ttacheAcc,0,ttDestXpressNet,s); // TypeTache,tempo,destinataire,chaine + + if acc<>signal then tache(ttacheAcc,0,ttDestXpressNet,s) + else tache(ttacheAcc,signaux[index].Tempo,ttDestCDM,s); // si l'accessoire est un signal et sans raz des signaux, sortir if (acc=signal) and not(Raz_Acc_signaux) then exit; @@ -18336,7 +18156,7 @@ begin // si aiguillage, faire une temporisation if Acc=AigP then begin - temp:=aiguillage[indexAig].temps;if temp=0 then temp:=4; + temp:=aiguillage[index].temps;if temp=0 then temp:=4; end; // pilotage à 0 pour éteindre le pilotage de la bobine du relais @@ -18346,7 +18166,7 @@ begin //if avecAck then envoi(s) else envoi_ss_ack(s); // envoi de la trame avec ou sans Ack tache(ttacheAcc,temp,ttDestXpressNet,s); - if indexAig<>0 then tache(ttacheTempo,tempo_Aig div 100,0,''); + if index<>0 then tache(ttacheTempo,tempo_Aig div 100,0,''); //affiche('5.'+intToSTR(tick),clyellow); result:=true; @@ -18370,7 +18190,7 @@ begin end; end; - if indexAig<>0 then event_aig(adresse,octet) + if index<>0 then event_aig(adresse,octet) else // Serveur envoi au clients Envoi_serveur('T'+intToSTR(adresse)+','+intToSTR(octet)); @@ -18519,7 +18339,7 @@ end; // Résultat true si ok function pilote_acc(adresse : integer;octet : byte;Acc : TAccessoire): boolean; overload; begin - if ModeTache then pilote_acc_sc_taches(adresse,octet,Acc,9999) else + if ModeTache then pilote_acc_sc_taches(adresse,octet,Acc,9999) else pilote_acc_sc(adresse,octet,Acc,9999); end; @@ -19635,69 +19455,12 @@ begin begin etat_init_interface:=10; Affiche('Demande ouverture interface par Ethernet '+AdresseIP+':'+intToSTR(portinterface),clyellow); - {$IFDEF AvecIdTCP} - with ClientSocketIdInterface do - {$ELSE} with ClientSocketInterface do - {$ENDIF} begin - {$IFDEF AvecIdTCP} - port:=portInterface; // composant Indy - //ClientSocketInterface. - host:=AdresseIP; - try - {$IF CompilerVersion >= 28.0} // si delphi>=12 - ConnectTimeOut:=1000; - connect; - {$ELSE} - connect(1000); - {$IFEND} - except - on e : exception do - begin - Affiche(e.message+' socket interface '+AdresseIP,clred); - exit; - end; - end; - - Affiche('Socket interface connecté ',clYellow); - AfficheDebug('Socket interface connecté ',clYellow); - with formprinc do - begin - ButtonEcrCV.Enabled:=true; - ButtonLitCV.Enabled:=true; - LireunfichierdeCV1.enabled:=true; - LabelTitre.caption:=titre+' Interface connectée par Ethernet'; - Formprinc.StatusBar1.Panels[4].Text:=AdresseIP; - etat_init_interface:=11; - trouve:=test_protocole; // appelle l'état des détecteurs - end; - if not trouve then - begin - Affiche('Socket connecté mais centrale muette',clred); - disconnect; - etat_init_interface:=0; - exit; - end; - if protocole=1 then - begin - etat_init_interface:=20; // interface protocole reconnue - parSocketLenz:=true; - end; - if (protocole=2) then - begin - init_dccpp; - etat_init_interface:=20; - end; - // interface ethernet connectée, faire les init - init_aig_det; - - {$ELSE} port:=portInterface; Address:=AdresseIP; // ne pas mettre active et open en même temps, ca génère 2 evt onConnect et initialise les aig 2 fois. Open; - {$ENDIF} end; //Application.processMessages; end; @@ -20947,7 +20710,6 @@ begin end; end; -// Event socket interface par indy {$IF CompilerVersion >= 28.0} procedure TFormPrinc.DataReceived(const Data: TidBytes); var i,l,j,lo : integer; @@ -21329,25 +21091,12 @@ begin end; if MsCommCde2<>nil then MSCommCde2.onTriggerAvail:=RecuPeriph2; - {$IFDEF AvecIdTCP} - // composant Indy Interface réseausocket en D12 : ne marche pas bien - ClientSocketIdInterface:=TIdTCPClient.Create(self); - try - ThreadInterface:=TReadingThreadInterface.Create(ClientSocketIdInterface); - ThreadInterface.OnData:=DataReceived ; - ThreadInterface.Resume; - except - ClientSocketIdInterface.Disconnect; - raise; - end; - {$ELSE} // composant TclientSocket ClientSocketInterface:=tClientSocket.Create(nil); ClientSocketInterface.OnRead:=ClientSocketInterfaceRead; ClientSocketInterface.onConnect:=ClientSocketInterfaceConnect; ClientSocketInterface.OnDisconnect:=ClientSocketInterfaceDisconnect; ClientSocketInterface.OnError:=ClientSocketInterfaceError; - {$ENDIF} {$ELSE} // D7 @@ -21366,26 +21115,12 @@ begin Affiche(s,clred); end; - {$IFDEF AvecIdTCP} - // D7 composant Indy Interface réseausocket - ClientSocketIdInterface:=TIdTCPClient.Create(self); - try - ThreadInterface:=TReadingThreadInterface.Create(ClientSocketIdInterface); - ThreadInterface.OnData:=DataReceived ; - ThreadInterface.Resume; - except - ClientSocketIdInterface.Disconnect; - raise; - end; - - {$ELSE} // composant TclientSocket ClientSocketInterface:=tClientSocket.Create(nil); ClientSocketInterface.OnRead:=ClientSocketInterfaceRead; ClientSocketInterface.onConnect:=ClientSocketInterfaceConnect; ClientSocketInterface.OnDisconnect:=ClientSocketInterfaceDisconnect; ClientSocketInterface.OnError:=ClientSocketInterfaceError; - {$ENDIF} // interface centrale - provoque l'apparition de la fenêtre "préparation de l'installation" try MSCommUSBInterface:=TMSComm.Create(formprinc); @@ -21930,12 +21665,7 @@ begin end; ServerSocket.Close; ClientSocketCDM.close; - {$IFDEF AvecIdTCP} - ClientSocketIdInterface.Disconnect; - ClientSocketIdInterface.Free; - {$ELSE} ClientSocketInterface.close; - {$ENDIF} clientInfo.Close; end; @@ -21988,7 +21718,7 @@ begin vitesse:=grilleHoraire[i].vitesse; if not(grilleHoraire[i].sens) then vitesse:=-vitesse; Affiche('Démarrage train '+train+' à l''horaire '+format('%.2dh%.2d',[heure,minute]),clyellow); - // &&& voir pour la couleur + // voir pour la couleur FormFicheHoraire.StringGridFO.Cells[1,i]:=GrilleHoraire[i].NomTrain; Demarre_index_train(indextrain); @@ -22082,7 +21812,7 @@ begin // si tempo non nulle de fin d'accessoire if (typeTache=ttacheAcc) and (tempo<>0) then begin - if affe then Affiche('dec tempo ',clLime); + if affe then Affiche('dec tempo='+intToSTR(tempo),clLime); dec(tempo); exit; // ne rien faire d'autre dans ce tour timer end @@ -22295,17 +22025,7 @@ begin if TpsTimeoutSL<=0 then begin TpsTimeoutSL:=450; // envoyer caractère toutes les 45 secondes - // indy - {$IFDEF AvecIdTCP} - s:=' '; - {$IF CompilerVersion >= 28.0} - ClientSocketIdInterface.IoHandler.write(RawToBytes(s,1),1); - {$ELSE} - ClientSocketIdInterface.Socket.Send(s,1) - {$IFEND} - {$ELSE} ClientSocketInterface.Socket.SendText(' '); - {$ENDIF} end; end; @@ -22945,11 +22665,7 @@ begin portCommOuvert:=false; with formprinc do begin - {$IFDEF AvecIdTCP} - ClientSocketIdInterface.Disconnect; - {$ELSE} ClientSocketInterface.close; - {$ENDIF} MenuConnecterUSB.enabled:=true; DeConnecterUSB.enabled:=false; ConnecterCDMRail.enabled:=true; @@ -23008,11 +22724,7 @@ end; procedure deconnecte_interfaceEth; begin - {$IFDEF AvecIdTCP} - ClientSocketIdInterface.disconnect; - {$ELSE} ClientSocketInterface.Close; - {$ENDIF} end; procedure TFormPrinc.MenuConnecterEthernetClick(Sender: TObject); @@ -23221,9 +22933,7 @@ begin // interface ethernet connectée, faire les init init_aig_det; end; - {$IFNDEF AvecIdTCP} if not(trouve) then ClientSocketInterface.Close; - {$ENDIF} end; // CDM rail se connecte @@ -23303,9 +23013,7 @@ begin if pos('ACK',trame_cdm)<>0 then Ack_cdm:=true; if (pos('DSCTRN-__END',trame_cdm)<>0) and (ntrains_CDM<>0) then begin - //fin de la description des trains - FormPrinc.ComboTrains.Items.Clear; - + // fin de la description des trains // on remplace les trains du combo et de la base (non stockée) // dans la même adresse que l'existante // ne pas écraser j @@ -23316,7 +23024,7 @@ begin trouve:=trains[l].adresse=trains_cdm[i].adresse; if trouve then // si l'adresse du train CDM est déja existante on copie le train CDM dans le train SC begin - //affiche('train '+intToSTR(trains_cdm[i].adresse)+' trouvé dans l''existant',clLime); + //affiche('train '+intToSTR(trains_cdm[i].adresse)+' trouvé dans l''existant index '+intToSTR(i),clLime); Formprinc.ComboTrains.Items.Add(trains_cdm[i].nom_train); Trains[l].nom_train:=trains_cdm[i].nom_train; Trains[l].adresse:=Trains_cdm[i].adresse; @@ -23325,17 +23033,20 @@ begin inc(l); until (l>ntrains) or trouve; - if not(trouve) then // si pas trouvé le train dans SC, on créée le train + if not(trouve) then // si pas trouvé l'adresse du train dans SC, on créée le train begin inc(ntrains); - //affiche('train '+intToSTR(trains_cdm[i].adresse)+' créé',clLime); + affiche('Train @'+intToSTR(trains_cdm[i].adresse)+' '+trains_cdm[i].nom_train+' importé de CDM à l''index '+intToSTR(nTrains),clLime); Trains[ntrains].nom_train:=trains_cdm[i].nom_train; Trains[ntrains].adresse:=Trains_cdm[i].adresse; Trains[ntrains].vitmax:=Trains_cdm[i].vitmax; - FormPrinc.ComboTrains.Items.Add(trains_cdm[i].nom_train); - //cree_GB_compteur(ntrains); + cree_icone_train(ntrains); + cree_image_onglet_Train(ntrains); end; end; + // remplir la combobox + FormPrinc.ComboTrains.Items.Clear; + for i:=1 to ntrains do FormPrinc.ComboTrains.Items.Add(trains[i].nom_train); // vérifier si pas doublon adresse train verif_trains; @@ -28110,9 +27821,10 @@ end; procedure TFormPrinc.FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState); +var i,d : integer; begin if (PageControl.ActivePage<>TabSheettrains) or (TempoCombo>0) or (ComboTrains.Focused) or clicComboTrain then exit; - //Affiche('FormKeyDown',clyellow); + //Affiche('FormKeyDown '+intToSTR(key),clyellow); if (key=vk_down) and (IdTrainClici+ScrollBoxTrains.Height then scrollBoxTrains.VertScrollBar.Position:=(idTrainClic-(ScrollBoxTrains.Height div Image_Train[IdTrainClic].height))*Image_Train[IdTrainClic].height; + key:=0; end; if (key=vk_up) and (IdTrainClic>1) then @@ -28135,6 +27852,11 @@ begin //affiche_train_compteur; affiche_train_compteur(1); aiguille_compteur(1,idTrainClic,formCompteur[1]); + + i:=scrollBoxTrains.VertScrollBar.Position; + d:=(IdTrainClic)*Image_Train[IdTrainClic].height; + if d<=i then scrollBoxTrains.VertScrollBar.Position:=(idTrainClic-(ScrollBoxTrains.Height div Image_Train[IdTrainClic].height))*Image_Train[IdTrainClic].height; + key:=0; end; end; diff --git a/UnitTCO.pas b/UnitTCO.pas index e8a462f..824ffa2 100644 --- a/UnitTCO.pas +++ b/UnitTCO.pas @@ -833,9 +833,13 @@ begin repeat eLc1:=canton[i].el1; teLc1:=canton[i].typ1; eLc2:=canton[i].el2; teLc2:=canton[i].typ2; - - trouve:=((elc1=el1) and (teLc1=tel1) and (elc2=el2) and (teLc2=tel2)) or - ((elc2=el1) and (teLc2=tel1) and (elc1=el2) and (teLc1=tel2)) ; + // ******** modif du 20/09/2025 + // il faut que les deux éléments soient présents + {trouve:=((elc1=el1) and (teLc1=tel1) and (elc2=el2) and (teLc2=tel2)) or + ((elc2=el1) and (teLc2=tel1) and (elc1=el2) and (teLc1=tel2)) ; } + // il faut l'un des deux éléments présents + trouve:=( ((elc1=el1) and (teLc1=tel1)) or ((elc2=el2) and (teLc2=tel2)) ) or + ( ((elc2=el1) and (teLc2=tel1)) or ((elc1=el2) and (teLc1=tel2)) ) ; inc(i); until (trouve) or (i>nCantons); if trouve then result:=i-1; @@ -6261,7 +6265,7 @@ begin Pen.Width:=1; Brush.Color:=clvoies[indexTCO]; pen.color:=clvoies[indexTCO]; - + horizontale; diagonale; @@ -6375,8 +6379,13 @@ begin position1:=aiguillage[index1].position; sHG:=TCO[indexTCO,x,y].suivHG;tHG:=TCO[indexTCO,x,y].typHG; sBD:=TCO[indexTCO,x,y].suivBD;tBD:=TCO[indexTCO,x,y].typBD; - canvas.pen.color:=clfond[indexTCO]; - canvas.pen.Width:=epaisseur div 2; + + with canvas do + begin + pen.color:=fond; + Brush.Color:=fond; + pen.Width:=epaisseur div 2; + end; if etatTJD=4 then begin adr2:=aiguillage[index1].DDevie; // homologue @@ -6425,7 +6434,7 @@ begin end; end; end; - + if etatTJD=2 then begin if position1=const_droit then @@ -6481,6 +6490,8 @@ var pont,yp,x1,y1,x2,y2,x3,y3,x4,y4,x0,y0,xc,yc,xf,yf,trajet,ep,position1,positi end; end; + // si dessin=1 dessine en épaisseur de voie + // si dessin=2 dessine en épaisseur de trajet procedure TJDbas(dessin :integer); // morceau courbe bas begin x1:=x0-LargeurCell[indexTCO]-(LargeurCell[indexTCO] div 3);y1:=yc; @@ -6547,6 +6558,7 @@ begin Brush.Color:=clvoies[indexTCO]; pen.color:=clvoies[indexTCO]; + pen.width:=epaisseur; diagonale; @@ -6651,14 +6663,19 @@ begin position1:=aiguillage[index1].position; sHG:=TCO[indexTCO,x,y].suivHG;tHG:=TCO[indexTCO,x,y].typHG; sBD:=TCO[indexTCO,x,y].suivBD;tBD:=TCO[indexTCO,x,y].typBD; - canvas.pen.color:=clfond[indexTCO]; - canvas.pen.Width:=epaisseur div 2; + //canvas.pen.color:=clfond[indexTCO]; + with canvas do + begin + pen.color:=fond; + Brush.Color:=fond; + pen.Width:=epaisseur div 2; + end; if etatTJD=4 then begin adr2:=aiguillage[index1].DDevie; // homologue Index2:=Index_aig(adr2); position2:=aiguillage[index2].position; - + // canvas.pen.color:=clBlack; if (position1=const_devie) and (position2=const_devie) then begin with canvas do begin @@ -6939,8 +6956,15 @@ begin position1:=aiguillage[index1].position; sHG:=TCO[indexTCO,x,y].suivHG;tHG:=TCO[indexTCO,x,y].typHG; sBD:=TCO[indexTCO,x,y].suivBD;tBD:=TCO[indexTCO,x,y].typBD; - canvas.pen.color:=clfond[indexTCO];; - canvas.pen.Width:=epaisseur div 2; + //canvas.pen.color:=clfond[indexTCO];; + //canvas. + with canvas do + begin + pen.color:=fond; + Brush.Color:=fond; + pen.Width:=epaisseur div 2; + end; + if etatTJD=4 then begin adr2:=aiguillage[index1].DDevie; // homologue @@ -7512,8 +7536,14 @@ begin position1:=aiguillage[index1].position; sHG:=TCO[indexTCO,x,y].suivHG;tHG:=TCO[indexTCO,x,y].typHG; sBD:=TCO[indexTCO,x,y].suivBD;tBD:=TCO[indexTCO,x,y].typBD; - canvas.pen.color:=clfond[indexTCO]; - canvas.pen.Width:=epaisseur div 2; + //canvas.pen.color:=clfond[indexTCO]; + //canvas.pen.Width:=epaisseur div 2; + with canvas do + begin + pen.color:=fond; + Brush.Color:=fond; + pen.Width:=epaisseur div 2; + end; if etatTJD=4 then begin adr2:=aiguillage[index1].DDevie; // homologue @@ -13814,6 +13844,7 @@ begin Direction:=det2; end; + i:=0; // itérations repeat // boucle de test de direction sortir:=false; if mode<=10 then @@ -13844,7 +13875,7 @@ begin xn:=x;yn:=y; ir:=1; // index de la route du tco - i:=0; // itérations + if debugTCO then afficheDebug('Direction '+intToSTR(direction),clOrange); // initialiser les points d'où l'on vient @@ -13956,7 +13987,7 @@ begin if (i>NbCellulesTCO[indexTCO]) then AfficheDebug('Erreur 1000 TCO'+intToSTR(indexTCO)+' : dépassement d''itérations - Route de '+IntToSTR(det1)+' à '+IntToSTR(det2),clred); inc(direction) - until ((direction=5) and (mode<=10)) or ((direction=9) and (mode>=11)) or memtrouve ; + until ((direction=5) and (mode<=10)) or ((direction=9) and (mode>=11)) or memtrouve or (i>NbCellulesTCO[indexTCO]) ; if memTrouve then begin diff --git a/verif_version.pas b/verif_version.pas index a14b64e..f768a26 100644 --- a/verif_version.pas +++ b/verif_version.pas @@ -26,7 +26,7 @@ var f : textFile; Const -VersionSC = '10.73'; // sert à la comparaison de la version publiée +VersionSC = '10.75'; // sert à la comparaison de la version publiée SousVersion=' '; // A B C ... en cas d'absence de sous version mettre un espace // pour unzip SHCONTCH_NOPROGRESSBOX=4; @@ -82,7 +82,7 @@ var begin Result:=False; t:=0; - // l'utilisation de TfileStream.Create inplique que le répertoire de destination soit libre de droits + // l'utilisation de TfileStream.Create implique que le répertoire de destination soit libre de droits Try Fs:=TFileStream.Create(s,fmCreate); //hSession := InternetOpen('MyApp', INTERNET_OPEN_TYPE_PRECONFIG, nil, nil, 0); if DebugVV then Affiche('TFileStream.Create ok',clLime); @@ -353,7 +353,7 @@ begin // URL de l'API github des dernières releases Url:='https://api.github.com/repos/f1iwq2/signaux_complexes_gl/releases/latest'; - // l'utilisation de TfileStream.Create inplique que le répertoire de destination soit libre de droits, + // l'utilisation de TfileStream.Create implique que le répertoire de destination soit libre de droits, // ce qui ne marche pas pour c:\program files (x64)\signaux_complexes. // Le fichier page.txt est donc mis dans C:\Users\moi\AppData\Roaming\signaux_complexes qui lui a tous les droits // fabrication du nom de fichier destinataire et son chemin diff --git a/versions.txt b/versions.txt index 56e57c0..12cc169 100644 --- a/versions.txt +++ b/versions.txt @@ -343,9 +343,14 @@ version 10.7 : Affichage du compteur de train depuis le menu contextuel des cant Correction désaffectation trains sur cantons. version 10.71 : Ajout dans les variables des fonctions les mémoires de zone. Correction bug activation mémoires de zone dans le menu du TCO. - Correction bug affichage des opérations dans les actions. -version 10.72 : correction bug dans les fonctions. -version 10.73 : correction bug téléchargement trains depuis CDM. + Correction bug affichage des opérations dans les actions. +version 10.72 : Correction bug dans les fonctions. +version 10.73 : Correction bug téléchargement trains depuis CDM. +version 10.74 : Traitement du cas TJD abordée par aiguillage en pointe. + Ajout paramètre de temporisation de commande des signaux. +version 10.75 : Amélioration de l'importation des trains depuis CDM rail. + Correction suppression des signaux. +