Autor Téma: Ako pristupovať k Values v Dictionary, ak Values sú typu TArray<double>  (Přečteno 1467 krát)

Offline miroB

  • Guru
  • *****
  • Příspěvků: 584
  • Karma: 17
    • Verze Delphi: D1,2,3,4,7,2005,2009, XE8,S,B,T10.2.2 Pro
Oprava odoberania z TObjectDictionary. OSPRAVEDLŇUJEM SA za predošlé znenie!!!
Funguje v tejto úprave:

HLAVNÁ OTÁZKA:
Pri každom priechode cez onFinalize môžem použiť toto (Remove) ?
Kód: Delphi [Vybrat]
  1. // Princíp použitia
  2. TmedSQLiteDict( AUserData ).Remove( sqlite3_aggregate_context( sqlite3_aggregate_context( AFunc.Output.Handle, 0 )^ ) );
  3. TObjectDictionary<Variant, T_medianObject>.Free;
  4. TObjectDictionary<Variant, T_medianObject> := nil;
Bude to stačiť a okrem Remove nemusím už nič viac mazať/uvoľňovať?
Principiálne takto, (viď kód hore) by stačilo uvoľnenie?

Pre istotu, reálny kontext Remove, výber z programu:
Kód: Delphi [Vybrat]
  1. procedure Tdm.fnMedianAggregateFinalize( AFunc: TSQLiteFunctionInstance; var AUserData: TObject );
  2. begin
  3. ..
  4. DataCtx                      := sqlite3_aggregate_context( AFunc.Output.Handle, 0 );
  5. if Assigned( DataCtx ) then
  6.   begin
  7.   StepCtx                    := psqlite3_context( DataCtx^ );
  8.   medFnDict := TmedSQLiteDict( AUserData );
  9.   if medFnDict.TryGetValue( StepCtx, oRslt ) then
  10.     begin
  11.     ..  // Tu prebehnú rôzne výpočty
  12.     medFnDict.Remove( StepCtx ); // Uvolnenie.. Ak by to teda stačilo
  13.     oRslt.Free;                 // Uvolnenie.. Ak by to teda stačilo
  14.     oRslt     := nil;
  15.     end;
Inak som dodržal všetky posledné pokyny z posledného príspevku od Delfin.
Poznámka:  Na záver by bolo jednoduché uvoľnenie hlavného slovníka, toho nad AUserData, ale to nie je možné využiť.
Pretože posledný priechod cez OnFinalize nie je známy.
« Poslední změna: 23-01-2019, 13:14:56 od miroB »

Offline miroB

  • Guru
  • *****
  • Příspěvků: 584
  • Karma: 17
    • Verze Delphi: D1,2,3,4,7,2005,2009, XE8,S,B,T10.2.2 Pro
..

by byla pri vlastnictvi hodnot doOwnsValues zbytecna, ba co vic, chybna (protoze metodou Remove by se objekt uvolnil s naslednym manualnim pokusem o uvolneni). K uvolneni objektu TObjectDictionary<T> pri vlastnictvi hodnot doOwnsValues staci:

Kód: Delphi [Vybrat]
  1. medFnDict.Remove(StepCtx);
Mám pochybnosti..
Urobil som pokus. Objektu som pridal Destroy.
Ak ho nezruším "manuálne" pomocou free, program tade neprejde.
Zdá sa mi to podozrivé. Preto som to free pridal a nič podozrivé sa nedeje (program tam podľa mňa správne prechádza cez Destroy, ale inak nie je hlásená žiadna chyba).
Aj keď funkciu testujem na tabuľke o milión riadkoch.

Offline vandrovnik

  • Guru
  • *****
  • Příspěvků: 1014
  • Karma: 47
    • Verze Delphi: 10.3
Urobil som pokus. Objektu som pridal Destroy.
Ak ho nezruším "manuálne" pomocou free, program tade neprejde.

Jen pro jistotu, je u toho Destroy uvedeno "override"?

Offline miroB

  • Guru
  • *****
  • Příspěvků: 584
  • Karma: 17
    • Verze Delphi: D1,2,3,4,7,2005,2009, XE8,S,B,T10.2.2 Pro
Urobil som pokus. Objektu som pridal Destroy.
Ak ho nezruším "manuálne" pomocou free, program tade neprejde.
Jen pro jistotu, je u toho Destroy uvedeno "override"?
Override - Áno mal som ho tam od začiatku:)  Inak by mi tade program nešiel ani pri "manuálnom" Free
« Poslední změna: 23-01-2019, 15:03:53 od miroB »

Offline miroB

  • Guru
  • *****
  • Příspěvků: 584
  • Karma: 17
    • Verze Delphi: D1,2,3,4,7,2005,2009, XE8,S,B,T10.2.2 Pro
Ak ho nezruším "manuálne" pomocou free, program tade neprejde.
A vlastni ty kolekce hodnoty? Vytvaris je s priznakem doOwnsValues.
Aha. Nie, myslel som, že TObjectDictionary to má automaticky ako Default.
Ďakujem. Už to funguje bez free.