Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.04.04;
Скачать: CL | DM;

Вниз

Как назначить процедуру обработки события.   Найти похожие ветки 

 
AleKo   (2004-03-12 10:54) [0]

Добрый день!
Имеется консольное приложение в котором объявлена переменная
var
  EasyFileSearch1: TEasyFileSearch;
У компоненты TeasyFileSearch есть событие onFileFound(FileFound: TFileInformations);
Как в консольном приложении описать процедуру обработки этого события и назначить ее данной переменной.
Спасибо!


 
AleKo   (2004-03-12 11:01) [1]

?


 
Ega23 ©   (2004-03-12 11:05) [2]

function MyFunction(параметры):результат;

EasyFileSearch1:=TEasyFileSearch.Create;
EasyFileSearch1.Нужная функция:=MyFunction;

Только параметры должны совпадать.


 
PVOzerski ©   (2004-03-12 11:05) [3]

На этот вопрос можно ответить, только посмотрев компонент (хотя бы его описание). Как универсальный вариант - использовать невидимую форму (Application.ShowMainForm:=false перед Application.Run в .dpr"е) - совет без 100%-й гарантии.


 
AleKo   (2004-03-12 11:13) [4]

Никакой формы, это консольное приложение. А событие я уже описал.

Ega23 помоему это ошибка поскольку твою функцию MyFunction
необходимо описать как событие иначе говоря тип EasyFileSearch1.Нужная функция
и MyFunction должны совпадать иначе ошибка при компиляции.


 
AleKo   (2004-03-12 11:17) [5]

Конкретно для Ega23возникает ошибка
[Error] MFileCon.dpr(86): Incompatible types: "method pointer and regular procedure"


 
PVOzerski ©   (2004-03-12 11:21) [6]

>Никакой формы, это консольное приложение
На самом деле одно другого не исключает.
>[Error] MFileCon.dpr(86): Incompatible types: "method pointer and regular procedure"
Сдается мне, надо-таки обработчиком назначать метод класса, а не просто процедуру. Это из-за особенностей внутреннего представления процедурных переменных и передачи параметров.


 
Ega23 ©   (2004-03-12 11:24) [7]

Конкретно для Ega23возникает ошибка
Стоп, но я же могу, допустим, у TEdit метод OnExit переопределить?
Хотя это Event... Или только события переопределять можно?


 
AleKo   (2004-03-12 11:31) [8]

Возможно вопрос решается так

var
 EasyFileSearch1: TEasyFileSearch;
 MyProcedyre: TOnFileFound; // это процедурный тип этого события

и тпереь вопрос как обьявить и описать процедуру
MyProcedure.


 
Anatoly Podgoretsky ©   (2004-03-12 11:34) [9]

Процедуру нельзя использовать в качестве обработчика события, нужен метод класса.


 
PVOzerski ©   (2004-03-12 11:35) [10]

Наверное так:
tDummyClass=class
class procedure MyProcedure(<параметры>);
end;
...
EasyFileSearch1.onFileFound:=tDummyClass.MyProcedure;


 
AleKo   (2004-03-15 03:41) [11]

Предлагаю возобновить дискуссию.
После того как я объявил процедуру
var
EasyFileSearch1: TEasyFileSearch;
MyProcedyre: TOnFileFound; // это процедурный тип этого события

в программе возможно сделать присваивание

EasyFileSearch1.OnFileFound:=MyProcedure;

и компилятор это пропускает, но как теперь описать MyProcedure
если я просто напишу

procedure MyProcedure(параметры);

появится ошибка редекларирования. Ваше мнение.


 
AleKo   (2004-03-15 07:07) [12]

?


 
Defunct ©   (2004-03-15 07:29) [13]

Возможно вопрос решается так

var
EasyFileSearch1: TEasyFileSearch;
MyProcedyre: TOnFileFound; // это процедурный тип этого события


Да так он решается:

 Procedure MyHandler(Self, Sender: TObject; ... ... остальные параметры);

...
...
 TMethod(MyProcedure).Code := @MyHandler;
 TMethod(MyProcedure).Data := EasyFileSearch1;
 EasyFileSearch1.OnFileFound:=MyProcedure;

 


 
AleKo   (2004-03-15 07:55) [14]

А что делает процедура MyHandler.


 
Defunct ©   (2004-03-15 08:03) [15]

> А что делает процедура MyHandler.

Это ваш обработчик события OnFileFound


 
AleKo   (2004-03-15 08:15) [16]

Все получилось. Спасибо огромное.


 
evvcom   (2004-03-15 08:16) [17]

Можно немного попроще:
type
 PMethod = ^TMethod;
...
 PMethod(@@OnFileFound)^.Code := @MyHandler;
 // PMethod(@@OnFileFound)^.Data - можно вовсе не трогать,
 // а в MyHandler не использовать Self (все равно никакого смысла)


 
Defunct ©   (2004-03-15 08:57) [18]

evvcom   (15.03.04 08:16) [17]
что-то я не пойму зачем там двойной указатель?

@@?

Раз уж на то пошло, просто можно написать:
TMethod(EasyFileSearch1.OnFileFound).Code := @MyHandler;


 
Defunct ©   (2004-03-15 09:00) [19]

пардон, не учел, что OnFileFound это property


 
evvcom   (2004-03-15 09:11) [20]


> что-то я не пойму зачем там двойной указатель?

Потому что с одним, компилятор поймет не так как нам надо. Я пробовал.


 
AleKo   (2004-03-15 09:21) [21]

Попутный вопрос.
Как мне получить доступ к передаваемой в событие переменной если событие описано как

procedure EasyFSF(FileFound: TFileInformations);


 
AleKo   (2004-03-15 09:22) [22]

Попутный вопрос.
Как мне получить доступ к передаваемой в событие переменной если событие описано как

procedure onFileFound(FileFound: TFileInformations);


 
Anatoly Podgoretsky ©   (2004-03-15 09:42) [23]

Обращайся прямо к FileFound, зачем еще какие то извращения


 
AleKo   (2004-03-15 10:05) [24]

Возникает ошибка времени выполнения.
EAccessViolation.


 
evvcom   (2004-03-15 10:21) [25]

Код пожалуйста. Декларация обработчика, присвоение, вызов...


 
Anatoly Podgoretsky ©   (2004-03-15 10:24) [26]

Значит передается неверное значение или ты с ним неправильно оперерируешь


 
AleKo   (2004-03-15 10:43) [27]

Это оригинальное объявление событич в комопненте.

TOnFileFound   = procedure (FileFound : TFileInformations) of object;

procedure TEasyFileSearch.pOnFileFound(FileFound : TFileInformations);
begin
 if assigned(fOnFileFound)=True then fOnFileFound(FileFound);
end;


 
AleKo   (2004-03-15 10:47) [28]

Это код в моей программе

var
 Form1: TForm1;
 EasyFileSearch1: TEasyFileSearch;
 EasyFSFileFound: TOnFileFound;

procedure EasyFSF(FileFound : TFileInformations);

implementation

{$R *.dfm}

procedure EasyFSF(FileFound : TFileInformations);
begin
   ShowMessage(FileFound.Name);
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
   EasyFileSearch1:=TEasyFileSearch.Create(Self);
////////////////////////////////////////////////////
   TMethod(EasyFSFileFound).Code:=@EasyFSF;
   TMethod(EasyFSFileFound).Data:=EasyFileSearch1;
   EasyFileSearch1.OnFileFound:=EasyFSFileFound;
////////////////////////////////////////////////////
   EasyFileSearch1.DateFilterFirstDate:=10;
   EasyFileSearch1.DateFilterKind:=dfkBefore;
   EasyFileSearch1.FileNames.Clear;
   EasyFileSearch1.FileNames.Add("*.*");
   EasyFileSearch1.RootPath:="d:\";
   EasyFileSearch1.SearchOptions:=[okIncludeSubfolder,okLookForArchiveFile,okLookForAnyFile];

   EasyFileSearch1.DateFilterFileAccess:=dfakOpenedFiles;
   EasyFileSearch1.Search;
end;


 
evvcom   (2004-03-15 10:56) [29]


>  if assigned(fOnFileFound)=True then fOnFileFound(FileFound);

Интересно, кто писал такой код? Сравнивать булево значение с булевой константой оригинально! Читаю дальше...


 
evvcom   (2004-03-15 11:08) [30]

procedure EasyFSF(Self: TObject; FileFound : TFileInformations);

Внимательнее читать [13]. Потом более компактно все же получается так [17] и еще некоторые объяснения я давал в [11] в аналогичном топике http://delphi84.valuehost.ru/cgi-bin/forum.pl?id=1079091186&n=0


 
AleKo   (2004-03-15 11:13) [31]

Все Ок!!!
Я тоже к этому подбирался. Спасибо за помощь.



Страницы: 1 вся ветка

Текущий архив: 2004.04.04;
Скачать: CL | DM;

Наверх




Память: 0.53 MB
Время: 0.032 c
14-1078603282
Piter
2004-03-06 23:01
2004.04.04
Новый клиент для форума


14-1078979847
Цветочек
2004-03-11 07:37
2004.04.04
Редактировать ключевое поле


1-1079117965
Dest
2004-03-12 21:59
2004.04.04
Повторное использование процедур в разных формах


14-1078458896
Рамиль
2004-03-05 06:54
2004.04.04
Вирусы


6-1074686084
IgoX
2004-01-21 14:54
2004.04.04
ClientSocket1Disconnect