diff --git a/Notice d'utilisation des signaux_complexes_GL_V10.82.pdf b/Notice d'utilisation des signaux_complexes_GL_V10.91.pdf similarity index 82% rename from Notice d'utilisation des signaux_complexes_GL_V10.82.pdf rename to Notice d'utilisation des signaux_complexes_GL_V10.91.pdf index acb41e3..5583a88 100644 Binary files a/Notice d'utilisation des signaux_complexes_GL_V10.82.pdf and b/Notice d'utilisation des signaux_complexes_GL_V10.91.pdf differ diff --git a/UnitAnalyseSegCDM.pas b/UnitAnalyseSegCDM.pas index d13bb6c..44aa519 100644 --- a/UnitAnalyseSegCDM.pas +++ b/UnitAnalyseSegCDM.pas @@ -4794,7 +4794,7 @@ var pt : Tpoint; canvasI : Tcanvas; begin clic:=true; - pt:= formAnalyseCDM.ImageCDM.ScreenToClient(Mouse.CursorPos); // coordonnées par rapport à l'image + pt:=formAnalyseCDM.ImageCDM.ScreenToClient(Mouse.CursorPos); // coordonnées par rapport à l'image xSouris:=pt.x; ySouris:=pt.y; diff --git a/UnitCompteur.pas b/UnitCompteur.pas index 3dc5893..ce4788b 100644 --- a/UnitCompteur.pas +++ b/UnitCompteur.pas @@ -163,7 +163,7 @@ begin end; end; -// change l'aiguille du compteur +// change l'aiguille du compteur "c" en fonction de la vitesse du train "idTrain" dans le composant "comp" // c : n° de fenetre du compteur idTrain : index du train comp : composant dans lequel se trouve le compteur (form, groupbox ou image) procedure aiguille_compteur(c,idTrain : integer ; comp : Tcomponent); var ComptLoc,x1,y1,x2,y2,x3,y3,x4,y4,vitesse,vitesseFin,lim,him : integer; @@ -279,6 +279,7 @@ begin end; end; +// dessine le fond du compteur 2 (graduations et chiffres) procedure compteur_2(c : integer;bm : tbitmap;var param : tparamcompt); var n,v,rayon2,rayon3,rayon4,x1,y1,x2,y2,xt,yt,lim,him,rg : integer; angle,incr,r : single; @@ -377,6 +378,7 @@ begin end; end; +// dessine le fond du compteur tachro procedure compteur_tachro(c : integer;bm : tbitmap;var param : tparamcompt); var l,av,n,v,rayon2,rayon3,rayon4,x1,y1,x2,y2,xt,yt,lim,him,rg : integer; angle,incr,r,a,sinA,cosA : single; @@ -489,7 +491,7 @@ begin end; -// dessine dans le FbitMap +// dessine le fond du compteur pour tous les compteurs dans le FbitMap // le var est obligatoire // typecompt : type du compteur 1 2 ou 3 procedure dessin_fond_compteur(var param : TparamCompt;i: integer ; Im : tbitmap;typCompt : integer); @@ -537,8 +539,6 @@ begin TextOut(round(137*redX),round(91*redY),'100'); TextOut(round(124*redX),round(130*redY),'120'); - - rAig:=round(AigCX / 1.5); angleFin:=127; // en fait vitesse maxi compteur end; @@ -1021,7 +1021,6 @@ begin afficherIconeDuTrain1.Checked:=affTrainCompteur; init_compteur(1,formcompteur[1]); affiche_train_compteur(1); - end; procedure TFormCompteur.Vitesseencrans1Click(Sender: TObject); diff --git a/UnitConfig.dfm b/UnitConfig.dfm index e36b720..09b5aa9 100644 --- a/UnitConfig.dfm +++ b/UnitConfig.dfm @@ -1,6 +1,6 @@ object FormConfig: TFormConfig - Left = 404 - Top = 164 + Left = 254 + Top = 172 Hint = 'Modifie la configuration selon les s'#233'lections choisies' BorderStyle = bsDialog Caption = 'Configuration g'#233'n'#233'rale' @@ -1573,7 +1573,7 @@ object FormConfig: TFormConfig Top = 8 Width = 633 Height = 505 - ActivePage = TabSheetSig + ActivePage = TabSheetDet Font.Charset = DEFAULT_CHARSET Font.Color = clBlack Font.Height = -11 @@ -2930,7 +2930,7 @@ object FormConfig: TFormConfig OnClick = RadioButtonTJD4Click end end - object ButtonPropage: TButton + object ButtonPropageAig: TButton Left = 192 Top = 56 Width = 89 @@ -2943,7 +2943,7 @@ object FormConfig: TFormConfig ShowHint = True TabOrder = 9 WordWrap = True - OnClick = ButtonPropageClick + OnClick = ButtonPropageAigClick end end object ButtonNouvAig: TButton @@ -3346,7 +3346,7 @@ object FormConfig: TFormConfig Width = 137 Height = 21 Style = csDropDownList - ItemHeight = 13 + ItemHeight = 0 TabOrder = 1 OnChange = ComboBoxDecChange end @@ -3477,7 +3477,7 @@ object FormConfig: TFormConfig Width = 137 Height = 21 Style = csDropDownList - ItemHeight = 13 + ItemHeight = 0 TabOrder = 2 OnChange = ComboBoxAspChange end @@ -3607,6 +3607,21 @@ object FormConfig: TFormConfig TabOrder = 23 OnChange = EditTempoSigChange end + object ButtonPropageSig: TButton + Left = 224 + Top = 16 + Width = 57 + Height = 17 + Hint = + 'Change les adresses dans les TCOs si on a chang'#233' l'#39'adresse d'#39'un ' + + 'signal' + Caption = 'Propage' + ParentShowHint = False + ShowHint = True + TabOrder = 24 + WordWrap = True + OnClick = ButtonPropageSigClick + end end object ButtonNouvSig: TButton Left = 0 @@ -4568,6 +4583,57 @@ object FormConfig: TFormConfig OnChange = EditDecalChange end end + object GroupBox13: TGroupBox + Left = 336 + Top = 272 + Width = 265 + Height = 137 + Caption = 'Changement de l'#39'adresse d'#39'un d'#233'tecteur' + TabOrder = 5 + object Label85: TLabel + Left = 16 + Top = 24 + Width = 92 + Height = 13 + Caption = 'D'#233'tecteur courant :' + end + object LabelDetCour: TLabel + Left = 208 + Top = 24 + Width = 3 + Height = 13 + Caption = '.' + end + object LabeledNvleAdrDet: TLabeledEdit + Left = 200 + Top = 48 + Width = 40 + Height = 21 + Hint = 'Nouvelle adresse du d'#233'tecteur' + EditLabel.Width = 145 + EditLabel.Height = 13 + EditLabel.Caption = 'Nouvelle adresse du d'#233'tecteur' + EditLabel.Layout = tlBottom + LabelPosition = lpLeft + LabelSpacing = 40 + ParentShowHint = False + ShowHint = True + TabOrder = 0 + end + object ButtonValideDet: TButton + Left = 72 + Top = 88 + Width = 137 + Height = 33 + Hint = + 'Propage l'#39'adresse du d'#233'tecteur dans les branches, les aiguillage' + + 's, les signaux et les TCO' + Caption = 'Valider et propager le d'#233'tecteur' + TabOrder = 1 + WordWrap = True + OnClick = ButtonValideDetClick + end + end end object TabSheetPN: TTabSheet Caption = 'PN' diff --git a/UnitConfig.pas b/UnitConfig.pas index a729414..0d73471 100644 --- a/UnitConfig.pas +++ b/UnitConfig.pas @@ -1,6 +1,6 @@ Unit UnitConfig; -interface +interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, @@ -291,7 +291,7 @@ type ButtonCouleur: TButton; ColorDialogFond: TColorDialog; LabelD13: TLabel; - ButtonPropage: TButton; + ButtonPropageAig: TButton; ButtonPFCDM: TButton; TabAvance: TTabSheet; Label39: TLabel; @@ -516,6 +516,12 @@ type LabeledEditT: TLabeledEdit; SpeedButtonLay: TSpeedButton; MenuListesCopier2: TMenuItem; + ButtonPropageSig: TButton; + GroupBox13: TGroupBox; + LabeledNvleAdrDet: TLabeledEdit; + Label85: TLabel; + LabelDetCour: TLabel; + ButtonValideDet: TButton; procedure ButtonAppliquerEtFermerClick(Sender: TObject); procedure FormCreate(Sender: TObject); procedure ListBoxAigMouseDown(Sender: TObject; Button: TMouseButton; @@ -666,7 +672,7 @@ type procedure EditDevieS2Change(Sender: TObject); procedure ButtonCouleurClick(Sender: TObject); procedure ColorDialogFondShow(Sender: TObject); - procedure ButtonPropageClick(Sender: TObject); + procedure ButtonPropageAigClick(Sender: TObject); procedure EditAdrAigExit(Sender: TObject); procedure EditAdrAigChange(Sender: TObject); procedure FormActivate(Sender: TObject); @@ -820,6 +826,8 @@ type procedure LabeledEditTChange(Sender: TObject); procedure SpeedButtonLayClick(Sender: TObject); procedure MenuListesCopier2Click(Sender: TObject); + procedure ButtonPropageSigClick(Sender: TObject); + procedure ButtonValideDetClick(Sender: TObject); private { Déclarations privées } @@ -1641,6 +1649,7 @@ begin begin inc(NbreSignaux); Signaux[i].adresse:=adresse; + Signaux[i].Ancienadresse:=adresse; Signaux[i].AncienEtat:=$ffff; Signaux[i].AncienAff:=$ffff; Signaux[i].Tempo:=0; @@ -2099,6 +2108,7 @@ begin condBouton : s:=s+intToSTR(Tablo_Action[i].TabloCond[j].adresse)+','; CondMemoireEgal,CondMemoireInf,CondMemoireSup : s:=s+intToSTR(Tablo_Action[i].TabloCond[j].adresse)+','+intToSTR(Tablo_Action[i].TabloCond[j].etat)+','; + CondDetAct : s:=s+intToSTR(Tablo_Action[i].TabloCond[j].adresse)+','+intToSTR(Tablo_Action[i].TabloCond[j].etat)+','+Tablo_Action[i].TabloCond[j].train+','; end; end; @@ -3689,6 +3699,7 @@ const LessThanValue=-1; procedure compile_actions; var n,k,l : integer; + fini : boolean; begin maxTablo_act:=1; Nligne:=1; @@ -3884,6 +3895,16 @@ const LessThanValue=-1; Tablo_Action[maxtablo_act].tabloCond[k].etat:=i; end; end; + condDetAct : + begin + Val(s,i,erreur);Delete(s,1,erreur); + Tablo_Action[maxtablo_act].TabloCond[k].adresse:=i; + Val(s,i,erreur);Delete(s,1,erreur); + Tablo_Action[maxtablo_act].TabloCond[k].etat:=i; + i:=pos(',',s);if i=0 then i:=length(s)+1; + sa:=copy(s,1,i-1);delete(s,1,i); + Tablo_Action[maxtablo_act].TabloCond[k].train:=sa; + end; end; end; end; @@ -4042,8 +4063,9 @@ const LessThanValue=-1; end; end; inc(maxTablo_act); - end; - until (s='0') or eof(fichier) ; + end + else fini:=true; + until eof(fichier) or fini; dec(maxTablo_act); end; @@ -7969,7 +7991,7 @@ begin richBranche.HideSelection:=false; // pour pouvoir copier coller la fenetre //groupBox21.Top:=304; GroupBox21.Left:=8; - ButtonPropage.Hint:='Change les adresses dans les points de connexions'+#13+ + ButtonPropageAig.Hint:='Change les adresses dans les points de connexions'+#13+ 'des aiguillages, des branches et des signaux'+#13+ 'si on a changé l''adresse d''un aiguillage'; if debug=1 then Affiche('Fin création fenêtre config',clLime); @@ -9350,9 +9372,9 @@ begin index:=Index_Aig(Adresse); AncienAdresse:=aiguillage[index].AncienAdresse; if adresse<>AncienAdresse then - FormConfig.ButtonPropage.Hint:='Change les adresses '+intToSTR(AncienAdresse)+' dans les points de connexions'+#13+ + FormConfig.ButtonPropageAig.Hint:='Change les adresses '+intToSTR(AncienAdresse)+' dans les points de connexions'+#13+ 'des aiguillages et des branches par l''adresse '+intToSTR(adresse) - else FormConfig.ButtonPropage.Hint:='Change les adresses dans les points de connexions'+#13+ + else FormConfig.ButtonPropageAig.Hint:='Change les adresses dans les points de connexions'+#13+ 'des aiguillages, des branches et des signaux'+#13+ 'si on a changé l''adresse d''un aiguillage'; clicListe:=false; @@ -9496,6 +9518,8 @@ begin begin checkFVC.Visible:=true; // afficher checkbox feu vert clignotant checkFRC.Visible:=true; // afficher checkbox feu rouge clignotant + checkFVC.Caption:='Feu vert clignotant'; + checkFVC.Hint:='Remplace le feu vert par un feu vert clignotant'; end else begin @@ -9503,6 +9527,14 @@ begin checkFRC.Visible:=false; // na pas afficher checkbox feu rouge clignotant end; + if d=2 then + begin + checkFVC.Visible:=true; // afficher checkbox feu vert clignotant + checkFVC.Caption:='Feux rouge/vert'; + checkFVC.Hint:='coché : signal rouge/vert'+#13+ + 'décoché : signal violet/blanc'; + end; + if ((d>3) and (d<10)) or (d=20) then CheckVerrouCarre.Visible:=true else CheckVerrouCarre.Visible:=false; if d=20 then begin @@ -11696,7 +11728,7 @@ end; function verif_coherence : boolean; var AncAdr,i,j,k,l,Indexaig,adr,adr2,extr,detect,condcarre,nc,index2,SuivAdr,indexTCO,AdrAig, x,y,extr2,adr3,adr4,index3,det1Br,det2Br,det1index,det2index,adresse,Adresse2,dec,nc2,op, - delta,broft,adresse3 : integer; + delta,broft,adresse3,Sk : integer; modAig,AncModel,model,km,SuivModel,model2,t1,t2: TEquipement; c : char; vitesse : longint; @@ -12793,6 +12825,7 @@ begin dec:=Signaux[i].decodeur; AdrOk:=false; ok:=false; + Sk:=k; okSignal:=false; s:=s+intToSTR(adresse_detecteur[k])+' '; end; @@ -12802,6 +12835,7 @@ begin begin Affiche('Erreur 14: le signal '+IntToSTR(adresse)+' '+decodeur[dec]+' occupe '+intToSTR(nc)+' adresses de '+intToSTR(adresse)+ ' à '+intToSTR(adresse+nc-1)+' et chevauche le(s) détecteur(s) suivant(s)',clred); + s:=s+' car ('+intToSTR(adresse_detecteur[Sk])+'-1 / 2) +1 >='+intToSTR(adresse)+' et <='+intToSTR(adresse+nc-1); Affiche(s,clred); end; end; @@ -16373,7 +16407,37 @@ begin SetWindowText(ColorDialogFond.Handle,pchar(scouleur)); end; -procedure TFormConfig.ButtonPropageClick(Sender: TObject); +procedure TFormConfig.ButtonPropageSigClick(Sender: TObject); +var i,x,y,adresse,index,AncienAdresse : integer; + s : string; +begin + adresse:=signaux[ligneclicSig+1].Adresse; + if adresse=0 then exit; + index:=Index_Signal(Adresse); + AncienAdresse:=signaux[index].AncienAdresse; + if Adresse=AncienAdresse then exit; + + // TCOs + for i:=1 to NbreTCO do + begin + for y:=1 to NbreCellY[i] do + for x:=1 to NbreCellX[i] do + begin + if tco[i,x,y].Adresse=AncienAdresse then + begin + tco[i,x,y].Adresse:=Adresse; + s:='TCO '+intToSTR(i)+' cellule '+intToSTR(x)+','+intToSTR(y)+' '; + s:=s+'Changement ancienne adresse de signal '+intToSTR(AncienAdresse)+' par nouvelle adresse '+intToSTR(adresse); + Affiche(s,clyellow); + end; + end; + Affiche_TCO(i); + end; + +end; + + +procedure TFormConfig.ButtonPropageAigClick(Sender: TObject); var x,y,i,adresse,AncienAdresse,AdresseBr,v,erreur : integer; typ : tEquipement; s,Nb : string; @@ -16412,11 +16476,11 @@ begin end; end; if typ=triple then if aiguillage[index].AdrTriple=AncienAdresse then - begin - aiguillage[i].AdrTriple:=adresse; - Affiche('Réaffectation aiguillage '+intToSTR(aiguillage[i].Adresse)+' triple',clyellow); - config_modifie:=true; - end; + begin + aiguillage[i].AdrTriple:=adresse; + Affiche('Réaffectation aiguillage '+intToSTR(aiguillage[i].Adresse)+' triple',clyellow); + config_modifie:=true; + end; if (typ=tjd) or (typ=tjs) or (typ=crois) then begin if aiguillage[i].ADroit=AncienAdresse then @@ -16456,7 +16520,7 @@ begin end; formconfig.ListBoxAig.itemindex:=0; - // branches ---------------------------------- + // changer l'aiguillage dans les branches ---------------------------------- for i:=1 to NbreBranches do begin Nb:='';v:=0; @@ -16520,24 +16584,24 @@ begin Affiche('Changement dans signal '+intToSTR(signaux[i].adresse),clYellow); config_modifie:=true; end; - if (signaux[i].Adr_el_suiv2=AncienAdresse) and (signaux[i].Btype_suiv1=aig) then + if (signaux[i].Adr_el_suiv2=AncienAdresse) and (signaux[i].Btype_suiv1=aig) then begin signaux[i].Adr_el_suiv2:=adresse; Affiche('Changement dans signal '+intToSTR(signaux[i].adresse),clYellow); config_modifie:=true; - end; - if (signaux[i].Adr_el_suiv3=AncienAdresse) and (signaux[i].Btype_suiv1=aig) then + end; + if (signaux[i].Adr_el_suiv3=AncienAdresse) and (signaux[i].Btype_suiv1=aig) then begin signaux[i].Adr_el_suiv3:=adresse; Affiche('Changement dans signal '+intToSTR(signaux[i].adresse),clYellow); config_modifie:=true; - end; + end; if (signaux[i].Adr_el_suiv4=AncienAdresse) and (signaux[i].Btype_suiv1=aig) then begin signaux[i].Adr_el_suiv4:=adresse; Affiche('Changement dans signal '+intToSTR(signaux[i].adresse),clYellow); config_modifie:=true; - end; + end; end; // TCOs @@ -16555,7 +16619,7 @@ begin Affiche_TCO(i); end; - ButtonPropage.Hint:='Change les adresses dans les points de connexions'+#13+ + ButtonPropageAig.Hint:='Change les adresses dans les points de connexions'+#13+ 'des aiguillages, des branches et des signaux'+#13+ 'si on a changé l''adresse d''un aiguillage'; clicListe:=false; @@ -16651,7 +16715,7 @@ begin index:=Index_Aig(Adresse); AncienAdresse:=aiguillage[index].AncienAdresse; if adresse<>AncienAdresse then - ButtonPropage.Hint:='Change les adresses '+intToSTR(AncienAdresse)+' dans les points de connexions'+#13+ + ButtonPropageAig.Hint:='Change les adresses '+intToSTR(AncienAdresse)+' dans les points de connexions'+#13+ 'des aiguillages et des branches par l''adresse '+intToSTR(adresse); end; end; @@ -17269,6 +17333,7 @@ begin EditDecal.Text:=IntToSTR(detecteur[adr].distArret); RadioButtonArrFin.Checked:=detecteur[adr].ModeArret=1; RadioButtonARMil.Checked:=detecteur[adr].ModeArret=2; + LabelDetCour.Caption:=intToSTR(adr); if detecteur[adr].ModeArret=1 then editDecal.Enabled:=true else editDecal.Enabled:=false; end; end; @@ -17448,7 +17513,7 @@ begin ligneclicDet:=lc; end; - Val(s,Adresse,erreur); // Adresse de l'aguillage + Val(s,Adresse,erreur); // Adresse du détecteur aff_champs_Detecteurs(lc); clicliste:=false; @@ -20096,6 +20161,222 @@ begin if not(decode_ligne_signal(s,i)) then // décode la chaine et stocke en tableau signal Affiche('Erreur 59 : définition inccorecte du signal '+intToSTR(i),clred); end; +end; + + +procedure TFormConfig.ButtonValideDetClick(Sender: TObject); +var i,erreur,detect,AncienDet,indexDet,v,adresseBr,x,y,longestLength,l,PixelLength : integer; +typ : tEquipement; + s,nb,LongestString : string; + chgt : boolean; +begin + if clicListe then exit; + val(LabeledNvleAdrDet.text,detect,erreur); + if (erreur<>0) or (detect<1) then + begin + labelInfo.caption:='Erreur'; + exit; + end; + + val(LEAdrDet.text,AncienDet,erreur); + if (erreur<>0) or (AncienDet<1) then + begin + labelInfo.caption:='Erreur'; + exit; + end; + + if ancienDet=detect then exit; + + // vérifier si le nouveau détecteur existe + if detecteur[detect].index<>0 then + begin + LabelInfo.caption:='Le détecteur '+intToSTR(detect)+' existe déja'; + exit; + end; + + labelInfo.caption:=''; + indexDet:=detecteur[AncienDet].index; + detecteur[detect]:=detecteur[ancienDet]; // copier l'ancien dans le nouveau + + with detecteur[ancienDet] do + begin + index:=0; + NumBranche:=0; + IndexBranche:=0; + end; + + Adresse_detecteur[ligneclicDet+1]:=detect; + trier_detecteurs; + + // réafficher la listBox + with ListBoxDet do + begin + clear; + for i:=1 to NDetecteurs do items.add(encode_detecteur(i)); + end; + indexDet:=Detecteur[detect].index; + formconfig.ListBoxDet.selected[indexDet-1]:=true; + + Affiche('----------------------------------------------------',clWhite); + Affiche('Changement détecteur '+intToSTR(ancienDet)+' par l''adresse '+intToSTR(detect),clwhite); + + // changer le détecteur dans les branches chaine ---------------------------------- + for i:=1 to NbreBranches do + begin + Nb:='';v:=0; + s:=Branche[i]; + repeat + v:=pos(',',s); + + if (s[1]<>'A') and (s[1]<>'T') then + begin + val(s,adresseBr,erreur); + if adresseBR=AncienDet then adresseBr:=detect; + Nb:=Nb+intToSTR(adresseBr)+','; + end + else + begin + if v=0 then + Nb:=Nb+s+',' + else Nb:=Nb+copy(s,1,v-1)+','; + end; + delete(s,1,v); + until (v=0); + + delete(nb,length(nb),1); // supprime la virgule terminale + branche[i]:=nb; + compile_branche(nb,i); + end; + + // réafficher les branches + richBranche.Clear; + for i:=1 to NbreBranches do + begin + s:=Branche[i]; + RichBranche.Lines.Add(s); + RE_ColorLine(RichBranche,RichBranche.lines.count-1,ClAqua); + end; + + // les détecteurs dans aiguillages + // --------- aiguillages ----------- + for i:=1 to maxaiguillage do + begin + typ:=aiguillage[i].modele; + if (typ=aig) or (typ=triple) then + begin + if (aiguillage[i].ADroit=AncienDet) and ((aiguillage[i].ADroitB='Z') or (aiguillage[i].ADroitB='')) then + begin + aiguillage[i].ADroit:=detect; + Affiche('Réaffectation '+BTypeToChaine(typ)+' '+intToSTR(aiguillage[i].Adresse)+' droit',clyellow); + config_modifie:=true; + end; + if (aiguillage[i].ADevie=AncienDet) and ((aiguillage[i].ADevieB='Z') or (aiguillage[i].AdevieB='')) then + begin + aiguillage[i].ADevie:=detect; + Affiche('Réaffectation '+BTypeToChaine(typ)+' '+intToSTR(aiguillage[i].Adresse)+' dévié',clyellow); + config_modifie:=true; + end; + if (aiguillage[i].APointe=AncienDet) and ((aiguillage[i].ApointeB='Z') or (aiguillage[i].ApointeB=''))then + begin + aiguillage[i].APointe:=detect; + Affiche('Réaffectation '+BTypeToChaine(typ)+' '+intToSTR(aiguillage[i].Adresse)+' pointe',clyellow); + config_modifie:=true; + end; + end; + + if (typ=tjd) or (typ=tjs) or (typ=crois) then + begin + if (aiguillage[i].ADroit=AncienDet) and ((aiguillage[i].ADroitB='Z') or (aiguillage[i].ADroitB='')) then + begin + aiguillage[i].ADroit:=detect; + Affiche('Réaffectation '+BTypeToChaine(typ)+' '+intToSTR(aiguillage[i].Adresse)+' Adroit',clyellow); + config_modifie:=true; + end; + if (aiguillage[i].ADevie=AncienDet) and ((aiguillage[i].ADevieB='Z') or (aiguillage[i].ADevieB='')) then + begin + aiguillage[i].ADevie:=detect; + Affiche('Réaffectation '+BTypeToChaine(typ)+' '+intToSTR(aiguillage[i].Adresse)+' Ddevie',clyellow); + config_modifie:=true; + end; + if (aiguillage[i].DDroit=AncienDet) and ((aiguillage[i].DDroitB='Z') or (aiguillage[i].DDroitB='')) then + begin + aiguillage[i].DDroit:=detect; + Affiche('Réaffectation '+BTypeToChaine(typ)+' '+intToSTR(aiguillage[i].Adresse)+' Ddroit',clyellow); + config_modifie:=true; + end; + if (aiguillage[i].DDevie=AncienDet) and ((aiguillage[i].DdevieB='Z') or (aiguillage[i].dDevieB='')) then + begin + aiguillage[i].DDevie:=detect; + Affiche('Réaffectation '+BTypeToChaine(typ)+' '+intToSTR(aiguillage[i].Adresse)+' Ddevie',clyellow); + config_modifie:=true; + end; + end; + end; + // réaffecte la listebox aiguillages + formconfig.ListBoxAig.Clear; + for i:=1 to MaxAiguillage do + begin + s:=encode_aig(i); + formConfig.ListBoxAig.Items.AddObject(s,Pointer(clYellow)); + Aiguillage[i].modifie:=false; + end; + formconfig.ListBoxAig.itemindex:=0; + + // dans les signaux + for i:=1 to NbreSignaux do + begin + chgt:=false; + if signaux[i].Adr_det1=AncienDet then begin signaux[i].Adr_det1:=detect;chgt:=true;end; + if signaux[i].Adr_det2=AncienDet then begin signaux[i].Adr_det2:=detect;chgt:=true;end; + if signaux[i].Adr_det3=AncienDet then begin signaux[i].Adr_det3:=detect;chgt:=true;end; + if signaux[i].Adr_det4=AncienDet then begin signaux[i].Adr_det4:=detect;chgt:=true;end; + if (signaux[i].Btype_suiv1=det) and (signaux[i].Adr_el_suiv1=AncienDet) then begin signaux[i].Adr_el_suiv1:=detect;chgt:=true;end; + if (signaux[i].Btype_suiv2=det) and (signaux[i].Adr_el_suiv2=AncienDet) then begin signaux[i].Adr_el_suiv2:=detect;chgt:=true;end; + if (signaux[i].Btype_suiv3=det) and (signaux[i].Adr_el_suiv3=AncienDet) then begin signaux[i].Adr_el_suiv3:=detect;chgt:=true;end; + if (signaux[i].Btype_suiv4=det) and (signaux[i].Adr_el_suiv4=AncienDet) then begin signaux[i].Adr_el_suiv4:=detect;chgt:=true;end; + + if chgt then Affiche('Changement détecteur dans signal '+intToSTR(signaux[i].adresse),clYellow); + end; + formconfig.ListBoxSig.Clear; + longestLength:=0; + for i:=1 to NbreSignaux do + begin + s:=encode_signal(i); // encode la ligne depuis le tableau feux + //Affiche(s,clwhite); + if s<>'' then + 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; + end; + end; + PixelLength:=formconfig.ListboxSig.Canvas.TextWidth(LongestString); + // positionne une scrollbar dans la listbox - pour l'enlever, envoyer 0 dans pixelLength + SendMessage(formconfig.ListBoxSig.Handle,LB_SETHORIZONTALEXTENT,PixelLength,0); + + + // TCOs + for i:=1 to NbreTCO do + begin + for y:=1 to NbreCellY[i] do + for x:=1 to NbreCellX[i] do + begin + if (tco[i,x,y].Adresse=AncienDet) and (tco[i,x,y].BImage<>Id_Signal) then + begin + tco[i,x,y].Adresse:=detect; + s:='TCO '+intToSTR(i)+' cellule '+intToSTR(x)+','+intToSTR(y)+' '; + s:=s+'Changement adresse '+intToSTR(AncienDet)+' par adresse '+intToSTR(detect); + Affiche(s,clyellow); + end; + end; + Affiche_TCO(i); + end; end; diff --git a/UnitDebug.pas b/UnitDebug.pas index 2c5572c..489acf0 100644 --- a/UnitDebug.pas +++ b/UnitDebug.pas @@ -731,7 +731,7 @@ begin NivDebug:=3; erreur:=Signal_Precedent(Adr); NivDebug:=AncDebug; - AfficheDebug('signal précédent='+intToSTR(erreur),clyellow); + AfficheDebug('Signal précédent='+intToSTR(erreur),clyellow); end; end. diff --git a/UnitModifAction.dfm b/UnitModifAction.dfm index d4ac706..dddcf6e 100644 --- a/UnitModifAction.dfm +++ b/UnitModifAction.dfm @@ -60,7 +60,7 @@ object FormModifAction: TFormModifAction Top = 64 Width = 729 Height = 337 - ActivePage = TabSheetOp + ActivePage = TabSheet1 MultiLine = True TabOrder = 1 object TabSheetDecl: TTabSheet @@ -255,9 +255,9 @@ object FormModifAction: TFormModifAction object Label6: TLabel Left = 258 Top = 8 - Width = 118 + Width = 124 Height = 13 - Caption = 'Condition '#224' observer' + Caption = 'Conditions '#224' observer' Font.Charset = DEFAULT_CHARSET Font.Color = clWindowText Font.Height = -11 @@ -265,6 +265,32 @@ object FormModifAction: TFormModifAction Font.Style = [fsBold] ParentFont = False end + object SpeedButtonSupCond: TSpeedButton + Left = 338 + Top = 255 + Width = 23 + Height = 22 + Hint = 'Supprime une condition de la liste' + Glyph.Data = { + F6000000424DF600000000000000760000002800000010000000100000000100 + 04000000000080000000C40E0000C40E00001000000000000000000000000000 + 8000008000000080800080000000800080008080000080808000C0C0C0000000 + FF0000FF000000FFFF00FF000000FF00FF00FFFF0000FFFFFF00FFF9FFFFFFF9 + 9FFFFF999FFFFF9999FFF99999FFF999999F9999999F9999999FF99999999999 + 99FFFF99999999999FFFFFF999999999FFFFFFFF9999999FFFFFFFF999999999 + FFFFFF99999999999FFFF9999999999999FF9999999F9999999F999999FFF999 + 999FF9999FFFFF9999FFFF99FFFFFFF99FFFFFFFFFFFFFFFFFFF} + ParentShowHint = False + ShowHint = True + OnClick = SpeedButtonSupCondClick + end + object Label7: TLabel + Left = 240 + Top = 258 + Width = 93 + Height = 13 + Caption = 'Supprimer condition' + end object ListBoxCondTot: TListBox Left = 0 Top = 60 @@ -279,12 +305,13 @@ object FormModifAction: TFormModifAction Top = 28 Width = 201 Height = 201 - Hint = 'Condition de r'#233'alisation du d'#233'clencheur' + Hint = 'Conditions (chainage en ET) de r'#233'alisation du d'#233'clencheur' ItemHeight = 13 ParentShowHint = False ShowHint = True TabOrder = 1 OnDrawItem = ListBoxConditionsDrawItem + OnKeyDown = ListBoxConditionsKeyDown OnMouseDown = ListBoxConditionsMouseDown end object GroupBox1: TGroupBox @@ -449,6 +476,18 @@ object FormModifAction: TFormModifAction TabOrder = 3 OnClick = ButtonAppCondClick end + object ButtonAjCond: TButton + Left = 128 + Top = 276 + Width = 75 + Height = 25 + Hint = 'Ajouter la condition s'#233'lectionn'#233'e dans la liste des conditions' + Caption = 'Ajouter >>>' + ParentShowHint = False + ShowHint = True + TabOrder = 4 + OnClick = ButtonAjCondClick + end end object TabSheetOp: TTabSheet Caption = 'Op'#233'rations' @@ -517,7 +556,7 @@ object FormModifAction: TFormModifAction Top = 32 Width = 217 Height = 21 - ItemHeight = 13 + ItemHeight = 0 TabOrder = 0 OnChange = ComboBoxFamilleChange end @@ -722,7 +761,7 @@ object FormModifAction: TFormModifAction Height = 21 Hint = 'Nom du p'#233'riph'#233'rique d'#233'fini dans l'#39'onglet "p'#233'riph'#233'riques COM/USB"' Style = csDropDownList - ItemHeight = 13 + ItemHeight = 0 ParentShowHint = False ShowHint = True TabOrder = 4 diff --git a/UnitModifAction.pas b/UnitModifAction.pas index 2002101..4f31123 100644 --- a/UnitModifAction.pas +++ b/UnitModifAction.pas @@ -84,6 +84,9 @@ type Descendreopration1: TMenuItem; N1: TMenuItem; Supprimeropration1: TMenuItem; + ButtonAjCond: TButton; + SpeedButtonSupCond: TSpeedButton; + Label7: TLabel; procedure FormCreate(Sender: TObject); procedure ListBoxOperDrawItem(Control: TWinControl; Index: Integer; Rect: TRect; State: TOwnerDrawState); @@ -142,6 +145,10 @@ type procedure Supprimeropration1Click(Sender: TObject); procedure Monteropration1Click(Sender: TObject); procedure Descendreopration1Click(Sender: TObject); + procedure ButtonAjCondClick(Sender: TObject); + procedure SpeedButtonSupCondClick(Sender: TObject); + procedure ListBoxConditionsKeyDown(Sender: TObject; var Key: Word; + Shift: TShiftState); private { Déclarations privées } public @@ -286,7 +293,7 @@ begin CondMemoireEgal : icone:=IconeCondMemoireEgal; CondMemoireInf : icone:=IconeCondMemoireInf; CondMemoireSup : icone:=IconeCondMemoireSup; - + CondDetAct : Icone:=IconeDet; end; ListBoxCondTot.Items.Add(Format('%d%s', [icone, Conditions[i].nom])); // valeur d'index de l'icone dans la ImagelistIcones ListBoxCondTot.itemHeight:=16; // 16 taille des éléments pour l'icone @@ -404,7 +411,7 @@ begin s:=s+'accessoire '+intToSTR(Tablo_Action[i].adresse); DeclDetAct : begin - s:=s+'détecteur/Actionneur '+intToSTR(Tablo_Action[i].adresse); + s:=s+'détecteur/Actionneur '+intToSTR(Tablo_Action[i].adresse)+' à '+intToSTR(Tablo_Action[i].etat); s:=s+' par le train "'+Tablo_Action[i].trainDecl+'"'; end; DeclZoneDet : @@ -451,7 +458,7 @@ begin condMemoireEgal : s:=s+'mémoire '+intToSTR(tablo_action[i].tabloCond[op].adresse)+' à '+intToSTR(tablo_action[i].tabloCond[op].etat); condMemoireInf : s:=s+'mémoire '+intToSTR(tablo_action[i].tabloCond[op].adresse)+' < '+intToSTR(tablo_action[i].tabloCond[op].etat); condMemoireSup : s:=s+'mémoire '+intToSTR(tablo_action[i].tabloCond[op].adresse)+' > '+intToSTR(tablo_action[i].tabloCond[op].etat); - + condDetAct : s:=s+'det/act '+intToSTR(tablo_action[i].tabloCond[op].adresse)+' à '+intToSTR(tablo_action[i].tabloCond[op].etat)+' train:'+tablo_action[i].tabloCond[op].train; end; s:=s+#13; end; @@ -677,7 +684,7 @@ end; // affiche les champs en fonction de l'index du tablo actionneur et de l'index de l'action procedure Aff_champs(index,IndexCond,IndexAction : integer); -var i,decl,act,cond,icone : integer; +var i,decl,act,cond,icone,adr : integer; s : string; begin if (index<1) then exit; @@ -751,23 +758,27 @@ begin for i:=1 to Tablo_Action[index].NbCond do begin cond:=Tablo_Action[index].tabloCond[i].numcondition; - s:=conditions[cond].nom; - case cond of - CondVrai : icone:=iconeVrai; - CondFaux : icone:=iconeFaux; - CondVitTrain : icone:=IconeVitTrain; - CondPosAcc : icone:=IconeAccessoire; - condHorl : icone:=IconeLanceHorl; - condTrainSig : icone:=IconeDeclSignal; - condFonction : icone:=IconeFonction; - condBouton : icone:=IconeBouton; - condMemoireEgal: icone:=IconeCondMemoireEgal; - condMemoireSup: icone:=IconeCondMemoireSup; - condMemoireInf: icone:=IconeCondMemoireinf; - end; - - items.Add(Format('%d%s', [icone, s])); // valeur d'index de l'icone dans la ImagelistIcones + if (cond<0) or (cond>CondDetAct) then Affiche('Erreur structure conditions',clred) + else + begin + s:=conditions[cond].nom; + case cond of + CondVrai : icone:=iconeVrai; + CondFaux : icone:=iconeFaux; + CondVitTrain : icone:=IconeVitTrain; + CondPosAcc : icone:=IconeAccessoire; + condHorl : icone:=IconeLanceHorl; + condTrainSig : icone:=IconeDeclSignal; + condFonction : icone:=IconeFonction; + condBouton : icone:=IconeBouton; + condMemoireEgal: icone:=IconeCondMemoireEgal; + condMemoireSup: icone:=IconeCondMemoireSup; + condMemoireInf: icone:=IconeCondMemoireinf; + condDetAct: icone:=IconeDet; + end; + items.Add(Format('%d%s', [icone, s])); // valeur d'index de l'icone dans la ImagelistIcones + end; itemHeight:=16; end; if indexCond<>0 then itemIndex:=indexCond-1; @@ -1016,6 +1027,12 @@ begin champ1.Visible:=true; champ2.Visible:=true; ChampTrain.Visible:=true; + SpinEditHeure1.visible:=false; + SpinEditHeure2.visible:=false; + SpinEditMn1.visible:=false; + SpinEditMn2.visible:=false; + LabelHeureDebut.Visible:=false; + LabelHeureFin.Visible:=false; end; CondPosAcc : begin @@ -1033,6 +1050,12 @@ begin SpinEditEtat2.visible:=true; SpinEditEtat2.MinValue:=0; SpinEditEtat2.MaxValue:=2; + SpinEditHeure1.visible:=false; + SpinEditHeure2.visible:=false; + SpinEditMn1.visible:=false; + SpinEditMn2.visible:=false; + LabelHeureDebut.Visible:=false; + LabelHeureFin.Visible:=false; end; condHorl : begin @@ -1055,6 +1078,12 @@ begin champTrain.Text:=Tablo_Action[index].tabloCond[indexCond].train; champ1.Visible:=true; champTrain.Visible:=true; + SpinEditHeure1.visible:=false; + SpinEditHeure2.visible:=false; + SpinEditMn1.visible:=false; + SpinEditMn2.visible:=false; + LabelHeureDebut.Visible:=false; + LabelHeureFin.Visible:=false; end; condFonction : begin @@ -1064,7 +1093,14 @@ begin champ1.Visible:=true; ButtonVoirFonc.Visible:=true; Label2InfoFonction.Visible:=true; - Label2InfoFonction.Caption:=NomFonction[Tablo_Action[index].tabloCond[indexCond].adresse]; + SpinEditHeure1.visible:=false; + SpinEditHeure2.visible:=false; + SpinEditMn1.visible:=false; + SpinEditMn2.visible:=false; + LabelHeureDebut.Visible:=false; + LabelHeureFin.Visible:=false; + Adr:=Tablo_Action[index].tabloCond[indexCond].adresse; + if Adr<100 then Label2InfoFonction.Caption:=NomFonction[adr] else Label2InfoFonction.Caption:=''; end; condBouton : begin @@ -1072,6 +1108,12 @@ begin champ1.editLabel.Caption:='Numéro de bouton TCO'; champTrain.Text:=Tablo_Action[index].tabloCond[indexCond].train; champ1.Visible:=true; + SpinEditHeure1.visible:=false; + SpinEditHeure2.visible:=false; + SpinEditMn1.visible:=false; + SpinEditMn2.visible:=false; + LabelHeureDebut.Visible:=false; + LabelHeureFin.Visible:=false; end; condMemoireEgal,CondMemoireInf,CondMemoireSup : begin @@ -1081,8 +1123,33 @@ begin champ2.Text:=intToSTR(Tablo_Action[index].tabloCond[indexCond].etat); Champ2.EditLabel.Caption:='Valeur'; Champ2.Visible:=true; + SpinEditHeure1.visible:=false; + SpinEditHeure2.visible:=false; + SpinEditMn1.visible:=false; + SpinEditMn2.visible:=false; + LabelHeureDebut.Visible:=false; + LabelHeureFin.Visible:=false; + end; + condDetAct : + begin + champ1.Text:=intToSTR(Tablo_Action[index].tabloCond[indexCond].adresse); + champ1.editLabel.Caption:='Adresse'; + champ1.Visible:=true; + champ2.Visible:=false; + SpinEditHeure1.visible:=false; + SpinEditHeure2.visible:=false; + SpinEditMn1.visible:=false; + SpinEditMn2.visible:=false; + LabelHeureDebut.Visible:=false; + LabelHeureFin.Visible:=false; + ChampTrain.Visible:=true; + ChampTrain.Text:=Tablo_Action[index].tabloCond[indexCond].train; + SpinEditEtat2.Value:=Tablo_Action[index].tabloCond[indexCond].etat; + SpinEditEtat2.visible:=true; + SpinEditEtat2.hint:='Etat du détecteur/actionneur'+#13+ + '0=non activé'+#13+ + '1=activé'; end; - end; end; end; @@ -1170,6 +1237,46 @@ begin ListBoxOperations.ItemIndex:=clicAction; end; +procedure supprime_condition; +var i,indexSrc,idBD,NbCond,NumCond,NumOp : integer; + s : string; +begin + indexSrc:=formModifaction.listboxConditions.ItemIndex; + if (indexSrc<0) or (formModifaction.listboxConditions.Count=1) then exit; + + idBD:=ligneClicAct+1; + NbCond:=Tablo_Action[idBD].NbCond; + if NbCond<1 then exit; + + NumCond:=Tablo_Action[idBD].TabloCond[indexSrc+1].numcondition; +// NumOp:=Tablo_Action[idBD].tabloOp[I [indexSrc+1].numcondition; + + s:='Voulez vous supprimer la condition '+#13+conditions[NumCond].Nom+' ?'; + + if Application.MessageBox(pchar(s),pchar('confirm'), MB_YESNO or MB_DEFBUTTON2 or MB_ICONQUESTION)=idNo then exit; + + // supprimer + FormModifAction.listboxConditions.Items.Delete(indexSrc); + for i:=IndexSrc+1 to NbCond-1 do + begin + Tablo_Action[idBD].TabloCond[i]:=Tablo_Action[idBD].TabloCond[i+1]; + end; + + dec(NbCond); + Tablo_Action[idBD].NbCond:=NbCond; + Setlength(Tablo_Action[idBD].tabloCond,NbCond+1); + + Aff_champs(idBD,IndexSrc,1); //??? + exit; + + // réencoder la ligne + s:=encode_actions(idBD); + // maj combobox + FormModifAction.ComboBoxActions.Items[idBD-1]:=s; + FormModifAction.ComboBoxActions.ItemIndex:=idbd-1; +end; + + procedure supprime_operation; var i,indexSrc,idBD,NbOp,NumOp : integer; s : string; @@ -1641,12 +1748,14 @@ begin CondPosAcc : Tablo_Action[ligneclicact+1].tabloCond[cliccond+1].accessoire:=i; CondTrainSig : Tablo_Action[ligneclicact+1].tabloCond[cliccond+1].adresse:=i; CondFonction : begin + if i>100 then i:=1; Tablo_Action[ligneclicact+1].tabloCond[cliccond+1].adresse:=i; Label2InfoFonction.caption:=NomFonction[i]; end; CondBouton : Tablo_Action[ligneclicact+1].tabloCond[cliccond+1].adresse:=i; CondMemoireEgal,CondMemoireInf,CondMemoireSup : Tablo_Action[ligneclicact+1].tabloCond[cliccond+1].adresse:=i; + CondDetAct : Tablo_Action[ligneclicact+1].tabloCond[cliccond+1].adresse:=i; end; maj_combocactions(ligneclicAct); end; @@ -1745,6 +1854,7 @@ begin cond:=Tablo_Action[ligneclicact+1].tabloCond[cliccond+1].numcondition; case cond of CondVitTrain,CondTrainSig : Tablo_Action[ligneclicact+1].tabloCond[cliccond+1].train:=ChampTrain.Text; + CondDetAct : Tablo_Action[ligneclicact+1].tabloCond[cliccond+1].train:=ChampTrain.Text; end; maj_combocactions(ligneclicAct); @@ -1764,6 +1874,7 @@ begin cond:=Tablo_Action[ligneclicact+1].tabloCond[cliccond+1].numcondition; case cond of CondPosAcc : Tablo_Action[ligneclicact+1].tabloCond[cliccond+1].etat:=i; + CondDetAct : Tablo_Action[ligneclicact+1].tabloCond[cliccond+1].etat:=i; end; maj_combocactions(ligneclicAct); end; @@ -1802,8 +1913,8 @@ begin end; procedure TFormModifAction.ListBoxOperationsKeyDown(Sender: TObject; - var Key: Word; Shift: TShiftState); -var nb : integer; +var Key: Word; Shift: TShiftState); +var nb : integer; begin nb:=Tablo_Action[ligneclicAct+1].NbOperations; if (nb<1) or clicliste then exit; @@ -1889,4 +2000,74 @@ begin descend_operation; end; +procedure TFormModifAction.ButtonAjCondClick(Sender: TObject); +var indexSrc,idBD,NbOp,NbCond,i : integer; + s : string; +begin + indexSrc:=listboxCondTot.ItemIndex; + if indexSrc<0 then exit; + + s:=ListBoxCondTot.Items[IndexSrc]; + i:=index_condition(s); + if i=0 then exit; + + idBD:=ligneClicAct+1; + NbOp:=Tablo_Action[idBD].NbOperations; + NbCond:=Tablo_Action[idBD].NbCond; + inc(NbCond); + Tablo_Action[idBD].NbCond:=NbCond; + Setlength(Tablo_Action[idBD].TabloCond,NbCond+1); + // le nouveau numéro de condition c'est l'index de la listboxCond + Tablo_Action[idBD].tabloCond[NbCond].numcondition:=i; + + Aff_champs(idbd,nbCond,Nbop); + clicCond:=NbCond-1; + ListBoxOperations.ItemIndex:=clicCond; +end; + +procedure TFormModifAction.SpeedButtonSupCondClick(Sender: TObject); +begin + supprime_condition; +end; + +procedure TFormModifAction.ListBoxConditionsKeyDown(Sender: TObject; +var Key: Word; Shift: TShiftState); +var nb : integer; +begin + nb:=Tablo_Action[ligneclicAct+1].NbCond; + if (nb<1) or clicliste then exit; + if key=VK_delete then supprime_Condition; + + if ord(Key)=VK_UP then + begin + begin + if clicCond>0 then + begin + dec(clicCond); + Aff_champs(ligneclicAct+1,ClicCond+1,ClicAction+1); + end; + end; + end; + + if ord(Key)=VK_DOWN then + begin + begin + if clicCond= 28.0} - procedure DataReceived(const Data: TidBytes); - {$ELSE} - procedure DataReceived(const Data: string); - {$IFEND} end; @@ -612,6 +605,7 @@ CondBouton=8; CondMemoireEgal=9; CondMemoireSup=10; CondMemoireInf=11; +CondDetAct=12; // Type d'opération (action) Action0=0; @@ -744,12 +738,12 @@ Taiguillage = record end; TtabloDet = array[0..MaxParcoursTablo] of integer; TSignal = record - adresse, aspect : integer; // adresse du signal, aspect (2 feux..9 feux 12=direction 2 feux .. 16=direction 6 feux) (11=signal belge 1) + adresse,aspect,AncienAdresse : integer; // adresse du signal, aspect (2 feux..9 feux 12=direction 2 feux .. 16=direction 6 feux) (11=signal belge 1) Img : TImage; // Pointeur sur structure TImage du signal Lbl : TLabel; // pointeur sur structure Tlabel du signal checkFB : TCheckBox; // pointeur sur structure Checkbox "demande feu blanc" checkFR : boolean; // demande feu rouge cli - checkFV : boolean; // demande feu vert cli + checkFV : boolean; // demande feu vert cli ou si signal 2 feux, false=signal violet/blanc ou true=vert/rouge FeuVertCli : boolean ; // avec checkbox ou pas FeuRougeCli : boolean ; // avec checkbox ou pas contrevoie : boolean; // signal de contrevoie (SNCB) @@ -1165,10 +1159,11 @@ var train : string; end; + // exécution des opérations des actions differées par le timer seq_actions : array[1..30] of record indiceAction,IndiceOp, // indice à partir duquel reprendre l'exécution - op,tick : integer; // opération + tick : integer; // opération end; Declencheurs : array[0..10] of @@ -1182,14 +1177,14 @@ var NomFonction : array[0..100] of string; // nom de la fonction ArbreFonc : array[0..100,0..100] of integer; // fonction sous forme d'arbre - blocUSB : array[1..10] of record + blocUSB : array[1..10] of record // 10 éléments pour 10 blocs USB AffTrain : string; rotatifM,rotatifP,clic,increment : integer; - Bp1,bp2,bp3,bp4,bp5,bp6,bp7,bp8,bp9,bp10 : integer; + Bp1,bp2,bp3,bp4,bp5,bp6,bp7,bp8,bp9,bp10 : integer; // 10 boutons par bloc Fbp1,fbp2,fbp3,Fbp4,fbp5,fbp6,Fbp7,fbp8,fbp9,Fbp10 : integer; // fonctions F des BP Fnp1,fnp2,fnp3,Fnp4,fnp5,fnp6,Fnp7,fnp8,fnp9,Fnp10 : integer; // état F des BP Tbp1,Tbp2,Tbp3,Tbp4,Tbp5,Tbp6,Tbp7,Tbp8,Tbp9,Tbp10 : integer; // temps de retombée de la fonction F - Tcp : array[1..10] of integer; // valeur courante de la tempo de retombée + Tcp : array[1..10] of integer; // valeur courante de la tempo de retombée de la fonction F end; Memoire : array[0..MaxMemoires] of integer; @@ -1366,12 +1361,14 @@ function Signal_precedent(adresse : integer) : integer; function signal_rouge(adresse : word) : boolean; function chaine_signal(adresse : word) : string; function signal_suivant_det(det1,det2 : integer) : integer; - +procedure envoi_signauxCplx; procedure composant(c : tComponent;fond,texte : tColor); procedure maj_couleurs; +{$IF CompilerVersion < 28.0} procedure AffTexteIncliBordeTexture(c : TCanvas; x,y : integer; Fonte : tFont; clBord : TColor; EpBord : integer; PenMode : TPenMode; texte : string; AngleDD : longint); +{$IFEND} {$IF CompilerVersion >= 28.0} procedure change_style; {$IFEND} @@ -1398,7 +1395,7 @@ procedure trouve_element(el: integer; TypeEl : TEquipement); overload; procedure trouve_element_V1(el: integer; TypeEl : TEquipement; Offset,branche_pref,OffsetDsBranche : integer;erreur : boolean;it : integer); procedure procetape(s : string); procedure Affiche_routes_brut; -procedure TJD4(adr1,pos1,adr2,pos2 : integer;var c1,c2 : char); +procedure TJD4(pos1,pos2 : integer;var c1,c2 : char); procedure affecte_trains_config; procedure Fonction_Loco_Operation_XNet(loco,fonction,etat : integer); procedure calcul_equations_coeff(indexTrain : integer); @@ -1736,20 +1733,7 @@ begin with formprinc do begin if (idTrainClic<1) or (idTrainClic>nTrains) then exit; - // Affiche('origine='+intToSTR(origine),clYellow); - {if origine=1 then - begin - // s:=editVitesse.Text; - // val(s,vit,erreur); - //Affiche('vitconsigne1='+intToSTR(vit),clOrange); - if (erreur<>0) or (vit<-128) or (vit>127) then exit; - vitesse_loco(trains[IdTrainClic].nom_train, - idTrainClic, - trains[idTrainClic].adresse, - trains[idTrainClic].vitesseCons, // vit - 10,vientde); - end; } - //if origine=2 then + begin vit:=trains[idTrainUSB].VitesseBlocUSB; VientDe:=consigneBLocUSB; // ne génère pas event_vitesse @@ -2140,7 +2124,7 @@ begin if LanceHorl then Demarre_horloge; // création des compteurs if (compteur<0) or (compteur>3) then compteur:=1; - for i:=1 to 1 do + for i:=1 to 1 do // il n'y a qu'une seule fenetre compteurs begin formCompteur[i]:=TformCompteur.Create(nil); with formCompteur[i] do @@ -2191,11 +2175,10 @@ begin interface_ou_cdm; // démarrer l'interface , génère les evts détecteurs ; ou cdm - // créer les compteurs après avoir téléchargé la liste des trains de CDM + // créer les compteurs GroupBox après avoir téléchargé la liste des trains de CDM s:='Création des compteurs GB'; procetape(s); - for i:=1 to ntrains do begin cree_GB_compteur(i); @@ -2205,9 +2188,6 @@ begin calcul_equations_coeff(i); end; - s:='Fin du préliminaire'; - procetape(s); - formprinc.SetFocus; menu_selec; @@ -2229,8 +2209,16 @@ begin end; Maj_Signaux(false); + + // envoyer les signaux à l'interface + for i:=1 to NbreSignaux do + Signaux[i].AncienEtat:=9999; // pour forcer le pilotage des signaux sur le changement d'état + envoi_signauxCplx; + change_clic_train(1); // sélectionne le train 1 + s:='Fin du préliminaire'; + procetape(s); end; // renvoie une chaine ASCI Hexa affichable à partir d'une chaîne @@ -2268,7 +2256,7 @@ begin end; // procédures liaisons série com usb ------------------------------------------------ -// envoie une chaine s à un périphérique COM/USB en fonction du composant comp +// envoie une chaine s à un périphérique COM/USB en fonction du composant AsyncPro tApdComport // contrôle si le pointeur comp est valide par traitement de l'exception {$IF CompilerVersion >= 28.0} procedure envoi_usb_comp(comp : tApdComPort;s : variant); @@ -3169,6 +3157,7 @@ begin EndPaint(canvashd,ps); end; +{$IF CompilerVersion < 28.0} // Ecrire sur un canvas un texte avec un angle, avec ou sans bordure, monochrome ou à face texturée // procédure pour Delphi 7 // params : C = Canvas @@ -3243,6 +3232,7 @@ begin SelectObject(dc,AncBrush); DeleteObject(NouvBrush); end; +{$IFEND} // inverse une image (miroir horizontal) et la met dans dest // Utilisé pour les signaux belges, et les trains @@ -4050,9 +4040,11 @@ procedure dessine_signal2(Acanvas : Tcanvas;x,y : integer;frX,frY : single;EtatS var Temp,rayon,xViolet,YViolet,xBlanc,yBlanc, LgImage,HtImage,code,combine : integer; ech : real; + styleF : boolean; begin code_to_aspect(Etatsignal,code,combine); rayon:=round(DiamFeu*frX); + styleF:=signaux[index].checkFV; // si true : c'est un feu vert / rouge // récupérer les dimensions de l'image d'origine du signal with Formprinc.Image2feux.Picture.Bitmap do @@ -4096,8 +4088,10 @@ begin cercle(ACanvas,xViolet,yViolet,rayon,clBlack,GrisF); // allumages - if ((code=blanc_cli) and (clignotant)) or (code=blanc) then cercle(ACanvas,xBlanc,yBlanc,rayon,clBlack,clWhite); - if code=violet then cercle(ACanvas,xViolet,yViolet,rayon,clBlack,clViolet); + if not(styleF) and (((code=blanc_cli) and (clignotant)) or (code=blanc)) then cercle(ACanvas,xBlanc,yBlanc,rayon,clBlack,clWhite); + if styleF and (((code=blanc_cli) and (clignotant)) or (code=blanc)) then cercle(ACanvas,xBlanc,yBlanc,rayon,clBlack,clGreen); + if (code=violet) and not(styleF) then cercle(ACanvas,xViolet,yViolet,rayon,clBlack,clViolet); + if (code=violet) and styleF then cercle(ACanvas,xViolet,yViolet,rayon,clBlack,clRed); end; // dessine les feux sur une cible à 3 feux @@ -4756,7 +4750,12 @@ begin 3 : angle:=900; 4 : angle:=1800; end; + {$IF CompilerVersion < 28.0} AffTexteIncliBordeTexture(Acanvas,XTexte,YTexte,Acanvas.Font,clYellow,0,pmcopy,intToSTR(vitesse),angle); + {$ELSE} + font.orientation:=angle; + textout(Xtexte,Ytexte,intToSTr(vitesse)); + {$IFEND} end; end; end @@ -5317,7 +5316,6 @@ begin begin Combotrains.ItemIndex:=IdTrainclic-1; EditAdrTrain.Text:=intToSTR(trains[idTrainClic].adresse); - //Editvitesse.Text:=intToSTR(trains[idTrainClic].vitesseCons); end; // affiche le compteur du train cliqué affiche_train_compteur(1); @@ -5367,7 +5365,7 @@ begin formCompteur[1].Show; end; -// créée une image dynamiquement dans la partie droite pour un nouveau compteur par train +// créée les composants trains dynamiquement dans la partie droite pour un nouveau compteur par train // rang commence à 1 procedure cree_GB_compteur(rang : integer); const HautTb=10; // hauteur trackbar @@ -5444,7 +5442,7 @@ begin // le compteurT[].FCBitmap sera créé dans init_compteur - // bouton + // bouton RAZ vitesse 0 CompteurT[rang].bouton:=Tbutton.create(CompteurT[rang].gb); with compteurT[rang].bouton do begin @@ -5473,12 +5471,14 @@ begin ctl3D:=false; onChange:=formprinc.ImTBOnChange; end; + + // compteur du train type groupbox (gb) init_compteur(rang,CompteurT[rang].gb); end; // cliqué sur image, labelnom ou labelvitesse -// cliqué train +// cliqué sur train procedure tFormprinc.ImageTrainonclick(Sender : tObject); var P_component : tComponent; i : integer; @@ -5889,7 +5889,7 @@ begin end; // ajoute une tache dans le tableau taches[] -// pour pilotage dans le timer. On pilotera une tache par tick timer (1/10ème de s) +// qui seront ensuite traitées par le timer. On pilotera une tache par tick timer (1/10ème de s) // ttache=ttacheAcc (pilote acc), ttacheVit (vitesse train) , ttacheFF (fonctionF) , ttacheTempo (temporisation) // temporisation pour le timer avant action // destinataire (1=CDM 2=XpressNet 3=Dccpp) @@ -5941,12 +5941,15 @@ end; // teste la (les) condition(s) d'une action // action : index de l'action +//zizi function teste_condition(action : integer) : boolean; -var condValide : boolean; +var condValide,condfinale : boolean; vit,vit1,vit2,it,pa,m1,m2,hc,n,ncond,cond,etat : integer; + bol : boolean; tr : string; begin - // 1 condition - pas de chaînage avec 1 seule condition + // chaînage des conditions en ET + CondFinale:=true; condValide:=false; n:=Tablo_Action[action].NbCond; for ncond:=1 to n do @@ -5963,7 +5966,7 @@ begin it:=index_train_nom(tr); if it>0 then begin - vit:=Trains[it].vitesseCons; + vit:=Trains[it].vitesseCons; condvalide:=(vit>=vit1) and (vit<=vit2); end; end; @@ -6031,9 +6034,20 @@ begin condValide:=false; if (adr>1) or (adr<=MaxMemoires) then condValide:=memoire[adr]>etat; end; + condDetAct : + begin + adr:=Tablo_Action[action].tabloCond[ncond].adresse; + etat:=Tablo_Action[action].tabloCond[ncond].etat; + bol:=etat=1; + tr:=Tablo_Action[action].tabloCond[ncond].train; + condValide:=false; + if (adr>1) and (adr<=NbMaxDet) then condValide:=(detecteur[Adr].Etat=bol) and (tr=detecteur[adr].Train); + end; end; + condFinale:=condFinale and condValide; + end; - result:=condValide; + result:=condFinale; end; @@ -6641,8 +6655,6 @@ begin if (v=adr_loco) then begin pasChgTBV:=true; // évite de repositionner la trackbar - //Formprinc.TrackBarVit.Position:=vitesse; - //formprinc.EditVitesse.text:=intToSTR(vitesse); pasChgTBV:=false; end; @@ -8809,7 +8821,7 @@ begin begin if teste_condition(i) then begin - Affiche('ZZ test condition',clRed); + //Affiche('ZZ test condition',clRed); action(i); // exécute toutes les opérations de l'actionneur i end end; @@ -9019,8 +9031,11 @@ begin begin adr:=Signaux[i].adresse; if not(fermeSC) and (adr<>0) then envoi_signal(adr); - if not modetache then Sleep(25); - Application.processMessages; + if not modetache then + begin + Sleep(25); + Application.processMessages; + end; end; end; @@ -9492,7 +9507,7 @@ end; // renvoie les adresses des 2 aiguillages adjacents au détecteur "adresse" (avant, après) -// résultat dans var1 et var2 +// résultat dans adr1 et adr2 procedure Aig_Adj(adresse : integer;var adr1: integer;var adr2 : integer); var Branche,IndexBranche,i : integer; sortie : boolean; @@ -16160,7 +16175,7 @@ begin if adrSuiv>NbMaxDet then begin if AdrSuiv=9996 then Affiche_evt('La position de l''aiguillage '+intToSTR(AigMal)+' est inconnue',clred); - Affiche_evt('Info 1-0 '+intToSTR(AdrSuiv)+' : pas de suivant detecteur_suivant_el '+intToSTR(det1)+' '+intToSTR(det3),clWhite); + Affiche_evt('Info 1-0 '+intToSTR(AdrSuiv)+' : pas de suiv det_suivant_el '+intToSTR(det1)+' '+intToSTR(det3),clWhite); MemZone[det1,det3].etat:=FALSE; // dévalide l'ancienne zone MemZone[det1,det3].train:=''; MemZone[det1,det3].Adrtrain:=0; @@ -17442,7 +17457,7 @@ var decl,op,af,access,sortie,t,v,etat,adr : integer; Ts : TAccessoire; tr : single; begin - // tablo action n'est pas dynamique, mais Tablo_action[].TabloOp oui + // tablo action n'est pas un tableau dynamique, mais Tablo_action[].TabloOp oui if length(Tablo_Action[i].tabloOP)-10 then if seq_actions[index_seqAct].indiceAction=action then exit; // si l'action est déja en cours d'exécution dans le timer, ne pas la relancer nb:=Tablo_Action[action].NbOperations; i:=1; sort:=false; @@ -17750,6 +17766,7 @@ begin if not(fd) and not(fm) then exit; detecteur[adr].Etat:=etat=1; + detecteur[adr].Train:=TrainDecl; end; @@ -18108,7 +18125,6 @@ var dr,i,AdrSuiv,AdrSignal,AdrDetSignal,index,Etat01,AdrPrec,d1,d2,AdrTrain : in TypeSuiv : tequipement; s : string; begin - //Affiche('Event Det '+inTToSTR(adresse)+' '+IntToSTR(etat01)+' '+train,ClCyan); if adresse>NbMaxDet then begin Affiche('Erreur 82 : reçu adresse de détecteur trop grande : '+intToSTR(adresse),clred); @@ -18144,6 +18160,8 @@ begin //if (train='') and (s<>'') then train:=s; if Etat then Etat01:=1 else Etat01:=0; + //Affiche('Event Det '+inTToSTR(adresse)+' '+IntToSTR(etat01)+' '+train,ClCyan); + if traceliste or (debugRoulage and roulage) then Affiche('Event Det '+inTToSTR(adresse)+' '+IntToSTR(etat01),ClCyan); // vérifier si l'état du détecteur est déja stocké, car on peut reçevoir plusieurs évènements pour le même détecteur dans le même état // on reçoit un doublon dans deux index consécutifs. @@ -18205,6 +18223,7 @@ begin if AdrTrain<>0 then begin Maj_detecteurs_canton(i,AdrTrain,Adresse); + train:=detecteur[adresse].train; end; end; inc(i); @@ -18259,12 +18278,19 @@ begin if etat then i:=1 else i:=0; if not(confignulle) then calcul_zones(adresse,true); // *** calcul zones - // gérer l'évènement actionneur pour action - event_act(Adresse,0,i,''); + // gérer l'évènement actionneur pour action sur front montant hors mode CDM + if not(CDM_connecte) then event_act(Adresse,0,i,train); + end; + + // gérer l'évènement actionneur pour action sur état à 1 en mode CDM + // car le nom du train est passé au 2eme message du détecteur à 1 comIP , et donc + // le détecteur n'est plus en front montan + if etat and CDM_connecte then + begin + if train<>'_NONE' then event_act(Adresse,0,i,train); end; // détection fronts descendants - if ancien_detecteur[Adresse] and not(detecteur[Adresse].etat) and (N_Event_det= 28.0} -procedure TFormPrinc.DataReceived(const Data: TidBytes); - var i,l,j,lo : integer; -begin - l:=length(data); - lo:=long_recue; // longueur ancien recu, non encore traité - j:=1; - for i:=lo+1 to lo+l do - begin - chaine_recue[i]:=ord(Data[j]); // mettre recu à la fin - inc(j); - end; - long_recue:=l+lo; - - //if traceTrames then afficheDebug('Tick='+intToSTR(tick)+'/Rec '+chaine_hex(data),clWhite); - interprete_reponse; -end; -{$ELSE} -procedure TFormPrinc.DataReceived(const Data: string); - var i,l,j,lo : integer; -begin - l:=length(data); - lo:=long_recue; // longueur ancien recu, non encore traité - j:=1; - for i:=lo+1 to lo+l do - begin - chaine_recue[i]:=ord(Data[j]); // mettre recu à la fin - inc(j); - end; - long_recue:=l+lo; - - if traceTrames then afficheDebug('Tick='+intToSTR(tick)+'/Rec '+chaine_hex(data),clWhite); - interprete_reponse; -end; -{$IFEND} - procedure tFormPrinc.ClientInfoError(Sender: TObject; Socket: TCustomWinSocket;ErrorEvent: TErrorEvent; var ErrorCode: Integer); begin //Affiche('IE',clyellow); @@ -21301,13 +21297,14 @@ end; // démarrage principal du programme signaux_complexes procedure TFormPrinc.FormCreate(Sender: TObject); -var n,t,i,j,index,OrgMilieu : integer; +var n,t,i,j,index,OrgMilieu,erreur : integer; s,vc : string; trouve : boolean; Sr : TSearchRec; tmP,tmA : tMenuItem; begin menu_deselec; + Etape:=0; Ancien_Nom_Style:=''; Nom_style_aff:='windows'; af:='Client TCP-IP ou USB CDM Rail - Système XpressNet DCC++ Version '+VersionSC+sousVersion; @@ -21328,6 +21325,20 @@ begin FormCompteur[index]:=nil; end; + debug:=0; + if ParamCount<>0 then + begin + s:=lowercase(ParamSTR(1)); + i:=pos('debug=',s); + if i<>0 then + begin + delete(s,1,6); + val(s,debug,erreur); + end; + + procetape('Démarrage'); + end; + BorderStyle:=bsSizeable; Caption:=af; configPrete:=false; // form config prete @@ -21378,7 +21389,8 @@ begin GroupBoxTrains.visible:=true; OffsetXFC:=0; OffsetYFC:=0; - procetape(''); //0 + + procetape('Init'); //0 NbreTCO:=0; N_Trains:=0; IdActTr:=0; @@ -21409,7 +21421,7 @@ begin espY:=15; etat_init_interface:=0; Echelle:=0; - debug:=0; + heure:=0; minute:=0; seconde:=0; @@ -21423,7 +21435,7 @@ begin NbreFL:=0; compteur:=1; - etape:=1; + affevt:=false; EvtClicDet:=false; Algo_localisation:=1; // normal @@ -21591,7 +21603,9 @@ begin cheminWin:=GetCurrentProcessEnvVar('windir')+'\System32'; end; - // création des composants réseaux + ProcEtape('Création des composants réseaux socket'); + + // création des composants réseaux socket // client CDM ClientSocketCDM:=tClientSocket.Create(nil); ClientSocketCDM.OnError:=ClientSocketCDMError; @@ -21781,12 +21795,13 @@ begin N_trains:=0; NumTrameCDM:=0; protocole:=1; - procetape(''); //1 + procetape('Remplissage'); //1 for i:=1 to NbMaxDet do begin Ancien_detecteur[i]:=false; detecteur[i].etat:=false; detecteur[i].train:=''; + detecteur[i].index:=0; end; for i:=0 to IdClients do begin @@ -21835,9 +21850,10 @@ begin procetape('Lecture de la configuration'); lit_config; - clientInfo.Open; // &&& se connecte au serveur SC et envoie les infos + //clientInfo.Open; // &&& se connecte au serveur SC et envoie les infos {$IF CompilerVersion >= 28.0} + procetape('Application des styles'); change_style; {$IFEND} init_horloge; @@ -22336,10 +22352,11 @@ begin end; // traite les taches par le timer -// une tache est piloter un accessoire, une vitesse de train ou une fonction F +// une tache consiste à piloter un accessoire, une vitesse de train ou une fonction F // tableau taches[].typeTache // [].chaine // [].tempo +// Pilote 1 tache du tableau suivant la valeur de pointeurTaches procedure traite_taches; const affe=false; var i,j,fonc,sortie,etat :integer; @@ -22353,7 +22370,6 @@ begin //if affe then Affiche('Tick='+intToSTR(tick)+' Pointeur de taches='+intToSTR(pointeurTaches),clYellow); // pilote accessoire i:=1; - //repeat with taches[i] do begin //if affe then Affiche('Traite adr '+intToSTR(Typetache),clLime); @@ -22455,10 +22471,7 @@ begin //affiche('Pointeur='+intToSTR(pointeurtaches),clred); end; Affiche('Erreur tache typ='+intTOSTR(taches[1].typeTache)+' t='+intToSTR(taches[1].tempo),clred); - exit; - inc(i); - Affiche('INC',clwhite); - //until (i>pointeurtaches); + end; // timer à 100 ms @@ -23898,6 +23911,7 @@ begin end; // évènement détecteur. Si det=1, Le nom du train est souvent _NONE + // mais est envoyé une 2eme fois avec le nom du train // si det=0 le nom du train est toujours _NONE i:=pos('CMDACC-ST_DT',commandeCDM); if i<>0 then @@ -25148,8 +25162,7 @@ begin Maj_icone_train(Image_Train[IdTrainClic],IdTrainClic,clWhite); IdTrainClic:=i; EditAdrTrain.Text:=intToSTR(trains[IdTrainClic].adresse); - //editVitesse.Text:=intToSTR(trains[idTrainClic].vitesseCons); - Maj_icone_train(Image_Train[IdTrainClic],IdTrainClic,$e0e0e0); + change_clic_train(i); //mise à jour compteur train affiche_train_compteur(1); @@ -25262,7 +25275,6 @@ begin if clicTBFen or clicTBGB then exit; if affevt then Affiche('Changement TrackBarVit',clyellow); clicTBTrain:=true; - //EditVitesse.Text:=intToSTR(TrackBarVit.position); s:=editAdrTrain.Text; val(s,adr,erreur); if (erreur<>0) or (adr<0) then @@ -25271,7 +25283,6 @@ begin exit; end; //if not(portCommOuvert) and not(parSocketLenz) and not(CDM_Connecte) then exit; - //s:=editVitesse.Text; val(s,vit,erreur); if (erreur<>0) or (vit<-126) or (vit>126) then begin @@ -25293,14 +25304,6 @@ begin clicTBTrain:=false; end; -procedure TFormPrinc.EditVitesseChange(Sender: TObject); -//var i,e : integer; -begin -{ if pasChgTBV then exit; - val(EditVitesse.Text,i,e); - if (e=0) and (i>=-127) and (i<=128) then TrackBarVit.position:=i;} -end; - procedure TFormPrinc.ButtonEnvClick(Sender: TObject); var se,s : string; begin @@ -26754,7 +26757,8 @@ begin end; // renvoie les 2 points d'entrée et de sortie possibles d'une TJD 4 états en fonction de son état passé en paramètres -procedure TJD4(adr1,pos1,adr2,pos2 : integer;var c1,c2 : char); +// résultat dans C1 et C2 +procedure TJD4(pos1,pos2 : integer;var c1,c2 : char); begin if (pos1=const_droit) and (pos2=const_droit) then begin c1:='D';c2:='D';end; if (pos1=const_devie) and (pos2=const_droit) then begin c1:='D';c2:='S';end; @@ -28427,9 +28431,6 @@ begin Signaux[2].Img.picture.bitmap.width:=l; Signaux[2].Img.picture.bitmap.height:=h; - - - Signaux[2].Img.Canvas.StretchDraw(rect(0,0,l,h),Formprinc.Image7feux.Picture.Bitmap); // .Bitmap:=Image7feux.Picture.Bitmap; exit; @@ -28441,6 +28442,7 @@ begin Signaux[1].Img.Picture.Bitmap.Modified:=True; end; +// changement TrackBar zoom compteurs procedure TFormPrinc.TrackBarZCChange(Sender: TObject); const maxi=10; mini=0; @@ -28459,8 +28461,6 @@ end; procedure TFormPrinc.Propritsdescompteurs1Click(Sender: TObject); begin if affEvt then Affiche('Clic propriétés compteurs',clYellow); - //s:=((Tpopupmenu(Tmenuitem(sender).GetParentMenu).PopupComponent) as TImage).name; // nom du composant, pour récupérer l'index du train (ex: ImageSignal2) - //ligneclicTrain:=extract_int(s)-1; // extraire l'adresse (ex 2) formconfig.PageControl.ActivePage:=formconfig.TabSheetCompt; formconfig.showmodal; formconfig.close; @@ -28474,7 +28474,7 @@ end; procedure TFormPrinc.Dtacherlecompteur1Click(Sender: TObject); begin change_clic_train(IdTrainClic); - formCompteur[1].Show; + formCompteur[1].Show; // prévu plusieurs fenetres détachables pour les compteurs mais on en utilise qu'une, la 1 end; procedure TFormPrinc.PopupMenuCompteursPopup(Sender: TObject); @@ -28484,20 +28484,7 @@ begin menu.Items[1].caption:='Extraire le compteur du train '+trains[IdTrainClic].nom_train; end; -procedure TFormPrinc.Button1Click(Sender: TObject); -var i : integer; -begin - init_aiguillages; - NivDebug:=3; - i:=explore_det(518,523); - if (i<>0) and (i<=MaxCantons) then Affiche(intToSTR(canton[i].numero),clYellow); - AfficheDebug('=========================',clWhite); - i:=explore_det(523,518); - if (i<>0) and (i<=MaxCantons) then Affiche(intToSTR(canton[i].numero),clYellow); - NivDebug:=0; - formDebug.show; -end; procedure TFormPrinc.TrackBarSigChange(Sender: TObject); begin diff --git a/UnitTCO.dfm b/UnitTCO.dfm index 7112524..9b31ae2 100644 --- a/UnitTCO.dfm +++ b/UnitTCO.dfm @@ -1,6 +1,6 @@ object FormTCO: TFormTCO - Left = 187 - Top = 113 + Left = 173 + Top = 188 Width = 1013 Height = 607 VertScrollBar.Visible = False diff --git a/UnitTCO.pas b/UnitTCO.pas index 2e9d31f..8d261f9 100644 --- a/UnitTCO.pas +++ b/UnitTCO.pas @@ -460,6 +460,7 @@ const maxUndo=30; ZoomMax=(8191 div MaxCellX)-1; // pour ne pas dépasser un canvas de 8191 pixel maxi ZoomMin=15; + NomFichier_ch='Nom_fichier'; ClFond_ch='CoulFond'; clVoies_ch='CoulVoies'; clAllume_ch='CoulAllume'; @@ -632,7 +633,7 @@ var route : array[1..500] of record x,y : integer; end; end; - end; + end; // tracé en mode dessin traceXY : Array[1..50] of record x,y : integer; // en coordonnées grille @@ -737,7 +738,7 @@ begin if c<>0 then begin //Affiche('Suppression canton '+intToSTR(c),clorange); - for i:=c to ncantons-1 do // supprime le canton c de la liste + for i:=c to ncantons-1 do // supprime le canton c de la liste des cantons canton[i]:=canton[i+1]; dec(ncantons); end; @@ -1959,6 +1960,15 @@ begin repeat s:=lit_ligne; + sa:=uppercase(NomFichier_ch)+'='; + i:=pos(sa,s); + if i<>0 then + begin + inc(nv); + delete(s,i,length(sa)); // nom stocké + s:=''; + end; + sa:=uppercase(ClFond_ch)+'='; i:=pos(sa,s); if i<>0 then @@ -2529,6 +2539,7 @@ begin AssignFile(fichier,nomfichierTCO[i]); rewrite(fichier); Writeln(fichier,'/ Définitions TCO version '+versionSC+sousversion); + writeln(fichier,NomFichier_ch+'=',NomFichierTCO[i]); writeln(fichier,ZoomInit_ch+'=',ZoomInit[i]); writeln(fichier,XYInit_ch+'=',XInit[i],',',Yinit[i]); Writeln(fichier,clFond_ch+'='+IntToHex(clfond[i],6)); @@ -11470,16 +11481,44 @@ begin //Brush.Style:=Bsclear; xt:=0;yt:=0; - if Bimage=2 then begin xt:=LargeurCell[indexTCO] div 2;yt:=1;end; - if Bimage=3 then begin xt:=3;yt:=hauteurCell[indexTCO]-round(18*fryGlob[indexTCO]);end; - if Bimage=4 then begin xt:=10*round(frxGlob[indexTCO]);yt:=1;end; - if Bimage=5 then begin xt:=3;yt:=hauteurCell[indexTCO]-round(18*fryGlob[indexTCO]);end; - if Bimage=12 then begin xt:=round(33*fryGlob[indexTCO]);yt:=1;end; + if Bimage=2 then begin xt:=round(14*frxGlob[indexTCO]);yt:=1;end; + if Bimage=3 then begin xt:=round(14*frxGlob[indexTCO]);yt:=hauteurCell[indexTCO]-round(18*fryGlob[indexTCO]);end; + if Bimage=4 then begin xt:=round(14*frxGlob[indexTCO]);yt:=1;end; + if Bimage=5 then begin xt:=round(14*frxGlob[indexTCO]);yt:=hauteurCell[indexTCO]-round(18*fryGlob[indexTCO]);end; + if Bimage=12 then begin xt:=round(33*frxGlob[indexTCO]);yt:=1;end; if Bimage=13 then begin xt:=LargeurCell[indexTCO]-round(30*frxGlob[indexTCO]);yt:=hauteurCell[indexTCO]-round(15*fryGlob[indexTCO]);end; if Bimage=14 then begin xt:=LargeurCell[indexTCO]-round(30*frxGlob[indexTCO]);yt:=1;end; - if Bimage=15 then begin xt:=3;yt:=1;end; - if Bimage=21 then begin xt:=-round(5*frxGlob[indexTCO]);yt:=0;end; - if Bimage=22 then begin xt:=(LargeurCell[indexTCO] div 2);yt:=-2;end; + if Bimage=15 then + begin + if (repr=3) then // texte bas + begin + xt:=round(25*frxGlob[indexTCO]);yt:=round(37*fryGlob[indexTCO]); + end + else + begin + xt:=3;yt:=1; + end; + end; + if Bimage=21 then + begin + if (repr=3) then // texte bas + begin + xt:=round(24*frxGlob[indexTCO]);yt:=round(36*fryGlob[indexTCO]); + end else + begin + xt:=-round(5*frxGlob[indexTCO]);yt:=0; + end; + end; + if Bimage=22 then + begin + if (repr=3) then + begin + xt:=-5;yt:=round(38*fryGlob[indexTCO]) // texte bas + end else + begin + xt:=(LargeurCell[indexTCO] div 2);yt:=-2; // texte haut + end; + end; if Bimage=23 then begin xt:=round(33*frxGlob[indexTCO]);yt:=round(35*fryGlob[indexTCO]);end; if Bimage=24 then begin xt:=LargeurCell[indexTCO]-round(20*frxGlob[indexTCO]);yt:=hauteurCell[indexTCO]-round(15*fryGlob[indexTCO]);end; if Bimage=25 then begin xt:=round(34*frxGlob[indexTCO]);yt:=round(8*fryGlob[indexTCO]);end; @@ -12197,7 +12236,7 @@ procedure Erreur_TCO(indexTCO,x,y : integer); var s : string; i,adresse : integer; begin - s:='Erreur 92 TCO - Cellule '+intToSTR(x)+','+intToSTR(y)+' '; + s:='Erreur 92 TCO '+intToSTR(indexTCO)+' - Cellule '+intToSTR(x)+','+intToSTR(y)+' '; adresse:=tco[indextco,x,y].Adresse; i:=index_aig(adresse); if i=0 then s:=s+'aiguillage '+intToSTR(adresse)+' inconnu'; @@ -12869,7 +12908,7 @@ var i,ir,adresse,But,Bimage,direction,ancienX,ancienY,x,y,xn,yn,Xdet1,yDet1,iter Index_TjdHom:=index_aig(TjdHom); // Index de la TJD homologue position2:=aiguillage[Index_TjdHom].position; // position de la TJD homologue - tjd4(adresse,position,TjdHom,position2,c1,c2); // retourne c1 et C2 + tjd4(position,position2,c1,c2); // retourne c1 et C2 if (ancienYx) then // on vient du NE begin if c1=c2 then // si on traverse la TJD @@ -13073,7 +13112,7 @@ var i,ir,adresse,But,Bimage,direction,ancienX,ancienY,x,y,xn,yn,Xdet1,yDet1,iter TjdHom:=aiguillage[index].Ddevie; Index_TjdHom:=index_aig(TjdHom); position2:=aiguillage[Index_TjdHom].position; - tjd4(adresse,position,TjdHom,position2,c1,c2); // retourne c1 et C2 + tjd4(position,position2,c1,c2); // retourne c1 et C2 if (ancienYx) then // on vient du NE begin if c1=c2 then // si on traverse la TJD @@ -13507,7 +13546,7 @@ var i,ir,adresse,But,Bimage,direction,ancienX,ancienY,x,y,xn,yn,Xdet1,yDet1,iter TjdHom:=aiguillage[index].Ddevie; Index_TjdHom:=index_aig(TjdHom); position2:=aiguillage[Index_TjdHom].position; - tjd4(adresse,position,TjdHom,position2,c1,c2); // retourne c1 et C2 + tjd4(position,position2,c1,c2); // retourne c1 et C2 if (ancienY