Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Компоненты Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 08.07.2012, 15:45   #1
Kaban4ig
Пользователь
 
Регистрация: 10.12.2010
Сообщений: 32
По умолчанию Пару вопросов по TreeView

Всем привет. Я добавляю детей прикрепляя объект через TreeView1.Items.AddChildObjectFirst . 1) Как например мне в событии онклик обратится к объекту который был прикреплен к этому узлу? 2) Можно ли при построение дерева выключить постоянную его перерисовку ?
Kaban4ig вне форума Ответить с цитированием
Старый 08.07.2012, 17:53   #2
volvo877
Форумчанин
 
Аватар для volvo877
 
Регистрация: 01.06.2009
Сообщений: 108
По умолчанию

Цитата:
1) Как например мне в событии онклик обратится к объекту который был прикреплен к этому узлу?
AddChildObjectFirst добавляет ссылку на объект в поле Data, поэтому всё, что тебе нужно - преобразовать содержимое этого поля к нужному типу и получить нужное поле объекта (или вызвать нужный метод):
Код:
procedure TForm1.TreeView1Click(Sender: TObject);
begin
   TYourClass((Sender as TTreeView).Selected.Data).YourField := То_что_нужно
end;
Цитата:
2) Можно ли при построение дерева выключить постоянную его перерисовку ?
Можно.
Код:
TreeView1.Items.BeginUpdate;
// Тут перерисовки не будет
TreeView1.Items.EndUpdate;
volvo877 вне форума Ответить с цитированием
Старый 08.07.2012, 19:21   #3
Kaban4ig
Пользователь
 
Регистрация: 10.12.2010
Сообщений: 32
По умолчанию

Цитата:
Сообщение от volvo877 Посмотреть сообщение
AddChildObjectFirst добавляет ссылку на объект в поле Data, поэтому всё, что тебе нужно - преобразовать содержимое этого поля к нужному типу и получить нужное поле объекта (или вызвать нужный метод):
Код:
procedure TForm1.TreeView1Click(Sender: TObject);
begin
   TYourClass((Sender as TTreeView).Selected.Data).YourField := То_что_нужно
end;
Можно.
Код:
TreeView1.Items.BeginUpdate;
// Тут перерисовки не будет
TreeView1.Items.EndUpdate;
Спасибо, но перерисовка не помогла. У меня каким-то образом при добавлении детей их названия пишутся в название формы(!).
Kaban4ig вне форума Ответить с цитированием
Старый 08.07.2012, 19:29   #4
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Цитата:
У меня каким-то образом при добавлении детей их названия пишутся в название формы(!).
Волшебным? Код событий TreeView посмотрите, может там собака зарыта. И код свой покажите
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 08.07.2012, 19:36   #5
Kaban4ig
Пользователь
 
Регистрация: 10.12.2010
Сообщений: 32
По умолчанию

Код:
procedure TForm1.Button6Click(Sender: TObject);
begin

  Current := Head;

  // Отображаем дерево
  TreeView1.Items.BeginUpdate;

  TreeView1.Items.Clear;
  TreeView1.Items.AddObject(nil, IntToStr(Current^.YzelPl), Current);
  SeeTree;

  TreeView1.Items.EndUpdate;

end;

procedure TForm1.SeeTree;
var
  I: byte;

begin

  for I := 1 to 8 do
    if Current^.Sled[I] <> nil then
    begin

      Current := Current^.Sled[I];

      // Указатель на текущую запись
      Point := Current;
      TreeView1.Items.AddChildObjectFirst
        (TreeView1.Items[Current^.LevelTree - 1], Text, Point);
      SeeTree;

    end;

  Current := Current^.Pred;

end;
Kaban4ig вне форума Ответить с цитированием
Старый 08.07.2012, 19:37   #6
Kaban4ig
Пользователь
 
Регистрация: 10.12.2010
Сообщений: 32
По умолчанию

Ещё вопрос, а как очистить потом память от объектов которые я прикрепил? Или TreeView1.Items.Clear достаточно?
Kaban4ig вне форума Ответить с цитированием
Старый 08.07.2012, 20:47   #7
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

По этому куску кода не видно почему в название формы что-то пишется. Не понятно какие значения в переменной Text. Освобождать память самому нужно
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 08.07.2012, 20:58   #8
volvo877
Форумчанин
 
Аватар для volvo877
 
Регистрация: 01.06.2009
Сообщений: 108
По умолчанию

Цитата:
Или TreeView1.Items.Clear достаточно?
Нет, не достаточно. AddChildObjectFirst говорит:
Цитата:
Note: The memory referenced by Ptr is not freed when the tree nodes object is freed.
, так что придется тебе сначала проходить по всем узлам, и если Data <> nil корректно удалять объект из памяти (что такое у тебя добавляется, и как оно инициализируется - ты так и не показал, поэтому как удалить - это уж тебе одному известно), и только потом очистить дерево через Items.Clear... Я обычно пишу вот такой метод:

Код:
procedure TForm1.ClearTree;
var i : Integer;
begin
   for i := 0 to TreeView1.Items.Count - 1 do
      if Assigned(TreeView1.Items[i].Data) then
         TMyСlass(TreeView1.Items[i].Data).Free;
   TreeView1.Items.Clear;
end;
, и вызываю его, когда нужно очистить дерево.

А по поводу BeginUpdate/EndUpdate - ты бы показал, как у тебя заполняется та структура, из которой потом строится дерево, а то восстанавливать - не очень охота - было бы понятнее, что не так...
volvo877 вне форума Ответить с цитированием
Старый 18.07.2012, 16:22   #9
flexterful
Пользователь
 
Регистрация: 22.08.2008
Сообщений: 39
По умолчанию

Цитата:
Сообщение от volvo877 Посмотреть сообщение
Я обычно пишу вот такой метод:
Надёжнее описать так :

Код:
procedure TForm1.TreeView1Deletion(Sender: TObject; Node: TTreeNode);
begin
 if Assigned(Node.Data) then 
  if Node.Data is TObject
   then TObject(Node.Data).Free;
end;
+ При стерании (как одной так и всех записей) либо перезаписи будет вызван сей обработчик и освободит объект.
+ Подходит для любого типа объекта, ибо все они дети TObject.
+ Небудет ломаться, если в некоторых полях будут стоять указатели на строки или числа.
Чего бы тут сделать, дабы ничего неделать?
flexterful вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Пару вопросов о программировании) MeTeOpA Общие вопросы по программированию, компьютерный форум 3 29.04.2012 12:28
Пару вопросов о ZipMaster Marsik Компоненты Delphi 0 11.11.2009 17:22
Пару вопросов Syltan Свободное общение 2 19.10.2009 01:45