Как программно определить...

Модераторы: Duncon, Naeel Maqsudov, Игорь Акопян, Хыиуду

WorkStudio.
Сообщения: 5
Зарегистрирован: 28 сен 2005, 03:43
Откуда: Yakutsk

Вообщем такая проблема из-за которой уже несколько дней "ломаю голову".
Есть некоторое кол-во Edit'ов, которые при нажатии enter и tab выполняют определенную процедуру и передают фокус к следующему компоненту, мне нужно чтобы в событии OnExit компонентов Edit, выполнялась та же процедура, что и при нажатии Enter и Tab, но получается так, что фокус передается быстрее чем выполняется сама процедура, а процедура должна внести данные из активного компонента в файл.
Вот кусок процедуры, который надо отладить.

if (ActiveControl as TCombobox).Text<>'' then begin
IniFiles.WriteString('Settings',(ActiveControl as TCombobox).Text,'');
Если подробнее то схема неправильной работы такова: Ввод данных в Edit, затем происходит событие OnExit (мышью например), вызывается процедура часть которой описана выше, фокус переходит на следующий компонент, и соответственно данные записываются в файл с этого активного компонента, а надо чтобы до перехода фокуса произошло действие:

IniFiles.WriteString('Settings',(ActiveControl as TCombobox).Text,'');


Вообщем, нужна ваша помощь. [/quote]
Your Bunny Wrote MYDOCU~
Аватара пользователя
LAngel
Сообщения: 277
Зарегистрирован: 30 мар 2005, 08:19
Откуда: Ульяновск
Контактная информация:

А если использовать Sender as вместо ActiveControl as?
С уважением, Lost Angel...
WorkStudio.
Сообщения: 5
Зарегистрирован: 28 сен 2005, 03:43
Откуда: Yakutsk

Можно по подробнее... я новичок.
Пробовал Sender as компилятор пишет Undeclared identifier "Sender", буду благодарен за более раскрытый ответ.
Я в танке :)
Your Bunny Wrote MYDOCU~
Аватара пользователя
LAngel
Сообщения: 277
Зарегистрирован: 30 мар 2005, 08:19
Откуда: Ульяновск
Контактная информация:

Когда используешь метод OnExit в процедуре объявлен Sender: TObject
в который передается Элемент, который вызвал событие. Это и есть то, что тебе надо :) ))
С уважением, Lost Angel...
WorkStudio.
Сообщения: 5
Зарегистрирован: 28 сен 2005, 03:43
Откуда: Yakutsk

LAngel ну не мучай :) меня..
Что конкретно тут прописать ? Я просто не знаю и ффсе !
IniFiles.WriteString('Settings',(?????????).Text,'');
Блин, тока не матери :lol:
Your Bunny Wrote MYDOCU~
Eugie
Сообщения: 708
Зарегистрирован: 17 фев 2004, 23:59
Откуда: SPb

В обработчики события OnExit каждого Edit'a вставь такой код (пример для Edit1):

Код: Выделить всё

procedure TForm1.Edit1Exit(Sender: TObject);
begin
  DoWhatYouNeed(Sender);
end;
В процедуре DoWhatYouNeed делаешь то, что тебе нужно:

Код: Выделить всё

procedure DoWhatYouNeed(Sender: TObject);
begin
  IniFiles.WriteString('Settings',(Sender as TEdit).Text,'');
end;
Eugie
Сообщения: 708
Зарегистрирован: 17 фев 2004, 23:59
Откуда: SPb

PS. C ActiveControl не работает, т.к. он меняется ДО посылки CM_EXIT контролу, теряющему фокус.
YurikGL
Сообщения: 142
Зарегистрирован: 16 фев 2005, 21:54
Откуда: Уфа
Контактная информация:

Можно смотреть Taborder текущего (на который фокус перешел) едита и искать едит с предыдущим табордером. Можно и еще каким-нибудь способом Едиты нумеровать что-бы последовательность нумерации совпадала с последовательностью табуляции. Применять действия к предыдущему по нумерации едиту.
WorkStudio.
Сообщения: 5
Зарегистрирован: 28 сен 2005, 03:43
Откуда: Yakutsk

YurikGL писал(а):Можно смотреть Taborder текущего (на который фокус перешел) едита и искать едит с предыдущим табордером. Можно и еще каким-нибудь способом Едиты нумеровать что-бы последовательность нумерации совпадала с последовательностью табуляции. Применять действия к предыдущему по нумерации едиту.
Хмм.. и как я сам не допер :? Надо попробовать !

Eugie пробовал как ты показал, добавляю к процедуре (Sender: Tobject) и вызываю MyProcedure(Sender), сразу появляется масса проблем, т.к это процедура создана для уменьшения кода программы,
и используется как в событиях так и при отлавливании нажатия Tab хуком. Появляются ошибки в программе, типа not enough parameters или Undeclared identifier а менять под корень процедуру нехочеться.
Полюбому есть способ проще.. Но все равно спасибо !
Попробую с Sender покрутить и почитать RTFM..
Your Bunny Wrote MYDOCU~
YurikGL
Сообщения: 142
Зарегистрирован: 16 фев 2005, 21:54
Откуда: Уфа
Контактная информация:

>WorkStudio.
Глянь еще
FindComponent method (TComponent)
Indicates whether a given component is owned by the component.

Delphi syntax:

function FindComponent(const AName: string): TComponent;

Description

FindComponent returns the component in the Components property array with the name that matches the string in the AName parameter. Use FindComponent to determine whether a given component is owned by another.

Component name matches are not case sensitive.
Ответить