Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C++ Builder > Активность главного окна


Автор: Maycal 12.1.2008, 14:32
Доброе время суток. Скажите пожалуйста, как сделать так, чтобы метод выполнялся только в том случае, если форма активна? 

Автор: Lazin 12.1.2008, 14:51
Наверное определив активна-ли форма или нет..
TForm::Active

Добавлено через 38 секунд
Код

if (myForm->Active)
{
  my_method();
}

Автор: Maycal 12.1.2008, 15:06
Спасибо. Это я собственно к чему спросил: есть метод, который перехватывает нажатие кнопок control+v. Метод описан в ApplicationEvents1Message:
Код

void __fastcall TForm1::ApplicationEvents1Message(tagMSG &Msg,
      bool &Handled)
{
RHKret = RegisterHotKey(Edit1->Handle, 0x12F, MOD_CONTROL, VK_V);
if (Msg.message == WM_HOTKEY)
{
if (Msg.wParam == 0x12F)
{
ShowMessage ("Кнопка перехвачена");
}
}
}

но дело в том, что сочитание этих клавиш, кроме как в моей программе - нигде не работает.
То есть невозможно что-либо скопировать используя сочитание ctrl + v.
Я думал что выйду из этого положения следующим образом: если форма активна, то нажатие кнопок регестрируется, если не активна - метод игнорируется. Но так не получается. 
Единственное что, просто сообщение ShowMessage ("Кнопка перехвачена"); не появляется, а кнопки по прежнему не хотят работать в других приложениях. Что можно сделать?  

Автор: Maycal 12.1.2008, 21:57
Как сделать локальный перехват нажатия клавишь? 

Автор: artsb 12.1.2008, 22:15
Что подразумевается под "локальный"?

Автор: Maycal 12.1.2008, 22:29
Чтобы клавиши перехватывались только в моей программе, а не вовсей винде

Автор: artsb 12.1.2008, 22:36
Они и так будут перехватываться только в твоей программе.

Автор: Maycal 13.1.2008, 00:01
нет, в том то и дело, что сочитание клавишь ctrl+V не работают в винде. Не в форуме, не в чате, не в ворде, неработает из-за этой функции. Появляется сообщение ShowMessage ("Кнопка перехвачена");
А должно быть только в программе, тоесть не влиляло на работу винды

Автор: artsb 13.1.2008, 00:53
Обрабатывайте всё здесь:
Код

void __fastcall TForm1::FormKeyPress(TObject *Sender, char &Key)
{

}

и проблем быть не должно.

ЗЫ не забудте только поставить KeyPreview в true.

Автор: Maycal 13.1.2008, 00:59
Ябы с удовольствием, но не знаю кода кнопочки control...

Добавлено через 1 минуту и 37 секунд
смотрел в таблицах, сказано что код кнопки 17, но он не работает

Добавлено через 1 минуту и 58 секунд
KeyPreview в true

Автор: artsb 13.1.2008, 08:56
Тогда так:
Код

void __fastcall TForm1::FormKeyDown(TObject *Sender, WORD &Key,
      TShiftState Shift)
{
if(Shift.Contains(ssCtrl))
{
        if(Key==86)  ShowMessage("Ctrl+V");
}
}

Кстати, сработало без KeyPreview=true.

Автор: Maycal 13.1.2008, 13:01
Спасибо большое! У меня такая проблема: когда нажимаешь сочитание клавишь (Ctrl+ X) то в Edit1 появляются непонятные символы. Как этого избежать?

Автор: artsb 13.1.2008, 14:43
А что вы делаете этим сочетанием клавиш? Работаете с буфером? Как? Покажите код.

Автор: Maycal 13.1.2008, 15:04
Код

int g = 0;
if(Clipboard()->HasFormat(CF_TEXT))
{
Odni3 = true;
int BufferSize = Clipboard()->AsText.Length() + 1;
char *Buffer = new char[BufferSize];
ZeroMemory(Buffer, BufferSize);
Clipboard()->GetTextBuf(Buffer, BufferSize);
int i, z;
for(i = 0; i < BufferSize - 1; i++)
for(z = 0; z < BufferSize; z++)
if(IsCharAlpha(Buffer[i]) || Buffer[i] == '!' || Buffer[i] == '+' || Buffer[i] == '*' || Buffer[i] == '/' || Buffer[i] == '.' || Buffer[i] == ','
|| Buffer[i] == '@' || Buffer[i] == '"' || Buffer[i] == '#' || Buffer[i] == '¹' || Buffer[i] == '$'
|| Buffer[i] == ';' || Buffer[i] == '%' || Buffer[i] == '^' || Buffer[i] == ':' || Buffer[i] == '?'
|| Buffer[i] == '&' || Buffer[i] == '*' || Buffer[i] == '(' || Buffer[i] == ')' || Buffer[i] == '='
|| Buffer[i] == '`' || Buffer[i] == '~' || Buffer[i] == '|' || Buffer[i] == '<' || Buffer[i] == '>')
{
g++;
if (g < 2)
{
Odni = true;
}
if (Odni == true)
{
Application->MessageBoxA("Â ïîëå ìîæíî êîïèðîâàòü òîëüêî öèôðû", "Îøèáêà", 0+48);
Odni = false;
Odni2 = true;
}
}
if (Odni2 == false)
{
int x = 20 - z;
int y = x * -1;
if (i <= 19)
{
Edit1->Text = Clipboard()->AsText;
}
else
{
Edit1->Text = Clipboard()->AsText.Delete(Edit1->Text.Length(), y);
}
}
}
if (Odni2 = true)
{
Odni2 = false;
}
if (Odni3 != true)
{
Application->MessageBoxA("Â ïîëå ìîæíî êîïèðîâàòü òîëüêî öèôðû", "Îøèáêà", 0+48);
}
Odni3 = false;
}

P.S здесь еще разные системы предотвращения вставки алфавитного символа, вставки данных кроме текста, ограничение по длине числа и т.д

Автор: artsb 13.1.2008, 15:49
Всё что вы вставляете закорючки или только некоторые символы? Как вы копируете в буфер?

Автор: Maycal 13.1.2008, 19:08
В поле Edit1 разрешается копировать только числа.
Метод который копирует в буфер обмена:
Код

Clipboard()->AsText = Edit1->Text;

Метод который вызывает из буфера обмена:
Код

Edit1->Text = Clipboard()->AsText;

Как мне сделать чтобы при нажатие сочитания клавишь ctrl+v непонятных знаков в Edit1 не появлялось? 

Автор: artsb 13.1.2008, 19:49
Многие компоненты поддерживают работу с буфером.
Если вы копируете из какого-то компонента (например, Edit'а), то лучше так:
Код

Edit1->CopyToClipboard();

И вставляете из буфера также:
Код

Edit1->PasteFromClipboard();

Автор: Maycal 14.1.2008, 15:53
Появление непонятных символов, является побочным эффектом метода ограничения ввода в Edit1. Для ограничения реализуется метод Edit1KeyPress/
Например, при сочетание клавишь Ctrl+v появляется . Скажите, как можно так сделать, чтобы после появляея числа в Edit1 этот символ удалялся? Или как-то по другому можно это решить? 

Автор: artsb 14.1.2008, 18:03
Цитата(Maycal @  14.1.2008,  15:53 Найти цитируемый пост)
при сочетание клавишь Ctrl+v появляется

Да не может такого быть...
Показывайте OnKeyPrees.

Кстати, OnKeyDown решили не пользоваться?

Автор: Maycal 15.1.2008, 01:01
Всем огромное спасибо за участие в темах! Я решил проблему перекочевав метод из FormKeyPress в метод FormKeyDown и немного изменив его. 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)