Страница 1 из 2

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

Добавлено: 28 сен 2005, 04:52
WorkStudio.
Вообщем такая проблема из-за которой уже несколько дней "ломаю голову".
Есть некоторое кол-во 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]

Добавлено: 28 сен 2005, 08:17
LAngel
А если использовать Sender as вместо ActiveControl as?

Добавлено: 28 сен 2005, 10:36
WorkStudio.
Можно по подробнее... я новичок.
Пробовал Sender as компилятор пишет Undeclared identifier "Sender", буду благодарен за более раскрытый ответ.
Я в танке :)

Добавлено: 28 сен 2005, 10:50
LAngel
Когда используешь метод OnExit в процедуре объявлен Sender: TObject
в который передается Элемент, который вызвал событие. Это и есть то, что тебе надо :) ))

Добавлено: 28 сен 2005, 11:21
WorkStudio.
LAngel ну не мучай :) меня..
Что конкретно тут прописать ? Я просто не знаю и ффсе !
IniFiles.WriteString('Settings',(?????????).Text,'');
Блин, тока не матери :lol:

Добавлено: 28 сен 2005, 12:04
Eugie
В обработчики события 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;

Добавлено: 28 сен 2005, 12:08
Eugie
PS. C ActiveControl не работает, т.к. он меняется ДО посылки CM_EXIT контролу, теряющему фокус.

Добавлено: 28 сен 2005, 17:50
YurikGL
Можно смотреть Taborder текущего (на который фокус перешел) едита и искать едит с предыдущим табордером. Можно и еще каким-нибудь способом Едиты нумеровать что-бы последовательность нумерации совпадала с последовательностью табуляции. Применять действия к предыдущему по нумерации едиту.

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

Eugie пробовал как ты показал, добавляю к процедуре (Sender: Tobject) и вызываю MyProcedure(Sender), сразу появляется масса проблем, т.к это процедура создана для уменьшения кода программы,
и используется как в событиях так и при отлавливании нажатия Tab хуком. Появляются ошибки в программе, типа not enough parameters или Undeclared identifier а менять под корень процедуру нехочеться.
Полюбому есть способ проще.. Но все равно спасибо !
Попробую с Sender покрутить и почитать RTFM..

Добавлено: 29 сен 2005, 20:18
YurikGL
>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.