Results 1 to 8 of 8

Thread: OnExit event van een control overrules de OnClick event van een button

  1. #1
    Senior Member
    Join Date
    Mar 2002
    Location
    Edam
    Posts
    426

    OnExit event van een control overrules de OnClick event van een button

    Ik heb een form met ( onder anderen) een edit met een OnExit event en een tButton met een OnClick event.
    Als ik na het invullen van de Edit op de tButton klik ( dus zonder de Edit eerst expliciet te verlaten) dan wordt de OnExit event van de Edit uitgevoerd maar de OnClick event van de Button wordt gecancelt. De Button krijgt wel focus.

    Als ik een OnEnter event toeken aan de Button dan wordt die wél uitgevoerd bij het aanklikken. Dat is dan echter het gevolg van de OnEnter van de Button en niet van de OnClick, die wordt nog steeds niet uitgevoerd. Ik kan de OnClick van de Button procedure natuurlijk gewoon delen met de OnEnter maar dan wordt die ook uitgevoerd als er niet expliciet op de Button wordt geklikt bv. bij er naartoe tabben. Dat is weer niet de bedoeling.

    - waarom wordt de OnEnter procedure van de button wel automatisch uitgevoerd en de OnClick niet?
    - Is er een manier om de (expliciete) OnClick procedure uit te (laten) voeren zonder nog een keer op de Button te hoeven klikken?

  2. #2
    Silly member NGLN's Avatar
    Join Date
    Aug 2004
    Location
    Werkendam
    Posts
    5,133
    Als ik na het invullen van de Edit op de tButton klik ( dus zonder de Edit eerst expliciet te verlaten) dan wordt de OnExit event van de Edit uitgevoerd maar de OnClick event van de Button wordt gecancelt. De Button krijgt wel focus.
    Dat is standaard niet het geval. In een testproject hier met 10.3 werken beide events. Doe je iets in de OnExit van de Edit dat dit gedrag beïnvloed? Hoe werkt het bij jou in een testproject?
    (Sender as TNLDUser).Signature := 'Groeten van Albert';

  3. #3
    Senior Member
    Join Date
    Mar 2002
    Location
    Edam
    Posts
    426
    d7 en XE7
    Ik kom het verschijnsel tegen in een applicatie waarin na het invoeren bij de onexit van een aantal invoervelden er aantal controles worden gedaan op een database. Klanten klagen dat ze vaak twee keer op een knop moeten klikken om de zaken daadwerkelijk te verwerken..

    In mijn testje simuleer ik het voor de OnExit event van de edit de procedure showmessage('exit') en voor OnEnter en OnClick van een button resp. showmessage('Enter') en showmessage('Klik')
    Na het wegklikken van de message "exit" bij het verlaten van de edit verschijnt meteen de message "enter". Bij wegklikken daarvan gebeurt er niets ( geen message "klik")

    Als ik de procedures vervang door label.caption := exit,enter of klik dan werkt het wel zonder probleem.
    De showmessage procedure van de onexit interfereert natuurlijk met de afhandeling maar waarom dan niet bij het uitvoeren van de onEnter maar wel bij de OnClick?

  4. #4
    Silly member NGLN's Avatar
    Join Date
    Aug 2004
    Location
    Werkendam
    Posts
    5,133
    Zoals je zelf al beredeneert is ShowMessage niet de juiste manier om de werking van een routine te testen. Er zijn natuurlijk heel geavanceerde manieren om je programma(onderdelen) te testen, maar een geheel simpele (en redelijk) onschuldige manier is door de Caption van het Form aan te passen, als volgt:
    Delphi Code:
    1. procedure TForm1.Button1Click(Sender: TObject);
    2. begin
    3.   Caption := Caption + 'Click';
    4. end;
    5.  
    6. procedure TForm1.Edit1Exit(Sender: TObject);
    7. begin
    8.   Caption := Caption + 'Exit';
    9. end;
    Dit heeft enkele bijkomende voordelen:
    - je ziet direct in welke volgorde de routines worden aangeroepen,
    - je hoeft geen componenten aan te maken of variabelen te introduceren,
    - is ook werkbaar vanuit een andere unit of vanuit globale code middels Application.MainForm.Caption.

    Hét grote nadeel is natuurlijk dat je de test niet moet vergeten te verwijderen!

    De reden waarom jouw test met ShowMessage mis gaat is simpel gezegd omdat de Click niet plaatsvind. Een OnClick eventhandler treedt pas op bij een Mouse Up. Maar aangezien jij met de ShowMessage een geheel ander venster oproept en daarmee dus de focus verplaatst, voordat de muis opkomt, wordt die MouseUp niet meer geregistreerd door de met MouseDown geactiveerde button. OnEnter treedt inderdaad wel op, want het Form onthoudt waar de focus vandaan kwam en weer terug naar toe moet.

    Wat betreft de klacht van jouw klanten: een zuivere interactie met de database kan niet de oorzaak zijn. Wel kan dat wanneer die code de focus verplaatst, of wanneer het databaseverkeer te lang duurt en de gebruiker uit ongeduld nogmaals gaat klikken, etc...

    Mijn advies is overigens om validatie via database-interactie niet in een OnExit eventhandler (van een Edit-control) te plaatsen. Alternatieven zijn (een combinatie van): de validatie uitstellen, of de logica voor de validatie vooraf uit de database ophalen. (Zie eventueel ook een ander TEdit.OnExit gerelateerd topic vanaf hier.)
    Last edited by NGLN; 25-Aug-20 at 21:46.
    (Sender as TNLDUser).Signature := 'Groeten van Albert';

  5. #5
    ShowMessage onderbreekt de message loop IIRC.

    Bart

  6. #6
    Klopt, Bart B.
    ShowMessage roept MessageDlg aan, een hele serie van overloads om message boxes te laten zien, maar die werken (bijna?) allemaal op basis van een modal TForm. Modal forms hebben hun eigen interne message loop, een soort mini Application.Run.
    1+1=b

  7. #7
    Senior Member
    Join Date
    Mar 2002
    Location
    Edam
    Posts
    426
    Dank!
    Ik had al door dat zonder die showmessage het in het testappje allemaal wél goed ging maar gebruikte een showmessage om een "lang" proces te simuleren ( niet de juiste keuze dus).
    Ik duik even dieper in de procedures achter de onexit events om te zien waar het spaak loopt. De data acties zijn niet heel zwaar en lijken de boel niet echt op te houden maar in een aantal gevallen geven ze wel automatisch de focus geven aan een ander veld ( omdat bv. voor het "volgende" maar 1 waarde beschikbaar is en dat automatisch wordt ingevuld). Daar zal wel eens de kneep kunnen zitten.

  8. #8
    Sleep is je vriend als je een lang process wilt simuleren.

    Als je het zichtbaar wilt doen, dan kan je eventueel MessageBox proberen. Dat is een Windows API die -voor zover ik weet- niet dat bij-effect van ShowMessage heeft. Application.MessageBox gebruikt vziw ook de MessageBox API.
    1+1=b

Thread Information

Users Browsing this Thread

There are currently 1 users browsing this thread. (0 members and 1 guests)

Bookmarks

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •