Criar Evento De Botão Em Form Dinâmico, Tem como?

30/06/2008

6

Fala pessoal,

Estou criando uma função que cria um form e dois botões, como se fosse um MessageBox ou um DialogBox, mas eu não to conseguindo criar as procedures para ligar ao onclick dos botões desse form dinâmico.
Vou postar o código:

function TfrmPadrao.CarregaListaEMail: String;
var
  frmLista : TForm;
  btnOK, btnCancelar : TButton;
  chkOK : Booelan;

  procedure OKClick(Sender: TObject);
  begin
    chkOK := True;
  end;

  procedure CancelarClick;
  begin
    chkOK := False;
  end;
begin
  // Criando o Form dinâmico
  //
  frmLista := TForm.Create(Self);
  frmLista.Position := poScreenCenter;
  frmLista.BorderStyle := bsSingle;
  frmLista.BorderIcons := [biSystemMenu];
  frmLista.Caption := ´Lista de Emails´;
  frmLista.Height := 316;
  frmLista.Width := 376;

  // Criando os Botões
  //
  btnOK := TButton.Create(Self);
  btnOK.Parent := frmLista;
  btnOK.Height := 36;
  btnOK.Width := 100;
  btnOK.Left := 8;
  btnOK.Top := 250;
  btnOK.Caption := ´OK´;

  // btnOK.OnClick := OKClick;  // <<<=== AQUI DA ERRO, PORQUE???


  // Mostra o Form
  //
  frmLista.ShowModal;


  FreeAndNil(frmLista);
end;


valew [/code]


Responder

Posts

30/06/2008

Brunodsr

Ta dando pau pq a tua funcao tem que possuir visibilidade pelo menos a nivel de unit.

Declara ela no private do teu form e testa novamente.

private
{ Private declarations }
procedure OKClick(Sender: TObject);

btnOK.OnClick := OKClick; //OKClick; // <<<=== AQUI DA ERRO, PORQUE???

Espero ter ajudado


Responder

30/06/2008

Seu_madruga

Ta dando pau pq a tua funcao tem que possuir visibilidade pelo menos a nivel de unit. Declara ela no private do teu form e testa novamente. private { Private declarations } procedure OKClick(Sender: TObject); btnOK.OnClick := OKClick; //OKClick; // <<<=== AQUI DA ERRO, PORQUE??? Espero ter ajudado


Hum, entendi mas eu queria poder programar a procedure do evento do meu botão pra poder deixar o código protegido dentro da junção entende. Da forma que vc me passou funciona perfeito, mas queria mesmo uma forma de criar a procedures dentro da função. Será que realmente o que eu estou tentando fazer não tem como???

Abraço


Responder

30/06/2008

Brunodsr

Nao cara... infelizmente nao. SubProcedures sao privadas às procedures owner. Do jeito atual, tuas procedures saem de memoria assim que o fluxo da principal sai de memoria. Ex.:
Procedure teste;
  procedure subProc;
  begin
    showmessahe(´teste´);
  end;
begin
  subProc; 
end;//subproc retirado de memoria aqui...


No exemplo acima, a procedure subProc é retirada da pilha assim que a procedure teste é executada.

Outra forma de fazer do jeito que vc quer é usar classes e tornar as procedures privadas na classe, mas fico mto baguncado.. rola nao.

Eu aconselho voce a usar bibliotecas de procedures e aponte p/ elas qndo necessario.

Cria todas as suas procedures em uma unit so. E aponta sempre pra ela.

Espero ter ajudado.


Responder

01/07/2008

Seu_madruga

Então as programações dos botões nos MessageBox, o Delphi tbém tem essas procedures fora das funções? Achei q tinha uma forma de colcoar as procedures dentro. Mas como é que funciona então se eu declaro uma procedure dentro da função e consigo usar ela dentro sem problemas?


Responder

01/07/2008

Comodelphi

boa tarde seu madruga, a questao de visibilidade nem entraria no seu caso neste momento, provavelmente o erro que vc esta tendo é ao complilar seu projeto: ´Imcompatible Types: method pointer and regular procedure´. O que o ocorre é que vc não pode usar um método comum para delegar para o evento do botão, que é um tipo ´procedure of object´. quer dizer que o método que vc vai passar para o evento deve estar defininido em uma classe, no caso do OnClick do TButton é um método do tipo TNotifyEvent = procedure(Sender: TObject) of object; Então vc poderia criar uma calsse bem simples somente para conter seu método customizado e aplicar da forma que deseja:

TClassex = class
  private
    procedure CustomClick(Sender: TObject);
end;


A questão de escopo ocorrerá a partir do momento que vc decidir criar e usar os metodos da classe TClassex;


Responder

02/07/2008

Seu_madruga

comodelphi

eu entendi sua explicação em partes hehehe.
Se em um botão qualquer eu consigo colocar no onClick qualquer procedures que tenha sido criada na unit, porque não posso ligar a uma que está dentro da procedure. qual a diferença entre a minha procedure criada dentro de outra procedure ou de uma procedure criada publica ou privada do form?

Vc disse q a procedure tem q ser do tipo TNofifiedEvent certo? Nao conseguiria criar essa procedure interna com esse tipo?

Talvez fazendo um cast?

Valew pela ajuda


Responder

02/07/2008

Brunodsr

Bicho.. na boa? Faz o simples.

Como falei antes, procedures declaradas dentro de procedures sao restritas a estas procedures. Vc nao pode apontar um evento de um componente a uma procedure declarada assim.

Faca como te falei.. crie uma unit para guardar todos esses eventos e use essa unit em forma de biblioteca. É a forma mais facil.

Usa o exemplo que eu coloquei la em cima no post anterior.

Obs.: Se ligue no que o nosso amigo falou:

type TNotifyEvent = procedure (Sender: TObject) of object;

Portanto, crie uma classe para guardar essas procedures.


Responder

02/07/2008

Comodelphi

vou tentar explicar de forma mais simples, uma procedure criada comum um bloco de código comum pascal, não é uma variável´tipada´ portanto não pode ser atribuido a um evento de uma classe. Vc pode até usar a procedure não ´tipada´, como CallBack Procedure no OnClick do botão, mas acredito ser uma solução mais dificil de implementar em relação a escrever uma classe simples.


Responder