![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
TListBox и TStrings
Bratskiy © (2006-02-07 05:04:00)Доброго дня суток всем.
Суть проблемы в следующем:
На форме есть два TListBox'а. Они нужны для перебрасывания строк из одного в другой (аналог их работы есть в Delphi: Project->Options->Forms)
Строки переходят из одного в другой и обратно нормально.
Мне нужно чтобы в зависимости от нахождения определённой строки во втором ListBox'е в базу записывалось поле с булевым значением. Я делаю так:
with DModule do
.........
ElemTable.Append;
.........
if ListBox2.IndexOfName('Комментарии') = -1 then
ElemTable.FieldValues['comment']:=false
else ElemTable.FieldValues['comment']:=true;
........
ElemTable.Append;
........
Проверяю, получается что в базу при любом варианте записывается false.
Добавляю на эту же форму кнопку для проверки, пишу аналогичный код
if ListBox2.IndexOfName('Комментарии') = -1 then
MessageDlg('Нету')
else MessageDlg('Есть');
Проверяю - всё нормально работает. В чём проблема понять не могу.
Далее создаю объект типа TStrings
MyList: TStrings;
..........
MyList:=MyList:=TStringList.Create;
MyList:=ListBox2.Items;
..........
if MyList.IndexOf('Комментарии') = -1 then
ElemTable.FieldValues['comment']:=false
else ElemTable.FieldValues['comment']:=true;
Так работает нормально, т. е. записывает в базу правильное значение. Но по завершению работы TStrings вроде надо из памяти выгружать.
Пишу:
MyList.Free;
Вроде всё нормально, но когда закрываю форму вылазит ошибка 'Access violation'. Убираю деструктор (Free), ошибки нет
Опытные люди, подскажите, где у меня что не правильно.
YurikGL (2006-02-07 07:22:00) [1]
> переменная MyList создаётся сама, когда присваиваешь ей
> ListBox2.Items и выгружается тоже сама, когда выгружается
> ListBox
Переменная MyList создается, когда ты ее объявил в var. Она представляет собой указатель на объект, который мог быть еще не создан. Если ты присваиваешь переменную переменной т.е. MyList:=ListBox2.Items ты перенаправляешь два разных указателя на один и тот же список. Т.е. у тебя как был один список так он и остался (не считая того, который ты создал MyList:=TStringList.Create; и на который ты потерял после MyList:=ListBox2.Items) но изменять его теперь можно как через MyList, так и через ListBox2.Items.
Bratskiy (2006-02-07 05:38:00) [2]
> MyList:=MyList:=TStringList.Create;
Здесь у меня очепятка
В коде
MyList:=TStringList.Create;
Спаибо, я всё понял. Получается, что конструктор и деструктор использовать не надо, переменная MyList создаётся сама, когда присваиваешь ей ListBox2.Items и выгружается тоже сама, когда выгружается ListBox, то есть когда выгружается форма.
Джо (2006-02-07 05:24:00) [3]> Далее создаю объект типа TStrings
>
> MyList: TStrings;
> ..........
> MyList:=MyList:=TStringList.Create;
> MyList:=ListBox2.Items;
> ...
> MyList.Free;
Комментирую
1.MyList:=MyList:=TStringList.Create;Этим ты создал объект класса TStringList, ссылку на этот новосозданный объект сохранил в переменной MyList.
2.MyList:=ListBox2.Items;Этим кодом ты в переменной MyList сохранил ссылку на объект TStringList, ссылка на который находится в ListBox2.Items. При этом, ссылку на объект, созданный в пункте (1) ты утерял.
3.MyList.Free;Этим ты уничтожил объект, который создавал не ты, а ListBox. При итом, объект, созданный тобой в (1) ты как раз и не удалил.
По поводу всего остального — не знаю, как говориться: ошибка где-то в твоем коде.