Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2004.04.04;
Скачать: [xml.tar.bz2];

Вниз

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

 
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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.51 MB
Время: 0.045 c
3-1078512180
Игорь Ор.
2004-03-05 21:43
2004.04.04
Вывод в один DBGrid поля из нескольких связанных таблиц


14-1078857891
konstantinov
2004-03-09 21:44
2004.04.04
Как дать проекту жизнь?


14-1078488148
Rouse_
2004-03-05 15:02
2004.04.04
Такого давно не видел ;)))


1-1079344290
Elisa
2004-03-15 12:51
2004.04.04
Копирование файла


14-1078728567
reticon
2004-03-08 09:49
2004.04.04
Гипноз





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский