#1 2026-02-01 20:26:40

dcoun
Member
From: Crete, Greece
Registered: 2020-02-18
Posts: 519

adding a Torm object in a ilist with loCreateUniqueIndex

In the following code:

type
  Tmyorm=class(Torm)
    private
      Fwasadded: boolean;
    published
      property wasadded:boolean read Fwasadded write Fwasadded;
  end;

procedure TForm3.Button1Click(Sender: TObject);
var lista:ilist<Tmyorm>; o:tmyorm; fin:tarray<tmyorm>; n:integer; b:boolean;
begin
lista:=collections.Newplainlist<Tmyorm>([loCreateUniqueIndex],nil,ptOrm);
for n:=0 to 4 do
  begin
    o:=tmyorm.Create;
    o.IDValue:=1;
    lista.add(o,@b);
    o.wasadded:=b;
    if not b then o.free;
  end;
fin:=lista.AsArray;
memo1.lines.add(dynarraysavejson(fin,typeinfo(tarray<tmyorm>)));
end;

I am getting:

[{"RowID":1,"wasadded":true},{"RowID":1,"wasadded":true},{"RowID":1,"wasadded":true},{"RowID":1,"wasadded":true},{"RowID":1,"wasadded":true}]

What am I doing wrong?

Offline

#2 2026-02-02 18:45:27

ab
Administrator
From: France
Registered: 2010-06-21
Posts: 15,406
Website

Re: adding a Torm object in a ilist with loCreateUniqueIndex

Nothing seems wrong here.
You are adding items to the IList<>.

Offline

#3 2026-02-02 20:12:49

dcoun
Member
From: Crete, Greece
Registered: 2020-02-18
Posts: 519

Re: adding a Torm object in a ilist with loCreateUniqueIndex

Since I created the list with loCreateUniqueIndex and ptOrm, why Torm objects are added with the same IDvalue?

Offline

#4 2026-02-04 07:57:20

dcoun
Member
From: Crete, Greece
Registered: 2020-02-18
Posts: 519

Re: adding a Torm object in a ilist with loCreateUniqueIndex

Should I check before adding? if so, what does the second parameter in ilist<>.add?

Offline

#5 2026-02-06 21:50:49

dcoun
Member
From: Crete, Greece
Registered: 2020-02-18
Posts: 519

Re: adding a Torm object in a ilist with loCreateUniqueIndex

type
  Tmyorm=class(Torm)
    private
      Fwasadded: boolean;
    published
      property wasadded:boolean read Fwasadded write Fwasadded;
  end;

function CompareMyOrmID(const A, B): integer;
begin
  result := ord(Tmyorm(A).IDValue > Tmyorm(B).IDValue) - ord(Tmyorm(A).IDValue < Tmyorm(B).IDValue);
end;

procedure TForm3.Button1Click(Sender: TObject);
var lista:ilist<Tmyorm>; o:tmyorm; fin:tarray<tmyorm>; n:integer; b:boolean;
begin
lista:=collections.Newplainlist<Tmyorm>;
lista.Comparer := CompareMyOrmID;

for n:=0 to 4 do
  begin
    o:=tmyorm.Create;
    o.IDValue:=1;
    lista.AddSorted(o,@b);
    o.wasadded:=b;
    if not b then o.free;
  end;
fin:=lista.AsArray;
memo1.lines.add(dynarraysavejson(fin,typeinfo(tarray<tmyorm>)));
end;

The following works as I can see. So, my problem is fixed.

Last edited by dcoun (2026-02-07 14:35:37)

Offline

Board footer

Powered by FluxBB