[delphi]dubbelklik simuleren

Pagina: 1
Acties:
  • 162 views sinds 30-01-2008
  • Reageer

  • Megamind
  • Registratie: Augustus 2002
  • Laatst online: 14-05 03:35
Ik ben bezig met een progje dat de comport uitleest (die wordt dmv knopjes aangestuurd). Dat gaat goed icm SerialNG component, deze geeft een true als je een knop indrukt en een false als je m niet indrukt :+

Maar nu wil ik dat je ook kan 'dubbelklikken' op een knop zodat er iets anders getriggerd wordt. Maar hoe doe ik dat :/ Ik ben al bezig geweest met een Timer maar ik kom er niet echt uit.. Iemand die een beetje opweg kan helpen..

  • dsmeef
  • Registratie: Oktober 2002
  • Laatst online: 08-06-2024
een timer setten zodra je een knop indrukt, en bij een volgende indruk kijken of die timer nog niet uitgeteld is? zo ja -> actie dubbelklik, zo nee -> actie enkelklik (en timer setten)

zo iets?
weet niets van delphi, dus hoe dat op te lossen weet ik niet, maar dat is hoe ik het zou doen in andere talen :)

  • Megamind
  • Registratie: Augustus 2002
  • Laatst online: 14-05 03:35
dsmeef schreef op 04 augustus 2004 @ 17:10:
een timer setten zodra je een knop indrukt, en bij een volgende indruk kijken of die timer nog niet uitgeteld is? zo ja -> actie dubbelklik, zo nee -> actie enkelklik (en timer setten)

zo iets?
weet niets van delphi, dus hoe dat op te lossen weet ik niet, maar dat is hoe ik het zou doen in andere talen :)
Dat heb ik idd geprobeerd, zou ook moeten kunnen maar ik kom een beetje heel erg in de knoop met mezelf :?

  • dsmeef
  • Registratie: Oktober 2002
  • Laatst online: 08-06-2024
voor "in de knoop met jezelf" is dit forum niet bedoelt natuurlijk ;)
maar waar loop je tegenaan? wat gaat er fout dan? de waarde van de timer geeft vreemde dingen terug? of..?

[ Voor 5% gewijzigd door dsmeef op 04-08-2004 17:19 ]


  • Creepy
  • Registratie: Juni 2001
  • Laatst online: 15:14

Creepy

Tactical Espionage Splatterer

Megamind schreef op 04 augustus 2004 @ 17:11:
[...]

Dat heb ik idd geprobeerd, zou ook moeten kunnen maar ik kom een beetje heel erg in de knoop met mezelf :?
Als je nou eens uit zou leggen wat je precies hebt geprobeerd en waar het mis ging dan kunnen we je misschien nog helpen :)

Edit: * Creepy is traag met deze warmte ;)

[ Voor 6% gewijzigd door Creepy op 04-08-2004 17:20 ]

"I had a problem, I solved it with regular expressions. Now I have two problems". That's shows a lack of appreciation for regular expressions: "I know have _star_ problems" --Kevlin Henney


  • Megamind
  • Registratie: Augustus 2002
  • Laatst online: 14-05 03:35
Creepy schreef op 04 augustus 2004 @ 17:19:
[...]

Als je nou eens uit zou leggen wat je precies hebt geprobeerd en waar het mis ging dan kunnen we je misschien nog helpen :)

Edit: * Creepy is traag met deze warmte ;)
* Megamind ook :|

Ik heb het nu zo:

Ik klik 1x, de timer wordt gestart, er wordt een var opgeslagen dat hij 1x geklikt is.

Als ik nou nog een keer klik dan kijkt hij of die var geset is, zo ja kijkt hij ook of de timer geset is, zo ja is het een dubbelklik, zonee dan een singel klik..

Theoretisch, het werkt alleen niet.. Het gaat niet zozeer om de sourcecode zelf, maar om de gedachtegang erachter :P

  • Creepy
  • Registratie: Juni 2001
  • Laatst online: 15:14

Creepy

Tactical Espionage Splatterer

Wat dacht je van: Click -> sla tijd op in millisecs en vergelijk met vorige tijd.
Is verschil kleiner dan x aantal millisecs then dubbelklik

"I had a problem, I solved it with regular expressions. Now I have two problems". That's shows a lack of appreciation for regular expressions: "I know have _star_ problems" --Kevlin Henney


  • curry684
  • Registratie: Juni 2000
  • Laatst online: 12-05 22:23

curry684

left part of the evil twins

Gaat het hier nu echt om GetTickCount aanroepen, de returnvalue en de knop-index opslaan, en bij de volgende druk checken of het dezelfde knop is en of GetTickCount() - previousvalue kleiner is dan X? :?

Professionele website nodig?


  • schoene
  • Registratie: Maart 2003
  • Laatst online: 22-05 12:29
@Creepy: dan zal een doubleclick ook een singleclick genereren, en ik denk dat dat de bedoeling niet is.

een snelle gedachte:

initieel:
*een timer die niet gestart is;
*een teller die op nul staat;

bij een klik op de knop:
*teller incrementeren
*als teller >= 2 :Timer stoppen; teller op nul; dubbelklik-functie
anders Timer starten;

bij aflopen van timer:
*als teller = 1: Enkele klik;
anders dubbele klik; (kan dit?)
*teller op nul;

[ Voor 8% gewijzigd door schoene op 04-08-2004 17:48 ]


  • Megamind
  • Registratie: Augustus 2002
  • Laatst online: 14-05 03:35
Hmpf dan zal het wel aan mij liggen zeker?

code:
1
2
3
4
5
6
7
  if SerialPortNG1.RLSDState then
  begin
    if TimerRLSD.enabled then
      RLSDDouble := True
    else
      TimerRLSD.Enabled := true;
  end

timer:
code:
1
2
3
4
5
6
  if RLSDDouble then
    Caption := 'Double'
  else
    Caption := 'Single';
  TimerRLSD.Enabled := False;
  RLSDDouble := False;


Hij geeft nou altijd Double aan terwijl ik maar 1x druk! Zelfs al zet ik er een check in, die controleerd of RLSDDouble true of false is, springt RLSDDouble gelijk op true

[ Voor 33% gewijzigd door Megamind op 04-08-2004 17:49 ]


  • WildernessChild
  • Registratie: Februari 2002
  • Niet online

WildernessChild

Voor al uw hersenspinsels

Waar wordt je bovenste blokje code uitgevoerd? In een event-loop o.i.d.?

Maker van Taekwindow; verplaats en resize je vensters met de Alt-toets!


  • NMe
  • Registratie: Februari 2004
  • Laatst online: 14:53

NMe

Quia Ego Sic Dico.

Je zou natuurlijk ook een panel neer kunnen plempen, en die als knop gebruiken... Panels hebben wel een onDoubleClick method. ;)
Je zou onMouseDown en onMouseUp wat met de bevels kunnen kloten voor het "indruk" effect.

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


  • Megamind
  • Registratie: Augustus 2002
  • Laatst online: 14-05 03:35
WildernessChild schreef op 04 augustus 2004 @ 17:57:
Waar wordt je bovenste blokje code uitgevoerd? In een event-loop o.i.d.?
Hmm via een component die detect als je een knop indrukt op je externe com kastje (zelfknutsel ;))
NMe84 schreef op 04 augustus 2004 @ 17:57:
Je zou natuurlijk ook een panel neer kunnen plempen, en die als knop gebruiken... Panels hebben wel een onDoubleClick method. ;)
Je zou onMouseDown en onMouseUp wat met de bevels kunnen kloten voor het "indruk" effect.
Dat is juist het probleem, hij moet wel weten wanneer het een dubbelklik is ;)

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 14:53

NMe

Quia Ego Sic Dico.

Megamind schreef op 04 augustus 2004 @ 18:01:
Dat is juist het probleem, hij moet wel weten wanneer het een dubbelklik is ;)
Panels hebben toch een onDoubleClick event? :?

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


  • Megamind
  • Registratie: Augustus 2002
  • Laatst online: 14-05 03:35
NMe84 schreef op 04 augustus 2004 @ 18:04:
[...]

Panels hebben toch een onDoubleClick event? :?
Ja ok, ik snap het sorrie, ik probeer dus nu de onmousedown te koppelen aan de knop, ff kijken hoor die onmousedown vraagt nogal wat parameters ;)

Verwijderd

Panels kunnen weer niet zo goed overweg met seriele poorten... :)

Ik zou 't alsvolgt doen:

Klik 1 zet een timer aan, die na een X aantal milliseconden z'n OnTimer event aanroept. Dat is dan je single click event (niet vergeten om als eerste binnen dat event de timer weer uit te zetten).

Wanneer klik 2 binnenkomt terwijl de timer nog loopt: timer acuut uitzetten en het double click event aanroepen.

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 14:53

NMe

Quia Ego Sic Dico.

Die panel hoeft niet overweg te kunnen met seriële poorten? :?

Het boeit Delphi echt niet of je nou via een panel een procedure start, of dat je dat via een button doet...

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Verwijderd

Het boeit Delphi ook niet of je een event start via een eigengeschreven routine (in dit geval het handigste IMHO) of via via via een OnDoubleClick event van een overbodig panel.
Smaken verschillen... :)

[ Voor 3% gewijzigd door Verwijderd op 04-08-2004 18:33 ]


  • Megamind
  • Registratie: Augustus 2002
  • Laatst online: 14-05 03:35
Verwijderd schreef op 04 augustus 2004 @ 18:07:
Panels kunnen weer niet zo goed overweg met seriele poorten... :)

Ik zou 't alsvolgt doen:

Klik 1 zet een timer aan, die na een X aantal milliseconden z'n OnTimer event aanroept. Dat is dan je single click event (niet vergeten om als eerste binnen dat event de timer weer uit te zetten).

Wanneer klik 2 binnenkomt terwijl de timer nog loopt: timer acuut uitzetten en het double click event aanroepen.
Ok dit zou moeten werken:
code:
1
2
3
4
5
6
7
8
9
10
  if SerialPortNG1.RLSDState then
  begin
    if TimerRLSD.enabled = false then begin
      TimerRLSD.Enabled := True;
    end else if TimerRLSD.enabled = true then
    begin
      TimerRLSD.Enabled := False;
      Caption := 'Double!';
    end
  end;


Alleen hij geeft direct de caption 'Double'! Ik denk dat die component iets raars doet want hij zou het normaal moeten doen :?

edit/
Ik zie het al ja, als je 1x op de knop drukt dan vliegt hij een aantal keer door de procedure heen :|

code:
1
  Label1.Caption := IntToStr((StrToInt(Label1.Caption)+1));

[ Voor 14% gewijzigd door Megamind op 04-08-2004 18:45 ]


  • NMe
  • Registratie: Februari 2004
  • Laatst online: 14:53

NMe

Quia Ego Sic Dico.

Verwijderd schreef op 04 augustus 2004 @ 18:32:
Het boeit Delphi ook niet of je een event start via een eigengeschreven routine (in dit geval het handigste IMHO) of via via via een OnDoubleClick event van een overbodig panel.
Smaken verschillen... :)
Overbodig panel? Jouw idee gebruikt 2 componenten, het mijne gebruikt er 1. Dus wie gebruikt nou een overbodig component? ;)

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


  • IWriteCode
  • Registratie: Juli 2000
  • Laatst online: 21-05 13:54

IWriteCode

Less = more

Gooi een TTimer op een form... zet die timeout of 10 ms...

dan het Timer Event is:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
// Timer Event
procedure TForm1.OnTimer
begin
  DefaultClickAction; // doet de 1 keer klikken  

  Timer1.Enabled := False;
end;

procedure Click;
begin
  if Timer1.Enabled then begin
    DefaultDoubleClickAction; // doet de 2 keer klikken
  end
  else begin
    Timer1.Enabled := True;
  end;
end;

Less = more


  • Mr.Nobody
  • Registratie: Oktober 2001
  • Niet online
ik zie het probleem niet echt? gebruik een andere button die wel dubbelklik heeft, of pruts er zelf een dubbelklik code bij in.

ik dacht dat curry684 de oplossing had, totdat ik me realiseerde dat het over een knop op het form ging i.p.v. een knop aan de com poort :)
er zijn ook serial componenten die in een eigen thread werken, dan kon je nog wel eens in de knoop komen idd :) (in de properties kun je dit veranderen).

Opensource delphi componenten (http://www.delphi-jedi.org)


Verwijderd

Ik hoop dat ik het probleem van de topicstarter goed heb begrepen. Wanneer ik wil detecteren of iemand een dubbelklik op een knop (TButton) heeft gedaan, doe ik dat als volgt:

- Maak een nieuwe form met een TTimer en een TButton
- Stel bij de TTimer de volgende waarden in:
* Enabled = False
* Interval = 200

Vervolgens voeg je deze code in als eventhandler bij OnTimer (TTimer) en OnClick (TButton):
Delphi:
1
2
3
4
5
6
7
8
9
10
11
12
procedure TForm1.Button1Click(Sender: TObject);
begin
  if Timer1.Enabled then
    Button1.Caption := 'Double click!'
  else
    Timer1.Enabled := True;
end;

procedure TForm1.Timer1Timer(Sender: TObject);
begin
  Timer1.Enabled := False;
end;

  • Megamind
  • Registratie: Augustus 2002
  • Laatst online: 14-05 03:35
Verwijderd schreef op 04 augustus 2004 @ 19:10:
Ik hoop dat ik het probleem van de topicstarter goed heb begrepen. Wanneer ik wil detecteren of iemand een dubbelklik op een knop (TButton) heeft gedaan, doe ik dat als volgt:

- Maak een nieuwe form met een TTimer en een TButton
- Stel bij de TTimer de volgende waarden in:
* Enabled = False
* Interval = 200

Vervolgens voeg je deze code in als eventhandler bij OnTimer (TTimer) en OnClick (TButton):
Delphi:
1
2
3
4
5
6
7
8
9
10
11
12
procedure TForm1.Button1Click(Sender: TObject);
begin
  if Timer1.Enabled then
    Button1.Caption := 'Double click!'
  else
    Timer1.Enabled := True;
end;

procedure TForm1.Timer1Timer(Sender: TObject);
begin
  Timer1.Enabled := False;
end;
Ok dit is idd aardig gelukt ;) Het probleem zat een beetje in de component die nogal brak de knoppen uitlas; hij zei gerust dat ik er 4x op drukte terwijl ik hem maar 1x indrukte maar dit is ook verholpen door een timer begrenzertje..

bedankt voor de oplossingen, nu nog een oplossing vinden om er een turbo knop van te maken B)

  • IWriteCode
  • Registratie: Juli 2000
  • Laatst online: 21-05 13:54

IWriteCode

Less = more

Verwijderd schreef op 04 augustus 2004 @ 19:10:
Ik hoop dat ik het probleem van de topicstarter goed heb begrepen. Wanneer ik wil detecteren of iemand een dubbelklik op een knop (TButton) heeft gedaan, doe ik dat als volgt:

- Maak een nieuwe form met een TTimer en een TButton
- Stel bij de TTimer de volgende waarden in:
* Enabled = False
* Interval = 200

Vervolgens voeg je deze code in als eventhandler bij OnTimer (TTimer) en OnClick (TButton):
Delphi:
1
2
3
4
5
6
7
8
9
10
11
12
procedure TForm1.Button1Click(Sender: TObject);
begin
  if Timer1.Enabled then
    Button1.Caption := 'Double click!'
  else
    Timer1.Enabled := True;
end;

procedure TForm1.Timer1Timer(Sender: TObject);
begin
  Timer1.Enabled := False;
end;
SpuitElf :P

Less = more


  • alienfruit
  • Registratie: Maart 2003
  • Laatst online: 22-05 23:32

alienfruit

the alien you never expected

Waarom een interval van 200 :? Zou je daar niet voor de Double Click snelheid tijd geval ding van Windows ophalen?

Verwijderd

Tsja, het lijkt wat op jouw code, maar ik zie dat jij via een timer een dubbelklik simuleert, terwijl ik met behulp van een timer een dubbelklik detecteer. Da's toch een wezenlijk verschil.

En alienfruit, eigenlijk zou ik inderdaad GetDoubleClickTime moeten gebruiken voor het interval van de timer.

[ Voor 2% gewijzigd door Verwijderd op 04-08-2004 19:21 . Reden: Correctie ]


  • Coltrui
  • Registratie: Maart 2001
  • Niet online

Coltrui

iddqd

curry684 schreef op 04 augustus 2004 @ 17:32:
Gaat het hier nu echt om GetTickCount aanroepen, de returnvalue en de knop-index opslaan, en bij de volgende druk checken of het dezelfde knop is en of GetTickCount() - previousvalue kleiner is dan X? :?
Offtopic:
Met GetTickCount heb ik echt al problemen gehad... Als de applicatie x aantal tijd draait (ik geloof een 2 maanden of zo, maar weet het niet echt zeker), loopt het resultaat van die functie in het honderd. QueryPerformanceCounter heeft dit probleem niet en is bovendien preciezer. :)

  • RwD
  • Registratie: Oktober 2000
  • Niet online

RwD

kloonikoon

Waarom maak je niet een nieuw type button dat een onDblClick event heeft, geimplementeerd zoals de andere componenten dat ook hebben. Ik heb thuis geen Delphi, dus ik kan even niet opzoeken waar die double click verstopt zit, maar zo veel werk zal het niet zijn....

trouwens, je zit in het verkeerde forum ;)
Ik denk dat je hier eerder een hint in de goede richting vindt, niks ten nadelen van de mensen hier, maar daar zitten hele goede Delphi programmeurs tussen!!

www.delphipages.com --> MrBaseBall34 vragen; die is echt goed!!
www.tamaracka.com --> Ook een site waar veel te vinden is

[ Voor 43% gewijzigd door RwD op 04-08-2004 23:20 ]


  • NMe
  • Registratie: Februari 2004
  • Laatst online: 14:53

NMe

Quia Ego Sic Dico.

RwD schreef op 04 augustus 2004 @ 23:16:
Waarom maak je niet een nieuw type button dat een onDblClick event heeft, geimplementeerd zoals de andere componenten dat ook hebben. Ik heb thuis geen Delphi, dus ik kan even niet opzoeken waar die double click verstopt zit, maar zo veel werk zal het niet zijn....
Goed plan, beter dan mijn panel. :P
RwD schreef op 04 augustus 2004 @ 23:16:
trouwens, je zit in het verkeerde forum ;)
Ik denk dat je hier eerder een hint in de goede richting vindt, niks ten nadelen van de mensen hier, maar daar zitten hele goede Delphi programmeurs tussen!!
offtopic:
Hier lopen ook aardig wat Delphi guru's rond hoor (lordlarry bijvoorbeeld :P)... Verder werkt BC++ op een soortgelijke manier, en dus kunnen BC++ programmeurs ook best helpen in dit topic. Bovendien is een hint in de goede richting meer dan genoeg. Kant en klare code is niet leuk, geeft minder voldoening.

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


  • IWriteCode
  • Registratie: Juli 2000
  • Laatst online: 21-05 13:54

IWriteCode

Less = more

Er zitten hier prima Delphi programmeurs, maar de beste Nederlandse vind je op www.nldelhpi.com staan trouwens ook heel goede artikellen over diversie onderwerpen (ook in het nederlands!)!

Less = more


Verwijderd

Hier moet je een eind mee komen (ff snel inelkaar geflanst):
Delphi:
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
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
unit dblclickbutton;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TDblClickButton = class(TButton)
  private
    FOnDoubleClick: TNotifyEvent;
    procedure SetOnDoubleClick(const Value: TNotifyEvent);
  protected
    procedure DblClick; override;
  public
    constructor create(Aowner : TComponent); override;
    property OnDoubleClick : TNotifyEvent read FOnDoubleClick write SetOnDoubleClick;
  end;
  
  procedure Register;

implementation

{ TDblClickButton }

constructor TDblClickButton.create(Aowner: TComponent);
begin
  inherited Create(AOwner);
  ControlStyle := ControlStyle + [csCaptureMouse,csDoubleClicks,csClickEvents];
end;

procedure TDblClickButton.SetOnDoubleClick(const Value: TNotifyEvent);
begin
  FOnDoubleClick := Value;
end;

procedure TDblClickButton.DblClick;
begin
  if Assigned(FOnDoubleClick) then FOnDoubleClick(Self);
end;

procedure Register;
begin
  registercomponents('Custom', [TDblClickButton]);
end;
RwD schreef op 04 augustus 2004 @ 23:16:
trouwens, je zit in het verkeerde forum ;)
Ik denk dat je hier eerder een hint in de goede richting vindt, niks ten nadelen van de mensen hier, maar daar zitten hele goede Delphi programmeurs tussen!!

www.delphipages.com --> MrBaseBall34 vragen; die is echt goed!!
www.tamaracka.com --> Ook een site waar veel te vinden is
Jamal schreef op 05 augustus 2004 @ 07:53:
Er zitten hier prima Delphi programmeurs, maar de beste Nederlandse vind je op www.nldelhpi.com staan trouwens ook heel goede artikellen over diversie onderwerpen (ook in het nederlands!)!
hé hé, het is hier Tweakers !.

[ Voor 26% gewijzigd door Verwijderd op 05-08-2004 09:13 ]


  • Creepy
  • Registratie: Juni 2001
  • Laatst online: 15:14

Creepy

Tactical Espionage Splatterer

curry684 schreef op 04 augustus 2004 @ 17:32:
Gaat het hier nu echt om GetTickCount aanroepen, de returnvalue en de knop-index opslaan, en bij de volgende druk checken of het dezelfde knop is en of GetTickCount() - previousvalue kleiner is dan X? :?
Ja
Jamal schreef op 05 augustus 2004 @ 07:53:
Er zitten hier prima Delphi programmeurs, maar de beste Nederlandse vind je op www.nldelhpi.com staan trouwens ook heel goede artikellen over diversie onderwerpen (ook in het nederlands!)!
RwD schreef op 04 augustus 2004 @ 23:16:
trouwens, je zit in het verkeerde forum ;)
Ik denk dat je hier eerder een hint in de goede richting vindt, niks ten nadelen van de mensen hier, maar daar zitten hele goede Delphi programmeurs tussen!!

www.delphipages.com --> MrBaseBall34 vragen; die is echt goed!!
www.tamaracka.com --> Ook een site waar veel te vinden is
reclame maken voor andere sites? :P
Er zijn al redelijk wat Delphi problemen voorbij gekomen hoor, en dit topic hier is wel een enorm simpele. Als je het niet voor elkaar kan krijgen om te checken of er een dubbelklik is gedaan m.b.v. een timer, Performance counter of gettickcount, dan gaat geen enkel forum je meer helpen. Behalve als iemand bereid is om kant en klare code te geven iets wat er hier gelukkig erg weinig gebeurd.

Wat ik er mee wil zeggen: "Geef iemand een vis, en hij heeft morgen weer honger. Geef hem een hengel en hij heeft nooit meer honger". (of iets in die richting in elk geval :) ).

[ Voor 68% gewijzigd door Creepy op 05-08-2004 09:23 ]

"I had a problem, I solved it with regular expressions. Now I have two problems". That's shows a lack of appreciation for regular expressions: "I know have _star_ problems" --Kevlin Henney


Verwijderd

Creepy schreef op 05 augustus 2004 @ 09:19:
[...]
Als je het niet voor elkaar kan krijgen om te checken of er een dubbelklik is gedaan m.b.v. een timer, Performance counter of gettickcount,
of ff spieken hoe de borland boys & girls het doen ..... :)
Behalve als iemand bereid is om kant en klare code te geven iets wat er hier gelukkig erg weinig gebeurd.
Moet af en toe kunnen :) (zeker als ze met andere sites gaan rondstrooien)

Nu weer ontopic:

Het is standaard gedrag dat bij een DoubleClick event ook het Click event afgaat, probeer maar eens bij andere componenten die een DoubleClick hebben.

Maybe dat je met subclassing nog een en ander kan oplossen. (zal daar vanavond is ff naar kijken)

[ Voor 22% gewijzigd door Verwijderd op 05-08-2004 09:32 ]


  • Creepy
  • Registratie: Juni 2001
  • Laatst online: 15:14

Creepy

Tactical Espionage Splatterer

Verwijderd schreef op 05 augustus 2004 @ 09:27:
[...]

of ff spieken hoe de borland boys & girls het doen ..... :)
* Creepy is naief, en ging er vanuit dat de TS geen geld heeft om Delphi te kopen. En aangezien Delphi 6 gratis te verkrijgen was en daar geen source bij zit om te kijken hoe ze dat bij Borland hebben gedaan :+

Anyway... ik heb ook zo iets moeten faken. Doordat mijn code in een andere ontwikkelomgeving draaide (Authorware) kreeg ik niet alle Windows messages door en kon ik de OnMouseLeave en OnMouseEnter niet afvangen. Gelukkig deed de OnMouseMove het wel en kon ik daarmee i.c.m. een timer ook controleren of de muiscursor nog boven mijn control hing of niet.. OnMouseMove -> Timer starten en in Timer event controleren waar de muis zich bevond. Boven mijn control -> Timer opnieuw start. Niet boven mijn control -> OnMouseLeave event zelf aanroepen.

[ Voor 4% gewijzigd door Creepy op 05-08-2004 10:01 ]

"I had a problem, I solved it with regular expressions. Now I have two problems". That's shows a lack of appreciation for regular expressions: "I know have _star_ problems" --Kevlin Henney


Verwijderd

Creepy schreef op 05 augustus 2004 @ 09:51:
[...]
Anyway... ik heb ook zo iets moeten faken. Doordat mijn code in een andere ontwikkelomgeving draaide (Authorware) kreeg ik niet alle Windows messages door en kon ik de OnMouseLeave en OnMouseEnter niet afvangen. Gelukkig deed de OnMouseMove het wel en kon ik daarmee i.c.m. een timer ook controleren of de muiscursor nog boven mijn control hing of niet.. OnMouseMove -> Timer starten en in Timer event controleren waar de muis zich bevond. Boven mijn control -> Timer opnieuw start. Niet boven mijn control -> OnMouseLeave event zelf aanroepen.
Aangezien je OnMouseMove op een component alleen binnen krijgt als de muis over dat component beweegt, kun je OnMouseMove zien als Enter (voor de eerste keer dan), en daarna de muis capturen. Na een capture blijf je OnMouseMove's binnen krijgen, ook al bevindt de muis zich ergens anders, en zodra hij zich buiten het control beweegt OnMouseLeave afvuren (en de capture losgeven).

Op die manier kun je het event-gestuurd blijven doen. Zo heb ik 't gedaan voor het maken van een bitmap-button-component met rollover plaatjes in Delphi 5 (waar die events nog niet in zaten).

[ Voor 16% gewijzigd door Verwijderd op 05-08-2004 11:16 ]


  • RwD
  • Registratie: Oktober 2000
  • Niet online

RwD

kloonikoon

offtopic:
Ok, sorry, ik wilde niemand op de tenen trappen hoor.
Leek mij alleen dat een forum alleen voor Delphi een grotere kans op slagen geeft.

Hoe goed de tweakers hier zijn weet ik natuurlijk niet, maar weinigen kunnen tippen aan de nummer 1 in het delphipages lijstje, dat is zeker...

  • gorgi_19
  • Registratie: Mei 2002
  • Laatst online: 14:36

gorgi_19

Kruimeltjes zijn weer op :9


Modbreak:
:? Kunnen we nu nokken over welke delphi forums er allemaal nog meer zijn waar je ook vragen kan stellen? Dat is totaal niet interessant voor het eigenlijke probleem en ik neem aan dat iemand ook zo een forum wel zelf kan vinden.

Ook op tweakers komen genoeg mensen met kennis van zaken, oftewel: ontopic.

[ Voor 6% gewijzigd door gorgi_19 op 05-08-2004 11:35 ]

Digitaal onderwijsmateriaal, leermateriaal voor hbo


  • Creepy
  • Registratie: Juni 2001
  • Laatst online: 15:14

Creepy

Tactical Espionage Splatterer

Verwijderd schreef op 05 augustus 2004 @ 11:15:
[...]


Aangezien je OnMouseMove op een component alleen binnen krijgt als de muis over dat component beweegt, kun je OnMouseMove zien als Enter (voor de eerste keer dan), en daarna de muis capturen. Na een capture blijf je OnMouseMove's binnen krijgen, ook al bevindt de muis zich ergens anders, en zodra hij zich buiten het control beweegt OnMouseLeave afvuren (en de capture losgeven).

Op die manier kun je het event-gestuurd blijven doen. Zo heb ik 't gedaan voor het maken van een bitmap-button-component met rollover plaatjes in Delphi 5 (waar die events nog niet in zaten).
Zolang je alle Windows messages kan afvangen dan zou ik er toch voor kiezen om de OnMouseEnter en OnMouseLeave messages te gebruiken. Geen extra checks of timers nodig.
Delphi:
1
2
3
4
protected
    { Protected declarations }
    procedure CMMouseEnter(var msg: TMessage); message CM_MOUSEENTER;
    procedure CMMouseLeave(var msg: TMessage); message CM_MOUSELEAVE;

Op deze manier dus.. en dan vanuit de procedures kijken of er events gekoppeld zijn aan de OnMouseLeave en Enter properties en eventueel aanroepen.
Dit heb ik ook gebruikt voor een bitmap button :) Met dus wat extra trucs om dit "embedded" in Authorware ook aan de gang te krijgen

Doordat mijn (Delphi) DLL in Authorware gebruikt werdt kreeg ik deze messages niet meer door, dus moest ik wel voor wat anders kiezen. Overigens hoefde ik volgens mij de muis niet te "capturen" om de OnMouseMove events te blijven ontvangen (en authorware vond het in een aantal gevallen ook niet echt lief.....)

[ Voor 25% gewijzigd door Creepy op 05-08-2004 11:59 ]

"I had a problem, I solved it with regular expressions. Now I have two problems". That's shows a lack of appreciation for regular expressions: "I know have _star_ problems" --Kevlin Henney


  • RwD
  • Registratie: Oktober 2000
  • Niet online

RwD

kloonikoon

Ontopic dan:

Maui's code werkt...
Verwijderd schreef op 05 augustus 2004 @ 09:11:
Hier moet je een eind mee komen (ff snel inelkaar geflanst):
Delphi:
1
...
...
Ik heb het component net geinstalleerd en het werkt prima.

Nu blijf je alleen nog zitten met het probleem dat een singleclick code afgehandeld wordt direct na je eerste mouseclick event...

  • Creepy
  • Registratie: Juni 2001
  • Laatst online: 15:14

Creepy

Tactical Espionage Splatterer

RwD schreef op 05 augustus 2004 @ 12:02:
Nu blijf je alleen nog zitten met het probleem dat een singleclick code afgehandeld wordt direct na je eerste mouseclick event...
Daar ontkom je bijna niet aan. Tenzij je in je OnClick handler blijft wachten totdat de OnDoubleClick handler wordt afgevuurd. Indien dit niet het geval is ga je dan verder met het afhandelen van de OnClick, anders stoppen.
Dan zit je alleen weer met een kleine wachttijd aangezien je moet wachten totdat de tijd voor de tweede klik is verstreken.

Meestal is de code van een enkel klik zo minimaal dat het geen probleem is dat deze ook wordt afgevuurd tijdens een dubbele klik.

"I had a problem, I solved it with regular expressions. Now I have two problems". That's shows a lack of appreciation for regular expressions: "I know have _star_ problems" --Kevlin Henney


  • RwD
  • Registratie: Oktober 2000
  • Niet online

RwD

kloonikoon

Creepy schreef op 05 augustus 2004 @ 12:06:
[...]

...

Meestal is de code van een enkel klik zo minimaal dat het geen probleem is dat deze ook wordt afgevuurd tijdens een dubbele klik.
Vaak is het zelfs iets is dat nodig is voor de dubbelklik.

Daarom is er een rechtermuisknop (voor niet appels onder ons) die biedt een compleet alternatief. Ik ga er vanuit dat de TS daar wel rekening mee heeft gehouden. (naast het feit de rechtermuisknop normaal gesproken gebruikt wordt voor eigenschappen van het geselecteerde object)

En wellicht is een andere mogelijkheid nog de CTRL, ALT of Shift toets in houden om de alternatieve code te laten starten? Scheelt je dat timergedoe...

[ Voor 21% gewijzigd door RwD op 05-08-2004 12:18 ]


  • curry684
  • Registratie: Juni 2000
  • Laatst online: 12-05 22:23

curry684

left part of the evil twins

Wezen schreef op 04 augustus 2004 @ 21:32:
[...]


Offtopic:
Met GetTickCount heb ik echt al problemen gehad... Als de applicatie x aantal tijd draait (ik geloof een 2 maanden of zo, maar weet het niet echt zeker), loopt het resultaat van die functie in het honderd. QueryPerformanceCounter heeft dit probleem niet en is bovendien preciezer. :)
Hoe vaak draait een desktop applicatie 2 maanden en exact hoe hard kan het je aan je reet oxideren als ie na 49 dagen 1 keer een dubbelklik niet correct interpreteert? :?

En de discussie of dit wel of niet de plek is voor Delphi vragen: :Z Deze vraag heeft zelfs geen bal met Delphi van doen, dit hele topic is pure Win32 kennis.

Professionele website nodig?


  • Coltrui
  • Registratie: Maart 2001
  • Niet online

Coltrui

iddqd

curry684 schreef op 05 augustus 2004 @ 13:39:
[...]

Hoe vaak draait een desktop applicatie 2 maanden en exact hoe hard kan het je aan je reet oxideren als ie na 49 dagen 1 keer een dubbelklik niet correct interpreteert? :?
In mijn geval draaide de applicatie op 24/7 op een server en was het een zeer tijdskritische aangelegenheid. Zeggen dat het in dit of dat geval geen kwaad kan is een gevaarlijke houding - dat is mijn gedacht erover. Waarom zou je het risico nemen als er een beter alternatief is dat even weinig moeite kost?
Maar goed, ik dacht 'ik meld het even', daar gaat het verder helemaal niet om.

Verwijderd

QueryPerformance* calls zijn véél duurder om aan te roepen (ik heb het een keer getest, volgens mij wel 100 of 1000 keer).

Dus als je het vaak moet doen (bijvoorbeeld om een spel te timen, hoewel dat hier misschien een beetje
offtopic:
!
is), kun je beter timeGetTime gebruiken.

  • Megamind
  • Registratie: Augustus 2002
  • Laatst online: 14-05 03:35
curry684 schreef op 05 augustus 2004 @ 13:39:
[...]

En de discussie of dit wel of niet de plek is voor Delphi vragen: :Z Deze vraag heeft zelfs geen bal met Delphi van doen, dit hele topic is pure Win32 kennis.
Dat weet ik ook wel, maar als je er weer geen delphi voor zet dan gaat ie gelijk dicht omdat je geen [taal] ervoor heb staan.

En sommige van jullie doen altijd wel alsof iedereen dat maar moet weten en dat het allemaal maar zo makkelijk is, maar ik prog delphi voor de lol eens af en toe en kijk wat ik eruit kan trekken. Ik ben geen guru die gelijk naar bol.com vliegt om een hele lading boeken te kopen voor saus. Delphi heeft een erg duidelijke help waar elke functie beschreven is, maar als ik nou zo'n probleem heb als nu zal ik toch zelf moeten denken, en als ik er, volgens sommige niet zo'n hoge, eigen denkvermogen niet uitkom? Juist dan heb ik een forum. Het leuke is aan got; veel experts, de meeste willen je graag helpen, snel antwoord. Vooral dat laatste is leuk zodat je lekker kan doorgaan!

Oh en voor degene die code leverde, het was idd vrij simpel, bedankt daarvoor :) Was er zelf nog lang niet opgekomen, daarvoor hebben we toch een forum :)

  • Grijze Vos
  • Registratie: December 2002
  • Laatst online: 21-02 23:50
Creepy schreef op 05 augustus 2004 @ 12:06:
[...]

Daar ontkom je bijna niet aan. Tenzij je in je OnClick handler blijft wachten totdat de OnDoubleClick handler wordt afgevuurd. Indien dit niet het geval is ga je dan verder met het afhandelen van de OnClick, anders stoppen.
Dan zit je alleen weer met een kleine wachttijd aangezien je moet wachten totdat de tijd voor de tweede klik is verstreken.

Meestal is de code van een enkel klik zo minimaal dat het geen probleem is dat deze ook wordt afgevuurd tijdens een dubbele klik.
Dat is ook de default behaviour van windows zelf, dus zo vreemd is het niet. ;)

Op zoek naar een nieuwe collega, .NET webdev, voornamelijk productontwikkeling. DM voor meer info


  • Creepy
  • Registratie: Juni 2001
  • Laatst online: 15:14

Creepy

Tactical Espionage Splatterer

Grijze Vos schreef op 05 augustus 2004 @ 18:18:
[...]

Dat is ook de default behaviour van windows zelf, dus zo vreemd is het niet. ;)
Dat zal je mij ook niet horen zeggen :)
Maar ik heb al wat vaker gezien dat er mensen zijn die het gek vinden..

"I had a problem, I solved it with regular expressions. Now I have two problems". That's shows a lack of appreciation for regular expressions: "I know have _star_ problems" --Kevlin Henney


  • curry684
  • Registratie: Juni 2000
  • Laatst online: 12-05 22:23

curry684

left part of the evil twins

Wezen schreef op 05 augustus 2004 @ 14:05:
[...]

In mijn geval draaide de applicatie op 24/7 op een server en was het een zeer tijdskritische aangelegenheid. Zeggen dat het in dit of dat geval geen kwaad kan is een gevaarlijke houding - dat is mijn gedacht erover.
Ik develop al jaren 24/7 serverapplicaties (semiconductorbranche e.d.) dus je hoeft mij niet te vertellen dat het kwaad kan. Maar een desktopapplicatie waarbij je het voor de timing van je buttons gebruikt is nogal wat anders :)

Needless to say zou ik het ook niet doen, ik zou een WaitableTimer gebruiken, maar da's weer een 2e.

Professionele website nodig?

Pagina: 1