| Exibir mensagem anterior :: Exibir próxima mensagem |
| Autor |
Mensagem |
leo_bruno Profissional

Registrado: Sexta-Feira, 16 de Abril de 2010 Mensagens: 666
|
Enviada: Ter Abr 30, 2013 1:18 pm Assunto: Montar o form com redimensionamento em runtime |
|
|
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 |
|
 |
cyberdisk Colaborador

Registrado: Domingo, 4 de Julho de 2010 Mensagens: 2391 Localização: São José dos Campos - SP
|
Enviada: Ter Abr 30, 2013 1:30 pm Assunto: |
|
|
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 |
|
 |
leo_bruno Profissional

Registrado: Sexta-Feira, 16 de Abril de 2010 Mensagens: 666
|
Enviada: Ter Abr 30, 2013 1:38 pm Assunto: |
|
|
| 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 |
|
 |
cyberdisk Colaborador

Registrado: Domingo, 4 de Julho de 2010 Mensagens: 2391 Localização: São José dos Campos - SP
|
Enviada: Ter Abr 30, 2013 1:47 pm Assunto: |
|
|
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 |
|
 |
leo_bruno Profissional

Registrado: Sexta-Feira, 16 de Abril de 2010 Mensagens: 666
|
Enviada: Ter Abr 30, 2013 1:51 pm Assunto: |
|
|
| 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 |
|
 |
cyberdisk Colaborador

Registrado: Domingo, 4 de Julho de 2010 Mensagens: 2391 Localização: São José dos Campos - SP
|
Enviada: Ter Abr 30, 2013 1:55 pm Assunto: |
|
|
então mude para
Split.Align := alBottom;
abraço _________________ O conhecimento abre muitas portas |
|
| Voltar ao Topo |
|
 |
leo_bruno Profissional

Registrado: Sexta-Feira, 16 de Abril de 2010 Mensagens: 666
|
Enviada: Ter Abr 30, 2013 2:15 pm Assunto: |
|
|
| 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 |
|
 |
leo_bruno Profissional

Registrado: Sexta-Feira, 16 de Abril de 2010 Mensagens: 666
|
Enviada: Ter Abr 30, 2013 3:01 pm Assunto: |
|
|
| 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 |
|
 |
viox Colaborador

Registrado: Sábado, 22 de Outubro de 2011 Mensagens: 1090 Localização: SINOP - MT
|
|
| Voltar ao Topo |
|
 |
viox Colaborador

Registrado: Sábado, 22 de Outubro de 2011 Mensagens: 1090 Localização: SINOP - MT
|
Enviada: Ter Abr 30, 2013 3:32 pm Assunto: |
|
|
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 |
|
 |
leo_bruno Profissional

Registrado: Sexta-Feira, 16 de Abril de 2010 Mensagens: 666
|
Enviada: Ter Abr 30, 2013 3:34 pm Assunto: |
|
|
| 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 |
|
 |
leo_bruno Profissional

Registrado: Sexta-Feira, 16 de Abril de 2010 Mensagens: 666
|
Enviada: Ter Abr 30, 2013 3:35 pm Assunto: |
|
|
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 |
|
 |
viox Colaborador

Registrado: Sábado, 22 de Outubro de 2011 Mensagens: 1090 Localização: SINOP - MT
|
Enviada: Ter Abr 30, 2013 3:42 pm Assunto: |
|
|
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 |
|
 |
leo_bruno Profissional

Registrado: Sexta-Feira, 16 de Abril de 2010 Mensagens: 666
|
Enviada: Ter Abr 30, 2013 3:43 pm Assunto: |
|
|
| 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 |
|
 |
leo_bruno Profissional

Registrado: Sexta-Feira, 16 de Abril de 2010 Mensagens: 666
|
Enviada: Ter Abr 30, 2013 3:45 pm Assunto: |
|
|
| 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 |
|
 |
|