Como passar qualquer form para dentro de um procedure?
É 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
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
Curtidas 0
Respostas
Jaguarnet7
29/10/2003
form:= tform.creat(sender);
pra instanciar o objeto.
pra instanciar o objeto.
GOSTEI 0
Bacalhau
29/10/2003
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.
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.
GOSTEI 0
Marcelo Saviski
29/10/2003
tente:
ou
ou
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;
GOSTEI 0
Josemarlourenco
29/10/2003
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
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
GOSTEI 0
Bacalhau
29/10/2003
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;
É 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;
GOSTEI 0
Marcelo Saviski
29/10/2003
Tenta chamar: [color=green:dcb3f62d35]Teste(Self);[/color:dcb3f62d35] no OnShow
GOSTEI 0
Bacalhau
29/10/2003
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
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
GOSTEI 0
Rodrigo_rcp
29/10/2003
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;GOSTEI 0
Smaug_84
29/10/2003
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;
procedure TForm1.a(sender: TObject);
begin
ShowMessage((sender as TForm).Name);
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
a(Self);
end;
GOSTEI 0
Bacalhau
29/10/2003
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´
O que não consigo é perceber porque funciona com o parametro ´Self´ e não funciona com o parametro ´MeuForm´
GOSTEI 0
Marcelo Saviski
29/10/2003
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))
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))
GOSTEI 0