IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Composants FMX Delphi Discussion :

TListView : Simuler un balayage, Supprimer des éléments


Sujet :

Composants FMX Delphi

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 658
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 69
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 658
    Billets dans le blog
    65
    Par défaut TListView : Simuler un balayage, Supprimer des éléments
    Bonjour,

    TListview a une propriété CanSwipeDelete et des évènements (méthodes) comme OnDeleteItem et OnDeletingItem.
    La fonctionnalité balayer-pour-supprimer est prise en charge sur les apps mobiles (iOS et Android), ainsi que les apps de bureau (Windows et OS X) lorsque la saisie tactile est activée.
    Ma première question est donc, comment avec un pc sans écran tactile simuler ce swipe ?

    l'objectif est de supprimer un élément de la liste mais également dans la table
    Nom : Capture.PNG
Affichages : 143
Taille : 9,8 Ko

    Pour contourner la difficulté du balayage j'ai donc comméncé par une utilisation plus classique avec un bouton l'item de liste
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    procedure TForm1.ListView1ButtonClick(const Sender: TObject;
      const AItem: TListItem; const AObject: TListItemSimpleControl);
    begin
    listview1.Items.Delete(AItem.Index); 
    end;
    Je pensais que le Delete écrit ainsi lèverait les événements mais non, seul un "argument hors limites" m'est signalé


    Du coup, plus inquiétant, si je code ainsi (Test avec D10 Alexandria)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    procedure TForm1.LinkListControlToField1FilledListItem(Sender: TObject;
      const AEditor: IBindListEditorItem);
    begin
    (AEditor.CurrentObject as TListItem).Tag :=FDTable1.FieldByName('ID').AsInteger; // mémorise la clé
    end;
     
    procedure TForm1.ListView1ButtonClick(const Sender: TObject;
      const AItem: TListItem; const AObject: TListItemSimpleControl);
    begin
    if FDtable1.Locate('Id',AItem.Tag) then FDtable1.Delete;
    end;
    et tente de supprimer le dernier élément de la liste, j'ai une exception de lecture d'adresse (en cause procedure TListItem.MouseUp)

  2. #2
    Rédacteur/Modérateur
    Avatar de Andnotor
    Inscrit en
    Septembre 2008
    Messages
    5 938
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 938
    Par défaut
    Citation Envoyé par SergioMaster Voir le message
    Ma première question est donc, comment avec un pc sans écran tactile simuler ce swipe ?
    Le pendant Mouse_Event (SendInput) pour la génération de messages WM_POINTER est InjectTouchInput.

    Pour l'appui, le code ressemblera à ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
      var
        Info :TPointerTouchInfo;
     
      begin
        if InitializeTouchInjection(1, TOUCH_FEEDBACK_NONE) then
        begin
          ZeroMemory(@Info, SizeOf(Info));
          Info.pointerInfo.pointerType     := PT_TOUCH;
          Info.pointerInfo.ptPixelLocation := aPt;
          Info.pointerInfo.pointerFlags    := POINTER_FLAG_DOWN or POINTER_FLAG_UPDATE or POINTER_FLAG_INRANGE;
     
          InjectTouchInput(1, @Info);
        end;
      end;
    A l'instar de SendInput, tu peux envoyer de multiples commandes en un appel.

    Les déclarations sont maintenant présentes dans Winapi.Windows. L'exemple ci-dessus est d'époque et reposait sur cette unité, il y a donc quelques différences.

  3. #3
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 658
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 69
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 658
    Billets dans le blog
    65
    Par défaut
    Merci, je vais tenter ça.

    En attendant une discussion que j'avais initiée (et oubliée) https://www.developpez.net/forums/d1...em-via-bouton/
    m'a poussé à refaire le hack "pour voir". Bon j'aurais peut-être pu écrire un helper à la place mais comme ,c'est un test, j'écris au plus rapide ou plutôt comme j'ai le plus l'habitude.

    En tout cas si grâce au hack, je rentre bien dans les deux évènements je me coltine quand même un "argument hors limite" (coupable la fonction TListItemView.GetObject)

    [Edit] Pour le fun, avec Helper
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     TListViewHelper  = class helper for TListView
        public function DeleteItem(const ItemIndex: Integer): Boolean; end;
    ......
     
    { TListViewHelper }
    function TListViewHelper.DeleteItem(const ItemIndex: Integer): Boolean;
    begin
    inherited;
    end;
    Je vais me résoudre à changer mon programme pour pouvoir déployer sur un appareil Android et tester le "balayer-pour-supprimer "

  4. #4
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 658
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 69
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 658
    Billets dans le blog
    65
    Par défaut
    Citation Envoyé par SergioMaster Voir le message
    Je vais me résoudre à changer mon programme pour pouvoir déployer sur un appareil Android et tester le "balayer-pour-supprimer "
    C'est ce que j'ai fait, j'ai craqué et surtout cela m'a permis de voir comment fonctionnait ce "balayer-pour-supprimer"
    en deux images :
    - affichage de la liste
    Nom : Capture.PNG
Affichages : 104
Taille : 14,2 Ko
    -balayage de l'élément : le bouton delete s'affiche
    Nom : Capture_1.PNG
Affichages : 114
Taille : 16,6 Ko
    vous devinez la suite, appui sur le bouton delete, l'élément est supprimé si un autre élément est sélectionné avant l'appui sur le bouton, le bouton disparait.

    Tout est pour le mieux dans le meilleur des mondes enfin presque la tentative de suppression du dernier élément de la liste lève une exception : Argument hors limites

    @AndNotOr effectivement il y a quelques modifications à apporter mais cela donne une bonne idée.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    var
        Info : POINTER_TOUCH_INFO;
    begin
    if InitializeTouchInjection(1, TOUCH_FEEDBACK_NONE) then
        begin
          ZeroMemory(@Info, SizeOf(Info));
          Info.pointerInfo.pointerType     :=  Cardinal(tagPOINTER_INPUT_TYPE.PT_TOUCH);
    //      Info.pointerInfo.ptPixelLocation := pos;
    //      Info.pointerInfo.pointerFlags    := POINTER_FLAG_DOWN or POINTER_FLAG_UPDATE or POINTER_FLAG_INRANGE;
          InjectTouchInput(1, @Info);
        end;
    Je m'attaque maintenant à ptpixelLocation mais je pense qu'il y a plus pour simuler le balayage gauche->droite

Discussions similaires

  1. [multi map] supprimer des éléments
    Par poukill dans le forum SL & STL
    Réponses: 3
    Dernier message: 22/05/2007, 12h17
  2. Supprimer des éléments d'une liste
    Par espadon1 dans le forum Langage
    Réponses: 2
    Dernier message: 31/05/2006, 15h08
  3. Réponses: 7
    Dernier message: 16/05/2006, 15h40
  4. Supprimer des éléments dans une TreeView ?
    Par souch dans le forum Composants VCL
    Réponses: 4
    Dernier message: 16/09/2005, 12h20
  5. Supprimé des éléments vide d'un tableau
    Par shinux2004 dans le forum Langage
    Réponses: 4
    Dernier message: 04/07/2005, 19h40

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo