Перейти из форума на сайт.

НовостиФайловые архивы
ПоискАктивные темыТоп лист
ПравилаКто в on-line?
Вход Забыли пароль? Первый раз на этом сайте? Регистрация
Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » Вопросы по Delphi 2

Модерирует : ShIvADeSt

ShIvADeSt (22-03-2007 02:18): http://forum.ru-board.com/topic.cgi?forum=33&topic=8142  Версия для печати • ПодписатьсяДобавить в закладки
Страницы: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100

   

ShIvADeSt



Moderator
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Продолжение темы http://forum.ru-board.com/topic.cgi?forum=33&topic=3647&start=2020#lt
Внимание, все большие куски кода (более 5 строк) оформляем в тег [more] дабы уменьшить размер поста.

Всего записей: 3956 | Зарегистр. 29-07-2003 | Отправлено: 01:52 20-04-2006 | Исправлено: ShIvADeSt, 02:02 30-06-2006
Ramazan



Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
dmit000
OnDeactivate

Всего записей: 359 | Зарегистр. 13-04-2002 | Отправлено: 06:37 26-09-2006
deadbitch



Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
wader

Цитата:
deadbitch  
Кстати, попробуй отрисовывать в TBitmap (размером с клиентскую область формы). А на форму выводи BitBlt. У метафайлов действительно медленная отрисовка.

В TBitMap отрисовывать из чего - из метафайлов? Можешь привести кусок кода?

Всего записей: 340 | Зарегистр. 13-01-2005 | Отправлено: 09:47 26-09-2006
dmit000



Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Ramazan
Например я пишу код
 
procedure TForm1.FormDeactivate(Sender: TObject);
begin
close;
end;
 
так вот я хочу чтобыпри потери фокуса формы, форма закрывалась, а этот код не работает.
 
ещё раз есть ли у формы свойство "потеря фокуса"?

Всего записей: 483 | Зарегистр. 07-06-2004 | Отправлено: 15:32 26-09-2006
RomanTim

Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
dmit000
Цитата:
ещё раз есть ли у формы свойство "потеря фокуса"?

Есть сообщение WM_ACTIVATE
Код:
procedure WMActivate(var Message: TMessage); message WM_ACTIVATE;
...
procedure TForm1.WMActivate(var Message: TMessage);
begin
  if Message.WParam = WA_INACTIVE then Close;
end;

Всего записей: 375 | Зарегистр. 11-09-2003 | Отправлено: 15:49 26-09-2006 | Исправлено: RomanTim, 15:49 26-09-2006
wader



Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
deadbitch
Ага, из метафайла.
 
вот примерный код:
Исходник

Всего записей: 113 | Зарегистр. 26-05-2005 | Отправлено: 15:52 26-09-2006
yuish

Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
xitsmex
А что за утилитка и где взять?

Всего записей: 218 | Зарегистр. 10-02-2003 | Отправлено: 16:51 26-09-2006
Jokerjar



BANNED
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Отлавливаю колесико мыши следующей глобальной ловушкой:
 
function GlobalMouseHook(code: integer; wParam: word; lParam: longword): longword; stdcall;
begin
if code <> HC_ACTION then begin
GlobalMouseHook:=CallNextHookEx(CurrentHook,code,wParam,lparam);
Exit;
end;
if Wparam = WM_MOUSEWHEEL then
showmessage('wheel!');
CallNextHookEx(CurrentHook,code,wParam,lparam);
GlobalMouseHook:=0;
Exit;
end;
 
Здесь проблем никаких нет. Но хочу узнать направление вращения колесика, и вот никак не могу сообразить. Пробовал вместо showmessage вставлять следующий код:
 
if TWMMouseWheel(Pointer(Lparam)^).WheelDelta > 0 then
showmessage('Up') else showmessage('Down');
 
Кто знает, в чем бага?
 
Полный текст ловушки

Всего записей: 591 | Зарегистр. 22-03-2006 | Отправлено: 17:12 26-09-2006 | Исправлено: Jokerjar, 18:14 26-09-2006
wader



Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Jokerjar
Поправь тег "more"
 
Насчет вопроса:
С чего ты взял, что lParam - указатель на TWMMouseWheel?
lParam - указатель на MOUSEHOOKSTRUCT.  
Для определения WhellDelta нужно приводить к MOUSEHOOKSTRUCTEX (Есть только в Win2000 и выше).
 
По поводу описания структуры:
MOUSEHOOKSTRUCT
MOUSEHOOKSTRUCTEX
 
Читайте доки - они рулез

Всего записей: 113 | Зарегистр. 26-05-2005 | Отправлено: 17:54 26-09-2006
Jokerjar



BANNED
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Странно все это... получается так:
 
  MOUSEHOOKSTRUCT = packed record
    pt: TPoint;
    hwnd: HWND;
    wHitTestCode: UINT;
    dwExtraInfo: DWORD;
  end;
 
здесь нет ничего похожего на направление колесика... есть вот тут:
 
  TWMMouseWheel = packed record
    Msg: Cardinal;
    Keys: SmallInt;
    WheelDelta: SmallInt;
    case Integer of
      0: (
        XPos: Smallint;
        YPos: Smallint);
      1: (
        Pos: TSmallPoint;
        Result: Longint);
  end;
 
Связи между типами не наблюдаю... Если ловить сообщение WM_MOUSEWHEEL, то в wparam и находится указатель на TWMMouseWheel, но ведь у меня ловушка wh_mouse. Т.е. в wparam находится хэндл окна... Что посоветуете? (Писать ловушку wh_getmessage не предлагать. Все должно быть в wh_mouse)

Всего записей: 591 | Зарегистр. 22-03-2006 | Отправлено: 18:53 26-09-2006
STEEL



Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Пишу DLLку. Как узнать в какую дирикторию её положили? GetDir не прокатывает :}

Всего записей: 2293 | Зарегистр. 06-01-2002 | Отправлено: 18:59 26-09-2006
Jokerjar



BANNED
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
STEEL,
 
function MyGetDir: string;
var
TheFileName : array[0..MAX_PATH] of char;
begin
FillChar(TheFileName, sizeof(TheFileName), #0);
GetModuleFileName(hInstance, TheFileName, sizeof(TheFileName));
result:=TheFileName
end;
 
 
Добавлено:

Цитата:
wparam находится хэндл окна

То есть тип сообщения, я ошибся. Но сути дела это не меняет
 
Добавлено:
Могу вопрос и по-другому поставить: как узнать параметр wparam сообщения, отловленного хуком wh_mouse. Не тот wparam, где хранится, к примеру, wm_mousewhell, а wparam самого wm_mousewhell...

Всего записей: 591 | Зарегистр. 22-03-2006 | Отправлено: 19:06 26-09-2006
wader



Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Jokerjar
Посмотри структуру MOUSEHOOKSTRUCTEX в моем предыдущем сообщении.
Там как раз есть MouseWheel который тебе нужен.
(Но работать будет только с Win2000)

Всего записей: 113 | Зарегистр. 26-05-2005 | Отправлено: 19:49 26-09-2006
Jokerjar



BANNED
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
wader, да вот смотрю на нее. Только не понимаю, как вытащить ее из процедуры ловушки, там ей и не пахнет.
 
З.Ы. В делфи я эту MOUSEHOOKSTRUCTEX ваще не нашел
 
Добавлено:

Цитата:
typedef struct {  
    MOUSEHOOKSTRUCT MOUSEHOOKSTRUCT;  
    DWORD mouseData;  
} MOUSEHOOKSTRUCTEX, *PMOUSEHOOKSTRUCTEX;

 
Видно, что MOUSEHOOKSTRUCT - это часть структуры MOUSEHOOKSTRUCTEX. Мне дан указатель на MOUSEHOOKSTRUCT. Если здвинуть его на размерность MOUSEHOOKSTRUCT, возможно я попаду на mouseData... Но не факт. Повторюсь, в делфи записи вообще другие. Я их выше писал

Всего записей: 591 | Зарегистр. 22-03-2006 | Отправлено: 21:27 26-09-2006
wader



Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Jokerjar
Хе-хе точно, у себя в Delphi7 не нашел.
 
ну не проблема сделай так:

Код:
 
MOUSEHOOKSTRUCTEX = packed record
   mhs: TMOUSEHOOKSTRUCT;
   mouseData: DWORD;
end;
 

 
А теперь перевожу, что было написано на "албанском"
Если сообщение WM_MOUSEWHEEL, то HIWORD(mouseData) - это "wheel delta".
LOWORD(mouseData) неопределено и зарезервированно.
Положительное значение HIWORD(mouseData) указывает, что колесико было прокручено вперед (от пользователя). А отрицательное значение - колесико прокручено назад (к пользователю).
Один поворот колеса - WHEEL_DELTA = 120.
 
P.S.
  Тебе это нужно было или нет?

Всего записей: 113 | Зарегистр. 26-05-2005 | Отправлено: 23:51 26-09-2006
Jokerjar



BANNED
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
wader
 
Это все понятно. Но пойми, что у меня в руках, только TMOUSEHOOKSTRUCT, и через него я не могу выйти на MOUSEHOOKSTRUCTEX, чтобы добраться до маусдата. Это главная проблема
 
 
Добавлено:
Я практически добрался вручную до этого mousedata. Смотри:
 
  type
MOUSEHOOKSTRUCTEX = packed record
   mhs: TMOUSEHOOKSTRUCT;
   mouseData: DWORD;
end;
 
function GlobalMouseHook(code: integer; wParam: word; lParam: longword): longword; stdcall;
var
ex: MOUSEHOOKSTRUCTEX;
begin
if code <> HC_ACTION then begin
GlobalMouseHook:=CallNextHookEx(CurrentHook,code,wParam,lparam);
Exit;
end;
if Wparam = WM_MOUSEWHEEL then begin
ex.mhs := TmouseHookStruct(Pointer(lparam)^);
ex.mousedata := dword(Pointer(lparam+sizeof(TMOUSEHOOKSTRUCT))^);
showmessage(int2str(HIWORD(ex.mouseData)));
end;
CallNextHookEx(CurrentHook,code,wParam,lparam);
GlobalMouseHook:=0;
Exit
end;
 
Положительные значения при движении вверх получаются отлично (120, 240, 360 и т.д.), а вот отрицательные нет.
Видимо, что до нужно дополнить. Помогите
 
Добавлено:
При движении вниз получаю значения: 64576, 65176, 65296 ...
Совсем не то. Вспоминаю теорию (архитектура ЭВМ). Перевожу эти числа в двоичную с. исч.:
 
64576 = 1111 1100 0100 0000
65176 = 1111 1110 1001 1000
65296 = 1111 1111 0001 0000
 
Перевожу их в дополнительный код (заменяю 0 на 1 а 1 на 0)
 
1111 1100 0100 0000 = 1110111111
1111 1110 1001 1000 = 101100111
1111 1111 0001 0000 = 11101111
 
И увеличиваю младший бит на 1
 
1110111111 = 1111000000
101100111 = 101101000
11101111 = 11110000
 
и смотрю что у меня получилось:
 
1111000000 = 960
101101000 = 360
11110000 = 240
 
Это уже отрицательные значения. И видно, что они правильные, т.к. кратны 120.
Это что выходит, что hiword правильно выдает только положительные числа. А чтоб получить отрицательное, нужно проделывать вышеописанные
действия (кстати, на то, что число отрицательное указывает единица в самом старшем бите). Думаю, что в Delphi есть процедура, которая
делает это (65296 -> -240). Профи, подскажите!
 
Добавлено:
Все получилось! Вот рабочая функция (по крайней мере, на моем компе):
 
type
MOUSEHOOKSTRUCTEX = packed record
   mhs: TMOUSEHOOKSTRUCT;
   mouseData: DWORD;
end;
 
function GlobalMouseHook(code: integer; wParam: word; lParam: longword): longword; stdcall;
var
  i: integer;
  s: string;
  ex: MOUSEHOOKSTRUCTEX;
begin
  if code <> HC_ACTION then begin
  GlobalMouseHook:=CallNextHookEx(CurrentHook,code,wParam,lparam);
  Exit;
  end;
  if Wparam = WM_MOUSEWHEEL then begin
  ex.mhs := TmouseHookStruct(Pointer(lparam)^);
  ex.mousedata := dword(Pointer(lparam+sizeof(TMOUSEHOOKSTRUCT))^);
  i := smallint(HIWORD(ex.mouseData)) div wheel_delta;
  s := int2str(abs(i))+' оборот(а,ов) ';
  if i>0 then s := s + 'вверх' else
  s := s + 'вниз';
  showmessage(s);
  end;
  CallNextHookEx(CurrentHook,code,wParam,lparam);
  GlobalMouseHook:=0;
  Exit;
end;
 
P.S. Странно, что ни MOUSEHOOKSTRUCTEX, ни как до него добраться в Delphi не описано, хотя мб я плохо искал
 
P.P.S. Спасибо всем, кто помог
 
P.P.P.S. У кого win 2000 и мышь с колесом, проверьте код на работоспособность

Всего записей: 591 | Зарегистр. 22-03-2006 | Отправлено: 04:28 27-09-2006
xitsmex



Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
yuish
Самописная. Компонент для доступа к информации о версии на запись/чтения взял тут: http://delphi.michawinter.de/. Дальше - дело техники.

Всего записей: 58 | Зарегистр. 31-08-2005 | Отправлено: 08:29 27-09-2006
h0mer



Full Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
Jokerjar
 
procedure TMainForm.FormCreate(Sender: TObject);
begin
  Application.OnMessage := MainForm.AppMessage;
end;
 
procedure TMainForm.AppMessage(var Msg: TMsg; var Handled: Boolean);
var
  i: SmallInt;
begin
  if Msg.message = WM_MOUSEWHEEL then
  begin{}
    i := HiWord(Msg.wParam);  //направление колёсика мыши
    if i > 0 then
      StringGrid.Perform(WM_VSCROLL,SB_LINEUP,0) // строку вверх по компоненту StringGrid
    else
      StringGrid.Perform(WM_VSCROLL,SB_LINEDOWN,0); // строку вниз по компоненту StringGrid                  
    Handled := False;
  end;
end;
 
З.Ы. Не это роешь ?

----------
Mm-m beer ! Doh ! I broke the internet !

Всего записей: 494 | Зарегистр. 11-10-2004 | Отправлено: 08:56 27-09-2006 | Исправлено: h0mer, 09:01 27-09-2006
wader



Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Jokerjar
Ну и нафига ты лишнии движения делаешь?
 

Код:
 
var
ex: MOUSEHOOKSTRUCTEX;
...
ex := MOUSEHOOKSTRUCTEX(Pointer(lparam)^);  
 

Так не проще будет?
 

Цитата:
 
P.S. Странно, что ни MOUSEHOOKSTRUCTEX, ни как до него добраться в Delphi не описано, хотя мб я плохо искал
 

А ничего странного . В Delphi не описаны вещи которые появились в Win 2000 и выше.
Поэтому лучше сверяться с MSDN и, если что, их добавлять ручками.
 

Цитата:
 
P.P.S. Спасибо всем, кто помог
 


 
P.S.
  А положительные значения у тебя получались из-за того, что HIWORD возвращает беззнаковый тип (word). Поэтому и требуется приведение к знаковому (smallint).

Всего записей: 113 | Зарегистр. 26-05-2005 | Отправлено: 09:12 27-09-2006 | Исправлено: wader, 10:53 27-09-2006
greenpc

Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Jokerjar
уже было
Автор: OdesitVadim, Отправлено:18:53 18-08-2006  
 
x:=SmallInt(WORD(strtoint('65296')));  
 

Всего записей: 401 | Зарегистр. 18-04-2003 | Отправлено: 09:18 27-09-2006
Jokerjar



BANNED
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

Цитата:
var  ex: MOUSEHOOKSTRUCTEX;  ...  ex := MOUSEHOOKSTRUCTEX(Pointer(lparam)^);  

Согласен!
 

Цитата:
З.Ы. Не это роешь ?

Неа, ибо все делалось в длл. Вопрос снят
 
 
Добавлено:

Цитата:
Поэтому лучше сверяться с MSDN

Очень часто это слышу, но никогда не задумываля, что это такое, где это взять и с чем есть?

Всего записей: 591 | Зарегистр. 22-03-2006 | Отправлено: 12:14 27-09-2006
   

Страницы: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100

Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » Вопросы по Delphi 2
ShIvADeSt (22-03-2007 02:18): http://forum.ru-board.com/topic.cgi?forum=33&topic=8142


Реклама на форуме Ru.Board.

Powered by Ikonboard "v2.1.7b" © 2000 Ikonboard.com
Modified by Ru.B0ard
© Ru.B0ard 2000-2024

BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

Рейтинг.ru