There is no way you can add custom parameters to a pre-existing event (without altering the component's source code). But there are some options you can try to manipulate how your event handler operates.
The easiest solution would be to just derive a new class from TGSMObj
and add a TFDConnection
field to it, eg:
type
TMyGSMObj = class(TGSMObj)
DB: TFDConnection;
end;
// 'class' methods can be used as event handlers, so you don't
// need to create a global object instance of this class...
TEventHandlers = class
class procedure ReadMessage(Sender: TObject; MessageText: WideString; PhoneNumber, CenterNumber: AnsiString; TimeStamp: TDateTime; TimeZone, Status, Index: Integer);
end;
function SMSReceive(dbMain: TFDConnection): Boolean;
var
cSMS: TMyGSMObj;
begin
cSMS := TMyGSMObj.Create(nil);
cSMS.DB := dbMain;
cSMS.OnReadMessage := TEventHandlers.ReadMessage;
cSMS.ReadSms;
end;
class procedure TEventHandlers.ReadMessage(Sender: TObject; MessageText: WideString; PhoneNumber, CenterNumber: AnsiString; TimeStamp: TDateTime; TimeZone, Status, Index: Integer);
begin
TMyGSMObj(Sender).DB.ExecSQL('INSERT INTO ...');
end;
Or, if TGSMObj
is a TComponent
descendant, you can use its Tag
property to hold the TFDConnection
pointer, eg:
type
TEventHandlers = class
class procedure ReadMessage(Sender: TObject; MessageText: WideString; PhoneNumber, CenterNumber: AnsiString; TimeStamp: TDateTime; TimeZone, Status, Index: Integer);
end;
function SMSReceive(dbMain: TFDConnection): Boolean;
var
cSMS: TGSMObj;
begin
cSMS := TGSMObj.Create(nil);
cSMS.Tag := NativeInt(dbMain);
cSMS.OnReadMessage := TEventHandlers.ReadMessage;
cSMS.ReadSms;
end;
class procedure TEventHandlers.ReadMessage(Sender: TObject; MessageText: WideString; PhoneNumber, CenterNumber: AnsiString; TimeStamp: TDateTime; TimeZone, Status, Index: Integer);
begin
TFDConnection(TGSMObj(Sender).Tag).ExecSQL('INSERT INTO ...');
end;
Or, you can use the TMethod
record to coerce the Self
parameter of your event handler to point to whatever you want, eg:
type
TEventHandlers = class
class procedure ReadMessage(Sender: TObject; MessageText: WideString; PhoneNumber, CenterNumber: AnsiString; TimeStamp: TDateTime; TimeZone, Status, Index: Integer);
end;
function SMSReceive(dbMain: TFDConnection): Boolean;
var
cSMS: TGSMObj;
Handler: TWhateverTypeOnReadMessageUses;
begin
Handler := TEventHandlers.ReadMessage;
TMethod(Handler).Data := dbMain;
cSMS := TGSMObj.Create(nil);
cSMS.OnReadMessage := Handler;
cSMS.ReadSms;
end;
class procedure TEventHandlers.ReadMessage(Sender: TObject; MessageText: WideString; PhoneNumber, CenterNumber: AnsiString; TimeStamp: TDateTime; TimeZone, Status, Index: Integer);
begin
TFDConnection(Self).ExecSQL('INSERT INTO ...');
end;
Alternatively, using TMethod
anyway, you can use a standalone procedure rather than a class method, eg:
procedure ReadMessage(Self: Pointer; Sender: TObject; MessageText: WideString; PhoneNumber, CenterNumber: AnsiString; TimeStamp: TDateTime; TimeZone, Status, Index: Integer);
begin
TFDConnection(Self).ExecSQL('INSERT INTO ...');
end;
function SMSReceive(dbMain: TFDConnection): Boolean;
var
cSMS: TGSMObj;
Handler: TWhateverTypeOnReadMessageUses;
begin
TMethod(Handler).Data := dbMain;
TMethod(Handler).Code := @ReadMessage;
cSMS := TGSMObj.Create(nil);
cSMS.OnReadMessage := Handler;
cSMS.ReadSms;
end;
Or, a class helper might work (I haven't tried this one myself), eg:
type
TFDConnectionHelper = class helper for TFDConnection
public
procedure ReadMessage(Sender: TObject; MessageText: WideString; PhoneNumber, CenterNumber: AnsiString; TimeStamp: TDateTime; TimeZone, Status, Index: Integer);
end;
function SMSReceive(dbMain: TFDConnection): Boolean;
var
cSMS: TGSMObj;
begin
cSMS := TGSMObj.Create(nil);
cSMS.OnReadMessage := dbMain.ReadMessage;
cSMS.ReadSms;
end;
procedure TFDConnectionHelper.ReadMessage(Sender: TObject; MessageText: WideString; PhoneNumber, CenterNumber: AnsiString; TimeStamp: TDateTime; TimeZone, Status, Index: Integer);
begin
Self.ExecSQL('INSERT INTO ...');
end;