![]() |
Etwas Bewegung in meine Programme?
Ich habe vor einiger Zeit angefangen mich durch diverse Anfänger-Tutorials zu kämpfen und würde jetzt gerne ein wenig Bewegung in meine Programme bekommen. Also habe ich mir ein kleines Testprogramm geschrieben in dem ein Button einfach im Kreis wandert.
An sich funktioniert das ganz gut, nur kann ich das Programm nicht schließen, solange die Schleife läuft und es scheint mir auch ein wenig mehr Performance zu ziehen, als man vielleicht denken mag... Mache ich was falsch oder bin ich mit meinem Ansatz einfach nur total auf dem Holzweg? :gruebel: ![]() ![]()
Delphi-Quellcode:
unit Unit1;
interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type TForm1 = class(TForm) Bt1: TButton; Button2: TButton; Btst1: TButton; procedure Button2Click(Sender: TObject); procedure create(Sender: TObject); procedure Btst1Click(Sender: TObject); procedure Bt1Click(Sender: TObject); private { Private-Deklarationen } public { Public-Deklarationen } end; var Form1: TForm1; stop:integer; i:Integer; implementation {$R *.dfm} procedure TForm1.Bt1Click(Sender: TObject); begin if stop=0 then begin stop:=1; end else begin stop:=0; end; end; procedure TForm1.Btst1Click(Sender: TObject); begin if stop=0 then begin stop:=1; Btst1.Caption:=('Schleife an'); end else begin stop:=0; Btst1.Caption:=('Schleife aus'); end; end; procedure TForm1.Button2Click(Sender: TObject); var xstart, ystart, xradius, yradius, aufloesung: Integer; begin repeat ystart:=100; xstart:=100; yradius:=100; xradius:=100; aufloesung:=100; bt1.Top:=round(ystart+xradius+(xradius*sin(i/aufloesung))); bt1.Left:=round(xstart+yradius+(yradius*cos(i/aufloesung))); Application.ProcessMessages; sleep(2); until Stop=1; Application.ProcessMessages; end; procedure TForm1.create(Sender: TObject); begin stop:=0; end; end. |
Re: Etwas Bewegung in meine Programme?
Moin, Moin.
Warum erfolgt die Bewegeung des Buttons im OnClick()??? Ich würde das in einen Timer packen und mit einem zusätzlichen Button den Timer ein-/aussschalten. |
Re: Etwas Bewegung in meine Programme?
Moin.
Ich denke, das Sleep ist vielleicht hier nicht ganz so glücklich. Dadurch wird sich die Anwendung "zäh" anfühlen. Dann würde ich noch evtl. die Änderung der Position des Buttons (TOP und LEFT) mit einem LockWindowUpdate einrahmen. Optimalerweise packst Du die Bewegung des Buttons selbst ein einen eigenen Thread, der nur für die Bewegung zuständig ist. Das ein- und ausschalten machst Du dann im Hauptthread. Gruß, Jens |
Re: Etwas Bewegung in meine Programme?
Jepp, aber um einen Button zu bewegen erscheint mir ein Thread ein wenig "overdressed"
|
Re: Etwas Bewegung in meine Programme?
Zitat:
Gruß, Jens |
Re: Etwas Bewegung in meine Programme?
Das Sleep ist da wohl das Problem. Versuch es wie taaktaak schon sagte mit einem Timer, dann brauchst du auch keine for-Schleife.
|
Re: Etwas Bewegung in meine Programme?
Mein Ratschlag erfolgte vor diesem Hintergrund
Zitat:
|
Re: Etwas Bewegung in meine Programme?
Zitat:
Gruß, Jens |
Re: Etwas Bewegung in meine Programme?
Danke erstmal, mit nem Timer läuft das wirklich besser (und wieder was gelernt ^^).
Nur wie bekomme ich es hin, das er über den Button aktiviert wird? Hatte folgenden Ansatz, aber sobald ich das Programm starte beginnt der Button schon sich zu bewegen...
Delphi-Quellcode:
unit Unit1;
interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ExtCtrls; type TForm1 = class(TForm) Bt1: TButton; Button2: TButton; Timer1: TTimer; procedure Button2Click(Sender: TObject); procedure Timer1Timer(Sender: TObject); private { Private-Deklarationen } public { Public-Deklarationen } end; var Form1: TForm1; i:Integer; implementation {$R *.dfm} procedure TForm1.Button2Click(Sender: TObject); begin Timer1.OnTimer(self); end; procedure TForm1.Timer1Timer(Sender: TObject); var xstart, ystart, xradius, yradius, aufloesung: Integer; begin ystart:=100; xstart:=100; yradius:=100; xradius:=100; aufloesung:=100; i:=i+1; bt1.Top:=round(ystart+xradius+(xradius*sin(i/aufloesung))); bt1.Left:=round(xstart+yradius+(yradius*cos(i/aufloesung))); end; end. |
Re: Etwas Bewegung in meine Programme?
einfach dem timer im OI oder im OnCreate der Form die Eigenschaft Enabled := False zuweisen und im Button Enabled := true
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 21: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