![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Обработка eventов в консольном приложении
Deus © (2002-02-20 18:48:00)Добрый день.
В консольном приложении я создаю объект TDataBase и хочу назначить обработчик события OnLogin, но компилятор ругается:
Incompatible types: method pointer and regular procedure.
Код такой:
program MV;
{$APPTYPE CONSOLE}
uses
SysUtils,
DBTables,
Db, classes,
OracleData,
Oracle;
var
Database1: TDatabase;
procedure Database1Login(Database: TDatabase; LoginParams: TStrings);
procedure Database1Login(Database: TDatabase; LoginParams: TStrings);
begin
LoginParams.Clear;
LoginParams.Add(format("USER NAME=%s",[paramstr(2)]));
LoginParams.Add(format("PASSWORD=%s",[paramstr(3)]));
end;
begin
Database1:=TDatabase.Create(nil);
with DataBase1 do begin
DatabaseName := "WC";
OnLogin := Database1Login;
AliasName:=paramstr(1);
end;
OnLogin объявлен так:
TDatabaseLoginEvent = procedure(Database: TDatabase;
LoginParams: TStrings) of object;
т.е. когда эта процедура принадлежит объекту - то всё ок.
Но делать ненужный объект не хочется.
Как можно это обойти?
Юрий Зотов (2002-02-20 19:06:00) [1]> какая разница между методом объекта и просто процедурой
В метод объекта неявно передается еще один параметр - Self.
Набережных С. (2002-02-20 19:04:00) [2]Или объяви ее в наследнике TDataBase - все равно ведь DataBase1 создаешь в рунтайме.
Юрий Зотов (2002-02-20 19:04:00) [3]Заставьте TDataBase обрабатывать его же событие:
type
TMyDataBase = class(TDataBase)
private
procedure OnLoginHandler(Database: TDatabase; LoginParams: TStrings);
public
constructor Create(AOwner: TComponent); override;
end;
...
constructor TMyDataBase.Create(AOwner: TComponent);
begin
inherited;
OnLogin := OnLoginHandler
end;
procedure TMyDataBase.OnLoginHandler(Database: TDatabase; LoginParams: TStrings);
begin
with LoginParams do
begin
Clear;
Add(format("USER NAME=%s",[paramstr(2)]));
Add(format("PASSWORD=%s",[paramstr(3)]))
end
end;
Deus (2002-02-20 19:02:00) [4]2Набережных С:
Большое спасибо. Всё ок.
Deus (2002-02-20 18:59:00) [5]IMHO, должен быть способ, ибо:
ru.delphi.faq:
Q: Как использовать в качестве обработчика сообщения обычную
процедуру, а не метод объекта?
A: У этой процедуры должен быть еще один дополнительный параметр,
например:
procedure MyEventHandler(PseudoSelf : TObject; Sender : TObject);
begin
{ ... }
end;
Но в моём случае это не катит, так как TDatabaseLoginEven - это не просто TEvent.
И вообще, какая разница между методом объекта и просто процедурой? По большому счёту, и то, и другое - кусок кода....
Набережных С. (2002-02-20 18:59:00) [6]сделай так:
TP = class
class procedure Database1Login(Database: TDatabase;
LoginParams: TStrings);
end;
[NIKEL] (2002-02-20 18:59:00) [7]а зачем именно OnLogin если передаються тока имя и пароль???
создал объект и добавил параметры сразу...
Юрий Федоров (2002-02-20 18:51:00) [8]Никак. Процедура должна быть методом