Текущий архив: 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.5 MB
Время: 0.047 c