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

Вниз

Right Button = Left Button   Найти похожие ветки 

 
Deus   (2003-04-29 03:14) [0]

Как заставить правую кнопку мыши работать со всеми особенностями левой, а именно, с drug n drop? Это вообще возможно? Или это всё на уровне ядра/драйверов?


 
MBo   (2003-04-29 06:05) [1]

со всеми особенностями - в установках Виндоус кнопки поменять.

Только некоторые операции в своей программе - сделать несложно.


 
Zergling   (2003-04-29 12:04) [2]

> заставить правую кнопку мыши работать со всеми особенностями левой
Не совсем ясна суть вопроса. Че за особенности такие?
> именно, с drug n drop
Это совсем другая категория вопроса не имеющая ни чего общего с 1 вопросом.

Здесь используются средства RTTI, так что теоритически можно таскать любой объект у которого есть свойства left и Top. На данный (таскаемый) обеъкт должны быть назначены ниже приведенные события мыши OnMouseUp, OnMouseDown, OnMouseMove.
Возможно чего то будет не хватать (код перед отправкой не тестировал) т.к. выдирал код кусками из своего проекта. Если будут глюки напиши, добавлю недостющую часть кода.

uses TypInfo;

var
MouseDownSpot: TPoint; // Координаты мыши для перемещения объекта
DragObjects: Boolean=False; // Тащим объект или нет (True - да)

Procedure TVSetIntProp(AComponent:TObject;APropertyName:String;AValue:Integer);
var PropInfo: PPropInfo;
Begin
PropInfo:=GetPropInfo(AComponent.ClassInfo,APropertyName);
if PropInfo<>nil then
if PropInfo^.PropType^.Kind=tkInteger then SetOrdProp(AComponent,PropInfo,Integer(AValue));
End;

Function TVGetIntProp(AComponent:TObject;APropertyName:String):Integer;
var PropInfo: PPropInfo;
Begin
PropInfo:=GetPropInfo(AComponent.ClassInfo,APropertyName);
if PropInfo<>nil then
if PropInfo^.PropType^.Kind=tkInteger then Result:=GetOrdProp(AComponent,PropInfo) else Result:=0;
End;

// Событие OnMouseDown
procedure TEdit_FC.DefaultForMouseMouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
// Событие для начала перемещения объекта
if Button = mbLeft then // Нужную кнопку назначишь сам (без проверки будет срабатывать на нажатие любой кнопки)
Begin
DragObjects := True;
MouseDownSpot.X := X;
MouseDownSpot.Y := Y;
End;
end;

// Событие OnMouseMove
procedure TEdit_FC.DefaultForMouseMouseMove(Sender: TObject; Shift: TShiftState;
X, Y: Integer);
begin
// Событие на перемещение объекта
if DragObjects then
begin
TVSetIntProp(Sender,"Left",TVGetIntProp(Sender,"Left")-(MouseDownSpot.X-X));
TVSetIntProp(Sender,"Top",TVGetIntProp(Sender,"Top")-(MouseDownSpot.Y-Y));
end;
end;

// Событие OnMouseUp
procedure TEdit_FC.DefaultForMouseMouseUp(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
// Событие для завершения перемещения объекта
if DragObjects then
begin
DragObjects:=False;
TVSetIntProp(Sender,"Left",TVGetIntProp(Sender,"Left")-(MouseDownSpot.X-X));
TVSetIntProp(Sender,"Top",TVGetIntProp(Sender,"Top")-(MouseDownSpot.Y-Y));
end;
end;


 
Deus   (2003-04-30 20:47) [3]

Спасибо за ответы. Уточню вопрос, я его не совсем правильно сформулировал. Вернее, совсем не правильно. Собственно dnd _объектов_ делать не нужно. Есть объект dxdraw, он отрисовывает на surface tpicture. Этот tpicture иногда больше отображаемого (primary) сарфейса и его приходится мышкой "таскать" в окне dxdraw. Причем необходима возможность перетаскивания зажав как левую, так и правую кнопку мыши. Так вот, с левой никаких проблем - события onmousemove генерятся вне зависимости находится ли курсор мыши на dxdraw, на моей форме, или вообще неизвестно где - всё прекрасно работает. Как я понимаю, за счет механизма dnd. С правой кнопкой естественно всё совсем не так. События генерятся только до краёв окна dxdraw. Если кнопку отпустить вне окна, естественно, onmousemove не доходит до окна (хорошо, если хоть до формы дойдет). И начинаются чудные глюки. Пока на dxdraw мышь не перещелкнешь. Такое поведение вполне понятно, объяснимо и логично. Тут вопросов нет, кто виноват понятно. Второй вечный вопрос: что делать?


 
Deus   (2003-05-11 15:52) [4]

Добрый день всем. Наконец добрался до инета. Извините, что надоедаю, но еще кто что скажет по этому вопросу?


 
Deus   (2003-05-15 16:03) [5]

Думаю, тебе стоит сменить ник...


 
Death_666   (2003-05-15 17:14) [6]

А тебе - e-mail.


 
Deus   (2003-05-15 17:33) [7]

2Death_666:
?


 
Death_666   (2003-05-15 17:45) [8]

Сладкое слово - спам. Что, мылом не мог предупредить? Обязательно нужно было повыеживаться?



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

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

Наверх




Память: 0.47 MB
Время: 0.008 c
7-78181
zom
2003-05-15 12:47
2003.07.24
Как узнать текущее разрешение экрана?


1-77830
Zigs
2003-07-11 19:54
2003.07.24
QReport - предпросмотр нормально, а при печати Access Violation


1-77858
SergP
2003-07-13 11:06
2003.07.24
Sender:TObject


1-77832
Shadow X
2003-07-09 09:38
2003.07.24
ShellTreeView


1-77977
snl73
2003-07-11 12:09
2003.07.24
добавление объектов в работающее приложение





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский