Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

manefilho

Alguém poderia me informar?

Recommended Posts

Olá pessoal do iMasters, mais uma vez aqui preciso de ajuda. Queria saber se você poderiam me dizer como eu faço para mudar o On-Click de um Button a partir de outro Button, ou seja, mudar a função de um Button a partir de outro. Exemplo:

 

Em um Form eu coloco dois Botões, em um dos botões eu quero colocar um comando que altere o On-Click do segundo Button.

 

Além desse problema, será que alguém poderia me ajudar com o Ballon Hint? Não sei commo usar. Desde já agradeço.

 

Meu email:

manefilho1@hotmail.com

Compartilhar este post


Link para o post
Compartilhar em outros sites

Para mudar o OnClick do button em tempo de execução, você precisa escrever outra procedure que tenha a mesma declaração de parâmetros que a procedure original, ou seja, no caso do onClick, sua nova procedure deve ter o apenas 1 parâmetro e ele tem que ser to tipo TObject. Para modificar em tempo de execução, você informa que o evento onClick deve chamar outra procedure. Vamos ao código:

procedure TForm1.Button1Click(Sender : TObject);
begin
 //Imagine que esta é a procedure que é executada por padrão
 ShowMessage('Eu tô aqui!');
end;

procedure TForm1.MinhaOutraProcedure(Sender : TObject);
begin
 //Esta será a procedure que passará a ser chamada no lugar da procedure acima
 ShowMessage('Eu já estou em outro lugar');
end;

procedure TForm1.Button2.Click(Sender : TObject);
begin
 //Esta é a procedure atribuída ao segundo botão
 Button1.OnClick := MinhaOutraProcedure;
 //Button1.OnClick := @MinhaOutraProcedure; //Use esta forma caso utilize o Lazarus-FreePascal
end;

Compartilhar este post


Link para o post
Compartilhar em outros sites

Para mudar o OnClick do button em tempo de execução, você precisa escrever outra procedure que tenha a mesma declaração de parâmetros que a procedure original, ou seja, no caso do onClick, sua nova procedure deve ter o apenas 1 parâmetro e ele tem que ser to tipo TObject. Para modificar em tempo de execução, você informa que o evento onClick deve chamar outra procedure. Vamos ao código:

procedure TForm1.Button1Click(Sender : TObject);
begin
 //Imagine que esta é a procedure que é executada por padrão
 ShowMessage('Eu tô aqui!');
end;

procedure TForm1.MinhaOutraProcedure(Sender : TObject);
begin
 //Esta será a procedure que passará a ser chamada no lugar da procedure acima
 ShowMessage('Eu já estou em outro lugar');
end;

procedure TForm1.Button2.Click(Sender : TObject);
begin
 //Esta é a procedure atribuída ao segundo botão
 Button1.OnClick := MinhaOutraProcedure;
 //Button1.OnClick := @MinhaOutraProcedure; //Use esta forma caso utilize o Lazarus-FreePascal
end;

 

 

Mano eu sou meio lerdo, ainda tô aprendendo programação no começo eu usava o Delphi 7 depois migrei para o Lazarus e agora estou usando o Delphi 2009 e to gostando, acho que não vou mais mudar de versão. Mais por favor me descupe pois como eu disse sou ainda meio perdido, quando eu fui compilar deu erro, esse erro:

 

[DCC Error] Unit1.pas(34): E2003 Undeclared identifier: 'MinhaOutraProcedure'

[DCC Error] Unit1.pas(34): E2029 ';' expected but '(' found

[DCC Error] Unit1.pas(43): E2003 Undeclared identifier: 'MinhaOutraProcedure'

[DCC Fatal Error] Project1.dpr(5): F2063 Could not compile used unit 'Unit1.pas'

 

Com certeza tá na cara que falta declarar, mais veja só a linha 34. Será que você poderia me dizer como resolver os doi problemas? Desde de já obrigado.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Não consegui identificar o erro mas tenho uma idéia. Acredito que você não declarou o método MinhaOutraProcedure, se não for isto, provavelmente há alguma expressão escrita erroneamente.

 

 

Meu código (no Lazarus) ficou assim

unit Unit1; 

{$mode objfpc}{$H+}

interface

uses
 Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, StdCtrls;

type

 { TForm1 }

 TForm1 = class(TForm)
   Button1: TButton;
   Button2: TButton;
   procedure Button1Click(Sender: TObject);
   procedure Button2Click(Sender: TObject);
 private
   { private declarations }
 public
   { public declarations }
   procedure MinhaOutraProcedure(Sender : TObject);
 end; 

var
 Form1: TForm1; 

implementation

{$R *.lfm}

{ TForm1 }

procedure TForm1.Button1Click(Sender: TObject);
begin
 ShowMessage('Eu tô aqui!');
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
 Button1.OnClick := @MinhaOutraProcedure;
end;

procedure TForm1.MinhaOutraProcedure(Sender: TObject);
begin
 //Esta será a procedure que passará a ser chamada no lugar da procedure acima
 ShowMessage('Eu já estou em outro lugar');
end;

end.

 

e este é o mesmo exemplo no TurboDelphi (Delphi 2006)

 

unit Unit1;

interface

uses
 Classes, SysUtils, Forms, Controls, Graphics, Dialogs, StdCtrls;

type

 { TForm1 }

 TForm1 = class(TForm)
   Button1: TButton;
   Button2: TButton;
   procedure Button1Click(Sender: TObject);
   procedure Button2Click(Sender: TObject);
 private
   { private declarations }
 public
   { public declarations }
   procedure MinhaOutraProcedure(Sender : TObject);
 end; 

var
 Form1: TForm1; 

implementation

{$R *.dfm}

{ TForm1 }

procedure TForm1.Button1Click(Sender: TObject);
begin
 ShowMessage('Eu tô aqui!');
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
 Button1.OnClick := MinhaOutraProcedure;
end;

procedure TForm1.MinhaOutraProcedure(Sender: TObject);
begin
 //Esta será a procedure que passará a ser chamada no lugar da procedure acima
 ShowMessage('Eu já estou em outro lugar');
end;

end.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Cara valeu pela ajuda, eu tinha esquecido de declarar. Mais eu tenho mais duvidas, eu queria que meu programa mudasse de linguagem a partir de documentos externos, ou seja, de arquivos INI, INF ou LNG. Aqui está um arquivo de linguagem que eu fiz:

 

Linguagem em português:


[General]
Program=XEdit
Author=Francisco de Assis
[CUSTOM]
Label1=Abrir
Label2=Novo
Label3=Salvar
Label4=Salvar Como

 

Linguagem em inglês:

Program=XEdit
Author=Francisco de Assis
[CUSTOM]
Label1=Open
Label2=New
Label3=Save
Label4=Save as

 

Dá pra ver o que eu quero na logica, quero que o que estiver depois do '=' (igual) vá para o Caption do Label, Button ou de Hint. Como eu poderia resolver esse problema. Obrigado pela paciência.

Compartilhar este post


Link para o post
Compartilhar em outros sites

O delphi tem um sitema proprio de idioma, esta no menu project-language eu acho, nunca usei, não sei se fucniona, mas fica a dica, derepente mais rapdio e simples do que usar estes .INI

 

Voce disse que ta usando o Delphi 2009, ja testou o XE?. Na minha opnião(cada um tem a sua), tenho certeza de que o XE por enquanto é o melhor ja feito.

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.