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

Langage Delphi Discussion :

Class helper FMX


Sujet :

Langage Delphi

  1. #1
    Membre émérite

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2007
    Messages
    3 385
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2007
    Messages : 3 385
    Points : 2 999
    Points
    2 999
    Par défaut Class helper FMX
    Hello les gens

    Est-ce que vous avez remarqué quelques problèmes avec les class helper en FMX sous Seattle ?
    Par exemple, j'ai souvent utilisé l'astuce consistant à mettre un entier sous forme d'objet dans une combobox.
    Typiquement, une liste de noms et d'id en base de données.
    Avec le code suivant qui ne m'a jamais posé de problème, ItemIndex n'est jamais mis à jour.

    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
     
    procedure TComboboxHelper.SelectObjIntValue(Value: Integer);
    var
      I, J: Integer;
    begin
      for I := 0 to Pred(Items.Count) do
      begin
        if Value = Integer(Items.Objects[I]) then
        begin
          ItemIndex := I;
          Break;
        end;
      end;
    end;
     
    function TComboboxHelper.TextFromID(Value: Integer): string;
    var
      I: Integer;
    begin
      Result := '';
      for I := 0 to Pred(Count) do
      if Integer(Items.Objects[I]) = Value then
      begin
        Result := Items[I];
        Break;
      end;
    end;
     
    function TComboboxHelper.ValueInt(Idx: Integer): Integer;
    begin
      if Count > 0 then
      begin
        if Idx = -1 then
          Result := Integer(Items.Objects[ItemIndex])
        else
          Result := Integer(Items.Objects[Idx]);
      end
      else
        Result := 0;
    end;

  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
    je ne vois rien de particulier...mais tu peux peut-être utiliser ComboBox1.ListItems[0].Tag
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

  3. #3
    Membre émérite

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2007
    Messages
    3 385
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2007
    Messages : 3 385
    Points : 2 999
    Points
    2 999
    Par défaut
    Citation Envoyé par Paul TOTH Voir le message
    je ne vois rien de particulier...mais tu peux peut-être utiliser ComboBox1.ListItems[0].Tag
    Les vieilles habitudes ont la vie dure.

    Mais ce serait effectivement plus simple que de passer par l'objet.

    Le non changement d'ItemIndex vient peut-être d'une autre cause que j'ai zappée pour le moment.

    Je vais voir dans les jours qui viennent ce que ça donne.

  4. #4
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 447
    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 447
    Points : 24 849
    Points
    24 849
    Par défaut
    Oui surtout que la référence du TObject compilé en 64Bits c'est 8 Octets et non 4 comme le Integer !

    On a eu a peu près le même sujet sur un lien Nom / ID dans un combo ou j'ai fourni mes classes TGenericCodeComboObject / TGenericIDComboObject
    Le Tag, c'est sympa sur FMX
    En VCL, créé un objet reste bien plus propre que ce transtypage sauvage mais cela oblige une libération, idem, j'ai aussi mes classes Helpers sur le TStrings qui n'est pas un TStringList donc n'a pas OwnsObjects

    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
      TStringsSliteHelper = class helper for TStrings
      public
        procedure FreeAndNilObjects();
        procedure ClearStringsAndObjects();
      end;
     
    //------------------------------------------------------------------------------
    procedure TStringsSliteHelper.ClearStringsAndObjects();
    begin
      TStringsSLTToolHelp.ClearStringsAndObjects(Self);
    end;
     
    //------------------------------------------------------------------------------
    procedure TStringsSliteHelper.FreeAndNilObjects();
    begin
      TStringsSLTToolHelp.FreeAndNilObjects(Self);
    end;
    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
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
     
    //------------------------------------------------------------------------------
    (*                SoLuTions is an Versatile Library for Delphi                 -
     *                                                                             -
     *  Copyright "SLT Solutions" © (2006)                                         -
     *  contributeur : ShaiLeTroll (2012) - Renommage Fichier et Correction XE2    -
     *  contributeur : ShaiLeTroll (2012) - Documentation Insight                  -
     *                                                                             -
     * Ce logiciel est un programme informatique servant à aider les développeurs  -
     * Delphi avec une bibliothèque polyvalente, adaptable et fragmentable.        -
     *                                                                             -
     * Ce logiciel est régi par la licence CeCILL-C soumise au droit français et   -
     * respectant les principes de diffusion des logiciels libres. Vous pouvez     -
     * utiliser, modifier et/ou redistribuer ce programme sous les conditions      -
     * de la licence CeCILL-C telle que diffusée par le CEA, le CNRS et l'INRIA    -
     * sur le site "http://www.cecill.info".                                       -
     *                                                                             -
     * En contrepartie de l'accessibilité au code source et des droits de copie,   -
     * de modification et de redistribution accordés par cette licence, il n'est   -
     * offert aux utilisateurs qu'une garantie limitée.  Pour les mêmes raisons,   -
     * seule une responsabilité restreinte pèse sur l'auteur du programme,  le     -
     * titulaire des droits patrimoniaux et les concédants successifs.             -
     *                                                                             -
     * A cet égard  l'attention de l'utilisateur est attirée sur les risques       -
     * associés au chargement,  à l'utilisation,  à la modification et/ou au       -
     * développement et à la reproduction du logiciel par l'utilisateur étant      -
     * donné sa spécificité de logiciel libre, qui peut le rendre complexe à       -
     * manipuler et qui le réserve donc à des développeurs et des professionnels   -
     * avertis possédant  des  connaissances  informatiques approfondies.  Les     -
     * utilisateurs sont donc invités à charger  et  tester  l'adéquation  du      -
     * logiciel à leurs besoins dans des conditions permettant d'assurer la        -
     * sécurité de leurs systèmes et ou de leurs données et, plus généralement,    -
     * à l'utiliser et l'exploiter dans les mêmes conditions de sécurité.          -
     *                                                                             -
     * Le fait que vous puissiez accéder à cet en-tête signifie que vous avez      -
     * pris connaissance de la licence CeCILL-C, et que vous en avez accepté les   -
     * termes.                                                                     -
     *                                                                             -
     *----------------------------------------------------------------------------*)
    unit SLT.Common.ClassesEx;
     
    interface
     
    uses
      System.Classes;
     
    type
      /// <summary>Boite à outil pour la classe TStrings</summary>
      /// <remarks>Le TStringsSLTToolHelp n'est pas un class helper car lors de sa création en 2002 sous Delphi 5, le code était procédural,
      /// lors de la refonte en classe en 2007, la version utilisée était Delphi 7, en s'inspirant du concept des Assistances de classes (Class Helper) du Delphi.NET
      /// <para>En XE2, la TStringList offre une propriété OwnsObjects (n'existe pas dans la TStrings) qui se comportent comme celle d'une TObjectList, cela remplace ClearStringsAndObjects</para></remarks>
      TStringsSLTToolHelp = class(TObject)
      public
        class procedure FreeAndNilObjects(AList: TStrings); static;
        class procedure ClearStringsAndObjects(AList: TStrings); static;
      end;
     
    implementation
     
    { TStringsSLTToolHelp }
     
    //------------------------------------------------------------------------------
    class procedure TStringsSLTToolHelp.ClearStringsAndObjects(AList: TStrings);
    begin
      if Assigned(AList) then
      begin
        FreeAndNilObjects(AList);
        AList.Clear();
      end;
    end;
     
    //------------------------------------------------------------------------------
    class procedure TStringsSLTToolHelp.FreeAndNilObjects(AList: TStrings);
    var
      I: Integer;
      Obj: TObject;
    begin
      if Assigned(AList) then
      begin
        for I := 0 to AList.Count - 1 do
        begin
          Obj := AList.Objects[I];
          if Assigned(Obj) then
          begin
            AList.Objects[I] := nil;
            Obj.Free();
          end;
        end;
      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

  5. #5
    Membre émérite

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2007
    Messages
    3 385
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2007
    Messages : 3 385
    Points : 2 999
    Points
    2 999
    Par défaut
    J'admets, comme tu le dis justement, que le transtypage sauvage n'est pas la meilleure solution et n'a que l'avantage d'éviter une libération mémoire.

    Je me permettrai, avec ton accord préalable bien sûr, d'utiliser ton code qui est bien plus propre que le mien, en faisant une version avec Tag pour FMX et une autre en VCL.

  6. #6
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 447
    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 447
    Points : 24 849
    Points
    24 849
    Par défaut
    Citation Envoyé par Papy214 Voir le message
    avec ton accord préalable bien sûr, d'utiliser ton code
    tout code que je diffuse sur le forum est partagé avec plaisir.

    Citation Envoyé par Papy214 Voir le message
    en faisant une version avec Tag pour FMX et une autre en VCL.
    N'hésite pas à la fournir sur le forum !
    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

Discussions similaires

  1. Class Helper pour les Array
    Par topolino dans le forum Général JavaScript
    Réponses: 5
    Dernier message: 02/12/2014, 13h34
  2. [XE] Variable et Class Helper
    Par Rayek dans le forum Langage
    Réponses: 9
    Dernier message: 09/03/2012, 17h57
  3. Classes Helper (demande d'information)
    Par francois6 dans le forum Windows Presentation Foundation
    Réponses: 8
    Dernier message: 04/11/2011, 16h22
  4. [D2007] Class Helper : Modifier un évènement ?
    Par Rayek dans le forum Langage
    Réponses: 32
    Dernier message: 20/09/2010, 13h57
  5. [1.x] Helper et classe personelle
    Par jeronimo83 dans le forum Symfony
    Réponses: 4
    Dernier message: 09/11/2009, 10h35

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