Frage

Ich habe dieses Problem: Wie ich eine Liste zu einer Liste hinzufügen kann? Ich habe es so versucht, aber die Hauptliste gibt immer eine Liste zurück und verstehe nicht, wo ich mich verwechsle. Die Struktur ist Folgendes:

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

Wo Kamm ein Feld ist, das als Hauptschlüssel fungiert. Aber hier alles in Ordnung. Ich definiere die Hauptliste als:

var
  MainList: TStatsList;
  MySubList: PStatsList;

und erstellen Sie es ohne Problem. Ein Verfahren, um einen Sublisten zu bevölkern; Für eTample nenne ich diese Prozedur als Makuber und weise einem MySublisten die Liste der Maked zu, dann füge ich sie der Hauptliste hinzu:

  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; 

Danke, wer hilf mir zu verstehen, damit ich es lösen kann. Danke noch einmal.

War es hilfreich?

Lösung

Ihre Make -Sub -List -Funktion ist möglicherweise falsch oder Sie haben sich möglicherweise mit Ihren Namenskonventionen verwechselt, die in keiner Weise den üblichen Delphi/Pascal -Namenskonventionen für Typen folgten.

Der folgende Code funktioniert jedoch.

Beachten Sie, dass eine Tlist ein Objekt ist. Wenn Sie also eine Liste der Tlist erstellen möchten, verwenden Sie die TobjectList anstelle von Plain Tlist, es sei denn, Sie mögen Speicherlecks. Ihre innere Liste befindet sich um einen Datensatztyp und muss keine Tobjectlist sein. Wenn Sie jedoch StatsRecord in Tstatsdata als Tobjekttyp (Klasse) gewechselt haben, sollten Sie auch in TobjectList ändern.

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.

Andere Tipps

MainList ist eine Liste von PStatsList, Sie dürfen also auf jeden Fall Instanzen von hinzufügen PStatsList dazu. Wenn Sie nicht erlaubt wären, hätte Ihr Code überhaupt nicht kompiliert oder ausgeführt.

Wenn die Schleife läuft N Zeiten dann MainList.Add wird angerufen werden N Zeiten und MainList.Count wird sein N. Also, wenn WriteLn(MainList.Count) Drucke 1, dann können wir das nur schließen N = 1.

TList erlaubt Duplikate, also auch wenn MakeSubList Gibt jedes Mal dasselbe Objekt zurück, es kann immer noch mehrmals zur Hauptliste hinzugefügt werden.

    ..
    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
    
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top