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 gedrückte Maustaste soll sich wie Entertaste verhalten (https://www.delphipraxis.net/112971-gedrueckte-maustaste-soll-sich-wie-entertaste-verhalten.html)

TUX_der_Pinguin 30. Apr 2008 13:51


gedrückte Maustaste soll sich wie Entertaste verhalten
 
Hi,

ich habe eine kleine ListBox mit Einträgen jetzt möchte ich gerne das der Anwender die Reihenfolge
der Eintrage verändern kann, also Multiselect an, und mit zwei Buttons soll der Anwender die markierten
Einträge nach unten bzw. nach oben schieben können.

Alles kein Problem, per OnClick Ereignis geht das ruckzuck. Halte ich jedoch die Maustaste fest so
werden die Einträge nur um 1 verschoben, halte ich die Entertaste fest so wird das Ereignis dauernd
ausgelöst und dieses würde ich gern auch auf die Maustaste legen können.

Ziel: Einen oder mehre Einträge markieren und mit gedrückter Maustaste die Einträge verschieben.

Irgendwie hab ich grade einen Knoten drin das ich nicht drauf komme wie ich das lösen soll.

rollstuhlfahrer 30. Apr 2008 13:55

Re: gedrückte Maustaste soll sich wie Entertaste verhalten
 
hi,

im OnMouseOver vom Button (falls es das gibt) kannst du abfragen, ob die maus gedrückt ist. Problem ist dabei aber, glaub ich, dass das OnMouseOver-Event nur 1 einziges Mal ausgelöst wird.

rollstuhlfahrer

TUX_der_Pinguin 30. Apr 2008 13:58

Re: gedrückte Maustaste soll sich wie Entertaste verhalten
 
Zitat:

Zitat von rollstuhlfahrer
hi,
im OnMouseOver vom Button (falls es das gibt) kannst du abfragen, ob die maus gedrückt ist. Problem ist dabei aber, glaub ich, dass das OnMouseOver-Event nur 1 einziges Mal ausgelöst wird.

Das ist quasi das Problem, das jedes der Maus Events, wie OnMouseOver, OnMouseDown etc. nur jeweils einmal ausgelöst wird
es sollte doch möglich sein dem irgendwie bei zu bringen, das solange ich den Button drücke (Maustaste gedrückt halten)
das Ereignis auslöst, mehrfach.

Ich bin auch auf der Suche nach einer Lösung ich weiß grade nicht mals genau wonach ich suchen muß.

tomsel 30. Apr 2008 14:06

Re: gedrückte Maustaste soll sich wie Entertaste verhalten
 
Vielleicht ein Ansatz?: Bei MouseDown auf den Button einen Timer aktivieren, die gewünschte Funktion aufruft, bis er in MouseUp gestoppt wird.

TUX_der_Pinguin 30. Apr 2008 14:23

Re: gedrückte Maustaste soll sich wie Entertaste verhalten
 
In die richtung habe ich auch schon gedacht, aber das wäre doch eher arg viel aufwand.
Was ich mich ja frage wieso klappt das ganze bei gedrückter Entertaste und könnte man
nicht einfach dieses simulieren.

tomsel 30. Apr 2008 14:27

Re: gedrückte Maustaste soll sich wie Entertaste verhalten
 
Zitat:

In die richtung habe ich auch schon gedacht, aber das wäre doch eher arg viel aufwand.
Ach was, wieso denn?

Zitat:

Was ich mich ja frage wieso klappt das ganze bei gedrückter Entertaste
Weil es eine automatische Tastaturwiederholung gibt, aber keine "Mauswiederholung"

Zitat:

und könnte man nicht einfach dieses simulieren.
Klar, z.Bsp. mit einem Timer :mrgreen:

Fussball-Robby 30. Apr 2008 14:34

Re: gedrückte Maustaste soll sich wie Entertaste verhalten
 
Das ist doch nicht viel Aufwand :roll:
Timer auf die Form, Interval auf 150 Enabled = False
Gewünschten Code ins OnTimer-Ereignis
Ins OnMouseDown des Buttons: Timer1.Enabled := True;
Ins OnMouseUp: Timer1.Enabled := False;

PS.: Oh, doch mehr Aufwand als gedacht: Man muss einen Timer auf die Form ziehen und 2 Zeilen Code schreiben :mrgreen:

Medium 30. Apr 2008 14:34

Re: gedrückte Maustaste soll sich wie Entertaste verhalten
 
Schau doch einfach mal, wie TSpinEdit bzw. TSpinButton das machen ;)

TUX_der_Pinguin 30. Apr 2008 14:37

Re: gedrückte Maustaste soll sich wie Entertaste verhalten
 
Ok Ok, ich hab mich überreden lassen und es doch mal mit einem Timer versucht.

Sobald ich auf den Button klicke und die Maustaste gedrückt halte wird der Timer aktiviert
und alle 100ms wird ein Zähler erhöht, lasse ich die Taste los so wird der Timer deaktiviert.

Dies ist jetzt nur der Test, ich muß das ganze noch so umbauen das ich Items rauf bzw. runter
verschieben kann, aber das sollte ich noch hinbekommen ;-)

Delphi-Quellcode:
procedure TfrmMain.Button1MouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
  TimerMoveItems.Enabled := True;
end;


procedure TfrmMain.Button1MouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
  TimerMoveItems.Enabled := False;
end;


procedure TfrmMain.TimerMoveItemsTimer(Sender: TObject);
begin
  Inc(Blupp);
  Label1.Caption := IntToStr(Blupp);
end;
Geht doch einfachher als ich zu Anfang gedacht habe, vielen dank für die Tipps und Anregungen.


Alle Zeitangaben in WEZ +1. Es ist jetzt 09:19 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