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.
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