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

Вниз

Господа, как можно "привязать" к TTreeNode номер записи   Найти похожие ветки 

 
mmms   (2005-07-18 14:59) [40]

Блин, ты сначала разберисть, что ты в tv.Selected.Data раньше положил. В каком виде?
Разобрался.. Ложу Integer, (код [2] mmms   (11.07.05 09:00)), как этот интегер считать?
В режиме отладки посмотрел, tv.Items.Item[0].Data=$64,
procedure TForm1.tvClick(Sender: TObject);
begin
if tv.Items.Item[0].Data<> nil then
 Showmessage(PChar(tv.Items.Item[0].Data)); //=$64
end;


 
mmms   (2005-07-18 14:59) [41]

Ну и тут же ошибка.. Access...


 
evvcom ©   (2005-07-18 15:07) [42]

А что ты хотел увидеть? Ты преобразовываешь $64 к указателю на строку. Естественно? при чтении по адресу $64 ты получаешь AV. Ложить надо туда валидный указатель на строку, чтобы так читать.


 
Ega23 ©   (2005-07-18 15:09) [43]

2 mmms   (18.07.05 14:59) [40]
Разобрался.. Ложу Integer, (код [2] mmms   (11.07.05 09:00)), как этот интегер считать?

Чтобы показать Integer в виде строки, воспользуйся функцией IntToStr.
А вообще у тебя полная каша в голове. Тебе надо сначала разобраться и понять, что такое адрес и значение по адресу.


 
mmms   (2005-07-18 15:17) [44]

Причем тут каша, я столкнулся с единственным препятствием, может мне теперь и застрелится ещё :) Спрашиваю, если это не сложно, то хотелось бы получить ответ, как прочитать этот Data. На счет ф-и IntToStr, но куда ее тут применить? Ega23, всмотритесь внимательно в код. Data возвращает Pointer а не Integer.


 
mmms   (2005-07-18 15:18) [45]

Но там лежит Integer...


 
Ega23 ©   (2005-07-18 15:33) [46]

Вот смотри:
var
p:PInteger;
i:Integer;
begin
New(p); // Чему сейчас равно значение p? Это может быть что угодно, например $364F5CAD
        // Так вот, это - адрес Integer"а
i:=6; //
p^:=i; // Значение ПО АДРЕСУ изменилось, но значение АДРЕСА - нет.


end;


 
Anatoly Podgoretsky ©   (2005-07-18 15:37) [47]

mmms   (18.07.05 15:17) [44]
А что ему еще выдавать, что бы это были универсальные данные? Ты знаешь такой тип?


 
mmms   (2005-07-18 15:54) [48]

[46] Ega23 ©   (18.07.05 15:33)
Да, у меня только значения не меняются, и хочется ТОЛЬКО считать это значение.
Так, что ли? :(
Showmessage(String(PInt(tv.Items.Item[0].Data)));
Ошибка Access...
Интересно тоже:
Showmessage(Pchar(@tv.Items.Item[0].Data));
Выдает букву "D"

Вот только как обратится к памяти, где лежит Data, так и не понял :(


 
evvcom ©   (2005-07-18 16:04) [49]

Объясни, наконец, что ты хочешь? К ноду привязать стринг, а потом его где-то использовать? Ну так и пиши:
tv.Items[0].Data := Pointer(MyString);
читай:
ShowMessage(string(tv.Items[0].Data));

Только надо быть осторожным. Любое присвоение переменной MyString, после того как она была запомнена в Data, может сделать этот указатель (Data) недействительным, и опять получишь AV при попытке чтения данных по указателю Data.


 
msguns ©   (2005-07-18 16:05) [50]

>mmms  

Ты смотрел то, что я посылал тебе ?
А если смотрел, то не мог не орбратить внимание на это :

type
 // Описатели объектов справочника
 PGR_Info = ^GR_Info;   // Группа - узел TreeView
 GR_Info = record
   ID: integer;         // ID группы
   IDP: integer;        // ID родителя группы
   Txt: string;         // Отображаемая метка группы
   Lev: integer;        // Уровень группы в дереве (0 для корневых)
   ChQ: integer;        // Кол-во непосредственных потомков ("деток")
 end;


и это:

function TfrbaseSpr.GetGroupsInTreeView: boolean;
// Процедура извлечения информации о группах справочника в список и дерево
var
 gline: PGR_Info;
 i,j: integer;
begin
 result := false;
 sttAction.Caption := "Загрузка дерева..";
 sttOpStatus.Caption := "";
 pnStatus.Update;
 // Инициализация TreeView
 trvSpr.Items.Clear;
 GR_List.Clear;
 with quTree do
   try
     if Active then Close;
     Open;
     First;
     // Цикл по записям НД, полученного из записей справочника запросом со
     // след.обязательными условиями:
     //  - Выбираются только записи групп (поле XXGROUP>"")
     //  - Записи упорядочены по PID, ID, т.е. "родители" раньше "детей"
     //  - Поля в НД следуют в след.порядке: IDP, ID, NAME
     While not Eof do
       begin
        NEW(gline);
        gline^.ID := Fields[1].AsInteger;
        gline^.IDP := Fields[0].AsInteger;
        gline^.Txt := Fields[2].AsString;
        gline^.Lev := 0;      // Уровень по умолчанию = корню
        gline^.ChQ := 0;      // Кол-во "детишек"
        GR_List.Add(gline);   // Добавить в список групп
        Next;
       end;
   except
     sttOpStatus.Caption := "Ошибка чтения справочника";
   end;
 quTree.Close;
 if GR_List.Count>0 then
    // Загрузка из списка в TreeView
    for i := 0 to GR_List.Count-1 do    // Перебор списка сверху вниз
      begin
       gline := GR_List.Items[i];
       if gline^.IDP=0 then // Узел не входит никуда, добавляем его "в корень" "дерева"
          trvSpr.Items.AddObject(nil,gline^.Txt,gline)
       else // Узел куда-то входит. Ищем "папашку" в TreeView
          for j := 0 to trvSpr.Items.Count-1 do
             if PGR_Info(trvSpr.Items[j].Data)^.ID=gline^.IDP  then  // Нашли !
               begin
                trvSpr.Items.AddChildObject(trvSpr.Items[j],gline^.Txt,gline);  // Добавить как "дитя"
                gline^.Lev := PGR_Info(trvSpr.Items[j].Data)^.Lev+1; // Уровень
                inc(PGR_Info(trvSpr.Items[j].Data)^.ChQ);      // Кол-во "детишек" у "папки"
                break;
               end;
      end;
 for i := 0 to trvSpr.Items.Count-1 do
   begin  // Рисуем рядом с наименованием узла "красивую" иконку
    trvSpr.Items[i].ImageIndex := 1;
    trvSpr.Items[i].SelectedIndex := 1;   // Если false, то при выборке иконка не рисуется ;(
   end;
 if trvSpr.Items.Count>0 then
   begin  // Сортируем дерево по наименованиям узлов и первый делаем активным
    trvSpr.CustomSort(@CustSortTreeNodes,0);
    trvSpr.Selected := trvSpr.Items[0];
   end;
 sttAction.Caption := "Просмотр";
 pnStatus.Update;
end;


Кроме того, у Андрей Жук ©   (11.07.05 16:20) [23]
схема использования для хранения в дереве данных о записях аналогичная.
И заключается в том, что объявляем объект (record), типизированный указатель на него и добавляем в TTreeView указатель на этот объект. При извлечении информации из "дерева" (св-во Data) используем явное преобразование к нужному типу и корректно работаем с любыми данными объекта.


 
Ega23 ©   (2005-07-18 16:07) [51]

Вот только как обратится к памяти, где лежит Data, так и не понял :(

(tv.Items.Item[0].Data^)

А что у тебя там лежит - это ты, брат, сам знать должен. Если String, то
ShowMessage(tv.Items.Item[0].Data^),
если Integer, то
ShowMessage(IntToStr(tv.Items.Item[0].Data^))
и т.д.


 
Anatoly Podgoretsky ©   (2005-07-18 16:10) [52]

evvcom ©   (18.07.05 16:04) [49]
Никакой проблемы с DATA надо и работать, а не с копиями.


 
evvcom ©   (2005-07-18 16:15) [53]


> Никакой проблемы с DATA надо и работать, а не с копиями.

Я-то знаю, я автора предупреждаю.


 
mmms   (2005-07-18 16:35) [54]

[50] msguns ©   (18.07.05 16:05)
msguns, благодарю, так и не получил, горе у меня :(, гроза была в четверг, комп вылетел, не успел почту принять, а аккаунт прописан только там, ладно ноут на гарантии, сдал, сейчас через интерфейс mail.ru зайду, приму.

А что у тебя там лежит - это ты, брат, сам знать должен. Если String, то
Спасибо Ega23, теперь понятно. Только строка ShowMessage(IntToStr(tv.Items.Item[0].Data^)) не компилится, но сейчас разберусь.


 
Ega23 ©   (2005-07-18 16:38) [55]

ShowMessage(IntToStr(PInteger(tv.Items.Item[0].Data)^))


 
evvcom ©   (2005-07-18 16:38) [56]


> не компилится

В таком виде и не скомпилится, потому как Pointer нетипизированный указатель. Могу подсказать как скомпилится, но толку не будет никакого, потому что показывать надо обе стороны: и запись, и чтение. А по отдельности говорить об этом, значит опять AV получить с большой долей вероятности.


 
msguns ©   (2005-07-18 16:42) [57]

>Ega23 ©   (18.07.05 16:38) [55]
>ShowMessage(IntToStr(PInteger(tv.Items.Item[0].Data)^))

И ЧТО он увидит ?


 
evvcom ©   (2005-07-18 16:43) [58]


> И ЧТО он увидит ?

"100"!


 
Ega23 ©   (2005-07-18 16:43) [59]

2 msguns ©   (18.07.05 16:42) [57]
И ЧТО он увидит ?

а ЧТО?????


 
Anatoly Podgoretsky ©   (2005-07-18 17:01) [60]

Нифига, а увидит он 17


 
Ega23 ©   (2005-07-18 17:01) [61]

Что положит, то и увидит...


 
Anatoly Podgoretsky ©   (2005-07-18 17:03) [62]

Ega23 ©   (18.07.05 17:01) [61]
А я сомневаюсь


 
Ega23 ©   (2005-07-18 17:06) [63]

2 Anatoly Podgoretsky ©   (18.07.05 17:03) [62]
А я сомневаюсь

Основание?


 
msguns ©   (2005-07-18 17:21) [64]

>Ega23 ©   (18.07.05 17:06) [63]
>Основание?

Для начала ты объясни мне, дураку, что делать вот с этим ?
PInteger(tv.Items.Item[0].Data)^))

Кому и для чего надо значение адреса фиг знает чего ?


 
Ega23 ©   (2005-07-18 17:26) [65]

2 msguns ©   (18.07.05 17:21) [64]

var
p:PInteger;
begin
p:=PInteger(tv.Items.Item[0].Data);
ShowMessage(IntToStr(P^));
end;

А такая запись тебя не смущает???


 
msguns ©   (2005-07-18 17:36) [66]

>Ega23 ©   (18.07.05 17:26) [65]

Ты мне не ответил на вопрос.
ЧТО лежит В tv.Items.Item[0].Data ?


 
Ega23 ©   (2005-07-18 17:39) [67]

То, что ты туда поклал. Судя по теме, аффтар кладёт туда указатель на Integer.
В чём проблема-то?


 
evvcom ©   (2005-07-19 08:36) [68]


> Судя по теме, аффтар кладёт туда указатель на Integer.
> В чём проблема-то?

Может я чего не углядел, но в [2]
Tree.Items.Item[i].Data = Pointer(Query.FieldByName(idParent).asInteger)
я увидел единственное присваивание, и оно совсем не похоже на "кладет указатель". Вот в том-то и проблема, что автор игнорирует советы, что рассматривать чтение/запись надо в паре, но никак не по отдельности.


 
Ega23 ©   (2005-07-19 10:36) [69]

2 evvcom ©   (19.07.05 08:36) [68]

Ну я же не виноват, что он этот указатель туда по-идиотски кладёт. Я о том, что он ХОЧЕТ туда положить.


 
msguns ©   (2005-07-19 10:43) [70]

>Ega23 ©   (19.07.05 10:36) [69]
>Ну я же не виноват, что он этот указатель туда по-идиотски кладёт. Я о том, что он ХОЧЕТ туда положить.

Вот именно. Чел использует св-во TTreeView.Items[].Data, грубо говоря по-идиотски, не понимая сути. Ты же упорно пытаешься научить его пользоваться именно таким методом, который предусматривает наличие в данных только одного значения какого-либо типа. Так, как ты советуешь, делать можно, конечно.
Но вот нужно ли ?


 
alex_***   (2005-07-19 10:55) [71]

Не проще держать в Data указатель на объект с данными, а список объектов вести в TObjectList?


 
Ega23 ©   (2005-07-19 11:25) [72]

Вот именно. Чел использует св-во TTreeView.Items[].Data, грубо говоря по-идиотски, не понимая сути. Ты же упорно пытаешься научить его пользоваться именно таким методом, который предусматривает наличие в данных только одного значения какого-либо типа. Так, как ты советуешь, делать можно, конечно.
Но вот нужно ли ?


А ему честно сказал, что всё это по-идиотски. И не только я. Дальше - проблемы автора, ты не находишь?


 
mmms   (2005-07-19 11:46) [73]

msguns
Я письма не получил по почте, может архив запароленный, или exe есть? На mail антивирусы это не пропускают, если не сложно перешлите еще раз на этот же адрес, worldsite2000@mail.ru
all
Я эту процедуру взял из FAQ, хотел "прикрутить" под свои нужды. Копирайт тоже есть, во втором посте. Все для меня подходит (формирование меню). Как автор ложит код в итем, я переделывать не стал.

Если можно по другому его туда писать, без переделки самого принципа, то хотелось бы написать. И добавить в FAQ рядом с этим кодом. Т.к. тот код ещё не мало вызовет вопросов у новичков.. Но факт тот, что выбрал имено его, так это простота формирования меню, и минимальный(!) код. Ну а то, что загвоздки с Data.. как ее тогда можно избежать?


 
msguns ©   (2005-07-19 11:56) [74]

>alex_***   (19.07.05 10:55) [71]

Об этом мы ему и толкуем (см. приведенный выше код)

>mmms   (19.07.05 11:46) [73]

Какая версия архиватора ?
Щас пошлю нативные файлы


 
msguns ©   (2005-07-19 12:02) [75]

лови


 
mmms   (2005-07-19 14:27) [76]

Сергей (msguns), я написал вам письмом. Проверте пожалуйста.


 
msguns ©   (2005-07-19 15:05) [77]

отправил


 
msguns ©   (2005-07-19 15:05) [78]

Письмо получил, по указанному адресу отправил


 
mmms   (2005-07-19 15:08) [79]

Вот теперь дошло, спасибо!



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

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

Наверх




Память: 0.64 MB
Время: 0.029 c
14-1123490694
Starcom
2005-08-08 12:44
2005.08.28
У кого есть русский мануал на цифровик Pentax Optio S40?


4-1120744413
chili
2005-07-07 17:53
2005.08.28
Kак узнать об изменении обоев на рабочем столе?


3-1121764781
Андрей Жук
2005-07-19 13:19
2005.08.28
Баг в DCL Firebird 1.5.2


14-1123478604
Ega23
2005-08-08 09:23
2005.08.28
С днем рождения! 8 августа


4-1121231982
Jupiter
2005-07-13 09:19
2005.08.28
Архивация с помощью ARJ