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

Вниз

TSession в DLL   Найти похожие ветки 

 
nikolo ©   (2002-08-21 11:05) [0]

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;


 
nikolo ©   (2002-08-21 12:48) [1]

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


 
nikolo ©   (2002-08-22 11:48) [2]

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

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;


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


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


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


 
nikolo ©   (2002-08-22 12:06) [4]

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


 
Digitman ©   (2002-08-22 12:21) [5]

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



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:31) [6]

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

sePassword.OnPassword := SessionOnPassword;

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

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


 
nikolo ©   (2002-08-22 13:10) [7]

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


 
Digitman ©   (2002-08-22 13:40) [8]

>nikolo

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

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



 
nikolo ©   (2002-08-22 13:49) [9]

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

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 14:26) [10]

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


 
nikolo ©   (2002-08-22 14:59) [11]

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

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 15:29) [12]

var
MyPasswordHandler: TOnPassword;
...

MyPasswordHandler := TOnPassword.Create;
try

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

finally
MyPasswordHandler.Free;
end;


 
nikolo ©   (2002-08-22 15:48) [13]

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


 
Digitman ©   (2002-08-22 15:52) [14]

>nikolo

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



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

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

Наверх




Память: 0.5 MB
Время: 0.017 c
3-3269
pave1
2002-08-12 13:42
2002.09.02
Delphi + MySql


1-3364
TBeginner
2002-08-22 09:12
2002.09.02
Указатели


14-3591
Тракторист
2002-08-06 17:54
2002.09.02
Внимание задача для млада и стара!


1-3342
hooky-mars
2002-08-21 17:10
2002.09.02
Кнопари


14-3609
AL2002
2002-08-01 18:40
2002.09.02
---|Ветка была без названия|---