Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Etwas Bewegung in meine Programme? (https://www.delphipraxis.net/124575-etwas-bewegung-meine-programme.html)

dust258 21. Nov 2008 09:24


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:

Bewegungstest.rar]Bewegungstest.rar

http://eit.total-latten.de/uploads/f...1_bewegung.jpg

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.

taaktaak 21. Nov 2008 09:41

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.

Nersgatt 21. Nov 2008 09:43

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

taaktaak 21. Nov 2008 09:45

Re: Etwas Bewegung in meine Programme?
 
Jepp, aber um einen Button zu bewegen erscheint mir ein Thread ein wenig "overdressed"

Nersgatt 21. Nov 2008 09:50

Re: Etwas Bewegung in meine Programme?
 
Zitat:

Zitat von taaktaak
Jepp, aber um einen Button zu bewegen erscheint mir ein Thread ein wenig "overdressed"

Wenn die Bewegung des Buttons nur "Beiwerk" zum eigentlichen Programm ist, halte ich einen Thread absolut für das Mittel der Wahl. Wenn die Hauptaufgabe des Programms die Bewegung des Buttons ist, mag man darauf verzichten können, aber ich würde es trotzdem mit einem Thread machen. Ist einfach schöner und ich würde weniger Probleme erwarten, wenn man das Programm erweitert. Die Probleme können den Aufwand des gesparten Threads schnell auffressen.

Gruß,
Jens

divBy0 21. Nov 2008 09:51

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.

taaktaak 21. Nov 2008 09:59

Re: Etwas Bewegung in meine Programme?
 
Mein Ratschlag erfolgte vor diesem Hintergrund
Zitat:

angefangen mich durch diverse Anfänger-Tutorials zu kämpfen
:xmas:

Nersgatt 21. Nov 2008 10:04

Re: Etwas Bewegung in meine Programme?
 
Zitat:

Zitat von taaktaak
Mein Ratschlag erfolgte vor diesem Hintergrund
Zitat:

angefangen mich durch diverse Anfänger-Tutorials zu kämpfen
:xmas:

Hast ja Recht. Wenn dust258 schnell ein Ergebnis sehen will, ist der Timer das Mittel der Wahl. Wenn er irgendwann mal den Wunsch verspürt, sich mit Threads zu beschäftigen, dann kann er ja mal das selbe Programm unter Verwendung einen Threads programmieren.

Gruß,
Jens

dust258 21. Nov 2008 13:04

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.

Crazy Ivan 21. Nov 2008 13:08

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.
Seite 1 von 2  1 2      

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