Miguel; Eu estou fazendo algo parecido com o que voce mencionou com um sistema em pacotes (bpls), onde todos os form que estao em diversos pacotes usam procedimentos para salvar (entre outros) baseados no form principal (que tb esta em um bpl). eu usei a logica abaixo; esta logica funciona mesmo se cada form tiver uma maneira direfente para salvar, cancelar entre outras operações comuns. para facilitar para o todo o grupo o que estou querendo dizer. eu resolvi criar um exemplo...como segue. (fiz algo bem simples com apenas um form e com procedimentos simples (sem parametros)). se o pessoal entender a logica deste aqui...e simples implementar algo mais. Crie um novo projeto, e cole o codigo a seguir na unit1; listagem 1; Exiba o formulario em modo texto. (alt+ f12) com o form visivel cole a listagem 2, volte para o modo form (alt + f12 de novo) e salve/compile...execute; brinque um poquinho e me responda, se ajuda? Atenciosamente; Elazar LISTAGEM 1 unit Unit1; interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type tProced = Procedure of Object; TForm1 = class(TForm) btnBusca: TButton; btnCancela: TButton; btnSalvar: TButton; btnNaoClique: TButton; btnAjustar: TButton; procedure btnBuscaClick(Sender: TObject); procedure btnCancelaClick(Sender: TObject); procedure btnSalvarClick(Sender: TObject); procedure btnNaoCliqueClick(Sender: TObject); procedure btnAjustarClick(Sender: TObject); private { Private declarations } public { Public declarations } pSalva : tProced; pBusca : tProced; pCancela : tProced; pViaja : tProced; procedure ProcedimentoQueSalva( Proced : tProced); procedure ProcedimentoQueBusca( Proced : tProced); procedure ProcedimentoQueCancela( Proced : tProced); procedure ProcedimentoQueViaja( Proced : tProced);
{ Estas seguintes procedure devem ficar nos forms.... so coloquei aqui para nao criar outros e facilitar o projeto } procedure FormFilhoSalvar; { Digamos que este e o procedimento que salva no form filho, que anteriormente estava no click do botao } procedure FormFilhoBuscar; procedure FormFilhoCancelar; procedure FormFilhoViajar; end; var Form1: TForm1; implementation {$R *.DFM} { TForm1 } { ************************** AJUSTAM NO FORM PRINCIPAL UMA REFERENCIA AO PROCEDIMENTO QUE ESTA NO FORM FILHO ************** } procedure TForm1.ProcedimentoQueBusca(Proced: tProced); begin pBusca := Proced; end; procedure TForm1.ProcedimentoQueCancela(Proced: tProced); begin pCancela := Proced; end; procedure TForm1.ProcedimentoQueSalva(Proced: tProced); begin pSalva := Proced; end; procedure TForm1.ProcedimentoQueViaja(Proced: tProced); begin pViaja := Proced; end; { ************************ FAZENDO COM QUE O PROCEDIMENTO SEJA EXECUTADO } procedure TForm1.btnBuscaClick(Sender: TObject); begin if Assigned(pBusca) then pBusca; end; procedure TForm1.btnCancelaClick(Sender: TObject); begin if Assigned(pCancela) then pCancela; end; procedure TForm1.btnSalvarClick(Sender: TObject); begin if Assigned(pSalva) then pSalva; end; procedure TForm1.btnNaoCliqueClick(Sender: TObject); begin if Assigned(pViaja) then pViaja; end; { Este sao os procedimento 'executado' pelos botoes de controle dos dados que 'existiam no form ' como se pode ver o botoes (acredito) foram retirados dos forms filhos e os seus eventos transformados em procedures. } procedure TForm1.FormFilhoBuscar; begin ShowMessage('Busca'); { ....comandos de busca...etc..} end; procedure TForm1.FormFilhoCancelar; begin ShowMessage('Cancelar'); end; procedure TForm1.FormFilhoSalvar; begin ShowMessage('Salvar '); end; procedure TForm1.FormFilhoViajar; begin ShowMessage('Viajando'); end; { quando voce criar o form principal voce deve ligar os 'procedimentos acima' com o form principal } procedure TForm1.btnAjustarClick(Sender: TObject); begin {Chama o form principal, passando como parametro o procedimento que deve ser executado } ProcedimentoQueSalva( FormFilhoSalvar); ProcedimentoQueBusca( FormFilhoBuscar); ProcedimentoQueCancela( FormFilhoCancelar); ProcedimentoQueViaja(FormFilhoViajar); end; end. LISTAGEM 2 object Form1: TForm1 Left = 403 Top = 233 Width = 308 Height = 195 Caption = 'Form1' Color = clBtnFace Font.Charset = DEFAULT_CHARSET Font.Color = clWindowText Font.Height = -11 Font.Name = 'MS Sans Serif' Font.Style = [] OldCreateOrder = False PixelsPerInch = 96 TextHeight = 13 object btnBusca: TButton Left = 200 Top = 24 Width = 75 Height = 25 Caption = 'Busca' TabOrder = 0 OnClick = btnBuscaClick end object btnCancela: TButton Left = 200 Top = 52 Width = 75 Height = 25 Caption = 'Cancela' TabOrder = 1 OnClick = btnCancelaClick end object btnSalvar: TButton Left = 200 Top = 80 Width = 75 Height = 25 Caption = 'Salvar' TabOrder = 2 OnClick = btnSalvarClick end object btnNaoClique: TButton Left = 176 Top = 108 Width = 99 Height = 25 Caption = 'Nao clique aqui' TabOrder = 3 OnClick = btnNaoCliqueClick end object btnAjustar: TButton Left = 12 Top = 40 Width = 75 Height = 25 Caption = 'Ajustar' TabOrder = 4 OnClick = btnAjustarClick end end [As partes desta mensagem que não continham texto foram removidas] -- <<<<< FAVOR REMOVER ESTA PARTE AO RESPONDER ESTA MENSAGEM >>>>> <*> Para ver as mensagens antigas, acesse: http://br.groups.yahoo.com/group/delphi-br/messages <*> Para falar com o moderador, envie um e-mail para: [EMAIL PROTECTED] Links do Yahoo! Grupos <*> Para visitar o site do seu grupo na web, acesse: http://br.groups.yahoo.com/group/delphi-br/ <*> Para sair deste grupo, envie um e-mail para: [EMAIL PROTECTED] <*> O uso que você faz do Yahoo! Grupos está sujeito aos: http://br.yahoo.com/info/utos.html