powered by simpleCommunicator - 2.0.37     © 2025 Programmizd 02
Форумы / Delphi [игнор отключен] [закрыт для гостей] / TtreeNodes
25 сообщений из 65, страница 2 из 3
TtreeNodes
    #35058726
Tosh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
wellvkкак я понимаю: создается объект(ttreeNodes) у него есть сво-во Item , где хранятся Node, под это дело выделяется память,не котролом, затем я говорю контролу AdvTreeComboBox, что узлы лежат там-то, и контрол присваивает себе этот кусок памяти(или копирует в свои свойства ) и при закрытии приложения(уничтожения) удалят из памяти инфу, но уничтожением можно управлять.
Прости - у меня нет исходников, чтобы тебе на примере показать, но, в общем, ты не прав.
Дело не в выделении памяти (напрямую этого действия не происходит), а о том, что контрол считает объекты этого свойсва своими (оперируй не областями кучи, а объектами - это немного разные вещи) и, следовательно, внутри может с ними делать все, что угодно. В том числе и освобождение всех объектов списка при, например, изменении количества элементов.
Если тебе так хочется кешировать элементы - возьми список, массив или даже просто рекордсет, который ты получаешь от АДО. Только не надо страдать тем, чем ты занимаешься сейчас - это, в корне не верно. Если есть вопросы "почему?" - прочитай книжку про классы, объекты, компоненты и VCL - никогда лишним не будет
...
Рейтинг: 0 / 0
TtreeNodes
    #35058816
wellvk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Tosh wellvkкак я понимаю: создается объект(ttreeNodes) у него есть сво-во Item , где хранятся Node, под это дело выделяется память,не котролом, затем я говорю контролу AdvTreeComboBox, что узлы лежат там-то, и контрол присваивает себе этот кусок памяти(или копирует в свои свойства ) и при закрытии приложения(уничтожения) удалят из памяти инфу, но уничтожением можно управлять.
Прости - у меня нет исходников, чтобы тебе на примере показать, но, в общем, ты не прав.
Дело не в выделении памяти (напрямую этого действия не происходит), а о том, что контрол считает объекты этого свойсва своими (оперируй не областями кучи, а объектами - это немного разные вещи) и, следовательно, внутри может с ними делать все, что угодно. В том числе и освобождение всех объектов списка при, например, изменении количества элементов.
Если тебе так хочется кешировать элементы - возьми список, массив или даже просто рекордсет, который ты получаешь от АДО. Только не надо страдать тем, чем ты занимаешься сейчас - это, в корне не верно. Если есть вопросы "почему?" - прочитай книжку про классы, объекты, компоненты и VCL - никогда лишним не будет
Согласен.Можете что-нб посоветовать?
...
Рейтинг: 0 / 0
TtreeNodes
    #35058820
Tosh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Внимательно почитать третий абзац :))
Если тебе так хочется кешировать элементы - возьми список, массив или даже просто рекордсет, который ты получаешь от АДО
...
Рейтинг: 0 / 0
TtreeNodes
    #35061368
wellvk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ToshВнимательно почитать третий абзац :))
Если тебе так хочется кешировать элементы - возьми список, массив или даже просто рекордсет, который ты получаешь от АДО
Я имел ввиду специальную лит-ру.А то у меня Архангельский+Net.
...
Рейтинг: 0 / 0
TtreeNodes
    #35061428
Tosh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В общем случае - достаточно хэлпа. А вообще - посмотри что такое рекордсет на MSDN.
В твоем случае - будет достаточно обычного массива или TStringList для кеширования данных и простейшей процедуры как для копирования данных из твоего запроса в кеш, так и построение дерева на основе кеша.
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
TtreeNodes
    #38541240
RESEARCH
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ребята подскажите

вот мы имеем код для перемещения одной ноды в другую

CNode.MoveTo(TNode,naAddChild);

как сделать не пермещение а копирование ноды, есть ли аналог CopyTo ?
...
Рейтинг: 0 / 0
TtreeNodes
    #38541271
Arioch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
RESEARCH,

TNode.Create & Node1.Assign(Node0) ?
...
Рейтинг: 0 / 0
TtreeNodes
    #38541505
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AriochTNode.Create & Node1.Assign(Node0) ?
Ну... MoveTo может перемещать не один нод. Так что код копирования будет чуть сложнее.
...
Рейтинг: 0 / 0
TtreeNodes
    #38542920
RESEARCH
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
правильно ли я понял что копирование по вложенным нодам придется писать вручную ?
...
Рейтинг: 0 / 0
TtreeNodes
    #38542926
Ghost Writer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
гугольнул... в инете распространен пример с процедурой CopySubtree http://www.swissdelphicenter.ch/torry/showcode.php?id=1876
не смотрели ?
...
Рейтинг: 0 / 0
TtreeNodes
    #38543065
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
RESEARCHправильно ли я понял что копирование по вложенным нодам придется писать вручную ?
Страшно чтоль?
...
Рейтинг: 0 / 0
TtreeNodes
    #38544183
RESEARCH
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
страшно... все листья в один уровень скопировать несложно а вот повторить структуру
лучше я поищу аналог CopyTo в конце концов это же делфи
...
Рейтинг: 0 / 0
TtreeNodes
    #38544335
Guest2013
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
RESEARCH,

дерево копируешь по одной ноде, через рекурсию...
...
Рейтинг: 0 / 0
TtreeNodes
    #38545466
RESEARCH
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
спасибо Кэп код не подкинешь. я все время путаюсь в GetNext GetNextChild и тому подобное
...
Рейтинг: 0 / 0
TtreeNodes
    #38545468
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
RESEARCH, вот тут посмотри http://www.delphisources.ru/pages/faq/base/copy_paste_treenode.html

Копировать и вставлять TreeNode
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
var
   SL : TStringList;

 procedure TForm1.CutBtnClick(Sender: TObject);
 var
   i, j, StartLevel : integer;
   TNSel : TTreeNode;
 begin
   TNSel := TreeView1.Selected;
   if TNSel <> nil then begin
     StartLevel := TNSel.Level;
     i := TNSel.AbsoluteIndex;
     j := i; // note for later deletion
     if SL = nil then
       SL := TStringList.Create
     else
       SL.Clear;
     SL.AddObject(TNSel.Text, pointer(0));
     inc(i);
     with TreeView1 do begin
       while Items[i].Level > StartLevel do begin
         {stop before next sibling to top node\}
         SL.AddObject(Items[i].Text, pointer(Items[i].Level - StartLevel));
         inc(i);
       end; {while Items[i].Level > StartLevel\}
       Items[j].Delete;
     end; {with TreeView1\}
   end; {if TNSel <> nil\}
 end;

 procedure TForm1.PasteBtnClick(Sender: TObject);
 var
   i, Level : integer;
   TNSel, TN : TTreeNode;
 begin
   with TreeView1 do begin
     TNSel := Selected;
     if TNSel <> nil then begin
       TN := Items.Insert(TNSel, SL.Strings[0]);
       Level := integer(SL.Objects[0]); // should be 0
       for i := 1 to SL.Count - 1 do begin
         if integer(SL.Objects[i]) < Level then begin
           {go up one level\}
           TN := TN.Parent;
           Level := integer(SL.Objects[i]);
         end; {if integer(SL.Objects[i]) < Level\}
         if Level = integer(SL.Objects[i]) then
           {same level\}
           TN := Items.Add(TN, SL.Strings[i])
         else begin
           {go down one level\}
           TN := Items.AddChild(TN, SL.Strings[i]);
           Level := integer(SL.Objects[i]);
         end; {if Level = integer(SL.Objects[i])\}
       end; {for i := 1 to SL.Count - 1\}
     end; {if TNSel <> nil\}
   end; {with TreeView1\}
 end;

...
Рейтинг: 0 / 0
TtreeNodes
    #38545771
RESEARCH
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
братишки я вам процедурку написал пользуйтесь

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
procedure TfmSostavTree.CopyNode (SRC,DST:TTreeNode);
var Node: TTreeNode; BaseLevel,L,LPrev:Word;
begin

DST:=tree1.Items.AddChild(DST,SRC.Text);
BaseLevel:=SRC.Level;
Node:=SRC.GetNext; L:=Node.Level; LPrev:=0;

while L>BaseLevel do
 begin
  if L>LPrev  then DST:=tree1.Items.AddChild(DST,Node.Text);
  while L<Lprev do begin DST:=DST.Parent; dec(LPrev) end;
  if L=Lprev then DST:=tree1.Items.Add(DST,Node.Text);
  Node:=Node.getNext;
  LPrev:=L; L:=Node.Level
 end
end;
...
Рейтинг: 0 / 0
TtreeNodes
    #38546175
RESEARCH
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ребятки посоветуйте следующий вопрос

вот например мы имеем дерево в которой каждой ноде соответствует запись в DataSet.
В ноде выводится только базовая информация например обозначение и количество, другие поля находятся в датасете. Необходимо провести редактирование ноды пользователем по всем полям, для этого надо вывести ноду в эдиты и записать обратно.

Собственно вопрос, как однозначно сопоставить ноды и производные записи датасета учитывая то что будет делаться перемещение нод из одной в другую, копирование и соответственно AbsoluteIndex не может оставаться постоянным.
...
Рейтинг: 0 / 0
TtreeNodes
    #38546178
RESEARCH
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
переформулирую вопрос: как хранить (сопоставить) в ноде дополнительную скрытую информацию
...
Рейтинг: 0 / 0
TtreeNodes
    #38546201
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
RESEARCH,

При условии что у вас DataSet на ходу не изменяемый, самое простое - сделать так:

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
  // Заполнение дерева.
  while not ClientDataSet1.Eof do begin
    TreeView1.Items.Add(nil,ClientDataSet1.FieldByName('NAME').asString).Data:=pointer(ClientDataSet1.RecNo);
    ClientDataSet1.Next;
  end;

  // Действие на onClick
  ClientDataSet1.RecNo:=integer(TreeView1.Selected.Data);
  ShowMessage(ClientDataSet1.FieldByName('USER_NAME').AsString);
...
Рейтинг: 0 / 0
TtreeNodes
    #38546204
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rgreat,

Если изменяемый то лучше через промежуточный массив или индекс с уникальным идентфикатором в таблице.
...
Рейтинг: 0 / 0
TtreeNodes
    #38546223
RESEARCH
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Спасибо, это как раз то что нужно. Только я использовал GetBookmark() вместо pointer(RecNo).

Я копался в этом свойстве Node.Data но не додумался что оно как раз для указателя на внешние данные а не на внутренний текст.
...
Рейтинг: 0 / 0
TtreeNodes
    #38546224
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
GetBookmark дает массив байт.

Длина массива неизвестна.
Чревато. ;)
...
Рейтинг: 0 / 0
TtreeNodes
    #38546225
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Или ты таки сделал промежуточный массив с букмарками и даешь ссылку уже на него?
...
Рейтинг: 0 / 0
TtreeNodes
    #38546233
RESEARCH
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Node.Data:=DataSet.GetBookmark();

...


if DataSet.BookMarkValid(Node.Data) then DataSet.GotoBookmar(Node.Data);

как то так
...
Рейтинг: 0 / 0
TtreeNodes
    #38546234
RESEARCH
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
дело в том что у TQuery не работает свойство RecNo
...
Рейтинг: 0 / 0
25 сообщений из 65, страница 2 из 3
Форумы / Delphi [игнор отключен] [закрыт для гостей] / TtreeNodes
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]