Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.02.26;
Скачать: CL | DM;

Вниз

TListBox и TStrings   Найти похожие ветки 

 
Bratskiy ©   (2006-02-07 05:04) [0]

Доброго дня суток всем.
Суть проблемы в следующем:

На форме есть два 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), ошибки нет
Опытные люди, подскажите, где у меня что не правильно.


 
Джо ©   (2006-02-07 05:24) [1]

> Далее создаю объект типа 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) ты как раз и не удалил.

По поводу всего остального — не знаю, как говориться: ошибка где-то в твоем коде.


 
Bratskiy ©   (2006-02-07 05:38) [2]


> MyList:=MyList:=TStringList.Create;

Здесь у меня очепятка
В коде
MyList:=TStringList.Create;

Спаибо, я всё понял. Получается, что конструктор и деструктор использовать не надо, переменная MyList создаётся сама, когда присваиваешь ей ListBox2.Items и выгружается тоже сама, когда выгружается ListBox, то есть когда выгружается форма.


 
YurikGL ©   (2006-02-07 07:22) [3]


> переменная MyList создаётся сама, когда присваиваешь ей
> ListBox2.Items и выгружается тоже сама, когда выгружается
> ListBox

Переменная MyList создается, когда ты ее объявил в var. Она представляет собой указатель на объект, который мог быть еще не создан. Если ты присваиваешь переменную переменной т.е. MyList:=ListBox2.Items ты перенаправляешь два разных указателя на один и тот же список. Т.е. у тебя как был один список так он и остался (не считая того, который ты создал MyList:=TStringList.Create; и на который ты потерял после MyList:=ListBox2.Items) но изменять его теперь можно как через MyList, так и через ListBox2.Items.



Страницы: 1 вся ветка

Текущий архив: 2006.02.26;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.053 c
15-1138830328
Volf_555
2006-02-02 00:45
2006.02.26
Nyxem.e: 3 февраля может стать Судным днем для сотен тысяч компью


2-1139486895
Dmitrij_K
2006-02-09 15:08
2006.02.26
MS Word, TypeText и ограничение 64кб


2-1139738996
asd
2006-02-12 13:09
2006.02.26
Удаение программой самой себя и всей папки, в которой находится п


15-1138779063
yaroslav
2006-02-01 10:31
2006.02.26
обращайтесь, новички


2-1139561331
worldmen
2006-02-10 11:48
2006.02.26
Изменение формата даты.