DeanCorso666
Messages postés2Date d'inscriptionlundi 14 mars 2005StatutMembreDernière intervention28 novembre 2005
-
28 nov. 2005 à 20:09
Cirec
Messages postés3833Date d'inscriptionvendredi 23 juillet 2004StatutModérateurDernière intervention18 septembre 2022
-
30 nov. 2005 à 07:53
Salut,
Je débute en delphi. Je voulais creer aleatoirement un nombre de cercle à l'aide de canvas.ellipse. Mon problème c'est qu'il ne me prend pas en compte ma variable nbcercles, il m'indique "la variable nbcercles n'est peut être pas initialisée" et donc me fait un seul cercle.
Voici mon code, si vous trouvez l'erreur merci de me l'indiquer
"procedure TForm1.Button1Click(Sender: TObject);
var X,Y,i : integer;
nbcercles : 10..1000;
//Tirage aléatoire du nombre de cercles
begin
For i:=1 to nbcercles do
//Taille des cercles
Image1.Canvas.Brush.Color :=clblue;
X:=random(Image1.Height);
Y:=random(Image1.Width);
Image1.Canvas.Ellipse(X-5,Y-5,X+5,Y+5);
end;"
Cirec
Messages postés3833Date d'inscriptionvendredi 23 juillet 2004StatutModérateurDernière intervention18 septembre 202250 28 nov. 2005 à 20:55
Essaye comme ca
procedure TForm1.Button1Click(Sender: TObject);
var X,Y,i , nbcercles : integer;
//Tirage aléatoire du nombre de cercles
begin nbcercles := 100; // 100 Cercles
For i: =1 to nbcercles do
Begin //Taille des cercles
Image1.Canvas.Brush.Color :=clblue;
X:=random(Image1.Height);
Y:=random(Image1.Width);
Image1.Canvas.Ellipse(X-5,Y-5,X+5,Y+5);
end;
end;
Cirec
Messages postés3833Date d'inscriptionvendredi 23 juillet 2004StatutModérateurDernière intervention18 septembre 202250 29 nov. 2005 à 16:05
f0xi,
tu as raison mais dans ce cas je metterai plutôt:
procedure TForm1.FormCreate(Sender: TObject);
begin
Randomize; // un seul appel suffit
end;
Procedure TForm1.Button1Click(Sender: TObject);
Var c : tpoint;
i : integer;
Begin
With Image1 Do Begin
Canvas.Brush.Color := Form1.Color;
Canvas.FillRect(rect(0, 0, Width, Height)); // éfface le fond
For i : = 1 To (random(65000) + 15000) Do Begin c := point(random(Width - 5), random(height - 5));
With Canvas Do Begin
Pen.Color : = random(16777217);
Brush.Color := Pen.Color;
Ellipse(c.X, c.Y, c.X + Random(50), c.Y + Random(50));
End;
application.ProcessMessages; // pour voir en temps réel l'affichage
End;
End;
End;
@+
Cirec
Vous n’avez pas trouvé la réponse que vous recherchez ?
f0xi
Messages postés4205Date d'inscriptionsamedi 16 octobre 2004StatutModérateurDernière intervention12 mars 202235 30 nov. 2005 à 02:21
alors oui, tout a fait pour Randomize.
vus que randomize initalise RandSeed grace au compteur de performance.
par contre une petite remarque dans ta procedure, c'est l'apel a
Application.ProcessMessages qui pourrait ralentir considerablement la
boucle.
et je preconiserais plutot quelque chose dans ce gout la :
var n : integer;
begin
n := 0;
for .... do begin
.... code ....
if inc(n) = 500 then begin
application.processmessages;
n := 0;
end;
end;
end;
en fait on apel processmessages que toute les 500 boucles par exemple. cela evite de trop la ralentir.
bon en plus dans une boucle aussi "bete" un CPU a plus d' 1 Ghz ne devrait pas "freezer" le programme pour si peu.
d'ailleur sur mon athlon 1800+ qui commence a se faire vieux, l'apel a
processmessage est completement inutile dans cette boucle (mais
uniquement dans ce cas) vair meme handicapant.
mais il est toujours important de rapeller l'utilisation de
processmessages dans les grosse boucle de traitement, mais je tiens a
rapeller qu'elle degrade la rapiditée d'execution de la boucle dans
laquelle elle se trouve.
je preferé l'utilisation des threads a la rigeur ... cela serait plus approprié bien que moins evident a coder.
Cirec
Messages postés3833Date d'inscriptionvendredi 23 juillet 2004StatutModérateurDernière intervention18 septembre 202250 30 nov. 2005 à 07:53
f0xi
Ok je suis du même avis que toi, mais chez moi en tous cas, si je ne met pas Application.ProcessMessage; le résultat ne s'affiche que à la fin de la boucle( alors dans ce cas il vaut mieux afficher une image c'est plus rapide et c'est pareil),par contre avec, il est vrai que ca met un peut plus longtemps, je vois chaque figure s'afficher à lécran.Donc il faudrait peut être trouver un compromis entre le tout ou rien et essayer avec un Invalidate ou autre.
Et si j'ai bien compris chez toi tu as la progression qui s'affiche à l'écran sans mettre Application.ProcessMessage; si c'est le cas garde ta machine parce que la mienne un P4 3Ghz avec HT elle ne le fait pas
Voilà et pour rester dans le random jusqu'au bout:
procedure TForm1.FormCreate(Sender: TObject);
begin
Randomize;
end;
Procedure TForm1.Button1Click(Sender: TObject);
Var c : tpoint;
i : integer;
Begin
With Image1 Do
Begin
Canvas.Brush.Color := Form1.Color;
Canvas.FillRect(rect(0, 0, Width, Height)); // éfface le fond
For i : = 1 To (random(65000) + 15000) Do
Begin c := point(random(Width - 5), random(height - 5));
With Canvas Do Begin Pen.Color : = random(16777217);
Brush.Color := Pen.Color;
Case Random(3) of // Pour un peut plus de fun
0:Ellipse(c.X, c.Y, c.X + Random(50), c.Y + Random(50));
1:Rectangle(c.X, c.Y, c.X + Random(50), c.Y + Random(50));
2:RoundRect(c.X, c.Y, c.X + Random(50), c.Y + Random(50),10,10);
End;
End;
application.ProcessMessages; // pour voir en temps réel l'affichage
End;
End;
End;