Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.10.08;
Скачать: CL | DM;

Вниз

Как узнать какое поля ввода потеряло фокус ?   Найти похожие ветки 

 
DmiSb   (2006-09-15 15:54) [0]

Необходимо узнать какое поле потеряло фокус и вернуть его обратно. Пытался использовать событие onEnter.
Заранее спасибо


 
Zeqfreed ©   (2006-09-15 15:56) [1]

Попробуй использовать OnExit.


 
Loginov Dmitry ©   (2006-09-15 15:58) [2]

DmiSb   (15.09.06 15:54)
Необходимо узнать какое поле потеряло фокус и вернуть его обратно


Зверство!


 
Ketmar ©   (2006-09-15 16:07) [3]

это просто поля очень рассеяные. как напьютяс -- давай фокусы терять...


 
Сергей М. ©   (2006-09-15 16:09) [4]


> DmiSb   (15.09.06 15:54)


VCL- контрол, теряющий фокус, возбуждает OnExit.


 
Сивый ©   (2006-09-15 16:22) [5]

"Необходимо узнать какое поле потеряло фокус и вернуть его обратно" - а зачем вообще где-то узнавать про потерю фокуса? Не правильнее ли отслеживать, что бы нужный контрол не терял фокуса?


 
MsGuns ©   (2006-09-15 17:22) [6]

Весь фокус в том, чтобы не потерять фокуса ;)


 
Плохиш ©   (2006-09-15 17:53) [7]


> DmiSb   (15.09.06 15:54)

Ну что понял теперь, что бывает если влазишь в не ту конференцию?


 
RASkov   (2006-09-15 22:51) [8]

процедураВсеЕдитыЕксит(Сендер: Объект);
начало
 если (Сендер как ТЕдит).Текст="" тогда (Сендер как ТЕдит).СетФокус;
конец;

Ну и назначаешь всем Полям ввода (я так понял, что это TEdit"ы) общий обработчик OnExit;


 
RASkov   (2006-09-15 22:58) [9]

procedure TForm1.Edit1Exit(Sender: TObject);
begin
 if (Sender as TEdit).Text = "" then (Sender as TEdit).SetFocus;
end;


 
DprYg ©   (2006-09-16 09:27) [10]


> RASkov   (15.09.06 22:58) [9]
Это не будет работать, точнее не всегда будет работать.
Здесь нужно определить свое сообщение и отправлять его в
обработчике PostMessagе"м.


 
Ketmar ©   (2006-09-16 16:02) [11]

а вообще, если это используется для "запрета покидания контрола, пока не ввели данные", то за такой UI надо расстеливать на восходе. подобные вещи дизайнятся вовсе и не так.


 
RASkov   (2006-09-17 00:52) [12]

Я надеюсь, что автор вопроса в моем ответе найдет для себя ответ на "как узнать какое поле потеряло фокус" и "вернуть его обратно". Конечно, если он применит у себя именно этот способ [9] то См. [11]
Для [10] DprYg ©. В каких случаях не будет работать?


 
DprYg ©   (2006-09-17 10:57) [13]


> В каких случаях не будет работать?
Устанавливать фокус в обработчике, который сам это делает - не есть хорошо. Кстати Винда тоже имеет к этому непосредственное отношение: кто знает, что раньше произойдет - помещение фокуса в другое место или установка в данном. Поэтому по-хорошему нужно ставить свое сообщение в конец их очереди.


 
DmiSb   (2006-09-18 12:20) [14]

Всем спасибо, и кто пытался помочь, и другим.
Прошу прощения за неполно поставленный вопрос.

Есть поля для ввода данных и есть поле для отображения служебной информации (назовем его служебное поле), которое и запрещать совсем не хотелось бы, и фокус туда попадать не должен. Есть вариант запоминать в переменной хендл поля, которое получило фокус, и в случае попадания фокуса в служебное поле, возвращать обратно. Это работает. Но мне хотелось знать, могу ли я узнать в событии OnEnter, из какого поля попал фокус в служебное поле, чтобы вернуть его обратно.


 
Ega23 ©   (2006-09-18 12:26) [15]


> могу ли я узнать в событии OnEnter, из какого поля попал
> фокус в служебное поле, чтобы вернуть его обратно.


Служебное_поле.Enabled:=False;   ?


 
C@N ©   (2006-09-18 12:42) [16]

Удалено модератором


 
DmiSb   (2006-09-18 12:42) [17]

Дык не хочется его Enabled:=False, цвет шрифта становиться серый.
Юзеры попросили сделать "почетче"


 
Ega23 ©   (2006-09-18 12:57) [18]


> Служебное_поле.


Служебное_поле : TStaticText;   ?


 
Наиль ©   (2006-09-18 13:11) [19]


 TForm2 = class(TForm)
  Edit1: TEdit;
  Edit2: TEdit;
 public
  function SetFocusedControl(Control: TWinControl): Boolean; override;
...
function TForm2.SetFocusedControl(Control: TWinControl): Boolean;
begin
Caption:="Из "+ActiveControl.Name+" в "+Control.Name;
result:=inherited SetFocusedControl(Control);
end;



 
DmiSb   (2006-09-18 13:15) [20]

>TStaticText
Тоже не могу, у меня используется TMemo  с вертикальным скролом, потому как информации может быть много строк.

Эх-х-х. Ладно, оставлю вариант с запоминанием хендла текщего контрола.


 
RASkov   (2006-09-18 16:08) [21]

DmiSb   (18.09.06 13:15) [20]
Вот попробуй так, положи TPanel а на нее TEdit, у панели свойствами поиграй, сделай без рамки и Panel1.Enabled:=False;
Все, если у Edita.enable:=True; и выставлен красивый фонт то он так и будет отоброжаться а доступа к нему не будет. Вот.


 
RASkov   (2006-09-18 16:38) [22]

Хотя для мемо так не пойдет... т.е. не пойдет прокрутка...


 
RASkov   (2006-09-18 17:38) [23]

Создай новое приложение с одной формой, кинь на форму панель на нее TEdit c именем Edit1, затем 5 шт. TEdit"ов прямо на форму, и одно TMemo тоже на форму, затем удали весь текст из редактора кода и вставь тот что ниже и на последок перед запуском кликни по форме два раза (задействуй обработчик OnCreate у формы) и F9;
(Авось и то)
unit Unit1;
interface
uses
 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
 Dialogs, StdCtrls, ExtCtrls;

type
 TForm1 = class(TForm)
   Panel1: TPanel;
   Edit1: TEdit; //Должен быть на панели
   Edit2: TEdit;
   Edit3: TEdit;
   Edit4: TEdit;
   Edit5: TEdit;
   Edit6: TEdit;
   Memo1: TMemo;
   procedure FormCreate(Sender: TObject);
   procedure EditsExit(Sender: TObject);
   procedure MemoEnter(Sender: TObject);
 private
   LastEdit: TEdit;
   { Private declarations }
 public
   { Public declarations }
 end;

var
 Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
 LastEdit:=nil;
 //Все это можно и в инспекторе настроить
 Edit1.Font.Color:= clRed;
 Edit1.Font.Size:=  25;
 Panel1.AutoSize:=  True;
 Panel1.Enabled:=   False;
 Panel1.BevelOuter:=bvNone;
 Edit2.OnExit  := EditsExit;
 Edit3.OnExit  := EditsExit;
 Edit4.OnExit  := EditsExit;
 Edit5.OnExit  := EditsExit;
 Edit6.OnExit  := EditsExit;
 Memo1.OnEnter := MemoEnter;
end;

procedure TForm1.EditsExit(Sender: TObject);
begin
 LastEdit:=(Sender as TEdit);
end;

procedure TForm1.MemoEnter(Sender: TObject);
begin
 if LastEdit<>nil then LastEdit.SetFocus;
end;

end.


 
RASkov   (2006-09-18 17:41) [24]

Блин, забыл код выделить...
все что написано после(ниже) (Авось и то)....
Сорри...


 
DmiSb   (2006-09-19 14:46) [25]

2 RASkov
Спасибо за помошь, но ты говоришь  том  что я уже сделал.

var CurControl: THandle;

procedure TMainF.Edit1Enter(Sender: TObject);
begin
 CurControl:=TWinControl(Sender).Handle;
end;

procedure TMainF.Memo1Enter(Sender: TObject);
begin
 windows.SetFocus(CurControl);
end;

Позволяет не думать о том, чем является текущий компонент TEdit или TComboBox, или еще что.

Но мне было интереcно, есть ли другой путь


 
Наиль ©   (2006-09-19 14:52) [26]

[19] попробывал?
Результат смотри в заголовке формы.



Страницы: 1 вся ветка

Текущий архив: 2006.10.08;
Скачать: CL | DM;

Наверх




Память: 0.53 MB
Время: 0.035 c
15-1158389244
cyborg
2006-09-16 10:47
2006.10.08
старые программы тесты


15-1158660878
cyborg
2006-09-19 14:14
2006.10.08
Мифы индейцев Южной Америки


15-1158209832
cyborg
2006-09-14 08:57
2006.10.08
линейки памяти DDR3


2-1158566667
непонимающий
2006-09-18 12:04
2006.10.08
динамические массивы


2-1158906189
qp
2006-09-22 10:23
2006.10.08
Build with runtime package - зачем?