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

Вниз

Обработка eventов в консольном приложении   Найти похожие ветки 

 
Deus   (2002-02-20 18:48) [0]

Добрый день.

В консольном приложении я создаю объект 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 18:51) [1]

Никак. Процедура должна быть методом


 
Deus   (2002-02-20 18:59) [2]

IMHO, должен быть способ, ибо:
ru.delphi.faq:

Q: Как использовать в качестве обработчика сообщения обычную
процедуру, а не метод объекта?

A: У этой процедуры должен быть еще один дополнительный параметр,
например:

procedure MyEventHandler(PseudoSelf : TObject; Sender : TObject);
begin
{ ... }
end;

Но в моём случае это не катит, так как TDatabaseLoginEven - это не просто TEvent.
И вообще, какая разница между методом объекта и просто процедурой? По большому счёту, и то, и другое - кусок кода....


 
Набережных С.   (2002-02-20 18:59) [3]

сделай так:


TP = class
class procedure Database1Login(Database: TDatabase;
LoginParams: TStrings);
end;


 
[NIKEL] ©   (2002-02-20 18:59) [4]

а зачем именно OnLogin если передаються тока имя и пароль???
создал объект и добавил параметры сразу...


 
Deus   (2002-02-20 19:02) [5]

2Набережных С:
Большое спасибо. Всё ок.


 
Набережных С.   (2002-02-20 19:04) [6]

Или объяви ее в наследнике TDataBase - все равно ведь DataBase1 создаешь в рунтайме.


 
Юрий Зотов ©   (2002-02-20 19:04) [7]

Заставьте 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;


 
Юрий Зотов ©   (2002-02-20 19:06) [8]

> какая разница между методом объекта и просто процедурой

В метод объекта неявно передается еще один параметр - Self.



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

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

Наверх




Память: 0.48 MB
Время: 0.008 c
6-19286
NetBreaker666
2001-12-20 14:38
2002.03.07
Как получать в CGI данные, переданные методом Post???


1-19263
alextov
2002-02-20 14:28
2002.03.07
Существует ли в Delphi какой-либо аналог процедуры Readkey, Readln.


3-19064
KAA
2002-02-07 14:40
2002.03.07
200 откат транзакций


4-19375
BDRON
2002-01-08 18:12
2002.03.07
Handle шпион


1-19241
Baz
2002-02-19 15:14
2002.03.07
Хэндл чего я взял?