Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2005.06.14;
Скачать: [xml.tar.bz2];

Вниз

Процедура для каждого элемента TreeView   Найти похожие ветки 

 
Viktop   (2005-05-23 17:38) [0]

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


 
Eraser ©   (2005-05-23 17:48) [1]

Viktop   (23.05.05 17:38)

У элимента нету никаких пользовательских процедур, но есть св-во Data, в котором может хранится указатель на объект с данными об этом элементе.


 
Viktop   (2005-05-23 17:50) [2]

А поподробнее?


 
Reindeer Moss Eater ©   (2005-05-23 17:50) [3]

TTreeView.OnClick


 
Viktop   (2005-05-23 17:54) [4]

to Reindeer Moss Eater
Для элементов меню (Items)


 
PZ   (2005-05-23 17:57) [5]

S := (TreeView1.Items.Item[Ind].Text);


 
Reindeer Moss Eater ©   (2005-05-23 17:57) [6]

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


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

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


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

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


 
Reindeer Moss Eater ©   (2005-05-23 18:03) [9]

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

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


 
begin...end ©   (2005-05-23 18:18) [10]


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

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

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:20) [11]

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


 
Eraser ©   (2005-05-23 18:21) [12]

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

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


 
Reindeer Moss Eater ©   (2005-05-23 18:22) [13]

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

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


 
Eraser ©   (2005-05-23 18:22) [14]

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


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


 
Eraser ©   (2005-05-23 18:23) [15]

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

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


 
Reindeer Moss Eater ©   (2005-05-23 18:24) [16]

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


 
begin...end ©   (2005-05-23 18:25) [17]

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

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

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

:-))


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

Во-во.


 
Eraser ©   (2005-05-23 18:35) [19]

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


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


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

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


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

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


 
begin...end ©   (2005-05-24 15:23) [22]

> 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 15:31) [23]

Один мой знакомый, когда делал учебник писал так:
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 16:16) [24]

> 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.


 
begin...end ©   (2005-05-24 16:31) [25]


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

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

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



Страницы: 1 вся ветка

Форум: "Основная";
Текущий архив: 2005.06.14;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.5 MB
Время: 0.034 c
1-1117339257
Homa_Programer
2005-05-29 08:00
2005.06.14
Popup & DBGrid


1-1116836985
P.N.P.
2005-05-23 12:29
2005.06.14
Приведение типов


3-1115291005
esa
2005-05-05 15:03
2005.06.14
Глюк DevExp


14-1116769861
Cerberus
2005-05-22 17:51
2005.06.14
Записавание дисков


1-1117024248
Karlson
2005-05-25 16:30
2005.06.14
Картинки для BitBtn





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский