Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 06.11.2008, 14:58   #1
grenles
минимакс
Участник клуба
 
Аватар для grenles
 
Регистрация: 11.06.2008
Сообщений: 1,143
По умолчанию Получить ссылку на вызывающий объект

procedure TFormBl.AllControlsKeyDown(Sender: TObject;
var Key: Word; Shift: TShiftState);
begin
case Key of
13 : begin
SelectNext(Sender as TWinControl, true, true);
Key := 0;
end;
else
begin
Inherited
end
end
end;

Эта процедура вызывается из нескольких объектов типа Edit.
Вопрос - как определить, в какой конкретно объекте возникло событие и откуда оно было вызвано.

Я понимаю, что надо копить Sender. но что-то пока туго. Мне надо получить имя объекта или что-то. однозначто его определяющее.
и это пройдет...
grenles вне форума Ответить с цитированием
Старый 06.11.2008, 15:03   #2
mihali4
*
Старожил
 
Регистрация: 22.11.2006
Сообщений: 9,201
По умолчанию

Ничего копить не надо.
Вызвавший объект = (Sender as TEdit).Name
Для идентификации компонентов формы существует также свойство TAG - вы можете присвоить произвольный, но уникальный номер каждому компоненту и обращаться по этому номеру.

Последний раз редактировалось mihali4; 06.11.2008 в 15:05.
mihali4 вне форума Ответить с цитированием
Старый 06.11.2008, 15:04   #3
NeiL
Пользователь
 
Регистрация: 28.11.2007
Сообщений: 49
По умолчанию

Используй свойство Tag
NeiL вне форума Ответить с цитированием
Старый 06.11.2008, 16:09   #4
grenles
минимакс
Участник клуба
 
Аватар для grenles
 
Регистрация: 11.06.2008
Сообщений: 1,143
По умолчанию УГу

спасибо, токма почему то Sender = () - то есть пустой, зараза.
Ладно, буду думать дальше.
и это пройдет...
grenles вне форума Ответить с цитированием
Старый 06.11.2008, 18:43   #5
mihali4
*
Старожил
 
Регистрация: 22.11.2006
Сообщений: 9,201
По умолчанию

Цитата:
Сообщение от grenles Посмотреть сообщение
спасибо, токма почему то Sender = () - то есть пустой
Цитата:
Эта процедура вызывается из нескольких объектов типа Edit.
Каким образом вы производите вызов?
mihali4 вне форума Ответить с цитированием
Старый 07.11.2008, 08:16   #6
grenles
минимакс
Участник клуба
 
Аватар для grenles
 
Регистрация: 11.06.2008
Сообщений: 1,143
По умолчанию ()

Эта процедура цепляется как обработчик события OnKeyDown
Соответственно, как я понимаю, она вызывается системой или Дельфи и выполняется ранее приведенный код. Вопрос - как при вызове этого обработчика понять, какой объект его сгенерировал.
и это пройдет...
grenles вне форума Ответить с цитированием
Старый 07.11.2008, 09:46   #7
grenles
минимакс
Участник клуба
 
Аватар для grenles
 
Регистрация: 11.06.2008
Сообщений: 1,143
По умолчанию вот нашел

Вот нашел вариант через задние ворота:

Obj := (Sender as TEdit).Hint;
if Obj = 'np00' then PageControlNp.Pages[4].Show;

перед этим в поле Hint добавил "np00"
и это пройдет...
grenles вне форума Ответить с цитированием
Старый 07.11.2008, 09:51   #8
grenles
минимакс
Участник клуба
 
Аватар для grenles
 
Регистрация: 11.06.2008
Сообщений: 1,143
По умолчанию

Столкнулся с проблемой, если
Sender типа TComboBox - выдается исключение.
Ищу условие обхода этого.
Использование
try
...
finally
....
end;
Не решает проблемы.
и это пройдет...
grenles вне форума Ответить с цитированием
Старый 07.11.2008, 09:54   #9
grenles
минимакс
Участник клуба
 
Аватар для grenles
 
Регистрация: 11.06.2008
Сообщений: 1,143
По умолчанию

Вот пока текущее решение

procedure TFormBl.AllControlsKeyDown(Sender: TObject;
var Key: Word; Shift: TShiftState);
var
Obj : TComponentName;
begin
case Key of
13 : begin
SelectNext(Sender as TWinControl, true, true);
Key := 0;
end;
else
begin
if Sender.ClassName = 'TEdit' then
try
Obj := (Sender as TEdit).Hint;
if Obj = 'np000' then PageControlAbonent.Pages[4].Show;
finally
Inherited
end;
end
end
end;
и это пройдет...
grenles вне форума Ответить с цитированием
Старый 07.11.2008, 11:06   #10
mihali4
*
Старожил
 
Регистрация: 22.11.2006
Сообщений: 9,201
По умолчанию

Цитата:
Sender типа TComboBox - выдается исключение.
Ищу условие обхода этого.
Точно так же делайте проверку:
if Sender.ClassName = 'TComboBox' then
mihali4 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как уничтожить объект в C# Никки Общие вопросы .NET 7 30.10.2014 23:54
Вредоносный HTTP-объект Gauss О форуме и сайтах клуба 4 16.04.2008 14:33
Как получить ссылку на файл с файлообенника? S(p)@wN Работа с сетью в Delphi 0 16.08.2007 15:20