Главная страница
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.013 c
1-19188
Egor111
2002-02-18 17:04
2002.03.07
Преобразование типов данных


3-19106
klnyaz17
2002-02-08 15:07
2002.03.07
Где просмотреть поле значения которого представляют собой HTML страницы?


1-19255
hex_for_delphi
2002-02-20 06:49
2002.03.07
как управлять мышю


14-19347
mart
2002-01-19 03:14
2002.03.07
Билль о правах личности.


1-19144
ZEE
2002-02-06 04:14
2002.03.07
Создание/удаление компонентов в RunTime