Форум: "Основная";
Текущий архив: 2002.03.07;
Скачать: [xml.tar.bz2];
ВнизОбработка 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;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.004 c