Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 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.001 c
2-1468142323
Кирилов. А.С.
2016-07-10 12:18
2018.07.15
Авторизация на сайте


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


15-1473498366
xayam
2016-09-10 12:06
2018.07.15
Как решить такое уравнение относительно t ?


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


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





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский