Jump to content

communication from class(TComponent) to TUniForm


Rebelss

Recommended Posts

Hello eveyone, i like to ask how can i send messages from a class to a UniForm, i have all the business logic in the TCustomer class, which have CustomerStateChange method and the class TCustomerView which is the view.

How can the class TCustomer can send a message to the class TCustomerView on StateChange of dsCustomer ( linked to FDQCustomer) ?  
On a traditionally windows 32 application a would use SendMessage with the TCustomerView handle, to send messages to the view.

Here is my TCustomer class code : 

unit uTCustomer;

interface

uses
  system.classes, Data.DB, FireDAC.Comp.Client, Winapi.Messages;

const
  WM_StateChange = WM_APP + 400;
  WM_AfterScroll = WM_APP + 401;
type
  TCustomer = class(TComponent)
  private
    conn: TFDConnection;
    FDQCustomer: TFDQuery;

    procedure CustomerAfterScroll(DataSet: TDataSet);
    procedure CustomerStateChange(Sender: TObject);
  public
    dsCustomer: TDataSource;
    constructor Create(AOwner: TComponent); override;
  end;

implementation

uses
  Winapi.Windows;

{ TCustomer }

procedure TCustomer.CustomerAfterScroll(DataSet: TDataSet);
begin
  SendMessage(CustomerViewHWND, WM_AfterScroll, 0, 0);
end;

procedure TCustomer.CustomerStateChange(Sender: TObject);
begin
  SendMessage(CustomerViewHWND, WM_StateChange, 0, 0);
end;

constructor TCustomer.Create(AOwner: TComponent);
begin
  inherited;

  conn := TFDConnection.Create(self);

  FDQCustomer := TFDQuery.Create(self);
  FDQCustomer.Connection := conn;

  dsCustomer := TDataSource.Create(self);
  dsCustomer.DataSet := FDQCustomer;
  dsCustomer.OnStateChange := CustomerStateChange; 	

  FDQCustomer.AfterScroll := CustomerAfterScroll;
  FDQCustomer.Open('select * from customers');
end;

end.

And here is the TCustomerView code :

unit uTCustomerView;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics,
  Controls, Forms, uniGUITypes, uniGUIAbstractClasses,
  uniGUIClasses, uniGUIForm, uTCustomer, uniGUIBaseClasses, uniEdit;

type
  TCustomerView = class(TUniForm)
    edt_idCustomer: TUniEdit;
    edt_NameCustomer: TUniEdit;
    procedure UniFormCreate(Sender: TObject);
  private
    Customer: TCustomer;
    { Private declarations }
  public
    { Public declarations }
  protected
    procedure CustomerStateChange(var msg: TMessage); message WM_StateChange;
  end;

function CustomerView: TCustomerView;

implementation

{$R *.dfm}

uses
  MainModule, uniGUIApplication, Data.DB;

function CustomerView: TCustomerView;
begin
  Result := TCustomerView(UniMainModule.GetFormInstance(TCustomerView));
end;

{ TCustomerView }

procedure TCustomerView.CustomerStateChange(var msg: TMessage);
begin
  edt_idCustomer.enabled := Customer.dsCustomer.DataSet.State in [dsInsert];
  edt_NameCustomer.enabled := Customer.dsCustomer.DataSet.State in [dsInsert];
end;

procedure TCustomerView.UniFormCreate(Sender: TObject);
begin
  Customer := TCustomer.Create(self);
end;

end.

Is this the best way to communicate  through the classes ? SendMessages ? the Unigui server handle it well ?

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Create New...