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

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

Процедура для каждого элемента TreeView [D7, WinXP]


Страницы:   1 2

Viktop ©   (2005-05-23 17:38:00) 

Приведите пожалуйста пример, чтобы при нажатии на любом элементе TreeView появлялось сообщение с текстом этого элемента. Конкретно интересует назначение процедуры для элемента.


begin...end   (2005-05-24 16:31:00) [1]


> URLs = array [1..2] of string =

Сорри. Надо так:

URLs :array [1..2] of string =


begin...end   (2005-05-24 16:16:00) [2]

> Viktop   (24.05.05 15:31) [23]

Дык эта... Вопрос то был таким: "Приведите пожалуйста пример, чтобы при нажатии на любом элементе TreeView появлялось сообщение с текстом этого элемента". Вот примеры и привели -- в [5], [8] и [22].

Теперь выясняется, что нужно при клике по TreeView не показывать текст выбранного элемента, а осуществлять какие-то другие действия, в зависимости от его текста.

Я бы тогда уж ориентировался не на текст. При добавлении элемента в TreeView соответственно заголовку элемента присваивал бы целочисленное значение его свойству Data, а потом, при клике, соответственно этому целочисленному значению вызывал бы Navigate с нужным строковым параметром из константной таблицы.

Ну, например... В TreeView есть два элемента -- с заголовками 'Технология программирования' и 'Алгоритмизация'. первому назначаем свойство Data равным 1, второму -- 2, например:

TreeNode.Data := Pointer(1)

Теперь пишем вот такой вот OnChange:

procedure TForm1.TreeView1Change(Sender: TObject; Node: TTreeNode);
const
 URLs = array [1..2] of string =
   ('C:\Основы алгоритмизации и программирования\HTML\index1.htm',
    'C:\Основы алгоритмизации и программирования\HTML\index2.htm');
begin
 if Assigned(Node) then
   WebBrowser1.Navigate(URLs[Integer(Node.Data)])
end.


Viktop   (2005-05-24 15:31:00) [3]

Один мой знакомый, когда делал учебник писал так:
procedure TForm1.TreeView1Click(Sender: TObject);
var
  st_index:string;
begin
  st_index:=TreeView1.Selected.Text;
  if st_index = 'Технология программирования' then
    WebBrowser1.Navigate('C:\Основы алгоритмизации и программирования\HTML\index1.htm');
  if st_index = 'Алгоритмизация' then
    WebBrowser1.Navigate('C:\Основы алгоритмизации и программирования\HTML\index2.htm');
  if st_index = 'Анализ языков программирования' then
    WebBrowser1.Navigate('C:\Основы алгоритмизации и программирования\HTML\Языки программирования.htm');
  if st_index = 'Правила записи арифметических выражений' then
    WebBrowser1.Navigate('C:\Основы алгоритмизации и программирования\HTML\index3.htm');
  if st_index = 'Задание "Запись арифметических выражений"' then
    WebBrowser1.Navigate('C:\Основы алгоритмизации и программирования\HTML\index4.htm');
end;

А у меня в дереве более 100 элементов. Такое вручную делать?


begin...end   (2005-05-24 15:23:00) [4]

> Viktop   (24.05.05 14:22) [21]

[10] -- это была шутка, хотя приведённый код и работает. Нужный ответ был дан ещё до [10] -- см. [5] и [8].

procedure TForm1.TreeView1Change(Sender: TObject; Node: TTreeNode);
begin
if Assigned(Node) then
  ShowMessage(Node.Text)
end


Viktop   (2005-05-24 14:22:00) [5]

Ну в принципе [10] работает, только если вместо Beep (который у меня не бибикает :)) указать  showmessage(treeview1.Selected.Text) то не работает. В private процедуру указал, TForm1.Proc сделал и всё равно не идёт (я в указателях не разбираюсь)


Viktop   (2005-05-24 07:10:00) [6]

to Erase
Про Data я вобще не знал :(
Вчера свет вырубили, поэтому и не смог продолжить допрос :((
Ща попробую, что написали


Eraser   (2005-05-23 18:35:00) [7]

begin...end ©   (23.05.05 18:25) [17]
Изврат -- он в хранении в свойстве Data адреса процедуры в контексте данной задачи.


А, ну это да... имхо некрасиво... но так афтар просил именно это )


Reindeer Moss Eater   (2005-05-23 18:26:00) [8]

Во-во.


begin...end   (2005-05-23 18:25:00) [9]

> Eraser ©   (23.05.05 18:22) [14]

> без св-ва Data вообще данный компонент становится бесполезным

Изврат -- он не в использовании свойства Data.
Изврат -- он в хранении в свойстве Data адреса процедуры в контексте данной задачи.

:-))


Reindeer Moss Eater   (2005-05-23 18:24:00) [10]

Потому что изврат.
Много процедур вместо одного диспатчера основанного на тэге элемента.


Eraser   (2005-05-23 18:23:00) [11]

Reindeer Moss Eater ©   (23.05.05 18:22) [13]

Поэтому в таких случаях лучше в св-ве Data хранить указатель на сам ОБЪЕКТ, если конечно такой имеется...


Reindeer Moss Eater   (2005-05-23 18:22:00) [12]

А как внутри процедуры узнать, кем она была вызвана? ;-)

При таком подходе этого не надо знать.
:)


Eraser   (2005-05-23 18:22:00) [13]

Reindeer Moss Eater ©   (23.05.05 18:20) [11]
Ой изврат так изврат.


Почему изврат? Когда имеется куча навороченных объектов, которые надо как-то идентифицировать, без св-ва Data вообще данный компонент становится бесполезным.


Eraser   (2005-05-23 18:21:00) [14]

begin...end ©   (23.05.05 18:18) [10]

А как внутри процедуры узнать, кем она была вызвана? ;-)
Имхо надо Sender добавить.


Reindeer Moss Eater   (2005-05-23 18:20:00) [15]

Ой изврат так изврат.
:)


begin...end   (2005-05-23 18:18:00) [16]


> Конкретно интересует назначение процедуры для элемента.

Это мы запросто.

type
 TProc = procedure;

procedure Proc;
begin
 Beep
end;

procedure TForm1.TreeView1Change(Sender: TObject; Node: TTreeNode);
begin
 if Assigned(Node) then
   if Assigned(Node.Data) then
     TProc(Node.Data)
end;

begin
 TreeView1.Items[0].Data := @Proc
end.

:o)))))


Reindeer Moss Eater   (2005-05-23 18:03:00) [17]

Лучше наверное OnChange

Occurs whenever the selection has changed from one node to another.


Marser   (2005-05-23 18:01:00) [18]

procedure TForm1.TreeView1Click(Sender: TObject);
begin
showmessage(treeview1.Selected.Text)
end;


PZ   (2005-05-23 17:59:00) [19]

Дополнительно:
Ind := TreeView1.Selected.AbsoluteIndex;


Reindeer Moss Eater   (2005-05-23 17:57:00) [20]

Какого меню, когда в вопросе TreeView?


Страницы:   1 2

Наверх

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