Конференция "Основная" » Проблема с заполнением treeView.Items[i].Data [D6, WinXP]
 
  • Zabludshiy (13.02.08 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, там должна быть ссылка на элемент массива, а получается сцылка на полный бред :-( Буду благодарен если обьясните что не так делаю, и как правильно.
  • Джо © (13.02.08 18:15) [1]
    Код смотреть лень.
    Дин. массив объявлен в процедуре? После выхода из нее он финализируется.
  • Zabludshiy (13.02.08 18:20) [2]
    Дин. массив объявлен в процедуре, и нужен только в этом куске для заполнения.
  • Palladin © (13.02.08 18:26) [3]

    > [2] Zabludshiy   (13.02.08 18:20)

    а собственно arr перед началом цикла инициализируешь в Nil ?
  • Zabludshiy (13.02.08 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 © (13.02.08 18:45) [5]
    ты меня прямо заинтриговал... вроде бы все тобой написанное верно, но верно оно только при одном предположении - итемы в тривьеф лежат в порядке их добавления...

    это раз... два, как ты определил что по сцылке бред?
  • ketmar © (13.02.08 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 © (13.02.08 18:53) [7]

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

    та не кипишись... это кусок монолитной процедуры... финализации массива в цикле нету... все верно написано... адрес последнего элемента возьмется... length+1 будет 1, после него length будет 1, а length-1 будет 0, соответственно @ даст адрес элемента с индексом ноль, то бишь первого ну и тд... и обращается он верно к нему... мну сдается что items хранится не в порядке добавления... ну или он не верно определяет понятие бреда...
  • Zabludshiy (13.02.08 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 © (13.02.08 18:58) [9]

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

    и в них нет 1,2,3 ?
  • Zabludshiy (13.02.08 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 (13.02.08 19:00) [11]
    описался,
    > и наблюдал непонятные цифры вместо 1,2,3.Там в базе всего 8 записей
    > вручную введены, типа для отладки
  • Palladin © (13.02.08 19:02) [12]
    так... после эксперимента, я понял... цикл твой неверен, бо итемы идут не в порядке добавления, а в порядке следования по дереву...
  • ketmar © (13.02.08 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 © (13.02.08 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 © (13.02.08 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 © (13.02.08 19:15) [16]
    >[14] Palladin © (2008-02-13 19:11:00)
    рандом я поставил, чтобы массив уж точно куда-то переехал. %-)

    ---
    Understanding is not required. Only obedience.
  • Palladin © (13.02.08 19:17) [17]

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

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

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

    ---
    Understanding is not required. Only obedience.
  • Zabludshiy (13.02.08 19:20) [19]
    Прокол свой осознал.

    Всем спасибо и удачи!
 
Конференция "Основная" » Проблема с заполнением treeView.Items[i].Data [D6, WinXP]
Есть новые Нет новых   [134482   +35][b:0][p:0.002]