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

Contribuez Pascal Discussion :

BGIDEMO pour FreePascal


Sujet :

Contribuez Pascal

  1. #1
    Rédacteur/Modérateur

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

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : décembre 2011
    Messages : 3 828
    Points : 13 685
    Points
    13 685
    Billets dans le blog
    8
    Par défaut BGIDEMO pour FreePascal
    Bonjour !

    Je vous propose une adaptation pour FreePascal du programme BGIDEMO (tiré des exemples de Turbo Pascal). Ce programme fait le tour des possibilités de l'unité Graph.

    Comme vous pourrez vous en rendre compte, les performances de l'unité Graph de FreePascal ne sont pas excellentes, mais il y a quand même de quoi faire pas mal de petites choses, et on peut saluer le travail de l'auteur.

    J'en demande pardon à mes confrères linuxiens : c'est une version Windows exclusivement. Peut-être quelqu'un fera-t-il une version Linux ?

    Le programme a été compilé avec FreePascal 2.6.2, sous Windows 8.
    Fichiers attachés Fichiers attachés

  2. #2
    Membre confirmé
    Homme Profil pro
    Inscrit en
    janvier 2010
    Messages
    235
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : janvier 2010
    Messages : 235
    Points : 506
    Points
    506
    Par défaut
    Après quelques adaptations voilà une version qui marche sous windows et linux. Petite limitation : il n'existe qu'une police de caractères.
    Fichiers attachés Fichiers attachés

  3. #3
    Rédacteur/Modérateur

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

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : décembre 2011
    Messages : 3 828
    Points : 13 685
    Points
    13 685
    Billets dans le blog
    8
    Par défaut
    Citation Envoyé par batyann811 Voir le message
    Après quelques adaptations voilà une version qui marche sous windows et linux. Petite limitation : il n'existe qu'une police de caractères.
    Merci, batyann811, je vais regarder ton code avec intérêt.

    Voici à présent le programme ARTY, provenant également des exemples de Turbo Pascal.

    P.-S. Je viens d'essayer ton programme. Les performances sont incomparables, je veux dire bien meilleures ! Je vais adopter cette unité ptcGraph, que je ne connaissais pas.
    Fichiers attachés Fichiers attachés

  4. #4
    Rédacteur/Modérateur

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

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : décembre 2011
    Messages : 3 828
    Points : 13 685
    Points
    13 685
    Billets dans le blog
    8
    Par défaut
    L'unité ptcGraph permet d'utiliser des couleurs 16-bit. J'ai voulu savoir comment sont codées les couleurs 16-bit. D'après ce que j'ai lu ici et là, il y a plusieurs normes. Voici apparemment celle qui est suivie dans ce cas : 5 bits pour le rouge, 6 pour le vert, 5 pour le bleu.

    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
    program PtcGraph_001;
    {$MODE DELPHI}
    {$IFDEF WINDOWS}
    {$APPTYPE GUI}
    {$ENDIF}
     
    uses
      PtcGraph, PtcCrt, SysUtils;
     
    function StringToWord(const s: string): word;
    var
      i: integer;
    begin
      result := 0;
      for i := 0 to 15 do
        if s[16 - i] > '0' then
          result := result or (1 shl i);
    end;
     
    var
      d, m: smallInt;
      c: word;
     
    begin
      d := 10;    // 640 x 480
      m := $0111; // 65536 couleurs
     
      InitGraph(d, m, '');
     
      {
      SetColor($FFFF);
      OutTextXY(10, 10, IntToStr(GetMaxX + 1) + 'x' + IntToStr(GetMaxY + 1) + 'x' + IntToStr(GetMaxColor + 1));
      }
     
      c := StringToWord('11111' + '000000' + '00000');
      SetFillStyle(SolidFill, c);
      Bar(100, 100, 240, 380);
     
      c := StringToWord('00000' + '111111' + '00000');
      SetFillStyle(SolidFill, c);
      Bar(250, 100, 390, 380);
     
      c := StringToWord('00000' + '000000' + '11111');
      SetFillStyle(SolidFill, c);
      Bar(400, 100, 540, 380);
     
      ReadKey;
      CloseGraph;
    end.
    Autrement dit, l'intensité du rouge et du bleu varie de 0 à 31, celle du vert de 0 à 63.

    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
    program PtcGraph_004;
    {$MODE DELPHI}
    {$IFDEF WINDOWS}
    {$APPTYPE GUI}
    {$ENDIF}
     
    uses
      PtcGraph, PtcCrt;
     
    function RGBToWord(r, g, b: byte): word;
    begin
      if r > 31 then r := 31;
      if g > 63 then g := 63;
      if b > 31 then b := 31;
      result := (r shl 11) or (g shl 5) or b;
    end;
     
    var
      d, m: smallInt;
      c: word;
      i: byte;
     
    begin
      d := 10;    // 640 x 480
      m := $0111; // 65536 couleurs
     
      InitGraph(d, m, '');
     
      for i := 0 to 31 do
      begin
        c := RGBToWord(i, 0, 0);
        SetFillStyle(SolidFill, c);
        Bar(016, i * (448 div 32) + 16, 208, (i + 1) * (448 div 32) + 16);
      end;
     
      for i := 0 to 63 do
      begin
        c := RGBToWord(0, i, 0);
        SetFillStyle(SolidFill, c);
        Bar(224, i * (448 div 64) + 16, 416, (i + 1) * (448 div 64) + 16);
      end;
     
      for i := 0 to 31 do
        begin
        c := RGBToWord(0, 0, i);
        SetFillStyle(SolidFill, c);
        Bar(432, i * (448 div 32) + 16, 624, (i + 1) * (448 div 32) + 16);
      end;
     
      ReadKey;
      CloseGraph;
    end.
    Pas évident à manipuler ! Le mieux serait peut-être de faire une fonction qui convertirait un nombre 32-bit (ce qui permettrait d'utiliser les valeurs usuelles). Qu'en pensez-vous ?

  5. #5
    Rédacteur/Modérateur

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

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : décembre 2011
    Messages : 3 828
    Points : 13 685
    Points
    13 685
    Billets dans le blog
    8
    Par défaut
    Voici une adaptation des lignes ondoyantes d'Alcatîz.

    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
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
     
    program Ondoyant;
    {$IFDEF WINDOWS}
    {$APPTYPE GUI}
    {$ENDIF}
     
    (* Programme original :
       http://alcatiz.developpez.com/tutoriel/owl/?page=pg_gdi *)
     
    uses
      PtcGraph, PtcCrt;
     
    const
      indiceMax    = 100;
      vitesse      = 100;
      dx1: integer =   4;
      dy1: integer =  10;
      dx2: integer =   3;
      dy2: integer =   9;
     
    type
      tLigne = record
        x1, y1, x2, y2: integer;
        couleur: word;
      end;
      tTabLignes = array[0..indiceMax]of tLigne;
     
    var
      tabLignes: tTabLignes;
      indiceGeneral: integer;
      effacer: boolean;
     
    function Initialise: boolean;
    var
      d, m: smallint;
      i: integer;
    begin
      d := d16bit;
      m := m800x600;
      InitGraph(d, m, '');
      result := (GraphResult = grOk);
      if result then
      begin
        for i := 0 to indiceMax do
          tabLignes[i].x1 := -1;
        indiceGeneral := 0;
        effacer := false;
      end;
    end;
     
    procedure NouvelleLigne(var coord, intervalle : integer; coordMax : integer; var couleur : word);
    var
      total : integer;
      signe : integer;
    begin
      total := coord + intervalle;
      if (total < 0) or (total > coordMax) then
      begin
        if intervalle >= 0 then
          signe := -1
        else
          signe := 1;
        intervalle := signe * (3 + Random(12));
        couleur := Random(65535) + 1;
      end else
        coord := total;
    end;
     
    procedure DessinLigne(i: integer);
    begin
      with tabLignes[i] do
      begin
        SetColor(couleur);
        Line(x1, y1, x2, y2);
      end;
    end;
     
    procedure Redessine;
    var
      i: integer;
      ancienIndice: integer;
    begin
      for i := 1 to 10 do
      begin
        ancienIndice := indiceGeneral;
        if indiceGeneral = indiceMax - 1 then
        begin
          indiceGeneral := 0;
          effacer := True;
        end else
          Inc(indiceGeneral);
        if effacer then
        begin
          tabLignes[indiceGeneral].couleur := 0;
          DessinLigne(indiceGeneral);
        end;
        tabLignes[indiceGeneral] := tabLignes[ancienIndice];
        with tabLignes[indiceGeneral] do
        begin
          NouvelleLigne(x1, dx1, GetMaxX, couleur);
          NouvelleLigne(y1, dy1, GetMaxY, couleur);
          NouvelleLigne(x2, dx2, GetMaxX, couleur);
          NouvelleLigne(y2, dy2, GetMaxY, couleur);
        end;
        DessinLigne(indiceGeneral);
      end;
    end;
     
    begin
      Randomize;
      if Initialise then
      begin
        repeat
          Redessine;
          Delay(vitesse);
        until KeyPressed;
        CloseGraph;
      end;
    end.
    En pièce jointe, le même programme, mais utilisant l'unité Graph. Avec cette dernière j'avais trouvé le moyen de modifier le titre de la fenêtre et aussi l'icône de la fenêtre. Apparemment, ce n'est pas possible avec PtcGraph, ou du moins je ne vois pas comment faire. Je suppose que c'est la rançon de la compilation multi-plateforme.

    Autre pièce jointe, le même programme utilisant l'unité Wingraph. La principale différence entre les trois versions est le nombre de couleurs supportées.
    Fichiers attachés Fichiers attachés

  6. #6
    Rédacteur/Modérateur

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

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : décembre 2011
    Messages : 3 828
    Points : 13 685
    Points
    13 685
    Billets dans le blog
    8
    Par défaut
    En regardant des exemples que j'avais oubliés, je m'aperçois que l'unité WinGraph a un mode "plein écran". En l'occurrence, ce serait dommage de ne pas l'utiliser. Voici donc une nouvelle version des lignes ondoyantes.

    P.-S. Ajouté la détection des mouvements de la souris, pour pouvoir utiliser le programme comme écran de veille. Le programme s'arrête si la souris est déplacée ou si un bouton est pressé.
    Fichiers attachés Fichiers attachés

  7. #7
    Responsable Pascal, Lazarus et Assembleur


    Avatar de Alcatîz
    Homme Profil pro
    Ressources humaines
    Inscrit en
    mars 2003
    Messages
    7 777
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ressources humaines
    Secteur : Service public

    Informations forums :
    Inscription : mars 2003
    Messages : 7 777
    Points : 56 545
    Points
    56 545
    Billets dans le blog
    2
    Par défaut
    Décidément, cette unité WinGraph est pleine de possibilités !
    Il va falloir que je la regarde de plus près.
    Règles du forum
    Cours et tutoriels Pascal, Delphi, Lazarus et Assembleur
    Avant de poser une question, consultez les FAQ Pascal, Delphi, Lazarus et Assembleur
    Mes tutoriels et sources Pascal

    Le problème en ce bas monde est que les imbéciles sont sûrs d'eux et fiers comme des coqs de basse cour, alors que les gens intelligents sont emplis de doute. [Bertrand Russell]
    La tolérance atteindra un tel niveau que les personnes intelligentes seront interdites de toute réflexion afin de ne pas offenser les imbéciles. [Fiodor Mikhaïlovitch Dostoïevski]

  8. #8
    Expert éminent sénior
    Avatar de Paul TOTH
    Homme Profil pro
    Freelance
    Inscrit en
    novembre 2002
    Messages
    8 232
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : novembre 2002
    Messages : 8 232
    Points : 26 662
    Points
    26 662
    Par défaut
    ahah, ça me rappelle le bon vieux temps sous TP

    par contre sur mon PC la détection est trop sensible, quand je double clic sur l'application elle se termine directement, je dois passer par la touche ENTREE pour la lancée sans qu'elle se ferme instantanément.
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

  9. #9
    Rédacteur/Modérateur

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

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : décembre 2011
    Messages : 3 828
    Points : 13 685
    Points
    13 685
    Billets dans le blog
    8
    Par défaut
    Citation Envoyé par Alcatîz Voir le message
    Décidément, cette unité WinGraph est pleine de possibilités !
    En effet, l'auteur ne s'est pas contenté de restituer les fonctions de l'unité Graph : il a poussé les choses un peu plus loin. Et l'unité est aussi utilisable avec Delphi !

    Citation Envoyé par Paul TOTH Voir le message
    par contre sur mon PC la détection est trop sensible, quand je double clic sur l'application elle se termine directement, je dois passer par la touche ENTREE pour la lancée sans qu'elle se ferme instantanément.
    Merci pour le retour, Paul. Oui, il faudra que je retravaille cela.

    P.-S. Voilà, j'ai corrigé le défaut signalé par Paul (voir plus haut la nouvelle pièce jointe).

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    until KeyPressed or (Abs(GetMouseX - x) > 20) or (Abs(GetMouseY - Y) > 20) or (GetMouseButtons <> 0);

  10. #10
    Responsable Pascal, Lazarus et Assembleur


    Avatar de Alcatîz
    Homme Profil pro
    Ressources humaines
    Inscrit en
    mars 2003
    Messages
    7 777
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ressources humaines
    Secteur : Service public

    Informations forums :
    Inscription : mars 2003
    Messages : 7 777
    Points : 56 545
    Points
    56 545
    Billets dans le blog
    2
    Par défaut
    En regardant de plus près l'unité WinGraph, je vois que la procédure SetWriteMode permet de définir une opération logique pour le dessin, à l'instar de la fonction BGI SetROP2. Voilà de quoi effacer une ligne ondoyante en la redessinant avec une opération XOR, ce qui permet au programme d'avoir n'importe quelle couleur de fond.
    Règles du forum
    Cours et tutoriels Pascal, Delphi, Lazarus et Assembleur
    Avant de poser une question, consultez les FAQ Pascal, Delphi, Lazarus et Assembleur
    Mes tutoriels et sources Pascal

    Le problème en ce bas monde est que les imbéciles sont sûrs d'eux et fiers comme des coqs de basse cour, alors que les gens intelligents sont emplis de doute. [Bertrand Russell]
    La tolérance atteindra un tel niveau que les personnes intelligentes seront interdites de toute réflexion afin de ne pas offenser les imbéciles. [Fiodor Mikhaïlovitch Dostoïevski]

  11. #11
    Rédacteur/Modérateur

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

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : décembre 2011
    Messages : 3 828
    Points : 13 685
    Points
    13 685
    Billets dans le blog
    8
    Par défaut
    Citation Envoyé par Alcatîz Voir le message
    En regardant de plus près l'unité WinGraph, je vois que la procédure SetWriteMode permet de définir une opération logique pour le dessin, à l'instar de la fonction BGI SetROP2. Voilà de quoi effacer une ligne ondoyante en la redessinant avec une opération XOR, ce qui permet au programme d'avoir n'importe quelle couleur de fond.
    Merci pour le tuyau ! Je ne connaissais pas cette procédure. Effectivement, maintenant ça fonctionne quelle que soit la couleur de fond.
    Fichiers attachés Fichiers attachés

Discussions similaires

  1. [Free Pascal] Quelques unités et un programme pour FreePascal
    Par yamer dans le forum Contribuez
    Réponses: 4
    Dernier message: 01/06/2014, 18h46
  2. Réponses: 0
    Dernier message: 26/10/2011, 17h46
  3. [Lazarus] Application Lazarus/FreePascal pour iPhone
    Par aime2nice dans le forum Lazarus
    Réponses: 0
    Dernier message: 30/08/2009, 19h54
  4. Réponses: 1
    Dernier message: 25/03/2006, 21h26
  5. [FreePascal] Problème pour une simple liste chaînée
    Par piff62 dans le forum Free Pascal
    Réponses: 3
    Dernier message: 26/11/2005, 19h25

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