V8.8
This commit is contained in:
f1iwq2
2024-05-03 20:01:01 +02:00
parent b10f983b0b
commit f2cbfc2936
28 changed files with 6672 additions and 2268 deletions

View File

@@ -228,10 +228,8 @@ type
EditVitRalenti: TEdit;
Label57: TLabel;
EditVitNom: TEdit;
LabelInfVitesse: TLabel;
CheckRoulage: TCheckBox;
CheckBoxVerifXpressNet: TCheckBox;
ImageTrain: TImage;
PopupMenuRichedit: TPopupMenu;
Copier1: TMenuItem;
Coller1: TMenuItem;
@@ -316,7 +314,6 @@ type
ButtonPropage: TButton;
ButtonPFCDM: TButton;
TabAvance: TTabSheet;
Label31: TLabel;
Label39: TLabel;
CheckBoxMsgAigInc: TCheckBox;
TabSheet1: TTabSheet;
@@ -332,6 +329,12 @@ type
ButtonTestAction: TButton;
PopupMenuActions: TPopupMenu;
ModifAction: TMenuItem;
Label16: TLabel;
ImageTrain: TImage;
EditIcone: TEdit;
SpeedButtonOuvre: TSpeedButton;
LabeledEditTempoD: TLabeledEdit;
CheckBoxSens: TCheckBox;
procedure ButtonAppliquerEtFermerClick(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure ListBoxAigMouseDown(Sender: TObject; Button: TMouseButton;
@@ -500,6 +503,10 @@ type
procedure EditP1Exit(Sender: TObject);
procedure EditP2Exit(Sender: TObject);
procedure EditDevieS2Change(Sender: TObject);
procedure ButtonCouleurClick(Sender: TObject);
procedure ColorDialogFondShow(Sender: TObject);
@@ -526,6 +533,7 @@ couleur_fond_ch='coul_fond';
procedure ModifActionClick(Sender: TObject);
procedure ListBoxActionsKeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
procedure ListBoxOperationsDblClick(Sender: TObject);
@@ -614,6 +622,8 @@ section_DecPers_ch='[section_decodeurs]';
Style_ch='Style';
Nba_ch='NombreAdresses';
nation_ch='Nation';
Periph_ch='Periph';
comm_ch='Commande';
nom_dec_pers_ch='Nom_dec_pers';
Nom_fich_TCO_ch='Nom_fichier_TCO';
LargeurF_ch='LargeurF'; // largeur de la fenêtre principale
@@ -624,7 +634,8 @@ var
HauteurFC_ch='HauteurFC';
OffsetXFC_ch='OffsetXC'; // .Left de la fenêtre clock
OffsetYFC_ch='OffsetYC';
horlogeInterne_ch='HorlogeInterne';
PosSplitter_ch='Splitter';
horlogeInterne_ch='HorlogeInterne';
LanceHorl_ch='LanceHorl';
AffHorl_ch='AffHorl';
@@ -647,7 +658,7 @@ var
section_trains_ch='[section_trains]';
section_placement_ch='[section_placement]';
section_DecPers_ch='[section_decodeurs]';
section_horloge_ch='[section horloge]';
section_accCOM_ch='[section_accCOMUSB]';
section_horloge_ch='[section horloge]';
rep_icones='icones';
@@ -655,7 +666,7 @@ var
var
FormConfig: TFormConfig;
AdresseIPCDM,AdresseIP,PortCom,recuCDM,residuCDM,RepConfig : string; //,trainsauve : string;
ligneclicAig,AncLigneClicAig,ligneClicSig,AncligneClicSig,EnvAigDccpp,AdrBaseDetDccpp,
portCDM,TempoOctet,TimoutMaxInterface,Valeur_entete,PortInterface,prot_serie,NumPort,debug,
LigneCliqueePN,AncLigneCliqueePN,clicMemo,Nb_cantons_Sig,protocole,Port,PortServeur,
ligneclicAig,AncLigneClicAig,ligneClicSig,AncligneClicSig,EnvAigDccpp,AdrBaseDetDccpp,
@@ -689,6 +700,7 @@ function encode_actions(i : integer) : string;
EditMaxSignalSens,EditnCantonsRes,EditAntiTO,EditRep,EditTempoTC : Tedit;
EditT : Array[1..10] of Tedit;
TextBoxCde : array[1..19] of Tedit;
LabelPortCde,LbPnVoie1,LbAPnVoie1,LbAPnVoie2,LbAPnVoie3,LbAPnVoie4,LbAPnVoie5,LbATitre,
LbZTitre,LbZPnVoie1,LbZPnVoie2,LbZPnVoie3,LbZPnVoie4,LbZPnVoie5,LabelMP,LabelNumeroP,
@@ -1611,6 +1623,25 @@ begin
Signaux[i].SR[l].sortie1:=j;
end;
j:=pos('NA',s);
if j<>1 then affiche('Manque paramètre NA dans ligne '+chaine_signal,clred)
else
begin
delete(s,1,2);
val(s,j,erreur);
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;
end;
end;
// transforme l'action en chaine
function encode_actions(i : integer) : string;
var s : string;
decl,action,Nb,j: integer;
begin
@@ -1749,10 +1780,13 @@ end;
begin
s:=s+'('+intToSTR(tablo_PN[i].Voie[voie].ActFerme)+','+intToSTR(tablo_PN[i].Voie[voie].ActOuvre)+')';
if voie<NbVoies then s:=s+',';
end;
end
begin
else
for voie:=1 to NbVoies do
// par zones de détecteur
begin
s:='';
for voie:=1 to NbVoies do
begin
s:=s+'('+intToSTR(tablo_PN[i].Voie[voie].detZ1F)+'-'+intToSTR(tablo_PN[i].Voie[voie].detZ2F)+','+intToSTR(tablo_PN[i].Voie[voie].detZ1O)+
@@ -1797,6 +1831,7 @@ begin
// modifie le fichier de config en fonction du paramétrage
procedure genere_config;
var s: string;
fichierN : text;
i,j,n,k : integer;
begin
assignFile(fichierN,NomConfig);
@@ -2075,11 +2110,14 @@ begin
s:=encode_act_pn(i);
if s<>'' then if s<>'' then writeln(fichierN,s);
end;
writeln(fichierN,section_actV2_ch);
writeln(fichierN,'0');
begin
s:=encode_actions(i);
if s<>'' then writeln(fichierN,s);
writeln(fichierN,'/------------');
// actionnneurs V2
writeln(fichierN,section_actV2_ch);
for i:=1 to maxTablo_act do
begin
s:=encode_actions(i);
if s<>'' then writeln(fichierN,s);
end;
writeln(fichierN,'0');
@@ -2234,9 +2272,18 @@ begin
begin
temp:=Signaux[i];
Signaux[i]:=Signaux[j];
Signaux[j]:=temp;
end;
end;
end;
// calcule les index
for i:=1 to NbreSignaux do
begin
tablo_index_signal[Signaux[i].adresse]:=i;
end;
for i:=1 to NbreSignaux do
if formconfig<>nil then
begin
formconfig.ListBoxSig.Clear;
longestLength:=0;
@@ -2244,11 +2291,14 @@ var s,sa,SOrigine: string;
begin
s:=encode_signal(i); // encode la ligne depuis le tableau feux
//Affiche(s,clwhite);
if s<>'' then
begin
for i:=1 to NbreSignaux do
begin
formconfig.ListBoxSig.Items.Add(s);
// trouver la chaine la plus longue pour la future scrollbar
l:=Length(s);
if l>LongestLength then
begin
LongestString:=s;
LongestLength:=l;
end;
Signaux[i].modifie:=false;
@@ -2302,6 +2352,7 @@ var s,sa,SOrigine: string;
repeat
l1:=pos('"',s);l2:=posEx('"',s,l1+1);
esp:=posEx(' ',s,Esp+1);
if (esp<>0) and (esp<l1) and (esp>l2) then delete(s,esp,1);
until esp=0;
lit_ligne:=s;
if debug=1 then affiche(s,clLime);
@@ -2466,6 +2517,11 @@ var s,sa,SOrigine: string;
s:='';
end;
end;
end;
until s='0';
end;
// anciens
procedure compile_actionneurs;
var i : integer;
begin
@@ -2753,7 +2809,7 @@ var s,sa,SOrigine: string;
Tablo_PN[NbrePN].AdresseOuvre:=j;
Delete(s,1,erreur);
val(s,j,erreur);
// commande usb
Tablo_PN[NbrePN].CommandeOuvre:=j;
end
else
begin
@@ -2767,7 +2823,13 @@ var s,sa,SOrigine: string;
end;
j:=pos(')',s);
Delete(s,1,j); // supprime séparateurs
if length(s)>0 then
begin
// champ impulsion nouvelle syntaxe
if s[1]=',' then delete(s,1,1);
val(s,i,erreur);
Tablo_PN[NbrePN].Pulse:=i;
if erreur<>0 then
begin
delete(s,1,erreur);
@@ -2786,7 +2848,7 @@ var s,sa,SOrigine: string;
// nouveaux
procedure compile_actions;
// nouveaux
var n,k,l,c : integer;
begin
maxTablo_act:=1;
Nligne:=1;
@@ -2803,7 +2865,7 @@ var s,sa,SOrigine: string;
Tablo_actionneur[maxtablo_act].traite:=false;
Tablo_actionneur[maxtablo_act].NomAction:=sa;
// initialiser la condition toujours vrai par défaut
Delete(s,1,i);
Tablo_Actionneur[maxtablo_act].NbCond:=1;
Setlength(Tablo_actionneur[maxtablo_act].TabloCond,2);
Tablo_actionneur[maxtablo_act].TabloCond[1].numcondition:=CondVrai;
@@ -2819,6 +2881,100 @@ var s,sa,SOrigine: string;
Val(s,i,erreur);Delete(s,1,erreur);
Tablo_actionneur[maxtablo_act].heure:=i;
Val(s,i,erreur);Delete(s,1,erreur);
Tablo_actionneur[maxtablo_act].minute:=i;
end;
DeclPeriph :
begin
Val(s,i,erreur);Delete(s,1,erreur);
Tablo_actionneur[maxtablo_act].NumPeriph:=i;
i:=pos(',',s); if i=0 then i:=length(s)+1;
sa:=copy(s,1,i-1);delete(s,1,i);
Tablo_actionneur[maxtablo_act].ordrePeriph:=sa;
end;
DeclAccessoire :
begin
Val(s,i,erreur);Delete(s,1,erreur);
Tablo_actionneur[maxtablo_act].adresse:=i;
Val(s,i,erreur);Delete(s,1,erreur);
Tablo_actionneur[maxtablo_act].etat:=i;
end;
DeclDetAct :
begin
Val(s,i,erreur);Delete(s,1,erreur);
Tablo_actionneur[maxtablo_act].adresse:=i;
Val(s,i,erreur);Delete(s,1,erreur);
Tablo_actionneur[maxtablo_act].etat:=i;
i:=pos(',',s);if i=0 then i:=length(s)+1;
sa:=copy(s,1,i-1);delete(s,1,i);
Tablo_actionneur[maxtablo_act].trainDecl:=sa;
end;
DeclZoneDet :
begin
Val(s,i,erreur);Delete(s,1,erreur);
Tablo_actionneur[maxtablo_act].adresse:=i;
Val(s,i,erreur);Delete(s,1,erreur);
Tablo_actionneur[maxtablo_act].adresse2:=i;
Val(s,i,erreur);Delete(s,1,erreur);
Tablo_actionneur[maxtablo_act].etat:=i;
i:=pos(',',s);
sa:=copy(s,1,i-1);delete(s,1,i);
Tablo_actionneur[maxtablo_act].trainDecl:=sa;
end;
DeclDemarTrain :
begin
Val(s,i,erreur);Delete(s,1,erreur); // seuil de vitesse
Tablo_actionneur[maxtablo_act].adresse:=i;
i:=pos(',',s);if i=0 then i:=length(s)+1;
sa:=copy(s,1,i-1);delete(s,1,i);
Tablo_actionneur[maxtablo_act].trainDecl:=sa;
end;
DeclArretTrain :
begin
Val(s,i,erreur);Delete(s,1,erreur); // seuil de vitesse
Tablo_actionneur[maxtablo_act].adresse:=i;
i:=pos(',',s);if i=0 then i:=length(s)+1;
sa:=copy(s,1,i-1);delete(s,1,i);
Tablo_actionneur[maxtablo_act].trainDecl:=sa;
end;
DeclSignal :
begin
Val(s,i,erreur);Delete(s,1,erreur); // adresse
Tablo_actionneur[maxtablo_act].adresse:=i;
i:=pos(',',s);
Val(s,i,erreur);Delete(s,1,erreur); // seuil de vitesse
if (i<0) or (i>1) then i:=0;
Tablo_actionneur[maxtablo_act].Etat:=i;
end;
end;
// conditions
if s[1]='B' then
begin
delete(s,1,1);
// nombre de conditions
Val(s,n,erreur);
Tablo_actionneur[maxtablo_act].NbCond:=n;
Delete(s,1,erreur);
setlength(Tablo_actionneur[maxtablo_act].TabloCond,n+1);
for k:=1 to n do
begin
delete(s,1,1);
val(s,j,erreur); delete(s,1,erreur);
// numéro de l'opération
if (j<0) or (j>NbreConditions) then
begin
Affiche('Condition '+intToSTR(maxtablo_act)+' dans opération n°'+intToSTR(k)+' : cond inconnue :'+intToSTR(j),clred);
end;
Tablo_actionneur[maxtablo_act].tabloCond[k].numCondition:=j;
case j of
condVitTrain:
begin
val(s,j,erreur); delete(s,1,erreur);
Tablo_actionneur[maxtablo_act].tabloCond[k].vitmini:=j;
val(s,j,erreur); delete(s,1,erreur);
Tablo_actionneur[maxtablo_act].tabloCond[k].vitmaxi:=j;
i:=pos(',',s);
if i<>0 then
begin
sa:=copy(s,1,i-1);delete(s,1,i);
@@ -2838,9 +2994,14 @@ var s,sa,SOrigine: string;
val(s,j,erreur); delete(s,1,erreur);
Tablo_actionneur[maxtablo_act].tabloCond[k].HeureMin:=j;
val(s,j,erreur); delete(s,1,erreur);
i:=pos(',',s);
sa:=copy(s,1,i-1);delete(s,1,i);
Tablo_actionneur[maxtablo_act].trainDecl:=sa;
Tablo_actionneur[maxtablo_act].tabloCond[k].MinuteMin:=j;
val(s,j,erreur); delete(s,1,erreur);
Tablo_actionneur[maxtablo_act].tabloCond[k].HeureMax:=j;
val(s,j,erreur); delete(s,1,erreur);
Tablo_actionneur[maxtablo_act].tabloCond[k].MinuteMax:=j;
end;
condTrainSig :
begin
val(s,j,erreur); delete(s,1,erreur);
Tablo_actionneur[maxtablo_act].tabloCond[k].adresse:=j;
i:=pos(',',s);
@@ -3414,20 +3575,52 @@ var s,sa,SOrigine: string;
begin
inc(ntrains);
sa:=sOrigine;
delete(s,1,i-1);
i:=pos(',',s);
if i<>0 then
begin
trains[ntrains].nom_train:=copy(sa,1,i-1);
delete(s,1,i-1);
end;
i:=pos(',',s);
if i<>0 then
begin
delete(s,i,1);
val(s,trains[ntrains].adresse,erreur);
delete(s,1,erreur-1);
end;
i:=pos(',',s);
if i<>0 then
begin
delete(s,i,1);
val(s,trains[ntrains].vitMax,erreur);
delete(s,1,erreur-1);
end;
i:=pos(',',s);
if i<>0 then
begin
delete(s,i,1);
val(s,trains[ntrains].vitnominale,erreur);
delete(s,1,erreur-1);
end;
i:=pos(',',s);
if i<>0 then
begin
delete(s,i,1);
val(s,trains[ntrains].vitralenti,erreur);
delete(s,1,erreur-1);
end;
i:=pos(',',s);
if i<>0 then
begin
delete(s,i,1);
i:=pos(',',s);
if i=0 then i:=length(s)+1;
delete(s,1,erreur-1);
end;
i:=pos(',',s);
if i<>0 then
begin
trains[ntrains].NomIcone:=copy(s,1,i-1);
Formprinc.ComboTrains.Items.Add(trains[ntrains].nom_train);
delete(s,1,i-1);
end;
@@ -3606,7 +3799,6 @@ var s,sa,SOrigine: string;
end;
sa:=uppercase(HeureInit_ch);
delete(s,i,length(sa)+1);
i:=pos(sa,s);
if i=1 then
begin
@@ -3630,7 +3822,7 @@ var s,sa,SOrigine: string;
begin
inc(nv);
delete(s,i,length(sa)+1);
end;
val(s,DureeMinute,erreur);
end;
end;
@@ -3774,6 +3966,14 @@ var s,sa,SOrigine: string;
sa:=uppercase(OffsetYFC_ch)+'=';
i:=pos(sa,s);
if i=1 then
begin
delete(s,i,length(sa));
val(s,OffsetYFC,erreur);
end;
sa:=uppercase(PosSplitter_ch)+'=';
i:=pos(sa,s);
if i=1 then
begin
delete(s,i,length(sa));
@@ -4337,7 +4537,7 @@ var s,sa,SOrigine: string;
end;
// section PN
end;
sa:=uppercase(section_PN_ch);
if pos(sa,s)<>0 then
begin
compile_PN;
@@ -4349,22 +4549,26 @@ var s,sa,SOrigine: string;
if pos(sa,s)<>0 then
begin
compile_actions;
sa:=uppercase(section_dccpp_ch);
end;
// section dcc++
sa:=uppercase(section_dccpp_ch);
if pos(sa,s)<>0 then
trouve_section_dccpp:=true;
begin
trouve_section_dccpp:=true;
compile_dccpp;
end;
// section trains
sa:=uppercase(section_trains_ch);
if pos(sa,s)<>0 then
if pos(sa,s)<>0 then
begin
trouve_section_trains:=true;
compile_trains;
end;
// section dédodeurs
// section dédodeurs
sa:=uppercase(section_DecPers_ch);
if pos(sa,s)<>0 then
begin
@@ -4510,6 +4714,22 @@ begin
end;
GetDir(0,s);
Affiche('Lecture du fichier de configuration du répertoire',clYellow);
Affiche(s,clyellow);
try
assignFile(fichier,NomConfig);
reset(fichier);
except
Affiche('Fichier '+NomConfig+' non trouvé : création d''un fichier vide par défaut',clred);
portcom:='COM3:57600,N,8,1,2';
adresseIPCDM:='127.0.0.1';portCDM:=9999;
adresseIP:='192.168.1.23';portInterface:=5550;
verifVersion:=true;
Valeur_entete:=1;
TempoOctet:=50;
Ecran_sc:=1;
Srvc_Aig:=true;
Srvc_Act:=true;
Srvc_Det:=true;
Srvc_Pos:=false;
@@ -4659,6 +4879,10 @@ begin
Val(EditPortServeur.Text,i,erreur);
if (i<1) or (i>65535) then i:=4500;
portServeur:=i;
if checkRoulage.Checked then
begin
AvecRoulage:=1;
Formprinc.roulage1.visible:=true;
end
@@ -5340,6 +5564,10 @@ var i,j,x,y,l,LongestLength,PixelLength : integer;
c:=GroupBoxPNA.Components[i];
composant(c,couleurfond,couleurTexte);
end;
// périphériques
for i:=0 to TabSheetPeriph.ComponentCount-1 do
begin
c:=TabSheetPeriph.Components[i];
composant(c,couleurfond,couleurTexte);
end;
@@ -5370,6 +5598,25 @@ begin
end;
procedure TFormConfig.FormCreate(Sender: TObject);
var i,j,x,y,l,LongestLength,PixelLength : integer;
cs,s,LongestString : string;
begin
if AffEvt or (debug=1) then Affiche('Création fenêtre config',clLime);
s:=GetCurrentDir;
if not(directoryExists(rep_icones)) then CreateDir(rep_icones);
ChDir(s); // revient au rep initial
visible:=false;
clicListe:=true;
position:=poMainFormCenter;
cs:='ColorA='+IntToHex(couleurFond,6); // pour rajouter aux couleurs personnalisées de la fenetre couleur
colorDialogFond.CustomColors.Add(cs);
ButtonCouleur.Hint:='Change la couleur de fond de toutes les fenêtres de Signaux_Complexes.'+#13+
'Utilisez la couleur personnalisée n°1 et après modification,'+#13+
'cliquer sur "ajouter aux couleurs personnalisées" qui seule sera sauvegardée';
Affiche_avert:=false;
if affevt then affiche('FormConfig create',clLime);
PageControl.ActivePage:=Formconfig.TabSheetCDM; // force le premier onglet sur la page
Aig_supprime.Adresse:=0;
@@ -6164,8 +6411,6 @@ begin
begin
s:=encode_act_pn(i);
if s<>'' then
if l>LongestLength then
begin
begin
ListBoxPN.items.Add(s);
// trouver la chaine la plus longue pour la future scrollbar
@@ -6396,7 +6641,7 @@ begin
end;
ComboStyle:=TComboBox.create(FormConfig.TabSheetDecodeurs);
with ComboStyle do
parent:=GroupBoxDivers;
begin
Name:='ComboStyle'+intToSTR(i);
left:=130;Top:=LabelStyle.top-2;Width:=150;Height:=13;
text:='';
@@ -6504,6 +6749,27 @@ begin
LabelnCantonsRes:=TLabel.Create(FormConfig.TabAvance);
with LabelnCantonsRes do
begin
Left:=10;Top:=90;Width:=170;Height:=12;
caption:='Nombre de cantons à réserver en avant du train';
name:='LabelnCantonsRes';
parent:=GroupBoxAvance;
end;
EditnCantonsRes:=TEdit.Create(TabAvance);
with EditnCantonsRes do
begin
Left:=x;Top:=88;Width:=30;Height:=15;
name:='EditnCantonsRes';
text:='';
parent:=GroupBoxAvance;
hint:='Nombre de cantons à réserver (1 à 5) en avant du train.'+#13+
'Utilisé en mode roulage ou réservation [sous mode réservation par canton (ci-dessous)].'+#13+
'Cette valeur dépend de la taille du réseau.';
ShowHint:=true;
end;
LabelAntiTO:=TLabel.Create(FormConfig.TabAvance);
with LabelAntiTO do
begin
Left:=10;Top:=110;Width:=170;Height:=12;
caption:='Utilisation de l''anti timeout Lenz Ethernet';
@@ -8602,7 +8868,13 @@ begin
if tablo_PN[lignecliqueePN+1].TypeCde=1 then
begin
val(s,i,erreur);
tablo_PN[lignecliqueePN+1].CommandeO:=s;
end
else
begin
val(s,i,erreur);
if (i<0) or (i>2) or (erreur<>0) then begin LabelInfo.caption:='Erreur Commande ferme actionneur';exit;end;
LabelInfo.caption:=' ';
tablo_PN[lignecliqueePN+1].CommandeOuvre:=i;
end;
@@ -8935,6 +9207,8 @@ begin
ss,s: string;
begin
ss:='';
n:=0;
for i:=0 to maxTablo_act-1 do
begin
if formconfig.ListBoxActions.selected[i] then
begin
@@ -9342,6 +9616,27 @@ begin
// nc=nombre d'adresses du signal
if dec=0 then nc:=0; // rien
if dec=1 then nc:=14; // digitalbahn
if dec=2 then nc:=signaux[i].Na; // cdf
if dec=3 then nc:=8; // ldt LS dec sncf
if dec=4 then nc:=5; // leb
if dec=5 then nc:=Signaux[i].Na; // digikeijs
if dec=6 then // paco unisemaf
begin
x:=Signaux[index].Unisemaf; // modèle
case x of
2 : nc:=1;
3,4 : nc:=2;
51,52 : nc:=3;
71 : nc:=2;
72,73 : nc:=3;
91,92 : nc:=3;
93,94,95,96,97,98,99 : nc:=4;
end;
end;
if dec=7 then nc:=Signaux[i].Na; // SR
if dec=8 then // arcomora
begin
case x of
3 : nc:=3;
4,5 : nc:=4;
@@ -9371,7 +9666,7 @@ begin
adr:=trains[i].adresse;
nom:=trains[i].nom_train;
for j:=i+1 to ntrains do
nc:=decodeur_pers[j].NbreAdr;
begin
if trains[j].Adresse=adr then Affiche('Les trains '+intToSTR(i)+' et '+intToSTR(j)+' ont la même adresse : '+intToSTR(adr),clred);
if trains[j].nom_train=nom then Affiche('Les trains '+intToSTR(i)+' et '+intToSTR(j)+' ont le même nom : '+nom,clred);
@@ -10204,6 +10499,9 @@ begin
begin
Affiche('Erreur 48 TCO'+intToSTR(indexTCO)+' ['+intToSTR(x)+','+intToSTR(y)+'] d''adresse '+intToSTR(Adr)+' décrite comme un croisement ou TJD/S car elle présente une adresse',clred);
Affiche('mais la cellule représente un pont',clred);
ok:=false;
end;
end;
if isAigTCO(i) then
begin
@@ -11197,7 +11495,7 @@ begin
Affiche('Erreur ligne '+s,clred);
compile_branche:=false;
exit;
Val(enregistrement,detect,erreur); // détermine si le champ est numérique ou pas (cad si aiguillage)
end;
se:=enregistrement;
// décoder l'enregistrement
// si c'est un détecteur, fini trouvé
@@ -11208,7 +11506,13 @@ begin
c:=enregistrement[1];
delete(enregistrement,1,1);
if c='A' then
Affiche('Erreur 17 champ '+se+' ligne '+s,clred);
begin
Val(enregistrement,adresse,erreur2);
if (adresse=0) or (erreur2<>0) then
begin
Affiche('Erreur 17 champ '+se+' ligne '+s,clred);
code:=false;
end;
if adresse>NbMaxDet then
begin
Affiche('Erreur 18 ligne '+s+' : adresse aiguillage trop grand: '+intToSTR(adresse),clred);
@@ -11903,7 +12207,43 @@ begin
2 : sr:=sr+', en hexa vrai';
3 : sr:=sr+', spécifique';
end;
end;
if copy(s,1,3)='<1>' then sr:='Mise sous tension de la voie';
if copy(s,1,3)='<0>' then sr:='Mise hors tension de la voie';
if copy(s,1,2)='<T' then
begin
delete(s,1,2);
val(s,i,erreur);sr:='Positionne aiguillage '+intToSTR(i);
delete(s,1,erreur);
val(s,i,erreur);
if i=0 then sr:=sr+' droit';
if i=1 then sr:=sr+' dévié';
end;
if copy(s,1,2)='<E' then sr:='Ecrit en eprom';
decodeDCC:=sr;
end;
procedure TFormConfig.RichCdeDccppChange(Sender: TObject);
var i,maxi : integer;
begin
if activ then exit;
maxi:=RichCdeDCCpp.Lines.count;
if maxi>MaxCdeDccpp then maxi:=MaxCdeDccpp;
for i:=1 to maxi do
begin
CdeDccpp[i]:=RichCdeDccpp.Lines[i-1];
end;
LabelInfo.caption:=decodeDCC(richCdeDCCpp.lines[ligneDCC]);
end;
procedure TFormConfig.CheckEnvAigDccppClick(Sender: TObject);
begin
if CheckEnvAigDccpp.checked then EnvAigDccpp:=1 else EnvAigDccpp:=0;
end;
// affiche l'icone du train index dans le canvas
@@ -11912,8 +12252,16 @@ begin
rd : double;
begin
with formConfig do
begin
// source
l:=Trains[index].Icone.width;
h:=Trains[index].Icone.Height;
if h=0 then exit;
rd:=l/h;
//Affiche(FloatToSTR(rd),clred);
// destination : la hauteur est fixée
HautDest:=round(ImageTrain.Height);
LargDest:=round(Hautdest*rd);
// si la largeur > que l'image, on fixe la largeur
@@ -13962,7 +14310,7 @@ begin
EditAdrAig.Color:=clred;
LabelInfo.caption:='Erreur adresse Aiguillage ';exit;
end;
modele:=aiguillage[index].modele;
index:=ligneclicAig+1;
if index=0 then exit;
@@ -13971,7 +14319,7 @@ begin
if (erreur<>0) or (i>MaxAcc) then begin LabelInfo.caption:='Erreur adresse aiguillage ';exit;end;
// vérifier si l'adresse de l'aiguillage existe déja
exit;
if (aiguillage[Index_Aig(i)].modele<>rien) then
begin
EditAdrAig.Color:=clred;
LabelInfo.caption:='aiguillage '+IntToSTR(i)+' existe déjà - ne sera pas écrasé' ;
@@ -13994,6 +14342,7 @@ begin
end;
if (modele=tjd) or (modele=tjs) then
begin
clicListe:=true;
nEtat:=aiguillage[index].EtatTJD;
if nEtat=4 then
@@ -14263,8 +14612,68 @@ procedure TFormConfig.ListBoxOperationsDblClick(Sender: TObject);
if ligneclicAct<0 then
begin
clicliste:=false;
exit;
end;
Affiche_action;
ClicAction:=-1;
clicliste:=false;
end;
procedure TFormConfig.ListBoxOperationsDrawItem(Control: TWinControl;
Index: Integer; Rect: TRect; State: TOwnerDrawState);
var
i,erreur: Integer;
ItemText: string;
begin
with ListBoxOperations do
begin
ItemText:=Items[index];
val(ItemText,i,erreur);
Delete(ItemText,1,erreur-1);
Canvas.Fillrect(Rect);
formConfCellTCO.ImageListIcones.Draw(Canvas, Rect.Left, Rect.Top, i);
Canvas.Textout(Rect.Left + formConfCellTCO.ImageListIcones.Width + 2, Rect.Top, ItemText);
end;
end;
procedure TFormConfig.ListBoxOperationsMouseDown(Sender: TObject;
Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
ClicAction:=ListBoxOperations.ItemIndex;
end;
procedure action_relais(i : integer);
begin
action(i);
end;
procedure TFormConfig.ButtonTestActionClick(Sender: TObject);
begin
if (ligneclicAct<0) then exit;
action_relais(ligneclicact+1); // car action est une fonction d'une form...
end;
procedure TFormConfig.ModifActionClick(Sender: TObject);
begin
DeclencheurAffiche:=0;
OperationAffiche:=clicaction+1;
formModifAction.ShowModal;
end;
procedure TFormConfig.ListBoxActionsKeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
begin
if (maxTablo_act<1) or clicliste then exit;
if key=VK_delete then supprime_action;
if ord(Key)=VK_UP then
begin
clicListe:=true;