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

Вниз

Проблема с заполнением treeView.Items[i].Data   Найти похожие ветки 

 
Zabludshiy   (2008-02-13 18:13) [0]

Доброго времени суток!
Вот собственно код:
var arr: array of integer; tn:tTreeNode;
while not MTE.Eof do
begin
 setlength(arr,length(arr)+1);
 arr[length(arr)-1]:=MTE.FieldByName("ID").AsInteger;

 if MTE.FieldByName("P_ID").AsInteger = 0 then
 begin
   tn:=TV1.Items.AddObject(nil,MTE.FieldByName("TEXT").AsString,@(arr[(length(arr)-1)]));
 end
 else
   for i:=0 to TV1.Items.Count-1 do
     if integer(TV1.Items[i].Data^) = MTE.FieldByName("P_ID").AsInteger then
       tn:=TV1.Items.AddChildObject(TV1.Items[i],MTE.FieldByName("TEXT").AsString,@(arr [(length(arr)-1)]));
 MTE.Next;
end;

Проблема возникает со свойством Items[i].Data, там должна быть ссылка на элемент массива, а получается сцылка на полный бред :-( Буду благодарен если обьясните что не так делаю, и как правильно.


 
Джо ©   (2008-02-13 18:15) [1]

Код смотреть лень.
Дин. массив объявлен в процедуре? После выхода из нее он финализируется.


 
Zabludshiy   (2008-02-13 18:20) [2]

Дин. массив объявлен в процедуре, и нужен только в этом куске для заполнения.


 
Palladin ©   (2008-02-13 18:26) [3]


> [2] Zabludshiy   (13.02.08 18:20)

а собственно arr перед началом цикла инициализируешь в Nil ?


 
Zabludshiy   (2008-02-13 18:35) [4]

угу. Там впереди:
TV1.Items.Clear;
setlength(arr,0);
MTE.SortByFields("P_ID,ID");
MTE.First;
while ...

ну и дальше по тексту.
> Zabludshiy   (13.02.08 18:13) 

MTE - memTableEh из Ehlib.


 
Palladin ©   (2008-02-13 18:45) [5]

ты меня прямо заинтриговал... вроде бы все тобой написанное верно, но верно оно только при одном предположении - итемы в тривьеф лежат в порядке их добавления...

это раз... два, как ты определил что по сцылке бред?


 
ketmar ©   (2008-02-13 18:47) [6]

>[2] Zabludshiy (2008-02-13 18:20:00)
@(arr [(length(arr)-1)])
и
setlength(arr,length(arr)+1);

и на каждой итерации? и куда, по-твоему, будет указывать @(arr [(length(arr)-1)]) после очередного setlength или финализации массива? ага. туда, где космический разум обитает.

сдаётся мне, что «@(arr [(length(arr)-1)])» — это такое приведение интегера к поинтеру, да?

---
Understanding is not required. Only obedience.


 
Palladin ©   (2008-02-13 18:53) [7]


> [6] ketmar ©   (13.02.08 18:47)

та не кипишись... это кусок монолитной процедуры... финализации массива в цикле нету... все верно написано... адрес последнего элемента возьмется... length+1 будет 1, после него length будет 1, а length-1 будет 0, соответственно @ даст адрес элемента с индексом ноль, то бишь первого ну и тд... и обращается он верно к нему... мну сдается что items хранится не в порядке добавления... ну или он не верно определяет понятие бреда...


 
Zabludshiy   (2008-02-13 18:56) [8]

MTE.SortByFields("P_ID,ID");
сначала в root добовляются (и они какраз добовляются, их видно) а про бред узнал вот так, вставил кусок:

...
   for i:=0 to TV1.Items.Count-1 do
   begin
//      l:=integer(TV1.Items[i].Data^);
//  showmessage("I = "+inttostr(i)
//              +" "+inttostr(l));
...

и наблюдал непонятные цифры 1,2,3.
Там в базе всего 8 записей вручную введены, типа для отладки


 
Palladin ©   (2008-02-13 18:58) [9]


> Там в базе всего 8 записей вручную введены, типа для отладки

и в них нет 1,2,3 ?


 
Zabludshiy   (2008-02-13 18:59) [10]

т.е. понимаю так, что хомут гдето сдесь:

for i:=0 to TV1.Items.Count-1 do
    if integer(TV1.Items[i].Data^) = MTE.FieldByName("P_ID").AsInteger then
      tn:=TV1.Items.AddChildObject(TV1.Items[i],MTE.FieldByName("TEXT").AsString,@(arr  [(length(arr)-1)]));

но что не так - хз.


 
Zabludshiy   (2008-02-13 19:00) [11]

описался,
> и наблюдал непонятные цифры вместо 1,2,3.Там в базе всего 8 записей
> вручную введены, типа для отладки


 
Palladin ©   (2008-02-13 19:02) [12]

так... после эксперимента, я понял... цикл твой неверен, бо итемы идут не в порядке добавления, а в порядке следования по дереву...


 
ketmar ©   (2008-02-13 19:07) [13]

>[7] Palladin © (2008-02-13 18:53:00)
var lst: array [0..255] of Pointer;
arr := nil;
for f := 0 to 255 do
begin
 setlength(arr, Random(1024*1024)+666);
 arr[length(arr)-1] := f;
 lst[f] := @(arr[(length(arr)-1)]);
end;

for f := 0 to 255 do WriteLn(Integer(lst[f]^));


так понятней?

---
Understanding is not required. Only obedience.


 
Palladin ©   (2008-02-13 19:11) [14]


> [13] ketmar ©   (13.02.08 19:07)

неа,

var lst: array [0..255] of Pointer;
arr := nil;
for f := 0 to 255 do
begin
setlength(arr, Random(1024*1024)+666); // прокол, у аффтара setlength(arr, length(arr)+1);
arr[length(arr)-1] := f;
lst[f] := @(arr[(length(arr)-1)]);
end;


 
ketmar ©   (2008-02-13 19:15) [15]

>[14] Palladin © (2008-02-13 19:11:00)
>прокол, у аффтара setlength(arr, length(arr)+1);
да пофигу. ну, сделай цикл в цикле — SetLength() это не отменяет. а где и кто гарантирвал, что после SetLength() адрес массива не изменится? в итоге lst после окончания всех циклов указывает в космос.

---
Understanding is not required. Only obedience.


 
ketmar ©   (2008-02-13 19:15) [16]

>[14] Palladin © (2008-02-13 19:11:00)
рандом я поставил, чтобы массив уж точно куда-то переехал. %-)

---
Understanding is not required. Only obedience.


 
Palladin ©   (2008-02-13 19:17) [17]


> а где и кто гарантирвал, что после SetLength() адрес массива
> не изменится?

мля!... точно... посыпаю голову пеплом... realloc же...
эх балтика балтика...
аффтару - храни в data индексы, а не адреса...


 
ketmar ©   (2008-02-13 19:19) [18]

>[17] Palladin © (2008-02-13 19:17:00)
да я вообще почти уверен, что это заместо Pointer(arr[n]) было сделано. иначе зачем хранить указатель на integer? %-)

>эх балтика балтика…
заметно по ветке про вайн. %-)

---
Understanding is not required. Only obedience.


 
Zabludshiy   (2008-02-13 19:20) [19]

Прокол свой осознал.

Всем спасибо и удачи!


 
ketmar ©   (2008-02-13 19:22) [20]

>[19] Zabludshiy (2008-02-13 19:20:00)
ну вот. ты чего? а как же рассказать нам, что мы гады? весь флэйм на корню загубил…

---
Understanding is not required. Only obedience.


 
Palladin ©   (2008-02-13 19:30) [21]


> заметно по ветке про вайн. %-)

ничего не заметно! :) подумаешь, пытаюсь придумать как win9x от вайна отличить... я это и трезвым могу придумывать! :)
топливо кончилось, стало скучно, пойду еще возьму...



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

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

Наверх




Память: 0.52 MB
Время: 0.011 c
2-1225203387
Andy BitOff
2008-10-28 17:16
2008.12.07
ForceDirectories и Exception


2-1225430459
ganda
2008-10-31 08:20
2008.12.07
Какое событие отлавливает то что программа была свернута?


2-1225088549
AlekseyB
2008-10-27 09:22
2008.12.07
Текстовый файл


1-1203111617
Blind Guardian
2008-02-16 00:40
2008.12.07
Сравнение последовательностей вещественных чисел на сходство


2-1225193094
b@v
2008-10-28 14:24
2008.12.07
Удаление файлов