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

Вниз

Господа, как можно "привязать" к 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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.63 MB
Время: 0.044 c
1-1123585722
rolex
2005-08-09 15:08
2005.08.28
Компонент для ввода IP адреса.


14-1123483701
SPeller
2005-08-08 10:48
2005.08.28
Что такое Up-Link на хабах?


3-1121775517
BlackWhite
2005-07-19 16:18
2005.08.28
Разнотипные поля в таблице = ОШИБКА


14-1122887152
Desdechado
2005-08-01 13:05
2005.08.28
Фото-загадка


1-1122138110
Алексей Петухов
2005-07-23 21:01
2005.08.28
HTML Редактор от Microsoft





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