Domanda

ho questo problema: come posso aggiungere la lista di una lista? ho provato così, ma la lista principale di ritorno sempre una lista, e non capire dove mi sbaglio. La struttura è questo:

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

Dove Comb è un campo che lavoro come chiave primaria. Ma qui tutto ok. Definisco lista principale come:

var
  MainList: TStatsList;
  MySubList: PStatsList;

e creare, senza problemi. Un'opera procedura per compilare un elenco secondario; per esample io chiamo questa procedura come MakeSubList e assegnare un MySubList lista maked, poi lo aggiungo alla lista principale:

  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; 

Grazie che mi aiutano a capire in modo che io possa risolverlo. Grazie ancora.

È stato utile?

Soluzione

Il tuo make funzione elenco sub potrebbe essere sbagliato, o si potrebbe aver confuso da soli con i vostri convenzioni di denominazione che non seguono in alcun modo i / convenzioni di denominazione Pascal solito Delphi per i tipi.

I seguenti lavori di codice, però.

Si noti che un TList è un oggetto, quindi se si vuole fare una lista di TList assicurarsi di utilizzare TObjectList invece di TList pianura a meno che non vi piace perdite di memoria. La vostra lista interna è di circa un tipo di record e non ha bisogno di essere TObjectList, ma se è stato modificato StatsRecord a TStatsData come un tipo TObject (classe), si dovrebbe anche cambiare 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.

Altri suggerimenti

MainList è una lista di PStatsList, in modo che stai certamente permesso di aggiungere istanze di PStatsList ad esso. Se non era permesso, il codice non avrebbe compilato o correre a tutti.

Se il ciclo viene eseguito volte N, quindi MainList.Add sarà chiamato volte N, e MainList.Count sarà N. Quindi, se le stampe WriteLn(MainList.Count) 1, allora possiamo solo concludere che N = 1.

TList consente duplicati, quindi, anche se MakeSubList sta tornando lo stesso oggetto ogni volta, può ancora ottenere aggiunto alla lista principale più volte.

    ..
    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
    
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top