Autor Téma: V cykle mám Items.Assign - pri uvoľňovaní AV  (Přečteno 243 krát)

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 5279
  • Karma: 41
    • Verze Delphi: W10 + Delphi 10.4 professional
V cykle mám Items.Assign - pri uvoľňovaní AV
« kdy: 25-01-2020, 17:55:05 »
Kód: Delphi [Vybrat]
  1.   for I := 0 to lstPatternFlatRoom[Kind].Count - 1 do
  2.     lstPatternFlatRoom[Kind][I].cbbTitle.Items.Assign(lstTitle);
Podľa návodu sa skopíruje aj objekt. Ja to chápem tak, že sa vytvorí nová inštancia. Podľa všetkého to je ináč. Pri čistení prvého cbbTitle.Items to zbehne a pri ďalších to už hádže AV.
Vysvetlí mi to niekto?
W10 64b, Delphi 10.4, FireBird 3.05
Expert na kladenie nejasne formulovaných otázok.

Online pf1957

  • Padawan
  • ******
  • Příspěvků: 2914
  • Karma: 135
    • Verze Delphi: D2007, XE3, DX10
Re:V cykle mám Items.Assign - pri uvoľňovaní AV
« Odpověď #1 kdy: 25-01-2020, 19:15:01 »
Kód: Delphi [Vybrat]
  1.   for I := 0 to lstPatternFlatRoom[Kind].Count - 1 do
  2.     lstPatternFlatRoom[Kind][I].cbbTitle.Items.Assign(lstTitle);
Podľa návodu sa skopíruje aj objekt. Ja to chápem tak, že sa vytvorí nová inštancia. Podľa všetkého to je ináč. Pri čistení prvého cbbTitle.Items to zbehne a pri ďalších to už hádže AV.
Vysvetlí mi to niekto?
Vzdyt to je porad to same: to cisteni ti zrejme uvolni instance objektu a zbydou ti na ne odkazy do nikam tj. na neexistujici objekty.

Jestli mas zdrojovky, tak prece nemuze byt zadny problem, abys zjistil, co presne dela Assign (velmi pravdepodobne jen zkopiruje ukazatel na instanci objektu) a co se deje pri tom tvem cisteni. Jak jsi uz nekdy psal, se standardnim ComboBoxem jsi problemy nemel.

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 5279
  • Karma: 41
    • Verze Delphi: W10 + Delphi 10.4 professional
Re:V cykle mám Items.Assign - pri uvoľňovaní AV
« Odpověď #2 kdy: 25-01-2020, 20:01:12 »
To je trochu iné. Je to štandardný ComboBox, ale ako vidieť v ukážke, tak zoznam priraďujem do viacerých ComboBoxov. V tom je ten problém. Asi sa musím pozrieť do zdrojáka :(  V helpe sa píše, že sa skopíruje objekt. Všetko nasvedčuje tomu, že sa skopíruje len ukazovateľ.
Chcel som skrátiť čas vytvárania formulára. Tak zbežne som zistil, že je jedno či použijem uvedenú konštrukciu, alebo si každý ComboBox naplním samostatne. Tým to je vyriešené.
W10 64b, Delphi 10.4, FireBird 3.05
Expert na kladenie nejasne formulovaných otázok.

Online pf1957

  • Padawan
  • ******
  • Příspěvků: 2914
  • Karma: 135
    • Verze Delphi: D2007, XE3, DX10
Re:V cykle mám Items.Assign - pri uvoľňovaní AV
« Odpověď #3 kdy: 26-01-2020, 08:26:54 »
Excellent
Rated 1 time
To je trochu iné. Je to štandardný ComboBox, ale ako vidieť v ukážke, tak zoznam priraďujem do viacerých ComboBoxov. V tom je ten problém.
Hm, ten problem je IMHO v tom, ze jsi ztratil kontrolu nad spravou zivotnich cyklu objektu...

Standardni ComboBox per se urcite nic neuvolnuje a pokud ti pri opakovane operaci dochazi k AV a pomuze ti jeho individualni naplneni, tak to indikuje jedine: nekde to musis uvolnovat ty (proc, kdyz pouzivas sdileny seznam?).

A pak mi vysvetli, jak to, ze v predchozim pripade s Adv ComboBoxem jsi psal, ze se problem odstranil substituci za standardni ComboBox. To by indikovalo, ze tam jsi nic neuvolnoval a delal to AdvComboBox (nevim, neznam). Jak je potom mozne, ze pokazde resis stejnou/podobnou ulohu jinak?

A nebo v tom mas jeste vetsi bordel, nez si vubec dovedu predstavit

Citace
V helpe sa píše, že sa skopíruje objekt. Všetko nasvedčuje tomu, že sa skopíruje len ukazovateľ.
Temer nikdy se nekopiruje objekt, ale jen ukazatel na jeho instanci. Jsou pro to dobre 2 duvody:
1. Bez introspekce se neda napsat algoritmus pro vytvoreni hluboke kopie objektu, takze bys musel vynutit nejakou abstraktni metodou, aby programator u kazde tridy rucne tu hlubokou kopii naprogramoval (i kdyz ji treba nebude potrebovat).
2. Je to draha operace, takze se pouziva vyjimecne. Nekdy dokonce, aby se nemusela rucne psat nejaka klonovaci metoda z predchoziho bodu, tak se vyuziva existujiciho mechanismu persistence, kdy se objekt serializuje/deserializuje a objekt se zapise do streamu a kopie se z nej zpatky precte.


Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 5279
  • Karma: 41
    • Verze Delphi: W10 + Delphi 10.4 professional
Re:V cykle mám Items.Assign - pri uvoľňovaní AV
« Odpověď #4 kdy: 26-01-2020, 09:04:40 »
Citace
A pak mi vysvetli, jak to, ze v predchozim pripade s Adv ComboBoxem jsi psal, ze se problem odstranil substituci za standardni ComboBox. To by indikovalo, ze tam jsi nic neuvolnoval a delal to AdvComboBox (nevim, neznam). Jak je potom mozne, ze pokazde resis stejnou/podobnou ulohu jinak?
Ja som urobil iba výmenu komponentov a nič viac. Nedokázal som vytvoriť projekt s tou chybou aby to mohli preskúmať. Vysvetlenie nemám.
Citace
Standardni ComboBox per se urcite nic neuvolnuje a pokud ti pri opakovane operaci dochazi k AV a pomuze ti jeho individualni naplneni, tak to indikuje jedine: nekde to musis uvolnovat ty (proc, kdyz pouzivas sdileny seznam?).
Jedná sa o 5 x 10 ComboBox-ov s rovnakým obsahom. Názvy miestností podľa druhu (5). To uvoľňovanie objektov sa vykonáva automaticky pri FormDestroy. Mám triedu, ktorá prehádza celý formulár. Okrem iného zaisťuje aj zlikvidovanie objektov v ComboBox-och.
.
Ja som vychádzal z predpokladu, že sa TStringList skutočne kopíruje. A to som si tu chcel overiť. Body 1 a 2 som predpokladal asi tak ako to píšeš.
W10 64b, Delphi 10.4, FireBird 3.05
Expert na kladenie nejasne formulovaných otázok.