Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Сделать активным компанент


Страницы:   1 2

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 не очень подходит. Правда это можно обойти, мне бы с эдитами разобраться.


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо