Главная страница
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.01 c
14-19330
Андрей Сенченко
2002-01-09 18:54
2002.03.07
Вопросы - ответы ...


1-19183
dart
2002-02-18 14:58
2002.03.07
Два вопроса


1-19258
Demon[DZ]
2002-02-20 15:10
2002.03.07
Component package


1-19200
MK
2002-02-16 18:28
2002.03.07
Форма на весь экран


4-19371
otari
2002-01-04 21:28
2002.03.07
Как мне отправить e-mail без pop3 or smtp