Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Lazarus, Free Pascal, CodeTyphon
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 05.10.2010, 16:49   #1
Alex Cones
Trust no one.
Старожил
 
Аватар для Alex Cones
 
Регистрация: 07.04.2009
Сообщений: 6,526
По умолчанию [Lazarus] GetCaretPos возвращает нули.

В мясе сказано, что
Цитата:
If the function succeeds, the return value is nonzero.

If the function fails, the return value is zero. To get extended error information, call GetLastError.
У меня в простом виде:
Код:
Windows.GetCaretPos(P);
Вертает нули.

Смотрю последнюю ошибку - 1400. (Invalid window handle). Интересное кино. Нашел единственное в нете решение, которое было создано для D5, у которой был такой же баг:
Код:
Var
   P : TPoint;
   R : Rect;
   I : Integer;
   hOtherWin : THandle;
   aDwordVar : DWORD;
   OtherThreadID : DWORD;
   hFocusWin : THandle;
  Begin
   ZeroMemory(@P, SizeOf(P));

   hOtherWin := GetForegroundWindow;
   OtherThreadID := GetWindowThreadProcessID( hOtherWin, @aDwordvar);

   If AttachThreadInput( GetCurrentThreadID, OtherThreadID, True ) Then
   try
     hFocusWin := GetFocus;  // get active processes focused window
     if GetCaretPos(p) then
       Begin
        POSITIVE;
       End;
      End;

   finally
     AttachThreadInput( GetCurrentThreadID, OtherThreadID, False );
Но так, как я влезаю в поток (хз кого и как, знаю, что влезаю), то если я юзаю эту функу как задумывалось изначально (10 раз в секунду против задержки в 1500 сейчас), то это не дает системе обрабатывать double click.

Какие будут предложения? Переход обратно на Delphi не предлагать (разве что вместе с деньгами на лицензию).

Если интересно мнение американцев: http://forum.lazarus.freepascal.org/...c,10700.0.html
SQUARY PROJECT - НАБОР БЕСПЛАТНЫХ ПРОГРАММ ДЛЯ РАБОЧЕГО СТОЛА.
МОЙ БЛОГ
GRAY FUR FRAMEWORK - УДОБНАЯ И БЫСТРАЯ РАЗРАБОТКА WINAPI ПРИЛОЖЕНИЙ

Последний раз редактировалось Alex Cones; 05.10.2010 в 16:54.
Alex Cones вне форума Ответить с цитированием
Старый 05.10.2010, 21:42   #2
GunSmoker
Старожил
 
Регистрация: 13.08.2009
Сообщений: 2,581
По умолчанию

Цитата:
The caret position is always given in the client coordinates of the window that contains the caret.
Несложно сообразить, что это может означать, что если каретка не в вашем окне, то у вас могут быть проблемы.

По теоретической части рекомендую почитать Рихтера.

Сразу увидите, что и зачем делается в найденном коде.

Как сюда вписывается Lazarus - увы, не имею с ним опыта общения.
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы.
GunSmoker вне форума Ответить с цитированием
Старый 05.10.2010, 22:08   #3
Alex Cones
Trust no one.
Старожил
 
Аватар для Alex Cones
 
Регистрация: 07.04.2009
Сообщений: 6,526
По умолчанию

Цитата:
Как сюда вписывается Lazarus - увы, не имею с ним опыта общения.
Да вот он как раз таки тут зачинщик - в Delphi код Windows.GetCaretPos вертает верные координаты для блокнота. А в лазаре - нули. Не смотря на то, что процедуру они импортируют одну и ту же.
SQUARY PROJECT - НАБОР БЕСПЛАТНЫХ ПРОГРАММ ДЛЯ РАБОЧЕГО СТОЛА.
МОЙ БЛОГ
GRAY FUR FRAMEWORK - УДОБНАЯ И БЫСТРАЯ РАЗРАБОТКА WINAPI ПРИЛОЖЕНИЙ
Alex Cones вне форума Ответить с цитированием
Старый 05.10.2010, 22:15   #4
Vikenty
Заслуженный флудер
Участник клуба
 
Аватар для Vikenty
 
Регистрация: 31.03.2010
Сообщений: 1,473
По умолчанию

Цитата:
Сообщение от Alex Cones Посмотреть сообщение
Да вот он как раз таки тут зачинщик - в Delphi код Windows.GetCaretPos вертает верные координаты для блокнота. А в лазаре - нули. Не смотря на то, что процедуру они импортируют одну и ту же.
тогда дело в Lazarus...
Vikenty вне форума Ответить с цитированием
Старый 05.10.2010, 22:19   #5
Alex Cones
Trust no one.
Старожил
 
Аватар для Alex Cones
 
Регистрация: 07.04.2009
Сообщений: 6,526
По умолчанию

Цитата:
Сразу увидите, что и зачем делается в найденном коде.
Так, немного въехал. А нельзя мне приаттачиться к потоку при создании программы и уйти оттуда при её убийстве? Что бы не аттачиться каждые 100 мс? Просто я даже не знаю, что "кушает" double клики в системе. В смысле какой именно элемент кода.
SQUARY PROJECT - НАБОР БЕСПЛАТНЫХ ПРОГРАММ ДЛЯ РАБОЧЕГО СТОЛА.
МОЙ БЛОГ
GRAY FUR FRAMEWORK - УДОБНАЯ И БЫСТРАЯ РАЗРАБОТКА WINAPI ПРИЛОЖЕНИЙ
Alex Cones вне форума Ответить с цитированием
Старый 05.10.2010, 22:39   #6
Alex Cones
Trust no one.
Старожил
 
Аватар для Alex Cones
 
Регистрация: 07.04.2009
Сообщений: 6,526
По умолчанию

Другая мысль - если сделать проверку на изменение фокусного окна?
Код:
   If GetForegroundWindow <> hOtherWin Then
    Begin
     hOtherWin := GetForegroundWindow;
     OtherThreadID := GetWindowThreadProcessID( hOtherWin, @aDwordvar);

     If AttachThreadInput( GetCurrentThreadID, OtherThreadID, True ) Then
      try
       hFocusWin := GetFocus;  // get active processes focused window
       if GetCaretPos(p) then
        Begin
         If (P.X = 0) And (P.Y = 0) Then
         Begin
          Form.Left := 100;
         End
        Else
         Begin
          GetWindowRect(hFocusWin, R);
          P.X := R.Left + P.X -6;
          P.Y := R.Top  + P.Y + 17;
          Form.Left := P.X;
          Form.Top  := P.Y;
         End;
        End;

      finally
       AttachThreadInput( GetCurrentThreadID, OtherThreadID, False );
      end;
    End
   Else
    Begin
     hFocusWin := GetFocus;  // get active processes focused window
     if GetCaretPos(p) then
        Begin
         If (P.X = 0) And (P.Y = 0) Then
         Begin
          Form.Left := 200;
         End
        Else
         Begin
          GetWindowRect(hFocusWin, R);
          P.X := R.Left + P.X -6;
          P.Y := R.Top  + P.Y + 17;
          Form.Left := P.X;
          Form.Top  := P.Y;
         End;
        End;
    End;
правда так срабатывает правильно на долю секунды, потом обратно уходит на Left=200. НО двойной клик делается.
P.S. hOtherwin вынес в глобальные.
SQUARY PROJECT - НАБОР БЕСПЛАТНЫХ ПРОГРАММ ДЛЯ РАБОЧЕГО СТОЛА.
МОЙ БЛОГ
GRAY FUR FRAMEWORK - УДОБНАЯ И БЫСТРАЯ РАЗРАБОТКА WINAPI ПРИЛОЖЕНИЙ
Alex Cones вне форума Ответить с цитированием
Старый 18.02.2011, 14:46   #7
alex_von_fos
Новичок
Джуниор
 
Регистрация: 05.12.2010
Сообщений: 1
По умолчанию

Блин, у меня такая же проблема ... Либо координаты каретки правильные либо даблклик делать не дает! Вызываю код по таймеру (несколько десятков раз в секунду) - если уменьшать число вызовов, то даблклик иногда проскакивает.

Должно же быть решение!
alex_von_fos вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

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

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как убрать нули??? Егор&Co Microsoft Office Excel 9 24.02.2011 12:39
Запрос возвращает пустую таблицу, если один из подзаросов возвращает пустую таблицу ArtInt SQL, базы данных 9 12.05.2010 15:40
Вычеркнуть нули из числа Java PavelZet Помощь студентам 2 11.05.2009 01:35
Нули artemavd Общие вопросы Delphi 22 03.08.2008 10:49
Убрать нули!!!) artemavd Общие вопросы Delphi 13 29.07.2008 09:10