Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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
3-51593
riland
2002-11-26 17:57
2002.12.16
Количество пользователей работающих с БД


1-51685
Dik!S
2002-12-03 14:19
2002.12.16
Delphi


1-51808
kepten
2002-12-05 09:50
2002.12.16
Как неписать много if


6-51876
Pars
2002-10-18 16:05
2002.12.16
Дозвон до провайдера


1-51800
dimich1978
2002-12-05 09:50
2002.12.16
Для тех кто юзает компанеты для создания инт. XP





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский