Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2018.07.15;
Скачать: CL | DM;

Вниз

Сделать активным компанент   Найти похожие ветки 

 
Andrey K   (2016-07-07 16:53) [0]

Доброго времени суток.
Сделать активным компонент на форме понятно как. Есть другая ситуация.
На форме положен
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; тоже ошибка.
Или может есть другой способ активировать нужный компонент?


 
Юрий Зотов ©   (2016-07-07 18:16) [1]

NamComp - лишнее. При поиске Sub Вы же уже определили нужный Edit - вот ему и ставьте SetFocus.

А ошибка, похоже, из-за того, что владельцем (Owner) всех Edit"ов является не фрейм, а форма. Поэтому FindComponent ничего не находит.


 
Andrey K   (2016-07-07 20:56) [2]

Владельцем фрейма на котором лежат все эдиты я делаю конкретную страницу pcProg, на которую выставляю фрейм. Отсюда обращение TfrUn(pcProg.ActivePage.Controls[0]).edX1.SetFocus; проходит нормально. В другом компоненте, который не принадлежит pcProg, вызывается процедура  текущего фрейма на текущей странице pcProg, поиска эдита. Она нашла нужный эдит. Потом я должен передать фокус этому эдиту. Но в этот момент наступает событие pcProg onChange в нём я как раз и передаю фокус нужному эдиту. Может есть какой нибудь другой способ?


 
Юрий Зотов ©   (2016-07-07 21:07) [3]

> Она нашла нужный эдит.

Вот сразу и ставьте ему фокус. Или запомните этот эдит в переменной (только не его имя, а сам эдит), а потом поставите ему фокус, когда потребуется.

И сообщите, что выдает такой код:
ShowMessage(найденный_эдит.Parent.Name);
ShowMessage(найденный_эдит.Owner.Name);


 
Юрий Зотов ©   (2016-07-07 21:12) [4]

> ладельцем фрейма на котором лежат все эдиты я делаю конкретную
> страницу pcProg, на которую выставляю фрейм. Отсюда обращение
> TfrUn(pcProg.ActivePage.Controls[0]).edX1.SetFocus; проходит нормально.

Похоже, Вы путаете владельца и родителя (Owner и Parent).


 
Andrey K   (2016-07-07 21:17) [5]

>запомните этот эдит в переменной (только не его имя, а сам эдит)

Не очень понял. Кого типа должна быть переменная, TEdit? Если можно маленький примерчик вызова. Моя конструкция TfrUn(pcProg.ActivePage.Controls[0]). ... обращения подходит?


 
Andrey K   (2016-07-07 21:23) [6]

Маленькая вилка. На фрейме есть ещё и TMemo. Процедура ищет Sub ещё и в нём. Т.е. переменная типа TEdit не очень подходит. Правда это можно обойти, мне бы с эдитами разобраться.


 
Юрий Зотов ©   (2016-07-07 21:27) [7]

var E: TEdit;

procedure FindEditWithText(Txt: string);
begin
 Находим нужный эдит;
 E := найденный_эдит;
 if E = nil then
   raise Exception.Create("Эдит с текстом " + Txt  +" не найден");
end;


 
Юрий Зотов ©   (2016-07-07 21:30) [8]

Самое главное Вы не сделали:
Сообщите, что выдает такой код:

ShowMessage(найденный_эдит.Parent.Name);
ShowMessage(найденный_эдит.Owner.Name);


 
Andrey K   (2016-07-07 21:30) [9]

Мне то надо найденному эдиту передать фокус.


 
Юрий Зотов ©   (2016-07-07 21:31) [10]

> Мне то надо найденному эдиту передать фокус.

И кто мешает?

E.SetFocus;


 
Andrey K   (2016-07-07 21:32) [11]

Последнее ваше сообщение не увидел. Сейчас попробую.


 
Andrey K   (2016-07-07 21:33) [12]

>И кто мешает?
>E.SetFocus;

Блин, точно.


 
Юрий Зотов ©   (2016-07-07 21:55) [13]

Андрей, если Вы хотите раз и навсегда понять суть проблемы, то ответьте на [8].


 
Andrey K   (2016-07-07 23:47) [14]

Сейчас не могу попробовать [8]. Не у компьютера. Завтра сообщу результат.


 
Andrey K   (2016-07-08 17:25) [15]

ShowMessage(найденный_эдит.Parent.Name); - gbStart
ShowMessage(найденный_эдит.Owner.Name); - pcProg0

gbStart: TGroupBox; - на которой лежит найденный_эдит.
pcProg0- Страничка TPageControl на которой находится фрейм с этим gbStart и эдитом.


 
Юрий Зотов ©   (2016-07-08 18:02) [16]

То есть Owner"ом эдита является страница TPageControl. А Вы путаетесь найти этот эдит на фрейме:

TfrUn(pcProg.ActivePage.Controls[0]).(FindComponent(NamComp) as TEdit).....

Ясно, что ничего найдено не будет.


 
Юрий Зотов ©   (2016-07-08 18:03) [17]

пЫтаетесь


 
Andrey K   (2016-07-08 18:38) [18]

Где то задним умом тему понял. Но пока не знаю как воплотить задуманное.


 
Юрий Зотов ©   (2016-07-08 18:50) [19]

Так уже ведь воплотилось - см. [7] и [10].
И никакие FindComponent не нужны.


 
Andrey K   (2016-07-08 23:56) [20]

Сейчас я не у компьютера. Чисто теоретически, начинаю догонять. Эту переменную надо сделать вообще глобальной а не на фрейме. И тогда сработает E.SetFocus;


 
Andrey K   (2016-07-09 00:19) [21]

Честно говоря, я вобще не заморачивался бы с фокусировкой эдитов. Но в работе этой программы создаётся до 50-и страниц. Генерируются разные параметры. И они могут быть где угодно в мемо или в многочисленных эдитах. И если не указывать явно, где этот параметр, то сильно затрудняется работа.


 
Юрий Зотов ©   (2016-07-09 00:42) [22]

И мемо, и эдит - оба они TCustomEdit. И у обоих есть Text.

Возможно, TCustomEdit и надо искать (а не Edit).


 
Германн ©   (2016-07-09 01:17) [23]

Вопрос еще где и как искать.


 
Andrey K   (2016-07-09 18:33) [24]

Пока выходные попробовать ничего не могу. Только теоретически рассуждать. Вопрос с по с поиском решён. Всё находит. Всё упирается в фокусировку. В мемо нахожу, выделяю. Только дело в эдитах. За подсказку TCustomEdit спасибо.


 
Andrey K   (2016-07-10 10:20) [25]

Добрый день, Юрий. Большое спасибо за участие в решении моей проблемы.
Я не там искал. У меня на форме положено tvSE: TreeView дерево со всей структурой проекта. В нём, в том числе, отображаются искомые параметры. Тыкая по параметру в tvSEMouseUp запускается поисковая процедура и активируется мемо на текущей странице pcProg. По точкам останова, при отладке, выловил что последним в цепочке активации компонентов это pcProgChange. В этом обработчике я пытался активировать найденный эдит. И это была главная ошибка. Перенеся все разборки с фокусировкой в tvSEMouseUp всё заработало. Ваше предложение с переменной E: TEdit сделало код намного лаконичней и понятней.
Ещё раз большое Вам спасибо.



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

Текущий архив: 2018.07.15;
Скачать: CL | DM;

Наверх




Память: 0.53 MB
Время: 0.005 c
15-1473745173
xayam
2016-09-13 08:39
2018.07.15
Посоветуйте программу для записи видео с экрана


1-1358962698
lexdlx
2013-01-23 21:38
2018.07.15
Контроль печати


2-1467899620
Andrey K
2016-07-07 16:53
2018.07.15
Сделать активным компанент


15-1473682378
Тимохов Дима
2016-09-12 15:12
2018.07.15
Авторизация в вебсервисах


15-1472410084
ВладОшин
2016-08-28 21:48
2018.07.15
Никто пострелушками не увлекается?