Fórum Como passar qualquer form para dentro de um procedure? #191366

29/10/2003

0

É assim: pretendo manipular algumas propriedades de forms a partir de um único procedure (cores, tamanhos, etc).

Já tentei o seguinte procedure

procedure Teste(sender : TObject);
begin
with sender as TForm do
showmessage(´O nome é ´ + name);
end;

Tudo o obtenho é um ´Access violation´!! :cry:

Este procedure está numa unit comum a várias aplicações e não tem nada de visual.

Se puderem ajudar verão o rosto de bacalhau grato!!!

Abraço
bacalhau


Bacalhau

Bacalhau

Responder

Posts

29/10/2003

Jaguarnet7

form:= tform.creat(sender);

pra instanciar o objeto.


Responder

Gostei + 0

29/10/2003

Bacalhau

Caro colega, o que pretendo é um pouco diferente. Quero pegar num form (seja qual for) e passá-lo como parametro para dentro de um procedure.

Este procedure tem como função abrir uma tabela e ler algumas propriedades que o form deverá ter (fontes, cores, tamanhos, posições, etc).

Finalmente deverá aplicar essas propriedades ao form que foi passado como parametro.


Responder

Gostei + 0

29/10/2003

Marcelo Saviski

tente:

procedure Teste(Sender : TForm); 
begin 
  if Assigned(Sender) then
    with sender do 
       showmessage(´O nome é ´ + name); 
end; 


ou

procedure Teste(Sender : TObject); 
begin 
  if Assigned(Sender) then
    if Sender is TForm then
      with TForm(Sender) do 
         showmessage(´O nome é ´ + name); 
end; 



ou

procedure Teste(Sender : TObject); 
begin 
  if Assigned(Sender) then
    if Sender is TForm then
      with Sender as TForm do 
         showmessage(´O nome é ´ + name); 
end; 



Responder

Gostei + 0

29/10/2003

Josemarlourenco

Caro Bacalhau,

Uma pergunta básica:
Antes de enviar o Form para a procedure, você criou o objeto (criou uma instância deste form)?
Exemplo:

Var FrmCliente: TFrmCliente;
Begin
FrmCliente := TFrmCliente.Create(Application);
Teste(FrmCliente);
End;

Outra coisa: Se sua procedure vai receber sempre Forms, o parâmetro pode ser do tipo TForm. Ou seja, não precisa fazer ´Type Cast´.
Exemplo:

procedure Teste(sender : TForm);
begin
with sender do
showmessage(´O nome é ´ + name);
end;

Josemar


Responder

Gostei + 0

29/10/2003

Bacalhau

Sim, está criado. O procedure Teste (noutra unit) é chamado a partir do Form que quero modificar.

É uma coisa mais ou menos assim. No form TFormDocumento existe um procedure FormCreate e lá dentro algo parecido com isto:

procedure FormCreate(sender : TObject);
begin
// aqui faz umas coisas
Teste(FormDocument);
// continua a fazer mais coisas
end;


A dificuldade está em fazer funcionar noutro Form, digamos o XPTO. Não sei como fazer funcionar algo como

Teste(XPTO);

sem modificar o procedure Teste

Infelizmente o exemplo enviado dá Access Violation

procedure Teste(sender : TForm);
begin
with sender do
showmessage(´O nome é ´ + name);
end;


Responder

Gostei + 0

29/10/2003

Marcelo Saviski

Tenta chamar: [color=green:dcb3f62d35]Teste(Self);[/color:dcb3f62d35] no OnShow


Responder

Gostei + 0

29/10/2003

Bacalhau

PESSOAL, DEU CERTO!!

Muito obrigado pela ajuda, a solução foi encontrada aqui. Alterei a chamada ao procedure. Em vez de

Teste(FormQualquer)

fiz

Teste(sender)

Mas, para dizer a verdade não sei explicar porquê :oops:
Se houver alguém que me explique porquê, render-me-ei aos seus pés humildemente.

Abraço aos que colaboraram
bacalhau


Responder

Gostei + 0

30/10/2003

Rodrigo_rcp

type
TVetorForm=array[1..5]of TForm;

var
  Form1: TForm1;
  VForm:TVetorForm;

implementation
uses
unit2;

{$R *.dfm}
procedure FormularioDoBacalhau(var Forms:TVetorForm);
begin
Forms[1].Color:=clBlack;
ShowMessage(Forms[1].Name);
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
VForm[1]:=Form1;
VForm[2]:=Form2;
FormularioDoBacalhau(VForm);
end;



Responder

Gostei + 0

30/10/2003

Smaug_84

cara, fiz assim e funcionou normal.



procedure TForm1.a(sender: TObject);
begin
ShowMessage((sender as TForm).Name);
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
a(Self);
end;


Responder

Gostei + 0

30/10/2003

Bacalhau

Pessoal agradeço imenso a vossa ajuda. Já consegui implementar a parte lógica.

O que não consigo é perceber porque funciona com o parametro ´Self´ e não funciona com o parametro ´MeuForm´


Responder

Gostei + 0

30/10/2003

Marcelo Saviski

quando você faz isso: form1 := TForm1.create(nil); por exemplo

ele não cria um ´Form1´
ele cria um Form11
se repetir a operaçaõ, cria Form12, form13 e assim por diante

Self faz referencia a si mesmo, no caso o form, como está no oncreate, ao criar um form que vai guanhar o nome de Form11, self ou sender fazem referencia a Form11,

experimente fazer no onCreate (ShowMessage(Name))


Responder

Gostei + 0

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar