Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Оптимальное использование TreeView [D7, WinXP]


melbis ©   (2005-10-13 12:50:00) 

Есть TreeView и есть обработчик его события OnChange

Интересует такой момент, если дерево на момент его очистки было не пустое, а содержало 1000 элементов скажем, то действие TreeView.Items.Clear вызывает 1000 событие OnChange!!!

Понятно, что можно исползовать флаг собственный, но как то оно не красиво... Пробовал TreeView.Items.BeginUpdate - не помогло...

Что скажите?


melbis   (2005-10-13 13:19:00) [1]


> Всё отлично работает. Если убрать  TreeView1.Items.BeginUpdate;
>  и  TreeView1.Items.EndUpdate; - то да, идёт останов на
> OnChange


Не помогает TreeView1.Items.BeginUpdate - честное слово!
Добавьте Application.ProcessMessages после Label1.Caption:=Node.Text;


>    OnChange := nil;
>      Clear;
>      OnChange := TempHandler;

То что надо, спасибо!


Defunct   (2005-10-13 13:06:00) [2]

> Что скажите?

var
  TempHandler : TNotifyEvent;

....
  with TreeView do
  begin
     TempHandler := OnChange;
     OnChange := nil;
     Clear;
     OnChange := TempHandler;
  end;


Ega23   (2005-10-13 13:06:00) [3]


unit Unit1;

interface

uses
 Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
 StdCtrls, ComCtrls;

type
 TForm1 = class(TForm)
   TreeView1: TTreeView;
   Label1: TLabel;
   Button1: TButton;
   Button2: TButton;
   Label2: TLabel;
   procedure TreeView1Change(Sender: TObject; Node: TTreeNode);
   procedure FormCreate(Sender: TObject);
   procedure Button1Click(Sender: TObject);
   procedure Button2Click(Sender: TObject);
 private
   { Private declarations }
 public
   { Public declarations }

   procedure FillTree;

 end;

var
 Form1: TForm1;

implementation

{$R *.DFM}

procedure TForm1.TreeView1Change(Sender: TObject; Node: TTreeNode);
begin
// if TreeView1.Tag=0 then Label1.Caption:=Node.Text
//  else Label1.Caption:=IntToStr(TreeView1.Items.Count);
Label1.Caption:=Node.Text;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
FillTree;
end;

procedure TForm1.FillTree;
var
i:Integer;
begin
TreeView1.Tag:=0;
for i:=1 to 1000 do TreeView1.Items.Add(nil, IntToStr(i));
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
TreeView1.Tag:=1;
TreeView1.Items.BeginUpdate;
TreeView1.Items.Clear;
TreeView1.Items.EndUpdate;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
FillTree;
end;

end.


Всё отлично работает. Если убрать  TreeView1.Items.BeginUpdate; и  TreeView1.Items.EndUpdate; - то да, идёт останов на OnChange


Наверх

Титульная страница Поиск, карта сайта Написать письмо