Форум: "Базы";
Текущий архив: 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