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 :

Trier les lignes d'un mémo


Sujet :

Langage Delphi

  1. #1
    Rédacteur/Modérateur

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

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

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 030
    Points : 40 928
    Points
    40 928
    Billets dans le blog
    62
    Par défaut Trier les lignes d'un mémo
    Bonjour,

    Pour des besoins de lecture rapide j'ai besoin de trier les résultats que j'obtiens dans un mémo

    voici le code que j'ai "pondu", en fait je passe par un TStringList intermédiaire, pas encore assez familiarisé avec les TDictionnary et autre pour m'en passer
    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
     
    uses ... System.Bindings.Methods ...;
     
    procedure TMainForm.ObtenirClick(Sender: TObject);
    var
      AnArray : TArray<TMethodDescription>;
      AMethode : TMethodDescription;
      AStringList : TStringList;
    begin
      AStringList:=TStringList.Create;
      try
      // Obtenir les méthodes enregistrées
      // pour en avoir une liste triée, je passe par une TStringList intermédiaire
      AnArray:= TBindingMethodsFactory.GetRegisteredMethods;
      for AMethode in AnArray do
       begin
        AStringList.Add(AMethode.Name);
       end;
      AStringList.Sort;
      MethodesMemo.Lines:=AStringList;
      finally
        AStringList.Free;
      end;
    end;
    Ma question, y aurait-il plus "propre" genre :
    - trier directement AnArray selon l'élément Name
    - remplir directement le mémo (MethodesMemo) et trier ensuite ses lignes
    j'ai besoin d'un autre point de vue, merci
    MVP Embarcadero
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs États : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd

  2. #2
    Membre averti
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2004
    Messages
    86
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Décembre 2004
    Messages : 86
    Points : 375
    Points
    375
    Par défaut
    Bonjour.

    Sans être à l'aise sur le sujet non plus, pour aller au plus propre je dirais qu'on peut utiliser la méthode Sort de TArray :

    http://docs.embarcadero.com/products...rray_of_T.html

    Ceci dit, cela passe par l'utilisation de IComparer. Le code final n'en sera donc ni plus simple, ni plus court.

    La TStringList reste quand même super accessible pour ce genre de cas, et à moins d'un soucis de performance ou de mémoire, je doute que passer par la méthode Sort de TArray apporte un réel gain (encore une fois, pour ce cas).

  3. #3
    Expert confirmé
    Avatar de anapurna
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2002
    Messages
    3 418
    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 418
    Points : 5 816
    Points
    5 816
    Par défaut
    salut
    tout depand de se que tu veut faire si ce n'est qu'un trie
    tu peut aussi modifier le TMemo et lui ajouter la fonction de trie

    genre :

    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
     
    type
      TStringListSortCompare = function(List: TStrings; Index1, Index2: Integer): Integer;
     
      TMemo = Class(Vcl.StdCtrls.TMemo)
      private
        fSorted : Boolean;
        FOnChange: TNotifyEvent;
        FOnChanging: TNotifyEvent;
        procedure CustomSort(Compare: TStringListSortCompare);
        procedure QuickSort(L, R: Integer; SCompare: TStringListSortCompare);
        Procedure  Exchange(I,J : Integer);
      protected
        procedure Changed; virtual;
        procedure Changing; virtual;
        procedure SetSorted(value : Boolean);
      Public
        Procedure Sort;
        property Sorted: Boolean read FSorted write SetSorted;
        property OnChange   : TNotifyEvent read FOnChange write FOnChange;
        property OnChanging : TNotifyEvent read FOnChanging write FOnChanging;
      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
     
    function CompareString(List : TStrings; Index1, Index2 : integer) : integer;
      begin
        result := AnsiCompareText(List[Index1], List[Index2]);
      end;
     
    ///////////////////////////////////
    Procedure  TMemo.Exchange(I,J : Integer);
    var
      s : String;
    begin
      s := Self.Lines[i];
      Self.Lines[i] := Self.Lines[j];
      Self.Lines[j]:= s;
    end;
    ///////////////////////////////////
    Procedure TMemo.Sort;
    begin
      CustomSort(CompareString);
    end;
    ///////////////////////////////////
    procedure TMemo.Changed;
    begin
      if Assigned(OnChange) Then
        OnChange(self);
    end;
    ///////////////////////////
    procedure TMemo.Changing;
    begin
      if Assigned(OnChanging) Then
        OnChanging(self);
    end;
     
    procedure TMemo.SetSorted(value : Boolean);
    begin
      if Value <> fSorted Then
      begin
         if fSorted = True Then
           Sort;
         fSorted := Value ;
      end;
    end;
     
    procedure TMemo.QuickSort(L, R: Integer; SCompare: TStringListSortCompare);
    var
      I, J, P: Integer;
    begin
      repeat
        I := L;
        J := R;
        P := (L + R) shr 1;
        repeat
          while SCompare(Self.Lines, I, P) < 0 do Inc(I);
          while SCompare(Self.Lines, J, P) > 0 do Dec(J);
          if I <= J then
          begin
            Exchange(I, J);
            if P = I then
              P := J
            else
            if P = J then
              P := I;
            Inc(I);
            Dec(J);
          end;
        until I > J;
        if L < J then
          QuickSort(L, J, SCompare);
        L := I;
      until I >= R;
    end;
     
    procedure TMemo.CustomSort(Compare: TStringListSortCompare);
    begin
      if not Sorted and (self.lines.Count > 1) then
      begin
        self.lines.BeginUpdate;
        Changing;
        QuickSort(0,self.Lines.Count - 1, Compare);
        Changed;
        self.lines.EndUpdate;
      end;
    end;
    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

  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 : 42
    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
    Pour le fun uniquement, j'ai utilisé le TArray.Sort
    Je confirme que c'est lourd syntaxiquement

    Sinon attention au WordWrap dans un TMemo qui altère les lignes


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
          TFTPFoundFile = record
            FileName: TFileName;
            FileDate: TDateTime;
            FileType: TThomEntitySDIFile.TFileType;
          end;
          TFTPFoundFiles = System.Generics.Collections.TList<TFTPFoundFile>;
          TFTPFoundFileOrderer = class(TComparer<TFTPFoundFile>)
          public
            function Compare(const Left, Right: TFTPFoundFile): Integer; override;
          end;

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    //------------------------------------------------------------------------------
    function TCensure.TFTPFoundFileOrderer.Compare(const Left, Right: TFTPFoundFile): Integer;
    begin
      Result := CompareDateTime(Left.FileDate, Right.FileDate);
      // Sur un FTP externe tel que ftp.Censure.com, la date est précise au mieux à la seconde
      // Sur le FTP interne (TCensureSpareFTPServer), la date est précise jusqu'à à la milli-seconde !
      // Pour compenser une égalité, le nom généralement horodaté à la milli-seconde décidera de l'ordre !
      if Result = 0 then
        Result := CompareStr(Left.FileName, Right.FileName);
    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
     
    var
      FoundFiles: TFTPFoundFiles;
      OrderedFoundFiles: TArray<TFTPFoundFile>;
      FoundListOrderer: TFTPFoundFileOrderer;
    begin
      ...
                // Tri selon la Date, du plus ancien au plus récent
                OrderedFoundFiles := FoundFiles.ToArray();
                FoundListOrderer := TFTPFoundFileOrderer.Create();
                try
                  TArray.Sort<TFTPFoundFile>(OrderedFoundFiles, FoundListOrderer);
                finally
                  FoundListOrderer.Free();
                end;
     
     
                // Ajout des fichiers en attente de traitement dans l'ordre chronologique de réception
                for iOFF := Low(OrderedFoundFiles) to High(OrderedFoundFiles) do
                begin
                  FoundFile := OrderedFoundFiles[iOFF];
                  FParentBatch.PushInfo('FileReceiver Scrutation Found : ' + FoundFile.FileName + ' @ ' + FormatDateTime(FDT_YMDHNSZ, FoundFile.FileDate));
     
                  case FoundFile.FileType of
    ...
    alors avec le compteur de référence, on devrait pouvoir simplifier ceci

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
                FoundListOrderer := TFTPFoundFileOrderer.Create();
                try
                  TArray.Sort<TFTPFoundFile>(OrderedFoundFiles, FoundListOrderer);
                finally
                  FoundListOrderer.Free();
                end;
    en cela

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
                  TArray.Sort<TFTPFoundFile>(OrderedFoundFiles, TFTPFoundFileOrderer.Create());
    Mais à force de jouer dans les génériques, les sous-types de classes ... Delphi XE2 me balance des erreurs internes du compilateur, j'ai du écrire des codes totalement autrement
    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
    Rédacteur/Modérateur

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

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

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 030
    Points : 40 928
    Points
    40 928
    Billets dans le blog
    62
    Par défaut
    Bonjour et Merci.

    C'est bien ce qu'il me semblait, passer par le TArray.Sort etc... le code devient un peu trop "lourd".
    Comme il ne s'agit que d'une liste "hyper simple" de noms de méthodes accessibles (donc pas de wordwrap) le passage par la StringList me semble donc bien le plus court ou du moins le plus léger.

    @anapurna : oui il s'agit d'un simple tri pour un simple programme de démonstration (un de mes futurs articles sur les Livebindings) donc pas de surcharge de TMemo.

    En parlant de surcharge, je pensais qu'il aurait été possible de transtyper Memo.Lines en TStringList mais non juste en TArray donc : "le chat se mord la queue".
    Je resterai donc sur cette solution pas très élégante mais très concise (il y a pourtant toujours ce petit doute qui me titille, il va falloir que je revisionne une video).

    Merci encore pour votre implication, je clôturerai ce sujet dans un jour ou deux (ou cas où cette vidéo déclencherait quelque chose)
    MVP Embarcadero
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs États : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd

  6. #6
    Membre éprouvé
    Avatar de Cirec
    Profil pro
    Inscrit en
    Octobre 2010
    Messages
    467
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2010
    Messages : 467
    Points : 1 072
    Points
    1 072
    Par défaut
    Bonjour,
    Citation Envoyé par ShaiLeTroll Voir le message
    alors avec le compteur de référence, on devrait pouvoir simplifier ceci

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
                FoundListOrderer := TFTPFoundFileOrderer.Create();
                try
                  TArray.Sort<TFTPFoundFile>(OrderedFoundFiles, FoundListOrderer);
                finally
                  FoundListOrderer.Free();
                end;
    en cela

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
                  TArray.Sort<TFTPFoundFile>(OrderedFoundFiles, TFTPFoundFileOrderer.Create());
    Mais à force de jouer dans les génériques, les sous-types de classes ... Delphi XE2 me balance des erreurs internes du compilateur, j'ai du écrire des codes totalement autrement

    je me pose juste une question, en simplifiant ainsi on devrait avoir une fuite de mémoire (du moins sur les anciennes versions).
    j'ai bien remarqué que le comportement avait changé sous Berlin & Tokyo
    mais depuis quelle version de l'IDE cette amélioration est présente ?

    Cordialement,
    @+

  7. #7
    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 : 42
    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
    Normalement comme c'est un IComparer donc c'est le compteur du TInterfacedObject qui libère l'objet instancié
    C'est un très vieux mécanisme hérité de l'implémentation modèle COM en Delphi
    Faudrait que je fasse le test de fuite


    tient j'ai trouvé ce commentaire dans mon code
    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
     
    //------------------------------------------------------------------------------
    class procedure TStyleManagerSLTAssistant.BuildChangeStyleMenu(AMenu: TMenuItem; AOnClick: TNotifyEvent; const ADefaultStyle: string = '');
    var
      Styles: TArray<string>;
      StyleNames: TStringList;
      I: Integer;
      menu: TMenuItem;
      SystemStyleName, DefaultStyleName: string;
    begin
      AMenu.AutoHotkeys := maManual;
      AMenu.Clear();
     
      SystemStyleName := Vcl.Themes.TStyleManager.SystemStyle.Name;
      if ADefaultStyle <> '' then
        DefaultStyleName := ADefaultStyle
      else
        DefaultStyleName := SystemStyleName;
     
      Styles := Vcl.Themes.TStyleManager.StyleNames;
     
      // TArray.Sort<> et TStringComparer semble bien buggé (mauvais ordre QC 104697, libération incorrecte QC 99861, QC 104642)
      // Effectivement, 'Windows' se retrouve en 7eme position alors qu'il devrait être dernier.
      // De plus 'Windows' (contenu de SystemStyleName), je le veux en Premier !
      StyleNames := TStringList.Create();
      try
        for I := Low(Styles) to High(Styles) do
          if Styles[I] <> SystemStyleName then
              StyleNames.Add(Styles[I]);
        StyleNames.Sort();
        StyleNames.Insert(0, SystemStyleName);
     
        for I := 0 to StyleNames.Count - 1 do
        begin
          menu := TMenuItem.Create(AMenu);
          AMenu.Add(menu);
          menu.Tag := I;
          menu.AutoHotkeys := maManual;
          menu.RadioItem := true;
          menu.GroupIndex := 1;
          menu.Caption := StyleNames.Strings[i];
     
          if menu.Caption = DefaultStyleName then
          begin
            menu.Checked := True;
            TStyleManager.SetStyle(menu.Caption);
          end;
     
          menu.OnClick := AOnClick;
        end;
      finally
        StyleNames.Free();
      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

  8. #8
    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
    Pourquoi passer par une fonction de comparaison ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    uses System.Generics.Collections, System.Generics.Defaults;
     
    procedure TForm24.FormDblClick(Sender: TObject);
    var
      AnArray: TArray<string>;
      S: string;
    begin
      AnArray := ['jeudi', 'vendredi', 'lundi'];
      TArray.Sort<string>(AnArray, TStringComparer.Ordinal);
      for S in AnArray do
        Memo1.Lines.Add(S);
    end;

  9. #9
    Membre éprouvé
    Avatar de Cirec
    Profil pro
    Inscrit en
    Octobre 2010
    Messages
    467
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2010
    Messages : 467
    Points : 1 072
    Points
    1 072
    Par défaut
    Citation Envoyé par ShaiLeTroll Voir le message
    Normalement comme c'est un IComparer donc c'est le compteur du TInterfacedObject qui libère l'objet instancié
    C'est un très vieux mécanisme hérité de l'implémentation modèle COM en Delphi
    Faudrait que je fasse le test de fuite
    Merci pour cette précision, je ne savais pas que "TFTPFoundFileOrderer" héritait de "TInterfacedObject" ... ceci explique cela
    le teste de fuite me semble inutile du coup

    en fait je faisais allusion à une autre amélioration apportée à Delphi à savoir :
    si je fais ceci sous D7..D2009 j'ai une fuite de mémoire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    with TButton.Create(nil) do begin
      Caption := 'Ok';
      Parent := Self; 
    end;
    ce qui est normale
    mais sous Berlin & Tokyo (je n'ai pas de Delphi entre D2009 & Berlin), surprise, il n'y a pas de fuite (sauf si Parent := nil).

    C'est cette amélioration que j'avais en tête et je pensai que, peut être, d'autres types d'objets était couvert par cette nouveauté.

    quand à ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
      // TArray.Sort<> et TStringComparer semble bien buggé (mauvais ordre QC 104697, libération incorrecte QC 99861, QC 104642)
      // Effectivement, 'Windows' se retrouve en 7eme position alors qu'il devrait être dernier.
      // De plus 'Windows' (contenu de SystemStyleName), je le veux en Premier !
    Merci pour l'info. dès que j'ai le temps je testerai.

    sinon juste pour le fun,
    une autre voie qui permet un tri directement sur le mémo avec la possibilité
    d'utiliser une fonction de tri personnalisée :
    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
    unit crSLHelper;
     
    interface
    uses Classes;
     
    type
     
      TStringsHelper = class helper for TStrings
      public
       procedure Sort(const CompareFunction: TStringListSortCompare = nil);
      end;
    implementation
     
    procedure TStringsHelper.Sort(const CompareFunction: TStringListSortCompare);
    var
      SL: TStringList;
    begin
      SL := TStringList.Create;
      try
        SL.Assign(Self);
        if Assigned(CompareFunction) then
          SL.CustomSort(CompareFunction)
        else
          SL.Sort;
        Self.Assign(SL);
      finally
        SL.Free;
      end;
    end;
     
    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
    var
      Form4: TForm4;
     
    implementation
     
    {$R *.dfm}
    uses crSLHelper;
     
    function CompareInt(const a, b: Integer): Integer;
    begin
      if A > B then Result := 1
      else
      if A < B then Result := -1
      else Result := 0;
    end;
     
    function MyCompareFunc(List: TStringList; Index1, Index2: Integer): Integer;
    begin
      Result := CompareInt(StrToIntDef(List[Index1], 0), StrToIntDef(List[Index2], 0));
    end;
     
    procedure TForm4.Button1Click(Sender: TObject);
    begin
      Memo1.Lines.Sort;  // tri classique 
      Memo2.Lines.Sort(MyCompareFunc);  // tri sur une liste d'entier
    end;
     
    procedure TForm4.FormCreate(Sender: TObject);
    begin
      ReportMemoryLeaksOnShutdown := True;
    end;
     
    end.
    Cordialement,
    @+

  10. #10
    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 : 42
    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
    Sympa le Helper
    C'est vrai que je trie plutôt des ComboBox et tout simplement par le texte



    Citation Envoyé par Cirec Voir le message
    en fait je faisais allusion à une autre amélioration apportée à Delphi à savoir :
    si je fais ceci sous D7..D2009 j'ai une fuite de mémoire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    with TButton.Create(nil) do begin
      Caption := 'Ok';
      Parent := Self; 
    end;
    ce qui est normale
    mais sous Berlin & Tokyo (je n'ai pas de Delphi entre D2009 & Berlin), surprise, il n'y a pas de fuite (sauf si Parent := nil).


    C'est cette amélioration que j'avais en tête et je pensai que, peut être, d'autres types d'objets était couvert par cette nouveauté.
    curieux !
    Normalement en D7, c'était déjà écrit dans l'aide que le Parent était responsable de la libération (un peu en double du Owner d'ailleurs)
    Voici un débat à ce sujet Parent et Owner

    Etant en D7 à l'époque du sujet, je n'avais pas constaté de fuite mémoire
    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

  11. #11
    Membre éprouvé
    Avatar de Cirec
    Profil pro
    Inscrit en
    Octobre 2010
    Messages
    467
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2010
    Messages : 467
    Points : 1 072
    Points
    1 072
    Par défaut
    Ha !!!

    ce débat me laisse sans voix
    je pourrai même dire qu'il me laisse sans voie
    parce que je me sens un peu perdu là ...

    Que puis-je dire de plus ?
    au temps pour moi,
    tout comme la majorité des intervenants du débat j'avais acquis des certitudes, sur le rôle du Owner et celui du Parent, à un tel point que j'ai même eut du mal croire le résultat des testes

    Bon il n'y a pas de conséquence, heureusement mais quand même ça fait un micro-choc

    En tous cas, je te remercie pour ce lien très instructif.

    Cordialement,
    @+

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

Discussions similaires

  1. Trier les lignes XML d'un fichier
    Par hellbilly dans le forum Shell et commandes GNU
    Réponses: 6
    Dernier message: 09/03/2011, 17h52
  2. Trier les lignes de ma ReadSheet par order decroissant de ma col 2 ?
    Par antoine.dandois dans le forum Général VBA
    Réponses: 2
    Dernier message: 17/01/2007, 19h40
  3. Réponses: 2
    Dernier message: 19/09/2006, 21h34
  4. Réponses: 3
    Dernier message: 26/04/2004, 12h51

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