OnClick i DblClick - w jednym komponencie.

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.

SZ
  • Rejestracja:ponad 21 lat
  • Ostatnio:ponad 15 lat
  • Postów:3356
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.


Dzięki wszystkim forumowiczom za lata wspólnych dyskusji; miłej zabawy w programowanie!
Sławomir "Szczawik" Włodkowski
0

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

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

Misiekd
  • Rejestracja:ponad 21 lat
  • Ostatnio:ponad 12 lat
  • Postów:7923
0

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


- Ciemna druga strona jest.
- Nie marudź Yoda, tylko jedz tego tosta.
Google NIE GRYZIE!
Pomogłem - kliknij
crowa
  • Rejestracja:ponad 18 lat
  • Ostatnio:około 8 lat
  • Lokalizacja:Poznań
  • Postów:295
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


Tomasz Andrzejewski
Delphi (XE3-XE7) framework engineer @ InterLan
MCP: Microsoft SQL Server 2008, Implementation and Maintenance
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ć.

zbynio_k
  • Rejestracja:około 15 lat
  • Ostatnio:ponad 8 lat
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.


jeśli program, który właśnie mozolnie napisałeś ruszył od pierwszego "kopa" to znaczy, że .....
na pewno gdzieś popełniłeś błąd
woolfik
  • Rejestracja:ponad 17 lat
  • Ostatnio:około 2 godziny
  • Postów:1597
0
exeman2 napisał(a)

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

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

zbynio_k
  • Rejestracja:około 15 lat
  • Ostatnio:ponad 8 lat
0

no to pozostaje

Misiekd napisał(a)

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


jeśli program, który właśnie mozolnie napisałeś ruszył od pierwszego "kopa" to znaczy, że .....
na pewno gdzieś popełniłeś błąd
zbynio_k
  • Rejestracja:około 15 lat
  • Ostatnio:ponad 8 lat
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 ??


jeśli program, który właśnie mozolnie napisałeś ruszył od pierwszego "kopa" to znaczy, że .....
na pewno gdzieś popełniłeś błąd
CL
  • Rejestracja:prawie 16 lat
  • Ostatnio:7 miesięcy
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ź :]

zbynio_k
  • Rejestracja:około 15 lat
  • Ostatnio:ponad 8 lat
0

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


jeśli program, który właśnie mozolnie napisałeś ruszył od pierwszego "kopa" to znaczy, że .....
na pewno gdzieś popełniłeś błąd
woolfik
  • Rejestracja:ponad 17 lat
  • Ostatnio:około 2 godziny
  • Postów:1597
0

Gotowiec dla wszystkich ktorzy maja z tym problem:

Kolorujemy panele

Kopiuj
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;
zbynio_k
  • Rejestracja:około 15 lat
  • Ostatnio:ponad 8 lat
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")


jeśli program, który właśnie mozolnie napisałeś ruszył od pierwszego "kopa" to znaczy, że .....
na pewno gdzieś popełniłeś błąd

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.