![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Сделать активным компанент
Andrey K © (2016-07-07 16:53:00)Доброго времени суток.
Сделать активным компонент на форме понятно как. Есть другая ситуация.
На форме положен
pcProg: TPageControl;
На его страницы выкладывается фрейм TfrUn = class(TFrame) с набором TEdit
TfrUn = class(TFrame)
edX1: TEdit;
edX2: TEdit;
........
Делаю активным конкретный TEdit:
TfrUn(pcProg.ActivePage.Controls[0]).edX1.SetFocus; Проблем не возникает.
Проблема:
Программа ищет Sub: string; в эдитах, эдит в котором совпадение надо сделать активным.
Имя нужного эдита заношу в NamComp := 'edX1'
Вариант: TfrUn(pcProg.ActivePage.Controls[0]).FindComponent(NamComp).SetFocus; не работает. Ошибка.
Вариант: TfrUn(pcProg.ActivePage.Controls[0]).(FindComponent(NamComp) as TEdit).SetFocus; тоже ошибка.
Или может есть другой способ активировать нужный компонент?
Andrey K (2016-07-10 10:20:00) [1]Добрый день, Юрий. Большое спасибо за участие в решении моей проблемы.
Я не там искал. У меня на форме положено tvSE: TreeView дерево со всей структурой проекта. В нём, в том числе, отображаются искомые параметры. Тыкая по параметру в tvSEMouseUp запускается поисковая процедура и активируется мемо на текущей странице pcProg. По точкам останова, при отладке, выловил что последним в цепочке активации компонентов это pcProgChange. В этом обработчике я пытался активировать найденный эдит. И это была главная ошибка. Перенеся все разборки с фокусировкой в tvSEMouseUp всё заработало. Ваше предложение с переменной E: TEdit сделало код намного лаконичней и понятней.
Ещё раз большое Вам спасибо.
Andrey K (2016-07-09 18:33:00) [2]Пока выходные попробовать ничего не могу. Только теоретически рассуждать. Вопрос с по с поиском решён. Всё находит. Всё упирается в фокусировку. В мемо нахожу, выделяю. Только дело в эдитах. За подсказку TCustomEdit спасибо.
Германн (2016-07-09 01:17:00) [3]Вопрос еще где и как искать.
Юрий Зотов (2016-07-09 00:42:00) [4]И мемо, и эдит - оба они TCustomEdit. И у обоих есть Text.
Возможно, TCustomEdit и надо искать (а не Edit).
Andrey K (2016-07-09 00:19:00) [5]Честно говоря, я вобще не заморачивался бы с фокусировкой эдитов. Но в работе этой программы создаётся до 50-и страниц. Генерируются разные параметры. И они могут быть где угодно в мемо или в многочисленных эдитах. И если не указывать явно, где этот параметр, то сильно затрудняется работа.
Andrey K (2016-07-08 23:56:00) [6]Сейчас я не у компьютера. Чисто теоретически, начинаю догонять. Эту переменную надо сделать вообще глобальной а не на фрейме. И тогда сработает E.SetFocus;
Юрий Зотов (2016-07-08 18:50:00) [7]Так уже ведь воплотилось - см. [7] и [10].
И никакие FindComponent не нужны.
Andrey K (2016-07-08 18:38:00) [8]Где то задним умом тему понял. Но пока не знаю как воплотить задуманное.
Юрий Зотов (2016-07-08 18:03:00) [9]п Ы таетесь
Юрий Зотов (2016-07-08 18:02:00) [10]То есть Owner'ом эдита является страница TPageControl. А Вы путаетесь найти этот эдит на фрейме:
TfrUn (pcProg.ActivePage.Controls[0]).( FindComponent (NamComp) as TEdit).....
Ясно, что ничего найдено не будет.
Andrey K (2016-07-08 17:25:00) [11]ShowMessage(найденный_эдит.Parent.Name); - gbStart
ShowMessage(найденный_эдит.Owner.Name); - pcProg0
gbStart: TGroupBox; - на которой лежит найденный_эдит.
pcProg0- Страничка TPageControl на которой находится фрейм с этим gbStart и эдитом.
Andrey K (2016-07-07 23:47:00) [12]Сейчас не могу попробовать [8]. Не у компьютера. Завтра сообщу результат.
Юрий Зотов (2016-07-07 21:55:00) [13]Андрей, если Вы хотите раз и навсегда понять суть проблемы, то ответьте на [8].
Andrey K (2016-07-07 21:33:00) [14]>И кто мешает?
>E.SetFocus;
Блин, точно.
Andrey K (2016-07-07 21:32:00) [15]Последнее ваше сообщение не увидел. Сейчас попробую.
Юрий Зотов (2016-07-07 21:31:00) [16]> Мне то надо найденному эдиту передать фокус.
И кто мешает?
E.SetFocus;
Andrey K (2016-07-07 21:30:00) [17]Мне то надо найденному эдиту передать фокус.
Юрий Зотов (2016-07-07 21:30:00) [18]Самое главное Вы не сделали:
Сообщите, что выдает такой код:
ShowMessage(найденный_эдит.Parent.Name);
ShowMessage(найденный_эдит.Owner.Name);
Юрий Зотов (2016-07-07 21:27:00) [19]var E: TEdit;
procedure FindEditWithText(Txt: string);
begin
Находим нужный эдит;
E := найденный_эдит;
if E = nil then
raise Exception.Create('Эдит с текстом ' + Txt +' не найден');
end;
Andrey K (2016-07-07 21:23:00) [20]Маленькая вилка. На фрейме есть ещё и TMemo. Процедура ищет Sub ещё и в нём. Т.е. переменная типа TEdit не очень подходит. Правда это можно обойти, мне бы с эдитами разобраться.