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 :

[Android][FMX]Comment supprimer et recréer des objets en runtime?


Sujet :

Composants FMX Delphi

  1. #1
    Membre à l'essai
    Homme Profil pro
    Développeur informatique
    Inscrit en
    février 2021
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Pays-Bas

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : février 2021
    Messages : 13
    Points : 13
    Points
    13
    Par défaut [Android][FMX]Comment supprimer et recréer des objets en runtime?
    Bonjour,

    Avec Delphi Rio, je crée dans une boucle for des labels de manière dynamique. Je dois ensuite pouvoir les détruire avant de les créer à nouveau.

    J'ai donc dans ma form des label1_1, label1_2, etc...

    Pour les détruire, j'utilise une boucle for du style:


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    for i:=0 to Xcount-1 do
     begin
      for j:=0 to Ycount-1 do
      begin
       str:=IntToStr(i)+'_'+IntToStr(j);
       Lbl:=TLabel(FindComponent(format('lbl_%s',[str])));
       if assigned(Lbl) then Lbl.Free;
      end;
    Ce code fonctionne sous Windows mais pas sous Android: Avec Android, quand je relance la création des labels, j'ai le message d'erreur indiquant que le premier label existe déjà!

    J'ai essayé de remplacer "free" par "destroy" et là, c'est tout simplement le plantage de l'app android!

    Comment puis-je détruire proprement ces labels?

    Merci d'avance

  2. #2
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique
    Inscrit en
    janvier 2007
    Messages
    13 108
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 65
    Localisation : France, Loire Atlantique (Pays de la Loire)

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

    Informations forums :
    Inscription : janvier 2007
    Messages : 13 108
    Points : 35 658
    Points
    35 658
    Billets dans le blog
    54
    Par défaut
    Bonjour,

    c'est certainement une histoire d'ARC pas encore totalement abandonné. (si quelqu'un à une idée de la version exacte de l'abandon il serait sympa de l'indiquer histoire que ma journée s'éclaire )

    Par curiosité j'ai donc concocté un petit programme (un Layout,un label, deux boutons)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    unit UAddLabels;
    
    interface
    
    uses
      System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants,
      FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics, FMX.Dialogs, FMX.Layouts,
      FMX.StdCtrls, FMX.Controls.Presentation;
    
    type
      TForm125 = class(TForm)
        Label1: TLabel;
        Btndelete: TButton;
        btnAddLabel: TButton;
        Layout1: TLayout;
        procedure BtndeleteClick(Sender: TObject);
        procedure btnAddLabelClick(Sender: TObject);
        procedure FormCreate(Sender: TObject);
      private
        { Déclarations privées }
        LabelCount : integer;
      public
        { Déclarations publiques }
      end;
    
    var
      Form125: TForm125;
    
    implementation
    
    {$R *.fmx}
    
    procedure TForm125.btnAddLabelClick(Sender: TObject);
    begin
    With Tlabel.Create(Self) do
     begin
       inc(Labelcount);
       Name:='Label'+LabelCount.ToString;
       Text:=Name;
       Position.Y:=Layout1.Height+(20*Labelcount);
       Parent:=Self;
       Align:=TAlignLayout.top;
     end;
    end;
    
    procedure TForm125.BtndeleteClick(Sender: TObject);
    var aCompo : TComponent;
    begin
     if LabelCount=0 then exit;
     aCompo:=FindComponent('Label'+Labelcount.ToString);
     if assigned(aCompo) then
      begin
       acompo.DisposeOf;
       Dec(LabelCount);
      end
     else showmessage('Label'+Labelcount.ToString+' non trouvé !');
    end;
    
    procedure TForm125.FormCreate(Sender: TObject);
    begin
    LabelCount:=1;
    end;
    
    end.
    Et c'est bien ARC le coupable. Je ne me souviens plus de quand ARC a été abandonné en tout cas avec ce programme en 10.3.2 DisposeOf restait nécessaire.
    Piqué au jeu j'ai alors vérifié avec la 10.4.2, et mis un FreeAndNil(aCompo); à la place de aCompo.DisposeOf;, cela fonctionne : l'ARC a été débandé
    La seule chose absolue dans un monde comme le nôtre, c'est l'humour. » Albert Einstein

    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Tokyo, Rio, Sidney) et peut être quelques autres
    SGBD : Firebird 2.5, 3, SQLite
    générateurs Etats : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Ubuntu, Androïd

  3. #3
    Membre émérite Avatar de pprem
    Homme Profil pro
    MVP Embarcadero - développeur Delphi, PHP et JS
    Inscrit en
    juin 2013
    Messages
    1 122
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : MVP Embarcadero - développeur Delphi, PHP et JS
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : juin 2013
    Messages : 1 122
    Points : 2 377
    Points
    2 377
    Par défaut
    En Rio (et avant), sur mobiles la méthode Free() est vide, il fallait appeler DisposeOf() pour signaler au système que l'objet pouvait être supprimé dès que possible, sans attendre.

    ARC a été éliminé en 10.4.0 pour la gestion des objets.

  4. #4
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique
    Inscrit en
    janvier 2007
    Messages
    13 108
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 65
    Localisation : France, Loire Atlantique (Pays de la Loire)

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

    Informations forums :
    Inscription : janvier 2007
    Messages : 13 108
    Points : 35 658
    Points
    35 658
    Billets dans le blog
    54
    Par défaut
    Merci Patrick d'avoir éclairé ma lanterne (à défaut de ma journée ) avec la date c'eut été la journée
    Bon courage pour cet après midi (dont j'ai oublié de faire l'annonce )
    La seule chose absolue dans un monde comme le nôtre, c'est l'humour. » Albert Einstein

    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Tokyo, Rio, Sidney) et peut être quelques autres
    SGBD : Firebird 2.5, 3, SQLite
    générateurs Etats : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Ubuntu, Androïd

  5. #5
    Membre à l'essai
    Homme Profil pro
    Développeur informatique
    Inscrit en
    février 2021
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Pays-Bas

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : février 2021
    Messages : 13
    Points : 13
    Points
    13
    Par défaut
    Merci à vous deux pour vos explications.

    En utilisant le "disposeOf", cela fonctionne parfaitement!

    Mais question de béotien: C'est quoi ce ARC?

  6. #6
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique
    Inscrit en
    janvier 2007
    Messages
    13 108
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 65
    Localisation : France, Loire Atlantique (Pays de la Loire)

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

    Informations forums :
    Inscription : janvier 2007
    Messages : 13 108
    Points : 35 658
    Points
    35 658
    Billets dans le blog
    54
    Par défaut
    Citation Envoyé par vinkelwin Voir le message
    Mais question de béotien: C'est quoi ce ARC?
    Acronyme de Automatic Reference Counting (compteur automatique de références)
    https://blog.marcocantu.com/blog/201...irections.html
    introduit pour le multi plateformes pour être abandonné par la suite (l'abandon aurait commencé fin 2018 donc avec RIO, expérience faite je m'y perd ! puisqu'il a fallu Sidney pour que ce soit OK)
    La seule chose absolue dans un monde comme le nôtre, c'est l'humour. » Albert Einstein

    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Tokyo, Rio, Sidney) et peut être quelques autres
    SGBD : Firebird 2.5, 3, SQLite
    générateurs Etats : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Ubuntu, Androïd

  7. #7
    Expert éminent sénior
    Avatar de Paul TOTH
    Homme Profil pro
    Freelance
    Inscrit en
    novembre 2002
    Messages
    8 231
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : novembre 2002
    Messages : 8 231
    Points : 26 658
    Points
    26 658
    Par défaut
    Automatic Reference Counting, c'est très bien sur le papier, et c'est utilisé pour les string et les tableaux dynamiques depuis fort longtemps, mais pour les objets ça s'est montré être une fausse bonne idée.

    sous VCL on a l'habitude de déclencher des traitements sur le Destructor, je détruis un objet, donc il est supprimé de son parent qui s'actualise par exemple...sauf qu'avec ARC pour détruire un objet il faut qu'il ne soit plus référence nul part...donc le retirer de son parent, de son propriétaire, des éventuellement composants liés, pour que finalement il soit détruit...ou alors il faut des références faibles (weak) qui ...comme c'était compliqué DisposeOf a été ajouté...mais c'est contre la philosophie de ARC..

    Marco Cantu avait fait un papier que j'ai traduit
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

  8. #8
    Expert confirmé
    Avatar de anapurna
    Homme Profil pro
    Développeur informatique
    Inscrit en
    mai 2002
    Messages
    3 148
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Arts - Culture

    Informations forums :
    Inscription : mai 2002
    Messages : 3 148
    Points : 5 268
    Points
    5 268
    Par défaut
    salut

    a la différence de Delphi originale où il faut allouer et désallouer l'objet
    l'arc (Automatic Reference Counting ) est un gestionnaire de mémoire de type ramasse miette .

    en gros il fait le ménage en cours d’exécution du programme
    et en cours de fonctionnement, permet de supprimer une instance considéré comme n'ayant plus d'utilité
    Nous souhaitons la vérité et nous trouvons qu'incertitude. [...]
    Nous sommes incapables de ne pas souhaiter la vérité et le bonheur, et sommes incapables ni de certitude ni de bonheur.
    Blaise Pascal
    PS : n'oubliez pas le tag

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [Python 3.X] Supprimer et recréer des objets "FuncAnimation"
    Par Quent4491 dans le forum Tkinter
    Réponses: 4
    Dernier message: 20/08/2020, 21h42
  2. Réponses: 11
    Dernier message: 27/05/2006, 00h07
  3. Réponses: 4
    Dernier message: 23/11/2005, 11h23
  4. Comment modifier l'affichage des objets cachés de Windows ?
    Par maximdus dans le forum API, COM et SDKs
    Réponses: 23
    Dernier message: 23/07/2005, 11h45
  5. Réponses: 11
    Dernier message: 16/10/2004, 18h14

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