![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как узнать какое поля ввода потеряло фокус ?
DmiSb © (2006-09-15 15:54:00)Необходимо узнать какое поле потеряло фокус и вернуть его обратно. Пытался использовать событие onEnter.
Заранее спасибо
Наиль (2006-09-19 14:52:00) [1][19] попробывал?
Результат смотри в заголовке формы.
DmiSb (2006-09-19 14:46:00) [2]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но, есть ли другой путь
RASkov (2006-09-18 17:41:00) [3]Блин, забыл код выделить...
все что написано после(ниже) (Авось и то)....
Сорри...
RASkov (2006-09-18 17:38:00) [4]Создай новое приложение с одной формой, кинь на форму панель на нее 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 16:38:00) [5]Хотя для мемо так не пойдет... т.е. не пойдет прокрутка...
RASkov (2006-09-18 16:08:00) [6]DmiSb (18.09.06 13:15) [20]
Вот попробуй так, положи TPanel а на нее TEdit, у панели свойствами поиграй, сделай без рамки и Panel1.Enabled:=False;
Все, если у Edita.enable:=True; и выставлен красивый фонт то он так и будет отоброжаться а доступа к нему не будет. Вот.
DmiSb (2006-09-18 13:15:00) [7]>TStaticText
Тоже не могу, у меня используется TMemo с вертикальным скролом, потому как информации может быть много строк.
Эх-х-х. Ладно, оставлю вариант с запоминанием хендла текщего контрола.
Наиль (2006-09-18 13:11:00) [8]
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;
Ega23 (2006-09-18 12:57:00) [9]
> Служебное_поле.
Служебное_поле : TStaticText; ?
DmiSb (2006-09-18 12:42:00) [10]Дык не хочется его Enabled:=False, цвет шрифта становиться серый.
Юзеры попросили сделать "почетче"
C@N (2006-09-18 12:42:00) [11]Удалено модератором
Ega23 (2006-09-18 12:26:00) [12]
> могу ли я узнать в событии OnEnter, из какого поля попал
> фокус в служебное поле, чтобы вернуть его обратно.
Служебное_поле.Enabled:=False; ?
DmiSb (2006-09-18 12:20:00) [13]Всем спасибо, и кто пытался помочь, и другим.
Прошу прощения за неполно поставленный вопрос.
Есть поля для ввода данных и есть поле для отображения служебной информации (назовем его служебное поле), которое и запрещать совсем не хотелось бы, и фокус туда попадать не должен. Есть вариант запоминать в переменной хендл поля, которое получило фокус, и в случае попадания фокуса в служебное поле, возвращать обратно. Это работает. Но мне хотелось знать, могу ли я узнать в событии OnEnter, из какого поля попал фокус в служебное поле, чтобы вернуть его обратно.
DprYg (2006-09-17 10:57:00) [14]
> В каких случаях не будет работать?
Устанавливать фокус в обработчике, который сам это делает - не есть хорошо. Кстати Винда тоже имеет к этому непосредственное отношение: кто знает, что раньше произойдет - помещение фокуса в другое место или установка в данном. Поэтому по-хорошему нужно ставить свое сообщение в конец их очереди.
RASkov (2006-09-17 00:52:00) [15]Я надеюсь, что автор вопроса в моем ответе найдет для себя ответ на "как узнать какое поле потеряло фокус" и "вернуть его обратно". Конечно, если он применит у себя именно этот способ [9] то См. [11]
Для [10] DprYg ©. В каких случаях не будет работать?
Ketmar (2006-09-16 16:02:00) [16]а вообще, если это используется для "запрета покидания контрола, пока не ввели данные", то за такой UI надо расстеливать на восходе. подобные вещи дизайнятся вовсе и не так.
DprYg (2006-09-16 09:27:00) [17]
> RASkov (15.09.06 22:58) [9]
Это не будет работать, точнее не всегда будет работать.
Здесь нужно определить свое сообщение и отправлять его в
обработчике PostMessagе'м.
RASkov (2006-09-15 22:58:00) [18]
procedure TForm1.Edit1Exit(Sender: TObject);
begin
if (Sender as TEdit).Text = '' then (Sender as TEdit).SetFocus;
end;
RASkov (2006-09-15 22:51:00) [19]процедураВсеЕдитыЕксит(Сендер: Объект);
начало
если(Сендер как ТЕдит).Текст='' тогда(Сендер как ТЕдит).СетФокус;
конец;
Ну и назначаешь всем Полям ввода (я так понял, что это TEdit'ы) общий обработчик OnExit;
Плохиш (2006-09-15 17:53:00) [20]
> DmiSb (15.09.06 15:54)
Ну что понял теперь, что бывает если влазишь в не ту конференцию?