Autor Beitrag
mhsteuer
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 23



BeitragVerfasst: Fr 17.12.04 09:43 
Hi Leute!

Folgender Quelltext simuliert ein drehendes Rad (hatte ich getsern schon mal). Wenn ich den Stop-Button drücke, bricht der Prozess (logischerweise) nicht sofort ab, sondern erst wenn er in der Repeat-Until-Schleife erneut die Bedingung prüft. Gibt es da einen Weg den laufenden Prozess sofort zu beenden?

ausblenden volle Höhe Delphi-Quelltext
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:
...
var cancel: boolean;

procedure TForm1.Schließen2Click(Sender: TObject);
begin
  close;
end;

procedure TForm1.FormCreate(Sender: TObject);
var mx,my: integer;
begin
mx:=200;
my:=150;
  with image1.Canvas do
  begin
    ellipse(mx-50,my-50,mx+50,my+50);
    moveto(mx,my);
    lineto(mx-48,my);  //Speiche etwas kürzer, damit der Kreis nicht neu gezeichnet werden muss
  end;

end;

procedure TForm1.Start1Click(Sender: TObject);
var mx,my,ky,x,radius,i: integer;
begin
cancel:=false;
mx:=200;         //x-Koordinate des Mittelpunktes
my:=150;         //y-Koordinate des Mittelpunktes
radius:=48;
x:=-48;          //Startwert der x-Koordinate für die Berechnung eines Kreispunktes
repeat
  with image1.Canvas do
  begin
    //Kreisgleichung: x²+y²=r²
    for i:=1 to 96 do                        //Speichen obere Kreishäfte
      begin
      ky:=round(sqrt(sqr(radius)-sqr(x+i))); //Brechnet y-Koordinate des Kreispunktes
      moveto(mx,my);                         //Speiche Startpunkt
      lineto(mx-radius+i,my-ky);             //Speiche Endpunkt
      sleep(50);
      image1.Update;
      end;
    for i:=95 downto 1 do                          //Speichen untere Kreishälfte
      begin
      ky:=round((-1)*sqrt(sqr(radius)-sqr(x+i))); //Brechnet y-Koordinate des  
                                                    Kreispunktes
      moveto(mx,my);                              //Speiche Startpunkt
      lineto(mx-radius+i,my-ky);                  //Speiche Endpunkt
      sleep(50);
      image1.Update;
      end;
    end;
    application.ProcessMessages;
until cancel;
  end;

procedure TForm1.StopClick(Sender: TObject);
begin
  cancel:=true;
end;


Moderiert von user profile iconMotzi: Delphi-Tags hinzugefügt.

_________________
Mittsommernacht
MrSaint
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1033
Erhaltene Danke: 1

WinXP Pro SP2
Delphi 6 Prof.
BeitragVerfasst: Fr 17.12.04 10:35 
So direkt nicht (außer mit mehrmaligem Abfragen von cancel in Start1Click, das wär aber extrem unsauber). ABhilfe können Threads schaffen, das ist aber beim Einstieg ein recht komplexes Thema. Ich kann aber nur sagen, dass es sich lohnt, wenn man Threads beherrscht ;) Zum Thema Threads hier 2 links:
- den find ich am besten, is echt super ausführlich: www.pergolesi.demon....rog/threads/ToC.html
- und der wird auch öfters genannt: www.delphi-source.de...ials/threads/?page=1


MrSaint

_________________
"people knew how to write small, efficient programs [...], a skill that has subsequently been lost"
Andrew S. Tanenbaum - Modern Operating Systems
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Fr 17.12.04 13:08 
Oder hier auf deutsch: tutorials.luckie-online.de