Autor Beitrag
HeinzKarl
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 19



BeitragVerfasst: 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:

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:
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
    { Private declarations }
    procedure ButtonMove;
  public
    { Public declarations }
  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 user profile iconNarses: Titel geändert, war: "Anfänger Frage (Button bewegen)".
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19312
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 19



BeitragVerfasst: 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 :) )
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:
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
    { Private declarations }
  public
    { Public declarations }
  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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19312
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 19



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19312
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Sa 25.12.10 01:07 
user profile iconHeinzKarl hat folgendes geschrieben Zum zitierten Posting springen:
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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 19



BeitragVerfasst: 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 :
ausblenden 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.


ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19312
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: 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...

user profile iconHeinzKarl hat folgendes geschrieben Zum zitierten Posting springen:
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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 19



BeitragVerfasst: 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!!!