Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 15.01.2016, 12:12
Gareth Gareth вне форума
Активный
 
Регистрация: 21.03.2013
Адрес: Приднестровье
Сообщения: 202
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию Как правильно сделать?

Привет..

Вопрос в следующем:
Есть форма, которая прячется путем
Код:
form1.hide;
.
На форме таймер, в таймере код:
Код:
var P:TPoint;
...

  {Показывает форму, если курсор находится сверху слева}

 if (Mouse.CursorPos.X<1) and (Mouse.CursorPos.Y<1) then
     begin
      Form1.Show;
     end;


 {скрывает форму если кликнули   НЕ  в форму}
      if  GetAsyncKeyState(VK_LBUTTON)<> 0 then
     begin
       GetCursorPos(P);
       if (P.X > Form1.Left+form1.Width) or (P.y > form1.Top+ Form1.Height) or  (P.Y < Form1.Top) then
       begin
         Form1.Hide;
       end;
     end;
Программа умеет принимать на себя ярлыки (Drag&Drop).
Вся соль в том, что когда беру любой ярлык, неважно откуда, подвожу его в угол, форма появляется и сразу исчезает. Если убрать код проверки клика вне формы - всё получается как надо...

Как можно вылечить данный недуг? Спасибо заранее.
Ответить с цитированием
  #2  
Старый 15.01.2016, 16:16
Аватар для Alegun
Alegun Alegun вне форума
LMD-DML
 
Регистрация: 12.07.2009
Адрес: Богородское
Сообщения: 3,025
Версия Delphi: D7E
Репутация: 1834
По умолчанию

Есть понятие клиентской и неклиентской части формы, они не совпадают по размерам, последняя немного (на толщину рамки с трёх сторон и шапки сверху) больше, а в условии вычисления момента скрытия это видимо и не учитывается - клик идёт формально ПО форме, а фактически НЕ, да ещё и событие "захода" на форму генерится только один раз, а "сдвига" по рамке несколько, возможно нужно добавить флажок как индикатор прохождения этого "терминатора"
Ответить с цитированием
Этот пользователь сказал Спасибо Alegun за это полезное сообщение:
Gareth (15.01.2016)
  #3  
Старый 15.01.2016, 16:30
Gareth Gareth вне форума
Активный
 
Регистрация: 21.03.2013
Адрес: Приднестровье
Сообщения: 202
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию

Цитата:
Сообщение от Alegun
Есть понятие клиентской и неклиентской части формы, они не совпадают по размерам, последняя немного (на толщину рамки с трёх сторон и шапки сверху) больше, а в условии вычисления момента скрытия это видимо и не учитывается - клик идёт формально ПО форме, а фактически НЕ, да ещё и событие "захода" на форму генерится только один раз, а "сдвига" по рамке несколько, возможно нужно добавить флажок как индикатор прохождения этого "терминатора"
Либо я вас не понял, либо вы меня

Как проблему вижу я:
мне кажется, форма появляется и сразу исчезает из-за постоянного if GetAsyncKeyState(VK_LBUTTON)<> 0 then, так как в таймере 2 условия: на то что курсор в углу и то что кнопка зажата... А когда я пытаюсь добавить ярлык(путем drag&drop) эти условия срабатывают обе. От этого мигание формы (появление-скрытие)..
Не знаю как быть.. Обе проверки мне нужны, но как сделать что бы программа поняла, когда я пытаюсь перенести ярлык, а когда я просто ткнул мимо формы?

Есть ли способ проверки клика вне формы, без GetAsyncKeyState ? Это проверка зажата ли кнопка, а мне надо отследить именно клик, а не постоянное зажатое положение мыши.

Последний раз редактировалось Gareth, 15.01.2016 в 16:34.
Ответить с цитированием
  #4  
Старый 15.01.2016, 16:59
Аватар для Alegun
Alegun Alegun вне форума
LMD-DML
 
Регистрация: 12.07.2009
Адрес: Богородское
Сообщения: 3,025
Версия Delphi: D7E
Репутация: 1834
По умолчанию

Цитата:
...Есть ли способ проверки клика вне формы...

Для этого есть API функция GetCapture, пример из drkb
Код:
procedure TForm1.FormDeactivate(Sender: TObject);
begin
ReleaseCapture;
end;

procedure TForm1.FormMouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
begin
If GetCapture = 0 then
   SetCapture(Form1.Handle);

if PtInRect(Rect(Form1.Left,
                  Form1.Top,
                  Form1.Left + Form1.Width,
                  Form1.Top + Form1.Height),
                  ClientToScreen(Point(x, y))) then
Form1.Caption := 'Мышка на форме' else
Form1.Caption := 'Мышка за пределами формы';
end;
Ответить с цитированием
Этот пользователь сказал Спасибо Alegun за это полезное сообщение:
Gareth (15.01.2016)
  #5  
Старый 15.01.2016, 17:42
Gareth Gareth вне форума
Активный
 
Регистрация: 21.03.2013
Адрес: Приднестровье
Сообщения: 202
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию

Цитата:
Сообщение от Alegun
Для этого есть API функция GetCapture, пример из drkb
Код:
procedure TForm1.FormDeactivate(Sender: TObject);
begin
ReleaseCapture;
end;

procedure TForm1.FormMouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
begin
If GetCapture = 0 then
   SetCapture(Form1.Handle);

if PtInRect(Rect(Form1.Left,
                  Form1.Top,
                  Form1.Left + Form1.Width,
                  Form1.Top + Form1.Height),
                  ClientToScreen(Point(x, y))) then
Form1.Caption := 'Мышка на форме' else
Form1.Caption := 'Мышка за пределами формы';
end;
Спасибо! то что надо
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 10:05.


 

Сайт

Форум

FAQ

Соглашения

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2025