home *** CD-ROM | disk | FTP | other *** search
/ DP Tool Club 31 / CDASC_31_1996_juillet_aout.iso / index / source / interfac.pas < prev    next >
Pascal/Delphi Source File  |  1996-06-14  |  30KB  |  1,068 lines

  1. { Pourquoi ne pas avoir fait une unite, bonne question, question suivante SVP!
  2.  
  3. Bon, pour ne pas surcharger le source de TROUVE.PAS, j'ai transferé le source
  4. de l'interface ici, c'est crado mais c'est du temporaire qui dure!}
  5.  
  6. TYPE pObjet = ^objet ;
  7.      objet = OBJECT
  8.                    changement : Boolean ;
  9.                    etendu     : Boolean ;
  10.                    X, Y, l, h : Integer ;
  11.  
  12.                    CONSTRUCTOR init (PosX, PosY,
  13.                                      Largeur, Hauteur : Integer) ;
  14.                    PROCEDURE reagit (CH : Char) ;                    VIRTUAL ;
  15.                    FUNCTION focus : Boolean ;
  16.                    PROCEDURE redraw ;                                VIRTUAL ;
  17.                    DESTRUCTOR done ;                                 VIRTUAL ;
  18.              END ;
  19.  
  20.      pListe = ^oListe ;
  21.      oListe = OBJECT (objet)
  22.                      courant,
  23.                      queue,
  24.                      relatif,
  25.                      tete    : pelt ;
  26.  
  27.                      CONSTRUCTOR init ( PosX, PosY,
  28.                                         largeur, hauteur : Integer ) ;
  29.                      PROCEDURE ajoute ( elt : pFichier ) ;
  30.                      PROCEDURE reagit ( CH: Char) ;                  VIRTUAL ;
  31.                      PROCEDURE redraw ;                              VIRTUAL ;
  32.                      DESTRUCTOR done ;                               VIRTUAL ;
  33.               END ;
  34.  
  35.  
  36.      pSaisie = ^oSaisie ;
  37.      oSaisie = OBJECT (objet)
  38.                       maxi   : Integer ;
  39.                       chaine : String  ;
  40.  
  41.                       CONSTRUCTOR init (posx, posy, max : Integer ) ;
  42.                       PROCEDURE reagit (CH : Char) ;                 VIRTUAL ;
  43.                       PROCEDURE redraw ;                             VIRTUAL ;
  44.                END ;
  45.  
  46.      pBoutonCocher = ^oBoutonCocher ;
  47.      oBoutonCocher = OBJECT (objet)
  48.                             etat   : Boolean ;
  49.                             option : String  ;
  50.  
  51.                             CONSTRUCTOR init (posx, posy : Integer ;
  52.                                               chaine : String;
  53.                                               debut : Boolean ) ;
  54.                             PROCEDURE reagit ( CH : Char ) ;         VIRTUAL ;
  55.                             PROCEDURE redraw ;                       VIRTUAL ;
  56.                      END ;
  57.  
  58.      { Je définit un fils de bouton à cocher car il a un comportement
  59.        particulier, il désactive un ensemble de fichier dans la liste des
  60.        fichiers de descriptions, ainsi la partie interface peut être séparé au
  61.        maximum de la partie code proprement dîte. }
  62.  
  63.      pBoutonCocherBis = ^oBoutonCocherBis ;
  64.      oBoutonCocherBis = OBJECT (oBoutonCocher)
  65.                               num : Byte ;
  66.  
  67.                               PROCEDURE reagit ( CH : Char) ;        VIRTUAL ;
  68.                         END ;
  69.  
  70.      pBoutonRadio = ^oBoutonRadio ;
  71.      oBoutonRadio = OBJECT (objet)
  72.                            etat   : Boolean ;
  73.                            option : String  ;
  74.  
  75.                            CONSTRUCTOR init (posx, posy : Integer ;
  76.                                              chaine : String;
  77.                                              debut : Boolean ) ;
  78.                            PROCEDURE reagit ( CH : Char ) ;          VIRTUAL ;
  79.                            PROCEDURE redraw ;                        VIRTUAL ;
  80.                     END ;
  81.  
  82.      pelement = ^telement ;
  83.      telement = RECORD
  84.                       elt  : pobjet   ;
  85.                       suiv : pelement ;
  86.                 END ;
  87.  
  88.  
  89.      pBureau = ^oBureau ;
  90.      oBureau = OBJECT
  91.                      courant,
  92.                      liste : pelement ;
  93.  
  94.                      CONSTRUCTOR init ;
  95.                      PROCEDURE ajoute (elt : pobjet) ;
  96.                      PROCEDURE Exec ;
  97.                      PROCEDURE redraw ;
  98.                      PROCEDURE modifieCourant ;
  99.                      PROCEDURE btg ;
  100.                      DESTRUCTOR done ;
  101.                END ;
  102.  
  103.  
  104.      pGroupeCritere = ^oGroupeCritere ;
  105.      oGroupeCritere = OBJECT (objet)
  106.                              courant : Byte          ;
  107.                              saisie  : psaisie       ;
  108.                              critere : pcritere      ;
  109.                              et      : pboutonradio  ;
  110.                              ou      : pboutonradio  ;
  111.                              non     : pboutoncocher ;
  112.  
  113.                              CONSTRUCTOR init (PosX, PosY : Integer;
  114.                                                lien : pcritere ) ;
  115.                              PROCEDURE reagit ( CH : Char) ;         VIRTUAL ;
  116.                              PROCEDURE redraw ;                      VIRTUAL ;
  117.                              DESTRUCTOR done ;                       VIRTUAL ;
  118.                       END ;
  119.  
  120.  
  121. {=============================================================================
  122.                 D E F I N I T I O N   D E S   O B J E T S
  123.  ============================================================================}
  124.  
  125. {============================================================================}
  126. {****************************** OBJET DE BASE *******************************}
  127. {============================================================================}
  128.  
  129. VAR liste   : pListe     ; { La liste du bureau est globale pour que
  130.                              les boutons puissent interagir avec elle. }
  131.  
  132.  
  133. {============================ Gestion de la souris ==========================}
  134.  
  135. { Je m'en rapelle plus ce qu'elle fait, ah c'est malin d'avoir mis de
  136.   l'assembleur! On comprend plus rien, et puis niveau portabilité chapeau
  137.   vraiment ça vaut bien le coup de payer à prix d'or (?) des enseignants qui
  138.   forcent à programmer sous UNIX en C soit disant portable sur tout système!}
  139. PROCEDURE HideMouse ; ASSEMBLER ;
  140.  
  141. ASM
  142.    mov AX, 2
  143.    Int 33h
  144. END ;
  145.  
  146.  
  147. { Vraiment rien compris, il va falloir tout recommencer... }
  148. PROCEDURE ShowMouse ; ASSEMBLER ;
  149.  
  150. ASM
  151.    mov AX, 1
  152.    Int 33h
  153. END ;
  154.  
  155.  
  156.  
  157. { Renvoie si l'on a appuyé sur un bouton de la souris, je pense.... }
  158. FUNCTION boutonsouris : Boolean ; ASSEMBLER;
  159.  
  160. ASM
  161.    mov AX, 3
  162.    Int $33
  163.    mov AX, BX { Alias Return(BX) :) }
  164. END ;
  165.  
  166.  
  167.  
  168. { Dessine un cadre simple en (x,y) avec une largeur l et une hauteur h. }
  169. PROCEDURE cadre (X, Y, l, h : Integer ) ;
  170.  
  171. VAR i : Byte ;
  172.  
  173. BEGIN
  174.      GotoXY (X + 1, Y) ;
  175.      QWrite (Y, X, '┌');
  176.      FOR i := 2 TO l
  177.          DO
  178.            Write ('─') ;
  179.      Write ('┐') ;
  180.      FOR i := 1 TO Pred (h)
  181.          DO
  182.            BEGIN
  183.                 QWrite (Y + i, X, '│');
  184.                 QWrite (Y + i, X + l, '│');
  185.            END ;
  186.      GotoXY (X + 1, Y + h) ;
  187.      QWrite (Y + h, X, '└');
  188.      FOR i := 2 TO l
  189.          DO
  190.            Write ('─') ;
  191.      Write ('┘') ;
  192. END ;
  193.  
  194.  
  195.  
  196. CONSTRUCTOR objet. init (posx, posy, largeur, hauteur : Integer) ;
  197.  
  198. BEGIN
  199.      X := posx; Y := posy; l := largeur; h := hauteur ;
  200.      etendu := FALSE ;    { Par défauts les codes étendus ne sont pas gérés. }
  201. END ;
  202.  
  203.  
  204. DESTRUCTOR objet. done ;
  205.  
  206. BEGIN { C'est tout?, ca valait bien le coup... Et les procédures abstraites }
  207. END ; { ça existe en C++ alors, hein? }
  208.  
  209.  
  210. PROCEDURE objet. redraw ;
  211.  
  212. BEGIN { Mon dieu quel gachis. }
  213. END ;
  214.  
  215.  
  216. PROCEDURE objet. reagit (CH : Char) ;
  217.  
  218. BEGIN { Ca se trimbale 128Mo de mémoire et 14Go de disque alors tout de
  219.         suite on se laisse aller, et pourquoi pas des commentaires pour
  220.         gonfler le source de façon artificiel de façon à dire:
  221.         "Moi, j'ai codé un programmé qui faisait 2887 lignes..."
  222.         P.S: Gloire aux aventuriers de tout poil qui vérifieront cette
  223.              assertion... }
  224. END ;
  225.  
  226.  
  227. FUNCTION objet. focus : Boolean ;
  228.  
  229. VAR mx, my : Integer ;
  230.  
  231. BEGIN
  232.      ASM
  233.         @looop:
  234.         mov AX , 3
  235.         Int 33h
  236.         cmp BX , 0   { Attente du bouton relaché.. }
  237.         jne @looop
  238.         SHR CX , 3   { Conversion des coordonnées souris en coordonnées }
  239.         SHR DX , 3   { écran entre 1 et 80 et 1 et 25. }
  240.         Inc CX
  241.         Inc DX
  242.         mov mx , CX  { Sauvegarde des résultats dans mx et my. }
  243.         mov my , DX
  244.      END ;
  245.  
  246.      focus := (mx <= X + l) AND (mx >= X) AND (my <= Y + h) AND (my >= Y) ;
  247. END ;
  248.  
  249.  
  250.  
  251. {============================================================================}
  252. {***************************** CHAMP DE SAISIE ******************************}
  253. {============================================================================}
  254.  
  255. CONSTRUCTOR osaisie. init ( Posx, posy, max : Integer ) ;
  256.  
  257. BEGIN
  258.      INHERITED init (posx, posy, max, 1) ;
  259.      chaine := '' ;
  260.      maxi := max ; { Nombre de caractères maximum. }
  261. END ;
  262.  
  263.  
  264.  
  265. PROCEDURE osaisie. reagit (CH : Char) ;
  266.  
  267. BEGIN
  268.      CASE  CH OF
  269.       #8  : Delete (chaine, Length (chaine), 1) ; { BackSpace.    }
  270.       #32..#250 : IF Length (chaine) < maxi       { Autre...      }
  271.                     THEN
  272.                         chaine := chaine + CH ;
  273.      END ;
  274. END ;
  275.  
  276.  
  277.  
  278. PROCEDURE osaisie. redraw ;
  279.  
  280. VAR i : Byte ;
  281.  
  282. BEGIN
  283.      IF Souris
  284.         THEN
  285.             hidemouse ;
  286.      cadre (X, Y, maxi + 2, 2) ;                  { On dessine le cadre.  }
  287.      GotoXY (X + 1 + Length (chaine), Y + 1) ;
  288.      QWrite (Y + 1, X + 1, chaine) ;              { On écrit la chaîne.   }
  289.      FOR i := Length (chaine) TO maxi             { On efface ensuite.    }
  290.          DO
  291.            Write (' ') ;
  292.      GotoXY (X + 1 + Length (chaine), Y + 1) ;    { Repositionnement à la }
  293.      IF Souris                                    { fin de la chaîne.     }
  294.         THEN
  295.             ShowMouse ;
  296.      ShowCursor ;
  297. END ;
  298.  
  299.  
  300.  
  301. {============================================================================}
  302. {***************************** BOUTON A COCHER ******************************}
  303. {============================================================================}
  304.  
  305. CONSTRUCTOR oboutoncocher. init (posx, posy : Integer;
  306.                                  chaine : String ; debut : Boolean ) ;
  307.  
  308. BEGIN
  309.      option     := chaine ;
  310.      etat       := debut  ;
  311.      changement := FALSE  ;
  312.      INHERITED init (posx, posy , Length (option) + 4, 0) ;
  313. END ;
  314.  
  315.  
  316.  
  317. PROCEDURE oboutoncocher. redraw ;
  318.  
  319. BEGIN
  320.      IF Souris
  321.         THEN
  322.             hidemouse ;
  323.      HideCursor ;
  324.      GotoXY (X, Y) ;
  325.      Write ('[ ] ', option) ;
  326.      IF etat
  327.         THEN
  328.             BEGIN
  329.                  GotoXY (X + 1, Y) ;
  330.                  Write ('X') ;
  331.             END ;
  332.      IF Souris
  333.         THEN
  334.             showmouse ;
  335. END ;
  336.  
  337.  
  338. PROCEDURE oboutoncocher. reagit (CH  : Char ) ;
  339.  
  340. BEGIN
  341.      IF (CH = #32) OR (CH = #1)
  342.         THEN
  343.             BEGIN
  344.                  changement := TRUE ;
  345.                  etat := NOT (etat) ;
  346.             END ;
  347. END ;
  348.  
  349.  
  350.  
  351. {============================================================================}
  352. {*********************************** LISTE **********************************}
  353. {============================================================================}
  354.  
  355. CONSTRUCTOR oListe. init ( PosX, PosY, largeur, hauteur : Integer );
  356.  
  357. VAR temp : pfichier ;
  358.  
  359. BEGIN
  360.      tete := NIL ;
  361.      INHERITED init (PosX, PosY, largeur, hauteur) ;
  362.      etendu  := TRUE ;
  363.      courant := tete ;
  364.      relatif := tete ;
  365. END ;
  366.  
  367.  
  368.  
  369. { Insère un élément dans la liste. }
  370.  
  371. PROCEDURE oListe. ajoute ( elt : pfichier ) ;
  372.  
  373. VAR temp : pelt ;
  374.  
  375. BEGIN
  376.      IF tete = NIL
  377.         THEN
  378.             BEGIN
  379.                  New (tete) ;
  380.                  temp := tete ;
  381.                  relatif := tete ;
  382.                  courant := tete ;
  383.             END
  384.         ELSE
  385.             BEGIN
  386.                  temp := tete ;
  387.                  WHILE temp^. suiv <> NIL
  388.                        DO
  389.                          temp := temp^. suiv ;
  390.                  New (temp^. suiv) ;
  391.                  temp := temp^. suiv ;
  392.             END ;
  393.      temp^. elt := elt ;
  394.      temp^. suiv := NIL ;
  395. END ;
  396.  
  397.  
  398.  
  399. { Une procédure de 150 lignes et bien c'est du propre! }
  400.  
  401. PROCEDURE oListe. reagit ( CH : Char ) ;
  402.  
  403. VAR modif : Boolean ;
  404.     temp  : pelt ;
  405.  
  406.  PROCEDURE haut ;
  407.  
  408.  BEGIN
  409.       { Recherche du précédent de relatif. }
  410.       IF relatif = tete
  411.          THEN
  412.              BEGIN
  413.                   modif := FALSE ;
  414.                   Exit ;
  415.              END ;
  416.       temp := tete ;
  417.       WHILE temp^. suiv <> relatif
  418.             DO
  419.               temp := temp^. suiv;
  420.       relatif := temp ;
  421.       courant := relatif ;
  422.  END ;
  423.  
  424.  PROCEDURE bas ;
  425.  
  426.  VAR i : Byte ;
  427.  
  428.  BEGIN
  429.       { Recherche du suivant de relatif. }
  430.       IF relatif^. suiv = NIL
  431.          THEN
  432.              BEGIN
  433.                   modif := FALSE ;
  434.                   Exit ;
  435.              END ;
  436.       temp := relatif^. suiv ;
  437.       { On vérifie que la liste en-dessous est pleine. }
  438.       i := 1 ;
  439.       WHILE (i <> h - 1) AND (temp <> NIL)
  440.             DO
  441.               BEGIN
  442.                    temp := temp^. suiv ;
  443.                    Inc (i) ;
  444.               END ;
  445.       IF (temp <> NIL)
  446.          THEN
  447.              BEGIN
  448.                   relatif := relatif^. suiv ;
  449.                   courant := temp ;
  450.              END
  451.          ELSE
  452.              modif := FALSE ;
  453.  END ;
  454.  
  455.  
  456.  PROCEDURE descend;
  457.  
  458.  BEGIN
  459.       IF courant = queue
  460.          THEN
  461.              bas           { On est en bas de la liste. }
  462.          ELSE
  463.              courant := courant^. suiv ;
  464.  END ;
  465.  
  466.  
  467.  PROCEDURE monte ;
  468.  
  469.  BEGIN
  470.       IF courant = relatif
  471.          THEN
  472.              haut          { On est en haut de la liste. }
  473.          ELSE
  474.              BEGIN
  475.                   temp := tete ;
  476.                   IF courant = tete
  477.                      THEN
  478.                          Exit ;
  479.                   WHILE temp^. suiv <> courant
  480.                         DO
  481.                           temp := temp^. suiv ;
  482.                   courant := temp ;
  483.              END ;
  484.  END ;
  485.  
  486.  
  487.  PROCEDURE btg ;
  488.  
  489.   PROCEDURE element (nb : Byte ) ;
  490.  
  491.   VAR i    : Byte ;
  492.  
  493.   BEGIN
  494.        { On cherche l'élément nb et l'on change son état, s'il existe. }
  495.        temp := relatif ;
  496.        i := 1 ;
  497.        WHILE (i <> nb) AND (temp <> NIL)
  498.              DO
  499.                BEGIN
  500.                     Inc (i) ;
  501.                     temp := temp^. suiv ;
  502.                END ;
  503.        IF temp = NIL
  504.           THEN
  505.               BEGIN
  506.                    modif := FALSE ;
  507.                    Exit ;
  508.               END ;
  509.        courant := temp ;
  510.        courant^. elt^. etat := NOT (courant^. elt^. etat );
  511.   END ;
  512.  
  513.  
  514.  VAR mx, my : Integer ;
  515.  
  516.  BEGIN
  517.       { Récupération dans mx et my des coordonnées de la souris. }
  518.       ASM
  519.          mov AX, 3
  520.          Int 33h
  521.          SHR CX, 3
  522.          SHR DX, 3
  523.          Inc CX
  524.          Inc DX
  525.          mov mx, CX
  526.          mov my, DX
  527.       END ;
  528.       { Clic sur l'une des flêches. }
  529.       IF (mx = X + l) AND (my = Y + 1)
  530.          THEN
  531.              monte ;
  532.       IF (mx = X + l) AND (my = Y + h - 1)
  533.          THEN
  534.              descend ;
  535.       { Clic dans un élément de la liste. }
  536.       IF (mx < X + l ) AND (mx > X ) AND (my > Y) AND (my < Y + h)
  537.          THEN
  538.              element (my - Y) ;
  539.  END ;
  540.  
  541.  
  542. BEGIN
  543.      CASE CH OF
  544.       #1  : btg ;                { Clic souris. }
  545.       'P' : descend;             { Flêche bas.  }
  546.       'H' : monte ;
  547.       #32 : courant^. elt^. etat := NOT (courant^. elt^. etat) ;
  548.      END ;
  549. END ;
  550.  
  551.  
  552. PROCEDURE oListe. redraw ;
  553.  
  554. VAR i, j : Byte ;
  555.     temp : pelt ;
  556.     old  : Byte ;
  557.  
  558. BEGIN
  559.      HideCursor ;
  560.      IF Souris
  561.         THEN
  562.             hidemouse ;
  563.      cadre (X, Y, l, h) ;
  564.  
  565.      temp := relatif ;
  566.  
  567.      { On force la surintensité. }
  568.      old := Lo (TextAttr) ;
  569.      old := old AND $f ;
  570.  
  571.      i := 1 ;
  572.      WHILE (i < h )
  573.           DO
  574.            BEGIN
  575.                 IF temp <> NIL THEN
  576.                 BEGIN
  577.                      IF temp = courant
  578.                         THEN
  579.                             TextColor (LightRed) ;
  580.                      IF temp^. elt^. etat
  581.                         THEN
  582.                             QWrite (Y + i, X + 1, ' √ ' + temp^. elt^. nom)
  583.                         ELSE
  584.                             QWrite (Y + i, X + 1, '   ' + temp^. elt^. nom) ;
  585.                      TextColor (old) ;
  586.                      GotoXY (X + 4 + Length (temp^. elt^. nom), Y + i) ;
  587.                      FOR j := 1 TO l - 4 - Length (temp^. elt^. nom)
  588.                          DO
  589.                            Write (' ') ;
  590.                      Write ('░') ;
  591.                      queue := temp ;
  592.                      temp := temp^. suiv ;
  593.                      Inc (i) ;
  594.                 END
  595.                 ELSE
  596.                 BEGIN
  597.                      FOR j := 1 TO l - 1 DO
  598.                          QWrite (Y + i, X + j, ' ');
  599.                      Inc (i) ;
  600.                 END ;
  601.            END ;
  602.      QWrite (Y + 1, X + l, '');
  603.      QWrite (Y + h - 1, X + l, '');
  604.      IF Souris
  605.         THEN
  606.             ShowMouse ;
  607. END ;
  608.  
  609.  
  610. DESTRUCTOR oListe. done ;
  611.  
  612. BEGIN
  613.      courant := tete ;
  614.      WHILE tete <> NIL
  615.            DO
  616.              BEGIN
  617.                   courant := tete^. suiv ;
  618.                   Dispose (tete );
  619.                   tete := courant ;
  620.              END ;
  621. END ;
  622.  
  623.  
  624.  
  625.  
  626. {============================================================================}
  627. {******************************** BOUTON RADIO ******************************}
  628. {============================================================================}
  629.  
  630. CONSTRUCTOR OBoutonRadio. init (posx, posy : Integer ; chaine : String;
  631.                                 debut : Boolean ) ;
  632.  
  633. BEGIN
  634.      option     := chaine ;
  635.      etat       := debut  ;
  636.      changement := FALSE  ;
  637.      INHERITED init (posx, posy , Length (option) + 4, 0) ;
  638. END ;
  639.  
  640.  
  641.  
  642. PROCEDURE oBoutonRadio. reagit ( CH : Char ) ;
  643.  
  644. BEGIN
  645.      CASE CH OF
  646.       #0 : etat := TRUE ;  { On le force à vrai avec #0. }
  647.       #1 : etat := FALSE ; { On le force à faux. }
  648.       ELSE Exit ;          { On ignore tous les autres caractères. }
  649.      END ;
  650.      changement := TRUE ;
  651. END ;
  652.  
  653.  
  654.  
  655. PROCEDURE oBoutonRadio. redraw ;
  656.  
  657. BEGIN
  658.      IF Souris
  659.         THEN
  660.             hidemouse ;
  661.      QWrite (Y, X, '( ) ' + option) ;
  662.      IF etat
  663.         THEN
  664.             QWrite (Y, X + 1, #7);
  665.      IF Souris
  666.         THEN
  667.             showmouse ;
  668. END ;
  669.  
  670.  
  671.  
  672. {============================================================================}
  673. {******************************** OBJET CRITERE *****************************}
  674. {============================================================================}
  675.  
  676. CONSTRUCTOR oGroupeCritere. init (PosX, PosY : Integer; lien : pcritere) ;
  677.  
  678. BEGIN
  679.      critere := lien ;
  680.      courant := 4 ;
  681.      saisie := New (psaisie, init (PosX, PosY + 1, 40) ) ;
  682.      saisie^. chaine := lien^. champ ;
  683.      non    := New (pboutoncocher, init (PosX, PosY, 'Non', FALSE) ) ;
  684.      non^. etat := lien^. negation ;
  685.      et     := New (pboutonradio, init (PosX + 17, PosY, 'Et', TRUE) ) ;
  686.      et^. etat := (lien^. transition = 1) ;
  687.      ou     := New (pboutonradio, init (PosX + 35, PosY, 'Ou', FALSE) ) ;
  688.      ou^. etat := (lien^. transition = 1) ;
  689.      INHERITED init (PosX, PosY, 40, 2) ;
  690. END ;
  691.  
  692.  
  693.  
  694. PROCEDURE oGroupeCritere. reagit (CH: Char) ;
  695.  
  696.  PROCEDURE react ;
  697.  
  698.  BEGIN
  699.       CASE courant OF
  700.        1 : non^. reagit (CH) ;
  701.        2 : BEGIN
  702.                 et^. reagit (#0) ; { Et vrai. }
  703.                 ou^. reagit (#1) ; { Ou faux. }
  704.            END ;
  705.        3 : BEGIN
  706.                 et^. reagit (#1) ; { l'inverse du dessus. }
  707.                 ou^. reagit (#0) ;
  708.            END ;
  709.        4 : saisie^. reagit (CH) ;
  710.       END ;
  711.       courant := 4 ;
  712.  END ;
  713.  
  714.  
  715.  PROCEDURE btg ;
  716.  
  717.  VAR temp : Byte ;
  718.  
  719.  BEGIN
  720.       temp := courant ;
  721.       courant := 0 ;
  722.       { On cherche si on a cliqué sur un objet, si oui on modifie l'objet
  723.         courant. }
  724.       IF (non^. focus)
  725.          THEN
  726.              courant := 1 ;
  727.       IF (et^. focus)
  728.          THEN
  729.              courant := 2 ;
  730.       IF (ou^. focus)
  731.          THEN
  732.              courant := 3 ;
  733.       IF (saisie^. focus)
  734.          THEN
  735.              courant := 4 ;
  736.       { Si on a cliqué sur un objet du groupe critère. }
  737.       IF (temp = courant) OR (courant <> 0)
  738.          THEN
  739.              BEGIN
  740.                   CH := #1;
  741.                   react ;
  742.              END ;
  743.  END ;
  744.  
  745.  
  746. BEGIN
  747.      CASE CH OF
  748.       #1     : btg ;
  749.       #32    : react ;
  750.       Ctrl_N : BEGIN
  751.                     Courant := 1 ;
  752.                     CH := #32 ;  { Force le basculement de la case à cocher. }
  753.                     react ;
  754.                END ;
  755.       Ctrl_E : BEGIN
  756.                     Courant := 2 ;
  757.                     react ;
  758.                END ;
  759.       Ctrl_O : BEGIN
  760.                     Courant := 3 ;
  761.                     react ;
  762.                END ;
  763.       ELSE
  764.           IF courant = 4
  765.              THEN
  766.                  saisie^. reagit (CH)
  767.              ELSE
  768.                  Exit ;
  769.      END ;
  770. END ;
  771.  
  772.  
  773.  
  774. PROCEDURE oGroupeCritere. redraw ;
  775.  
  776. BEGIN
  777.      ASM                               { On sauvegarde les attributs sur la }
  778.         mov AL, TextAttr               { pile ca évite de déclarer une      }
  779.         push AX                        { variable temporaire....            }
  780.      END ;
  781.      TextColor (7) ;                   { On grise les autres champs.        }
  782.      non^. redraw ;
  783.      et^. redraw ;
  784.      ou^. redraw ;
  785.      saisie^. redraw ;
  786.      ASM                               { On récupère l'ancien attribut.     }
  787.         pop AX
  788.         mov TextAttr, AL
  789.      END ;
  790.      IF (TextAttr AND $f) = 07         { Si la couleur était gris clair.    }
  791.         THEN
  792.             Exit ;                     { alors on sort sans activer le champ}
  793.      TextColor (15) ;                  { On active le champ courant.        }
  794.      CASE courant OF
  795.       1 : non^. redraw ;
  796.       2 : et^. redraw ;
  797.       3 : ou^. redraw ;
  798.       4 : saisie^. redraw ;
  799.      END ;
  800.      critere^. negation := non^. etat ; { On récupère le contenu des champs. }
  801.      critere^. champ := saisie^. chaine ;
  802.      IF et^. etat
  803.         THEN
  804.             critere^. transition := 1
  805.         ELSE
  806.             critere^. transition := 2 ;
  807. END ;
  808.  
  809.  
  810.  
  811. DESTRUCTOR oGroupeCritere. done ;
  812.  
  813. BEGIN
  814.      Dispose (saisie, done) ;
  815.      Dispose (ou, done) ;
  816.      Dispose (et, done) ;
  817.      Dispose (non, done) ;
  818. END ;
  819.  
  820.  
  821.  
  822.  
  823. {============================================================================}
  824. {******************************** OBJET BUREAU ******************************}
  825. {============================================================================}
  826.  
  827. CONSTRUCTOR oBureau. init ;
  828.  
  829. BEGIN
  830.      liste := NIL ;
  831.      courant := NIL ;
  832. END ;
  833.  
  834.  
  835.  
  836. PROCEDURE oBureau. ajoute (elt : pobjet) ;
  837.  
  838. BEGIN
  839.      IF liste = NIL
  840.         THEN
  841.             BEGIN
  842.                  New (liste) ;
  843.                  courant := liste ;
  844.             END
  845.         ELSE
  846.             BEGIN
  847.                  courant := liste ;
  848.                  WHILE (courant^. suiv <> NIL)
  849.                        DO
  850.                          courant := courant^. suiv ;
  851.                  New (courant^. suiv ) ;
  852.                  courant := courant^. suiv ;
  853.             END ;
  854.      courant^. elt := elt ;
  855.      courant^. suiv := NIL ;
  856. END ;
  857.  
  858.  
  859.  
  860. PROCEDURE oBureau. Exec ;
  861.  
  862. VAR CH   : Char     ;
  863.     fini : Boolean  ;
  864.     temp2,
  865.     temp : pelement ;
  866.  
  867.  PROCEDURE attente_evenement ;
  868.  
  869.  BEGIN
  870.      IF Souris
  871.         THEN
  872.             REPEAT
  873.             UNTIL (KeyPressed) OR (boutonsouris)
  874.         ELSE
  875.             REPEAT
  876.             UNTIL (KeyPressed) ;
  877.       IF KeyPressed
  878.          THEN
  879.              CH := ReadKey
  880.          ELSE
  881.              CH := #1 ;
  882.  END ;
  883.  
  884.  
  885. BEGIN
  886.      fini := FALSE ;
  887.      courant := liste ;
  888.      redraw ;
  889.      IF Souris
  890.         THEN
  891.             BEGIN
  892.                  ASM
  893.                     mov AX, 0
  894.                     Int 33h
  895.                  END ;
  896.                  ShowMouse ;
  897.             END ;
  898.  
  899.      WHILE NOT (fini)
  900.            DO
  901.              BEGIN
  902.                   temp := courant ;
  903.                   attente_evenement ;
  904.                   CASE CH OF
  905.                   #9  : IF courant^. suiv <> NIL { Tab }
  906.                            THEN
  907.                                courant := courant^. suiv
  908.                            ELSE
  909.                                courant := liste ;
  910.                   #27 : BEGIN
  911.                              esc  := FALSE ;
  912.                              fini := TRUE ;
  913.                         END ;
  914.                   #13 : fini := TRUE ; { Return }
  915.                   #0  : BEGIN
  916.                              CH := ReadKey ;
  917.                              CASE CH OF
  918.                               #15 :{ Shift-Tab }
  919.                                     BEGIN
  920.                                          IF courant = liste
  921.                                             THEN
  922.                                                 courant := NIL ;
  923.                                          temp2 := liste ;
  924.                                          WHILE temp2^. suiv <> courant
  925.                                                DO
  926.                                                  temp2 := temp2^. suiv ;
  927.                                          courant := temp2 ;
  928.                                     END ;
  929.                               ELSE
  930.                                   IF courant^. elt^. etendu
  931.                                      THEN
  932.                                          BEGIN
  933.                                               courant^. elt^. reagit (CH) ;
  934.                                               courant^. elt^. redraw ;
  935.                                          END ;
  936.                              END ;
  937.                         END ;
  938.                   #14 : BEGIN
  939.                              CH := Ctrl_N ;
  940.                              courant^. elt^. reagit (CH) ;
  941.                              courant^. elt^. redraw ;
  942.                         END ;
  943.                   #15 : BEGIN
  944.                              CH := Ctrl_O ;
  945.                              courant^. elt^. reagit (CH) ;
  946.                              courant^. elt^. redraw ;
  947.                         END ;
  948.                   #5 : BEGIN
  949.                             CH := Ctrl_E ;
  950.                             courant^. elt^. reagit (CH) ;
  951.                             courant^. elt^. redraw ;
  952.                        END ;
  953.                   #1  : BEGIN
  954.                              btg ;
  955.                              courant^. elt^. redraw ;
  956.                         END ;
  957.                   ELSE
  958.                       BEGIN
  959.                            courant^. elt^. reagit (CH) ;
  960.                            courant^. elt^. redraw ;
  961.                       END ;
  962.                   END ;
  963.                   IF temp <> courant
  964.                      THEN
  965.                          BEGIN
  966.                               TextColor (7) ;
  967.                               temp^. elt^. redraw ;
  968.                               TextColor (15) ;
  969.                               courant^. elt^. redraw ;
  970.                          END ;
  971.              END ;
  972. END ;
  973.  
  974.  
  975.  
  976. PROCEDURE oBureau. redraw ;
  977.  
  978. VAR temp : pelement ;
  979.  
  980. BEGIN
  981.      temp := liste ;
  982.      ASM
  983.         { Wait For Retrace }
  984.         MOV DX, $3DA
  985.         @RT:
  986.         IN AL, DX
  987.         Test AL, 8
  988.         JZ @RT
  989.      END ;
  990.      WHILE temp <> NIL
  991.            DO
  992.              BEGIN
  993.                   TextColor (7) ;
  994.                   temp^. elt^. redraw ;
  995.                   temp := temp^. suiv ;
  996.              END ;
  997.      TextColor (15) ;
  998.      courant^. elt^. redraw ;
  999. END ;
  1000.  
  1001.  
  1002.  
  1003. PROCEDURE oBureau. modifieCourant ;
  1004.  
  1005. VAR temp : pelement ;
  1006.  
  1007. BEGIN
  1008.      { On cherche l'élément sélectionné à la souris. }
  1009.      temp := liste ;
  1010.      WHILE (temp <> NIL) AND (NOT temp^. Elt^. focus)
  1011.            DO
  1012.              temp := temp^. suiv ;
  1013.  
  1014.      { Si aucun n'est sélectionné alors on quitte. }
  1015.      IF temp = NIL
  1016.         THEN
  1017.             Exit ;
  1018.  
  1019.      courant := temp ;
  1020.      courant^. elt^. reagit (#1) ;
  1021. END ;
  1022.  
  1023.  
  1024.  
  1025. PROCEDURE oBureau. btg ;
  1026.  
  1027. BEGIN
  1028.      IF courant^. elt^. focus
  1029.         THEN
  1030.             courant^. elt^. reagit (#1)
  1031.         ELSE
  1032.             ModifieCourant ;
  1033. END ;
  1034.  
  1035.  
  1036.  
  1037. DESTRUCTOR oBureau. done ;
  1038.  
  1039. BEGIN
  1040.      courant := liste ;
  1041.      WHILE liste <> NIL
  1042.            DO
  1043.              BEGIN
  1044.                   liste := courant^. suiv ;
  1045.                   Dispose (courant^. elt, done) ;
  1046.                   Dispose (courant) ;
  1047.                   courant := liste ;
  1048.              END ;
  1049. END ;
  1050.  
  1051.  
  1052. {============================================================================}
  1053. {**************************** OBJET BoutonCocherBis *************************}
  1054. {============================================================================}
  1055.  
  1056. PROCEDURE OBoutonCocherBis. reagit (CH : Char) ;
  1057.  
  1058. BEGIN
  1059.      INHERITED reagit (CH) ;
  1060.      IF changement
  1061.         THEN
  1062.             BEGIN
  1063.                  bascule (num, etat) ;
  1064.                  TextColor (7) ;
  1065.                  liste^. redraw ; { Mise à jour de l'affichage de la liste. }
  1066.                  TextColor (15) ;
  1067.             END ;
  1068. END ;