Problème de compilation avec l'unité Graph (turbo pascal) [Résolu]

- - Dernière réponse : cs_cantador
Messages postés
4996
Date d'inscription
dimanche 26 février 2006
Statut
Modérateur
Dernière intervention
27 mars 2018
- 4 juin 2009 à 10:14
Bonjour,

je m'excuse d'avance, n'ayant pas trouvé de section dédiée au Turbo Pascal, j'ai déposé dans une section généraliste pour le Delphi.

Voici mon problème : j'ai un programme impossible à compiler (après 3h20 d'essais divers et de recherches sur le Net pour une solution), le problème vient de l'unité "Graph.tpu", qui contiendrait une erreur (j'ai alors essayé de la re-compilé à partir de "Graph.pas", mais là c'est le cauchemar : il faut "Windows.pas" qui lui-même nécessite une autre unité et ainsi de suite... => abandon). Les compilateurs utilisés sont "Turbo Pascal 7" (TP7) et "Tubo Pascal pour Windows" (TPW). La seul fois où j'ai réussi à le compiler avec TP7, il fallait utiliser "InitGraph", mais en modifiant je n'ai plus réussi à le re-compiler.

Le programme est censé afficher une épicycloïde en 2D. Voici le code-source et quelques captures pour vous aider. L'idéal serait qu'un être averti puisse compiler le programme et m'expliquer comment il a réussi. Je précise d'avance que j'ai déjà cherché avec Google et malgré mes trouvailles, rien de bien concluant pour m'aider à cette compilation.

Le code :
program courbes;

uses graph;

const L = 640;

const H = 200;

{

Définition des courbes paramétrées X=f(t) et Y=g(t)

Nous obtiendrons une épicycloïde

}

function f(t: real): real;

begin

    f := -3*cos(t) - 2*cos(3*t);

end;

function g(t: real): real;

begin

    g := -3*sin(t) + 2*sin(3*t);

end;

procedure axes(A, B, C, D: real);

begin

    if A*B < 0 then begin moveto(round((L*A)/(A-B)), 0); lineto(round((L*A)/(A-B)), H); end;

    if C*D < 0 then begin moveto(0, round((H*D)/(D-C))); lineto(L, round((H*D)/(D-C))); end;

end;

procedure trace(A, B, C, D, t1, t2, h: real);

var t : real;

begin

    axes(A, B, C, D);

    t := t1;

    moveto(round(L*(f(t)-A)/(B-A)), round(H*(g(t)-D)/(C-D)));

    repeat

    lineto(round(L*(f(t)-A)/(B-A)), round(H*(g(t)-D)/(C-D)));

    t := t+h;

    { h étant le pas de calcul }

    until t < t2;

end;

{ Début du corps du programme }

BEGIN

    GraphDriver := Detect;

    InitGraph( GraphDriver, GraphMode, '');

    trace(-6, 6, -6, 6, 0, 6.2831, 0.01);

END.



Compilation avec TP7, le fichier "graph.tpu" est manquant mais pourtant il est bien présent au dossier indiqué dans la ligne de commande :

Le problème avec TPW lorsque je lui fournit "graph.tpu" trouvé sur le Net :



Merci d'avance à ceux qui m'aideront.

Cordialement,
Keanjyto.
Afficher la suite 

6 réponses

Meilleure réponse
Messages postés
4307
Date d'inscription
samedi 16 octobre 2004
Statut
Modérateur
Dernière intervention
2 janvier 2019
26
3
Merci
Hey le cromagnon! faut lacher ton silex, les briquets ça existe!

http://www.commentcamarche.net/telecharger/telecharger-104-delphi-6-edition-personnelle
http://www.brothersoft.com/delphi-download-76437.html

Turbo Delphi 2006 Explorer : http://downloads.embarcadero.com/free/delphi

Dire « Merci » 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources 121 internautes nous ont dit merci ce mois-ci

Commenter la réponse de f0xi
Messages postés
4307
Date d'inscription
samedi 16 octobre 2004
Statut
Modérateur
Dernière intervention
2 janvier 2019
26
3
Merci
Fichier -> Nouveau -> Application Win32 ou Application VCL etc.

si tu ouvre juste le fichier .PAS ça ne marchera pas, entre autre, il te faut adapter le code.

Dire « Merci » 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources 121 internautes nous ont dit merci ce mois-ci

Commenter la réponse de f0xi
0
Merci
Merci pour l'info, avec une pointe d'humour ça fait toujours plaisir :)
J'ai téléchargé Delphi 7 Edition Personnelle et j'ai enregistré le logiciel mais le bouton "Exécuter (F9)" dans le menu est grisé => impossible de compiler. Une solution ? (l'aide ne marche pas sous Vista...).

Désolé de faire le boulet en insistant ^^', mais ça doit bien faire une semaine que j'essaye de compiler ce programme.
Commenter la réponse de Utilisateur anonyme
0
Merci
Le programme est compilé avec succès. Merci beaucoup pour ton aide f0xi ^^
Seul bémol : la fenêtre est vide. C'est donc que tu as raison : je dois adapter le code, je vais me débrouiller à partir de maintenant ;).

Merci encore de m'avoir guidé et bonne continuation !

Cordialement,
Keanjyto.
Commenter la réponse de Utilisateur anonyme
Messages postés
4307
Date d'inscription
samedi 16 octobre 2004
Statut
Modérateur
Dernière intervention
2 janvier 2019
26
0
Merci
Tu trouvera les fonction de dessin (moveto, lineto) et d'autres choses, dans l'objet Canvas de la fiche et en utilisant l'evenement OnPaint de cette derniere.

procedure TForm1.FormCreate(Sender: TObject);
begin
  // Evite que l'animation scintille a l'ecran
  DoubleBuffered := true;
end;

procedure TForm1.FormPaint(Sender: TObject);
begin
  with Canvas do
  begin
    // Dessine une ligne rouge en diagonale de la fiche
    Pen.Color := clRed;
    MoveTo(0,0);
    LineTo(ClientWidth, ClientHeight);
  end;
end;

alternative si les performances manques :

var
  DrawBuffer : TBitmap;

procedure TForm1.FormCreate(Sender: TObject);
begin
  // Evite le scintillement de l'animation
  DoubleBuffered := true;

  // Creation du Buffer de dessin
  DrawBuffer := TBitmap.Create;

  DrawBuffer.Width := ClientWidth;

  DrawBuffer.Height := ClientHeight;

  DrawBuffer.PixelFormat := pf32bit;
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
  // Liberation du Buffer de dessin
  DrawBuffer.Free;
end;

procedure TForm1.FormResize(Sender: TObject);
begin
  // Redimensionne le buffer en fonction de la taille de la zone client

  DrawBuffer.Width := ClientWidth;

  DrawBuffer.Height := ClientHeight;

end;


procedure TForm1.FormPaint(Sender: TObject);

begin
  // On dessine dans le Buffer.

  with DrawBuffer.Canvas do

  begin
    // Efface l'ecran avec la couleur noire.
    Brush.Color := clBlack;
    FillRect(BoundsRect);


    // Dessine une ligne rouge en diagonale de la fiche

    Pen.Color := clRed;

    MoveTo(0,0);

    LineTo(ClientWidth, ClientHeight);

  end;

  // Dessine le buffer sur la fiche
  Canvas.Draw(0, 0, DrawBuffer);

end;






Commenter la réponse de f0xi
Messages postés
4996
Date d'inscription
dimanche 26 février 2006
Statut
Modérateur
Dernière intervention
27 mars 2018
9
0
Merci
bonjour,
plus simple...

TCHART

cantador
Commenter la réponse de cs_cantador