Newsgroup: it.comp.lang.delphi
Titolo: inviare un evento al cambio record di un ClientDataSet

al verificarsi dell'avento OnChangeRecord nel datamodule,
dovrei inviare un TNotifyEvent, in modo che l'evento associato
in un frame possa eseguire altre operazioni.
nel Frame posso solo assegnare alla property OnCambioRecord
un'altro TNotifyEvent
  frm_Dati_Spese.OnCambioRecord := OnValorizza;
dovrei invece inviare ad una procedure Private (es AltreOperazioni),
ma non posso assegnare alla property OnValorizza del Frame una
procedure.
Non credo di essere fuori strada, pero' di fatto non posso chiamare
qualcosa che non sia un TNotifyEvent.
Maurizio
- Frame -> DataModule
nel DataModule
uses
  SysUtils, Classes, FMTBcd, DB, DBClient, SqlExpr, Provider;
type
  //definisco un'evento
  TCambioRecord = procedure(Sender: TObject) of object;
  Tfrm_Dati_Spese = class(TDataModule)
    ...
    procedure Cds_SpeseAfterScroll(DataSet: TDataSet);
  private
    { Private declarations }
    FOnCambioRecord: TCambioRecord;
    procedure DoCambioRecord;
  public
    { Public declarations }
    property OnCambioRecord: TCambioRecord read FOnCambioRecord write
FOnCambioRecord;
  end;
implementation
procedure Tfrm_Dati_Spese.Cds_SpeseAfterScroll(DataSet: TDataSet);
begin
  DoCambioRecord;
end;
procedure Tfrm_Dati_Spese.DoCambioRecord;
begin
 if Assigned(FOnCambioRecord) then
  FOnCambioRecord(Self);
end;
--- nel Frame ---
type
  Tfrm_GestioneSpese = class(TFrame)
  ..........
 private
    { Private declarations }
    FValorizza: TNotifyEvent;
    procedure AlteOperazioni;
  public
    { Public declarations }
    constructor CreaFrame;
    destructor  Destroy; override;
    property OnValorizza: TNotifyEvent read FValorizza write FValorizza;
  end;
implementation
constructor Tfrm_GestioneSpese.CreaFrame;
begin
  //crea il datamodule
  frm_Dati_Spese := Tfrm_Dati_Spese.Create(nil);
  //assegna evento
  frm_Dati_Spese.OnCambioRecord := OnValorizza;
end;

 qualcosa che non sia un TNotifyEvent.
premetto che non ho letto il tuo codice ne capito a fondo la tua difficolt�,
comunque prova a guardare il post del 29/01/2010 ore 21.57.
Si parla proprio di TNotifyEvent e di un frame.
Ci dovresti riuscire.....
Buon lavoro.
Antonio

dello stesso tipo
ho creato un Form ed un Frame, mipare di aver capito tutto tranne questo
5) Assegni l'istanza di frameevents al frame che avra una property
   dello stesso tipo
Self.Frame.FrameEvents := Self.FrameEvents;
nel form ho dichiarato  Evento : TFrameEvents e quindi dichiarare
Self.Evento mi pare corretto.
ma nel frame dovrei dichiarare qualosa di simile ?
    property TestEvento: TFrameEvents ........... direi di no
la parte Self.Frame.FrameEvents non riesco ad interpretarla
[Self.Frame.FrameEvents] := Self.Evento;
saro' duro di comprendonio ma non capisco.
portate pazienza e se potete aiutemi a capire dove mi blocco.
Maurizo
unit Unit1;
interface
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, unit2;
type
  TForm1 = class(TForm)
    procedure FormCreate(Sender: TObject);
  private
    { Private declarations }
    Evento : TFrameEvents;
    procedure ProvaEvento;
  public
    { Public declarations }
  end;
var
  Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.FormCreate(Sender: TObject);
begin
  Evento := TFrameEvents.Create;
  Evento.OnFirstButton := Self.ProvaEvento;
  //5) Assegni l'istanza di frameevents al frame che avra una property
  //dello stesso tipo
  Self.Frame.FrameEvents := Self.Evento;
end;
procedure TForm1.ProvaEvento;
begin
//
end;
end.
---- Frame ----
unit Unit2;
interface
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;
type TFrameEvents = class
  private
    FOnFirstButton: TNotifyEvent;
  public
     // una property per ogni pulsante
     property OnFirstButton: TNotifyEvent read FOnFirstButton write
FOnFirstButton;
end;
type
  TFrame2 = class(TFrame)
    Button1: TButton;
  private
    { Private declarations }
  public
    { Public declarations }
  end;
implementation
{$R *.dfm}
end.

tornando al primo post, lo scopo era far comunicare l'avvenuto cambio record
al frame da cui era stato chiamato
Frame -> DataModule -> comunicazione evento cambio record al frame.
La via seguita e' un po diversa da quella indicata da A.Salvati nei post del 
08/01,
pero' credo che non ci sia diversita' con quello che suggeriva.
Maurizio
---- Datamodule ----
unit unt_Dati_Spese;
interface
uses
  SysUtils, Classes, FMTBcd, DB, DBClient, SqlExpr, Provider, 
unt_ConnettiFb;
type
   // ho aggiunto
  TCambioRecord = procedure(Sender: TObject) of object;
  Tfrm_Dati_Spese = class(TDataModule)
....
    private
       FOnCambioRecord: TCambioRecord;
       procedure DoCambioRecord;
    public
      property OnCambioRecord: TCambioRecord read FOnCambioRecord write 
FOnCambioRecord
...
procedure Tfrm_Dati_Spese.Cds_SpeseAfterScroll(DataSet: TDataSet);
begin
  //chiama TCambioRecord
  DoCambioRecord;
end;
procedure Tfrm_Dati_Spese.DoCambioRecord;
begin
 if Assigned(FOnCambioRecord) then
  FOnCambioRecord(Self);
end;
---- Frame ----
    private
        procedure AltreOperazioni(Sender: TObject);
...
constructor Tfrm_GestioneSpese.CreaFrame;
begin
  frm_Dati_Spese := Tfrm_Dati_Spese.Create(nil);
  //cosi' ogni volta che nel datamodule si ha un OnAfterScroll
  //viene chiamato DoCambioRecord
  //che a sua volta lo comunica alla procedure AltreOperazioni
  //dove c'e' liberta' di fare qualunque cosa
  frm_Dati_Spese.OnCambioRecord := AltreOperazioni;
end;
procedure Tfrm_GestioneSpese.AltreOperazioni(Sender: TObject);
begin
 ShowMessage('Evento Cambio Record');
end;

 pero' credo che non ci sia diversita' con quello che suggeriva.
il post che ti avevo suggerito era proprio quello del 29/01/2010 ore 21.57
( tuo post ).
Ti dissi come fare e tu mi risposi che andava bene.
Ora a distanza di tempo il codice che applicavi alla toolbar, lo puoi
benissimo applicare
al cambio del tuo record. Dove sta la differenza ?
Ho creduto di non capire e forse continuo a non capire, cos� per togliermi
la curiosit�
avevo pensato di scriverti in privato e chiedere lumi, ma la tua email non
mi ha aiutato
molto.
Comunque ho letto che hai risolto.
Ti saluto, buon fine settimana.
Antonio