Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2008.12.07;
Скачать: [xml.tar.bz2];

Вниз

Проблема с заполнением 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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.5 MB
Время: 0.005 c
15-1222843840
vajo
2008-10-01 10:50
2008.12.07
Где находится почта в Vista Home?


15-1223278720
tubik
2008-10-06 11:38
2008.12.07
поделитесь книгой, пожалуйста


6-1196064124
botaniQ
2007-11-26 11:02
2008.12.07
Select в WebBrowser


1-1202989267
lead-in
2008-02-14 14:41
2008.12.07
TSFDS


2-1225057267
NavigatorNeba
2008-10-27 00:41
2008.12.07
Место на компонентах под Label, не реагирует на onClick.





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский