Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

TSession в DLL [D5]


nikolo ©   (2002-08-21 11:05:00) 

Hi! Проблема в следующем. Если я в основной программе событию OnPassword компонента TSession присваиваю свою функцию, то все работает без проблем (см. код), но!, если то же самое сделать в DLL, то компилятор выдает ошибку. В чем проблема и как ее можно порешать?

function TForm1.MyOnPassword(Sender: TObject; var Continue: Boolean): Boolean;
begin
...
end;

function TForm1.GetPass: String;
var
sePass: TSession;
tbPass: TTable;
begin
sePass := TSession.Create(nil);
tbPass := TTable.Create(nil);
sePass.OnPassword := MyOnPassword; //проблема здесь
try
tbPass.Open;
...
finally
sePass.Free;
tbPass.Free;
end;
end;


Digitman   (2002-08-22 15:52:00) [1]

>nikolo

Ты хоть понял теперь, о чем речь-то шла ? Или снова - слепо "воткнув" код, на сем успокоился : "заработала" и ладно ?


nikolo   (2002-08-22 15:48:00) [2]

> Digitman ©, большое спасибо, заработала!


Digitman   (2002-08-22 15:29:00) [3]

var
MyPasswordHandler: TOnPassword;
...

MyPasswordHandler := TOnPassword.Create;
try

...
sePassword.OnPassword := MyPasswordHandler.SessionOnPassword;
...

finally
MyPasswordHandler.Free;
end;


nikolo   (2002-08-22 14:59:00) [4]

Я пробую делать так:

type
TOnPassword = class(TObject)
Procedure SessionOnPassword(Sender: TObject; var Continue: Boolean);
end;

...

Procedure TOnPassword.SessionOnPassword(Sender: TObject; var Continue: Boolean);
Begin
if fmPassword.ShowModal = 1 then begin
(Sender as TSession).AddPassword(fmPassword.edPass.Text);
Continue := True;
end
else
Continue := False;
End;


, но все равно ошибка "Undeclared identifier: "SessionOnPassword""

Не можешь просто написать, как надо делать, чтобы понять саму суть проблемы?


Digitman   (2002-08-22 14:26:00) [5]

Ну так и что ж ты хочешь ? Снова у тебя SessionOnPassword() - обычная процедура, а не метод некоего объекта, как это требуется при назначении обработчика события OnPassword()


nikolo   (2002-08-22 13:49:00) [6]

Привожу полный код:

library my_lib;

uses
ShareMem, Windows, SysUtils, Classes, Forms, DBTables,
Password in "Password.pas" {fmPassword};

{$R *.RES}


Procedure SessionOnPassword(Sender: TObject; var Continue: Boolean);
Begin
if fmPassword.ShowModal = 1 then begin
(Sender as TSession).AddPassword(fmPassword.edPass.Text);
Continue := True;
end
else
Continue := False;
End;

Function CheckPassword(AppHandle: THandle; DatabaseName, TableName, DialogCaption, Password: PChar): Integer; stdcall;
Var
tbPassword: TTable;
sePassword: TSession;
Continue: Boolean;
Begin
Application.Handle := AppHandle;
sePassword := TSession.Create(nil);
tbPassword := TTable.Create(nil);
fmPassword := TfmPassword.Create(Application);
sePassword.SessionName := "PasswordSession";
tbPassword.SessionName := sePassword.SessionName;
sePassword.OnPassword := SessionOnPassword; // Здесь ошибка
try
fmPassword.Caption := DialogCaption;
tbPassword.DatabaseName := DatabaseName;
tbPassword.TableName := TableName;
try
tbPassword.Open;
StrCopy(Password, PChar(fmPassword.edPass.Text));
Result := 1;
except
if Not tbPassword.Active then Result := 0;
end;
finally
tbPassword.Close;
sePassword.RemoveAllPasswords;
fmPassword.Free;
tbPassword.Free;
sePassword.Free;
end;
End;

exports
CheckPassword name "CheckPassword";

begin
end.


Digitman   (2002-08-22 13:40:00) [7]

>nikolo

Что скажу ? Скажу одно : вслепую ты тычешься от незнания базовых концепций)

Приводи ТОЧНЫЙ код, соответствующий полученной диагностике
"Incompatible types: method pointer and regular procedure"


nikolo   (2002-08-22 13:10:00) [8]

> Digitman ©, что скажешь?


nikolo   (2002-08-22 12:31:00) [9]

> Digitman ©, все здорово, так конечно работает, я до этого так именно и делал, но проблема в том, когда все один к одному переносишь в DLL, то на строке:

sePassword.OnPassword := SessionOnPassword;

возникает ошибка: "Incompatible types: method pointer and regular procedure"

Подскажи, как победить эту проблему, pls...


Digitman   (2002-08-22 12:21:00) [10]

Знал бы - не спрашивал.



interface

TfmMain = class(...)
...
procedure SessionOnPassword(Sender: TObject; var Continue: Boolean);

...
end;

...

implementation

...

procedure TfmMain.SessionOnPassword(Sender: TObject; var Continue: Boolean);
begin
...
end;



Прочувствуй разницу и не побрезгуй советом безотлагательно вникнуть в различия между понятиями "ПРОЦЕДУРА" и "ПРОЦЕДУРНЫЙ МЕТОД ОБЪЕКТА".


nikolo   (2002-08-22 12:06:00) [11]

Это я знаю, скажи как надо это использовать?


Digitman   (2002-08-22 12:01:00) [12]


type TPasswordEvent = procedure(Sender: TObject; var Continue: Boolean) of object;


nikolo   (2002-08-22 11:48:00) [13]

Мастера, помогите разобраться!

Function TfmMain.CheckPassword(AppHandle: THandle; DatabaseName, TableName, DialogCaption, Password: PChar): Integer; stdcall;
Var
tbPassword: TTable;
sePassword: TSession;
Continue: Boolean;
Procedure SessionOnPassword(Sender: TObject; var Continue: Boolean);
Begin
if fmPassword.ShowModal = 1 then begin
(Sender as TSession).AddPassword(fmPassword.edPass.Text);
Continue := True;
end
else
Continue := False;
End;
Begin
Application.Handle := AppHandle;
sePassword := TSession.Create(nil);
tbPassword := TTable.Create(nil);
fmPassword := TfmPassword.Create(Application);
sePassword.SessionName := "PasswordSession";
tbPassword.SessionName := sePassword.SessionName;
sePassword.OnPassword := SessionOnPassword; //здесь ошибка компиляции "Incompatible types: Calling conventions differ"
try
fmPassword.Caption := DialogCaption;
tbPassword.DatabaseName := DatabaseName;
tbPassword.TableName := TableName;
try
tbPassword.Open;
StrCopy(Password, PChar(fmPassword.edPass.Text));
Result := 1;
except
if Not tbPassword.Active then Result := 0;
end;
finally
tbPassword.Close;
sePassword.RemoveAllPasswords;
fmPassword.Free;
tbPassword.Free;
sePassword.Free;
end;
End;


В чем ошибка, подскажите.


nikolo   (2002-08-21 12:48:00) [14]

Народ! Откликнетесь!


Наверх

Титульная страница Поиск, карта сайта Написать письмо