Autor Beitrag
Takeshi
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 64



BeitragVerfasst: Mo 01.09.03 04:20 
Hallo!

Ich möchte gerne für einen vor- und einen zurück-Button dass wenn diese länger gedrückt werden ganz an den Anfang bzw ans Ende gesprungen wird.
Dieses lange-gedrückt Ereignis habe ich bisher so gelöst:

ausblenden 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:
var
  bMouseDown: boolean;

procedure TForm1.Button1MouseUp(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
bMouseDown:=false;
end;

procedure TForm1.Button1MouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
var
  start,stop:longint;
begin
if ssLeft in Shift then begin
  bMouseDown:=true;
  start := gettickcount;
  while (stop - start ) < 1000 do begin
    stop := gettickcount;
    application.processmessages;
    if bMouseDown=false then exit;
  end;
  ShowMessage('lange gedrückt');
  end;
end;


Zwar funktioniert das, Aber gerade hat es auch schon nicht funktioniert. Es scheint mir also keine besonders sichere Lösung zu sein.
Wisst Ihr, wie man das besoders geschickt anstellen könnte ?

Vielen Dank und Gruß, Takeshi
Gausi
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 8548
Erhaltene Danke: 477

Windows 7, Windows 10
D7 PE, Delphi XE3 Prof, Delphi 10.3 CE
BeitragVerfasst: Mo 01.09.03 11:51 
Hi,
zuerst mal würde ich auch vor Eintritt in die While-Schleife
ausblenden Delphi-Quelltext
1:
stop:=gettickcount;					

einfügen, damit man auf jeden Fall in die Schleife eintritt.

Eine andere Möglichkeit wäre, das über einen Timer zu machen:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
procedure TForm1.Button1MouseDown(Sender: TObject; Button: TMouseButton; 
  Shift: TShiftState; X, Y: Integer); 
begin
    timer1.enabled:=true;
end;

procedure TForm1.Button1MouseUp(Sender: TObject; Button: TMouseButton; 
  Shift: TShiftState; X, Y: Integer); 
begin
    timer1.enabled:=false;
end;

procedure TForm1.Timer1Timer(Sender: TObject);
begin
    timer1.enabled:=false;
    ShowMessage('lange gedrückt'); 
end;

Problem bei der Lösung ist nur, dass das OnTimer-Event auch dann ausgelöst wird, wenn auf dem Button die Maustaste gedrückt wurde, und wo anders wieder losgelassen wird.

Alles Gute, Daniel

_________________
We are, we were and will not be.
Takeshi Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 64



BeitragVerfasst: Mo 01.09.03 18:22 
Aber ist das bei einer Lösung mit Hilfe von MouseDown + MouseUp nicht immer der Fall ?

Nachtrag:
Außerdem habe ich das ausprobiert, ich verwende dabei übrigens ein Image und keinen Button.
Wenn ich darauf drücke und die Maus wegziehe und woanders loslasse wird der Timer auch deaktiviert, es wird jedenfalls nicht das OnTimer ausgelöst.
CenBells
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1547

Win 7
Delphi XE5 Pro
BeitragVerfasst: Mo 01.09.03 18:28 
Takeshi hat folgendes geschrieben:
Aber ist das bei einer Lösung mit Hilfe von MouseDown + MouseUp nicht immer der Fall ?

Nachtrag:
Außerdem habe ich das ausprobiert, ich verwende dabei übrigens ein Image und keinen Button.
Wenn ich darauf drücke und die Maus wegziehe und woanders loslasse wird der Timer auch deaktiviert, es wird jedenfalls nicht das OnTimer ausgelöst.


HAllo,

also eigentlich wird onMouseUp nur auf der komponente ausgelöst, über der sich der zeiger beim loslassen befindet.
Es kann natürlich sein, daß das event (die nachricht) durchgereicht wird, muss aber nicht immer sein
Gruß
Ken

_________________
Eine Klasse beschreibt die Struktur und das Verhalten einer Menge gleichartiger Objekte.
Takeshi Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 64



BeitragVerfasst: Mo 01.09.03 19:07 
nun scheinbar wird sie das in diesem fall.
funktioniert das dann jetzt in diesem fall immer oder kann das abhängig von irgendwelchen faktoren auch mal wieder nicht funktionieren ?

ps: wie kann Durst denn ein bool'scher wert sein ?
Gausi
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 8548
Erhaltene Danke: 477

Windows 7, Windows 10
D7 PE, Delphi XE3 Prof, Delphi 10.3 CE
BeitragVerfasst: Mo 01.09.03 19:18 
Wenn du den Timer nicht auch anderweitig verwendest, sollte das so eigentlich immer funktionieren.

_________________
We are, we were and will not be.