como capturar o caption do componente TMenuItem??

Delphi

13/08/2009

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?


Fausto.malheiros

Fausto.malheiros

Curtidas 0

Respostas

Osocram

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;


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

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;


GOSTEI 0
Osocram

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.

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

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.


GOSTEI 0
Osocram

Osocram

13/08/2009

Por isso q eu disse no outro post
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

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?


GOSTEI 0
Osocram

Osocram

13/08/2009

para tirar o ´&´ é simples
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

Fausto.malheiros

13/08/2009

Agora sim! Otimizou bem mais os códigos.

Vlw osocram...Brigadão!

Abraços


GOSTEI 0
Fausto.malheiros

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

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

Osocram

13/08/2009

Teria que ser algo +- assim.

[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

Fausto.malheiros

13/08/2009

Heimmm! Hammmm! Cuma. Rs.....

Que jeito mesmo?


GOSTEI 0
Fausto.malheiros

Fausto.malheiros

13/08/2009

Ha ta...ja vi no meio da citação.

Ok. Vou verificar


GOSTEI 0
Osocram

Osocram

13/08/2009

Aqui vc cria seu form
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

Fausto.malheiros

13/08/2009

Ficou da seguinte forma:

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

Fausto.malheiros

13/08/2009

Consertando!!! a variavel titulo no relatorio, quando declarada no public...da erro. Esta declarada no ´var´


GOSTEI 0
Osocram

Osocram

13/08/2009

é so fazer assim...
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

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:

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

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:

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

Osocram

13/08/2009

olha eu faria assim

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

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
POSTAR