Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > TStrings и Objects


Автор: ErManDir 10.6.2005, 15:20
Есть код
Код

  png:=TPNGObject.Create;
  img:=TBitmap.Create;
  try
    png.LoadFromFile('img\status.png');
    img.Assign(png);
    for I := 0 to 6 do
    begin
      img.Assign(png);
      crop(img,i); //Здесь я отрезаю часть картинки
      StatusList.AddObject( IntToStr(I) ,img); //Сую его в StringList;
    end;
  finally
    png.Free;
    img.Free; //Если тут заменить, Free на FreeImage, то потом эксепшена нет, но во всех записях одня и та же картинка. 
  end;


После этого при вызове:
Код

img:=TBitmap(StatusList.Objects[I]); //Эксепшн.

Как я понимаю, когда я засовываю объект в StringList через переменную. Она продолжает держать ссылку на объект, так что если потом, я скажу переменной Free, то и объект в Листе тоже изчезнет.
Так вот, просвятите меня, проведите ликбез, как это сделать по науке?.

Автор: _hunter 10.6.2005, 16:06
тут:
img.Free;
ты хрохаеш тот объект, что добавляеш в StatusList

Автор: ErManDir 10.6.2005, 16:14
Цитата(_hunter @ 10.6.2005, 16:06)
хрохаеш тот объект, что добавляеш в StatusList

Это я понял. Вопрос в том как же поступить?
Как мне отцепить переменную от засунутого объекта?
А можно сделать так?
Код

  TBitmap(StringList.Objects[I]):=TBitmap.Create;
  TBitmap(StringList.Objects[I]).Assign(img);

Как думаете?

Автор: _hunter 10.6.2005, 16:20
читаем справку:
Цитата
The TStrings object does not own the objects in the Objects array. Objects added to the Objects array still exist even if the TStrings object is destroyed. They must be explicitly destroyed by the application.

вывод -- нужно добавлять копию объекта

Автор: p0s0l 10.6.2005, 16:27
Должно быть так:
Код

  png:=TPNGObject.Create;    
  try    
    png.LoadFromFile('img\status.png');    
    for I := 0 to 6 do    
    begin    
      img:=TBitmap.Create;    
      img.Assign(png);    
      crop(img,i); //Здесь я отрезаю часть картинки    
      StatusList.AddObject( IntToStr(I) ,img); //Сую его в StringList;    
    end;    
  finally    
    png.Free;    
  end;
(таким кодом создастся 7 разных объектов и засунутся в StatusList... Если нужно, чтобы 7 раз добавился один и тот же объект (одна и та же картинка), то делай как у тебя было, только не делай img.Free)

Автор: ErManDir 14.6.2005, 09:49
Огромное спасибо. А я что-то совсем не догадался про "Создаю новый объект на старыую ссылку, кладу, опять новый объект на старую ссылку". Еще раз Сенкс. smile smile

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)