Autor Téma: Ničenie objektu v T<> - dostávam výnimku  (Přečteno 233 krát)

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 5014
  • Karma: 41
    • Verze Delphi: W10 + Delphi 10.4 professional
Ničenie objektu v T<> - dostávam výnimku
« kdy: 13-01-2020, 23:08:09 »
Riešil som to pred niekoľkými rokmi a teraz ma to znova dobehlo :'( :'(
Kód: Delphi [Vybrat]
  1. procedure FreeAndNilStringsObjects(AStrings: TStrings);
  2. var
  3.   I: Integer;
  4.   Obj: TObject;
  5. begin
  6.   Assert(Assigned(AStrings), '  FreeAndNilStringsObjects: AStrings is nil  ');
  7. .
  8.   for I := AStrings.Count -1 downto 0 do
  9.   begin
  10.     Obj := AStrings.Objects[I];
  11. //    FreeAndNil(Obj);
  12.     Obj.Free;  //  Ak tu prehodím poradie, tak AV nemám, ale mám Memory leak.
  13.     Obj := nil;
  14.   end;
  15. .
  16.   AStrings.Clear;
  17. end;
Celý problém spôsobuje skutočnosť, že si v TAdvComboBox prehadzujem obsah Items priradením TStringList. Mám vytvorené vlastné TStringList, ktorých obsah nemením. Prvé priradenie je v poriadku. Akonáhle vykonám druhé priradenie TStringList, tak dostávam AV. Nepoužívam žiadne Clear, alebo inú techniku, na vyčistenie Items v ComboBox. Len vymením zoznam.
Sedím nad tým celý deň a neviem s tým hnúť. Ničenie objektov v TStringList robím až pri uzatváraní formulára.
Prosím, zachráňte mi duševné zdravie a prípadne aj život.
W10 64b, Delphi 10.4, FireBird 3.05
Expert na kladenie nejasne formulovaných otázok.

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 5014
  • Karma: 41
    • Verze Delphi: W10 + Delphi 10.4 professional
Re:Ničenie objektu v T<> - dostávam výnimku
« Odpověď #1 kdy: 14-01-2020, 09:29:43 »
Hlavne neviem pochopiť skutočnosť, že zoznamy neničím a napriek tomu sa neviem dostať k ich objektom. A tie takisto neničím. Ale stačí jedna výmena zoznamu v AdvComboBox a už mám problém. Pritom je jedno akú techniku priradenia použijem
Kód: Delphi [Vybrat]
  1.   advcbxFirst.Items.Assign(lstOwnerFirst);
  2. //  alebo
  3.   advcbxFirst.Items := lstOwnerFirst;
Vie mi to niekto vysvetliť?


W10 64b, Delphi 10.4, FireBird 3.05
Expert na kladenie nejasne formulovaných otázok.

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 5014
  • Karma: 41
    • Verze Delphi: W10 + Delphi 10.4 professional
Re:Ničenie objektu v T<> - dostávam výnimku
« Odpověď #2 kdy: 14-01-2020, 09:36:35 »
Už viem. Zo zúfalstva som nahradil AdvComboBox štandardným ComboBox a nie je žiaden problém. Idem im to nahlásiť.
W10 64b, Delphi 10.4, FireBird 3.05
Expert na kladenie nejasne formulovaných otázok.

Online pf1957

  • Padawan
  • ******
  • Příspěvků: 2796
  • Karma: 134
    • Verze Delphi: D2007, XE3, DX10
Re:Ničenie objektu v T<> - dostávam výnimku
« Odpověď #3 kdy: 14-01-2020, 10:30:42 »
Už viem. Zo zúfalstva som nahradil AdvComboBox štandardným ComboBox a nie je žiaden problém. Idem im to nahlásiť.
Jeste se muzes podivat, jestli tam nemaji nejak nastavenou u Items vlastnost OwnsObjects a nemophl bys ji vypnout, ktera byla dodatecne pridana k TStringList, ale  v abstraktni TStrings takova vlastnost stale neexistuje a standardni TCombobox je jen slupkou nad Windows API funkci, ktera pouziva rozhrani TStrings a polozky posila/ziskava do/od Windows pomoci CB_SETITEMDATA/CB_SETITEMDATA. A Windows na zadne Delphi objekty, ktere by se daly uvolnovat, nehraji. Ty pracuji s hopdnotou typu LPARAM.

V kazdem pripade je to nekompatibilita z WinAPI a puvodni VCL.