tags:

views:

168

answers:

1

I admit this is the first time I use inheritance,so I might even have choosen the wrong way,that's why I'm here asking you.

I wrote a Message Handler in my delphi application to catch the messages from WSAAsyncSelect()

procedure FormMain.MessageHandler(var Msg:Tmessage);
begin
  case WSAGetSelectEvent(MSG.LParam) of
    FD_READ: //OnSocketRead(MSG.WParam);
    FD_CLOSE: //OnSocketClose(MSG.WParam);
  end;
end;

The problem is that OnSockerRead and OnSocketClose are functions in another class.

I want to make a good relationship between the classes so the class with those two functions can access it's parent ,but in the same time the things to be private to other classes.

Please show me an example how should I do it,because I don't know if it's better to be abstract or inherited since I have never used both of them.I want to make my code more OO.

Thank you!

+7  A: 

One thing you can do is to use interfaces to gain access to main form functionality. For example, lets say that you want to call either SocketRead or SocketClose which are on the main form from your child form. you COULD just use mainform in the implementation of the unit, but I try to avoid these types of circular references. The other option is to create a new unit to contain a shared interface and use it by both the main form and the child unit. For example:

unit MainFormShared;
interface
type
  IMainFormShared = interface
    ['{A2C624D5-DDCF-49D6-8B03-791BA0B79A42}']
    procedure SocketRead(var Handle : Integer);
    procedure SocketClose(Var Handle : Integer);
  end;
implementation
end.

your main form would implement this interface (ok to keep the implementation private):

type
  tMainForm = class(TForm,IMainFormShared)
  :
  private
    procedure SocketRead(var Handle : Integer);
    procedure SocketClose(Var Handle : Integer);
  end;

From the parent object in your inheritance chain you can implement your message handler like so:

procedure TParentForm.MessageHandler(var Msg:Tmessage);
var
  fMainFormShared : IMainFormShared;
begin
  case WSAGetSelectEvent(MSG.LParam) of
    FD_READ: 
      if Supports(Application.MainForm, IMainFormShared,fMainFormShared) then  
        fMainFormShared.SocketRead(Msg.WParam);
    FD_CLOSE: //OnSocketClose(MSG.WParam);
      if Supports(Application.MainForm, IMainFormShared,fMainFormShared) then  
        fMainFormShared.SocketClose(Msg.WParam);
  end;
end;
skamradt
Wish I could upvote more!
John
@John, Welcome to the dark side. :)
skamradt