AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein GUI-Design mit VCL / FireMonkey / Common Controls Delphi SpeedButton.Click wiederholen bis Maustaste losgelassen wird

SpeedButton.Click wiederholen bis Maustaste losgelassen wird

Ein Thema von Schwedenbitter · begonnen am 20. Jan 2010 · letzter Beitrag vom 26. Jan 2010
Antwort Antwort
Schwedenbitter

Registriert seit: 22. Mär 2003
Ort: Finsterwalde
622 Beiträge
 
Turbo Delphi für Win32
 
#1

SpeedButton.Click wiederholen bis Maustaste losgelassen wird

  Alt 20. Jan 2010, 14:07
Hallo,

möglicherweise gibt es zu meiner Frage im Forum schon eine Antwort. Ich habe aber - möglicherweise mangels der Suchworte - nichts gefunden.
Ich habe auf einem Form 2 TSpeedButtons. Beim Klick auf den einen wird ein Zähler erhöht und beim anderen eben verringert. Bei großen Zahlen nervt es aber, wenn man immer wieder klicken muss. Ich möchte daher erreichen, dass er beim Klick anfängt zu zählen und beim Loslassen der Maustaste wieder aufhört; so wie bei einem TUpDown.

Im Moment habe ich das umständlich so gemacht:
Delphi-Quellcode:
procedure TForm1.FormCreate(Sender: TObject);
begin
   I:=0;
end;

procedure TForm1.BTimerTimer(Sender: TObject);
begin
   If I > 0 Then Dec(I);
   Label1.Caption:=FormatFloat('0,',I);
end;

procedure TForm1.SpeedButton1MouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
   BTimer.Enabled:=True;
end;

procedure TForm1.SpeedButton1MouseUp(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
   BTimer.Enabled:=False;
end;

procedure TForm1.FTimerTimer(Sender: TObject);
begin
   If I < MaxInt Then Inc(I);
   Label1.Caption:=FormatFloat('0,',I);
end;

procedure TForm1.SpeedButton2MouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
   FTimer.Enabled:=True;
end;

procedure TForm1.SpeedButton2MouseUp(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
   FTimer.Enabled:=False;
end;
Geht das auch einfacher?
Ich wäre auch für Links oder eben passende Suchwörter sehr dankbar.

Gruß, Alex
Alex Winzer
  Mit Zitat antworten Zitat
Mysterio08

Registriert seit: 11. Jan 2009
142 Beiträge
 
#2

Re: SpeedButton.Click wiederholen bis Maustaste losgelassen

  Alt 20. Jan 2010, 16:05
Ich hätte noch einen anderen Ansatz:
Du kannst dir die Sprachanweisung Sleep() zu nutze machen. In die runden Klammern gibst du einfach das Intervall des Timers ein, so benötigst du nicht eine extra Komponente. Mit if Button = mbLeft then... könnte man das OnMouseDown-Ereignis überprüfen, ob die linke Maus-Taste noch gedrückt ist (und das OnMouseUp natürlich auch).

Ich hab leider keine Zeit, werde es aber bei Gelegenheit mal ausprobieren.
  Mit Zitat antworten Zitat
Schwedenbitter

Registriert seit: 22. Mär 2003
Ort: Finsterwalde
622 Beiträge
 
Turbo Delphi für Win32
 
#3

Re: SpeedButton.Click wiederholen bis Maustaste losgelassen

  Alt 25. Jan 2010, 23:59
Zitat von Mysterio08:
Ich hätte noch einen anderen Ansatz:
Du kannst dir die Sprachanweisung Sleep() zu nutze machen. In die runden Klammern gibst du einfach das Intervall des Timers ein, so benötigst du nicht eine extra Komponente. Mit if Button = mbLeft then... könnte man das OnMouseDown-Ereignis überprüfen, ob die linke Maus-Taste noch gedrückt ist (und das OnMouseUp natürlich auch).
Danke erstmal für den Hinweis! So ganz verstehe ich das mit dem Sleep aber nicht.
Das Problem besteht darin, dass OnMouseDown leider nur 1x und nicht ständig während des Gedrückt-Haltens der Maus-Taste. Wäre es anders, würde ich das mit dem Sleep() nachvollziehen können.

Zitat von Mysterio08:
Ich hab leider keine Zeit, werde es aber bei Gelegenheit mal ausprobieren.
Hast Du/hat jemand anderes es schon einmal ausprobieren können?

Meinen Code habe ich zusammengeschrumpft, finde ihn aber immer noch umständlich:
Delphi-Quellcode:
Var
  FForward : Boolean;

procedure TForm1.BTimerTimer(Sender: TObject);
begin
  BTimer.Enabled:=False;
  If FForward Then
  begin
    If I < MaxInt Then Inc(I);
  end
  else
  begin
    If I > 0 Then Dec(I);
  end;
  Label1.Caption:=FormatFloat('0,',I);
  BTimer.Enabled:=False;
end;

procedure TForm1.SpeedButtonsMouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
Begin
  FForward:=(Sender = SpeedButton1);
  BTimerTimer(nil); //<- Klick soll sofort einen Effekt haben
End;

procedure TForm1.SpeedButtonsMouseUp(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
  BTimer.Enabled:=False;
end;
Und ich sehe ein weiteres Problem:
Ich blätter mit meinem Programm durch Bilddateien. Bei großen Bildern dauert das Laden manchmal ziemlich lange. Daher halte ich den Timer auch zwischendurch an. Wenn ich jetzt die Maus-Taste loslasse, während das Programm noch die Befehle im Ereignis OnTimer() abarbeitet, wird BTimer.Enabled zunächst auf False gesetzt (=erwünscht), danach dann aber in OnTimer() sogleich wieder auf True (=unerwünscht). Bis jetzt hatte ich bei meinen Tests noch keine Probleme. Aber ich möchte das dennoch absichern
Kann ich das noch irgendwie lösen?

Gruß, Alex
Alex Winzer
  Mit Zitat antworten Zitat
Benutzerbild von s.h.a.r.k
s.h.a.r.k

Registriert seit: 26. Mai 2004
3.159 Beiträge
 
#4

Re: SpeedButton.Click wiederholen bis Maustaste losgelassen

  Alt 26. Jan 2010, 00:02
Ich hätte hierfür zunächst auch einen Timer genommen, nur würde ich das ganze dann logarithmisch aufbauen, so wie die Spin-Komponenten.

Alternativ könntest du einen Thread anwerfen, wobei das vielleicht etwas zu viel des guten ist Es muss halt etwas parallel dazu laufen und den Wert immer wieder erhöhen, wobei du dann eben unbedingt darauf achten musst, dass das alles Thread-safe ist!

Edit: Die VCL macht das via eines Timers!
»Remember, the future maintainer is the person you should be writing code for, not the compiler.« (Nick Hodges)
  Mit Zitat antworten Zitat
Schwedenbitter

Registriert seit: 22. Mär 2003
Ort: Finsterwalde
622 Beiträge
 
Turbo Delphi für Win32
 
#5

Re: SpeedButton.Click wiederholen bis Maustaste losgelassen

  Alt 26. Jan 2010, 09:03
Muss ich mich doch als Gelegenheitsprogrammierer outen:

Was bedeutet es, wenn Du von
Zitat von s.h.a.r.k:
... logarithmisch aufbauen ...
sprichst?

Dass es die VCL auch über einen Timer macht, macht mir ja schon einmal Mut. Insoweit denke ich, dass mein Code gar nicht so schlecht ist. Mein Problem löse ich nun dadurch, dass ich mir zusätzlich zum Timer.Enabled in einer weiteren Boolean-Variable noch merke, obe geblättert werden soll oder nicht. Troztdem lerne ich gern dazu ... auch und vor allem was logarithmisch bedeutet!

Gruß und Danke, Alex
Alex Winzer
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
39.424 Beiträge
 
Delphi 11 Alexandria
 
#6

Re: SpeedButton.Click wiederholen bis Maustaste losgelassen

  Alt 26. Jan 2010, 09:14
Zitat von Schwedenbitter:
Was bedeutet es, wenn Du von
Zitat von s.h.a.r.k:
... logarithmisch aufbauen ...
sprichst?
Je länger man "zusammenhängend" drückt, um so schneller werden die Veränderungen, also um so schneller zählt der Wert weiter.

So kann man für kleine Wertänderungen langsam anfangen
und kann gleichzeitig auch große Veränderungen vornehmen, ohne ewig gedrückt halten zu müssen.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
Delphi-Tage 2005-2014
  Mit Zitat antworten Zitat
Benutzerbild von GPRSNerd
GPRSNerd

Registriert seit: 30. Dez 2004
Ort: Ruhrpott
236 Beiträge
 
Delphi 10.4 Sydney
 
#7

Re: SpeedButton.Click wiederholen bis Maustaste losgelassen

  Alt 26. Jan 2010, 09:57
Hi, ich benutze für so eine Einstellung auch einen Timer und zusätzlich einen Counter, der einen Multiplikationsfaktor einstellt, je nachdem wie oft der Timer schon getriggert wurde:

Delphi-Quellcode:
procedure TForm_Main.tSetTimeTimer(Sender: TObject);
begin
  Inc(Einstellen_Count); //Zählen wie oft schon ausgeführt

  //Beschleunigung einstellen
  case Einstellen_Count of
    0.. 5: Richtung_Einstellen := 1;
    6..10: Richtung_Einstellen := 5;
    else
      Richtung_Einstellen := 10;
  end;

  //Hier den Wert deiner Variablen entsprechend erhöhen/erniedrigen...

end;
Stefan
  Mit Zitat antworten Zitat
Benutzerbild von s.h.a.r.k
s.h.a.r.k

Registriert seit: 26. Mai 2004
3.159 Beiträge
 
#8

Re: SpeedButton.Click wiederholen bis Maustaste losgelassen

  Alt 26. Jan 2010, 12:34
Denkbar wäre auch, dass sich das Interval, in dem der Timer feuert, ändert, wobei man erroieren müsste, was für den User am sinnvollsten wäre.
»Remember, the future maintainer is the person you should be writing code for, not the compiler.« (Nick Hodges)
  Mit Zitat antworten Zitat
Schwedenbitter

Registriert seit: 22. Mär 2003
Ort: Finsterwalde
622 Beiträge
 
Turbo Delphi für Win32
 
#9

Re: SpeedButton.Click wiederholen bis Maustaste losgelassen

  Alt 26. Jan 2010, 12:42
Zitat von s.h.a.r.k:
Denkbar wäre auch, dass sich das Interval, in dem der Timer feuert, ändert, wobei man erroieren müsste, was für den User am sinnvollsten wäre.
Das geht bei mir leider nicht, weil das Lesen der Bilddateien von der Festplatte und das Entpacken (png) seine Zeit dauert. Aber die Idee ist Spitze, mit zunehmender Dauer des Drückens z.B. 1 oder 2 Seiten zu überspringen. Ich werde das mal ausprobieren.

1000-Dank, Alex
Alex Winzer
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 23:55 Uhr.
Powered by vBulletin® Copyright ©2000 - 2022, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2021 by Daniel R. Wolf