TC Lister plugin - Проблема с ДВОЙНОЙ реакцией на нажатие

Вопросы программирования и использования среды Lazarus.

Модератор: Модераторы

TC Lister plugin - Проблема с ДВОЙНОЙ реакцией на нажатие

Сообщение kotompazb » 12.02.2017 00:17:24

Продолжил разбираться с написанием Lister-плагинов для TC. И вроде бы все хорошо, но столкнулся с одной неожиданной проблемой:
На любое нажатие (не важно, обрабатываю я его через ActionList или через onKeyPress формы) плагин почему-то реагирует дважды, подряд то есть два раза.
Вот такой код без всего лишнего:

lpr
Код: Выделить всё
library examp;

{$mode objfpc}{$H+}

uses
  Windows, SysUtils, Forms, Interfaces, umain
  { you can add units after this };

const
  PARSE_FUNCTION = 'SIZE>23';

procedure ListGetDetectString(DetectString: PChar; MaxLen: integer); stdcall;
begin
  StrLCopy(DetectString, PChar(PARSE_FUNCTION), MaxLen);
end;

function ListLoad(ListerWin: HWND; FileToLoad: Pchar; ShowFlags: integer): HWND; stdcall;
begin
  Result := TfmMain.PluginShow(ListerWin, FileToLoad);
end;

procedure ListCloseWindow(PluginWin: HWND); stdcall;
begin
  TfmMain.PluginHide(PluginWin);
end;

exports
ListGetDetectString,
ListLoad,
ListCloseWindow;

begin
  Application.Initialize;
end.


pas
Код: Выделить всё
unit umain;

{$mode objfpc}{$H+}

interface

uses
  Classes, Forms, Controls, LclType, Windows, Dialogs;

type

  { TfmMain }

  TfmMain = class(TForm)
    procedure FormKeyPress(Sender: TObject; var Key: char);
  private
    { private declarations }
    FTotCmdWin: HWND;    // handle of TotalCommander window
    FParentWin: HWND;    // handle of Lister window
    FQuickView: Boolean; // Ctrl+Q panel   protected
    procedure CreateParams(var Params: TCreateParams); override;
  public
    { public declarations }
    constructor CreateParented(AParentWindow: HWND);
    class function PluginShow(ListerWin: HWND; FileToLoad: string): HWND;
    class function PluginHide(PluginWin: HWND): HWND;
    procedure InFileOpen(ImageFileName: String);
  end;

implementation

{$R *.lfm}

{ TfmMain }

procedure TfmMain.FormKeyPress(Sender: TObject; var Key: char);
begin
  if (Key='K') or (Key='k') then ShowMessage('Key K Pressed');
end;

procedure TfmMain.CreateParams(var Params: TCreateParams);
begin
  inherited CreateParams(Params);
  Params.Style := (WS_CHILD or WS_MAXIMIZE) and not WS_CAPTION and not WS_BORDER;
  Params.WindowClass.cbWndExtra := SizeOf(PtrInt);
end;

constructor TfmMain.CreateParented(AParentWindow: HWND);
begin
  inherited CreateParented(AParentWindow);
  FTotCmdWin  := FindWindow('TTOTAL_CMD', nil);
  FParentWin  := AParentWindow;
  FQuickView  := Windows.GetParent(FParentWin) <> 0;
end;

class function TfmMain.PluginShow(ListerWin: HWND; FileToLoad: string): HWND;
var
  fmMain: TfmMain;
begin
  fmMain := nil;
  try
    fmMain := TfmMain.CreateParented(ListerWin);
    //fmMain.InFileOpen(FileToLoad);
    fmMain.Show;
    SetWindowLongPTR(fmMain.Handle, GWL_USERDATA, PtrInt(fmMain));
    // set focus to our window
    if not fmMain.FQuickView then
    begin
      PostMessage(fmMain.Handle, WM_SETFOCUS, 0, 0);
      fmMain.SetFocus;
    end;
    Result := fmMain.Handle;
  except
    if Assigned(fmMain) then
      fmMain.Free;
    Result := 0;
  end;
end;

class function TfmMain.PluginHide(PluginWin: HWND): HWND;
var
  fmMain: TfmMain;
begin
  Result := 0;
  fmMain := TfmMain(GetWindowLongPTR(PluginWin, GWL_USERDATA));
  try
    fmMain.Close;
    fmMain.Free;
  except
  end;
end;

procedure TfmMain.InFileOpen(ImageFileName: String);
begin

end;

end.


lfm
Код: Выделить всё
object fmMain: TfmMain
  Left = 397
  Height = 240
  Top = 223
  Width = 320
  BorderStyle = bsNone
  Caption = 'fmMain'
  KeyPreview = True
  OnKeyPress = FormKeyPress
  LCLVersion = '1.6.0.4'
end


Устанавливаем, открываем по F3 практически любой файл, жмем K, читаем сообщение об этом, кликаем ОК и... снова читаем сообщение о том, что нажали К...
Почему так?
Аватара пользователя
kotompazb
постоялец
 
Сообщения: 151
Зарегистрирован: 21.06.2012 13:03:39
Откуда: Novosibirsk, xUSSR

Re: TC Lister plugin - Проблема с ДВОЙНОЙ реакцией на нажати

Сообщение Penilopa P » 12.02.2017 17:15:44

Код: Выделить всё
procedure TfmMain.FormKeyPress(Sender: TObject; var Key: char);
begin
  if (Key='K') or (Key='k') then 
  begin
    ShowMessage('Key K Pressed');
    Key:=#0
  end
end;
Penilopa P
незнакомец
 
Сообщения: 6
Зарегистрирован: 04.04.2011 21:57:05

Re: TC Lister plugin - Проблема с ДВОЙНОЙ реакцией на нажати

Сообщение kotompazb » 12.02.2017 20:15:13

Penilopa P писал(а):
Код: Выделить всё
    Key:=#0

Спасибо.
Просто и логично. Надо попробовать. Вопрос остается только, почему так происходит?

Добавлено спустя 1 час 49 минут 33 секунды:
Re: TC Lister plugin - Проблема с ДВОЙНОЙ реакцией на нажатие
Ан нет. Не помогает. Все равно двойная сработка. Странно, почему же так происходит?
Аватара пользователя
kotompazb
постоялец
 
Сообщения: 151
Зарегистрирован: 21.06.2012 13:03:39
Откуда: Novosibirsk, xUSSR

Re: TC Lister plugin - Проблема с ДВОЙНОЙ реакцией на нажати

Сообщение kotompazb » 15.02.2017 20:11:18

И перевести с горячих клавиш на контекстное меню тоже не выходит... тоска
Аватара пользователя
kotompazb
постоялец
 
Сообщения: 151
Зарегистрирован: 21.06.2012 13:03:39
Откуда: Novosibirsk, xUSSR

Re: TC Lister plugin - Проблема с ДВОЙНОЙ реакцией на нажати

Сообщение olegy123 » 15.02.2017 20:58:44

Можно же через отладчик посмотреть на "стэк вызовов" и увидеть то ключевое место где вызывается два раза..

без исходников сложно сказать.
olegy123
долгожитель
 
Сообщения: 1643
Зарегистрирован: 25.02.2016 12:10:20

Re: TC Lister plugin - Проблема с ДВОЙНОЙ реакцией на нажати

Сообщение kotompazb » 15.02.2017 21:49:11

olegy123 писал(а):без исходников сложно сказать.

Все "исходники" в первом посте. Специально сделал пустой, ничего не делающий плагин, который только реагирует на нажатие кнопки, дабы разобраться с проблемой.
Аватара пользователя
kotompazb
постоялец
 
Сообщения: 151
Зарегистрирован: 21.06.2012 13:03:39
Откуда: Novosibirsk, xUSSR

Re: TC Lister plugin - Проблема с ДВОЙНОЙ реакцией на нажати

Сообщение AlexEr81 » 21.02.2017 16:45:22

а под 64 бит работает твой плагин?
AlexEr81
новенький
 
Сообщения: 17
Зарегистрирован: 24.01.2014 19:57:31

Re: TC Lister plugin - Проблема с ДВОЙНОЙ реакцией на нажати

Сообщение kotompazb » 07.03.2017 15:52:44

AlexEr81 писал(а):а под 64 бит работает твой плагин?

Работает. Но точно так же.
Аватара пользователя
kotompazb
постоялец
 
Сообщения: 151
Зарегистрирован: 21.06.2012 13:03:39
Откуда: Novosibirsk, xUSSR

Re: TC Lister plugin - Проблема с ДВОЙНОЙ реакцией на нажати

Сообщение tryexceptend » 07.03.2017 16:19:39

А на KeyUp переделать? Может действительно генерится 2 раза событие.
tryexceptend
незнакомец
 
Сообщения: 4
Зарегистрирован: 14.04.2014 23:11:04

Re: TC Lister plugin - Проблема с ДВОЙНОЙ реакцией на нажати

Сообщение kotompazb » 07.03.2017 18:46:49

tryexceptend писал(а):А на KeyUp переделать?

с KeyUp не пробовал вроде, с KeyDown пробовал - тот же эффект.
Бросил до лучших времен.
Аватара пользователя
kotompazb
постоялец
 
Сообщения: 151
Зарегистрирован: 21.06.2012 13:03:39
Откуда: Novosibirsk, xUSSR

Re: TC Lister plugin - Проблема с ДВОЙНОЙ реакцией на нажати

Сообщение Alextp » 10.04.2017 22:19:53

Никто ничего не сказал про OnKeyDown.

OnKeyPress надо заменить на OnKeyDown- работает с любыми клавишами.
Там тестишь if Key=VK_K
Потом надо еще- Key:= 0;
Попробую сам.

Добавлено спустя 1 час 14 минут 42 секунды:
Re: TC Lister plugin - Проблема с ДВОЙНОЙ реакцией на нажатие
Попрбовал, не помогает. От Мемо не зависит, с другими контролами тоже. KeyPrevew не влияет.
Alextp
новенький
 
Сообщения: 23
Зарегистрирован: 21.05.2014 17:55:12


Вернуться в Lazarus

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 32

Рейтинг@Mail.ru