powered by simpleCommunicator - 2.0.37     © 2025 Programmizd 02
Форумы / Delphi [игнор отключен] [закрыт для гостей] / TtreeNodes
65 сообщений из 65, показаны все 3 страниц
TtreeNodes
    #35054681
wellvk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Приветствую Народ!
Помогите понять -где туплю.
Хочу программно наполнить TtreeNodes, не получается...делаю:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
tr: TTreeNodes;

tr:=ttreeNodes.Create( nil );
       tr.Add(tr.GetFirstNode,'All');
              dm.oq.Close;
              dm.oq.SQL.Text:='select t.field from table';
              dm.oq.Open;

                dm.oq.First;
                 while   not  dm.oq.Eof   do 
                 begin 
                  tr.AddChild(it.getFirstChild,dm.oq.Fields[ 0 ].AsString);
                  dm.oq.Next;
                 end ;
Спасибо
...
Рейтинг: 0 / 0
TtreeNodes
    #35054696
Tosh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
1. не получается это не описание ошибки или результата работы
2. Если запустить и пройтись дебаггером - цикл отрабатывает?
3. Да и вообще - а сами как проверяли и что делали?
...
Рейтинг: 0 / 0
TtreeNodes
    #35054707
wellvk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Tosh1. не получается это не описание ошибки или результата работы
2. Если запустить и пройтись дебаггером - цикл отрабатывает?
3. Да и вообще - а сами как проверяли и что делали?
Ошибка :"Aссess violation at address"До цикла прога не доходит, на
tr.Add(tr.GetFirstNode,'All'); все умирает...
...
Рейтинг: 0 / 0
TtreeNodes
    #35054709
Naf
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
wellvk Tosh1. не получается это не описание ошибки или результата работы
2. Если запустить и пройтись дебаггером - цикл отрабатывает?
3. Да и вообще - а сами как проверяли и что делали?
Ошибка :"Aссess violation at address"До цикла прога не доходит, на
tr.Add(tr.GetFirstNode,'All'); все умирает...

Так нет у него первого Node. Если хочешь добавить как корневой
Код: plaintext
tr.Add( nil ,'All');
...
Рейтинг: 0 / 0
TtreeNodes
    #35054723
wellvk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Naf wellvk Tosh1. не получается это не описание ошибки или результата работы
2. Если запустить и пройтись дебаггером - цикл отрабатывает?
3. Да и вообще - а сами как проверяли и что делали?
Ошибка :"Aссess violation at address"До цикла прога не доходит, на
tr.Add(tr.GetFirstNode,'All'); все умирает...

Так нет у него первого Node. Если хочешь добавить как корневой
Код: plaintext
tr.Add( nil ,'All');

Результат тот же , да и ф-я GetFirstNode-доб-ет первый nod
...
Рейтинг: 0 / 0
TtreeNodes
    #35054733
Tosh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А теперь, внимание, вопрос - как отработает этот кусок:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
tr: TTreeNodes;

tr:=ttreeNodes.Create( nil );
 If   not  Assigned(tr)  Then 
  Showmessage('AAAAAAAAAAAAAAAA');
       tr.Add(tr.GetFirstNode,'All');
              dm.oq.Close;
              dm.oq.SQL.Text:='select t.field from table';
              dm.oq.Open;

                dm.oq.First;
                 while   not  dm.oq.Eof   do 
                 begin 
                  tr.AddChild(it.getFirstChild,dm.oq.Fields[ 0 ].AsString);
                  dm.oq.Next;
                 end ;

...
Рейтинг: 0 / 0
TtreeNodes
    #35054735
Ска
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
wellvk да и ф-я GetFirstNode-доб-ет первый nod
ну-ну...
само TreeView у тебя где ?
...
Рейтинг: 0 / 0
TtreeNodes
    #35054741
wellvk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
to Tosh:
Такая же ошибка...Да- почемуто "ААААА" не выскакивает ...мжт ProcessMessage воткнуть?
...
Рейтинг: 0 / 0
TtreeNodes
    #35054748
Tosh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ты точно уверен, что весь код показал?
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
tr: TTreeNodes;

tr:=ttreeNodes.Create( nil );
       tr.Add(tr.GetFirstNode,'All');
              dm.oq.Close;
              dm.oq.SQL.Text:='select t.field from table';
              dm.oq.Open;

                dm.oq.First;
                 while   not  dm.oq.Eof   do 
                 begin 
                  tr.AddChild(it.getFirstChild,dm.oq.Fields[ 0 ].AsString);  //что такое it? откуда она взялась? и чему равна? 
                  dm.oq.Next;
                 end ;
...
Рейтинг: 0 / 0
TtreeNodes
    #35054751
Ega
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
TTreeNodes maintains a list of tree nodes in a tree view control .

Нахрена ты TTreeNodes создаёшь????
...
Рейтинг: 0 / 0
TtreeNodes
    #35054761
wellvk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ega TTreeNodes maintains a list of tree nodes in a tree view control .

Нахрена ты TTreeNodes создаёшь????
Для того чтобы вставить данные в визуальный компонент.
Кратко: Много форм(8), везде есть TreeView-чтоб по сто раз не запрашивать , раз создалт подставляешь когда угодно...
...
Рейтинг: 0 / 0
TtreeNodes
    #35054771
Naf
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
wellvk Ega TTreeNodes maintains a list of tree nodes in a tree view control .

Нахрена ты TTreeNodes создаёшь????
Для того чтобы вставить данные в визуальный компонент.
Кратко: Много форм(8), везде есть TreeView-чтоб по сто раз не запрашивать , раз создалт подставляешь когда угодно...

и имеешь утечку памяти тех TreeNodes которые имел TreeView при создании?
...
Рейтинг: 0 / 0
TtreeNodes
    #35054774
Naf
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
tr:=ttreeNodes.Create( nil );
 If   not  Assigned(tr)  Then 

конечно условие выполняться не будет
...
Рейтинг: 0 / 0
TtreeNodes
    #35054777
Фотография FlyD
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
F1 Create constructor (TTreeNodes)After calling the inherited constructor, Create sets the Owner property of the tree nodes object to the value of the AOwner parameter.
Если по исходникам.
Код: plaintext
1.
2.
3.
4.
5.
 constructor  TTreeNodes.Create(AOwner: TCustomTreeView);
 begin 
   inherited  Create;
  FOwner := AOwner;  // у вас здесь nil 
 end ;
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
 function  TTreeNodes.Add(Sibling: TTreeNode;  const  S:  string ): TTreeNode;
 begin 
  Result := AddNode( nil , Sibling, S,  nil , naAdd);
 end ;

 function  TTreeNodes.AddNode(Node, Relative: TTreeNode;  const  S:  string ;
  Ptr: Pointer; Method: TNodeAttachMode): TTreeNode;
 const 
  cAddMode:  array  [TNodeAttachMode]  of  TAddMode =
    (taAdd, taAddFirst, taAdd, taAddFirst, taInsert);
 var 
  Item, ItemId: HTreeItem;
  Parent: TTreeNode;
  AddMode: TAddMode;
 begin 
   // what are we trying to add? 
   if  Node =  nil   then 
    Result := Owner.CreateNode  // Owner все еще nil 
...................
 end ;
И т.д.

ИМХО. Меняйте логику.

Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
TtreeNodes
    #35054779
wellvk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Naf
Код: plaintext
1.
tr:=ttreeNodes.Create( nil );
 If   not  Assigned(tr)  Then 

конечно условие выполняться не будет
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
tr: TTreeNodes;

tr:=ttreeNodes.Create( nil );
       tr.AddFirst(tr.GetFirstNode,'All');
              dm.oq.Close;
              dm.oq.SQL.Text:='select t.field from table';
              dm.oq.Open;

                dm.oq.First;
                 while   not  dm.oq.Eof   do 
                 begin 
                  tr.AddChild(tr.getFirstChild,dm.oq.Fields[ 0 ].AsString);
                  dm.oq.Next;
                 end ;
первоначально
...
Рейтинг: 0 / 0
TtreeNodes
    #35054787
Naf
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
пробуй
tr.AddChild(nil,'All');
...
Рейтинг: 0 / 0
TtreeNodes
    #35054788
Фотография FlyD
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
wellvkКратко: Много форм(8), везде есть TreeView-чтоб по сто раз не запрашивать , раз создалт подставляешь когда угодно...
А если так: раз создал TreeView и отображаешь, когда и где угодно?

Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
TtreeNodes
    #35054793
Ega
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
wellvk Ega TTreeNodes maintains a list of tree nodes in a tree view control .

Нахрена ты TTreeNodes создаёшь????
Для того чтобы вставить данные в визуальный компонент.
Кратко: Много форм(8), везде есть TreeView-чтоб по сто раз не запрашивать , раз создалт подставляешь когда угодно...

Я понимаю, что их вставить надо.
Я не прнимаю, нахрена ты их создаёшь?

Код: plaintext
1.
2.
3.
4.
5.
 procedure  AddNodes(tn : TTreeNodes);
 begin 
   if   not  Assigned(tn)  then  Exit;
  .......
 end ;
и вызывай её потом

Код: plaintext
AddNodes(TreeView1.Items);
...
Рейтинг: 0 / 0
TtreeNodes
    #35055008
wellvk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
to Ega
у меня не TreeView компонент , а AdvTreeComboBox.
Я хотел зделать так: AdvTreeComboBox.Items:=tr(где будет находится дерево)...
...
Рейтинг: 0 / 0
TtreeNodes
    #35055021
Ega
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
wellvkto Ega
у меня не TreeView компонент , а AdvTreeComboBox.
Я хотел зделать так: AdvTreeComboBox.Items:=tr(где будет находится дерево)...

И что произойдёт с native AdvTreeComboBox.Items?
...
Рейтинг: 0 / 0
TtreeNodes
    #35055029
Tosh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
wellvkЯ хотел зделать так: AdvTreeComboBox.Items:=tr(где будет находится дерево)...
Прости, но за такое надо руки отрывать по колено ... низя так делать никогда
...
Рейтинг: 0 / 0
TtreeNodes
    #35055045
wellvk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Tosh wellvkЯ хотел зделать так: AdvTreeComboBox.Items:=tr(где будет находится дерево)...
Прости, но за такое надо руки отрывать по колено ... низя так делать никогда
Поясните, почему отрывать?
Я так делал для Combobox,ListBox...-без проблем.
...
Рейтинг: 0 / 0
TtreeNodes
    #35055053
Tosh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дело в том, что это managed свойства - их жизненный цикл управляется контролом (в том числе и освобождение памяти). Если ты подменишь значения другим объектом - тогда неизвестно кода денется старый объект (бедт висеть в памяти до посинения) и, в какой-то момент времени, какой-нить из контролов просто уничтножит твой объект при совем уничтожении.
Как тебе такая перспектива? :)
...
Рейтинг: 0 / 0
TtreeNodes
    #35055062
Ega
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
wellvk Tosh wellvkЯ хотел зделать так: AdvTreeComboBox.Items:=tr(где будет находится дерево)...
Прости, но за такое надо руки отрывать по колено ... низя так делать никогда
Поясните, почему отрывать?
Я так делал для Combobox,ListBox...-без проблем.

Если ты раньше забивал гвозди жестким диском и СD-приводом, то поверь, не стоит также забивать гвозди материнской платой.
...
Рейтинг: 0 / 0
TtreeNodes
    #35055150
wellvk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ToshДело в том, что это managed свойства - их жизненный цикл управляется контролом (в том числе и освобождение памяти). Если ты подменишь значения другим объектом - тогда неизвестно кода денется старый объект (бедт висеть в памяти до посинения) и, в какой-то момент времени, какой-нить из контролов просто уничтножит твой объект при совем уничтожении.
Как тебе такая перспектива? :)
как я понимаю: создается объект(ttreeNodes) у него есть сво-во Item , где хранятся Node, под это дело выделяется память,не котролом, затем я говорю контролу AdvTreeComboBox, что узлы лежат там-то, и контрол присваивает себе этот кусок памяти(или копирует в свои свойства ) и при закрытии приложения(уничтожения) удалят из памяти инфу, но уничтожением можно управлять.
...
Рейтинг: 0 / 0
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
TtreeNodes
    #38546236
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
RESEARCH,

Вы все еще кипятите (BDE)?! (c)
...
Рейтинг: 0 / 0
TtreeNodes
    #38546984
Arioch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
RESEARCHу TQuery не работает свойство RecNo

а оно и не обязано
...
Рейтинг: 0 / 0
TtreeNodes
    #38547079
LSV
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Какие нафиг букмарки ? запоминайте ключевое поле(поля), а потом его ищите. Да хоть тем же Локейтом.

Букмарки - жутко ненадежная вещь.
...
Рейтинг: 0 / 0
TtreeNodes
    #38547355
RESEARCH
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Я думаю с точки зрения производительности букмарки быстрее чем локейт, по сути просто указатель на запись. Тем более что ключевое поле типа String. TQuery статический набор поэтому букмарки на нем отрабатывают нормально без сбоев.
...
Рейтинг: 0 / 0
TtreeNodes
    #38548012
goldmi45
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
RESEARCHЯ думаю с точки зрения производительности букмарки быстрее чем локейт, по сути просто указатель на запись. Тем более что ключевое поле типа String. TQuery статический набор поэтому букмарки на нем отрабатывают нормально без сбоев.
RESEARCH, Вы и о нормализации баз ничего не слышали?
...
Рейтинг: 0 / 0
TtreeNodes
    #38561143
RESEARCH
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ребятки как вы смотрите на идею инкапсулировать данные непосредственно в ноду вместо указания ссылки на датасеты ?
Как думаете прокатит такая идея

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
  TDSENode = class (TTreeNode)
    function SetData(Q:TDataSet):String;
    function ShowText(VX:String):String;
    function GetNext: TDSENode;
    public
    IX: String;
    PRR: Byte;
    CUDA,CHTO,NAM: String;
    LCHTO,LNAM: String;
    KVO: Real;
    PIC: String;
    Level:Byte;
    Stat: TDSEState;
  end;
...
Рейтинг: 0 / 0
TtreeNodes
    #38561157
Arioch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
TtreeNodes
    #38561170
Фотография Feg16
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Tosh1. не получается это не описание ошибки или результата работыменеджер по продажамФраза "а всякая херня" не описывает полный ассортимент предлагаемой продукции
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
TtreeNodes
    #40098550
Любезный
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Позанимаюсь некрофилией.

Заполняю дерево узлами с простейшим текстом стандартным образом. Но после отрисовки получаю узлы с недостаточной шириной текста (короткий узел с обрезом текста справа, при этом места в ширину предостаточно). Когда делал раньше, с этим не сталкивался. Delphi 2010. Где может быть засада?
Код: sql
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.
procedure TInsertICDForm.FillTree;
var N, N1: TTreeNode;
    parntidx, idx, j, oldparentid: Integer;
begin
 ICDTree.Visible:=False;
 N1:=Nil;
 with DataForm.ICDTable, ICDTree
  do begin
      oldparentid:=-1;
      Items.BeginUpdate;
      Open;
      while not EOF
       do begin
           idx:=Fields [0].AsInteger;
           parntidx:=Fields [1].AsInteger;
           if oldparentid<>parntidx
            then begin
                  N1:=nil;
                  for j:=0 to Items.Count-1
                   do if Integer (Items [j].Data)=parntidx
                       then begin
                             N1:=Items [j];
                             oldparentid:=parntidx;
                             Break;
                            end;
                 end;
           N:=Items.AddChild (N1, Fields [2].AsString);
           N.Data:=Pointer (idx);
           N.SelectedIndex:=0;
           N.OverlayIndex:=0;
           Next;
          end;
      Close;
      Items.EndUpdate;
      Visible:=True;
     end;
end;
...
Рейтинг: 0 / 0
TtreeNodes
    #40098560
Michael Longneck
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Воистину прокляты те, кто использует такой with!
...
Рейтинг: 0 / 0
TtreeNodes
    #40098561
Michael Longneck
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А по делу - сверьте длину TStringField в вашем квери и длину поля в базе
...
Рейтинг: 0 / 0
TtreeNodes
    #40098562
Любезный
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Про with - на умеренном объеме кода он вполне уместен.

Michael Longneck
А по делу - сверьте длину TStringField в вашем квери и длину поля в базе

Спасибо! В этом дело и оказалось. Скорректировал длину, и все стало нормально.
...
Рейтинг: 0 / 0
TtreeNodes
    #40098599
Michael Longneck
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Любезный Про with - на умеренном объеме кода он вполне уместен.

На любом количестве кода уместна временная переменная. А вот with с двумя и более объектами категорически неуместен. У себя я заставляю такое убирать
...
Рейтинг: 0 / 0
TtreeNodes
    #40098604
Fr0sT-Brutal
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
А зачем прятать дерево?
...
Рейтинг: 0 / 0
TtreeNodes
    #40098812
Любезный
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Fr0sT-Brutal, по привычке прячу на период заполнения.
...
Рейтинг: 0 / 0
65 сообщений из 65, показаны все 3 страниц
Форумы / Delphi [игнор отключен] [закрыт для гостей] / TtreeNodes
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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