Форум: "Основная";
Текущий архив: 2002.12.16;
Скачать: [xml.tar.bz2];
ВнизПроблема с заполнением данными экземпляра класса. Найти похожие ветки
← →
Дельфятник (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;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.008 c