Lazarus

Other Languages => Portuguese => Topic started by: nightrider on October 05, 2011, 05:57:04 am

Title: Ajuda com TPopUpMenu
Post by: nightrider on October 05, 2011, 05:57:04 am
É a primeira vez que tento usar o TPopUpMenu e to com 1 problema, mas deve ser alguma barbeiragem minha.

No metodo Click de 1 TSpeedButton eu faco:

TPopUpMenu.PopUp;

O primeiro item deste popupmenu eu chamei de mnuCadFilial. No metodo Click do mnuCadFilial eu crio 1 Form e dou Show.

Não funciona do jeito que eu esperava. Aí, com ajuda de 1 arquivo texto fui tracando onde o fluxo passava.

Ele passa num write que tem antes de TPopUpMenu.PopUp e em seguida aparece o write que tem apos.
 
Apos ele mostrar o menu eu cliquei em mnuCadFilial e no comeco deste metodo coloquei 1 write que nao aparece no arquivo texto(quer dizer, nao deve ta executando mnuCaFilialClick)

Entao parece que qdo clico no botao que abre o popmenu este é exibido, mas o click no primeiro item do menu é ignorado.

// Click no primeiro item do menu
procedure TfrmMenuPrincipal.mnuCadTabFilialClick(Sender: TObject);
begin
writeln(a,'entrada click filial'); <----- Este write nao aparece
system.close(a); halt ;
  if not Assigned(frmCadFilial) then
     frmCadFilial := TfrmCadFilial.Create(Self);
  frmCadFilial.Show;
end;

procedure TfrmMenuPrincipal.spbtnCadTabelasClick(Sender: TObject);
begin
  writeln(a,'entrada popup'); system.flush(a); // <---- aparece este write
  mnuCadTabelas.PopUp;
  writeln(a,'saida popup'); system.flush(a); // <---- este write aparece em seguida
system.flush(a);
end;

(a aplicacao é fechada. parece dar um erro mas nao aparece nenhuma msg, só volta para o windows)

ALGUEM TERIA ALGUMA DICA?
Title: Re: Ajuda com TPopUpMenu
Post by: felipemdc on October 05, 2011, 07:53:02 am
no Windows CE? O popup chega a abrir? Pode mostrar uns screenshots?
Title: Re: Ajuda com TPopUpMenu
Post by: nightrider on October 05, 2011, 11:59:42 am
Tiro dado, bugiu deitado. Snapshots em anexo.

Pareces surpreso com o fato de o PopUpMenu aparecer em WinCE? To fazendo algo errado, meu amigo?

 :-X
Title: Re: Ajuda com TPopUpMenu
Post by: felipemdc on October 05, 2011, 01:46:47 pm
Nenhum dos itens funciona ou só o primeiro que não funciona?

Me parece que um ComboBox faz exatamente o que você está tentando fazer.
Title: Re: Ajuda com TPopUpMenu
Post by: nightrider on October 05, 2011, 02:05:00 pm
1. Coloquei um stub no OnClick do segundo item e executou legal.

2. O problema do ComboBox, neste caso, é que nao fica com cara tipica de menu. Ou to errado?

TMenuItem funciona? Poderia pensar em usar...
Title: Re: Ajuda com TPopUpMenu
Post by: felipemdc on October 05, 2011, 02:23:36 pm
1. Coloquei um stub no OnClick do segundo item e executou legal.

Então defina o primeiro item com Visible=False e escreva seus itens a partir do segundo. Daí funciona?

O Windows CE estraga alguns menuitems com CommandID baixo. É um problema conhecido, mas que acabou sem ser resolvido. Resolver iria requerer mudar uma imensa parte do código dos menus e possívelmente quebrar muitas coisas que deram muito trabalho para fazer ...
Title: Re: Ajuda com TPopUpMenu
Post by: nightrider on October 05, 2011, 02:50:24 pm
Eu já tinha pensado e feito isto. Só não tava vendo como fazer desaparecer o 1º item(fajuto). Agora vejo que era óbvio. Com Visible.

Mesmo que fosse acertado o código, parece haver problemas com o 0.9.31 na versão para WinCE, lembra? De modo que eu nem iria poder usa-la...

Grato. Segue o baile.

[ ]
Title: Re: Ajuda com TPopUpMenu
Post by: felipemdc on October 05, 2011, 06:35:10 pm
Mesmo que fosse acertado o código, parece haver problemas com o 0.9.31 na versão para WinCE, lembra? De modo que eu nem iria poder usa-la...

Entao, você instala o snapshot, correct? Mas daí você cria uma configuração separada para ele? Se você tem mais que 1 Lazarus instalado na mesma máquina precisa chamar o Lazarus através de um atalho que especifica a opções -primary-config-path=lazarusconf

Mais detalhes: http://wiki.freepascal.org/Multiple_Lazarus
Title: Re: Ajuda com TPopUpMenu
Post by: nightrider on October 06, 2011, 11:45:41 am
Eu instalei o VMWare player em meu Win 7 e instalei uma instancia do Windows XP Pro no player. O Lazarus 0.9.31 de que te falei está instalado no Windows XP dentro do VMWare player.

Desta forma creio que as 2 versaoes do Lazarus (0.9.30 e 0.9.31) estão em computadores logicos diferentes, não havendo portanto, problemas com configurações.

Respondi tua duvida?

[ ]
Title: Re: Ajuda com TPopUpMenu
Post by: felipemdc on October 07, 2011, 11:04:32 am
Esse problema do 0.9.31 já está no bug tracker e sendo investigado: http://bugs.freepascal.org/view.php?id=20362
Title: Re: Ajuda com TPopUpMenu
Post by: meulinux on October 12, 2011, 09:10:08 pm
Você usa halt; para sair do aplicativo?
Em um programa GUI, a boa programação diz para sair com close; ou application.terminate;

O halt é usado mais no .lpr antes de Application.Run;

Será que estou errado?
Tinha de postar aqui, mesmo não sendo o assunto tratado, pois a dica era para o autor do tópico. Se errei, desculpem.
Title: Re: Ajuda com TPopUpMenu
Post by: nightrider on October 12, 2011, 09:23:16 pm
Perguntas:

1. Se estiver com 2 ou + Form abertos Close resolve? Creio que nao.

2. Application.Terminate mata a execução no ato? Quando uso o Halt é com esta intencao

3. Pq somente antes do Application.Run?

Eu programo sozinho e resolvo os problemas do jeito que consigo. Tenho um monte de duvidas mas nao tenho pra quem perguntar ou nao quero ficar amolando as pessoas que sabem muito + que eu. Nao sei se me entendes. Tb lembro de ter feito perguntas que agora sei que eram bem simples neste forum e ninguem ter respondido.

Grato pelas dicas. Me responda as perguntas acima e paro de usar o halt.

[ ]

Eu agradeco a tua intervencao.
Title: Re: Ajuda com TPopUpMenu
Post by: meulinux on October 14, 2011, 12:15:59 am
Quote
1. Se estiver com 2 ou + Form abertos Close resolve? Creio que nao.

Sim, resolve, desde que no evento onClose do MainForm você faça a verificação se os demais forms estão abertos, se estão abertos feche-os.

Code: [Select]
if Form1 <> nil then
  Form1.Close;
if Form2 <> nil then
  Form2.Close;

// Lembrar de colocar um "Form1:= Nil" após sair de um form

Quote
2. Application.Terminate mata a execução no ato? Quando uso o Halt é com esta intencao

Halt fecha a aplicação de forma anormal, não liberando a memória alocada pelos objetos, recursos consumidos, etc. O seu único parâmetro é o ExitCode retornado ao sistema operacional, e não tem relação com a quantidade de forms abertos.

Terminate fecha a aplicação, assegurando que tudo que foi alocado seja liberado. Em outras palavras, chama o método Free para todos os componentes, que chamarão Free para os componentes que são seus ´filhos´ (definidos através do parâmetro Owner no construtor). Também dispara uma mensagem para o Windows/Linux, para garantir que tudo seja destruído na ordem certa. Por essa razão Terminate pode demorar alguns segundos para fechar a aplicação, enquanto Halt é imediato.

Existe a propriedade Terminated, da classe TApplication, que pode ser usada para saber se a aplicação está em processo de shut down. Isso pode ser útil para não executar nenhum código quando a aplicação estiver sendo finalizada.

O método Close da classe TCustomForm chama Application.Terminate caso o formulário seja o MainForm da aplicação. Portanto, ambos têm o mesmo efeito nesse caso.

Portanto, na maioria dos casos, use Terminate ou Close, se o form for o principal.


Quote
Grato pelas dicas. Me responda as perguntas acima e paro de usar o halt.

Ora, você para se quiser e não se eu responder, kkkkkkk

Sim, antes do Application.Run porque nada foi gerado ainda, aí nesse caso o Halt vai funcionar porque não precisa destruir nada. A não ser que criou, muito difícil...

TinyPortal © 2005-2018