Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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
7-3640
Arkady
2002-06-22 08:16
2002.09.02
Печать


7-3633
neo_max
2002-06-21 12:53
2002.09.02
Вопрос !!!!


14-3564
$ k e l e t
2002-08-05 19:42
2002.09.02
Как летать в GTA 3 с кодом Chittychittybb?


14-3623
Vile
2002-08-08 13:51
2002.09.02
HELP !!! HELP !!! HELP


1-3405
MJH
2002-08-22 11:49
2002.09.02
Своство компонента типа строка, но с выпадающим списком...





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский