Как обнулить события

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

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

Как обнулить события

Сообщение Сквозняк » 02.02.2011 02:50:47

После обработки события надо бы как-то подтереть все лишние клики мыши и прочие события чтобы не обрабатывать лишние. Как это в лазарусе обычно делается?
Сквозняк
энтузиаст
 
Сообщения: 1123
Зарегистрирован: 29.06.2006 22:08:32

Re: Как обнулить события

Сообщение Maxizar » 02.02.2011 10:45:10

Сквозняк писал(а):После обработки события надо бы как-то подтереть все лишние клики мыши и прочие события чтобы не обрабатывать лишние. Как это в лазарусе обычно делается?


А у меня проблемы со спектрами..... Вы меня поняли?.. Нет. Вот и Я Вас не понял.

Можно было хотя бы код привести, или более подробнее описать.
Вот например, что я понял у вас есть событие (предположим OnClick), после его обработки нужно подтереть все лишние клики мыши и прочие события чтобы не обрабатывать лишние. Т.е. скажем после клика на Button1 не дать возможность выполнить Button2Click. Так что ли, если да то вот код..

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

{$mode objfpc}{$H+}

interface

uses
  Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, StdCtrls;

type

  { TForm1 }

  TForm1 = class(TForm)
    Button1: TButton;
    Button2: TButton;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
  private
    { private declarations }
  public
    { public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.lfm}

{ TForm1 }

procedure TForm1.Button2Click(Sender: TObject);
begin
  caption:='2';
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
   caption:='1';
   Button2.OnClick:=Nil; //после этого событие OnClick у  Button2 затрется. его не будет.
                                   //Если же нужно присвоить новое событие то заведите процедуру
                                  //типа  TNotifyEvent = procedure(Sender: TObject) of object; и присвойте ее вместо NiL
end;

end.

Если же нет, то повторяю задайте вопрос четче…
Maxizar
постоялец
 
Сообщения: 385
Зарегистрирован: 20.03.2010 19:48:14

Re: Как обнулить события

Сообщение Сквозняк » 02.02.2011 20:24:35

или более подробнее описать

В принципе это не требовало бы никакого подробного описания, если бы умные книги не сводились к "докажем теорему средствами паскаля" и "нарисуем графики функций". Написание с нуля простейшего неглючного обработчика нажатий клавиш или других девайсов кричит о необходимости отфильтровки лишних действий пользователя.
Код: Выделить всё
PROGRAM DEMKA_OCISTKI_SOBYTII;

uses CRT;

var WW3: BYTE;


PROCEDURE StiralkaSobytiiKlavy;
var QQ3: BYTE;
LABEL 1;
BEGIN
1:
FOR QQ3:=0 TO 255 DO IF KEYPRESSED=TRUE THEN READKEY;
DELAY(500);
IF KEYPRESSED=TRUE THEN GOTO 1;
END;


BEGIN
DELAY(300);
WRITELN;
StiralkaSobytiiKlavy; //Очистка очереди событий
WRITELN('NAZMI NA LJUBUJU KLAVISU');
WW3:=0;
While WW3<1 DO BEGIN
               IF KEYPRESSED=TRUE THEN BEGIN
                                       WRITELN('Ty nazal na klavisu ',READKEY);
                                       WW3:=1;
                                       END;
               DELAY(1);//ЭТО ЧТОБЫ ПРОЦ ЗРЯ НЕ ГРЕТЬ
               END;

DELAY(500);
StiralkaSobytiiKlavy; //Очистка очереди событий
WRITELN('NAZMI ESCE ODNU KLAVU');
While WW3<2 DO BEGIN
               IF KEYPRESSED=TRUE THEN WW3:=2;
               DELAY(1);
               END;
WRITELN('SPASIBO ZA SOTRUDNICESTVO');
END.

Если использовать библиотеку SDL, то тоже постоянно нужно подстраховываться и обнулять или "считывать в никуда" лишние тыки по клавише, джойстику, действия мышью.
Код: Выделить всё
Button2.OnClick:=Nil; //после этого событие OnClick у  Button2 затрется. его не будет.
Но это же кошмар, подчищать тонны кликов у каждой кнопки, картинки, надписи. То чего и боялся. Придётся писать огромную процедуру в которой будет всё это зачищаться в превентивном порядке - ведь неяно даже, были события или нет. В идеале процедура, очищающая в нужный момент все события, должна быть встроена в модули лазаруса. Халявы нет(
Нужен код который требует частой подчистки событий? Пожалуйста:
Код: Выделить всё
unit unit1;

{$mode objfpc}{$H+}

interface

uses
  Classes, SysUtils, FileUtil, LResources, Forms, Controls, Graphics, Dialogs,
  ExtCtrls, unix;

type

  { TForm1 }

  TForm1 = class(TForm)
   Image1: TImage;
   Image2: TImage;
   procedure FormClick(Sender: TObject);
   procedure FormDblClick(Sender: TObject);
   procedure Image2Click(Sender: TObject);
   procedure Image2MouseDown(Sender: TObject; Button: TMouseButton;
    Shift: TShiftState; X, Y: Integer);
  private
    { private declarations }
  public
    { public declarations }
  end;

var
  Form1: TForm1;

implementation

{ TForm1 }


procedure TForm1.FormDblClick(Sender: TObject);
begin
end;

procedure TForm1.FormClick(Sender: TObject);
begin
fpsystem('mplayer "/home/user/Desktop/z/z2/FlashXXUN2LII"'); //[[[[[[[[[[[[

end;

procedure TForm1.Image2Click(Sender: TObject);
begin

end;

procedure TForm1.Image2MouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
fpsystem('mplayer "/home/user/Desktop/z/z2/FlashXXXmnJ7D"'); //[[[[[[[[[[[[

end;

initialization
  {$I unit1.lrs}

end.
Во время ожидания можно натыкать так, что мало не покажется. А ещё надо учесть что начало выполнения комманды системы может подтормозить.
Сквозняк
энтузиаст
 
Сообщения: 1123
Зарегистрирован: 29.06.2006 22:08:32

Re: Как обнулить события

Сообщение Odyssey » 02.02.2011 22:09:18

А если попробовать так?
Код: Выделить всё
procedure TForm1.FormClick(Sender: TObject);
begin
  // снимаем обработчик:
  Self.OnClick := nil;
  fpsystem('mplayer "/home/user/Desktop/z/z2/FlashXXUN2LII"'); //[[[[[[[[[[[[
  // обрабатываем накопившиеся сообщения (то, что вы называете событиями)
  // важно сделать это до возвращения обработчика на место:
  Application.ProcessMessages;
  // Возвращаем обработчик:
  Self.OnClick := @FormClick;
end;
Odyssey
энтузиаст
 
Сообщения: 580
Зарегистрирован: 29.11.2007 17:32:24

Re: Как обнулить события

Сообщение v-t-l » 02.02.2011 22:15:10

А Button1.Enabled:=False никак не может помочь?
v-t-l
энтузиаст
 
Сообщения: 735
Зарегистрирован: 13.05.2007 16:27:22
Откуда: Belarus

Re: Как обнулить события

Сообщение Сквозняк » 03.02.2011 01:01:40

Почти удалось из всех ответов собрать подходящее решение.
Код: Выделить всё
procedure TForm1.Image2MouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
Image2.Enabled:=False;
fpsystem('mplayer "/home/buratino/Desktop/z/z2/FlashXXXmnJ7D"');

//здесь нужно сгенерировать событие которое запустит процедуру TForm1.Label1DblClick

end;

procedure TForm1.Label1DblClick(Sender: TObject);
begin
Image2.Enabled:=True;
end;

Чтобы затереть события компонента Image2, нужно использовать ещё один компонент, например Label1. После завершения процедуры TForm1.Image2MouseDown нужно сделать двойной клик по Label1 и компонент Image2 снова заработает. Осталось только автоматизировать процесс, чтобы TForm1.Label1DblClick запускалась автоматически. Прблема в том что я не знаю как записать генерацию события.
Сквозняк
энтузиаст
 
Сообщения: 1123
Зарегистрирован: 29.06.2006 22:08:32

Re: Как обнулить события

Сообщение v-t-l » 03.02.2011 11:38:54

Сквозняк писал(а):Прблема в том что я не знаю как записать генерацию события.
Код: Выделить всё
Label1DblClick(Label1);


Добавлено спустя 7 минут 28 секунд:
Кстати, это не генерация события, а вызов его обработчика.
А вообще не очень ясно - зачем?
Код: Выделить всё
Image2.Enabled:=False;
fpsystem('mplayer "/home/buratino/Desktop/z/z2/FlashXXXmnJ7D"');
Image2.Enabled:=True;
v-t-l
энтузиаст
 
Сообщения: 735
Зарегистрирован: 13.05.2007 16:27:22
Откуда: Belarus

Re: Как обнулить события

Сообщение Сквозняк » 03.02.2011 17:05:20

Код: Выделить всё
Label1DblClick(Label1);
Кстати, это не генерация события, а вызов его обработчика.

Вот наверно потому и не работает как надо, лишние события не затираются. Обработчик выполняется до завершения процедуры TForm1.Image2MouseDown, а надо после, потому и спрашивал, как написать генерацию события.

А вообще не очень ясно - зачем?
Код: Выделить всё
Image2.Enabled:=False;
fpsystem('mplayer "/home/buratino/Desktop/z/z2/FlashXXXmnJ7D"');
Image2.Enabled:=True;
Такой простой трюк сработал бы в процедурной программе а в объекте нужно прыгать с бубном (искать уязвимость объекта) чтобы заработала какая-то непредусмотренная мелочь.
Присвоение Image2.Enabled:=True; в разных местах приводит к разным последствиям.
Сквозняк
энтузиаст
 
Сообщения: 1123
Зарегистрирован: 29.06.2006 22:08:32


Вернуться в Lazarus

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

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

Рейтинг@Mail.ru
cron