Fórum Código em run time ? #243151

14/07/2004

0

que erro é esse ?

Associar a Procedure [b:0b777df972]ChamarCadastro[/b:0b777df972] ao evento do menu, a procedure [b:0b777df972]ChamarCadastro[/b:0b777df972] tem um parâmetro que é o nome do formulário que ela vai criar.

Código:
MainMenu.Items[0].Items[1].OnClick := ChamarCadastro(f_Cadastro);

[Error]:
rotinas.pas(116): Incompatible types: ´TNotifyEvent´ and ´procedure, untyped pointer or untyped parameter´


[]´s

Renata Coimbra


Renata Coimbra

Renata Coimbra

Responder

Posts

14/07/2004

Persist

Defina ChamarCadastro como um TNotifyEvent dentro da classe que está o MainMenu (deve ser o Form).

procedure ChamarCadastro(Sender:TObject);

Daí p/ criar o Form vc usa um Cast -
var Form:TForm;
begin
Form := TForm(Sender).Create(nil);
end;


Responder

Gostei + 0

14/07/2004

Cabelo

Vc pode definir tb uma outra procedure :

MainMenuClick(Sender : TObject);
begin
ChamarCadastro(f_cadastro);
end;

e associar esta procedure ao evento click do menu..

assim não tem erro..

espero ter ajudado..

Cabelo


Responder

Gostei + 0

14/07/2004

Paulo_amorim

Defina ChamarCadastro como um TNotifyEvent dentro da classe que está o MainMenu (deve ser o Form). procedure ChamarCadastro(Sender:TObject); Daí p/ criar o Form vc usa um Cast - var Form:TForm; begin Form := [b:6af97356de]TForm(Sender)[/b:6af97356de].Create(nil); end;


Olá

Se eu não me engano isso irá gerar um erro de typecast

Como a procedure será atribuida ao botão, o Sender dele será o proprio TButton, o qual não conseguirá ser transformado em TForm

O que eu imaginei foi vc criar 2 procedures :
procedure ChamarCadastro( form: TForm);
begin
(...)
end;

procedure PoeNoBotao(Sender: TObject);
begin
  ChamarCadastro(f_Cadastro);
end;


Daí no cmeço vc faz MainMenu.Items[0].Items[1].OnClick := PoeNoBotao;

Esse erro ocorre porque para vc passar umaprocedure para um evento ela deve ter os mesmos parÂmetros que o evento (no caso, [i:6af97356de]Sender: TObject[/i:6af97356de])

Esperoq ue ajuide
Até+


Responder

Gostei + 0

14/07/2004

Renata Coimbra

Muito Obrigada cabelo_uni e persist !

vou testar !

[]´s

Renata Coimbra


Responder

Gostei + 0

14/07/2004

Renata Coimbra

Obrigada Paulo_Amorim !

Um abraço !

Renata Coimbra.


Responder

Gostei + 0

14/07/2004

Persist

Tá certo, o Sender no caso é um TMenuItem, teria que ficar assim:
procedure TForm1.Chamar_Cadastro(Sender:TObject);
var Form:TForm;
begin
Form := TForm(TMenuItem(Sender).Owner).Create(nil);
end;


Responder

Gostei + 0

14/07/2004

Renata Coimbra

Gente, só tem uma coisa, esse formulário que eu vou criar eu estou pegando o nome dele de uma tabela, tipo, tenho um seletor cadastrado em uma tabela, tipo String, olhem o código de criação.

código todo:


[b:0958cacf90]{Chamar cadastro}[/b:0958cacf90]

Procedure ChamarCadastro(const Cad : ShortString);
Var
f_Cadastro : Tf_Cadastro;
begin
f_Cadastro.Name := Cad ;

f_Cadastro := TChamarProgramas.LocalizarFormularioCadastro( UpperCase( cad ) );
if f_Cadastro <> nil then
f_Cadastro.Show
else
f_Cadastro := Tf_Cadastro.Create( Application );
end;

{Criar Menu}

var
i: Integer;
Formulario : ShortString;

For I := 0 to DataSet.RecordCount - 1 do
begin
NovoItem := TMenuItem.Create(MainMenu);
NovoItem.Name := DataSet.fieldByName(´SELETOR´).AsString;
NovoItem.Caption := DataSet.fieldByName(´DESCRICAO´).AsString;
Formulario := DataSet.fieldByName(´FORMULARIO´).AsString;

MainMenu.Items[0].Insert(I,NovoItem);
MainMenu.Items[0].Items[I].OnClick := ChamarCadastro (Formulario);
DataSet.Next;
end;

é que o formulário vai mudar de acordo com o for.

[]´s

Renata Coimbra.


Responder

Gostei + 0

14/07/2004

Persist

f_Cadastro.Name := Cad;
Vc não pode atribuir ainda pq vc não instanciou o f_Cadastro.

MainMenu.Items[0].Items[I].OnClick := ChamarCadastro (Formulario);
O onClick é um TNotifyEvent, vc não pode informar parâmetro na hora da atribuição.


Responder

Gostei + 0

14/07/2004

Renata Coimbra

Pois é persist !

Como fazer então nesse caso ?

como passar o nome do formulário que vai ser criado, sendo que qualquer uma das procedure só pode ter Parâmetro TObject,

é que nesse for que eu pego o nome do formulário.

[]´s

Renata Coimbra


Responder

Gostei + 0

14/07/2004

Persist

Mas pq vc precisa do nome do formulário?


Responder

Gostei + 0

14/07/2004

Renata Coimbra

Deu certinho pessoal !

obrigada a todos !

[]´s

Renata


Responder

Gostei + 0

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

Aceitar