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