IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Turbo Pascal Discussion :

Affichage dynamique sous Turbo Vision [Turbo Pascal]


Sujet :

Turbo Pascal

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Rédacteur/Modérateur

    Avatar de Roland Chastain
    Homme Profil pro
    Enseignant
    Inscrit en
    Décembre 2011
    Messages
    4 172
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Décembre 2011
    Messages : 4 172
    Billets dans le blog
    9
    Par défaut Affichage dynamique sous Turbo Vision
    Bonjour !

    J'ai toujours en tête de faire un jeu sous Turbo Vision.

    Pour le moment, j'ai un objet de type TView qui peut devenir un damier, une grille de Puissance-4, ou tout ce qu'on voudra.

    Mon problème, c'est d'arriver à le faire varier. Comment puis-je 1° modifier le contenu de l'objet 2° renouveler l'affichage ?

    Voici un code que je viens d'écrire. Comment, d'après vous, rendre dynamique l'objet Bidule ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    Program EX001A;
    Uses
      App, Objects, Views;
     
    Type
      PMyView=^TMyView;
     
      TMyView=Object(TView)
        Procedure Draw; Virtual;
      End;
     
      TMyApp=Object(TApplication)
        Bidule: PMyView;
        Constructor Init;
      End;
     
    Procedure TMyView.Draw;
    Var
      i: Integer;
      c: Char;
    Begin
      c:='a';
      Inherited Draw;
      For i:=1 to 17 do WriteChar(1, i, c, i, 27);
    End;
     
    Constructor TMyApp.Init;
    Var r: TRect;
    Begin
      Inherited Init;
      r.Assign(1,1,30,20);
      Bidule:=New(PMyView,Init(r));
      Desktop^.Insert(Bidule);
    End;
     
    Var MyApp: TMyApp;
     
    Begin
      MyApp.Init;
      MyApp.Run;
      MyApp.Done;
    End.

  2. #2
    Rédacteur/Modérateur

    Avatar de Roland Chastain
    Homme Profil pro
    Enseignant
    Inscrit en
    Décembre 2011
    Messages
    4 172
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Décembre 2011
    Messages : 4 172
    Billets dans le blog
    9
    Par défaut
    Voici deux exemples qui répondent partiellement au problème.

    L'objet de type TView (l'instance de la classe TView) est réinitialisé autant de fois qu'il le faut, par la simple répétition de l'instruction Bidule:=New(pBidule,Init(r));. N'ayant vu cela dans aucun exemple, je m'étais imaginé qu'on n'avait "le droit" d'appeler le constructeur de l'objet qu'une seule fois.

    Ce que je trouve intéressant aussi dans ces exemples, c'est qu'à la place de l'instruction application.run;, il y a un programme ordinaire qui réalise les opérations une par une. C'est sûrement une mauvaise façon d'utiliser les objets de Turbo Vision, mais pour étudier pas-à-pas le comportement de ces objets, c'est plutôt bien.

    Le premier exemple affiche des caractères dont la couleur change lorsqu'on appuie sur une touche. Dans le deuxième exemple, c'est la position du caractère qui varie.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    program EX006B; uses Objects, Views, Dialogs, App, Crt;
     
    type
      pBidule = ^tBidule;
      tBidule = object(tView)
        procedure Draw; virtual;
      end;
     
     
    var
      a       : tApplication;
      Bidule  : pBidule;
      couleur : byte;
      r       : tRect;
     
    procedure tBidule.Draw;
     
    begin
      Inherited Draw;
      WriteChar(0, 0, '*', couleur, 8);
    end;
     
     
    BEGIN
      a.Init;
     
      r.Assign(1, 1, 9, 2);
     
      couleur:=1; { Les caractères s'affichent en bleu }
     
      Bidule:=New(pBidule,Init(r));
      Desktop^.Insert(Bidule);
      Readkey;    { On appuie sur une touche }
     
      couleur:=3; { Les caractères s'affichent en gris }
     
      Bidule:=New(pBidule,Init(r));
      Desktop^.Insert(Bidule);
      ReadKey;    { On appuie sur une touche pour quitter le programme }
     
      a.Done;
    END.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    program EX006C; uses Objects, Views, Dialogs, App, Crt;
     
    type
      pBidule = ^tBidule;
      tBidule = object(tView)
        procedure Draw; virtual;
      end;
     
     
    var
      a       : tApplication;
      Bidule  : pBidule;
      x       : byte;
      r       : tRect;
     
    procedure tBidule.Draw;
     
    begin
      Inherited Draw;
      WriteChar(x, 0, '*', 1, 1);
    end;
     
     
    BEGIN
      a.Init;
     
      r.Assign(1, 1, 20, 2);
     
      x:=0;
     
      Repeat
     
        Bidule:=New(pBidule,Init(r));
        Desktop^.Insert(Bidule);
        x := (x + 1) mod 20;
        Delay(100);
     
      Until KeyPressed;
     
      a.Done;
    END.

  3. #3
    Rédacteur/Modérateur
    Avatar de M.Dlb
    Inscrit en
    Avril 2002
    Messages
    2 466
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations forums :
    Inscription : Avril 2002
    Messages : 2 466
    Par défaut
    Hello,

    Plusieurs choses... Déjà c'est une mauvaise idée d'appeler plusieurs fois un constructeur sans appel de Free/Done entre temps. Car la mémoire associé à cet objet n'est pas libéré correctement...

    Ensuite, Application.Run permet de lancer la boucle de gestion des évènements. Alors oui, il est possible de s'en passer si on programme à la mode "procédurale" mais Turbo Vision permet de gérer des évènements, on retrouve un peu le comportement des fenêtres Windows, avec des évènements type "appui d'une touche", "clic de souris", etc... Se reporter à TEvent pour plus d'infos...

    On arrive presque à une application Delphi-Like avec Turbo Vision, avec un peu plus de simplicité car on ne gère pas tous les types d'évènements. Il est d'ailleurs possible de créer ses propres évènements pour faire communiquer les composants entre eux... Très pratique (à voir dans le tutoriel Programmation Avancé).

    Troisième point : on peut provoquer le "re-dessin" d'un objet View avec la méthode Redraw.

    Pour ton programme, tu peux très bien créer un objet TDamier avec sa propre gestion des touches/souris, et créer un objet TPuissance4 avec sa propre gestion aussi. Rien ne t'empêche alors, de proposer l'affichage de l'un ou l'autre (dans une windows ou non !) à travers un menu par exemple

  4. #4
    Rédacteur/Modérateur

    Avatar de Roland Chastain
    Homme Profil pro
    Enseignant
    Inscrit en
    Décembre 2011
    Messages
    4 172
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Décembre 2011
    Messages : 4 172
    Billets dans le blog
    9
    Par défaut
    Merci pour ces indications. Je vais revoir ma copie.

  5. #5
    Rédacteur/Modérateur

    Avatar de Roland Chastain
    Homme Profil pro
    Enseignant
    Inscrit en
    Décembre 2011
    Messages
    4 172
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Décembre 2011
    Messages : 4 172
    Billets dans le blog
    9
    Par défaut Gestion de la souris sous Turbo Vision
    Une autre pièce du puzzle.

    Je ne sais plus où j'ai trouvé ce code. J'ai mis les textes en français et fait d'autres modifications. Ajouté notamment cette petite fonction reprise d'un exemple de Paul TOTH:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Function IntToStr2(i: Integer): string; Var s: string;
    Begin
      Str(i, s); If i < 10 Then s := '0' + s; IntToStr2 := s;
    End;
    Le programme affiche dans une fenêtre les coordonnées de la souris ainsi que le bouton dont on s'est servi pour cliquer.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    Program EX021A; Uses Objects, Views, App, Drivers, TextView, Menus;
     
    { EXEMPLE DE GESTION DE LA SOURIS SOUS TURBO VISION }
     
    Type
      Pw=^Tw;
     
      Tw=Object(TWindow)
        t: Text;
        p: PTerminal;
        Constructor Init;
        Procedure HandleEvent(Var e:TEvent); Virtual;
      End;
     
      Ta=Object(TApplication)
        Constructor Init;
        Procedure InitStatusLine; Virtual;
      End;
     
    Constructor Tw.Init;
    Var
      r: TRect; hor, ver: PScrollBar;
     
    Begin
      Desktop^.GetExtent(r);
      Inherited Init(r, 'Cliquez dans la fenˆtre!', wnNoNumber);
     
      r.Grow(-1, -1);
     
      hor := StandardScrollBar(sbHorizontal Or sbHandleKeyboard);
      ver := StandardScrollBar(sbVertical Or sbHandleKeyboard);
      (*
      Insert(h);
      Insert(v);
      *)
      New(p,Init(r, hor, ver, 8192));
     
      If Application^.ValidView(p)<>nil Then
      Begin
        AssignDevice(t,p);
        Rewrite(t);
        Insert(p);
      End;
    End;
     
    Function IntToStr2(i: Integer): string; Var s: string;
    Begin
      Str(i, s); If i < 10 Then s := '0' + s; IntToStr2 := s;
    End;
     
    Procedure Tw.HandleEvent(Var e: TEvent);
    Begin
     
      If e.What And evMouseDown<>0 Then
      Begin
     
        If e.Buttons And mbLeftButton<>0 Then
     
          Write(t,'bouton gauche')
     
        Else
     
          Write(t,'bouton droit ');
     
        Writeln(t, ' (', IntToStr2(e.Where.X), ',', IntToStr2(e.Where.Y), ')');
     
      End;
      Inherited HandleEvent(e);
    End;
     
    Constructor Ta.Init;
    Var
      w: Pw;
    Begin
      Inherited Init;
      New(w,Init);
      If ValidView(w)<>nil then InsertWindow(w);
    End;
     
    Procedure Ta.InitStatusLine;
    Var
      r: TRect;
    Begin
      GetExtent(r);
      r.a.y:=r.b.y-1;
      StatusLine:=New(PStatusLine,Init(r,NewStatusDef(0,$FFFF,
        NewStatusKey('~Alt+X~ pour quitter', kbAltX, cmQuit,
        StdStatusKeys(nil)), nil)));
    End;
     
    Var
      a: Ta;
     
    Begin
      a.Init;
      a.Run;
      a.Done;
    End.

  6. #6
    Rédacteur/Modérateur
    Avatar de M.Dlb
    Inscrit en
    Avril 2002
    Messages
    2 466
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations forums :
    Inscription : Avril 2002
    Messages : 2 466
    Par défaut
    Tu as compris le principe général de la gestion des évènements Tu peux aussi jouer avec le clavier maintenant !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [Free Pascal] Simple entrée utilisateur sous Turbo Vision
    Par Roland Chastain dans le forum Free Pascal
    Réponses: 2
    Dernier message: 24/11/2012, 17h32
  2. [Turbo Pascal] Idées pour un damier sous Turbo Vision
    Par Roland Chastain dans le forum Turbo Pascal
    Réponses: 16
    Dernier message: 09/05/2012, 10h41
  3. [AC-2007] Affichage requete sous formulaire ajout dynamique de champs
    Par gayahel dans le forum VBA Access
    Réponses: 1
    Dernier message: 08/06/2010, 22h32
  4. javascript sous IE 7 pour un affichage dynamique d'une image
    Par ohhh.gringo dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 31/05/2007, 16h43
  5. Pb d'affichage d'image dynamique sous Flash
    Par raldine dans le forum Flash
    Réponses: 4
    Dernier message: 12/02/2007, 11h19

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo