Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2006.10.08;
Скачать: [xml.tar.bz2];

Вниз

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

 
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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.51 MB
Время: 0.077 c
15-1158242180
ceval
2006-09-14 17:56
2006.10.08
функции - информацию о процессоре и загрузки


1-1155795190
konrads
2006-08-17 10:13
2006.10.08
Доступные принтеры


1-1156769390
DelphiLexx
2006-08-28 16:49
2006.10.08
DoubleBuffered распространять, на определенный участок


2-1158925605
learner
2006-09-22 15:46
2006.10.08
SetLength дла массива Record - в.


2-1158837997
ququ
2006-09-21 15:26
2006.10.08
Move





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский