Autor |
Beitrag |
HeinzKarl
      
Beiträge: 19
|
Verfasst: Sa 25.12.10 00:37
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:
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
      
Beiträge: 19312
Erhaltene Danke: 1747
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Sa 25.12.10 00:44
Hallo und
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)?
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. 
|
|
HeinzKarl 
      
Beiträge: 19
|
Verfasst: 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  )
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
      
Beiträge: 19312
Erhaltene Danke: 1747
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: 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 
      
Beiträge: 19
|
Verfasst: 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
      
Beiträge: 19312
Erhaltene Danke: 1747
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: 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 
      
Beiträge: 19
|
Verfasst: 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
      
Beiträge: 19312
Erhaltene Danke: 1747
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: 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.
Für diesen Beitrag haben gedankt: HeinzKarl
|
|
HeinzKarl 
      
Beiträge: 19
|
Verfasst: 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
Es funktioniert *freu*
Nach sowas hab ich schon lange gesucht (nicht in Delphi)
Oh man, geiles Weihnachtsgeschenk!!!
|
|
|