OnClick i DblClick - w jednym komponencie.

0

Witam.

Mam pewien problem...

Mam - powiedzmy komponent na formie Label1. - chciałbym aby po pojedyńczym kliku pokazał się showmessage('1');, a po podwójnym showmessage('2'); ....

Tylko jest problem natury takiej - gdzie uzupełnie OnClick i OnDblClick - to za każdym razem wykonuje się pozycja z OnClick... ):

Nie mam zielonego pojęcia o co w tym chodzi....

Pozdrawiam.

0

Pomyśl trochę - zanim w podwójnym klikniesz drugi raz, wykonałeś kliknięcie więc wywołuje się OnClick. Ponieważ w akcji robisz ShowMessage, które zmienia aktywność okna, OnDblClick w ogóle się nie wywoła.

0

No właśnie dlatego tu napisałem.

Bo chciałbym poznać odpowiedz czy jest to możliwe do ominięcia...

0

musiał byś sam zrobić własny onClick i onDblClick używając MouseDown, MouseMove i MouseUp

0

hej Panowie za duzo kombinujecie
zrob sobie interval w zdarzeniu on click

klikasz raz - startuje timer i odlicza w dol, jesli w tym czasie nie nastapi ponowne klikniecie to masz on click w innym wypadku doble click.

Jakbys sobie pobral jeszcze z kontekstu myszy czas dbclicka to by bylo juz super- pamietaj o application.messages

0

powiedz co chcesz uzyskać, zazwyczaj to że wykona się onClick przed onDblClick nie przeszkadza
prawdopodobnie tylko w twoim teście jest źle ale docelowo chyba nie będziesz pokazywał MessageBoxa tylko coś robił więc wtedy może nie będzie źle

np jeśli po pojedynczym kliknięciu link ma dostać ramkę, a po podwójnym ma zostać otworzona jakaś strona to nie przeszkodzi to że przed otworzeniem strony link będzie obramowany a ewentualnie możesz w dblClick tą ramkę zdjąć

to taki przykład bo nie wiem co tam chcesz robić

0

killmesoftly: to jest troche bez sensu. Zależy o jaki scenariusz Ci chodzi:
1.

  • Wyświetli się 'click' w przypadku pojedyczego klikniecia
  • Wyświetli się 'click' i zaraz potem 'dblclick' w przypadku podwójnego klikniecia
  • Wyświetli się 'click' w przypadku pojedyczego klikniecia
  • Wyświetli się 'dblclick' w przypadku podwójnego klikniecia

Scenariusz 1 jest trywialny dla sytuacji o jakiej pisze poprzednik (czyli zdarzenie nie jest blokujące, w szczególności nie jest wyświetlane żadne modalne okno). Można jednak zamiast MessageDlg dać MessageBox z HWND = 0, wtedy wyświetli się komunikat, ale nie będzie blokujący.

Co do drugiego to jest możliwy tylko w przypadku timeoutu (czyli sytuacja gdy klikniety jest przycisk myszy tylko raz jest wykrywana dopiero po ok. sekundzie). Można zrobić TTimerem, ale jest to takie troche mało profesjonalne. W ogóle nie widzę praktycznego zastosowania tego drugiego scenariusza.

Powiedz dokładnie co chcesz uzyskać.

0

zainteresował mnie ten temat na tyle, że spróbowałem napisać programik i ....
wydaje się, że ALBO - ALBO (no chyba, jak sugeruje @Misiekd napiszesz wlasną obsługę)
ani TTimer ani GetTickCount nie "podchodzi"

przychylam się do :

exeman2 napisał(a)

killmesoftly: to jest troche bez sensu.

exeman2 napisał(a)

W ogóle nie widzę praktycznego zastosowania tego drugiego scenariusza.

0
exeman2 napisał(a)

W ogóle nie widzę praktycznego zastosowania tego drugiego scenariusza.

A obsluga ikon w windowsie? Pojedynczy klik zaznaczenie dbl uruchomienie :)

0

no to pozostaje

Misiekd napisał(a)

musiał byś sam zrobić własny onClick i onDblClick używając MouseDown, MouseMove i MouseUp

0
killmesoftly napisał(a)

No właśnie dlatego tu napisałem.

Bo chciałbym poznać odpowiedz czy jest to możliwe do ominięcia...

i jakoś Cię to w ogóle nie interesuje :>
czekasz na gotowca ??

0
zbynio_k napisał(a)
killmesoftly napisał(a)

No właśnie dlatego tu napisałem.

Bo chciałbym poznać odpowiedz czy jest to możliwe do ominięcia...

i jakoś Cię to w ogóle nie interesuje :>
czekasz na gotowca ??

ten temat ma ponad 2 lata... autor na pewno z niecierpliwością przegląda codziennie to forum i czeka na odpowiedź :]

0

o k************a masz RACJĘ
niby miesiąc i dzień jakby blisko ... tylko ten rok ;-P

0

Gotowiec dla wszystkich ktorzy maja z tym problem:

Kolorujemy panele

procedure TForm1.BitBtn1Click(Sender: TObject);
begin
  Panel1.Color := clGreen; //czyszczenie
  Panel2.Color := clGreen; //czyszczenie
end;

procedure TForm1.Label1Click(Sender: TObject);
begin
t := TRUE; //zmienna globalna
Timer1.Enabled := True;
end;

procedure TForm1.Label1DblClick(Sender: TObject);
begin
  t := False;
  Panel2.Color := clRed;
end;

procedure TForm1.Timer1Timer(Sender: TObject);
begin //interval na 150 wystarczy a enable na false;
if t then
  Panel1.Color := clYellow;
  Timer1.Enabled := False;
end;
0

@woolfik,
jeszcze raz ukłony dla Twojej wiedzy :)
nie pieklij się za często, choć i mnie złość nieraz ogarnia ;-)
próbowałem czegoś podobnego ale .... (jakoś NIE "wyszło")

1 użytkowników online, w tym zalogowanych: 0, gości: 1