Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Мышь drag-drop в аналоге RAdmin

36K
07 июля 2011 года
Pcrepair
64 / / 16.01.2011
Добрый день!
потихоньку идет разработка аналога РАдмин, в рамках одного проекта в среде D2010 ИНДИ10
на текущий день есть код переноса отжатия кнопок мыши с клиента на сервер в компоненте ИМЕДЖ1, в котором отображается скрин экрана сервера, все работает

КЛИЕНТ
Код:
procedure TForm1.Image1MouseUp(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
  if Button=mbLeft then
  begin
   IdTCPClient1.Host:=HOST.Text;
   IdTCPClient1.Port:=StrToInt(PortNumber.Text);
   IdTCPClient1.Connect;
   IdTCPClient1.IOHandler.WriteLn('mouse_left ');
   IdTCPClient1.Disconnect;
  end;
 if Button=mbRight then
 begin
   IdTCPClient1.Host:=HOST.Text;
   IdTCPClient1.Port:=StrToInt(PortNumber.Text);
   IdTCPClient1.Connect;
   IdTCPClient1.IOHandler.WriteLn('mouse_right ');
   IdTCPClient1.Disconnect;
 end;
end;

СЕРВЕР
Код:
procedure TForm1.IdTCPServer1Execute(AContext: TIdContext);
var
  z: string;
  X,Y:integer;
  K:TPoint;

   if SameText(Copy(z, 1, 11), 'mouse_move ') then
   begin
    z := AContext.Connection.IOHandler.ReadLn;
    if SameText(Copy(z, 1, 8), 'mouse_x ') then
    X:=StrToInt(Copy(z,9,4));

    z := AContext.Connection.IOHandler.ReadLn;
    if SameText(Copy(z, 1, 8), 'mouse_y ') then
    Y:=StrToInt(Copy(z,9,4));
    SetCursorPos(X,Y);
  end;

  if SameText(Copy(z, 1, 11), 'mouse_left ') then
   begin
    GetCursorPos(K);
    mouse_event(MOUSEEVENTF_ABSOLUTE or MOUSEEVENTF_LEFTDOWN,K.X,K.Y,0,0);
    mouse_event(MOUSEEVENTF_ABSOLUTE or MOUSEEVENTF_LEFTUP,K.X,K.Y,0,0);
   end;

   if SameText(Copy(z, 1, 12), 'mouse_right ') then
   begin
    GetCursorPos(K);
    mouse_event(MOUSEEVENTF_ABSOLUTE or MOUSEEVENTF_RIGHTDOWN,K.X,K.Y,0,0);
    mouse_event(MOUSEEVENTF_ABSOLUTE or MOUSEEVENTF_RIGHTUP,K.X,K.Y,0,0);
   end;

  AContext.Connection.Disconnect;
 end;
end;

ВОПРОСЫ:
1. можно ли реализовать функцию перетаскивания объектов, как приблизительно код может выглядеть?
2. можно ли реализовать прокрутку с использованием колесика мыши (мышь - два баттона и колесо, стандартная), в событиях компонента ИМЕДЖ1 нет обработки колеса
3. в принципе, нужно ли делать обработку событий типа клик, двойной клик и что там может быть еще связянное с мышью, чтобы приблизиться к функционалу MSRDP?
277
07 июля 2011 года
arrjj
1.7K / / 26.01.2011
ИМХО 1)комманды текстом - изврат 2)как я понял для изображения экрана и для комманд разные порты? 3)для каждого события не нужно переподключатся - в начале сессии подключаемся в конце отключаемся

У Image есть события OnMouseDown OnMouseUp OnMouseMove <- драг'н'дроп почти готов OnMouseDown на сервере событие mouse_event(MOUSEEVENTF_ABSOLUTE or MOUSEEVENTF_КНОПКАDOWN,K.X,K.Y,0,0); OnMouseMove на сервере mouse_event(...MOUSEEVENTF_MOVE...); OnMouseUp на сервере mouse_event(MOUSEEVENTF_ABSOLUTE or MOUSEEVENTF_КНОПКАUP,K.X,K.Y,0,0);

OnMouseScroll OnKeyDown OnKeyUp для TImage примеров нагуглить много можно, но имхо на сервер нужно не символ нажатой кнопки передавать а сканкод и использовать его в keybd_event.

Чтиво для досуга: mouse_event keybd_event

Ну и в заключение:имхо нужно абстрагироваться на клиенте от событий типа клик, двойной клик и т.д. об этом ОС на сервере позаботится, а передавать только "низкоуровневые" сигналы т.е. даблклик для ОС это быстрый вызов подряд mouse_event(...LEFTDOWN...)mouse_event(...LEFTUP...)mouse_event(...LEFTDOWN...)mouse_event(...LEFTUP...) на сервере
36K
07 июля 2011 года
Pcrepair
64 / / 16.01.2011
Цитата: arrjj

У Image есть события OnMouseDown OnMouseUp OnMouseMove <- драг'н'дроп почти готов


так что надо писать драг-и-дроп из отдельных событий? в ручную?
там вообще в событиях компонента есть OnStartDrag и OnDragOver и OnDragDrop и еще OnEngDrag. неясно только как из применять
информации, исходного кода, примеров нет случайно?

277
07 июля 2011 года
arrjj
1.7K / / 26.01.2011
Цитата: Pcrepair
так что надо писать драг-и-дроп из отдельных событий? в ручную?


НЕТБЛИН. Ты не понял, ещё раз: нам нет необходимости реализовывать драг'н'дроп, даблик или ещё чтото. Необходимо лишь получить события мыши и передать их на сервер, где они выполнятся последовательно. В примере драг'н'дроп:

 
Код:
Нажали кнопку = в клиенте отработал OnMouseDown, который передаёт серверу mousedown кнопка, сервер выполняет mouse_event(...DOWN...)
Переместили мышь = в клиенте отработал OnMouseMove, который передаёт серверу mousemove координаты, сервер выполняет mouse_event(...MOVE...)<<==У тебя для этого в коде SetCursorPos
Отжали кнопку = в клиенте сработал OnMouseUp, который передаёт серверу mouseup кнопка,  сервер выполняет mouse_event(...UP...)
278
07 июля 2011 года
Alexander92
1.1K / / 04.08.2008
ИМХО, использовать TImage - не лучший выбор. Не помню сходу, как это делается в Делфи, но в VC++ я бы однозначно делал через Custom Control, чтобы иметь возможность обрабатывать все стандартные сообщения. Это так, личное замечание.
36K
07 июля 2011 года
Pcrepair
64 / / 16.01.2011
Цитата:
НЕТБЛИН. Ты не понял, ещё раз: нам нет необходимости реализовывать драг'н'дроп, даблик или ещё чтото. Необходимо лишь получить события мыши и передать их на сервер, где они выполнятся последовательно. В примере драг'н'дроп:


то есть предлагается вообще не использовать события компонета а получать события мыши через ВЫНь АПИ и отправлять на сервер?
а для чего тогда события OnStartDrag и OnDragOver и OnDragDrop и еще OnEngDrag в компоненте ИМЕДЖ1? их что нельзя использовать?

277
07 июля 2011 года
arrjj
1.7K / / 26.01.2011
Цитата: Pcrepair
то есть предлагается вообще не использовать события компонета а получать события мыши через ВЫНь АПИ и отправлять на сервер?


В идеале - да, но можно использовать и события TImage

Цитата: Pcrepair

а для чего тогда события OnStartDrag и OnDragOver и OnDragDrop и еще OnEngDrag в компоненте ИМЕДЖ1? их что нельзя использовать?


OnDragOver - это когда ты чтото тянешь над TImage (допустим файл с екслорера) в нём можно изменить например курсор (т.е. если пользовательтащит файл с расширением txt ставим курсором crDrag а если .bin то crNoDrop). А OnDagDrop - собыие винды когда ты уже перетащил чтото и уронил его на имажу , в нём можно узнать что уронили и сделать с этим чтонибудь:) On(Start|End)Drag - хз.

278
07 июля 2011 года
Alexander92
1.1K / / 04.08.2008
Цитата: arrjj
On(Start|End)Drag - хз.


On(Start|End)Drag используется, если тянешь сам TImage. Почитайте про IDropSource, IDropTarget, IDataObject.

14
08 июля 2011 года
Phodopus
3.3K / / 19.06.2008
VCL-ные Drag-и (наркотики :) ) используются для ВЦЛ-ных компонентов. Точка. Никаких файлов, но и не только TImage
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог