como capturar o caption do componente TMenuItem??
estou usando delphi 6 e quero automatizar o titulo do relatorio.
Como que eu capturo o caption do componente TMenuItem e jogo numa variavel que sera o titulo do relatorio?
Como que eu capturo o caption do componente TMenuItem e jogo numa variavel que sera o titulo do relatorio?
Fausto.malheiros
Curtidas 0
Respostas
Osocram
13/08/2009
Olha so... como vc faria isso em tempo de projeto?
vc iria o objeto TMenuItem > Caption e pegaria o texto certo?
em Tempo de execução vc pode pegar isso no Onclick.. pois estará passando o sender
TMenuItem(sender).caption;
vc iria o objeto TMenuItem > Caption e pegaria o texto certo?
em Tempo de execução vc pode pegar isso no Onclick.. pois estará passando o sender
TMenuItem(sender).caption;
estou usando delphi 6 e quero automatizar o titulo do relatorio.
Como que eu capturo o caption do componente TMenuItem e jogo numa variavel que sera o titulo do relatorio?
GOSTEI 0
Fausto.malheiros
13/08/2009
Do jeito que vc colocou da erro...então coloquei assim:
[u:889c6ad84c]FrmPrincipal.MainMenu1.Items.Caption[/u:889c6ad84c] / não da erro de compilação, mas tbem não traz nada.
meu codigo esta assim:
//primeiro pego o caption do item do menu e jogo no caption do //formulario apenas para garantir o mesmo nome(AQUI TA O ERRO)
FrmMntCritica.Caption := FrmPrincipal.MainMenu1.Items.Caption;
//e dentro do relatorio, report builder, o componente variable ja esta pegando automaticamente o caption do formulario e jogando no titulo
ppReport1.PrinterSetup.DocumentName:= Caption;
ppReport1.Print;
[u:889c6ad84c]FrmPrincipal.MainMenu1.Items.Caption[/u:889c6ad84c] / não da erro de compilação, mas tbem não traz nada.
meu codigo esta assim:
//primeiro pego o caption do item do menu e jogo no caption do //formulario apenas para garantir o mesmo nome(AQUI TA O ERRO)
FrmMntCritica.Caption := FrmPrincipal.MainMenu1.Items.Caption;
//e dentro do relatorio, report builder, o componente variable ja esta pegando automaticamente o caption do formulario e jogando no titulo
ppReport1.PrinterSetup.DocumentName:= Caption;
ppReport1.Print;
GOSTEI 0
Osocram
13/08/2009
Olha eu uso daqui maneira e não da erro...
o problema pode ser a maneira que vc usou ae....
posta o metodo onde vc esta chamando isso... Para ver se é no click do menu item ou aonde é q vc esta chamando.
o problema pode ser a maneira que vc usou ae....
posta o metodo onde vc esta chamando isso... Para ver se é no click do menu item ou aonde é q vc esta chamando.
Do jeito que vc colocou da erro...então coloquei assim:
[u:52ab7aeded]FrmPrincipal.MainMenu1.Items.Caption[/u:52ab7aeded] / não da erro de compilação, mas tbem não traz nada.
meu codigo esta assim:
//primeiro pego o caption do item do menu e jogo no caption do //formulario apenas para garantir o mesmo nome(AQUI TA O ERRO)
FrmMntCritica.Caption := FrmPrincipal.MainMenu1.Items.Caption;
//e dentro do relatorio, report builder, o componente variable ja esta pegando automaticamente o caption do formulario e jogando no titulo
ppReport1.PrinterSetup.DocumentName:= Caption;
ppReport1.Print;
GOSTEI 0
Fausto.malheiros
13/08/2009
No evento on click do item de menu o comando funciona...
ele da erro é la no formulario de relatorio. Dou o comando antes de chamar o report builder...bem ali que ele da erro.
ele da erro é la no formulario de relatorio. Dou o comando antes de chamar o report builder...bem ali que ele da erro.
GOSTEI 0
Osocram
13/08/2009
Por isso q eu disse no outro post
pq No OnClick do menu q o sender vai ser o menuItem... se outro lugar o sender vai ser outro.
em Tempo de execução vc pode pegar isso no Onclick.. pois estará passando o sender
TMenuItem(sender).caption;
pq No OnClick do menu q o sender vai ser o menuItem... se outro lugar o sender vai ser outro.
GOSTEI 0
Fausto.malheiros
13/08/2009
Então..mas o lance da primeira letra ficar sublinhada(atalho) atrapalhou. nao tem nada a ver a primeira letra sublinhada no titulo do relatorio....mas vlw pela força. Obrigado.
Mas só uma coisa..fiquei curioso :D O Sender no onclick do menu funciona...mas como fazer ele chegar até o form do relatorio. Variavel pública?
Mas só uma coisa..fiquei curioso :D O Sender no onclick do menu funciona...mas como fazer ele chegar até o form do relatorio. Variavel pública?
GOSTEI 0
Osocram
13/08/2009
para tirar o ´&´ é simples
se vc fazer isso aqui p chamar o o seu form de relatorio
é so declarar uma variavel no formRel, na parte Public.
dae la vc pode usar a variável do jeito que quiser ou jogar direto p o caption deste form tbm.
palavra := TMEnuItem(sender).caption; palavra := stringReplace(palavra,´&´,´´,[])
se vc fazer isso aqui p chamar o o seu form de relatorio
FormRel := TformRel.Create(nil); try FormRel.Titulo := palavra; finally formRel.release; formRel := nil; end;
é so declarar uma variavel no formRel, na parte Public.
dae la vc pode usar a variável do jeito que quiser ou jogar direto p o caption deste form tbm.
Então..mas o lance da primeira letra ficar sublinhada(atalho) atrapalhou. nao tem nada a ver a primeira letra sublinhada no titulo do relatorio....mas vlw pela força. Obrigado.
Mas só uma coisa..fiquei curioso :D O Sender no onclick do menu funciona...mas como fazer ele chegar até o form do relatorio. Variavel pública?
GOSTEI 0
Fausto.malheiros
13/08/2009
Agora sim! Otimizou bem mais os códigos.
Vlw osocram...Brigadão!
Abraços
Vlw osocram...Brigadão!
Abraços
GOSTEI 0
Fausto.malheiros
13/08/2009
Declarei a variavel ´titulo´ no public do menu e no public do rel...mas o conteudo da variavel preenchida no menu, esta chegando vazia no rel. ?????
GOSTEI 0
Fausto.malheiros
13/08/2009
Declarei a variavel ´titulo´ no public do menu e no public do rel...mas o conteudo da variavel preenchida no menu, esta chegando vazia no rel. ?????
Creio que o problema esta na forma que o menu chama os programas:
// Isola o nome do formuário
NomeClasse := TMenuItem(Sender).Name;
System.Delete(NomeClasse, 1, 4);
// Monta o nome daclasse
NomeClasse := ´T´ + NomeClasse;
//esses são os parametros que preciso passar
Titulo := TMenuItem(sender).Caption;
Titulo := stringReplace(titulo,´&´,´´,[]);
usuario := editusuario.text;
try
// como colocar os parametros no comando abaixo??????
Application.CreateForm(TComponentClass(FindClass(NomeClasse)), Formulario);
Formulario.ShowModal;
finally
FreeAndNil(Formulario);
end;
Eu não stou sabendo colocar os parametros nessa creatform onde é feito a pesquisa pela classe
GOSTEI 0
Osocram
13/08/2009
Teria que ser algo +- assim.
Creio que o problema esta na forma que o menu chama os programas:
Eu não stou sabendo colocar os parametros nessa creatform onde é feito a pesquisa pela classe[/quote:3ead856712]
[quote:3ead856712=´fausto.malheiros´]Declarei a variavel ´titulo´ no public do menu e no public do rel...mas o conteudo da variavel preenchida no menu, esta chegando vazia no rel. ?????
Creio que o problema esta na forma que o menu chama os programas:
// Isola o nome do formuário
NomeClasse := TMenuItem(Sender).Name;
System.Delete(NomeClasse, 1, 4);
// Monta o nome daclasse
NomeClasse := ´T´ + NomeClasse;
//esses são os parametros que preciso passar
Titulo := TMenuItem(sender).Caption;
Titulo := stringReplace(titulo,´&´,´´,[]);
usuario := editusuario.text;
try
// como colocar os parametros no comando abaixo??????
Application.CreateForm(TComponentClass(FindClass(NomeClasse)), Formulario);
[b:3ead856712] TSeuForm(Formulario).Titulo := titulo;[/b:3ead856712]
Formulario.ShowModal;
finally
FreeAndNil(Formulario);
end;
Eu não stou sabendo colocar os parametros nessa creatform onde é feito a pesquisa pela classe[/quote:3ead856712]
GOSTEI 0
Fausto.malheiros
13/08/2009
Heimmm! Hammmm! Cuma. Rs.....
Que jeito mesmo?
Que jeito mesmo?
GOSTEI 0
Fausto.malheiros
13/08/2009
Ha ta...ja vi no meio da citação.
Ok. Vou verificar
Ok. Vou verificar
GOSTEI 0
Osocram
13/08/2009
Aqui vc cria seu form
E antes do
Quero dizer entre esses dois codigos vc tem q passar o valor p a variavel que vc criou nos formularios Rel.
--------------------
ou la no seu formRel no evento OnShow vc verifica se a variavel Titulo do form Principal for diferente de ´´ dae vc pega ele e joga no caption
Nesse caso lembre-se de sempre passar Titulo:=´´ depois de liberar o form, para não ficar lixo.
Application.CreateForm(TComponentClass(FindClass(NomeClasse)), Formulario);
E antes do
Formulario.ShowModal;
Quero dizer entre esses dois codigos vc tem q passar o valor p a variavel que vc criou nos formularios Rel.
--------------------
ou la no seu formRel no evento OnShow vc verifica se a variavel Titulo do form Principal for diferente de ´´ dae vc pega ele e joga no caption
Nesse caso lembre-se de sempre passar Titulo:=´´ depois de liberar o form, para não ficar lixo.
Heimmm! Hammmm! Cuma. Rs.....
Que jeito mesmo?
GOSTEI 0
Fausto.malheiros
13/08/2009
Ficou da seguinte forma:
A variavel titulo esta declarada no public do menu e no public do relatorio, mas continua não passando o parametro.
Application.CreateForm(TComponentClass(FindClass(NomeClasse)), Formulario);
TFrmPrincipal(Formulario).titulo := titulo;
Formulario.ShowModal;
A variavel titulo esta declarada no public do menu e no public do relatorio, mas continua não passando o parametro.
GOSTEI 0
Fausto.malheiros
13/08/2009
Consertando!!! a variavel titulo no relatorio, quando declarada no public...da erro. Esta declarada no ´var´
GOSTEI 0
Osocram
13/08/2009
é so fazer assim...
que erro que estava dando?
Não é aconselhavel colocar variavel direto la no Var.
Public Titulo:string;
que erro que estava dando?
Não é aconselhavel colocar variavel direto la no Var.
Consertando!!! a variavel titulo no relatorio, quando declarada no public...da erro. Esta declarada no ´var´
GOSTEI 0
Fausto.malheiros
13/08/2009
Acabei fazendo do jeito mais simples mesmo...ao invéz de passar parametro, eu chamo pelo formulario do menu, que ja esta na clausula Uses.
Ficou assim:
Não sei se é o jeito mais pratico, mas fez o que eu quero
Só não esta mais otimizado, por que ainda tenho que informar o nome do formulario atual no linha... FrmMovMntCriticaMovimento.Caption...se tiver um jeito de colocar um (sender) da vida....fecha. Putz!!! vou apanhar muito desse delphi ainda, mas pelo menos ja terminei o sistema, estou só nos ajustes.
Ficou assim:
FrmMovMntCriticaMovimento.Caption := FrmPrincipal.titulo;
PplTitulo.Caption := FrmPrincipal.titulo;
ppLNomeUsuario.Caption := FrmPrincipal.Usuario;
Não sei se é o jeito mais pratico, mas fez o que eu quero
Só não esta mais otimizado, por que ainda tenho que informar o nome do formulario atual no linha... FrmMovMntCriticaMovimento.Caption...se tiver um jeito de colocar um (sender) da vida....fecha. Putz!!! vou apanhar muito desse delphi ainda, mas pelo menos ja terminei o sistema, estou só nos ajustes.
GOSTEI 0
Fausto.malheiros
13/08/2009
Preciso alterar o Caption do formrel em tempo de execução, mas ele não altera...simplesmente não faz anda.
chamo da seguinte forma:
Pelo debug, eu vejo que a variavel FrmPrincipal.titulo esta preenchida corretamente, mas no comando acima, o caption não muda...fica em branco.
Ja testei no ovento oncreat e no onshow.
chamo da seguinte forma:
FrmMovRelLeituraMedicao.Caption := FrmPrincipal.titulo;
Pelo debug, eu vejo que a variavel FrmPrincipal.titulo esta preenchida corretamente, mas no comando acima, o caption não muda...fica em branco.
Ja testei no ovento oncreat e no onshow.
GOSTEI 0
Osocram
13/08/2009
olha eu faria assim
Isto aqui no meu formulario relatorio
no meu da tela principal:
como este execute é um function boolean vc ainda pode usa-lo em um if se precisar fazer uma validação se foi executado ou não... coisa do tipo.
Bom esta ae... o mais detalhado que pude... fiz os codigos meio de cabeça então pode ser que não compile diretamente. Mas acho que ficou facil de entender
-----------------------------
Aprenda a usar esse Metodo de classe que passei (Class function), veja que estamos aplicando OOP nesse seu caso.
Estamos delegando as responsabilidade de se criar e destrir para o proprio Objeto (formulario de relatorios).
Isto simplifica o seu codigo.
Flw.
Isto aqui no meu formulario relatorio
........ public Titulo,Usuario:string; ......... // Repare que aqui eu uso CLASS function, // outro detalhe ao declarar esta função tenha certeza que ele ficou no Public. class function TRelTelaF.Execute(aTitulo,aUsuario:string ):boolean; var vForm: TForm; begin result := false; vForm := Self.Create(nil); TRelTelaF(vform).Titulo := aTitulo; TRelTelaF(vform).Usuario := aUsuario; try if vForm.ShowModal = mrOK then begin result := true; end; finally vForm.Release; vForm := nil; end; end;
no meu da tela principal:
NomeMenu := StringReplace(TMenuItem(sender),´&´,´´,[]); NomeUsuario := GetUsuario; TRelTelaF.Execute(NomeMenu,NomeUsuario);
como este execute é um function boolean vc ainda pode usa-lo em um if se precisar fazer uma validação se foi executado ou não... coisa do tipo.
Bom esta ae... o mais detalhado que pude... fiz os codigos meio de cabeça então pode ser que não compile diretamente. Mas acho que ficou facil de entender
-----------------------------
Aprenda a usar esse Metodo de classe que passei (Class function), veja que estamos aplicando OOP nesse seu caso.
Estamos delegando as responsabilidade de se criar e destrir para o proprio Objeto (formulario de relatorios).
Isto simplifica o seu codigo.
Flw.
GOSTEI 0
Fausto.malheiros
13/08/2009
Opa! Evoluiu a coisa. O bicho ta pegando somente na hora de passar a variavel titulo, para o caption do formulario...não vai. só falta isso tbem.
GOSTEI 0