Как обнулить события
Модератор: Модераторы
Как обнулить события
После обработки события надо бы как-то подтереть все лишние клики мыши и прочие события чтобы не обрабатывать лишние. Как это в лазарусе обычно делается?
Сквозняк писал(а):После обработки события надо бы как-то подтереть все лишние клики мыши и прочие события чтобы не обрабатывать лишние. Как это в лазарусе обычно делается?
А у меня проблемы со спектрами..... Вы меня поняли?.. Нет. Вот и Я Вас не понял.
Можно было хотя бы код привести, или более подробнее описать.
Вот например, что я понял у вас есть событие (предположим 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.
Если же нет, то повторяю задайте вопрос четче…
или более подробнее описать
В принципе это не требовало бы никакого подробного описания, если бы умные книги не сводились к "докажем теорему средствами паскаля" и "нарисуем графики функций". Написание с нуля простейшего неглючного обработчика нажатий клавиш или других девайсов кричит о необходимости отфильтровки лишних действий пользователя.
Код: Выделить всё
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.
А если попробовать так?
Код: Выделить всё
procedure TForm1.FormClick(Sender: TObject);
begin
// снимаем обработчик:
Self.OnClick := nil;
fpsystem('mplayer "/home/user/Desktop/z/z2/FlashXXUN2LII"'); //[[[[[[[[[[[[
// обрабатываем накопившиеся сообщения (то, что вы называете событиями)
// важно сделать это до возвращения обработчика на место:
Application.ProcessMessages;
// Возвращаем обработчик:
Self.OnClick := @FormClick;
end;А Button1.Enabled:=False никак не может помочь?
Почти удалось из всех ответов собрать подходящее решение.
Чтобы затереть события компонента Image2, нужно использовать ещё один компонент, например Label1. После завершения процедуры TForm1.Image2MouseDown нужно сделать двойной клик по Label1 и компонент Image2 снова заработает. Осталось только автоматизировать процесс, чтобы TForm1.Label1DblClick запускалась автоматически. Прблема в том что я не знаю как записать генерацию события.
Код: Выделить всё
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 запускалась автоматически. Прблема в том что я не знаю как записать генерацию события.
Сквозняк писал(а):Прблема в том что я не знаю как записать генерацию события.
Код: Выделить всё
Label1DblClick(Label1);Добавлено спустя 7 минут 28 секунд:
Кстати, это не генерация события, а вызов его обработчика.
А вообще не очень ясно - зачем?
Код: Выделить всё
Image2.Enabled:=False;
fpsystem('mplayer "/home/buratino/Desktop/z/z2/FlashXXXmnJ7D"');
Image2.Enabled:=True;Кстати, это не генерация события, а вызов его обработчика.Код: Выделить всё
Label1DblClick(Label1);
Вот наверно потому и не работает как надо, лишние события не затираются. Обработчик выполняется до завершения процедуры TForm1.Image2MouseDown, а надо после, потому и спрашивал, как написать генерацию события.
Такой простой трюк сработал бы в процедурной программе а в объекте нужно прыгать с бубном (искать уязвимость объекта) чтобы заработала какая-то непредусмотренная мелочь.А вообще не очень ясно - зачем?Код: Выделить всё
Image2.Enabled:=False;
fpsystem('mplayer "/home/buratino/Desktop/z/z2/FlashXXXmnJ7D"');
Image2.Enabled:=True;
Присвоение Image2.Enabled:=True; в разных местах приводит к разным последствиям.
