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

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

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

Восстановить пароль

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

Ответ
 
Опции темы Поиск в этой теме
Старый 06.05.2009, 20:51   #1
Sergey2
Форумчанин
 
Регистрация: 08.01.2008
Сообщений: 233
По умолчанию TTreeView

Есть TTreeView. В его событии onClick происходит работа с его выделенным элементом, т.е. TTreeView.Selected
И при запуске программы необходимо проихвести этиже действия, т.е. в Form.Show я вызываю TreeViewClick
Пробелмма в том, что при этом первом запуске этот самый Selected=nil. Пробовал все, onActivate, onCreate - nil. Но если повесить вызов события на отдельную кнопку и нажать ее после запуска приложения - он равен первому элементу. Вообщем как правильно вызвать этот обработчик? Руками назначить Selected? А когда он сам приобретает это свойство?
Sergey2 вне форума Ответить с цитированием
Старый 06.05.2009, 22:10   #2
Neeter
Форумчанин
 
Аватар для Neeter
 
Регистрация: 22.02.2009
Сообщений: 875
По умолчанию

Ну да, можно попробовать выделить элемент самим.
Для этого существует процедура Select
Для того чтобы выделить первый элемент, надо написать:
Код:
TreeView1.Select(TreeView1.Items[0]);
Чтобы обнаруживать ошибки, программист должен иметь ум, которому доставляет удовольствие находить изъяны там, где, казалось, царят красота и совершенство.
Neeter вне форума Ответить с цитированием
Старый 06.05.2009, 22:21   #3
Sergey2
Форумчанин
 
Регистрация: 08.01.2008
Сообщений: 233
По умолчанию

Нее, ну это я знаю. Самому выделять, помоемУ, не совсем коректно...
Непонятен механизм. В какой момент времени TTreeView выделяется сам? В него элементы занеслись, а Select еще не настал. Странно это. Даже ProcessMesage вставлял. Не по тайме he же дергать этот клик....
Sergey2 вне форума Ответить с цитированием
Старый 06.05.2009, 22:38   #4
Neeter
Форумчанин
 
Аватар для Neeter
 
Регистрация: 22.02.2009
Сообщений: 875
По умолчанию

Можно сделать так:
Разместите в секции private булевскую переменную:
Код:
...
private
  b: boolean;
...
В onCreate формы присвойте ей false
И в onPaint формы:
Код:
if g = false then
begin
 g := true;
 ShowMessage(TreeView1.Selected.Text); //тут свой код
end;
Вот так писать нельзя:
Код:
if g = false then
begin
 ShowMessage(TreeView1.Selected.Text);   
 g := true;                                                
end;
Потому что будет два раза показываться сообщение(ну по крайней мере у меня)
Чтобы обнаруживать ошибки, программист должен иметь ум, которому доставляет удовольствие находить изъяны там, где, казалось, царят красота и совершенство.
Neeter вне форума Ответить с цитированием
Старый 06.05.2009, 22:49   #5
Sergey2
Форумчанин
 
Регистрация: 08.01.2008
Сообщений: 233
По умолчанию

Цитата:
Сообщение от Neeter Посмотреть сообщение
Можно сделать так:
Разместите в секции private булевскую переменную:
Код:
...
private
  b: boolean;
...
В onCreate формы присвойте ей false
И в onPaint формы:
Код:
if g = false then
begin
 g := true;
 ShowMessage(TreeView1.Selected.Text); //тут свой код
end;
Вот так писать нельзя:
Код:
if g = false then
begin
 ShowMessage(TreeView1.Selected.Text);   
 g := true;                                                
end;
Потому что будет два раза показываться сообщение(ну по крайней мере у меня)
Два раза они показываются потому что когда выводится месседж форма опять перерисовывается
Неее, ну подобных костылей я и сам могу напридумать полно. Вопрос не в том "как сделать", вопрос в том, кодга эта хрень сама селектиться и почему? Компонент создался, данными его наполнили, т.е. уже идет работа с ним полным ходом, а эта зараза еще не до конца проиницилизировалась.
Я недавно посал про еще один "глюк" при работе с TreeView, уже сам не помню, но там вроде было связано с тем, что когда кликаешь правой кнопкой мыши, то TreeView.Item[s].Selected false, но TreeView.Selected.AbsoluteIndex выдет тот самый индекс...
Походу глючный какой-то компонент....
Sergey2 вне форума Ответить с цитированием
Старый 06.05.2009, 22:57   #6
Neeter
Форумчанин
 
Аватар для Neeter
 
Регистрация: 22.02.2009
Сообщений: 875
По умолчанию

Наверно при передаче фокуса на treeview и происходит выделение...
Просто, может быть, когда нажимаешь на кнопку, то фокус передается, но при создании формы и при показе его нельзя передать...

Если что, onEnter соответствует передаче фокуса treeview.
Попробуйте, сейчас сам не за delphi сижу...

P.S. можно попробовать передать фокус при onShow treeview
Чтобы обнаруживать ошибки, программист должен иметь ум, которому доставляет удовольствие находить изъяны там, где, казалось, царят красота и совершенство.

Последний раз редактировалось Neeter; 06.05.2009 в 23:04.
Neeter вне форума Ответить с цитированием
Старый 06.05.2009, 23:11   #7
Sergey2
Форумчанин
 
Регистрация: 08.01.2008
Сообщений: 233
По умолчанию

Цитата:
Сообщение от Neeter Посмотреть сообщение
Наверно при передаче фокуса на treeview и происходит выделение...
Просто, может быть, когда нажимаешь на кнопку, то фокус передается, но при создании формы и при показе его нельзя передать...

Если что, onEnter соответствует передаче фокуса treeview.
Попробуйте, сейчас сам не за delphi сижу...

P.S. можно попробовать передать фокус при onShow treeview
Пробовал TreeView.SetFocus - пофиху
Sergey2 вне форума Ответить с цитированием
Старый 06.05.2009, 23:15   #8
Neeter
Форумчанин
 
Аватар для Neeter
 
Регистрация: 22.02.2009
Сообщений: 875
По умолчанию

Ну тогда, мне кажется, только самостоятельное выделение может помочь...

У меня SetFocus работает

Код:
procedure Form1.FormShow(Sender: TObject);
begin
 TreeView1.SetFocus;
 ShowMessage(TreeView1.Selected.Text);
end;
Все хорошо показывается.
Чтобы обнаруживать ошибки, программист должен иметь ум, которому доставляет удовольствие находить изъяны там, где, казалось, царят красота и совершенство.

Последний раз редактировалось Neeter; 06.05.2009 в 23:36.
Neeter вне форума Ответить с цитированием
Старый 07.05.2009, 00:17   #9
Sergey2
Форумчанин
 
Регистрация: 08.01.2008
Сообщений: 233
По умолчанию

Цитата:
Сообщение от Neeter Посмотреть сообщение
Ну тогда, мне кажется, только самостоятельное выделение может помочь...
коряво это как-то.... самый главный прикол. В onShow TreeView1.Selected=nil. А если по таймеру запустить процедуру, то оно уже <>nil. Как она, млин, становится <>nil? С фокусами игрался, тыкая ими по форме, апликейшн мессадж пробовал во всех вариантах. Пробовал рбаотать с другими компонентами....
Мне уже просто интересно ,как это херня работает....
Sergey2 вне форума Ответить с цитированием
Старый 07.05.2009, 00:18   #10
Sergey2
Форумчанин
 
Регистрация: 08.01.2008
Сообщений: 233
По умолчанию

Цитата:
Сообщение от Neeter Посмотреть сообщение
Ну тогда, мне кажется, только самостоятельное выделение может помочь...

У меня SetFocus работает

Код:
procedure Form1.FormShow(Sender: TObject);
begin
 TreeView1.SetFocus;
 ShowMessage(TreeView1.Selected.Text);
end;
Все хорошо показывается.
Хм.... пошел ковырять....

....

Последний раз редактировалось Sergey2; 07.05.2009 в 00:27.
Sergey2 вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
TTreeView Sergey2 Компоненты Delphi 1 16.09.2009 15:22
Ноды в TTreeView PlayerDark Компоненты Delphi 10 03.05.2009 19:51
Заполнить TTreeView Leonis Компоненты Delphi 6 27.03.2008 13:02
TTreeView alll_23 Общие вопросы Delphi 2 23.10.2007 12:36