Results 1 to 10 of 10

Thread: Ongewenst sluiten van het programma

  1. #1

    Ongewenst sluiten van het programma

    Hallo allemaal,

    Ga uit van twee Form's, Form1 opent Form2. Op beide Forms staat een Button welke het desbetreffende Form sluit.
    Op de Button van Form 1 staat de letter C van close. Ook op Form2 staat een Button met de letter C van close.

    Wanneer ik Form2 sluit dan wordt soms ook Form1 gesloten wat niet gewenst is.
    De vraag is hoe kan ik voorkomen dat bij het sluiten van Form2 ook Form1 wordt gesloten? Een andere letter
    is niet mogelijk.
    Mogelijk moet er een vertraging worden opgenomen, maar ik weet niet hoe dat moet.

    Met een vriendelijke groet, Frans

  2. #2
    Als ik je vraag lees, krijg ik het idee dat je shortcut keys gebruikt. Klopt dat?

  3. #3
    Ik gebruik om het Form te sluiten VK_C : Close;

    Ondertussen ben ik zelf ook nog opzoek gegaan naar een oplossing, en die heb ik waarschijnlijk gevonden.
    Als ik bij Form2 de procedure KeyDown gebruik en bij Form1 de procedure KeyUp dan gaat het mis. Ik wil dat morgen nog verder uitzoeken.

    H.G. Frans

  4. #4
    De oplossing is :

    Code:
        
         Form1                 Form2                    Resultaat
         ----------             -----------------          ----------------------------------
     1. FormKeyUp         FormKeyDown         Form2 en Form1 sluiten
     2. FormKeyDown     FormKeyUp             Form2 sluit; Form1 sluit niet
     3. FormKeyDown     FormKeyDown         Form2 en Form1 sluiten (repeat VK_C)
     4. FormKeyUp         FormKeyUp             Form2 sluit; Form1 sluit niet
    
    Conclusie
    ---------
    Optie 1 en 3 geeft niet het juiste resultaat en kan daarom niet worden toegepast.
    Optie 2 en 4 daar sluit Form1 niet als Form2 wordt gesloten.
    De voorkeur gaat echter uit naar optie 4. Repeat van VK_C is dan niet meer
    van toepassing. De gebruiker moet altijd de toets ("C") los laten.

  5. #5
    Silly member NGLN's Avatar
    Join Date
    Aug 2004
    Location
    Werkendam
    Posts
    5,133
    Afgezien van de standaardwerking bij het invoeren van tekst is het heel gebruikelijk dat een applicatie pas reageert op een commando bij het loslaten van een toets of een muisknop. Ook alle OnClick eventhandlers van bijv. buttons reageren pas bij een MouseUp. Dit werkt zo in geheel Windows, dus de gebruiker van jouw applicatie zal dit als vanzelfsprekend en natuurlijk ervaren.
    (Sender as TNLDUser).Signature := 'Groeten van Albert';

  6. #6
    Je moet gewoon in beide forms dezelfde methode gebruiken. Niet klungelen met verschillende events.

    Gebruik gewoon TForm.FormKeyDown.

    Maar.... Nadat je de controle op VK_C gedaan hebt (en het is C) moet je wel de Key parameter op 0 zetten.
    Heb je dat ook gedaan?

    Ps. Ik hoop dat de owner van form2 niet form1 is want dan wordt form2 uiteraard ook gesloten als form1 gesloten wordt.

  7. #7
    Senior Member Wok's Avatar
    Join Date
    Dec 2002
    Location
    Alkmaar
    Posts
    2,084
    Waarom niet gewoon je form met een showmodal aanroepen? met het resultaat (na het sluiten) kan je verdere stappen ondernemen.
    10.4.2, Delphi2010, of Lazarus 2.2.0

  8. #8
    Keyup/mouseUp is inderdaad het beste.

    Wat je nu hebt, is dat de Down van de toetsaanslag het ene form sluit, en de Up van diezelfde toetsaanslag het andere form.

    Waarom dan Up en niet overal Down gebruiken? Verschillende redenen:

    1. Annuleren. Als je met je je muisknop indrukt boven een button, dan kan je de muis nog buiten de button bewegen voordat je loslaat. De plek waar je loslaat krijgt de mouseUp. Je kan je dus nog in een split-second bedenken als je iets indrukt. Je zou ervan staan te kijken hoe vaak mensen dat bewust of onbewust gebruiken!
    Voor toetsaanslagen zal dat minder gebruikelijk zijn, al kan het misschien wel door met de muis of met tab een ander control te selecteren en zo je toetsaanslag te laten 'afvlammen'. Nooit getest eigenlijk.

    2. Herhaling bij lang indrukken. Als je een toets ingedrukt houdt, dan kan deze zich herhalen door 'm langer ingedrukt te houden. Je krijgt dan meerdere keydown events, en uiteindelijk toch maar 1 keyup event. Door keyup te gebruiken i.p.v. keydown voorkom je dus dat iemand per ongelukt beide schermen sluit met en enkele, lange toetsaanslag.

    Overigens zou ik in Delphi helemaal die events niet gebruiken. Maak een TActionList, definieer een close action, koppel een shortkey aan de action, en koppel de action aan de button. Delphi regelt dan alle event handling op een standaard manier. Je kan dezelfde action gebruiken voor buttons, toolbars en menu's, en waar dat gebruikelijk is wordt ook de key getoond in de caption of hint.

    Daarbij zou ik zeker geen `C` gebruiken voor sluiten. Dat is namelijk een key die je nooit applicatie-breed kan gebruiken, tenzij je nergens tekstuele invoer hebt. Beter om te blijven bij meer standaard combinaties, zoals Alt+F4 voor je applicatie, Ctrl+F4 voor individuele Windows (op Windows), Ctrl+W zie je ook vaak, zeker bij applicaties die op meerdere platformen draaien. Alt+C eventueel, als hotkey/dialog key voor de Close button. Door de caption &Close te maken, zie je dan ook een lijntje onder de C, en dat helpt de gebruiker weer om de shortcut te leren. Toch zou ik dat liever alleen gebruiken voor het springen naar specifieke (input) controls, en voor standaard-acties een combinatie met Ctrl gebruiken.
    Last edited by GolezTrol; 21-Jan-21 at 10:46.
    1+1=b

  9. #9
    Senior Member Wok's Avatar
    Join Date
    Dec 2002
    Location
    Alkmaar
    Posts
    2,084
    Quote Originally Posted by GolezTrol View Post
    Door de caption &Close te maken, zie je dan ook een lijntje onder de C, en dat helpt de gebruiker weer om de shortcut te leren. Toch zou ik dat liever alleen gebruiken voor het springen naar specifieke (input) controls, en voor standaard-acties een combinatie met Ctrl gebruiken.
    Dit is toch een standaard functionaliteit van delphi ?
    plaats een Bitbtn en zet Kind op bkclose, dan krijg je er ook nog een icoontje bij :-)
    10.4.2, Delphi2010, of Lazarus 2.2.0

  10. #10
    Hallo,

    De reden dat ik een Form sluit met de letter 'C' is dat de gebruiker maar over een hand
    beschikt en bepaalde toets-combinaties met één hand niet kan uitvoeren.
    Ook bij mensen die het programma besturen met hun ogen is dit niet mogelijk.

    De letter 'C' kan van alles zijn. b.v. F-toets e.d.

    De uitleg over KeyDown en KeyUp is verhelderend. Bedankt.

    H.G. Frans

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
  •