Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Pause während Schleifendurchlauf (https://www.delphipraxis.net/156000-pause-waehrend-schleifendurchlauf.html)

ChristianR 16. Nov 2010 11:39

Delphi-Version: 5

Pause während Schleifendurchlauf
 
Guten Tag,
habe eine klitzekleine Frage bezüglich meines Programmes. Und zwar habe ich das Sieb des Eratosthenes programmiert. Der Algorithmus funktioniert auch soweit. Jetzt versuche ich das Prinzip optisch darzustellen. Hierbei möchte ich, dass der alle vielfachen einer gefundenen primzahl streicht. Habe dynamisch 100 Panels erzeugt. Die Zahlen bis 100 sind in einem Array gespeichert. Jedes mal wenn keine Primzahl beim schleifendurchlauf gefunden worden ist wird der wert im Array auf true gesetzt. Jetzt soll dieses Panel was true gesetzt worden ist rot gefärbt werden und nach einer bestimmten zeit dann ganz verschwinden.(visible := false;) und das ganze geht von vorne los, bis alle nicht Primzahlen makiert bzw unsichtbar gesetzt worden sind.
Habe das jetzt so probiert aber wenn ich auf den Button drücke passiert einfach nichts. Wenn ich nur Farben oder Visible := false setze funktioniert es, aber es geht mir zu schnell. Ich möchte, das man es der Reihe nach sieht wie die nicht Primzahlen "gelöscht" werden.

Hier mal mein Code:
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var j,l,o:integer;
begin



j := 2;
// while Schleife solange durchlaufen bis die Quadratzahl des Indexes
// größer ist als die eingegebene Zahl
while j*j <= 100 Do begin

// prüfen ob der Arraywert bei j false ist, wenn ja handelt es sich um eine Primzahl
    if( gestrichen[j] = false) then begin
// alle mehrfachen von j auf true setzen und damit als Primzahl ausschliessen

        l:=j*j;
        while l <= 100  do begin

             gestrichen[l]:=true;
             if gestrichen[l] = true then
             begin
               TPanel(FindComponent('number'+inttostr(l))).Color := clRed;
               sleep(1000);
               TPanel(FindComponent('number'+inttostr(l))).Visible := false;
             end;
             l:=l+j;

        end;

    end;

            j:= j+1;
end;


end;
Ich hoffe, das es so verständlich genug erklärt ist und mir jemand helfen kann :)
Habe wahrscheinlich grade wieder nur ein Brett vor dem Kopf.
Besten Dank Christian

Wolfgang Mix 16. Nov 2010 11:44

AW: Pause während Schleifendurchlauf
 
Dein Suchwort heisst sleep

Luckie 16. Nov 2010 11:46

AW: Pause während Schleifendurchlauf
 
Besser Delay aus der Code-Lib. Sleep legt den ganzen Thread lahm, so dass gar nichts mehr passiert, auch kein neu zeichnen der Oberfläche.

ChristianR 16. Nov 2010 11:48

AW: Pause während Schleifendurchlauf
 
Zitat:

Zitat von Wolfgang Mix (Beitrag 1061890)
Dein Suchwort heisst sleep

Delphi-Quellcode:
 begin
               TPanel(FindComponent('number'+inttostr(l))).Color := clRed;
               sleep(1000);
               TPanel(FindComponent('number'+inttostr(l))).Visible := false;
             end;
das hatte ich ja schon mit drin. Problem ist aber das dann einfach gar nichts mehr passiert und ich über den Taskmanager das projekt beenden muss. Nur ich weiß nicht warum?!? ^^

Wolfgang Mix 16. Nov 2010 11:48

AW: Pause während Schleifendurchlauf
 
@Michael:
Hast gewonnen :-)
Wo war wieder der rote Kasten?

Luckie 16. Nov 2010 11:53

AW: Pause während Schleifendurchlauf
 
Zitat:

Zitat von ChristianR (Beitrag 1061894)
das hatte ich ja schon mit drin. Problem ist aber das dann einfach gar nichts mehr passiert und ich über den Taskmanager das projekt beenden muss. Nur ich weiß nicht warum?!? ^^

Begründung und Lösung habe ich dir in meinem Beitrag genannt.

ChristianR 16. Nov 2010 11:54

AW: Pause während Schleifendurchlauf
 
ja danke ich probiere es mal aus.

Bummi 16. Nov 2010 11:55

AW: Pause während Schleifendurchlauf
 
Häng mal noch ein Application.ProcessMessages dazwischen....

Luckie 16. Nov 2010 12:01

AW: Pause während Schleifendurchlauf
 
Ist in Delay schon enthalten.

ChristianR 16. Nov 2010 12:08

AW: Pause während Schleifendurchlauf
 
Zitat:

Zitat von Bummi (Beitrag 1061901)
Häng mal noch ein Application.ProcessMessages dazwischen....

Perfekt! Jetzt läuft es so, wie ich es haben wollte! Danke

Delphi-Quellcode:
if gestrichen[l] = true then
             begin
               TPanel(FindComponent('number'+inttostr(l))).Color := clRed;
               sleep(1000);
               Application.ProcessMessages;
               TPanel(FindComponent('number'+inttostr(l))).Visible := false;
             end;
läuft Einwandfrei


Alle Zeitangaben in WEZ +1. Es ist jetzt 13:36 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz