Форум: "Основная";
Текущий архив: 2003.07.10;
Скачать: [xml.tar.bz2];
ВнизПроблема с считыванием из файла и заполнением ListBox Найти похожие ветки
← →
Edvard (2003-06-27 14:56) [0]Есть два ListBox, из одного записываю содержимое в файлы (строки имеют вид TIcon + String), в другой пытаюсь загрузить содержимое из файлов. При загрузке вылетает ошибка: "... Project.exe raised exeption class EAccessViolation with message " Access Violation at adress 00000000...... " . Причем, в процессе заполнения ListBox2, видно что строки грузятся правильно, а вот иконки рядом с ними везде появляются одинаковые и меняются одновременно во всех строках.
В чем может быть проблема, что неправильно?
Это соответствующие процедуры:
//сохранение
procedure TForm1.Button1Click(Sender: TObject);
var i: integer;
ico: TIcon;
im: TImagelist;
begin
im := Timagelist.Create(self);
im.Width := 16;
im.Height :=16;
for i := 0 to ListBox1.Items.Count-1 do
begin
ico:=ListBox1.Items.Objects[i] as TIcon;
im.AddIcon(ico);
end;
WriteComponentResFile("icolist.bin",im);
im.Free;
ListBox1.Items.SaveToFile("stringlist.txt");
end;
//чтение и заполнение
procedure TForm1.Button2Click(Sender: TObject);
var
i: Integer;
im: Timagelist;
st,st1: TStringList;
ico : TIcon;
begin
ico := Ticon.Create;
St := TstringList.Create;
St1 := TstringList.Create;
im := Timagelist.Create(nil);
im := ReadComponentResFile("icolist.bin", im) as TImagelist;
st.LoadFromFile("stringlist.txt");
for i := 0 to st.Count-1 do begin
im.GetIcon(i,ico);
ListBox2.Items.AddObject(st[i], ico);
end;
st.Free;
St1.Free;
ico.Free;
end;
← →
Юрий Федоров (2003-06-27 15:15) [1]В какой строке Access Violation ?
← →
Song (2003-06-27 15:21) [2]А кто Ico за тебя будет создавать?
← →
Edvard (2003-06-27 15:48) [3]>Song © (27.06.03 15:21)
блин, точно, я не там это делал! С меня пиво!:)
← →
Edvard (2003-06-27 16:03) [4]Все равно, еще где-то лажа, та же ошибка, но теперь видно что заполняется правильно, а вылетает в самом конце, когда уже все заполнено...
← →
Юрий Федоров (2003-06-27 16:19) [5]>> im := Timagelist.Create(nil);
>> im := ReadComponentResFile("icolist.bin", im) as TImagelist;
Это лажа. Зачем создавать, если сразу теряешь ссылку на созданный объект ? Но валится не из-за этого
← →
Edvard (2003-06-27 16:42) [6]>Юрий Федоров © (27.06.03 16:19)
а откуда тогда я изображения грузить буду?... ну бог с ним
нашел где вываливается: убираю ico.Free; и все работает, странно, но факт.
← →
Юрий Федоров (2003-06-27 16:53) [7]>>а откуда тогда я изображения грузить буду?... ну бог с ним
ReadComponentResFile создает объект, создавать его не надо
правильно будет так :
//ico := Ticon.Create;
...
for i := 0 to st.Count-1 do begin
ico := Ticon.Create;
im.GetIcon(i,ico);
ListBox2.Items.AddObject(st[i], ico);
...
// ico.Free;
И не забудь, когда будешь очищать ListBox2.Items, сначала освободить все иконки, которые в его Objects"ах
← →
Юрий Федоров (2003-06-27 16:53) [8]>>ReadComponentResFile создает объект, создавать его не надо
В смысле перед этим самому создавать не надо
← →
Edvard (2003-06-27 17:04) [9]в ReadComponentResFile("icolist.bin", im) кроме всего прочего указывается имя файла из которого идет чтение (куда ранее были сохранены иконки - WriteComponentResFile("icolist.bin",im)), не знаю как в теории, но только что последовал твоему совету, результат заполнения: только строки и никаких иконок.
← →
Юрий Федоров (2003-06-27 17:35) [10]>>Edvard © (27.06.03 17:04)
насчет создания я несколько погорячился. ТО есть можно передать nil вторым параметром, либо оставить так как написано. А насчет создания \ освобождения иконок я прав
← →
Edvard (2003-06-27 18:48) [11]ОК, спасибо!
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2003.07.10;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.052 c