Форум: "Основная";
Текущий архив: 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.034 c