Dynamische Tlist der Tlist
-
26-10-2019 - |
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.
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