Entwickler-Ecke
Grafische Benutzeroberflächen (VCL & FireMonkey) - Button bewegen
HeinzKarl - Sa 25.12.10 00:37
Titel: Button bewegen
Hi Leute,
ich bin noch neu hier. Deshalb hoffe ich einfach mal das das hier der richtige Bereich ist.
Ich habe ein Problem:
Ich möchte ein Programm machen, welches einen Button alle halbe Sekunde bewegt und bei Klick auf den Button eine Variabele um eins erhöht.
Hier, das ist mein Code bis jetzt:
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: 61: 62: 63: 64:
| unit Unit1;
interface
uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, ExtCtrls, StdCtrls;
type TForm1 = class(TForm) Button1: TButton; Panel1: TPanel; procedure FormCreate(Sender: TObject); procedure Button1Click(Sender: TObject); procedure Button1MouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer); private procedure ButtonMove; public end;
var Form1: TForm1; Treffer: Integer;
implementation
{$R *.dfm}
procedure TForm1.ButtonMove; begin Repaint; Button1.Left := random(ClientWidth - Button1.Width - 20); Button1.Top := random(ClientHeight - Button1.Height - 80); end;
procedure TForm1.FormCreate(Sender: TObject); begin randomize; Treffer := 0; end;
procedure TForm1.Button1Click(Sender: TObject); begin inc(Treffer); Panel1.Caption := IntToStr(Treffer) + ' Treffer'; end;
procedure TForm1.Button1MouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer); begin sleep(100); ButtonMove; sleep(500); if Treffer >= 10 then begin ShowMessage ('Fertig!'); Close; end; end;
end. |
Mein Problem ist, wenn ich jetzt den Button drücke passiert NICHTS! Weder die Aufschrift ändert sich noch sonst irgendwas. Weil er ja immer den Button bewegt und dabei "keine Zeit" mehr hat das Button1Click zu beachten oder ?
Hoffe ihr könnt evntl. ein wenig helfen
MfG HeinzKarl
P.S. Frohe Weihnachten :)
Moderiert von
Narses: Titel geändert, war: "Anfänger Frage (Button bewegen)".
jaenicke - Sa 25.12.10 00:44
Hallo und :welcome:
Durch das Sleep frierst du dein Programm ein und verhinderst jegliche Bearbeitung von Messages. Auch nicht die zum Neuzeichnen. Dementsprechend passiert auch nichts.
Was ich nicht verstehe:
Wozu willst du denn überhaupt darauf reagieren, dass die Maus auf dem Button bewegt wird (OnMouseMove)? :gruebel:
Ich dachte es ginge nur um die Klicks. Und die bekommst du ja in OnClick.
// EDIT:
Und für alle halbe Sekunde fehlt dir ja noch ein Timer. :gruebel:
HeinzKarl - Sa 25.12.10 00:53
Also das Programm soll:
Einen Button (Button1) alle 500 Millisekunden bewegen (zufällig)
Bei einem Klick auf den Button die Variabele Treffer um eins erhöhen
Also, ich habs nochmal auf "Anfang" gesetzt. Das Problem ist:
Wie bekomme ich es hin das er VON ANFANG an den BUTTON ZUFÄLLIG versetzt ?
Und zwar so, das er die Klicks noch zählt. Lassen wir das ((Treffer = 10) = Ende) weg
So, mein Anfangscode (in dem sind noch keine 0,5 Sekunde sleep drinne :) )
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:
| unit Unit1;
interface
uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, ExtCtrls, StdCtrls;
type TForm1 = class(TForm) Button1: TButton; Panel1: TPanel; procedure FormCreate(Sender: TObject); procedure Button1Click(Sender: TObject); private public end;
var Form1: TForm1; Treffer: Integer;
implementation
{$R *.dfm}
procedure TForm1.FormCreate(Sender: TObject); begin randomize; Treffer := 0; end;
procedure TForm1.Button1Click(Sender: TObject); begin inc(Treffer); Panel1.Caption := IntToStr(Treffer) + ' Treffer'; Button1.Left := random(ClientWidth - Button1.Width - 20); Button1.Top := random(ClientHeight - Button1.Height - 80); end;
end. |
Mh doofes Problem...
jaenicke - Sa 25.12.10 00:54
Wie ich noch reineditiert habe:
Nimm einen Timer, den du auf ein Intervall von 500 Millisekunden stellst.
Wobei ich das für zu schnell halte, aber gut...
HeinzKarl - Sa 25.12.10 00:57
Ja aber, jetzt ändert sich die Position des Buttons ja NUR wenn ich drauf klicke, und das ist doch sogar für mich arg einfach ;)
Das zufällige Bewegen und das Klick Zählen müsste irgendwie gleichzeitig laufen ??
*Null versteh*
jaenicke - Sa 25.12.10 01:07
HeinzKarl hat folgendes geschrieben : |
| Ja aber, jetzt ändert sich die Position des Buttons ja NUR wenn ich drauf klicke, und das ist doch sogar für mich arg einfach ;) |
Du
hast ja auch noch keinen Timer.
Ich sage ja gerade, benutze einen Timer für das zufällige Bewegen.
HeinzKarl - Sa 25.12.10 01:19
Ich glaube wir reden ein wenig aneinander vorbei :)
Ich möchte das der Button sich von anfang an zufällig verschiebt, das Verschieben mach ich dmait :
Delphi-Quelltext
1: 2: 3:
| Button1.Left := random(ClientWidth - Button1.Width - 20); Button1.Top := random(ClientHeight - Button1.Height - 80); sleep(300); |
Ich weiß nicht wo, wie das in den Code reinmuss.
Weil wenn ich es in den Button1Click Code reintu, dann verändert sich die Position erst NACH klick, und das ist nicht Sinn der Sache.
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8:
| [b]procedure TForm1.Button1Click(Sender: TObject);[/b] begin inc(Treffer); Panel1.Caption := IntToStr(Treffer) + ' Treffer'; [i]Button1.Left := random(ClientWidth - Button1.Width - 20); Button1.Top := random(ClientHeight - Button1.Height - 80); sleep(300);[/i] end; |
Wo muss der Code fürs Verschieben hin, damit sich der Button zufällig verschiebt und ich aber jederzeit auf den Button klicken kann und damit die Variabele erhöht wird.
Sorry für die komplizierte Erklärung, aber ich bin halt ein Anfänger :)
jaenicke - Sa 25.12.10 01:22
Nein, wir reden nicht aneinander vorbei. Ich habe schon verstanden was du willst. Nur du hast dir offenbar leider immer noch nicht eine TTimer Komponente angeschaut...
HeinzKarl hat folgendes geschrieben : |
| Ich weiß nicht wo, wie das in den Code reinmuss. |
Wie gesagt: in den Timer...
Nur ohne Sleep.
HeinzKarl - Sa 25.12.10 01:33
Ok, muss daran liegen das es so spät ist.
Timer != Sleep
Danke ich habs endlich verstanden :) Danke für die Hilfe, probiere es gleich aus...
//EDIT
Magst du mich heiraten ? xD :D
Es funktioniert *freu*
Nach sowas hab ich schon lange gesucht (nicht in Delphi)
Oh man, geiles Weihnachtsgeschenk!!!
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!