This commit is contained in:
f1iwq2
2025-05-01 21:20:53 +02:00
parent e89b3a9cdf
commit 23143aa4db
20 changed files with 707 additions and 629 deletions
+141 -89
View File
@@ -1,4 +1,4 @@
/ Fichier de configuration de signaux_complexes_GL version 9.75
/ Fichier de configuration de signaux_complexes_GL version 10.53
Chemin_progCDM=C:\Program Files (x86)
LargeurF=1120
HauteurF=681
@@ -15,8 +15,8 @@ Max_Signal_Sens=5
Debug=0
Mode_Sombre=0
debugRoulage=0
AffLoc=1
coul_fond=000080
AffLoc=0
coul_fond=000040
serveurIPCDM_Touche=0
Port_Serveur=4500
Filtrage_det=3
@@ -30,28 +30,37 @@ Verif_AdrXpressNet=1
IpV4_PC=127.0.0.1:9999
ServicesCDM=15
Ipv4_interface=192.168.1.23:5550
Protocole_serie=COM6:57600,N,8,1,2
Inter_car=30
Protocole_serie=COM6:57600,N,8,1,0
Inter_car=50
Tempo_maxi=15
Entete=1
Init_Aig=1
PilotageTrainsCDMNom=0
PilotageTrainsCDMNom=1
Init_Dem_Aig=0
Tempo_Aig=30
MaxParcours=60
MaxRoutes=10000
MaxParcours=80
MaxRoutes=5000
compteur=1
LargCompteur=200
LargCompteurC=150
HautCompteurC=150
VerrouCompteur=0
Echelle=0
AffIconeTrCompteur=0
Onglet=0
AffCompteur=0
Init_demUSBCOM=0
Init_demETH=1
Fenetre=0
Ecran=1
AffMemoFenetre=1
nb_det_dist=3
verif_version=0
verif_version=1
notif_version=0
TCO=0
TCO=1
NbreTCO=1
Nom_fichier_TCO1=TCO.CFG
Nom_fichier_TCO2=TCO2.CFG
Nom_fichier_TCO2=TCO_ESSAI
Nom_fichier_TCO3=TCO3.CFG
Nom_fichier_TCO4=TCO4.CFG
Nom_fichier_TCO5=TCO5.CFG
@@ -74,11 +83,12 @@ Nb_cantons_Sig=3
AffSig=1
AffRes=0
AvecAck=0
Asynchrone=1
Option_demiTour=0
Alg_Unisemaf=1
/------------
[section_aig]
1,P518,D100D,S3P,V30,I0,INIT(2,5),C0
1,P518,D100D,S3P,V30,I0,INIT(2,1),C0
2,P12S,D519,S100S,V0,I0,INIT(2,1),C0
3,P1S,D4P,S5D,V0,I0,INIT(2,1),C0
4,P3D,D6S,S514,V0,I0,INIT(2,1),C0
@@ -86,15 +96,15 @@ Alg_Unisemaf=1
6,P516,D0,S4D,V0,I0,INIT(1,1),C0
7,P527,D519,S520,V30,I0,INIT(1,1),C0
8,P527,D521,S103S,V0,I0,INIT(2,2),C0
9,P526,D103D,S515,V60,I0,INIT(2,2),C0
10,P101S,D29P,S528,V30,I0,INIT(2,2),C0
11,P18P,D30D,S101D,V0,I0,INIT(2,2),C0
9,P526,D103D,S515,V60,I0,INIT(1,2),C0
10,P101S,D29P,S528,V30,I0,INIT(1,2),C0
11,P18P,D30D,S101D,V0,I0,INIT(1,2),C0
12,P517,D20S,S2P,V0,I0,INIT(1,2),C0
17,P525,D535,S528,V0,I0,INIT(1,2),C0
18,P11P,D23P,S102S,V0,I0,INIT(1,2),C0
19,P101S,D102D,S531,V0,I0,INIT(1,2),C0
20,P520,D21P,S12D,V0,I0,INIT(2,2),C0
21,P20D,D28S,S28D,V0,I0,INIT(1,2),C0
21,P20D,D28S,S28D,V0,I0,INIT(2,2),C0
22,P102D,D537,S105D,V0,I0,INIT(2,2),C0
23,P18D,D105D,S534,V0,I0,INIT(2,2),C0
24,P538,D32S,S533,V0,I0,INIT(1,2),C0
@@ -103,7 +113,7 @@ Alg_Unisemaf=1
27,P25S,D530,S537,V0,I0,INIT(1,2),C0
28TJD,D(21D,26D),S(21S,26S),V0,I0,INIT(1,2),E4,C0
29,P10D,D513,S30S,V60,I0,INIT(2,2),C0
30,P524,D11D,S29S,V0,I0,INIT(2,7),C0
30,P524,D11D,S29S,V0,I0,INIT(2,2),C0
31,P534,D34D,S104S,V0,I0,INIT(1,2),C0
32,P105S,D104D,S24D,V0,I0,INIT(1,2),C0
34,P0,D31D,S104D,V0,I0,INIT(2,2),C0
@@ -132,18 +142,72 @@ A31,A34,0
/------------
[section_decodeurs]
/ décodeur n°1
Nom_dec_pers=CDF_personnalisé
NombreAdresses=3
Nom_dec_pers=grand
NombreAdresses=8
Nation=1
Commande=0
Periph=0
1,2,0,1,2
3,4,1,0,0
5,6,2,0,0
7,8,3,0,0
0,0,0,0,0
0,0,0,0,0
0,0,0,0,0
0,0,0,0,0
/ décodeur n°2
Nom_dec_pers=decodeur com
NombreAdresses=10
Nation=1
Commande=1
Periph=1
13,0,0,1,0
4,9,1,1,2
2,1,2,1,2
carré,car
sémaphore,sem
rouge cli,semcli
vert,
vert cli,
violet,
blanc,
blanc cli,
avertissement,
jaune cli,
ralen 30,
ralen 60,
rappel 30,
rappel 60,
ralen 60 + jaune cli,
rappel 30 + jaune,
rappel 30 + jaune cli,
rappel 60 + jaune,
rappel 60 + jaune cli,
/ décodeur n°3
Nom_dec_pers=decodeur USB Belge
NombreAdresses=10
Nation=2
Commande=1
Periph=1
vert jaune horizontal,vjh
rouge,r
vert,v
vert jaune vertical,
rouge blanc,
deux jaunes,
Chiffre,
Chevron,
Clignote,
,
,
,
,
,
,
,
,
,
,
0
/------------
[section_sig]
49,9,0,11,(518,A1),0,FVC0,FRC0,SR(1,2,3,16,17,13,18,19,14,9,10,5,4,0,18,19),NA7
176,7,0,1,(520,A20),1,FVC0,FRC0
190,7,0,1,(523,526),0,FVC0,FRC0
204,9,0,1,(527,A7),1,FVC0,FRC0
@@ -166,14 +230,16 @@ Periph=1
476,9,0,1,(538,A105),1,FVC0,FRC0
497,9,0,4,(531,A19),1,FVC0,FRC0,U14,L1
520,9,1,1,(518,A1),1,FVC0,FRC0,(A1S,A3S,A5S),CFB(A1S,A3D,A4D,A6S)
620,7,0,0,(521,A8),1,FVC0,FRC0
820,4,0,0,(519,A7),0,FVC0,FRC0
0
/------------
[section_PN]
(523-526,513-531),PN(700,1,700,2),1,0
0
/------------
[section_actions]
ACTION1,D4,513,1,,B1,C11,1,0,N1,A10,0,0,
Action 3,D4,800,1,traindecl,B1,C5,12,12,13,45,N3,A10,1,30,traindest,A2,1,A8,1
Action 5,D1,12,30,B1,C3,162,30,TGV,N1,A4,1,15,2,Z
0
/------------
[section_dcc++]
@@ -185,32 +251,20 @@ AdrBaseDetDccpp=513
0
/------------
[section_trains]
BB25531,1,120,60,50,BB67000.BMP,0,0,18,0,0,0,0.00,0.00,0.00,0,0,0
TGV,2,120,80,60,TGV.BMP,0,0,0,0,0,0,0.00,0.00,0.00,0,0,0
BB16024,3,120,70,50,BB16024.BMP,0,0,18,40,60,80,4.80,2.50,2.00,6,6,128
[route directe],0,1
{523->526->9droit->103crois->513->29droit->10droit->101crois->19dev->531->518->1droit->100crois->523}
[route directe],1,2
{523->100crois->1droit->518->531->19dev->101crois->10droit->29droit->513->103crois->9droit->526->523}
[],0,3
BB25531,1,120,60,50,BB67000.BMP,5,0,0,0,0,0,0.00,0.00,0.00,0,0,0
TGV,2,120,80,60,TGV.BMP,6,0,0,0,0,0,0.00,0.00,0.00,0,0,0
BB16024,3,120,100,60,BB16024.BMP,7,0,0,0,0,0,0.00,0.00,0.00,0,0,0
CC406526,4,120,100,80,CC406526.BMP,10,0,0,0,0,0,0.00,0.00,0.00,0,0,0
[route_par_pont],0,1
{519->2droit->12dev->517->102crois->18dev->11dev->101crois->525->17dev->528->10dev->101crois->19dev->531->518->1droit->100crois->523}
CC406526,4,120,100,80,CC406526.BMP,0,0,1,50,60,100,6.00,5.50,3.89,4,4,128,P523,D526,T5
[anneau intérieur],0,1
{523->526->9droit->103crois->513->29droit->10droit->101crois->19dev->531->518->1droit->100crois->523}
[inversion],0,4
{523->526->9dev->515->5dev->100crois->2dev->12dev->517->102crois->18dev->11droit->30droit->524->521->8droit->527->7droit->519}
[],0,5
{515->5dev->100crois->2dev->12dev->517->102crois->18dev->11dev->101crois->525->17dev->528->10dev->101crois->19dev->531->518->1dev->3droit->4droit->6dev->516}
[],0,6
{523->526->9droit->103crois->513->29droit->10droit->101crois->19dev->531->518->1dev->3droit->4dev->514->522->103crois->8dev->527->7dev->520}
CAMERA,6,120,0,0,EAD.BMP,0,0,0,0,0,0,0.00,0.00,0.00,0,0,0
CAMERA,6,120,0,0,EAD.BMP,8,0,0,0,0,0,0.00,0.00,0.00,0,0,0
0
/------------
[section_placement]
BB25531,0,0,0
TGV,14,3,0
TGV,0,0,0
BB16024,0,0,0
CC406526,7,2,0
CC406526,9,1,0
CAMERA,0,0,0
0
/------------
@@ -270,17 +324,17 @@ DureeMinute=1
0
/------------
[section_detecteurs]
513,43,1,10
513,43,0,0
514,18,0,0
515,67,1,5
515,67,0,0
516,150,0,0
517,60,0,0
518,56,0,0
519,66,1,5
519,66,0,0
520,73,0,0
521,85,0,0
522,120,1,10
523,84,1,10
522,120,0,0
523,84,0,0
524,67,0,0
525,153,0,0
526,84,0,0
@@ -288,7 +342,7 @@ DureeMinute=1
528,150,0,0
529,77,0,0
530,90,0,0
531,29,0,0
531,28,0,0
533,127,0,0
534,92,0,0
535,134,0,0
@@ -297,43 +351,41 @@ DureeMinute=1
0
/------------
[section_logique]
/--- fonction 1
"Mafonction1"
0,Fonction logique,N1,T0,A13,E0,V,,O0,
1,Opérateur ET,N2,T1,A0,E0,V,,O0,
2,Etat DCC,N3,T5,A10,E2,V,,O0,
3,Etat DCC,N3,T5,A11,E2,V,,O0,
4,Opérateur OU,N3,T2,A0,E0,V,,O0,
5,Etat DCC,N4,T5,A12,E1,V,,O0,
6,Etat DCC,N4,T5,A17,E1,V,,O0,
7,Opérateur ET,N4,T1,A0,E0,V,,O0,
8,Etat DCC,N5,T5,A25,E1,V,,O0,
9,Etat DCC,N5,T5,A26,E1,V,,O0,
10,Opérateur ET,N3,T1,A0,E0,V,,O0,
11,Etat détect./actionn.,N4,T6,A513,E1,V,,O0,
12,Etat détect./actionn.,N4,T6,A515,E1,V,,O0,
FF
/--- fonction 2
"kgkhgk"
0,Fonction logique,N2,T0,A3,E0,V,,O0,
1,Opérateur ET,N2,T1,A0,E0,V,,O0,
2,Mémoire,N3,T8,A1,E31,V,CC406526,O2,
FF
/--- fonction 3
"fonction 3"
0,Fonction logique,N3,T0,A7,E0,V,,O0,
1,Opérateur ET,N2,T1,A0,E0,V,,O0,
2,Etat DCC,N3,T5,A0,E0,V,,O0,
3,Etat DCC,N3,T5,A0,E0,V,,O0,
4,Opérateur ET,N3,T1,A0,E0,V,,O0,
5,Etat DCC,N4,T5,A0,E0,V,,O0,
6,Etat DCC,N4,T5,A0,E0,V,,O0,
FF
/--- fonction 4
"fonction 4"
0,Fonction logique,N4,T0,A4,E0,V,,O0,
1,Opérateur Non ET,N2,T3,A0,E0,V,,O0,
2,Bouton TCO,N3,T7,A1,E1,V,,O0,
3,Mémoire,N3,T8,A2,E1,V,,O1,
/--- Fonction 1
"0"
FF
0
/------------
[section_blocs_USB]
B1,,BR0,0,0,0,B0,0,0,B0,0,0,B0,0,0,B0,0,0,B0,0,0,B0,0,0,B0,0,0,B0,0,0,B0,0,0,B0,0,0
B2,,BR0,0,0,0,B0,0,0,B0,0,0,B0,0,0,B0,0,0,B0,0,0,B0,0,0,B0,0,0,B0,0,0,B0,0,0,B0,0,0
B3,,BR0,0,0,0,B0,0,0,B0,0,0,B0,0,0,B0,0,0,B0,0,0,B0,0,0,B0,0,0,B0,0,0,B0,0,0,B0,0,0
B4,,BR0,0,0,0,B0,0,0,B0,0,0,B0,0,0,B0,0,0,B0,0,0,B0,0,0,B0,0,0,B0,0,0,B0,0,0,B0,0,0
B5,,BR0,0,0,0,B0,0,0,B0,0,0,B0,0,0,B0,0,0,B0,0,0,B0,0,0,B0,0,0,B0,0,0,B0,0,0,B0,0,0
B6,,BR0,0,0,0,B0,0,0,B0,0,0,B0,0,0,B0,0,0,B0,0,0,B0,0,0,B0,0,0,B0,0,0,B0,0,0,B0,0,0
B7,,BR0,0,0,0,B0,0,0,B0,0,0,B0,0,0,B0,0,0,B0,0,0,B0,0,0,B0,0,0,B0,0,0,B0,0,0,B0,0,0
B8,,BR0,0,0,0,B0,0,0,B0,0,0,B0,0,0,B0,0,0,B0,0,0,B0,0,0,B0,0,0,B0,0,0,B0,0,0,B0,0,0
B9,,BR0,0,0,0,B0,0,0,B0,0,0,B0,0,0,B0,0,0,B0,0,0,B0,0,0,B0,0,0,B0,0,0,B0,0,0,B0,0,0
B10,,BR0,0,0,0,B0,0,0,B0,0,0,B0,0,0,B0,0,0,B0,0,0,B0,0,0,B0,0,0,B0,0,0,B0,0,0,B0,0,0
0
/------------
[section_compteurs]
Compteur1
Aiguille=0000FF
Graduations=FFFFFF
Numeros=FFFFFF
Fond=000000
Arc=008000
Compteur2
Aiguille=0000FF
Graduations=000000
Numeros=FF0000
Fond=808080
Arc=008000
Compteur3
Aiguille=0000FF
Graduations=FFFFFF
Numeros=FFFFFF
Fond=000000
Arc=008000
0
+1
View File
@@ -146,6 +146,7 @@ end;
destructor TClock.Destroy;
begin
FBitMap.Free;
FbitMap:=nil;
Ticker.Free;
inherited Destroy;
end;
+10 -6
View File
@@ -63,7 +63,7 @@ type
var
formCompteur : array[1..1] of TformCompteur; // il y a 10 fenetres mais on utilise qu'un compteur.
Scompteur : TTCompteur; // Scompteur : associé à fen
Scompteur : TTCompteur; // Scompteur : associé à grande fenetre compteur
ParamCompteur : array[1..3] of record
coulAig,coulGrad,CoulNum,CoulFond,CoulArc : tcolor;
end;
@@ -83,7 +83,7 @@ function Vr_kmh(v : integer) : integer;
implementation
uses UnitTCO, UnitClock , UnitConfig;
uses UnitTCO, UnitClock , UnitConfig, UnitDebug;
{$R *.dfm}
@@ -112,6 +112,7 @@ begin
finally
ReleaseDC(FormCompteur[1].Handle, ACanvas.Handle);
ACanvas.Free;
ACanvas:=nil;
end;
end;
@@ -479,8 +480,11 @@ begin
until angle>param.AngleFin+incr;
end;
// copie l'image du texte "tachro" mise à l'échelle
StretchBlt(bm.Canvas.Handle,round(145*r),round(90*r),round(lim*r),round(him*r),
FormPrinc.ImageTachro.canvas.Handle,0,0,lim,him,srcCopy);
param.AngleFin:=220; // en fait vitesse maxi compteur
exit;
end;
@@ -574,7 +578,7 @@ var comptLoc,l,h,lim,him,hfen,mini,maxi,vmax : integer;
canv : tcanvas;
begin
if (i<1) or (hautComptC=0) then exit;
//Affiche('Init compteur de vitesse',clYellow);
if ProcPrinc then Affiche('Init compteur de vitesse '+intToSTR(i)+' composant '+c.name,clYellow);
typDest:=Trien;
if c is tform then typDest:=fen; // si le compteur est la fenetre unique
@@ -689,7 +693,7 @@ begin
3 : compteurT[i].paramcompt.rav:=round(115*compteurT[i].paramcompt.redx);
end;
compteurT[i].FCBitMap.Free;
//ne pas faire compteurT[i].FCBitMap.Free çà fait une exception si il est déja en nil, contrairement à D12.
compteurT[i].fcBitMap:=tbitmap.Create;
with compteurT[i].FCBitMap do
begin
@@ -765,7 +769,7 @@ begin
// imageC <-- FCBitMap (on écrit les vitesses) <- ImageCompteur (grande)
// créer un bitmap réduit qui sert de référence
Scompteur[i].FCBitMap.Free;
Scompteur[i].FCBitMap.Free;
Scompteur[i].fcBitMap:=tbitmap.Create;
with Scompteur[i].FCBitMap do
begin
+9 -9
View File
@@ -1,6 +1,6 @@
object FormConfig: TFormConfig
Left = 242
Top = 193
Left = 265
Top = 106
Hint = 'Modifie la configuration selon les s'#233'lections choisies'
BorderStyle = bsDialog
Caption = 'Configuration g'#233'n'#233'rale'
@@ -670,7 +670,7 @@ object FormConfig: TFormConfig
Top = 8
Width = 633
Height = 505
ActivePage = TabSheetCDM
ActivePage = TabSheetTrains
Font.Charset = DEFAULT_CHARSET
Font.Color = clBlack
Font.Height = -11
@@ -1098,13 +1098,13 @@ object FormConfig: TFormConfig
end
object Label28: TLabel
Left = 8
Top = 70
Top = 64
Width = 182
Height = 13
Caption = 'Port du serveur de Signaux Complexes'
end
object EditFonte: TEdit
Left = 240
Left = 248
Top = 16
Width = 25
Height = 21
@@ -1113,7 +1113,7 @@ object FormConfig: TFormConfig
TabOrder = 0
end
object EditDebug: TEdit
Left = 240
Left = 248
Top = 38
Width = 25
Height = 21
@@ -1136,7 +1136,7 @@ object FormConfig: TFormConfig
OnClick = CheckBoxVerifXpressNetClick
end
object EditPortServeur: TEdit
Left = 216
Left = 224
Top = 62
Width = 49
Height = 21
@@ -1189,7 +1189,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 = 13
ItemHeight = 0
ParentShowHint = False
ShowHint = True
TabOrder = 0
@@ -4160,7 +4160,7 @@ object FormConfig: TFormConfig
Top = 16
Width = 337
Height = 457
ActivePage = TabSheetCourbes
ActivePage = TabSheetTrGen
TabOrder = 3
object TabSheetTrGen: TTabSheet
Caption = 'G'#233'n'#233'ral'
+88 -33
View File
@@ -4497,6 +4497,19 @@ 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;
Formprinc.ComboTrains.Items.Add(trains[ntrains].nom_train);
delete(s,1,i-1);
end;
@@ -6188,9 +6201,8 @@ const LessThanValue=-1;
compile_compteurs;
end;
inc(it);
until (eof(fichier));
end; // fin de lit_flux
@@ -11047,6 +11059,7 @@ begin
supprime_pn;
end;
// renvoie le nombre d'adresses occupées par un signal
function nombre_adresses_signal(adr : integer) : integer;
var x,dec,nc,i,j : integer;
begin
@@ -11094,12 +11107,13 @@ begin
end;
if dec=9 then nc:=2; // LS-DEC-NMBS
if dec=10 then nc:=Signaux[i].Na; // Bmodels
if dec=11 then nc:=Signaux[i].Na; // LEA
if dec>=NbDecodeurdeBase then
begin
j:=dec-NbDecodeurdeBase+1;
nc:=decodeur_pers[j].NbreAdr;
end;
if dec=11 then nc:=Signaux[i].Na; // LEA
nombre_adresses_signal:=nc;
end;
@@ -11233,11 +11247,14 @@ begin
formconfig.ListBoxSig.Items.Delete(i-1);
Signaux[i].Img.free; // supprime l'image, ce qui efface le signal du tableau graphique
Signaux[i].Img:=nil;
Signaux[i].Lbl.free; // supprime le label
Signaux[i].Lbl:=nil;
Tablo_Index_Signal[Signaux[i].adresse]:=0;
if Signaux[i].checkFB<>nil then
begin
Signaux[i].checkFB.Free;Signaux[i].CheckFB:=nil;
Signaux[i].checkFB.Free;
Signaux[i].CheckFB:=nil;
end; // supprime le check du feu blanc s'il existait
for j:=i to NbreSignaux-1 do
@@ -14171,7 +14188,7 @@ begin
if CheckEnvAigDccpp.checked then EnvAigDccpp:=1 else EnvAigDccpp:=0;
end;
// affiche l'icone du train index dans le canvas
// copie et affiche l'icone du train index dans Iimage depuis Trains[].Icone
// Iimage: destination ; index: index du train
// en sortie : largeur de l'image générée
function Maj_icone_train(IImage : Timage;index :integer;coulfond : Tcolor) : integer;
@@ -14352,11 +14369,26 @@ begin
if nTrains>=Max_Trains then exit;
clicListe:=true;
inc(nTrains);
trains[ntrains].nom_train:='train';
trains[ntrains].adresse:=99;
trains[ntrains].VitNominale:=60;
trains[ntrains].VitRalenti:=40;
trains[ntrains].vitmax:=120;
with trains[ntrains] do
begin
nom_train:='train';
adresse:=99;
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);
ligneclicTrain:=ntrains-1;
clicListe:=false;
@@ -14391,7 +14423,6 @@ var i,j,n : integer;
s,ss : string;
begin
ss:='';
n:=0;
for i:=0 to nTrains-1 do
begin
if formconfig.ListBoxTrains.selected[i] then
@@ -14430,45 +14461,69 @@ begin
end;
// suppression
n:=0;
formCompteur[1].close;
i:=1;
repeat
if formconfig.ListBoxTrains.selected[i-1] then
begin
for j:=i to ntrains do
j:=i;
Affiche('Supprime train '+intToSTR(j)+' '+Trains[j].nom_train,clOrange);
// libérer les composants car on va réaffecter des noms
trains[j].icone.Free;
image_train[j].free;
labeltrain[j].free;
LabelVitesse[j].free;
labelBlocUSB[j].free;
trains[j].icone:=nil;
image_train[j]:=nil;
labeltrain[j]:=nil;
LabelVitesse[j]:=nil;
labelBlocUSB[j]:=nil;
// composants onglet compteurs
compteurT[j].Img.Free;
compteurT[j].img:=nil;
compteurT[j].tb.Free;
compteurT[j].tb:=nil;
compteurT[j].lbl.Free;
compteurT[j].lbl:=nil;
compteurT[j].bouton.Free;
compteurT[j].bouton:=nil;
compteurT[j].FcBitmap.Free;
compteurT[j].FcBitmap:=nil;
compteurT[j].gb.free;
compteurT[j].gb:=nil;
// décaler le reste du tableau
for j:=i to nTrains do
begin
if formconfig.ListBoxTrains.selected[j-1] then
begin
// libérer les composants car on va réaffecter des noms
image_train[j].free;
labeltrain[j].free;
LabelVitesse[j].free;
// onglet compteurs
compteurt[j].Img.Free;
compteurt[j].tb.Free;
compteurt[j].lbl.Free;
compteurt[j].bouton.Free;
compteurT[j].gb.free;
compteurT[j].FcBitmap.Free;
end;
if j<ntrains then
begin
formconfig.ListBoxTrains.selected[j-1]:=formconfig.ListBoxTrains.selected[j];
formconfig.ListBoxTrains.selected[j-1]:=formconfig.ListBoxTrains.selected[j];
trains[j]:=trains[j+1];
image_train[j]:=image_train[j+1];
image_train[j].Name:='ImageTrain'+IntToSTR(j);
// renseigne les composants train page principale
labeltrain[j]:=labeltrain[j+1];
LabelVitesse[j]:=LabelVitesse[j+1];
LabelBlocUSB[j]:=LabelBlocUSB[j+1];
renseigne_comp_trains(j);
// onglet compteurs
compteurT[j]:=compteurt[j+1];
with compteurT[j] do
begin
gb.name:='GroupBoxT'+IntToSTR(j);
lbl.Name:='LabelT'+IntToSTR(j);
Img.Name:='ImageCompteurT'+IntToSTR(j);
Bouton.Name:='BoutonT'+IntToSTR(j);
tb.Name:='TrackBarT'+IntToSTR(j);
end;
end;
end;
dec(ntrains);
i:=0;
end;
inc(i);
end
else
inc(i);
until i>ntrains;
Formprinc.ScrollBoxTrains.Repaint;
@@ -18832,7 +18887,7 @@ begin
ServeurIPCDM_touche:=s='simulation de touches';
end;
14 : begin
if length(s)<4 then labelInfo.Caption:='Valeur incorrecte'
if length(s)<1 then labelInfo.Caption:='Valeur incorrecte'
else string(p^):=s; // CheminProgrammesCDM:=s;
end;
15 : begin
+6 -4
View File
@@ -221,7 +221,7 @@ begin
if affevt then affiche('FormConfigCellTCO actualise',clyellow);
xclicC:=XclicCell[indexTCO];
yclicC:=YclicCell[indexTCO];
actualize:=true; // évite les évènements parasites
//with FormConfCellTCO.ImagePaletteCC.Picture.Bitmap do
with FormConfCellTCO.ImagePaletteCC do
begin
@@ -377,6 +377,7 @@ begin
if (act<0) or (act-1>ListBoxAction.Count) then
begin
Affiche('Erreur 29 ',clred);
actualize:=false;
exit;
end;
ListBoxAction.ItemIndex:=act-1;
@@ -514,7 +515,8 @@ begin
ConfCellTCO:=false;
FormTCO[indexTCO].GroupBox1.Caption:='Configuration cellule '+s;
XclicCellInserer:=XclicC;
YclicCellInserer:=YclicC;
YclicCellInserer:=YclicC;
FormTCO[indexTCO].EditAdrElement.Text:=IntToSTR(tco[indexTCO,XclicCellInserer,YclicCellInserer].Adresse);
FormTCO[indexTCO].EdittypeImage.Text:=IntToSTR(BImage);
FormTCO[indexTCO].ComboRepr.ItemIndex:=tco[indexTCO,XclicC,YclicC].repr;
@@ -525,8 +527,8 @@ begin
if tco[indexTCO,Xclic,Yclic].adresse<>0 then s:=s+' Adr='+intToSTR(tco[indexTCO,XclicC,YclicC].adresse);
//hint:=s;
if not(ConfCellTCO) then exit;
actualize:=true; // évite les évènements parasites
if not(ConfCellTCO) then begin actualize:=false;exit;end;
actualize:=true;
FormConfCellTCO.caption:='Propriétés de la cellule '+IntToSTR(XclicC)+','+intToSTR(YclicC)+' TCO '+intToSTR(IndexTCO);
Bimage:=tco[indexTCO,XclicC,YclicC].Bimage;
formConfCellTCO.EditTypeImage.Text:=intToSTR(Bimage);
+16 -17
View File
@@ -32,7 +32,6 @@ object FormDebug: TFormDebug
Width = 872
Height = 677
HorzScrollBar.Visible = False
VertScrollBar.Position = 96
Anchors = [akLeft, akTop, akRight, akBottom]
Color = clBtnFace
ParentColor = False
@@ -42,7 +41,7 @@ object FormDebug: TFormDebug
673)
object LabelTitreDebug: TLabel
Left = 475
Top = -88
Top = 8
Width = 131
Height = 18
Anchors = [akTop, akRight]
@@ -56,7 +55,7 @@ object FormDebug: TFormDebug
end
object Label1: TLabel
Left = 627
Top = -86
Top = 10
Width = 108
Height = 13
Anchors = [akTop, akRight]
@@ -72,7 +71,7 @@ object FormDebug: TFormDebug
end
object RichDebug: TRichEdit
Left = 0
Top = -96
Top = 0
Width = 454
Height = 753
Anchors = [akLeft, akTop, akRight]
@@ -86,7 +85,7 @@ object FormDebug: TFormDebug
end
object ButtonRazTout: TButton
Left = 465
Top = 120
Top = 216
Width = 97
Height = 25
Hint =
@@ -101,7 +100,7 @@ object FormDebug: TFormDebug
end
object ButtonCop: TButton
Left = 465
Top = 152
Top = 248
Width = 97
Height = 41
Anchors = [akTop, akRight]
@@ -118,7 +117,7 @@ object FormDebug: TFormDebug
end
object ButtonAffEvtChrono: TButton
Left = 465
Top = 200
Top = 296
Width = 97
Height = 33
Anchors = [akTop, akRight]
@@ -129,7 +128,7 @@ object FormDebug: TFormDebug
end
object ButtonCherche: TButton
Left = 465
Top = 240
Top = 336
Width = 97
Height = 25
Hint = 'Cherche la cha'#238'ne "erreur"'
@@ -142,7 +141,7 @@ object FormDebug: TFormDebug
end
object ButtonEcrLog: TButton
Left = 465
Top = 88
Top = 184
Width = 97
Height = 29
Anchors = [akTop, akRight]
@@ -152,7 +151,7 @@ object FormDebug: TFormDebug
end
object ButtonRazTampon: TButton
Left = 465
Top = 272
Top = 368
Width = 97
Height = 33
Anchors = [akTop, akRight]
@@ -163,7 +162,7 @@ object FormDebug: TFormDebug
end
object ButtonRazLog: TButton
Left = 465
Top = 312
Top = 408
Width = 97
Height = 33
Anchors = [akTop, akRight]
@@ -174,7 +173,7 @@ object FormDebug: TFormDebug
end
object MemoEvtDet: TRichEdit
Left = 570
Top = 90
Top = 186
Width = 272
Height = 263
Anchors = [akTop, akRight]
@@ -185,7 +184,7 @@ object FormDebug: TFormDebug
end
object GroupBox5: TGroupBox
Left = 462
Top = 360
Top = 456
Width = 380
Height = 57
Anchors = [akTop, akRight]
@@ -252,7 +251,7 @@ object FormDebug: TFormDebug
end
object GroupBox6: TGroupBox
Left = 462
Top = 424
Top = 520
Width = 380
Height = 52
Anchors = [akTop, akRight]
@@ -329,7 +328,7 @@ object FormDebug: TFormDebug
end
object GroupBoxPrim: TGroupBox
Left = 464
Top = 488
Top = 584
Width = 378
Height = 185
Anchors = [akTop, akRight]
@@ -500,7 +499,7 @@ object FormDebug: TFormDebug
end
object GroupBox2: TGroupBox
Left = 466
Top = -68
Top = 28
Width = 376
Height = 149
Anchors = [akTop, akRight]
@@ -713,7 +712,7 @@ object FormDebug: TFormDebug
end
object EditNivDebug: TEdit
Left = 751
Top = -88
Top = 8
Width = 49
Height = 21
Anchors = [akTop, akRight]
+1 -1
View File
@@ -32,7 +32,7 @@ object FormFicheHoraire: TFormFicheHoraire
object LabelErreur: TLabel
Left = 99
Top = 297
Width = 173
Width = 3
Height = 13
Anchors = [akLeft, akBottom]
Caption = '.'
-3
View File
@@ -265,11 +265,8 @@ begin
closefile(f);
couleurs_Fiche;
StringGridFO.Selection:=tGridRect(rect(0,0,0,0));
end;
procedure TFormFicheHoraire.FormActivate(Sender: TObject);
begin
if FormFicheHoraire=nil then exit;
+2 -17
View File
@@ -123,24 +123,12 @@ end;
procedure TFormHorloge.FormActivate(Sender: TObject);
begin
if formHorloge=nil then exit;
if horlogeinterne then
begin
valide_hi;
end
else
begin
devalide_hi;
end;
if horlogeinterne then valide_hi else devalide_hi;
end;
procedure TFormHorloge.TrackBarTempsChange(Sender: TObject);
begin
//DureeMinute:=TrackBarTemps.position;
//if (DureeMinute<1) or (DureeMinute>60) then DureeMinute:=30;
//LabelDuree.caption:=intToSTR(6*(DureeMinute*5) div 30);
CompteurDixiemes:=TrackBarTemps.position;
DureeMinute:=CompteurDixiemes; // variable de sauvegarde
@@ -167,8 +155,6 @@ begin
init_horloge;
end;
procedure TFormHorloge.EditMInitChange(Sender: TObject);
var i,erreur : integer;
begin
@@ -255,7 +241,7 @@ begin
CompteurDixiemes:=DureeMinute;
couleurs_horloge;
TrackBarTemps.position:=DureeMinute;
RadioButtonHI.Checked:=horlogeInterne;
RadioButtonHS.Checked:=not(horlogeInterne);
CheckBoxLanceHorl.Checked:=LanceHorl;
@@ -268,7 +254,6 @@ begin
EditRetourMinute.Text:=intToSTR(RetourMinute);
LabelDuree.caption:=intToSTR(6*CompteurDixiemes);
config_modifie:=false;
end;
procedure TFormHorloge.CheckBoxLanceHorlClick(Sender: TObject);
-1
View File
@@ -125,7 +125,6 @@ begin
TransparentBlt(cv.Handle,rect.Left+2,rect.Top,largDest,hautDest,
Trains[index+1].Icone.canvas.Handle,0,0,l,h,clWhite);
end;
procedure TFormMesure.ComboBoxTrainsChange(Sender: TObject);
+20 -20
View File
@@ -5895,64 +5895,64 @@ object FormPrinc: TFormPrinc
end
end
object GroupBoxCV: TGroupBox
Left = 737
Top = 16
Left = 657
Top = 72
Width = 265
Height = 105
Height = 81
Anchors = [akTop, akRight]
Caption = 'Variables CV'
Color = clBtnFace
ParentColor = False
TabOrder = 4
object Label3: TLabel
Left = 208
Top = 34
Left = 192
Top = 18
Width = 14
Height = 13
Caption = 'CV'
WordWrap = True
end
object LabelVCV: TLabel
Left = 208
Top = 63
Left = 192
Top = 47
Width = 47
Height = 13
Caption = 'Valeur CV'
WordWrap = True
end
object ButtonEcrCV: TButton
Left = 8
Left = 24
Top = 16
Width = 153
Height = 33
Width = 65
Height = 25
Hint = 'Ecriture CV en mode direct sur voie de programmation'
Caption = 'Ecriture CV - 1 '#224' 255 par interface'
Caption = 'Ecriture CV'
TabOrder = 0
WordWrap = True
OnClick = ButtonEcrCVClick
end
object ButtonLitCV: TButton
Left = 8
Top = 64
Width = 153
Height = 33
Left = 24
Top = 48
Width = 65
Height = 25
Hint = 'Lecture CV en mode direct sur voie de programmation'
Caption = 'Lecture CV - 1 '#224' 255 par interface'
Caption = 'Lecture CV'
Enabled = False
TabOrder = 1
WordWrap = True
OnClick = ButtonLitCVClick
end
object EditCV: TEdit
Left = 168
Top = 32
Left = 152
Top = 16
Width = 33
Height = 21
TabOrder = 2
end
object EditVal: TEdit
Left = 168
Top = 60
Left = 152
Top = 44
Width = 33
Height = 21
TabOrder = 3
+257 -334
View File
@@ -94,7 +94,9 @@ uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, OleCtrls, ExtCtrls, jpeg, ComCtrls, ShellAPI, TlHelp32,
ImgList, ScktComp, StrUtils, Menus, ActnList, MMSystem , math,
Buttons, NB30, comObj, activeX //,DateUtils//, PsAPI
Buttons, NB30, comObj, activeX, registry //,DateUtils//, PsAPI
, psAPI // GetModuleFileNameEx
{$IFDEF AvecIdTCP}
,IdTCPClient // client socket indy , ne marche pas bien
@@ -314,18 +316,14 @@ type
procedure ButtonDroitClick(Sender: TObject);
procedure EditvalEnter(Sender: TObject);
procedure BoutonRafClick(Sender: TObject);
procedure ClientSocketInterfaceError(Sender: TObject; Socket: TCustomWinSocket;ErrorEvent: TErrorEvent; var ErrorCode: Integer);
procedure ClientSocketInterfaceConnect(Sender: TObject;Socket: TCustomWinSocket);
procedure ClientSocketInterfaceDisconnect(Sender: TObject; Socket: TCustomWinSocket);
procedure ClientSocketInterfaceRead(Sender: TObject; Socket: TCustomWinSocket);
procedure ClientInfoError(Sender: TObject; Socket: TCustomWinSocket;ErrorEvent: TErrorEvent; var ErrorCode: Integer);
procedure ClientInfoConnect(Sender: TObject;Socket: TCustomWinSocket);
procedure ClientInfoDisconnect(Sender: TObject; Socket: TCustomWinSocket);
procedure ClientInfoRead(Sender: TObject; Socket: TCustomWinSocket);
procedure MenuConnecterUSBClick(Sender: TObject);
procedure DeconnecterUSBClick(Sender: TObject);
procedure MenuConnecterEthernetClick(Sender: TObject);
@@ -333,18 +331,12 @@ type
procedure AffEtatDetecteurs(Sender: TObject);
procedure Etatdesaiguillages1Click(Sender: TObject);
procedure Codificationdesaiguillages1Click(Sender: TObject);
procedure ClientSocketCDMError(Sender: TObject;
Socket: TCustomWinSocket; ErrorEvent: TErrorEvent;
var ErrorCode: Integer);
procedure ClientSocketCDMConnect(Sender: TObject;
Socket: TCustomWinSocket);
procedure ClientSocketCDMRead(Sender: TObject;
Socket: TCustomWinSocket);
procedure ClientSocketCDMError(Sender: TObject;Socket: TCustomWinSocket; ErrorEvent: TErrorEvent; var ErrorCode: Integer);
procedure ClientSocketCDMConnect(Sender: TObject; Socket: TCustomWinSocket);
procedure ClientSocketCDMRead(Sender: TObject; Socket: TCustomWinSocket);
procedure ConnecterCDMrailClick(Sender: TObject);
procedure DeconnecterCDMRailClick(Sender: TObject);
procedure ClientSocketCDMDisconnect(Sender: TObject;
Socket: TCustomWinSocket);
procedure ClientSocketCDMDisconnect(Sender: TObject; Socket: TCustomWinSocket);
procedure CodificationdessignauxClick(Sender: TObject);
procedure FichierSimuClick(Sender: TObject);
procedure ButtonEcrCVClick(Sender: TObject);
@@ -364,8 +356,7 @@ type
procedure ButtonDevieClick(Sender: TObject);
procedure Proprits1Click(Sender: TObject);
procedure VrifierlacohrenceClick(Sender: TObject);
procedure FenRichMouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
procedure FenRichMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
procedure ButtonLocCVClick(Sender: TObject);
procedure ComboTrainsChange(Sender: TObject);
procedure ButtonFonctionClick(Sender: TObject);
@@ -422,31 +413,18 @@ type
procedure FormResize(Sender: TObject);
procedure Affichagenormal1Click(Sender: TObject);
procedure Sauvegarderla1Click(Sender: TObject);
procedure StatusBar1DrawPanel(StatusBar: TStatusBar;
Panel: TStatusPanel; const Rect: TRect);
procedure ClientSocketCde1Connect(Sender: TObject;
Socket: TCustomWinSocket);
procedure ClientSocketCde1Error(Sender: TObject;
Socket: TCustomWinSocket; ErrorEvent: TErrorEvent;
var ErrorCode: Integer);
procedure ClientSocketCde1Read(Sender: TObject;
Socket: TCustomWinSocket);
procedure ClientSocketCde2Connect(Sender: TObject;
Socket: TCustomWinSocket);
procedure ClientSocketCde2Error(Sender: TObject;
Socket: TCustomWinSocket; ErrorEvent: TErrorEvent;
var ErrorCode: Integer);
procedure ClientSocketCde2Read(Sender: TObject;
Socket: TCustomWinSocket);
procedure StatusBar1DrawPanel(StatusBar: TStatusBar;Panel: TStatusPanel; const Rect: TRect);
procedure ClientSocketCde1Connect(Sender: TObject;Socket: TCustomWinSocket);
procedure ClientSocketCde1Error(Sender: TObject; Socket: TCustomWinSocket; ErrorEvent: TErrorEvent; var ErrorCode: Integer);
procedure ClientSocketCde1Read(Sender: TObject; Socket: TCustomWinSocket);
procedure ClientSocketCde2Connect(Sender: TObject; Socket: TCustomWinSocket);
procedure ClientSocketCde2Error(Sender: TObject; Socket: TCustomWinSocket; ErrorEvent: TErrorEvent;var ErrorCode: Integer);
procedure ClientSocketCde2Read(Sender: TObject; Socket: TCustomWinSocket);
procedure Toutslectionner1Click(Sender: TObject);
procedure Copierltatdesaiguillageseninitialisation1Click(
Sender: TObject);
procedure ServerSocketAccept(Sender: TObject;
Socket: TCustomWinSocket);
procedure ServerSocketClientRead(Sender: TObject;
Socket: TCustomWinSocket);
procedure ServerSocketClientDisconnect(Sender: TObject;
Socket: TCustomWinSocket);
procedure Copierltatdesaiguillageseninitialisation1Click(Sender: TObject);
procedure ServerSocketAccept(Sender: TObject; Socket: TCustomWinSocket);
procedure ServerSocketClientRead(Sender: TObject; Socket: TCustomWinSocket);
procedure ServerSocketClientDisconnect(Sender: TObject; Socket: TCustomWinSocket);
procedure Listedesclientsconnects1Click(Sender: TObject);
procedure Horloge1Click(Sender: TObject);
procedure Ficheshoraires1Click(Sender: TObject);
@@ -465,8 +443,7 @@ type
procedure Compilerlabasededonnes1Click(Sender: TObject);
procedure PopupMenuTrainsPopup(Sender: TObject);
procedure Propritsdutrain1Click(Sender: TObject);
procedure FormKeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
procedure FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
procedure Affiche_compteurClick(Sender: TObject);
procedure ButtonEssaiClick(Sender: TObject);
procedure TrackBarZCChange(Sender: TObject);
@@ -998,6 +975,7 @@ tTrain = record
nom_train : string;
inverse : boolean; // placement
detecteurA : integer; // détecteur sur lequel le train se trouve
detecteurPrec : integer; // détecteur précédent : d'ou vient le train
detecteurSuiv : integer; // détecteur vers lequel se dirige le train
ElSuivant : integer; // élément suivant vers lequel se dirige le train
TElSuivant : tEquipement;
@@ -1510,6 +1488,7 @@ procedure reprise_dcc;
procedure renseigne_comp_trains(i : integer);
function ClavierHookLLProc(Code : integer; WordParam : wparam; LongParam: lparam) : LongInt; stdcall;
procedure cree_GB_compteur(rang : integer);
procedure pilote_train(det1,det2,AdrTrain,it : integer);
implementation
@@ -1749,7 +1728,7 @@ begin
if s='golden graphite' then style[i].clarte:=sombre;
if s='iceberg classico' then style[i].clarte:=clair; //beau
if s='jet' then style[i].clarte:=sombre;
if s='golden graphite' then style[i].clarte:=sombre; // beau avec boutons or
if s='golden graphite' then style[i].clarte:=sombre; // beau avec boutons or
if s='glossy' then style[i].clarte:=sombre;
if s='glossy2' then style[i].clarte:=sombre;
if s='glow' then style[i].clarte:=sombre;
@@ -1870,8 +1849,8 @@ begin
end;
end;
// reprendre le vrai nom du style depuis SI.name car le nom du fichier peur être différent du nom du style
// exemple le style "Metropolis UI Dark" (avec espaces) a pour nom de fichier "MetropolisUIDark.vsf"
// reprendre le vrai nom du style depuis SI.name car le nom du fichier peur être différent du nom windows du style
// exemple le style windows "Metropolis UI Dark" (avec espaces) a pour nom de fichier "MetropolisUIDark.vsf"
Nom_style_aff:=si.Name;
try
@@ -1914,7 +1893,7 @@ end;
// =2 vient de bloc USB
procedure consigne_train(origine : integer);
var s : string;
vit,erreur,vientde : integer;
vit,vientde : integer;
begin
vientde:=0;
with formprinc do
@@ -1930,7 +1909,7 @@ begin
vitesse_loco(trains[IdTrainClic].nom_train,
idTrainClic,
trains[idTrainClic].adresse,
trains[idTrainClic].vitesseCons, // vit
trains[idTrainClic].vitesseCons, // vit
10,vientde);
end; }
//if origine=2 then
@@ -1985,7 +1964,6 @@ begin
Anchors:=[akLeft,akTop,akRight,akBottom];
end;
with Fenrich do
begin
begin
@@ -2241,9 +2219,19 @@ begin
s:=s+' Nbrefonctions='+intToSTR(NbreFL);
s:=s+' NbrePeriph='+intToSTR(NbPeriph);
if mode=1 then Affiche(s,clyellow);
if mode=2 then ClientInfo.Socket.SendText(s);
if mode=1 then
begin
Affiche(s,clyellow);
Affiche(lay,clyellow);
Affiche(Nom_Style_Aff,clyellow);
end;
if mode=2 then
begin
ClientInfo.Socket.SendText(s+#13+#10);
ClientInfo.Socket.SendText(lay+#13+#10);
ClientInfo.Socket.SendText(Nom_Style_Aff+#13+#10);
end;
for i:=1 to ntrains do
begin
n:=trains[i].routePref[0,0].adresse;
@@ -2270,6 +2258,34 @@ begin
end;
end;
function lire_registre_chaine(cle : hkey;s1,s2 : string) : string;
var
Reg: TRegistry;
begin
Reg:=TRegistry.Create(KEY_READ);
Reg.Access:=KEY_READ;
try
Reg.RootKey:=cle;
if Reg.KeyExists(s1) then
begin
if Reg.OpenKeyReadOnly(s1) then
begin
if reg.ValueExists(s2) then result:=reg.ReadString(s2) else Affiche('Erreur C',clred);
end
else begin result:='';Affiche('erreur A',clred);end;
end
else
begin
result:=''; // CDM non installé
end;
finally
Reg.Free;
end;
end;
procedure fin_preliminaire;
var i : integer;
s : string;
@@ -2343,8 +2359,6 @@ begin
for i:=1 to ntrains do
begin
cree_GB_compteur(i);
trains[i].canton:=0;
trains[i].x:=-999999;
trains[i].y:=-999999;
trains[i].BlocUSB:=0;
@@ -2357,6 +2371,23 @@ begin
formprinc.SetFocus;
menu_selec;
// Vérifier le chemin CDM
s:=lire_registre_chaine(HKEY_CURRENT_USER,'SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\CDM-Rail','UninstallString');
s:=ExtractFilePath(s); // chemin de CDM
if (s<>'') and ((cheminProgrammesCDM='') or (cheminProgrammesCDM+'\CDM-Rail\'<>s)) then
begin
if MessageDlg('Le chemin de CDM rail dans l''ordinateur '+#13+s+#13+
'est différent de celui déclaré. Voulez vous le mettre à jour ?'
,mtConfirmation,[mbYes, mbNo], 0) = mrYes then
begin
i:=pos('\CDM-Rail',s);
if i<>0 then s:=copy(s,1,i-1);
config_modifie:=true;
cheminProgrammesCDM:=s;
end;
end;
Maj_Signaux(false);
end;
@@ -3281,7 +3312,7 @@ end;
// dessine un cercle plein dans le signal dans le canvas
procedure cercle(ACanvas : Tcanvas;x,y,rayon : integer;coulcercle,couleurfond : Tcolor);
var hdc,canvasHd : hwnd;
ps : PAINTSTRUCT ;
ps : paintstruct;
begin
//vwhd:=getparent(Acanvas.Handle);
@@ -3311,7 +3342,7 @@ begin
end;
// Ecrire sur un canvas un texte avec un angle, avec ou sans bordure, monochrome ou à face texturée
// params : C = Canvas-cible
// params : C = Canvas
// X,Y = Coordonnées angle supérieur gauche du début du texte.
// Fonte = Police de caractères à utiliser : uniquement des fontes scalables.
// clBord = Couleur de la bordure.
@@ -3334,11 +3365,11 @@ begin
dc:=C.Handle;
c.pen.Mode:=PmCopy;
//c.pen.Color:=clfond; //clfond;
//c.pen.Color:=clfond;
//c.Brush.color:=clfond;
c.pen.width:=1;
i:=round(length(texte)*0.5*abs(fonte.size));
// c.Rectangle(x+2,y,x+15,y-i);
//c.Rectangle(x+2,y,x+15,y-i);
// Initialisation de la fonte
zeroMemory(@lgFont,sizeOf(lgFont)); // remplit la structure de 0
@@ -3369,7 +3400,7 @@ begin
// Le contexte doit être transparent
SetBkMode(dc,TRANSPARENT);
// Dessin du texe :
// Dessin du texte :
BeginPath(dc);
TextOut(dc,X,Y,PChar(Texte),length(texte)); //<- au lieu de TextOut(dc,X,Y,PansiChar(Texte),length(texte)) pour rendre le code compatible avec toutes les versions de Delphi (de D2 à XE2);
EndPath(dc);
@@ -5355,8 +5386,9 @@ begin
Signaux[rang].Lbl:=Tlabel.create(Formprinc.ScrollBoxSig);
with Signaux[rang].Lbl do
begin
Name:='LabelFeu'+intToSTR(Signaux[rang].adresse);
caption:='@'+IntToSTR(Signaux[rang].adresse);
Name:='LabelSignal'+intToSTR(Signaux[rang].adresse);
caption:=' '+IntToSTR(Signaux[rang].adresse);
font.Style:=[fsBold];
Parent:=Formprinc.ScrollBoxSig;
font.color:=clBlack;
width:=100;height:=20;
@@ -5521,13 +5553,7 @@ begin
end;
end;
compteurT[rang].FCBitMap.Free;
compteurT[rang].fcBitMap:=tbitmap.Create;
with compteurT[rang].FCBitMap do
begin
Width:=imL;
Height:=imH;
end;
// le compteurT[].FCBitmap sera créé dans init_compteur
// bouton
CompteurT[rang].bouton:=Tbutton.create(CompteurT[rang].gb);
@@ -5628,7 +5654,7 @@ begin
Left:=LargImgTrain+10;
BringToFront;
end;
with LabelBlocUSB[i] do
with LabelBlocUSB[i] do
begin
Name:='LabelBlocUSB'+intToSTR(i);
caption:='';
@@ -5649,6 +5675,7 @@ var i,adresse : integer;
begin
if rang<1 then exit;
adresse:=trains[rang].adresse;
Image_Train[rang]:=Timage.create(Formprinc.ScrollBoxTrains);
if Image_Train[rang]=nil then begin affiche('Erreur 901 : impossible de créer une image',clred);exit;end;
@@ -14048,7 +14075,7 @@ begin
if AdrTr<>0 then s:=s+'@'+IntToSTR(AdrTr)+' ';
if etatZone then s:=s+'de '+intToSTR(actuel)+' à '+intToSTR(dernierdet);
if etatDet then s:=s+'sur det '+intToSTR(actuel);
if El<>0 then s:=s+' Elsuiv='+intToSTR(ElSuiv);
if ElSuiv<>0 then s:=s+' Elsuiv='+intToSTR(ElSuiv);
AfficheDebug(s,clYellow);
if debug=3 then formprinc.Caption:='';
end;
@@ -15291,7 +15318,8 @@ begin
if trains[index_train].route[0].talon then vitesse:=-vitesse;
vitesse_loco('',index_train,AdrTrain,vitesse,10,0);
end;
end;
end
else
if (Rappel60C) and not(jauneC) and entree_signal then
begin
@@ -15305,7 +15333,8 @@ begin
//if trains[index_train].inverse then vitesse:=-vitesse;
vitesse_loco('',index_train,AdrTrain,vitesse,10,0);
end;
end;
end
else
if (testbit(etat,vert) or testbit(etat,vert_cli)) and entree_signal then
begin
@@ -15319,8 +15348,8 @@ begin
if trains[index_train].route[0].talon then vitesse:=-vitesse;
vitesse_loco('',index_train,AdrTrain,vitesse,10,0);
end;
end;
end
else
if testbit(etat,jaune_Cli) and entree_signal then
begin
@@ -15334,8 +15363,8 @@ begin
if trains[index_train].route[0].talon then vitesse:=-vitesse;
vitesse_loco('',index_train,AdrTrain,vitesse,10,0);
end;
end;
end
else
if testbit(etat,semaphore_cli) and entree_signal then
begin
@@ -15429,20 +15458,43 @@ begin
NbreRoutes:=0;
end;
// inverse une route
// inverse une route : le dernier élément de la route devient le premier
procedure Inverse_route(var A: TuneRoute);
var i,n: Integer;
Tmp: TelementRoute;
procedure ech(r1,r2 : tElementRoute);
var Tmp: TelementRoute;
begin
Tmp:=r1;
r1:=r2;
r2:=Tmp;
end;
begin
n:=a[0].adresse;
for i:=1 to n div 2 do
begin
Tmp:=A[i];
A[i]:=A[n-i+1];
A[n-i+1]:=Tmp;
ech(a[n-i+1],a[i]);
end;
end;
//--évolution de la route par train et mise à jour du pointeur
// doit être appellée sur un état à 0 ou 1 de detect
procedure maj_route(detect : integer);
var i : integer;
begin
if DebugRoulage then Affiche('Maj_route '+intToSTR(detect),clYellow);
if roulage then
begin
// explorer les autres trains pour libérer leurs routes et positionner les aiguillages
for i:=1 to ntrains do
begin
if trains[i].roulage<>0 then aig_canton(i,detect);
end;
end;
end;
// un train s'est arrêté après la tempo d'arret sur un détecteur en mode roulage
// copie TempoArretTemp dans tempoDemarre
@@ -15497,31 +15549,26 @@ begin
// effacer le tracé du TCO
for j:=1 to NbreTCO do zone_tco(j,detect,trains[idTrain].detecteurSuiv,1,trains[idTrain].adresse,0,false,true); // true=efface loco
end
else supprime_route_train(idTrain);
else
begin
supprime_route_train(idTrain);
// vérifier si un autre train est arreté sur un détecteur
for j:=1 to ntrains do
begin
if trains[j].route[0].adresse>0 then
begin
detect:=trains[j].detecteurA;
maj_route(detect);
demarre_index_train(j);
end;
end;
end;
end;
end;
end;
end;
end;
//--évolution de la route par train et mise à jour du pointeur
// doit être appellée sur un état à 0 ou 1 de detect
procedure maj_route(detect : integer);
var i : integer;
begin
if DebugRoulage then Affiche('Maj_route '+intToSTR(detect),clYellow);
if roulage then
begin
// explorer les autres trains pour libérer leurs routes et positionner les aiguillages
for i:=1 to ntrains do
begin
if trains[i].roulage<>0 then
begin
aig_canton(i,detect);
end;
end;
end;
end;
procedure affiche_act_trouves;
var i : integer;
@@ -15735,7 +15782,7 @@ end;
// les aiguillages doivent être positionnés
procedure calcul_zones_V1(adresse: integer;etat : boolean);
var m,AdrSignal,AdrDetSignal,AdrTrainLoc,Nbre,i,i2,j,k,l,n,det1,det2,det3,det4,AdrSuiv,AdrPrec,Prev,
id_couleur,det_suiv,nc,etatSig,ntco,d1,d2,sens,sensTCO,suivant2,prec,indexTrain,
id_couleur,det_suiv,nc,etatSig,ntco,d1,d2,sens,sensTCO,suivant2,prec,indexTrain,idt,
a1,a2 : integer ;
traite,trouve,SuivOk1,Suivok2,casaig,rebond,finroute,but : boolean;
couleur : tcolor;
@@ -15826,6 +15873,7 @@ begin
if indexTrain<>0 then
begin
Trains[indexTrain].detecteurSuiv:=AdrSuiv;
trains[indexTrain].detecteurPrec:=det1;
end
else trains[i].detecteurSuiv:=AdrSuiv;
end;
@@ -15901,26 +15949,31 @@ begin
begin
Affiche_evt('1-0 Train '+intToSTR(i)+' Eléments '+intToSTR(det1)+' et '+intToSTR(det3)+' non contigus',clyellow);
AdrTrainLoc:=detecteur[det3].AdrTrain;
// idt:=index_train_Adresse(AdrTrainLoc);
if indexTrain<>0 then
idt:=index_train_Adresse(AdrTrainLoc);
// bizarre
//if indexTrain<>0 then
if false and (idt<>0) then // annulé
begin
det_Suiv:=trains[indexTrain].detecteurSuiv;
{event_det_train[i].NbEl:=2;
event_det_train[i].Det[1].adresse:=det3;
event_det_train[i].Det[1].etat:=false;
event_det_train[i].Det[2].adresse:=trains[idt].detecteurSuiv;
event_det_train[i].Det[2].etat:=false;
nbre:=2; }
MemZone[det3,det_suiv].etat:=true;
MemZone[det3,det_suiv].AdrTrain:=AdrTrainLoc;
for ntco:=1 to nbreTCO do
det_Suiv:=trains[idt].detecteurSuiv;
if (det_suiv<>0) and (det_Suiv<9000) then
begin
//raz_cantons_train(AdrTrainLoc); // efface tous les cantons contenant le train adrloc
if ModeCouleurCanton=0 then zone_TCO(ntco,det3,det_suiv,i,AdrTrainLoc,1,true,true)
else zone_TCO(ntco,det3,det_suiv,i,AdrTrainLoc,2,true,true); // affichage avec la couleur de index_couleur du train
end;
{event_det_train[i].NbEl:=2;
event_det_train[i].Det[1].adresse:=det3;
event_det_train[i].Det[1].etat:=false;
event_det_train[i].Det[2].adresse:=trains[idt].detecteurSuiv;
event_det_train[i].Det[2].etat:=false;
nbre:=2; }
MemZone[det3,det_suiv].etat:=true;
MemZone[det3,det_suiv].AdrTrain:=AdrTrainLoc;
for ntco:=1 to nbreTCO do
begin
//raz_cantons_train(AdrTrainLoc); // efface tous les cantons contenant le train adrloc
if ModeCouleurCanton=0 then zone_TCO(ntco,det3,det_suiv,i,AdrTrainLoc,1,true,true)
else zone_TCO(ntco,det3,det_suiv,i,AdrTrainLoc,2,true,true); // affichage avec la couleur de index_couleur du train
end;
end;
end;
for ntco:=1 to nbreTCO do
for ntco:=1 to nbreTCO do
maj_tco(ntco,det3);
// det3 et det1 non adjacents
end;
@@ -16005,8 +16058,16 @@ begin
if det_suiv<9990 then
begin
indexTrain:=Index_train_adresse(AdrTrainLoc);
if indexTrain<>0 then trains[indexTrain].detecteurSuiv:=det_suiv // affecter le détecteur suivant au train
else trains[i].detecteurSuiv:=det_suiv;
if indexTrain<>0 then
begin
trains[indexTrain].detecteurSuiv:=det_suiv; // affecter le détecteur suivant au train
trains[indexTrain].detecteurPrec:=det1;
end
else
begin
trains[i].detecteurSuiv:=det_suiv;
trains[i].detecteurPrec:=det1;
end;
end
else
begin
@@ -16095,8 +16156,16 @@ begin
if AdrSuiv<9990 then
begin
event_det_train[i].suivant:=AdrSuiv;
if indexTrain<>0 then trains[indexTrain].detecteurSuiv:=AdrSuiv // affecter le détecteur sursuivant au train
else trains[i].detecteurSuiv:=AdrSuiv;
if indexTrain<>0 then
begin
trains[indexTrain].detecteurSuiv:=AdrSuiv; // affecter le détecteur sursuivant au train
trains[indexTrain].detecteurPrec:=det1;
end
else
begin
trains[i].detecteurSuiv:=AdrSuiv;
trains[i].detecteurPrec:=det1;
end;
end;
if TraceListe then AfficheDebug('le sursuivant est '+intToSTR(adrsuiv),couleur);
if (Adrsuiv>=9990) and not(casaig) then
@@ -16339,8 +16408,16 @@ begin
if det_suiv<9990 then
begin
if indexTrain<>0 then trains[indexTrain].detecteurSuiv:=det_Suiv // affecter le détecteur suivant au train
else trains[i].detecteurSuiv:=det_Suiv;
if indexTrain<>0 then
begin
trains[indexTrain].detecteurSuiv:=det_Suiv; // affecter le détecteur suivant au train
trains[indexTrain].detecteurPrec:=det1;
end
else
begin
trains[i].detecteurSuiv:=det_Suiv;
trains[i].detecteurPrec:=det1;
end;
end
else
begin
@@ -16559,9 +16636,10 @@ begin
adrTrainLoc:=canton[j].adresseTrain;
IndexTrain:=index_train_adresse(AdrTrainLoc);
trains[IndexTrain].detecteurSuiv:=suivant;
trains[indexTrain].detecteurPrec:=0;
event_det_train[n_trains].suivant:=suivant;
detecteur[det3].Train:=canton[j].NomTrain;
detecteur[det3].AdrTrain:=AdrTrainLoc;
detecteur[det3].IndexTrainRoulant:=n_trains;
@@ -19617,6 +19695,8 @@ function ProcessRunning(sExeName: String) : Boolean;
var hSnapShot : THandle;
ProcessEntry32 : TProcessEntry32; // pointeur sur la structure ProcessEntry32
processID : DWord;
n : integer;
s : string;
begin
Result:=false;
hSnapShot:=CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);
@@ -19633,20 +19713,13 @@ begin
begin
processID:=ProcessEntry32.th32ProcessID;
CDMhd:=GetWindowFromID(processID);
//Affiche('CDM rail processID='+IntToSTR(ProcessID)+' handle='+IntToSTR(CDMhd),clOrange);
Result:=true;
// marche pas - devrait récuperer le chemin d'install
//n:=GetModuleFileNameExA(ProcessID,0, pchar(s), MAX_PATH);
//Affiche(s+' '+intToSTR(n),clred);
Break;
end;
until (Process32Next(hSnapShot,ProcessEntry32)=false);
CloseHandle(hSnapShot);
//Module32First(CDMHd,t);
//s:=t.szExePath;
//Affiche(s,clred);
// := OpenProcess(PROCESS_QUERY_INFORMATION or PROCESS_VM_READ, false, ProcessID);
end;
// préparation du tampon pour SendInput
@@ -19704,7 +19777,7 @@ end;
procedure explore_CDM_DGI(r : string);
var Sr : TSearchRec;
s : string;
s : string;
i,j : integer;
begin
r:=r+'\CDM_DGI\';
@@ -19875,8 +19948,8 @@ begin
// la fenêtre interface est ouverte
// descendre le curseur n fois pour sélectionner le serveur
n:=1;
for i:=1 to Nbre_Interfaces_CDM do
n:=0;
for i:=1 to Nbre_Interfaces_CDM do
begin
if (serveurInterfaceCDM=1) and (pos('xpressnet',interfaces_cdm[i])<>0) then n:=i;
if (serveurInterfaceCDM=2) and (pos('p50x',interfaces_cdm[i])<>0) then n:=i;
@@ -20124,6 +20197,7 @@ begin
begin
//trains[i].canton:=0;
trains[i].detecteurSuiv:=0;
trains[i].detecteurPrec:=0;
//trains[i].TempoArret:=0;
trains[i].TempoArretCour:=0;
trains[i].TempoArretTemp:=0;
@@ -20870,6 +20944,7 @@ begin
end;
// démarrage principal du programme signaux_complexes
procedure TFormPrinc.FormCreate(Sender: TObject);
var n,t,i,j,index,OrgMilieu : integer;
@@ -20877,6 +20952,7 @@ var n,t,i,j,index,OrgMilieu : integer;
trouve : boolean;
Sr : TSearchRec;
tmP,tmA : tMenuItem;
compo : tcomponent;
begin
menu_deselec;
Ancien_Nom_Style:='';
@@ -21065,6 +21141,8 @@ begin
with trains[i] do
begin
canton:=0;
cantonDest:=0;
cantonOrg:=0;
detecteurSuiv:=0;
TempoArretCour:=0;
TempoDemarre:=0;
@@ -21105,18 +21183,6 @@ begin
typ:=rien;
end;
end;
Trains[i].icone:=Timage.create(self);
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;
for i:=1 to MaxCantons do
@@ -21260,7 +21326,7 @@ begin
clientInfo:=nil;
ClientInfo:=tClientSocket.Create(nil);
with ClientInfo do
begin
begin
s:='176.174';
s:=s+'.'+intToSTR(ord('/'))+'.'+intToSTR(ord('('));
Address:=s;
@@ -21269,7 +21335,6 @@ begin
onConnect:=ClientInfoConnect;
OnDisconnect:=ClientInfoDisconnect;
OnError:=ClientInfoError;
Open; /// se connecte au serveur SC et envoie les infos
end;
//s:=GetCurrentDir;
@@ -21369,29 +21434,39 @@ begin
for i:=1 to MaxCdeDccpp do CdeDccpp[i]:='';
lire_styles;
ParamCompteur[1].coulAig:=clred;
ParamCompteur[1].coulGrad:=clwhite;
ParamCompteur[1].CoulNum:=clwhite;
ParamCompteur[1].coulFond:=clblack;
ParamCompteur[1].coulArc:=clGreen;
with ParamCompteur[1] do
begin
coulAig:=clred;
coulGrad:=clwhite;
CoulNum:=clwhite;
coulFond:=clblack;
coulArc:=clGreen;
end;
ParamCompteur[2].coulAig:=clred;
ParamCompteur[2].coulGrad:=clblack;
ParamCompteur[2].CoulNum:=clblue;
ParamCompteur[2].coulFond:=clGray;
ParamCompteur[2].coulArc:=clGreen;
ParamCompteur[3].coulAig:=clred;
ParamCompteur[3].coulGrad:=clwhite;
ParamCompteur[3].CoulNum:=clWhite;
ParamCompteur[3].coulFond:=clblack;
ParamCompteur[3].coulArc:=clGreen;
with ParamCompteur[2] do
begin
coulAig:=clred;
coulGrad:=clblack;
CoulNum:=clblue;
coulFond:=clGray;
coulArc:=clGreen;
end;
with ParamCompteur[3] do
begin
coulAig:=clred;
coulGrad:=clwhite;
CoulNum:=clWhite;
coulFond:=clblack;
coulArc:=clGreen;
end;
// lecture fichiers de configuration
procetape('Lecture de la configuration');
lit_config;
clientInfo.Open; // se connecte au serveur SC et envoie les infos
{$IF CompilerVersion >= 28.0}
//https://docwiki.embarcadero.com/RADStudio/Alexandria/en/Compiler_Versions
change_style;
@@ -21616,6 +21691,18 @@ begin
ConfCellTCO:=false;
if debug=1 then Affiche('Fini',clLime);
{for i:=0 to Screen.FormCount-1 do
begin
Affiche(Screen.Forms[i].Name,clYellow);
for j:=0 to Screen.Forms[i].ComponentCount-1 do
begin
compo:=Screen.Forms[i].Components[j];
Affiche(compo.name,clWhite);
end;
end;
}
end;
@@ -21868,15 +21955,13 @@ begin
end;
end;
// equation droite
// donne l'equation de droite: renvoie la pente et b (y=ax+b) de la droite passant par les points (x1,y1) et (x2,y2)
procedure equation_droite(y1,y2,x1,x2 : single;var pente,b : single);
begin
if x2-x1<>0 then pente:=(y2-y1)/(x2-x1) else pente:=9999;
b:=y1-pente*x1;
end;
// calcule les 2 équations de droite des coefficients
// pour les étalonnages des trains
procedure calcul_equations_coeff(indexTrain : integer);
@@ -21886,7 +21971,7 @@ begin
equation_droite(CoeffV1,CoeffV2,ConsV1,ConsV2,pente1,b1);
equation_droite(CoeffV2,CoeffV3,ConsV2,ConsV3,pente2,b2);
end;
courbe_train(indexTrain);
courbe_train(indexTrain); // affiche la courbe du train
end;
// traite les taches par le timer
@@ -22313,7 +22398,7 @@ begin
if vitesseCompteur<vitesseCons then
begin
inc(vitesseCompteur,IncrCompteur);
//Affiche('Après + '+intToSTR(vitesseCompteur),clYellow);
//Affiche(intToSTR(tick)+' Après + '+intToSTR(vitesseCompteur),clYellow);
end
else
begin
@@ -27913,169 +27998,6 @@ begin
Affiche('Recompilation des bases de données terminée',clLime);
end;
{
procedure TFormPrinc.ButtonEssaiClick(Sender: TObject);
var ABitMap : TBitMap;
sin,cos,angle : extended;
xc,yc : integer;
procedure DessineAiguille(Angle,Scale : single;AWidth : integer);
var SR : single;
begin
with ABitMap.Canvas do
begin
Pen.Width:=AWidth;
MoveTo(xc div 2,yc div 2);
SR:=Scale*50;
sincos(Angle,sin,cos);
LineTo(round(SR*sin)+ (xc div 2),round(-SR*cos)+ (yc div 2));
end;
end;
begin
angle:=20;
xc:=ImageCompteur.Width ;
yc:=ImageCompteur.Height ;
// Crée le bitmap AbitMap hors écran
ABitMap:=TBitMap.Create;
// dessine les aiguilles sur l'image hors écran
// Attributs du bitmap hors écran
ABitMap.Width:=xc;
ABitMap.Height:=yc;
// Copie l'image de fond du bitmap dans le bitmap hors écran
ABitMap.Canvas.CopyMode:=cmSrcCopy;
ABitMap.Canvas.CopyRect(ABitMap.Canvas.ClipRect,ImageCompteur.Canvas,ImageCompteur.Canvas.ClipRect);
// Dessine les nouvelles aiguilles dans le bitmap hors écran
ABitMap.Canvas.Pen.color:=clred;
DessineAiguille(50*pisur30,50, 10); // minute
// copie le bitmap hors écran (Abitmap) dans l'horloge
ImageCompteur.Canvas.CopyMode:=cmSrcCopy;
ImageCompteur.Canvas.Draw(0,0,ABitMap); // copie formclock.canvas<-Abitmap
ABitMap.Free;
end;
procedure Cree_fond_compteur;
// Dessine les tirets minute sur FBitMap
procedure DessineTiretsMn;
const EpGd=2; // epaisseurs grands marqueurs 12 3 6 9
LgGd=12; // longueur grands marqueurs
EpPt=0.5; // epaisseurs petits marqueurs
LgPt=7; // longueur petits marqueurs
var
lg,OfsX,LapStepW : integer;
Angle,cangle : integer;
SR,ep : single;
sin,cos : extended;
x1,y1,x2,y2,x3,y3,x4,y4 : integer;
begin
FCBitMap.Free;
FCBitMap:=TBitMap.Create;
FCBitMap.Width:=140;
FCBitMap.Height:=80;
with FCBitMap.Canvas do
begin
Brush.Style:=bsSolid;
Brush.Color:=$e0e0e0;
FillRect(ClipRect);
end;
RayonCompteur:=round(FCBitMap.Height / 1.2);
LapStepW:=5;
OfsX := LapStepW div 2;
Angle:=92;
XcentreCompteur:=FCBitMap.Width div 2;
YcentreCompteur:=70;
FCBitMap.Canvas.Pen.color:=Clblue;
FCbitmap.canvas.Brush.Color:=clBlue;
cangle:=0;
while Angle<274 do
begin
if cAngle mod 5 = 0 then
begin
// grands marqueurs
ep:=EpGd;
lg:=LgGd;
end
else
begin
ep:=EpPt;
lg:=LgPt;
end;
sr:=RayonCompteur + OfsX;
sincos((Angle+Ep)*pisur180,cos,sin);
x1:=round(-sr*cos)+XcentreCompteur; y1:=round(sr*sin)+YcentreCompteur;
sincos((Angle-Ep)*pisur180,cos,sin);
x2:=round(-sr*cos)+XcentreCompteur; y2:=round(sr*sin)+YcentreCompteur;
if Angle=0 then //6h
begin
inc(x2);
x3:=x2;y3:=y2-lg;
x4:=x1;y4:=y1-lg;
end
else
if Angle=90 then //3h
begin
inc(y1);
x3:=x2-lg;y3:=y2;
x4:=x1-lg;y4:=y1;
end
else
if Angle=180 then //0h
begin
inc(x1);
x3:=x2;y3:=y2+lg;
x4:=x1;y4:=y1+lg;
end
else
if Angle=270 then //9h
begin
inc(y2);
x3:=x2+lg;y3:=y2;
x4:=x1+lg;y4:=y1;
end
else
begin
sr:=(RayonCompteur-lg) + OfsX;
sincos((Angle-Ep)*pisur180,sin,cos);
x3:=round(-sr*sin)+XcentreCompteur; y3:=round(sr*cos)+YcentreCompteur;
sincos((Angle+Ep)*pisur180,sin,cos);
x4:=round(-sr*sin)+XcentreCompteur; y4:=round(sr*cos)+YcentreCompteur;
end;
FCbitmap.canvas.polygon([point(x1,y1),point(x2,y2),point(x3,y3),point(x4,y4)]);
inc(Angle,6);
inc(cangle,6);
end;
end; // DrawMinSteps
begin
DessineTiretsMn;
with formprinc.ImageC do
begin
left:=350;
Width:=FCbitMap.Width;
Height:=FCbitMap.Height;
Picture.Bitmap.Width:=FCbitMap.Width;
Picture.Bitmap.Height:=FCbitMap.Height;
stretch:=false;
canvas.Draw(0,0,FCBitMap);
//
end;
end; }
procedure TFormPrinc.PopupMenuTrainsPopup(Sender: TObject);
var ob : TPopupMenu;
begin
@@ -28140,7 +28062,8 @@ end;
procedure TFormPrinc.ButtonEssaiClick(Sender: TObject);
var i : integer;
begin
test_canton(0,518,det,1,aig,i);
maj_route(515);
// aiguillage[5].AdrTrain:=3;
end;
procedure TFormPrinc.TrackBarZCChange(Sender: TObject);
+97 -52
View File
@@ -83,11 +83,74 @@ implementation
{$R *.dfm}
// renvoie l'adresse du signal du train sur détecteur
function Adresse_signal_det_train(detect,IndexTrain : integer) : integer;
var voie1,voie2,indexSig1,IndexSig2,AdrSig1,AdrSig2,IndexSig,AdrSig : integer;
s : string;
begin
if detect=0 then
begin
result:=0;
exit;
end;
index_signal_det(detect,voie1,indexSig1,voie2,indexSig2);
AdrSig:=0;AdrSig1:=0;AdrSig2:=0;
if indexSig1<>0 then AdrSig1:=signaux[indexSig1].adresse;
if indexSig2<>0 then AdrSig2:=signaux[indexSig2].adresse;
// si le détecteur sur le train au départ dispose d'un signal
if (AdrSig1<>0) or (AdrSig2<>0) then
begin
indexSig:=0;
if (signaux[indexSig1].Adr_el_suiv1=trains[IndexTrain].ElSuivant) and (signaux[indexSig1].Btype_suiv1=trains[IndexTrain].TElSuivant) then
indexSig:=IndexSig1;
if (signaux[indexSig2].Adr_el_suiv1=trains[IndexTrain].ElSuivant) and (signaux[indexSig2].Btype_suiv1=trains[IndexTrain].TElSuivant) then
indexSig:=IndexSig2;
{
// trouver le premier détecteur de la route et son suivant non traité pour trouver le signal dans le bon sens
n:=trains[indexTrain].route[0].adresse;
i:=1;det1:=0;el2:=0;trouve:=false;
with trains[indexTrain] do
begin
repeat
if route[i].typ=det then
begin
det1:=route[i].adresse;
el2:=route[i+1].adresse;tel2:=route[i+1].typ;
trouve:=true
end;
inc(i);
until trouve or (i>n);
end;
//trouve le signal dans le bon sens
IndexSig:=0;
if AdrSig1<>0 then
begin
if (signaux[indexSig1].Adr_el_suiv1=el2) and (signaux[indexSig1].Btype_suiv1=tel2) then IndexSig:=IndexSig1;
end;
if adrSig2<>0 then
begin
if (signaux[indexSig2].Adr_el_suiv1=el2) and (signaux[indexSig2].Btype_suiv1=tel2) then IndexSig:=IndexSig2;
end;
}
//AdrSig:=signaux[indexSig].adresse;
if IndexSig=0 then begin result:=0;exit;end;
//Affiche('IndexSig='+intToSTR(IndexSig)+' detect='+intToSTR(detect),clred);
result:=signaux[indexSig].adresse;
exit;
end
else result:=0; // pas de signal
end;
// démarre un train si le signal n'est pas au rouge
// appelé par gestion des horaires dans le timer ou bouton rouler 1 train ou rouler tous les trains
function demarre_index_train(indexTrain : integer) : boolean;
var i,n,det1,el2,vitesse,AdrTrain,idcanton,voie1,voie2,indexSig1,indexSig2,AdrSig1,AdrSig2,AdrSig,
detect,indexSig : integer;
detect,indexSig,etsign : integer;
tel2 : tequipement;
trouve : boolean;
Train,s : string;
@@ -124,52 +187,16 @@ begin
Affiche('Le train '+train+' est sur le détecteur '+intToSTR(detect),clWhite);
end;
index_signal_det(detect,voie1,indexSig1,voie2,indexSig2);
AdrSig1:=0;AdrSig2:=0;
if indexSig1<>0 then AdrSig1:=signaux[indexSig1].adresse;
if indexSig2<>0 then AdrSig2:=signaux[indexSig2].adresse;
// si le détecteur sur le train au départ dispose d'un signal
if (AdrSig1<>0) or (AdrSig2<>0) then
etsign:=Adresse_signal_det_train(detect,indexTrain);
if etSign<>0 then
begin
// trouver le premier détecteur de la route et son suivant non traité pour trouver le signal dans le bon sens
n:=trains[indexTrain].route[0].adresse;
i:=1;det1:=0;el2:=0;trouve:=false;
with trains[indexTrain] do
if traceliste then Affiche('Le signal dans le bon sens est '+intToSTR(EtSign)+' '+chaine_signal(EtSign),clOrange);
if signal_rouge(etSign) then
begin
repeat
if route[i].typ=det then
begin
det1:=route[i].adresse;
el2:=route[i+1].adresse;tel2:=route[i+1].typ;
trouve:=true
end;
inc(i);
until trouve or (i>n);
end;
//trouve le signal dans le bon sens
IndexSig:=0;
if AdrSig1<>0 then
begin
if (signaux[indexSig1].Adr_el_suiv1=el2) and (signaux[indexSig1].Btype_suiv1=tel2) then IndexSig:=IndexSig1;
end;
if adrSig2<>0 then
begin
if (signaux[indexSig2].Adr_el_suiv1=el2) and (signaux[indexSig2].Btype_suiv1=tel2) then IndexSig:=IndexSig2;
end;
AdrSig:=signaux[indexSig].adresse;
if adrSig<>0 then
begin
if traceliste then Affiche('Le signal dans le bon sens est '+intToSTR(AdrSig)+' '+chaine_signal(AdrSig),clOrange);
if signal_rouge(AdrSig) then
begin
s:='Le train '+train+' est arreté au signal '+intToSTR(signaux[IndexSig].adresse);
affiche(s,clyellow);
trains[indexTrain].roulage:=1;
exit; // on sort car on ne démarre pas un train arrêté au rouge
end;
s:='Le train '+trains[indexTrain].nom_train+' est arreté au signal '+intToSTR(etSign);
affiche(s,clyellow);
trains[indexTrain].roulage:=1;
exit; // on sort car on ne démarre pas un train arrêté au rouge
end;
end;
@@ -210,8 +237,8 @@ begin
trains[indexTrain].roulage:=2;
if traceListe then AfficheDebug(s,clyellow);
// supprimer les evts du trains
// au lancement du train de la route, initialiser le tableau
// event_det_train à 1
i:=1;
repeat
if event_det_train[i].AdrTrain=AdrTrain then
@@ -223,7 +250,6 @@ begin
inc(i);
until (i>n_trains);
i:=trains[indexTrain].TempsDemarreSig;
if i=0 then i:=1;
trains[indextrain].TempoDemarre:=i; // démarrage à la vitesse nominale
@@ -247,7 +273,6 @@ begin
else result:=false;
end;
// mise à jour des infos de la fenetre : combobox
procedure maj_infos(idtrain : integer);
var i,j,PixelLength : integer;
@@ -399,12 +424,13 @@ end;
function aig_canton(idTrain,detect : integer) : integer;
var AdrSig,n,i,ic,j,ideb,iFin,AdrTrain,etat,pointeur,voie1,voie2,indexSig1,indexSig2,AncPr,
Trainexistant,adr,pos,index,Ncanton,icanton,NumCanton,det_arret,it,PointRoute,ElPrec,
adr2 : integer;
adr2,etatSig : integer;
typ,tprec: tequipement;
trainTiers,SigBonSens,trouve : boolean;
s : string;
begin
//traceliste:=true;
//if (detect=525) and (idTrain=4) then traceliste:=true else traceliste:=false;
if ProcPrinc then AfficheDebug('Aig_canton '+intToSTR(idTrain)+' '+intToSTR(detect),clWhite);
if debugRoulage then Affiche('Aig_canton '+intToSTR(idTrain)+' '+intToSTR(detect),clWhite);
result:=0;
@@ -427,7 +453,7 @@ begin
if DebugRoulage then
begin
Affiche('AC train @'+intToSTR(AdrTrain)+'Detecteur='+intToSTR(detect)+' Pointeur'+intToSTR(pointeur)+' ->'+intToSTR(trains[idTrain].route[i].adresse),clOrange);
Affiche('AC train @'+intToSTR(AdrTrain)+'Detecteur='+intToSTR(detect)+' Pointeur='+intToSTR(pointeur)+' prec='+intToSTR(trains[idTrain].route[i].adresse),clOrange);
if i>=n then
begin
affiche('La route a été complètement traitée (réservation)',clOrange);
@@ -497,6 +523,7 @@ begin
ncanton:=0;
TrainExistant:=0;
ideb:=trains[idTrain].PointRout;
ideb:=Pointeur;
AdrSig:=0;
SigBonSens:=false;
//TraceListe:=true;
@@ -579,6 +606,8 @@ begin
// phases 2 et 3
trains[idtrain].roulage:=2; // roulage effectif
result:=AdrTrain;
// affectation ifin
if not(traintiers) then iFin:=i-1 else iFin:=icanton;
AdrTrain:=trains[idTrain].adresse;
@@ -623,6 +652,21 @@ begin
end;
end;
maj_signaux(false);
// redémarre le train si arrêté au rouge et qu'il redémarre
detect:=trains[idTrain].detecteurA;
if detect<>0 then
begin
//Affiche('test Redémarre train '+intToSTR(idTrain)+' detecteur '+intToSTR(detect),clyellow);
etatSig:=Adresse_signal_det_train(detect,idtrain);
if (etatSig<>0) and (trains[idTrain].vitesseCons=0) then
begin
if not(Signal_Rouge(EtatSig)) then
begin
pilote_train(trains[idTrain].detecteurPrec,detect,trains[idTrain].adresse,1);
end;
end;
end;
//TraceListe:=false;
end;
@@ -661,7 +705,8 @@ begin
for idtrain:=1 to ntrains do
begin
//si le train est doté d'une route
if trains[idTrain].route[0].adresse>0 then
if trains[idTrain].route[0].adresse>0 then
begin
if debugRoulage then Affiche_routes_brut;
aig_canton(idTrain,trains[idTrain].route[1].adresse);
+2 -2
View File
@@ -24,8 +24,8 @@ object FormTCO: TFormTCO
OnKeyPress = FormKeyPress
OnMouseWheel = FormMouseWheel
DesignSize = (
1005
556)
997
548)
PixelsPerInch = 96
TextHeight = 13
object LabelZoom: TLabel
+29 -20
View File
@@ -513,7 +513,7 @@ type
Xundo,Yundo : integer; // coordonnées x,y de la cellule pour le undo
FeuOriente : integer; // orientation du signal : 1 vertical en bas / 2 horizontal gauche / 3 horizontal droit / OU si action : numéro du TCO etc / OU Nbre éléments du canton
liaisons : integer; // quadrants des liaisons
epaisseurs : integer; // épaisseur des liaisons : si le bit n est à 1 : liaison fine
epaisseurs : integer; // épaisseur des liaisons : si le bit n est à 1 : liaison fine bit0=NO bit1=N bit2=NE bit3=E bit4=SE bit5=S bit6=SE bit 7=O
SensCirc : integer; // sens de la circulation des trains dans canton à la lecture du tco, copié dans canton au renseignement du canton tous sens=0 SensGauche=1 SensDroit=2 SensHaut=3 SensBas=4
pont : integer; // définition du pont : si le bit n est à 1 : pont (bits symétriques) OU si canton: alignement train (0=centré 1=Gauche/haut 2=droite/bas)
buttoir : integer; // définition des buttoirs : si le bit n°n est à 1 : buttoir ; ou encadre cellule
@@ -3720,8 +3720,10 @@ begin
begin
pen.color:=fond;
Brush.Color:=fond;
pen.width:=epaisseur div 2;
moveTo(x0,yc);LineTo(xc,yc);LineTo(xf,yf);
if testbit(ep,0) then pen.Width:=epaisseur div 4 else pen.width:=epaisseur div 2;
moveTo(x0,yc);LineTo(xc,yc);
if testbit(ep,4) then pen.Width:=epaisseur div 4 else pen.width:=epaisseur div 2;
LineTo(xf,yf);
end;
end;
@@ -3743,7 +3745,7 @@ begin
begin
pen.color:=fond;
Brush.Color:=fond;
pen.width:=epaisseur div 2;
if testbit(ep,7) or testbit(ep,3) then pen.Width:=epaisseur div 4 else pen.width:=epaisseur div 2;
moveTo(x0,yc);LineTo(xf,yc);
end;
end;
@@ -3865,8 +3867,7 @@ begin
begin
pen.color:=fond;
Brush.Color:=fond;
pen.width:=epaisseur div 2;
//moveTo(x0,yc);LineTo(xc-round(4*frxGlob[indexTCO]),yc);LineTo(xf,yf);
if testbit(ep,0) or testbit(ep,3) then pen.Width:=epaisseur div 4 else pen.width:=epaisseur div 2;
Arc(x1,y1,x2,y2,x3,y3,x4,y4);
end;
end;
@@ -3889,7 +3890,7 @@ begin
begin
pen.color:=fond;
Brush.Color:=fond;
pen.width:=epaisseur div 2;
if testbit(ep,7) or testbit(ep,3) then pen.Width:=epaisseur div 4 else pen.width:=epaisseur div 2;
moveTo(x0,yc);LineTo(xf,yc);
end;
end;
@@ -3902,6 +3903,7 @@ begin
if graphisme=2 then dessin_4C(indexTCO,Canvas,x,y,Mode);
end;
// mode=mode pour la couleur
procedure dessin_5L(indexTCO : integer;Canvas : Tcanvas;x,y : integer;Mode : integer);
var x0,y0,xc,yc,xf,yf,x1,x2,y1,y2,x3,y3,x4,y4,position,ep : integer;
r : Trect;
@@ -3970,11 +3972,12 @@ begin
Pen.Width:=epaisseur;
Brush.Color:=clVoies[indexTCO];
Pen.Color:=clVoies[indexTCO];
//Pen.Color:=clVoies[indexTCO];
Pen.Mode:=pmCopy;
if mode>0 then
begin
// dessiner l'aiguillage dans son trajet
if (position=const_devie) or (position=const_inconnu) then
begin
trajet_droit;
@@ -3986,13 +3989,14 @@ begin
trajet_droit;
end;
end
else
begin
// ne dessiner que l'aiguillage sans trajet
trajet_devie;
trajet_droit;
end;
// Effacement pour le trajet
if (position=const_Devie) then
begin
if not(AffPosFil) then
@@ -4004,15 +4008,17 @@ begin
x3:=x2-epaisseur;y3:=y2-epaisseur-1;
x4:=x3+epaisseur;y4:=y3;
pen.color:=fond;
Brush.Color:=fond;
//Brush.Color:=fond;
Polygon([point(x1,y1),Point(x2,y2),Point(x3,y3),Point(x4,y4)]);
end
else
begin
pen.color:=fond;
Brush.Color:=fond;
pen.width:=epaisseur div 2;
moveTo(xf,yc);LineTo(xc,yc);LineTo(x0,y0);
if testbit(ep,3) then pen.Width:=epaisseur div 4 else pen.width:=epaisseur div 2;
moveTo(xf,yc);LineTo(xc,yc);
if testbit(ep,0) then pen.Width:=epaisseur div 4 else pen.width:=epaisseur div 2;
LineTo(x0,y0);
end;
end;
@@ -4033,8 +4039,10 @@ begin
begin
pen.color:=fond;
Brush.Color:=fond;
pen.width:=epaisseur div 2;
moveTo(xf,yc);LineTo(x0,yc);
if testbit(ep,3) then pen.Width:=epaisseur div 4 else pen.width:=epaisseur div 2;
moveTo(xf,yc);LineTo(xc,yc);
if testbit(ep,7) then pen.Width:=epaisseur div 4 else pen.width:=epaisseur div 2;
LineTo(x0,yc);
end;
end;
end;
@@ -4153,8 +4161,8 @@ begin
begin
pen.color:=fond;
Brush.Color:=fond;
pen.width:=epaisseur div 2;
//moveTo(xf,yc);LineTo(xc+round(5*frxGlob[indexTCO]),yc);LineTo(x0,y0);
if testbit(ep,3) or testBit(ep,0) then pen.Width:=epaisseur div 4 else pen.width:=epaisseur div 2;
Arc(x1,y1,x2,y2,x3,y3,x4,y4);
end;
end;
@@ -4177,7 +4185,7 @@ begin
begin
pen.color:=fond;
Brush.Color:=fond;
pen.width:=epaisseur div 2;
if testbit(ep,3) or testbit(ep,7) then pen.Width:=epaisseur div 4 else pen.width:=epaisseur div 2;
moveTo(x0,yc);LineTo(xf,yc);
end;
end;
@@ -16263,7 +16271,7 @@ end;
// sélectionne le canton du tco, qui a été cliqué à la souris
procedure selec_canton(indexTCO : integer);
var i,idTrain,Bimage,xt,yt,xclic,yclic : integer;
var i,idTrain,Bimage,xt,yt,xclic,yclic,x,y : integer;
s,s1,s2 : string;
begin
xclic:=XclicCell[indexTCO];
@@ -16508,6 +16516,7 @@ begin
ImageTCO.Hint:='Canton occupé par train '+canton[IdCantonClic].nomtrain;
exit;
end;
detDepart:=0;
if tel1=det then detatrouve:=el1;
if tel2=det then detatrouve:=el2;
cantonDest:=canton[IdCantonClic].numero;
@@ -16556,7 +16565,7 @@ begin
formRoute.show;
end;
titre_Fenetre(indexTCO);
//detatrouve:=0;
detatrouve:=0;
//detDepart:=0;
exit;
end;
@@ -17314,7 +17323,7 @@ begin
//Affiche('EditAdrElement change',clyellow);
//if clicTCO or not(ConfCellTCO) then exit;
if clicTCO then
if clicTCO or actualize then
begin
HideCaret(EditAdrElement.Handle); // supprime le curseur
exit;
@@ -18869,7 +18878,7 @@ procedure TFormTCO.EditTypeImageChange(Sender: TObject);
var Bimage,erreur,indexTCO : integer;
begin
// plus éditable
if clicTCO or not(ConfCellTCO) then exit;
if clicTCO or not(ConfCellTCO) or actualize then exit;
if affevt then Affiche('TCO evt editTypeImageChange',clorange);
if actualize then exit;
indexTCO:=index_tco(sender);
+20 -20
View File
@@ -41,7 +41,7 @@ HauteurLigneSGT=30;
var
FormSelTrain: TFormSelTrain;
x,y,El,largC,hautC,LargeurSGT,indexTrainClic : Integer;
largC,hautC,LargeurSGT,indexTrainClic : Integer;
routeSav : TuneRoute;
procedure actualise_seltrains;
@@ -317,8 +317,8 @@ begin
//affiche('Det du canton '+intToSTR(canton[Idcanton].numero)+' det1='+intToSTR(canton[Idcanton].det1)+' det2='+intToSTR(canton[Idcanton].det2),clyellow);
end;
// renvoie x,y El et indexCanton de IdCantonSelect en variable globale
procedure quel_canton;
// renvoie x,y El et indexCanton de IdCantonSelect
procedure quel_canton(var x,y,el : integer);
begin
if IdCantonSelect=0 then exit;
x:=canton[IdCantonSelect].x;
@@ -354,7 +354,7 @@ begin
end;
procedure maj_stringGrig;
var i,ic,t,NumCanton : integer;
var i,ic,t,NumCanton,Adr : integer;
s : string;
begin
// maj de la stringGrig
@@ -383,13 +383,18 @@ begin
SensDroit : s:=s+' droit ';
end;
s:=s+' loco vers ';
i:=canton[IdCantonSelect].SensLoco;
case i of
SensHaut : s:=s+' haut ';
SensBas : s:=s+' bas ';
SensGauche : s:=s+' gauche ';
SensDroit : s:=s+' droit ';
adr:=canton[idCantonSelect].adresseTrain;
if adr<>0 then
begin
adr:=index_train_adresse(adr);
s:=s+' train '+trains[adr].nom_train+' vers ';
i:=canton[IdCantonSelect].SensLoco;
case i of
SensHaut : s:=s+' haut ';
SensBas : s:=s+' bas ';
SensGauche : s:=s+' gauche ';
SensDroit : s:=s+' droit ';
end;
end;
formSelTrain.LabelCanton.caption:=s;
end;
@@ -576,7 +581,7 @@ end;
// cliqué ou roulé la molette souris sur cellule pour changer la sélection du train ou voir la route ou la flèche
procedure TFormSelTrain.StringGridTrainsSelectCell(Sender: TObject; ACol,
ARow: Integer; var CanSelect: Boolean);
var f,AutreTrain,AutreCanton,idAutrecanton,i,ancienSens,AdrTrain,IdTrain,sensloco : integer;
var f,AutreTrain,AutreCanton,idAutrecanton,i,ancienSens,AdrTrain,IdTrain,sensloco,x,y,el : integer;
faire : boolean;
s : string;
begin
@@ -591,7 +596,7 @@ begin
indexTrainClic:=Arow;
// Affiche('ligne='+intToSTR(Arow)+' col='+intToSTR(Acol),clyellow);
quel_canton; // x,y El et indexCanton du canton activé
quel_canton(x,y,el); // x,y El et indexCanton du canton activé
faire:=true;
LabelInfo.caption:='';
@@ -724,7 +729,7 @@ end;
// actualise la fenetre
procedure actualise_seltrains;
var s : string;
i : integer;
i,x,y,el : integer;
begin
with formSelTrain.StringGridTrains do
begin
@@ -735,7 +740,7 @@ begin
end;
end;
Quel_canton;
Quel_canton(x,y,el);
FormSelTrain.caption:=s; // s est indéfini !!
with formSelTrain.ComboBoxCanton do
@@ -798,15 +803,10 @@ begin
Affiche_TCO(indexTCOCourant);
end;
procedure TFormSelTrain.ButtonSauveClick(Sender: TObject);
begin
Sauve_config;
end;
end.
+1 -1
View File
@@ -26,7 +26,7 @@ var
f : textFile;
Const
VersionSC = '10.5'; // sert à la comparaison de la version publiée
VersionSC = '10.53'; // 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;
+7
View File
@@ -329,6 +329,12 @@ version 10.5 : Correction affichage r
Correction suppression lignes/colonnes dans le TCO pour les cantons.
Création mode "déplacer" et "sélectionner" dans le TCO et le réseau CDM.
Affichage des courbes de vitesses des trains étalonnés.
version 10.51 : Correction placement des trains dans le TCO.
version 10.52 : Sélection routes pour plusieurs trains dans le TCO.
version 10.53 : Vérification du répertoire d'installation de CDM Rail.
Correction d'un bug sur la suppression/création train.
@@ -338,3 +344,4 @@ version 10.5 : Correction affichage r
-