Форум: "Начинающим";
Текущий архив: 2018.07.15;
Скачать: [xml.tar.bz2];
ВнизСделать активным компанент Найти похожие ветки
← →
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;
Скачать: [xml.tar.bz2];
Память: 0.5 MB
Время: 0.002 c