Question

i ont ce problème: que je peux ajouter à la liste une liste? J'ai essayé donc, mais principal retour liste toujours une liste, et ne pas comprendre où je me trompe. La structure est la suivante:

  PCombArray = array of Integer;
  PStatsRecord = record
    Comb: PCombArray;
    Freq: Integer;
  end;
  PStatsList = TList<PStatsRecord>;
  TStatsList = TList<PStatsList>;

Où peigne est un champ qui fonctionnent comme clé primaire. Mais ici tout est correct. i définir la liste principale comme:

var
  MainList: TStatsList;
  MySubList: PStatsList;

et créer, sans problème. Un travail de procédure pour alimenter un subList; pour esample j'appelle cette procédure comme MakeSubList et lui attribuer une MySubList la liste maked, puis-je l'ajouter à la liste:

  MainList := TList<PStatsList>.Create;
  try
    MainList.Clear;    
    for index := 1 to N do // generate N subList
    begin  
      ...
      MySubList := MakeSubList(index); // contain correct sub list, no problem here
      ...
      MainList.Add(MySubList);  // add mysublist to mainlist
    end;
    writeln (mainList.count);  // return 1, and not N-1 sublist
  finally
    MainList.Free;
  end; 

qui me remercie aider à comprendre que je puisse le résoudre. Merci encore.

Était-ce utile?

La solution

Votre fonction make sous liste peut-être tort, ou vous auriez pu vous confondre avec vos conventions de nommage qui ne suivent en aucune façon l'habituel Delphi / conventions de nommage pour les types Pascal.

Les travaux de code suivant, cependant.

Notez qu'un TList est un objet si vous voulez faire une liste de TList assurez-vous d'utiliser TObjectList au lieu de TList simple, sauf si vous aimez les fuites de mémoire. Votre liste intérieure est autour d'un type d'enregistrement et n'a pas besoin d'être TObjectList, mais si vous avez changé StatsRecord à TStatsData comme un type TObject (classe), vous devez également changer à TObjectList.

unit aUnit5;

interface

uses Generics.Collections;

procedure Test;

implementation

type
      CombArray = array of Integer;
      StatsRecord = record
        Comb: CombArray;
        Freq: Integer;
      end;
      TStatsList2 = TList<StatsRecord>;
      TStatsList = TObjectList<TStatsList2>;

var
      MainList: TStatsList;
      MySubList: TStatsList2;
      index:Integer;

procedure Test;
begin

      MainList := TStatsList.Create;
      try
        for index := 1 to 10 do // generate N subList
        begin
          MySubList := TStatsList2.Create;
          MainList.Add(MySubList);  // add mysublist to mainlist
        end;
        finally
        MainList.Free;
      end;
end;


end.

Autres conseils

MainList est une liste de PStatsList, vous êtes certainement autorisé à ajouter des instances de PStatsList à elle. Si vous n'êtes pas autorisé, votre code ne serait pas compilé ou courir du tout.

Si la boucle court temps de N, puis MainList.Add sera appelé temps de N et MainList.Count sera N. Donc, si imprime WriteLn(MainList.Count) 1, alors nous ne pouvons conclure que N = 1.

TList autorise les doublons, même si MakeSubList retourne le même objet à chaque fois, il peut encore s'ajouter à la liste principale plusieurs fois.

    ..
    implementation
    type
      S64 = string[64];
      art_ptr = ^art_rec;
      art_rec = record
        sDes: S64;
        rCost: real;
        iQty: integer;
      end;
      art_file = file of art_rec;
    var
      lCatalog: TList;

    procedure disp_all;
    var
      lArt: TList;
      pA: art_ptr;
      c, 
      a: integer;
    begin
      for c:= 0 to lCatalog.Count -1 do begin
        lArt:= lCatalog[c];
        for a:= 0 to lArt.Count -1 do begin
          pA:= lArt[a];
          Dispose(pA);
        end;
        lArt.Clear;
        lArt.Free;
      end;
      lCatalog.Clear;
    end;//  disp_all

    procedure TfrmMain.FormCreate(Sender: TObject);
    begin
      lCatalog:= TList.Create;
    end;//  FormCreate

    procedure TfrmMain.FormDestroy(Sender: TObject);
    begin
      disp_all;
      lCatalog.Free;
    end;//  FormDestroy

    //  a normal BitButton click that adds 3 records to each art list (2)
    procedure TfrmMain.bbMCreate_Click(Sender: TObject);
    const
      nArt = 2;
      nRec = 3;
    var
      pA: art_ptr;
      lArt: TList;
      c: integer;
    begin
      // clears any previous added pointer record to art list that was added to the catalog
      disp_all;

      //  creates art lists and add 'em to the catalog list
      for c:= 0 to nArt -1 do begin
        lArt:= TList.Create;
        lCatalog.Add(lArt);

        //  creates records and add 'em to the art list
        for a:= 0 to nArt -1 do begin
          pA:= New(art_ptr);
          with pA^ do begin
            sDes:= Format('cat%d-art%d', [c, a]);
            rCost:= (c+1) * (a +1) *1.0;
            iQty:= (c+1) *10 + (a +1);
          end;
          lArt.Add(pA);
        end;
      end;
    end;//  bbMCreate_Click

    //  a normal BitButton click that reads 1 record from 1 art list
    procedure TfrmMain.bbMRead_Click(Sender: TObject);
    const
      c = 1;
      a = 2;
    var
      pA: art_ptr;
      lArt: TList;
    begin
      // gets art list #2 from catalog (index is 0 based. c=1)
      lArt:= lCatalog[c];
      // gets record #3 from art list (index is 0 based. a=2)
      pA:= lArt[a];
      // displays the record in a string grid called sgArt... at row a+1
      with sgArt, pA^ do begin
        // col 0 contains cat index and art index, can be useful...
        cells[0,a+1]:= Format('\%d\%d', [c,a]);
        cells[1,a+1]:= sDes;
        cells[2,a+1]:= FormatFloat('0.00', rCost);
        cells[3,a+1]:= IntToStr(iQty);
      end;
    end;//  bbMRead_Click
    
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top