![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Работа с PageControl [D7, WinXP]
Dash Rendar © (2007-08-10 14:05:00)Доброго времени суток! Суть моей проблемы: есть PageControl с одной созданной в design-time страницей и набором контролов на ней. Подразумевается, что в процессе выполнения программы будут создаваться дополнительные страницы с тем же набором контролов, поэтому обработчик события OnClick я вынес в отдельную процедуру с последующим присваиванием.
Так вот, проблема в следующем: первая страница работает нормально, а последующие (которые создаются в run-time) обрабатывать присвоенное событие отказываются напрочь.
Привожу фрагменты кода.
//в описании формы
private
procedure Click(Sender: TObject);
//текст процедуры
procedure TForm1.Click(Sender: TObject);
begin
for i:=0 to ComponentCount-1 do
if (Components[i] is TTreeView) and ((Components[i] as TTreeView).Parent=PageControl1.ActivePage) then
PageControl1.ActivePage.Caption:=(Components[i] as TTreeView).Selected.Text;
end;
//присваивание процедуры событию на заранее созданной странице, все работает
procedure TForm1.FormShow(Sender: TObject);
begin
TreeView1.OnClick:=Click;
end;
//создание новой страницы с новым TreeView
procedure TForm1.Action1Execute(Sender: TObject);
var ts: TTabSheet; tv: TTreeView;
begin
ts:=TTabSheet.Create(PageControl1);
ts.Parent:=PageControl1;
ts.PageControl:=PageControl1;
ts.ImageIndex:=0;
tv:=TTreeView.Create(ts);
ts.InsertControl(tv);
tv.Align:=alClient;
tv.OnClick:=Click;
end;
В чем моя ошибка?
Dash Rendar (2007-08-10 14:52:00) [1]Благодарю за помощь.
MBo (2007-08-10 14:50:00) [2]>То есть мне надо переписать примерно так?
Видимо, да. Проверки не помешают - Selected на Nil, а если этот обработчик может быть вызван и другими компонентами - и if Sender is TTreeView
Dash Rendar (2007-08-10 14:22:00) [3]То есть мне надо переписать примерно так?
>
procedure TForm1.Click(Sender: TObject);
begin
PageControl1.ActivePage.Caption:=(Sender as TTreeView).Selected.Text;
end;
Насчет названия метода - каюсь, забыл про TControl.
MBo (2007-08-10 14:12:00) [4]>for i:=0 to ComponentCount-1 do
здесь ты перебираешь компоненты, принадлежащие форме
>tv:=TTreeView.Create(ts);
а здесь соз0даешь компонент, принадлежащий тАбу.
Впрочем, перебирать ничего и не нужно, т.к. Sender не зря передается в OnClick
еще одно - нехорошо называть метод Click, поскольку такой метод уже есть у TControl