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 :

Gestion de fichiers XML


Sujet :

Composants FMX Delphi

  1. #1
    Membre régulier
    Développeur informatique
    Inscrit en
    Décembre 2010
    Messages
    228
    Détails du profil
    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Décembre 2010
    Messages : 228
    Points : 113
    Points
    113
    Par défaut Gestion de fichiers XML
    Bonjour,

    Dans une appli iOS sous Sydney je stocke certaines données dans des fichiers XML. Parfois, lorsque je secoue bien l'application, je rencontre des erreurs "Too many files open". J'ai aussi des erreurs "E/S24", je comprends le type d'erreur mais pas la cause
    Avec cette même appli sous Android je ne rencontre pas ce type d'erreur.

    Pour la lecture:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
      docXML := TXMLDocument.Create(owner);
      docXML.Active := true;
      docXML.LoadFromFile(MAIN_PATH + 'mesures_install2.xml');
      // je remplis mes objets à partir du fichier
    Pour la mise à jour de ces fichiers:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
        docXML := TXMLDocument.Create(owner);
        docXML.Active := True;
        docXML.Encoding := 'utf-8';
        docXML.Options := [doNodeAutoIndent];
        // je remplis mon fichier à partir de mes objets
        docXML.SaveToFile(MAIN_PATH + 'mesures_install2.xml');
    Je dois faire quelque chose de faux mais je ne vois pas.

    La gestion de fichiers sous iOS est-elle spéciale ?

    Merci pour vos conseils
    Images attachées Images attachées  

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

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

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    Points : 28 430
    Points
    28 430
    Par défaut
    Sydney n'a plus d'ARC pour Mobile...il faut donc détruire les objets créés, ou passer par des Interfaces.
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

  3. #3
    Membre régulier
    Développeur informatique
    Inscrit en
    Décembre 2010
    Messages
    228
    Détails du profil
    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Décembre 2010
    Messages : 228
    Points : 113
    Points
    113
    Par défaut
    Merci Paul

    Effectivement mon code n'est plus trop compatible avec Sydney... J'ai fait les Destroy proprement mais j'ai encore mon problème E/S24 et de trop grand nombre de fichiers ouverts (cf. image)...

    J'espère que ça pourra résoudre mon problème de trop grand nombre d'image ouverts.

    Je suis les instructions données ici pour enlever ARC
    Images attachées Images attachées  

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

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

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    Points : 28 430
    Points
    28 430
    Par défaut
    et si tu veux simuler ARC il y a des astuces


    exemple

    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
     
    type
      IAutoFree = interface
      end;
      TAutoFree = class(TInterfacedObject, IAutoFree)
      private
       Obj: TObject;
      public
       destructor Destroy; override;
      end;
     
    destructor TAutoFree.Destroy;
    begin
      Obj.Free;
      inherited;
    end;
     
    function AutoFree(Obj: TObject): IAutoFree;
    var
      LAutoFree: TAutoFree;
    begin
      LAutoFree := TAutoFree.Create;
      LAutoFree.Obj := Obj;
      Result := LAutoFree;
    end;
     
     
    procedure TForm1.FormCreate(Sender: TObject);
    var
      Button : TButton;
    begin
      Button := TButton.Create(nil);
      AutoFree(Button);
      Button.Parent := Self;
    end;
    dans cet exemple, le fait d'appeler AutoFree() sur le bouton, cela va retourner une Interface IAutoFree qui sera détruite automatique...en fin de procédure, et dans son destructor, je détruis l'objet associé.

    un exemple plus utile serait
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    procedure TForm1.FormCreate(Sender: TObject);
    var
      List: TStringList;
    begin
      List := TStringList.Create;
      AutoFree(List);
      ...
    end;
    Avec Syndney est le Record Managés, il est aussi possible de faire des choses
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

  5. #5
    Membre régulier
    Développeur informatique
    Inscrit en
    Décembre 2010
    Messages
    228
    Détails du profil
    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Décembre 2010
    Messages : 228
    Points : 113
    Points
    113
    Par défaut
    Merci Paul, c'est instructif et clair. J'ai une meilleure gestion de ma mémoire et bien fait baisser mes fuites.

    Mais il y a un cas que je ne résous pas et qui concerne la gestion de TImage.

    J'ai une fiche créée au lancement de l'application qui contient une TImage. Lorsque je rends visible cette fiche, l'utilisateur visualise des images dans l'objet FImage en prenant bien soin de supprimer l'objet avant de charger une nouvelle image.

    Malgré cela, j'ai repéré sous Windows (avec ReportMemoryLeaksOnShutdown:= True) que j'ai une mauvaise gestion de mes images car on détecte des erreurs sur les types TBitmapImage et TD2DBitmapHandle.

    Je ne comprends pas


    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
    type
      TFrameGestion = class(TFrame)
    	...
      private
        FImage: TImage;
    	...
        procedure MAJPhoto(_NomFichier : String);
      public
        ...
        procedure Retour;
      end;
     
     
    // Chargement d'une image
    procedure TFrameGestion.MAJPhoto(_NomFichier: String);
    begin
      if (FImage <> Nil) then
      begin
        FreeAndNil(FImage) ;
      end;
     
      //
      FImage:= TImage.Create(Nil);
      with FImage do
      begin
        Parent  := RectangleFondImage ;
        Align   := TAlignLayout.Client ;
        OnClick := ImageClick ;
      end;
     
     
      if FileExists(MAIN_PATH + _NomFichier) then
      begin
        FImage.Bitmap:= TBitmap.CreateFromFile(MAIN_PATH + _NomFichier);
      end
    end;
     
     
    // Appelé quand on cache ce frame
    procedure TFrameGestion.Retour;
    begin
      FreeAndNil(FImage) ;
    end;

  6. #6
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 454
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 454
    Points : 24 866
    Points
    24 866
    Par défaut
    FImage.Bitmap:= TBitmap.CreateFromFile doit fuire car l'affectation du Bitmap doit être un Assign (si FMX fonctionne un peu comme la VCL)

    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
    // Chargement d'une image
    procedure TFrameGestion.MAJPhoto(_NomFichier: String);
    var
      Bmp: TBitmap;
    begin
        FreeAndNil(FImage) ; // inutle de vérifier nil car Free fait la vérification
     
      //
      FImage:= TImage.Create(Nil);
      with FImage do
      begin
        Parent  := RectangleFondImage ;
        Align   := TAlignLayout.Client ;
        OnClick := ImageClick ;
      end;
     
     
      if FileExists(MAIN_PATH + _NomFichier) then
      begin
        // FImage.Bitmap:= TBitmap.CreateFromFile(MAIN_PATH + _NomFichier);
      Bmp := TBitmap.CreateFromFile(MAIN_PATH + _NomFichier);
       try
         FImage.Bitmap := Bmp; // Problabement un Accesseur SetBitmap qui fait une copie de l'image
       finally  
         Bmp.Free();
       end;
      end
    end;
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  7. #7
    Membre régulier
    Développeur informatique
    Inscrit en
    Décembre 2010
    Messages
    228
    Détails du profil
    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Décembre 2010
    Messages : 228
    Points : 113
    Points
    113
    Par défaut
    Merci je n'ai plus de fuite à cause de mes images mais le problème persiste sur les fichiers xml (erreur e/s24) qui entraine l'erreur sur les images (Impossible d'ouvrir le fichier "xxx.jpeg" too many open files). J'ai apporté les modifs de désallocation mémoire.
    Je ne rencontre pas ce problème sous Android.

    Mon débuggage est compliqué car mon iMac se maj automatiquement et XCode n'est plus compatible avec Sydney; normalement une maj de paserver doit prochainement résoudre cela.

    Je continue mes recherches.

Discussions similaires

  1. Gestion des fichiers XML avec la XML toolbox
    Par duf42 dans le forum Contribuez
    Réponses: 2
    Dernier message: 24/02/2012, 09h00
  2. Gestion de fichiers XML
    Par dessinateurttuyen dans le forum MySQL
    Réponses: 1
    Dernier message: 17/04/2009, 13h29
  3. Gestion des fichiers XML et ASC3 sous Flex:
    Par silverfab34 dans le forum Flex
    Réponses: 2
    Dernier message: 18/07/2007, 17h34
  4. [PB 7.0] Gestion de fichier XML
    Par ben_ghost dans le forum Powerbuilder
    Réponses: 2
    Dernier message: 25/03/2007, 16h39
  5. Gestion de fichiers xml par php
    Par omman95 dans le forum Langage
    Réponses: 6
    Dernier message: 14/10/2006, 07h30

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