ActiveDelphi - Índice do Fórum ActiveDelphi
.: O site do programador Delphi! :.
 
 FAQFAQ   PesquisarPesquisar   MembrosMembros   GruposGrupos   RegistrarRegistrar 
 PerfilPerfil   Entrar e ver Mensagens ParticularesEntrar e ver Mensagens Particulares   EntrarEntrar 

Montar o form com redimensionamento em runtime
Ir à página 1, 2  Próximo
 
Novo Tópico   Responder Mensagem    ActiveDelphi - Índice do Fórum -> Delphi
Exibir mensagem anterior :: Exibir próxima mensagem  
Autor Mensagem
leo_bruno
Profissional
Profissional


Registrado: Sexta-Feira, 16 de Abril de 2010
Mensagens: 666

MensagemEnviada: Ter Abr 30, 2013 1:18 pm    Assunto: Montar o form com redimensionamento em runtime Responder com Citação

Olá pessoALL ..

Estou tendo dificuldade de entender o que está errado na criação em Runtime do meu form.

Pra exemplificar o que quero conseguir, imagine esta situação em design time:

Adicione um Painel no form.
Mude a propriedade align para altop;
adicione um splitter no form.
Mude a propriedade align para altop;
repta o processo umas 3 ou 4 vezes.

O resultado é 4 Paineis separadas por splitters.

Ao executar a aplicacao, é possivel arrastar o splitter alterando o tamanho de cada um dos paineis.

Eu preciso gerar este efeito, porem criando estes objetos em runtime e não estou conseguindo.

Os objetos criados estão ficando com a sequencia invertida. Ou seja, após criar o Painel1 O Splitter1 é criado mas ao invés de ser o segundo objeto de cima pra baixo, ele toma o lugar do Painel1 na sequência e assim por diante, com o Painel2 tomando o lugar do Splitter1 no momento em que é criado.

Segue o codigo de exemplo:

Código:

var
Painel : TPanel;
I : Integer;
Split : TSplitter;
begin
 //Parente := Form1;

 for I := 0 to 4  do
   begin
     Painel := TPanel.Create(self);
     Painel.Parent  := Form1;
     Painel.Name := 'Pnl' + IntTostr(i);
     Painel.Align   := alTop;
     Painel.Name    := 'Painel' + IntTostr(i);
     Painel.Caption := 'Painel' + IntTostr(i);

     Split := TSplitter.Create(self);
     Split.Name := 'Spl' + IntTostr(i);
     Split.Parent := Painel;
     Split.Align := alTop;
  end;
end;


Acredito que o problema esteja na propriedade parent.
Ja tentei fazer o seguinte.

Declarei uma variavel PARENTE do tipo TWinControl.

Antes do inicio do loop eu coloco o valor desta variavel como Form1.

Dentro do loop eu indico que o parent do painel sendo criado atualmente é a variavel PARENTE.

Na ultima linha do loop eu seto que o PARENTE é o Painel Atual.

Mas aí um painel é criado DENTRO do outro ao invés de abaixo do outro.

Alguem tem alguma dica ?

Abraços !
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
cyberdisk
Colaborador
Colaborador


Registrado: Domingo, 4 de Julho de 2010
Mensagens: 2391
Localização: São José dos Campos - SP

MensagemEnviada: Ter Abr 30, 2013 1:30 pm    Assunto: Responder com Citação

o codigo esta correto ... esta colocando um panel debaixo do outro

veja se voce não modificou alguma propriedade do form

abraço
_________________
O conhecimento abre muitas portas
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular Enviar E-mail
leo_bruno
Profissional
Profissional


Registrado: Sexta-Feira, 16 de Abril de 2010
Mensagens: 666

MensagemEnviada: Ter Abr 30, 2013 1:38 pm    Assunto: Responder com Citação

cyberdisk escreveu:
o codigo esta correto ... esta colocando um panel debaixo do outro

veja se voce não modificou alguma propriedade do form

abraço


Sim, mas deveria ser possivel redimensionar os pannels, pois deveria ter um splitter entre cada um.

Outro detalhe.

No seu teste qual ficou a ordem dos paineis ?

Deveria ficar de 0 a 4 e esta ficando de 4 a zero. (Falando de cima pra baixo).

Os splitters que deveriam ser criado logo abaixo do seu painel correspondente, alinhado a cima, esta ficando ANTES do painel correspondente. Por isso nao tem como redimencionar os paineis
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
cyberdisk
Colaborador
Colaborador


Registrado: Domingo, 4 de Julho de 2010
Mensagens: 2391
Localização: São José dos Campos - SP

MensagemEnviada: Ter Abr 30, 2013 1:47 pm    Assunto: Responder com Citação

Deveria ficar de 0 a 4 e esta ficando de 4 a zero. (Falando de cima pra baixo).

Código:
procedure TForm1.Button1Click(Sender: TObject);
var
Painel : TPanel;
I : Integer;
Split : TSplitter;
begin
 //Parente := Form1;

 for I := 4 downto 0 do
   begin
     Painel := TPanel.Create(self);
     Painel.Parent  := Form1;
     Painel.Name := 'Pnl' + IntTostr(i);
     Painel.Align   := alTop;
     Painel.Name    := 'Painel' + IntTostr(i);
     Painel.Caption := 'Painel' + IntTostr(i);
     Painel.Locked  := false;

     Split := TSplitter.Create(self);
     Split.Name := 'Spl' + IntTostr(i);
     Split.Parent := Painel;
     Split.Align := alTop;
  end;


end;

_________________
O conhecimento abre muitas portas
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular Enviar E-mail
leo_bruno
Profissional
Profissional


Registrado: Sexta-Feira, 16 de Abril de 2010
Mensagens: 666

MensagemEnviada: Ter Abr 30, 2013 1:51 pm    Assunto: Responder com Citação

cyberdisk escreveu:
Deveria ficar de 0 a 4 e esta ficando de 4 a zero. (Falando de cima pra baixo).

Código:
procedure TForm1.Button1Click(Sender: TObject);
var
Painel : TPanel;
I : Integer;
Split : TSplitter;
begin
 //Parente := Form1;

 for I := 4 downto 0 do
   begin
     Painel := TPanel.Create(self);
     Painel.Parent  := Form1;
     Painel.Name := 'Pnl' + IntTostr(i);
     Painel.Align   := alTop;
     Painel.Name    := 'Painel' + IntTostr(i);
     Painel.Caption := 'Painel' + IntTostr(i);
     Painel.Locked  := false;

     Split := TSplitter.Create(self);
     Split.Name := 'Spl' + IntTostr(i);
     Split.Parent := Painel;
     Split.Align := alTop;
  end;


end;




Cyber obrigado pela colaboração.

Mas não é simples assim ...

Alterar a ordem do loop eu já tinha feito, mesmo assim o spliter que deveria ser criado abaixo do painel fica em cima.

O importante aqui é a hierarquia na criação dos objetos, e não a posição deles no form.

Adiciono o panel0 no form.
Agora adiciono o spliter0 e ele deve ficar apos o panel0 e nao antes.

Eu quero adicionar a sequencia um abaixo do outro e nao um acima do outro, independente de ler a lista de cabeça pra baixo ou não.

Entendeu ?
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
cyberdisk
Colaborador
Colaborador


Registrado: Domingo, 4 de Julho de 2010
Mensagens: 2391
Localização: São José dos Campos - SP

MensagemEnviada: Ter Abr 30, 2013 1:55 pm    Assunto: Responder com Citação

então mude para

Split.Align := alBottom;

abraço
_________________
O conhecimento abre muitas portas
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular Enviar E-mail
leo_bruno
Profissional
Profissional


Registrado: Sexta-Feira, 16 de Abril de 2010
Mensagens: 666

MensagemEnviada: Ter Abr 30, 2013 2:15 pm    Assunto: Responder com Citação

cyberdisk escreveu:
então mude para

Split.Align := alBottom;

abraço


Cyber, não funciona, estes testes mais óbvios eu fiz antes de postar o tópico.

Ele até gera o formulário, mas a funcionalidade do splitter fica perdida.

Estou experimentando criar com frames..

Assim eu crio em design time uma frame com o splitter abaixo do pannel e demais funcionalidades e depois declaro uma variavel do tipo "NomeDaClasseDaFrameQCriei" e chamo ela "i" vezes dentro do loop.

Até agora tem dado certo.

Vou postar o resultado final assim que terminar o teste.

Muito obrigado mesmo assim.
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
leo_bruno
Profissional
Profissional


Registrado: Sexta-Feira, 16 de Abril de 2010
Mensagens: 666

MensagemEnviada: Ter Abr 30, 2013 3:01 pm    Assunto: Responder com Citação

cyberdisk escreveu:
então mude para

Split.Align := alBottom;

abraço


Cyber consegui resolver este problema usando frame, mas agora tenho outro problema.

Você se incomodaria em dar uma olhada num projeto de exemplo ?
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
viox
Colaborador
Colaborador


Registrado: Sábado, 22 de Outubro de 2011
Mensagens: 1090
Localização: SINOP - MT

MensagemEnviada: Ter Abr 30, 2013 3:29 pm    Assunto: Responder com Citação

Olá amigo, apenas o Parent do Split você está definindo errado, o Parent tem que ser o Form1 também.

Abraço
_________________
Just another Delphi guy.


http://www.soft42.com
http://www.nortaonegocios.com.br
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular Enviar E-mail Visitar a homepage do Usuário MSN Messenger
viox
Colaborador
Colaborador


Registrado: Sábado, 22 de Outubro de 2011
Mensagens: 1090
Localização: SINOP - MT

MensagemEnviada: Ter Abr 30, 2013 3:32 pm    Assunto: Responder com Citação

E como você disse que está vindo errado basta inverter a ordem de criação, algo como:
Código:
 
   for I := 4 downto 0 do
   begin
     Split := TSplitter.Create(self);
     Split.Name := 'Spl' + IntTostr(i);
     Split.Parent := Form1; 
     Split.Align := alTop;
 
     Painel := TPanel.Create(Self);
     Painel.Parent := Form1;
     Painel.Name := 'Pnl' + IntTostr(i);
     Painel.Align   := alTop;
     Painel.Name    := 'Painel' + IntTostr(i);
     Painel.Caption := 'Painel' + IntTostr(i);
  end;

_________________
Just another Delphi guy.


http://www.soft42.com
http://www.nortaonegocios.com.br
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular Enviar E-mail Visitar a homepage do Usuário MSN Messenger
leo_bruno
Profissional
Profissional


Registrado: Sexta-Feira, 16 de Abril de 2010
Mensagens: 666

MensagemEnviada: Ter Abr 30, 2013 3:34 pm    Assunto: Responder com Citação

viox escreveu:
Olá amigo, apenas o Parent do Split você está definindo errado, o Parent tem que ser o Form1 também.

Abraço


Aamigo se eu seto o parent do split como form 1, ele cria todos os panels um em cima do outro e depois 4 splits um em cima do outro.

O problema foi resolvido com Frames, que alias é uma solução bem mais elegante e pouca gente tem experiencia.

Estou colocando um projeto de exemplo mostrando a solução e como o frame pode ser util.
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
leo_bruno
Profissional
Profissional


Registrado: Sexta-Feira, 16 de Abril de 2010
Mensagens: 666

MensagemEnviada: Ter Abr 30, 2013 3:35 pm    Assunto: Responder com Citação

Problema resolvido.

Foi mais fácil resolver utilizando Frames.

Como eu ouvi de muita gente aqui que não tem experiencia com frames, eu fiz um exemplo simples comentado.

Basicamente o frame se comporta como um form, mas ele pode ser aplicado a parte de um form e criado varias vezes dentro do mesmo form.

Alem disso, voce pode criar a classe e deixa-la pronta em seu tool pallete pra ser usada quantas vezes quiser, apenas arrastando pra dentro do projeto.

Muito util pra aquelas funcoes que sao utilizadas varias vezes dentro do projeto.

O projeto de teste está em delphi 2007 e pode ser baixado aqui:
http://www.4shared.com/rar/yCvDAhtb/TesteFrame.html
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
viox
Colaborador
Colaborador


Registrado: Sábado, 22 de Outubro de 2011
Mensagens: 1090
Localização: SINOP - MT

MensagemEnviada: Ter Abr 30, 2013 3:42 pm    Assunto: Responder com Citação

Na verdade falei que era o parent mas não havia testado haja visto de vez enquando preciso criar componentes em runtime.
Quando você falou que não funcionava colocando parent, fiquei encabulado, testei esse código mesmo que você postou, e funcionou perfeitamente.
Parent tem que ser o formulário!
_________________
Just another Delphi guy.


http://www.soft42.com
http://www.nortaonegocios.com.br
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular Enviar E-mail Visitar a homepage do Usuário MSN Messenger
leo_bruno
Profissional
Profissional


Registrado: Sexta-Feira, 16 de Abril de 2010
Mensagens: 666

MensagemEnviada: Ter Abr 30, 2013 3:43 pm    Assunto: Responder com Citação

viox escreveu:
E como você disse que está vindo errado basta inverter a ordem de criação, algo como:
Código:
 
   for I := 4 downto 0 do
   begin
     Split := TSplitter.Create(self);
     Split.Name := 'Spl' + IntTostr(i);
     Split.Parent := Form1; 
     Split.Align := alTop;
 
     Painel := TPanel.Create(Self);
     Painel.Parent := Form1;
     Painel.Name := 'Pnl' + IntTostr(i);
     Painel.Align   := alTop;
     Painel.Name    := 'Painel' + IntTostr(i);
     Painel.Caption := 'Painel' + IntTostr(i);
  end;


Conforme eu disse em comentario anterior, inverter a ordem do loop nao adianta, pois independente se for de 4 a 0 ou de 0 a 4, o proximo panel é criado em cima do anterior.

Tem a ver com a posicao de criacao do componente e nao com sua localizacao no form.
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
leo_bruno
Profissional
Profissional


Registrado: Sexta-Feira, 16 de Abril de 2010
Mensagens: 666

MensagemEnviada: Ter Abr 30, 2013 3:45 pm    Assunto: Responder com Citação

viox escreveu:
Na verdade falei que era o parent mas não havia testado haja visto de vez enquando preciso criar componentes em runtime.
Quando você falou que não funcionava colocando parent, fiquei encabulado, testei esse código mesmo que você postou, e funcionou perfeitamente.
Parent tem que ser o formulário!


O form é criado bonitinho, mas tente arrastar o split que fica entre o panel 1 e o 2 pra aumentar o tamanho do panel 1 ....


Agora repita o teste com todos os splits.

A funcionalidade do split foi perdida.

Entendeu ?
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
Mostrar os tópicos anteriores:   
Novo Tópico   Responder Mensagem    ActiveDelphi - Índice do Fórum -> Delphi Todos os horários são GMT - 3 Horas
Ir à página 1, 2  Próximo
Página 1 de 2

 
Ir para:  
Enviar Mensagens Novas: Proibido.
Responder Tópicos Proibido
Editar Mensagens: Proibido.
Excluir Mensagens: Proibido.
Votar em Enquetes: Proibido.


Powered by phpBB © 2001, 2005 phpBB Group
Traduzido por: Suporte phpBB