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

Вниз

Проблема с заполнением данными экземпляра класса.   Найти похожие ветки 

 
Дельфятник   (2002-12-04 17:45) [0]

Здраствуйте!
У меня в программе есть класс
TVT=Class
Points: TStringList;
Segments: TObjectList;
constructor Create(Code: String);
end;

В конструкторе Create происходит заполнение списков Points и Segments. Точнее, не происходит, хотя должно происходить.
Этот конструктор вызывается в цикле по таблице:

if Table7.FindKey([SomeText]) then
repeat
ListBox1.Items.AddObject(Table7VT_CODE.AsString,TVT.Create(Table7VT_CODE.AsString));
DM.Table7.Next
until (SomeText<>Table7SomeValue.AsString) or DM.Table7.Eof;

После чего во всех строчках ListBox1"a TVT(ListBox1.Items.Objects[i]).Points равняется nil, и Segments также равняется nil. (В конструкторе Create им сначала присваивается nil, а затем если по поданному в контруктор Create коду в БД найдены данные, то эти списки (Points и Segments) заполняются. Точнее, должны заполняться.)
Суть в том, что когда я пытался в отладчике найти в чём дело, всё шло нормально - данные находились, и списки заполнялись. Причём даже хватало просто поставить точку останова на строке
TListBox1.Items.AddObject(Table7VT_CODE.AsString,TVT.Create(Table7VT_CODE.AsString));
чтобы происходило заполнение списков. Также я попробовал следующий вариант:

vt:=TVT.Create(Table7VT_CODE.AsString);
Application.ProcessMessages;
ListBox1.Items.AddObject(Table7VT_CODE.AsString,vt);

Тоже не помогло. Что надо сделать чтобы заполнились списки?


 
Skier ©   (2002-12-04 17:49) [1]

>Дельфятник

var
AVT : TVT;


if Table7.FindKey([SomeText]) then
repeat
AVT := TVT.Create(Table7VT_CODE.AsString);
ListBox1.Items.AddObject(Table7VT_CODE.AsString,AVT);
DM.Table7.Next
until (SomeText<>Table7SomeValue.AsString) or DM.Table7.Eof;


И ещё хорошо бы привести код конструктора TVT.


 
Дельфятник   (2002-12-04 18:17) [2]

>if Table7.FindKey([SomeText]) then
>repeat
> AVT := TVT.Create(Table7VT_CODE.AsString);
> ListBox1.Items.AddObject(Table7VT_CODE.AsString,AVT);
> DM.Table7.Next
>until (SomeText<>Table7SomeValue.AsString) or DM.Table7.Eof;

Естественно, я это уже пробовал, просто забыл об этом упомянуть. Код конструктора TVT, по-моему в данном случае совершенно неинформативен, но на всякий случай приведу кусочек.

constructor TVT.Create(Code: String);
var j: Integer;
s: String;
begin
Points:=nil;
Segments:=nil;
if not Query1.Active then Query1.Active:=True;
if (Code<>"") and (Code<>" ") and Query1.Locate("RUS6",Code,[]) then
begin
s:="";
repeat
// тут происходит заполнение переменной s данными из запроса
Query1.Next;
until (Query1RUS6.AsString<>Code) or Query1.Eof;
Points:=TStringList.Create;
// тут происходит перевод строки s в вид TStringList
if Points.Count=0 then
begin
Points.Free;
Points:=nil
end;
if Points<>nil then
begin
Segments:=TObjectList.Create;
for j:=0 to Points.Count-1 do
begin
if Query1.Locate("RUS6;RUS6_1",VarArrayOf([Code,Points[j]]),[])
or Query1.Locate("RUS6;RUS6_2",VarArrayOf([Code,Points[j]]),[])
then // создание и добавление очередного элемента другого класса в список Segments
end
end;
if Segments.Count=0 then
begin
Segments.Free;
Segments:=nil
end
end
end;


 
Skier ©   (2002-12-04 18:29) [3]

>Дельфятник

TVT=Class
public
Points: TStringList;
Segments: TObjectList;
constructor Create(Code: String);
end;

Поставь breakpoint-ы на
- строчки создания Points и Segments
- строчки освобождения Points и Segments (.Free и :=nil )

Я думаю что станет ясно где косяк.


 
Дельфятник   (2002-12-05 11:42) [4]

public не помог. Строчки освобождения Points и Segments я закомментировал, и тоже не помогло. Заметил следующее. Эти списки не заполняются только при первом вызове конструктора в течение сеанса работы программы - при втором и последующих, заполнение происходит (и происходило во всех предыдущих вариантах) нормально. Я имею в виду вызов в куске
if Table7.FindKey([SomeText]) then
repeat
AVT := TVT.Create(Table7VT_CODE.AsString);
ListBox1.Items.AddObject(Table7VT_CODE.AsString,AVT);
DM.Table7.Next
until (SomeText<>Table7SomeValue.AsString) or DM.Table7.Eof;
Тогда я поставил точку останова в конструкторе Create на строчке
if (Code<>"") and (Code<>" ") and Query1.Locate("RUS6",Code,[]) then
и выяснил, что в первой серии вызовов этого конструктора Query1.RecordCount=0, а при второй уже 22 тысячи с чем-то. Поскольку это параметрический запрос, то, видимо, всё дело в присвоении параметров - я в отладчике видел, что параметры при первом вызове неправильные. Так что проблема почти решена. Спасибо.



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

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

Наверх




Память: 0.48 MB
Время: 0.014 c
3-51645
Лесник
2002-11-26 23:41
2002.12.16
MS Access 2000 и ADO


4-52034
dinn
2002-11-05 01:35
2002.12.16
А можно ли? А если можно-то как?


1-51747
antonio2002
2002-12-04 13:36
2002.12.16
RichEdit


1-51663
Bizon
2002-12-05 15:46
2002.12.16
Навеяло вопросом про вирус.


1-51819
kingdom
2002-12-04 17:38
2002.12.16
Как вызвать диалог добавления пользователей в группу?