Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2006.07.02;
Скачать: [xml.tar.bz2];

Вниз

экран + мышка   Найти похожие ветки 

 
Алексий   (2006-06-06 09:22) [0]

всем привет,появился такой вопрос,заказчику понадобилось чтобы программа пряталсь справа за экраном,и если курсор  поднести к правой части экрана - программа должна "выезжать",подскажите с чем работать,как это должно выглядеть. Спасибо


 
tButton ©   (2006-06-06 09:24) [1]

GetCursorPos
Screen.Width

можно просто полностью её не прятать
тогда
onMouseMove + флаги состояния


 
Loginov Dmitry ©   (2006-06-06 09:46) [2]

Алексий   (06.06.06 9:22)
как это должно выглядеть


Ну наверное так же, как с панелью задач при установке галочки "скрывать автоматически"


 
Алексий   (2006-06-06 09:55) [3]


> Loginov Dmitry

ага,так!
ту  tButton,
делаю в onmove формы
var
P:TPoint;
begin
getcursorpos(P);
дальше как я понимаю надо делать условие что если p.X > там чего то,то включить таймер,в таймере form.left := form.left - 20;
так?


 
Loginov Dmitry ©   (2006-06-06 10:31) [4]

Имхо, тады лучше просто ловить сообщения CM_MOUSEENTER и CM_MOUSELEAVE, а дальше запускать таймер, и по таймеру двигать форму.


 
Алексий   (2006-06-06 11:03) [5]

ок,объявдяю их в private
procedure CMMouseEnter(var msg:TMessage); message CM_MOUSEENTER;
procedure CMMouseLeave(var msg: TMessage); message CM_MOUSELEAVE;

но компилятор ругается
сорри,я новичек еще


 
Loginov Dmitry ©   (2006-06-06 11:12) [6]

Попробуй нажать Ctrl+Shift+C


 
Алексий   (2006-06-06 11:27) [7]


> Попробуй нажать Ctrl+Shift+C

спс,получилось,но почему то работает не совсем правильно,навожу,форма "отъезжает",увожу корсар с формы и она не всегда возаращается на свое место,т.е. не сразу срабатывает onenter
почему?


 
ЮЮ ©   (2006-06-06 11:31) [8]


> навожу,форма "отъезжает",увожу


> почему?


Это что, стандартное поведение форм в Windows или результат работы твоего кода? Потому, что так код написан.


 
Алексий   (2006-06-06 11:33) [9]

в onenter :
form1.Left:=form1.Left-clientwidth;
onleave:
form1.Left:=screen.Width-Width+clientwidth;
form1.Top:=screen.WorkAreaHeight-height;


 
ЮЮ ©   (2006-06-06 11:40) [10]

Чьи clientwidth, Width?
Формулы   в onenter  и в onleave разные и, по-моем, и не должны восстанавливать form1.Left


 
tButton ©   (2006-06-06 11:44) [11]

хм.
я же говорил про onMove + флаги
флаги:
_hiding
_showing
_hiden
_showen

проверяем в онМув флаг
case flag of
_hiding: flag:=_showing; // если форма прячется - заставляем её показываться
_hiden: flag:=_showing; // такая же беда если форма спрятана
end;


в обработчике таймера
case flag of
_hiding: if left<maxleft
          then left:=left+1
          else flag:=_hiden
_showing: if left>minleft
           then left:=left-1
           else flag:=_showen;
end;

maxleft - крайнее правое положение формы
вычисляется заранее исходя из ширины экрана
minleft - крайнее левое положение формы
вычисляется заранее исходя из ширины экрана

это очень примерно, но уже рабочеспособно


 
tButton ©   (2006-06-06 11:49) [12]

а
ещё переход из состояния _showen в состояние _hiding
можно сделать в том же таймере
т.е. в onMove
записываем в глобальную переменную результат функции getTickCount
в таймере считаем разницу между текущим значением getTickCount и запомненым
если больше какого-то определённого значения - меняем флаг


 
Алексий   (2006-06-06 15:53) [13]

tButton, прошу прощения,но я первый раз слышу что такое флаги, где можно на эту тему почитать?
спасибо


 
tButton ©   (2006-06-06 16:34) [14]

=)
обычно - в любом учебнике по программированию, хотя я не знаю что сейчас в учебниках пишут =)

флаг - логическая (boolean) али ещё какая переменная, которая описывает состояние чего-нибудь принимая различные значения. обычно это таки boolean переменные принимающие значения true/false т.е. типа вкл/выкл

твой вариант -
type
 twndflag = (_hiding, _showing, _hiden, _showen);
 ...
 flag: tWndFlag;


забыл, как эта хренотень называется =)
лучше у других по спрашивай =)
у меня проблемы с переводом с Дельфи на русский =)


 
Алексий   (2006-06-06 22:52) [15]

т.е. у меня должно так выгдялеть:
type
 TForm1 = class(TForm)
   Timer1: TTimer;
   procedure FormMouseMove(Sender: TObject; Shift: TShiftState; X,
     Y: Integer);
   procedure Timer1Timer(Sender: TObject);
 private
   { Private declarations }
 public
   { Public declarations }
 end;
type
twndflag = (_hiding, _showing, _hiden, _showen);

var
 Form1: TForm1;
 flag: tWndFlag;

потом
procedure TForm1.FormMouseMove(Sender: TObject; Shift: TShiftState; X,
 Y: Integer);
begin
case flag of
_hiding: flag:=_showing;
_hiden: flag:=_showing; end;
end;
end;

procedure TForm1.Timer1Timer(Sender: TObject);
var
minleft,maxleft:integer;
begin
minleft:=form1.Left;
maxleft:=form1.ClientWidth;
case flag of
_hiding: if left<maxleft
         then left:=left+1
         else flag:=_hiden;
_showing: if left>minleft
          then left:=left-1
          else flag:=_showen;
end;
end;

что не так?


 
Юрий Зотов ©   (2006-06-07 01:20) [16]

См. SHAppBarMessage и APPBARDATA в справке WinAPI.


 
tButton ©   (2006-06-07 01:43) [17]


> minleft:=form1.Left;
> maxleft:=form1.ClientWidth;

как минимум вот это
minleft = screen.width - self.width;
maxleft = screen.width - <сколько_пикселей_формы_должны_торчать_в_виде_корешка>;


 
Алексий   (2006-06-07 14:11) [18]

+ ко всему добавил в oncreate
form1.Left:=screen.Width-Width;
form1.Top:=screen.WorkAreaHeight-height;

поменял
minleft = screen.width - self.width;
maxleft = screen.width - <сколько_пикселей_формы_должны_торчать_в_виде_корешка>;

все норм,как надо,но почему работает только один раз при запуске,т.е. компилю,форма прячется,потом навожу на пиксель форма обратно покаывается и все, потом уже никаких действий не происходит,почему?
тамер то включен,интервал 1


 
tButton ©   (2006-06-08 05:43) [19]


> ещё переход из состояния _showen в состояние _hiding
> можно сделать в том же таймере
> т.е. в onMove
> записываем в глобальную переменную результат функции getTickCount
> в таймере считаем разницу между текущим значением getTickCount
> и запомненым
> если больше какого-то определённого значения - меняем флаг


т.е.
добавляешь глобальную переменную, например lmove: longword;
в onMove добавляешь
lmove:=GetTickCount
в обработчик таймера добавляешь
if abs(GetTickCount-lmove)>3000
 then flag:=_hiding;

т.о.
каждый раз когда ты водишь мышкой по форме у тебя запоминается текущее значение системного таймера
каждый раз в таймере ты считаешь разницу между текущим и запомненым значениями таймера
если разница превышает три секунды (3000мс) - меняешь флаг на _hiding и форма начинает уезжать

но. этот метод не самый верный. пользователь может просто тупить в форму, может вводить какой-то текст
поэтому забывай всё что я сказал =)
и делай так
в таймере проверяй находится ли указатель мыши (GetCursorPos) в пределах формы (получи rect формы + PointInRect) если нет - меняй флаг
если да - не меняй ничего =)
в таком случае форма будет терпеливо ждать пока от неё "уберут руки" =)


 
Loginov Dmitry ©   (2006-06-08 12:09) [20]

object Form1: TForm1
 Left = 192
 Top = 114
 Width = 475
 Height = 480
 Caption = "Form1"
 Color = clSkyBlue
 Font.Charset = DEFAULT_CHARSET
 Font.Color = clWindowText
 Font.Height = -11
 Font.Name = "MS Sans Serif"
 Font.Style = []
 OldCreateOrder = False
 OnCreate = FormCreate
 PixelsPerInch = 96
 TextHeight = 13
 object Timer1: TTimer
   Interval = 100
   OnTimer = Timer1Timer
   Left = 16
   Top = 152
 end
end

unit Unit1;

interface

uses
 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
 Dialogs, StdCtrls, ExtCtrls, AppEvnts;

type
 TForm1 = class(TForm)
   Timer1: TTimer;
   procedure Timer1Timer(Sender: TObject);
   procedure FormCreate(Sender: TObject);
 private
   IsShowing, IsHide, IsHiding: Boolean;
   HideWidth: Integer;

   procedure BeginEnter();
   procedure BeginLeave();
   function MouseInFormRect(): Boolean;
 public
   { Public declarations }
 end;

var
 Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Timer1Timer(Sender: TObject);
begin
 if IsShowing or IsHiding then Exit;

 if MouseInFormRect then
   begin
     if IsHide then BeginEnter;
   end
 else
   BeginLeave
end;

procedure TForm1.BeginEnter;
begin
 IsShowing := True;

 // Здесь можно сделать выезд формы с анимацией
 Left := Screen.WorkAreaWidth - Width;
 
 IsShowing := False;
 IsHide := False;
end;

procedure TForm1.BeginLeave;
begin
 IsHiding := True;

 // Здесь можно сделать "отъезд" формы с анимацией
 Left := Screen.WorkAreaWidth - HideWidth;
 
 IsHiding := False;
 IsHide := True;
end;

function TForm1.MouseInFormRect: Boolean;
var
 MousePos: TPoint;
begin
 GetCursorPos(MousePos);
 if (MousePos.X > Left) and (MousePos.X < Screen.WorkAreaWidth) and
   (MousePos.Y > Top) and (MousePos.Y < Screen.WorkAreaHeight) then
   Result := True
 else
   Result := False;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
 HideWidth := 20;
 Left := Screen.WorkAreaWidth - HideWidth;
 Top := 0;
 Height := Screen.WorkAreaHeight;
 IsHide := True;
end;

end.


 
Алексий   (2006-06-08 20:50) [21]

ок спасибо огромное!,добавил чтобы на секунду была задержка,а потом скрывалась и обратно на 1мсек,еще такой маленький вопросик,как сделать так чтобы не убиралась форма пока используються компоненты на ней,т.е. у меня там Popupmenu вылезает за пределы формы,и она уберается,а меню остается;)


 
tButton ©   (2006-06-09 06:09) [22]


> еще такой маленький вопросик,как сделать так чтобы не убиралась
> форма пока используються компоненты на ней,т.е. у меня там
> Popupmenu вылезает за пределы формы,и она уберается,а меню
> остается;)

* сделать задержку больше и применять её комбинировано с проверкой нахождения мыши в форме
* подогнать попап так чтоб не вылезал с формы или заменить его чем-нибудь другим.


 
ЮЮ ©   (2006-06-09 08:15) [23]

В TPopupMenu.OnPopup отключать таймер, в запускаем действии - включать


 
tButton ©   (2006-06-09 08:45) [24]


> в запускаем действии - включать

а если для каждого действия отдельный обработчик?
хотя тоже решаемо



Страницы: 1 вся ветка

Форум: "Начинающим";
Текущий архив: 2006.07.02;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.52 MB
Время: 0.093 c
8-1130929059
Provodnick
2005-11-02 13:57
2006.07.02
Проблема с тесселяцией многоугольника в OpenGL


2-1150238612
learner
2006-06-14 02:43
2006.07.02
Как отличить PChar от PWideChar ?


15-1149744798
VitV
2006-06-08 09:33
2006.07.02
Умрёт ли дэлфи?


5-1134898951
Vaitek_
2005-12-18 12:42
2006.07.02
Хранение ресурса "внутри" компонента.


2-1149862619
Ladan
2006-06-09 18:16
2006.07.02
MediaPlayer and TrackBar





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский