Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi OnClick-Ereignis Wiederholen (https://www.delphipraxis.net/68801-onclick-ereignis-wiederholen.html)

Freddy7 5. Mai 2006 16:02


OnClick-Ereignis Wiederholen
 
Moin, moin,

ich möchte gerne folgendes realisieren (vermutlich sehr simple):
Wenn ich auf einen Button drücke wird meine OnClick-Routine ausgeführt. Dies aber leider nur einmal. Wenn ich die Routine ein zweites mal starten möchte, muss ich noch einmal auf den Button klicken.
Daher meine Frage: Wie stelle ich es an, dass die Routine immer wieder aufgerufen wird, solange ich den Button gedrückt halte?

Gruss,
Freddy

marabu 5. Mai 2006 16:16

Re: OnClick-Ereignis Wiederholen
 
Herzlich willkommen in der Delphi-PRAXiS, Freddy.

Hier ein Muster ohne Wert:

Delphi-Quellcode:
procedure TDemoForm.DemoButtonMouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
var
  i: Integer;
begin
  // DemoButtonDown bitte als private variable von Form deklarieren
  DemoButtonDown := true;
  i := 0;
  while DemoButtonDown do
  begin
    Inc(i);
    StatusBar.SimpleText := IntToStr(i);
    Application.ProcessMessages;
  end;
end;

procedure TDemoForm.DemoButtonMouseUp(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
  DemoButtonDown := false;
end;
Falls du die Maus nicht festhalten willst, dann nimmst du einen Button mit der Eigenschaft Down.

Freundliche Grüße vom marabu

pacman1986 5. Mai 2006 16:20

Re: OnClick-Ereignis Wiederholen
 
Delphi-Quellcode:
...
  while DemoButtonDown do
  begin
    demobutton.Click;
  end;
würde ich sagen... ^^

zecke 5. Mai 2006 16:23

Re: OnClick-Ereignis Wiederholen
 
:hi:

Du könntest auch eine Funktion am Ende der Prozedur aufrufen, die im Grunde den selben Code wie die Prozedur enthält (bis auf den function-Aufruf). Nicht schön, aber sollte funktionieren und ist einfach (Ich sage nicht, dass die Anderen Möglichkeiten nicht einfach sind :mrgreen:).

Freddy7 8. Mai 2006 10:11

Re: OnClick-Ereignis Wiederholen
 
Hallo zusammen,

vielen Dank für die Hinweise. Ich habe daraus folgende Lösung gebastelt, die genau das tut, was ich wollte (vielleicht geht's ja noch einfacher?): (Änderung: Ich verwende die MouseDown-Routine, da die Click-Routine erst ausgeführt wird, wenn der Knopf losgelassen wird!)

Delphi-Quellcode:
procedure Tfrm_ProMonZ.DemoButtonMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
  ButtonDown := true;
  while ButtonDown do
  begin
    //Anweisungen
    Application.ProcessMessages;
  end;
end;

procedure Tfrm_ProMonZ.DemoButtonMouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
    ButtonDown:=false;
end;
Gruss,
Freddy

[edit=sakura] [delphi]Tags Mfg, sakura[/edit]

jim_raynor 8. Mai 2006 10:52

Re: OnClick-Ereignis Wiederholen
 
Ich würde es mal so probieren:

Delphi-Quellcode:
procedure Tfrm_ProMonZ.DemoButtonClick(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
  while GetKeyState(VK_LBUTTON)<0 do
  begin
    //Anweisungen
    Application.ProcessMessages;
  end;
end;
Das GetKeyState bewirkt, dass die Schleife solange läuft, bis die Maustaste losgelassen wird. Vorteil ist allerdings, dass du nicht auf das Event MouseUp des Buttons angewiesen bist. Denn es gibt garantiert möglichkeiten, wie man das Event umgehen kann und dann hängst in einer ollen Schleife fest. So kann es nicht passieren, da die Maustaste bei jedem Durchlauf abgefragt wird.

Allerdings nur ein Versuch und noch nicht getestet.

Freddy7 9. Mai 2006 13:57

Re: OnClick-Ereignis Wiederholen
 
Yo, auch ne gute Idee. Hab Deine Lösung implementiert, da sie ja noch deutlich einfacher ist (nur eine Ereignisroutine statt zwei. Zudem brauche ich keine globale Variable).

Du meinstest natürlich die MouseDown-Routine und nicht die Click-Routine. Ich hab das entsprechend geändert.

Delphi-Quellcode:
procedure Tfrm_ProMonZ.DemoButton[b]MouseDown[/b](Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
  while GetKeyState(VK_LBUTTON)<0 do
  begin
    //Anweisungen
    Application.ProcessMessages;
  end;
end;
Gruss,
Heiko

[edit=Luckie]Delphi-Tags gesetzt. Beim nächsten mal bitte selber machen. Mfg, Luckie[/edit]


Alle Zeitangaben in WEZ +1. Es ist jetzt 11:28 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz