Page 1 of 2 1 2 LastLast
Results 1 to 15 of 21

Thread: App afsluiten keuze

  1. #1

    App afsluiten keuze

    Ik vond het erg storend dan een App meteen afsloot als ik per ongeluk tegen de "Terug toets" kwam.
    Na lang zoeken en proberen heb ik het voor elkaar dat ik bij het afsluiten van een App eerst de vraag krijg of ik inderdaad deze App af wil sluiten.

    Ik heb nu deze code, en dat werkt bij normaal gebruik goed:

    Code:
    procedure TForm1.FormKeyUp(Sender: TObject; var Key: Word;  var KeyChar: Char; Shift: TShiftState);
    begin
      if Key = vkHardwareBack then
      begin
        MessageDlg('Exit ?', TMsgDlgType.mtConfirmation,
        [TMsgDlgBtn.mbYes, TMsgDlgBtn.mbNo], 0,
        procedure(const AResult: TModalResult)
        begin
          if AResult = mrYes then
          begin
           Application.Terminate;
           Exit;
          end
        end);
        Key := 0;
      end;
    end;
    Nu komt het wel eens voor dat ik per ongeluk de verkeerde App start, en dan meteen op "Terug toets" druk om de App die aan het opstarten is alweer af wil sluiten.
    Dan gaat het mis, op een zwart scherm na gebeurd er nu niets meer.

    De code zou dus eigelijk pas moeten werken als de App draait.

    Is het mogelijk om af te vragen of de App opgestart is en draait ?
    Last edited by MMSoft; 31-Oct-16 at 20:44.

  2. #2
    Die begrijp ik niet helemaal.

    Als je je app naar de achtergrond seukt (home toets) blijft je app in de lucht. Als je dan je app weer staat via je icoontje schakelt Android volgens mij gewoon over naar de reeds draaiende app. Je kunt dus nooit twee instanties van je app krijgen en Android regelt dat dus allemaal intern.

    Als je die back gebruikt voordat je form al is gestart weet ik niet precies of je app al afgesloten wordt of dat ie daar loot als je je app weer activeert door terug te schakelen of het icoontje weer aan te klikken.

    Overigens dacht ik ook dat je Android app met iets anders dan Application.Terminate; af kon sluiten. Iets met mainactivity.finish of sharedactivity.finish.

  3. #3
    Samsung noemt het de "Terug toets", maar als ik deze aanraak, dan wordt de App gewoon afgesloten (deze staat niet meer bij Actieve App's).

    Click image for larger version. 

Name:	GSM_TerugToets.jpg 
Views:	127 
Size:	42.0 KB 
ID:	7412

    Met bovenstaande code krijg ik nu eerst de vraag of ik dat wil.
    Dat werkt goed als de App opgestart is, maar als ik dat te vroeg doe dan gaat het mis en heb ik alleen een zwart scherm (dus zonder icoontjes).

    Sharedactivity.finish; //Geeft hetzelfde probleem
    Mainactivity.finish; //bestaat niet ? (geeft een fout melding)
    Last edited by MMSoft; 31-Oct-16 at 21:36.

  4. #4
    Het probleem is natuurlijk dat zolang er nog geen form gemaakt is er ook geen OnKeyDown bestaat. Waarschijnlijk zal je programma dan moeten afsluiten voordat het geïnitialiseerd is.

    Ik krijg het niet voor elkaar dat ik hiermee een probleem krijg.
    De back-button werkt bij mij niet totdat het form ook daadwerkelijk op het scherm staat.
    Je krijgt n.l. eerst dat vuurtje te zien bij starten en op dat moment doet back niets.

    Ik vraag me dan ook af of het niet aan je application.terminate ligt (dat je een zwart scherm krijgt).

    Wat gebeurd er als je die hele onkeydown weg laat (of exit; in de eerste regel zet).
    Als je back dan goed werkt tijdens het opstarten ligt het dus aan wat je uitvoert in die onkeydown (die .terminate).

  5. #5
    Wat gebeurd er als je die hele onkeydown weg laat.
    Dan werkt het goed.

  6. #6
    Je kunt twee dingen proberen.

    Verander application.terminate eens door wat anders. B.v. Mainactivity.finish of sharedactivity.finish.
    Zie http://stackoverflow.com/a/19250102

    Het zou ook kunnen zijn dat je applicatie crasht op de messagedialg wanneer er nog niet compleet opgestart is. Je zou dat kunnen controleren door de messagedlg even weg te halen en te kijken of het goed werkt. Als het dan goed werkt denk ik dat je er even een check voor niet plaatsen die controleert of de form een applicatie ook daadwerkelijk opgestart zijn. (Ik weet alleen zo even niet hoe)

  7. #7
    Verander application.terminate eens door wat anders. B.v. Mainactivity.finish of sharedactivity.finish.
    Sharedactivity.finish; //Geeft hetzelfde probleem
    Mainactivity.finish; //bestaat niet ? (geeft een fout melding)

    ...denk ik dat je er even een check voor (?moet?) plaatsen die controleert of de form een applicatie ook daadwerkelijk opgestart zijn
    Dat was ook de vraag

  8. #8
    En als je de MessageDlg gewoon even weg haalt ( en de Sharedactivity.finish; ) laat staan?

  9. #9
    De App wordt nu normaal afgesloten, waarbij het niet uitmaakt wanneer ik op de "Terugtoets" druk.

    Code:
    procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word; var KeyChar: Char;
      Shift: TShiftState);
    begin
      if Key = vkHardwareBack then
      begin
        //MessageDlg('Exit ?', TMsgDlgType.mtConfirmation, [TMsgDlgBtn.mbYes, TMsgDlgBtn.mbNo], 0, procedure(const AResult: TModalResult)
        //begin
        //  if AResult = mrYes then
        //  begin
           Application.Terminate;
           //mainactivity.finish
           //Sharedactivity.finish;
    
           Exit;
         // end
        //end);
        Key := 0;
      end;
    end;
    Last edited by MMSoft; 01-Nov-16 at 19:27.

  10. #10
    Ok, dan is het toch echt die messagedlg die in de weg zit. Ik weet zo even niet hoe je kunt checken of je app al volledig draait.

    Je zou kunnen leveren te checken op visible (maar die is waarschijnlijk altijd true).

    Ik zou het later even op moeten zoeken.

    Je kreeg een zwart scherm toch? Dat zou een exception kunnen zijn. Je zou met try/except kunnen kijken welke exception dat is. Wat gebeurd er als je in debugging draait?

  11. #11
    Zodra ik tijd heb ga ik eens zoeken hoe ik in debug mode kan komen.
    Werkt dat ook voor Android app's ?

  12. #12
    Even een vraagje...
    Is het niet veel mooier om geen melding te geven maar gewoon het programma in de lucht te houden totdat er gelijk weer de back-toets gebruikt is.

    Je ziet bij een aantal programma's dat bij back-toets in het home-scherm een toast-melding komt "Druk nogmaals op back om af te sluiten" en als je dat dan niet binnen 1 seconden doet blijft het programma gewoon draaien.

    Dan krijg je ook geen melding waar je Ja/Nee op moet antwoorden (want die vind ik normaal redelijk hinderlijk).

  13. #13
    Dat is ook prima.
    Zolang het programma maar niet meteen afsluit als ik per ongeluk tegen de "terug toets" kom, en de App niet vast loopt als ik tijdens het opstarten al op de "terug toets" druk
    Heb je al een idee hoe ik dit voor elkaar kan krijgen ?

  14. #14
    Okay, here it goes... dit werkt voor mij.
    Overigens werkt de MessageDlg-methode bij mij ook maar ik werk met Delphi 10.1 Berlin. Als ik op de back druk bij het opstarten duurt het even maar ik krijg dan wel de form met de vraag en sluit direct af (zonder de vraag te beantwoorden). Maar hij crasht niet.

    Maar deze methode vind ik mooier:
    Delphi Code:
    1. uses
    2.   Androidapi.JNI.Widget,
    3.   FMX.Helpers.Android,
    4.   Androidapi.Helpers,
    5.   System.Diagnostics;
    6.  
    7. type
    8.   TToastLength = (LongToast, ShortToast);
    9.  
    10. procedure Toast(const Msg: string; Duration: TToastLength);
    11. var
    12.   ToastLength: Integer;
    13. begin
    14.   if Duration = ShortToast then
    15.       ToastLength := TJToast.JavaClass.LENGTH_SHORT
    16.   else
    17.       ToastLength := TJToast.JavaClass.LENGTH_LONG;
    18.   CallInUiThread(
    19.     procedure
    20.     begin
    21.       TJToast.JavaClass.makeText(SharedActivityContext, StrToJCharSequence(Msg),
    22.         ToastLength).show
    23.     end);
    24. end;
    25.  
    26. var
    27.   Stopwatch: TStopwatch;
    28.  
    29. procedure TForm9.FormKeyDown(Sender: TObject; var Key: Word; var KeyChar: Char; Shift: TShiftState);
    30. var
    31.   Elapsed: Int64;
    32. begin
    33.   if Key = vkHardwareBack then
    34.   begin
    35.     if Stopwatch.IsRunning then
    36.     begin
    37.       Elapsed := Stopwatch.ElapsedMilliseconds;
    38.       if Elapsed < 1000 then
    39.       begin
    40.         Sharedactivity.finish;
    41.         Exit;
    42.       end;
    43.     end;
    44.     if not StopWatch.IsRunning then Stopwatch := TStopwatch.StartNew;
    45.     Stopwatch.Reset;
    46.     Stopwatch.Start;
    47.     Toast('Druk nogmaals om te beëindigen', ShortToast);
    48.     Key := 0;
    49.   end;
    50. end;

    Click image for larger version. 

Name:	2016-11-04 10.29.23.png 
Views:	139 
Size:	23.3 KB 
ID:	7414

  15. #15
    Bij type TToastLength krijg ik een fout melding (Expected but identifier 'TToastlength' found).
    Doe ik het zo goed?:

    Code:
    unit Unit1;
    
    interface
    
    uses
      System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants,
      FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics, FMX.Dialogs, FMX.StdCtrls,
      FMX.Controls.Presentation, FMX.Edit;
    
    
    //-----------------------------
     type
      TToastLength = (LongToast, ShortToast);
    
    //-----------------------------
    
    
    type
      TForm1 = class(TForm)
        Edit1: TEdit;
        Button1: TButton;
        procedure Button1Click(Sender: TObject);
    
        procedure Toast(const Msg: string; Duration: TToastLength);
    
        procedure FormKeyDown(Sender: TObject; var Key: Word; var KeyChar: Char;
          Shift: TShiftState);

Page 1 of 2 1 2 LastLast

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
  •