![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Процедура для каждого элемента TreeView [D7, WinXP]
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?