TTreeView

Есть TTreeView. В его событии onClick происходит работа с его выделенным элементом, т.е. TTreeView.Selected И при запуске программы необходимо проихвести этиже действия, т.е. в Form.Show я вызываю TreeViewClick Пробелмма в том, что при этом первом запуске этот самый Selected=nil. Пробовал все, onActivate, onCreate - nil. Но если повесить вызов события на отдельную кнопку и нажать ее после запуска приложения - он равен первому элементу. Вообщем как правильно вызвать этот обработчик? Руками назначить Selected? А когда он сам приобретает это свойство?
9 ответов

Ну да, можно попробовать выделить элемент самим. Для этого существует процедура Select Для того чтобы выделить первый элемент, надо написать:
TreeView1.Select(TreeView1.Items[0]);


Нее, ну это я знаю. Самому выделять, помоемУ, не совсем коректно... Непонятен механизм. В какой момент времени TTreeView выделяется сам? В него элементы занеслись, а Select еще не настал. Странно это. Даже ProcessMesage вставлял. Не по тайме he же дергать этот клик....


Можно сделать так: Разместите в секции 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;
Потому что будет два раза показываться сообщение(ну по крайней мере у меня)


Можно сделать так: Разместите в секции 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 выдет тот самый индекс... Походу глючный какой-то компонент....


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


Наверно при передаче фокуса на treeview и происходит выделение... Просто, может быть, когда нажимаешь на кнопку, то фокус передается, но при создании формы и при показе его нельзя передать...Если что, onEnter соответствует передаче фокуса treeview. Попробуйте, сейчас сам не за delphi сижу...P.S. можно попробовать передать фокус при onShow treeview
Пробовал TreeView.SetFocus - пофиху


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


Ну тогда, мне кажется, только самостоятельное выделение может помочь...
коряво это как-то.... самый главный прикол. В onShow TreeView1.Selected=nil. А если по таймеру запустить процедуру, то оно уже <>nil. Как она, млин, становится <>nil? С фокусами игрался, тыкая ими по форме, апликейшн мессадж пробовал во всех вариантах. Пробовал рбаотать с другими компонентами.... Мне уже просто интересно ,как это херня работает....


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