![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Проблема с заполнением treeView.Items[i].Data [D6, WinXP]
Zabludshiy © (2008-02-13 18:13:00)Доброго времени суток!
Вот собственно код:
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, там должна быть ссылка на элемент массива, а получается сцылка на полный бред :-( Буду благодарен если обьясните что не так делаю, и как правильно.
Palladin (2008-02-13 19:30:00) [1]
> заметно по ветке про вайн. %-)
ничего не заметно! :) подумаешь, пытаюсь придумать как win9x от вайна отличить... я это и трезвым могу придумывать! :)
топливо кончилось, стало скучно, пойду еще возьму...
ketmar (2008-02-13 19:22:00) [2]>[19] Zabludshiy (2008-02-13 19:20:00)
ну вот. ты чего? а как же рассказать нам, что мы гады? весь флэйм на корню загубил…
---
Understanding is not required. Only obedience.
Zabludshiy (2008-02-13 19:20:00) [3]Прокол свой осознал.
Всем спасибо и удачи!
ketmar (2008-02-13 19:19:00) [4]>[17] Palladin © (2008-02-13 19:17:00)
да я вообще почти уверен, что это заместо Pointer(arr[n]) было сделано. иначе зачем хранить указатель на integer? %-)
>эх балтика балтика…
заметно по ветке про вайн. %-)
---
Understanding is not required. Only obedience.
Palladin (2008-02-13 19:17:00) [5]
> а где и кто гарантирвал, что после SetLength() адрес массива
> не изменится?
мля!... точно... посыпаю голову пеплом... realloc же...
эх балтика балтика...
аффтару - храни в data индексы, а не адреса...
ketmar (2008-02-13 19:15:00) [6]>[14] Palladin © (2008-02-13 19:11:00)
рандом я поставил, чтобы массив уж точно куда-то переехал. %-)
---
Understanding is not required. Only obedience.
ketmar (2008-02-13 19:15:00) [7]>[14] Palladin © (2008-02-13 19:11:00)
>прокол, у аффтара setlength(arr, length(arr)+1);
да пофигу. ну, сделай цикл в цикле — SetLength() это не отменяет. а где и кто гарантирвал, что после SetLength() адрес массива не изменится? в итоге lst после окончания всех циклов указывает в космос.
---
Understanding is not required. Only obedience.
Palladin (2008-02-13 19:11:00) [8]
> [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:07:00) [9]>[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:02:00) [10]так... после эксперимента, я понял... цикл твой неверен, бо итемы идут не в порядке добавления, а в порядке следования по дереву...
Zabludshiy (2008-02-13 19:00:00) [11]описался,
> и наблюдал непонятные цифры вместо1,2,3.Там в базе всего 8 записей
> вручную введены, типа для отладки
Zabludshiy (2008-02-13 18:59:00) [12]т.е. понимаю так, что хомут гдето сдесь:
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)]));
но что не так - хз.
Palladin (2008-02-13 18:58:00) [13]
> Там в базе всего 8 записей вручную введены, типа для отладки
и в них нет 1,2,3 ?
Zabludshiy (2008-02-13 18:56:00) [14]
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:53:00) [15]
> [6] ketmar © (13.02.08 18:47)
та не кипишись... это кусок монолитной процедуры... финализации массива в цикле нету... все верно написано... адрес последнего элемента возьмется... length+1 будет 1, после него length будет 1, а length-1 будет 0, соответственно @ даст адрес элемента с индексом ноль, то бишь первого ну и тд... и обращается он верно к нему... мну сдается что items хранится не в порядке добавления... ну или он не верно определяет понятие бреда...
ketmar (2008-02-13 18:47:00) [16]>[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:45:00) [17]ты меня прямо заинтриговал... вроде бы все тобой написанное верно, но верно оно только при одном предположении - итемы в тривьеф лежат в порядке их добавления...
это раз... два, как ты определил что по сцылке бред?
Zabludshiy (2008-02-13 18:35:00) [18]угу. Там впереди:
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:26:00) [19]
> [2] Zabludshiy (13.02.08 18:20)
а собственно arr перед началом цикла инициализируешь в Nil ?
Zabludshiy (2008-02-13 18:20:00) [20]Дин. массив объявлен в процедуре, и нужен только в этом куске для заполнения.