Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Focus 
:(
    Опции темы
brb
Дата 10.2.2003, 06:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 190
Регистрация: 7.1.2003

Репутация: нет
Всего: нет



Как, по-простому, и можно ли, вообще, узнать куда уходит или откуда пришел фокус?
Спасибо
PS Я пришел к этой задаче от следующей. Есть чек-бокс. Когда он чекнут должно открыться(сделаться видимым) поле текстового ввода. На анчек, то поле должно обнулиться и закрыться(сделаться невидимым) . Кроме того, если по выходу из текстового поля оно пустое, надо анчекнуть чек-бокс и закрыть текстовое поле. Ниже привожу код, но он меня не вполне удовлетворяет - отсюда и вопрос.
Код


class TForm1 : public TForm
{
__published: // IDE-managed Components
TCheckBox *cb;
TEdit *edt;
TButton *Button1;  // 4 testing only
void __fastcall cbClick(TObject *Sender);
void __fastcall edtExit(TObject *Sender);
void __fastcall cbEnter(TObject *Sender);
private: // User declarations
   bool cbf;
public:  // User declarations
__fastcall TForm1(TComponent* Owner);
};

//---------------------------------------------------------------------------
void __fastcall TForm1::cbClick(TObject *Sender)
{
  if (cbf) return;
  edt->Visible = cb->Checked;
  if (edt->Visible)edt->SetFocus();
  else edt->Text = "";
}
//---------------------------------------------------------------------------
void __fastcall TForm1::edtExit(TObject *Sender)
{
  if (edt->Text.IsEmpty()){
     edt->Visible = false;
     cbf = true;
     cb->Checked = false;
  }
}
//---------------------------------------------------------------------------
void __fastcall TForm1::cbEnter(TObject *Sender)
{
  if (cbf)cb->Checked = true;
  cbf = false;
}
//---------------------------------------------------------------------------

--------------------
Сказки - удивительная вещь! Самое удивительное, что в них верят только маленькие дети, которым их рассказывают мамы и мамы, которым их рассказывают подросшие дети.
PM MAIL   Вверх
Vit
Дата 10.2.2003, 11:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Vitaly Nevzorov
****


Профиль
Группа: Экс. модератор
Сообщений: 10964
Регистрация: 25.3.2002
Где: Chicago

Репутация: нет
Всего: 207



Первое, что приходит на ум и самое простое решение - пишем свой компонент, который объединяет CheckBox и Edit в некий свой собственный компонент с своим характерным поведением. Собственно сила ООП именно в таких решениях. А ещё свойство формы ActiveControl указывает на контрол, на котором находится фокус.


--------------------
With the best wishes, Vit
I have done so much with so little for so long that I am now qualified to do anything with nothing
Самый большой Delphi FAQ на русском языке здесь: www.drkb.ru
PM MAIL WWW ICQ   Вверх
brb
Дата 10.2.2003, 14:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 190
Регистрация: 7.1.2003

Репутация: нет
Всего: нет



Не уверен, чтл это самое простое...Про силу в своем, по меньшей мере, неоднозначно. Написание собственных компонентов, ПО-МОЕМУ, должно происходить либо от их уникальности(нет близких аналогов), либо, наоборот, массовости - нужно через одного или проходит насквозь через весь проект. Данный пример ни под то, ни под другое определение не попадает. Тут, скорее всего, я просто не вижу элементарного алгоритмического решения. Собственно, полный код и приведен для любопытствующих.
--------------------
Сказки - удивительная вещь! Самое удивительное, что в них верят только маленькие дети, которым их рассказывают мамы и мамы, которым их рассказывают подросшие дети.
PM MAIL   Вверх
Vyacheslav
Дата 10.2.2003, 21:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 2124
Регистрация: 25.3.2002
Где: Москва

Репутация: 9
Всего: 59



TScreen::OnActiveControlChange не поможет делу?




--------------------
С уважением, Вячеслав Ермолаев
PM MAIL WWW ICQ   Вверх
brb
Дата 10.2.2003, 22:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 190
Регистрация: 7.1.2003

Репутация: нет
Всего: нет



Vyacheslav,
я боюсь, что не понял идеи... Дело в том, что код, приведенный мною, требует лишнего клика если фокус приходит с любого 3-го объекта. Потому мне и надо знать куда/откуда уходит/приходит фокус или найти лучший алгоритм
--------------------
Сказки - удивительная вещь! Самое удивительное, что в них верят только маленькие дети, которым их рассказывают мамы и мамы, которым их рассказывают подросшие дети.
PM MAIL   Вверх
Vit
Дата 11.2.2003, 00:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Vitaly Nevzorov
****


Профиль
Группа: Экс. модератор
Сообщений: 10964
Регистрация: 25.3.2002
Где: Chicago

Репутация: нет
Всего: 207



Цитата(brb @ 10.2.2003, 05:02)
Написание собственных компонентов, ПО-МОЕМУ, должно происходить либо от их уникальности(нет близких аналогов), либо, наоборот, массовости - нужно через одного или проходит насквозь через весь проект.

Это так, но гораздо более частой причиной написания компонентов является инкапсуляция - здесь как раз классический пример, когда инкапсуляция позволит легко и красиво решить задачу.


--------------------
With the best wishes, Vit
I have done so much with so little for so long that I am now qualified to do anything with nothing
Самый большой Delphi FAQ на русском языке здесь: www.drkb.ru
PM MAIL WWW ICQ   Вверх
Vyacheslav
Дата 11.2.2003, 02:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 2124
Регистрация: 25.3.2002
Где: Москва

Репутация: 9
Всего: 59



Ну что-то вроде этого, если я правильно понял.
Код

class TForm1 : public TForm
{
TWinControl* PrevControl;
//...
};

void __fastcall TForm1::TForm1(TComponent* Owner)
       TForm(Owner)
{
 Screen->OnActiveControlChange = ChangeFocus;
PrevControl = ActiveControl;
}
//событие по смене фокуса
void __fastcall TForm1::ChangeFocus(TObject *Sender)
{
//здесь мы получили на коротокое время до следующего присвоения
//различать от кого и к кому перешел фокус
if (PrevControl == ...  &&  ActiveControl == ...)
{
// что- то делаем
 }  
 
PrevControl = ActiveControl;
}




--------------------
С уважением, Вячеслав Ермолаев
PM MAIL WWW ICQ   Вверх
brb
Дата 11.2.2003, 02:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 190
Регистрация: 7.1.2003

Репутация: нет
Всего: нет



Vyacheslav
Как сочетается это и это
Код

Screen->OnActiveControlChange = ChangeFocus;

Код

void __fastcall TForm1::ChangeFocus(TObject *Sender)

А далее, в соответствии с моим примером
Код

if (PrevControl == cb  &&  ActiveControl == edt) //я правильно понял?

спасибо.
--------------------
Сказки - удивительная вещь! Самое удивительное, что в них верят только маленькие дети, которым их рассказывают мамы и мамы, которым их рассказывают подросшие дети.
PM MAIL   Вверх
Vyacheslav
Дата 11.2.2003, 20:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 2124
Регистрация: 25.3.2002
Где: Москва

Репутация: 9
Всего: 59



Цитата

Как сочетается это и это

TScreen::OnActiveControlChange - событие, которое возникает при смене фокуса имеет тип
Код

typedef void __fastcall (__closure *TNotifyEvent)(System::TObject* Sender);


В Builder'е это всего лишь указатель на метод объекта (подчеркиваю, не класса, а конкретного объекта - это расширение С++), т.к в отличие от обычного указателя содержит не только указатель на функцию но и на сам объект( всего длина 8 байт). Объявляется на Builder c помощью ключевого слова __closure. Т.е кодом
Код
 
Screen->OnActiveControlChange = ChangeFocus;

я указателю на метод объекта присваиваю указатель на ChangeFocus, который как раз и является таким методом.
Цитата

void __fastcall TForm1::ChangeFocus(TObject *Sender)

Аналогичную ситуацию ты проделываешь каждый раз, когда в дизайне задаешь обработчики событий. Просто здесь обработчкик присваивается не в дизайне, а во время исполнения.
Надеюсь, я ответил на твой вопрос

Код

if (PrevControl == cb  &&  ActiveControl == edt) //я правильно понял?

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








--------------------
С уважением, Вячеслав Ермолаев
PM MAIL WWW ICQ   Вверх
brb
Дата 12.2.2003, 00:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 190
Регистрация: 7.1.2003

Репутация: нет
Всего: нет



А вот это то, что я хотел!
Код

//---------------------------------------------------------------------------
#ifndef chkboxH
#define chkboxH
//---------------------------------------------------------------------------
#include <vcl\Classes.hpp>
#include <vcl\Controls.hpp>
#include <vcl\StdCtrls.hpp>
#include <vcl\Forms.hpp>
//---------------------------------------------------------------------------
class TForm1 : public TForm
{
__published: // IDE-managed Components
TButton *Button1;
TGroupBox *GroupBox1;
TCheckBox *cb;
TEdit *edt;
void __fastcall cbClick(TObject *Sender);
void __fastcall edtExit(TObject *Sender);
void __fastcall cbEnter(TObject *Sender);
void __fastcall GroupBox1Exit(TObject *Sender);
private: // User declarations
   bool cbf;
public:  // User declarations
__fastcall TForm1(TComponent* Owner);
};
//---------------------------------------------------------------------------
extern TForm1 *Form1;
//---------------------------------------------------------------------------
#endif

Код
//---------------------------------------------------------------------------
#include <vcl\vcl.h>
#pragma hdrstop

#include "chkbox.h"
//---------------------------------------------------------------------------
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm1::cbClick(TObject *Sender)
{
  if (cbf) return;
  edt->Visible = cb->Checked;
  if (edt->Visible)edt->SetFocus();
  else edt->Text = "";
}
//---------------------------------------------------------------------------
void __fastcall TForm1::edtExit(TObject *Sender)
{
  if (edt->Text.IsEmpty()){
     edt->Visible = false;
     cbf = true;
     cb->Checked = false;
  }
}
//---------------------------------------------------------------------------
void __fastcall TForm1::cbEnter(TObject *Sender)
{
  if (cbf)cb->Checked = true;
  cbf = false;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::GroupBox1Exit(TObject *Sender)
{
  cbf = false;
}

--------------------
Сказки - удивительная вещь! Самое удивительное, что в них верят только маленькие дети, которым их рассказывают мамы и мамы, которым их рассказывают подросшие дети.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0506 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.