Ir para conteúdo
  • Cadastre-se

dev botao

Modificando Layout Da Tela Ao Redimensionar O Formulário


Ver Solução Respondido por Régys Silveira,
  • Este tópico foi criado há 3482 dias atrás.
  • Talvez seja melhor você criar um NOVO TÓPICO do que postar uma resposta aqui.

Recommended Posts

Boa tarde,

 

Estou com uma dúvida que talvez seja de iniciantes, mas estou procurando há algum tempo e não encontrei uma forma de fazer.

 

Eu baixei um programa para controle de gastos de uma construção desenvolvido pelo saudoso Carlos H. Cantu (que pode ser baixado por aqui), onde ao redimensionar o formulário, os componentes vão mudando de posição e se "reorganizando" de acordo com o tamanho da tela.

 

Eu gostei muito da forma que foi feita, pois o formulário fica limpo e bem organizado. E se tratando de formulários em MDI, seria uma forma de deixar a aplicação com uma boa aparência para diversas resoluções.

 

Porém, não consegui fazer algo desta forma.

 

Alguém pode me dar um rumo de onde começar?

 

Segue a tela normal:

 

post-5715-0-72474000-1413314003_thumb.pn

 

E a tela redimensionada:

 

post-5715-0-89555500-1413314004_thumb.pn

 

 

Saudações,

Wislei de Brito Fernandes

Link para o comentário
Compartilhar em outros sites

  • Consultores

A menos que exista algum componente para isso (eu desconheço que exista), esse tipo de tratamento precisa ser feito na mão.

Você precisa fazer os cálculos e fazer os posicionamentos por código.

Comece pesquisando no Google mesmo. Vai encontrar artigos interessantes como esses:

http://docwiki.embarcadero.com/RADStudio/XE6/en/Considerations_When_Dynamically_Resizing_Forms_and_Controls

http://delphi.about.com/library/weekly/aa102505a.htm

https://stackoverflow.com/questions/2505270/positioning-controls-in-delphi-5-so-they-fill-the-form-client-area-when-the-form

  • Curtir 1

[]'s

Consultor SAC ACBr

Elton
Profissionalize o ACBr na sua empresa, conheça o ACBr Pro.

Projeto ACBr     Telefone:(15) 2105-0750 WhatsApp(15)99790-2976.

Um engenheiro de Controle de Qualidade(QA) entra num bar. Pede uma cerveja. Pede zero cervejas.
Pede 99999999 cervejas. Pede -1 cervejas. Pede um jacaré. Pede asdfdhklçkh.
Link para o comentário
Compartilhar em outros sites

  • Moderadores
  • Solution

Na devexpress tem um controlador de layout, funciona dessa forma ai, no delphi 2.10 em diante tem o panel grid que também poderia ser usado para tal, e em versões mais novas do delphi existe o gridlayout.

  • Curtir 1

Equipe ACBr

Régys Borges da Silveira

http://www.regys.com.br

certificacao delphicertificacao delphi
Link para o comentário
Compartilhar em outros sites

  • Consultores

Régys, acho que é o Layout Control, citado no terceiro link.

Mas pensei que você precisasse definir os layouts antes, não?

Ele consegue jogar um "control" para outra posição automaticamente quando o usuário modificar o tamanho do form?

[]'s

Consultor SAC ACBr

Elton
Profissionalize o ACBr na sua empresa, conheça o ACBr Pro.

Projeto ACBr     Telefone:(15) 2105-0750 WhatsApp(15)99790-2976.

Um engenheiro de Controle de Qualidade(QA) entra num bar. Pede uma cerveja. Pede zero cervejas.
Pede 99999999 cervejas. Pede -1 cervejas. Pede um jacaré. Pede asdfdhklçkh.
Link para o comentário
Compartilhar em outros sites

  • Moderadores

Sim, você define o grid dos componente, na verdade você adiciona os componentes por ele e define as constrains de tamanho, largura, etc, etc, o resto ele faz.

Já usei ele aqui é muito, muito bom.

 

Uma coisa que gostei nele é que até a barra de rolagem ele coloca se necessário.

  • Curtir 1

Equipe ACBr

Régys Borges da Silveira

http://www.regys.com.br

certificacao delphicertificacao delphi
Link para o comentário
Compartilhar em outros sites

Bom dia,

 

Obrigado a todos pela atenção.

 

Realmente o TdxLayoutControl da DevExpress faz um ótimo controle e o TGridPanel também faz algo bem parecido

 

A princípio não consegui fazer com que os componentes mudem de posição ao redimensionar o formulário, mas a barra de progresso já é exibida automaticamente e a disposição deles fica muito organizada.

 

Tenho certeza que com um pouco de tempo vou conseguir configurá-lo aqui. Precisava apenas deste ponta-pé inicial.

 

Grato a todos.

Saudações,

Wislei de Brito Fernandes

Link para o comentário
Compartilhar em outros sites

  • Consultores

Não é exatamente o que você mencionou, mas o que me convenceu que pode ser feito foi o seguinte vídeo:

 

Dá uma olhada por volta de 1:20

  • Curtir 3

[]'s

Consultor SAC ACBr

Elton
Profissionalize o ACBr na sua empresa, conheça o ACBr Pro.

Projeto ACBr     Telefone:(15) 2105-0750 WhatsApp(15)99790-2976.

Um engenheiro de Controle de Qualidade(QA) entra num bar. Pede uma cerveja. Pede zero cervejas.
Pede 99999999 cervejas. Pede -1 cervejas. Pede um jacaré. Pede asdfdhklçkh.
Link para o comentário
Compartilhar em outros sites

Eu tenho uma rotina que faz isso pra montar campos livres na tela, funciona exatamente como você quer:

procedure TFrmRotPesquisa.MontaCamposLivres;
var
  Loop, iLeft, iTop: Integer;
  F: TField;
  Lb, OldLb: TMaskLabeledEdit;
  Campo:TCampoLivre;
begin
  pnCamposLivres.Visible := False;
  if (Pesquisa.CamposLivres.Count>0) then
  begin
     pnCamposLivres.Visible := True;
     {Retira todos os campos livres da tela}
     while True do
     begin
       Loop := (pnCamposLivres.ControlCount - 1);
       if (Loop < 0) then Break;
       pnCamposLivres.Controls[Loop].Destroy;
     end;

     OldLb := nil;
     iLeft := 6;
     iTop := 18;

     for Loop := 0 to (Pesquisa.CamposLivres.Count - 1) do
     begin
       {Procura o campo pelo nome}
       Campo := TCampoLivre(Pesquisa.CamposLivres.Items[Loop]);
       F := cdsPesquisa.Fields.FindField(Campo.NomeCampo);
       if (F = nil) then
         Continue;

       {Cria o campo e redimensiona}
       Lb := TMaskLabeledEdit.Create(Self);
       Lb.Parent := pnCamposLivres;
       Lb.Left := iLeft;
       Lb.Top := iTop;
       if (F.DataType=ftInteger) then
          lb.Width := 50
       else
          Lb.Width := (F.DisplayWidth * 7);
       Lb.Name := 'ed' + F.FieldName;
       Lb.Habilitado := False;
       Lb.LabelSpacing := 0;
       Lb.TabStop := False;
       Lb.CaptionLabel := TCampoLivre(Pesquisa.CamposLivres.Items[Loop]).Titulo;

       {Se for o ultimo campo da tela e o próximo campo da tela não couber, ajusta
        o campo atual pra fechar o tamanho da tela}
       Inc(iLeft, Lb.Width);
       if (iLeft > pnCamposLivres.Width) then
       begin
         iLeft := 6;
         Inc(iTop, 40);

         Lb.Left := iLeft;
         Lb.Top := iTop;

         if (OldLb <> nil) then
           OldLb.Width := (pnCamposLivres.Width - 6 - OldLb.Left);
         Inc(iLeft, Lb.Width);
         pnCamposLivres.Height := pnCamposLivres.Height+41;
       end;

       Inc(iLeft, 3);
       OldLb := Lb;
     end;
  end;

Espero ter ajudado.

  • Curtir 2

Sistemas para toda área Goumert, pequeno varejo e baladas.

www.controleautomacao.com.br

Link para o comentário
Compartilhar em outros sites

  • Consultores

Eu tenho uma rotina que faz isso pra montar campos livres na tela, funciona exatamente como você quer:

procedure TFrmRotPesquisa.MontaCamposLivres;
var
  Loop, iLeft, iTop: Integer;
  F: TField;
  Lb, OldLb: TMaskLabeledEdit;
  Campo:TCampoLivre;

Espero ter ajudado.

O que vem a ser o tipo TCampoLivre?

  • Curtir 1

[]'s

Consultor SAC ACBr

Elton
Profissionalize o ACBr na sua empresa, conheça o ACBr Pro.

Projeto ACBr     Telefone:(15) 2105-0750 WhatsApp(15)99790-2976.

Um engenheiro de Controle de Qualidade(QA) entra num bar. Pede uma cerveja. Pede zero cervejas.
Pede 99999999 cervejas. Pede -1 cervejas. Pede um jacaré. Pede asdfdhklçkh.
Link para o comentário
Compartilhar em outros sites

Na verdade TCampoLivre é um objeto meu. Você pode desconsiderar o tipo do dado. Veja que eu uso o TCampoLivre só pra pegar o titulo do campo, o tamanho e o valor que vai dentro dele. É uma coisa interna minha. Se atente principalmente nisso:

{Se for o ultimo campo da tela e o próximo campo da tela não couber, ajusta
        o campo atual pra fechar o tamanho da tela}
       Inc(iLeft, Lb.Width);
       if (iLeft > pnCamposLivres.Width) then
       begin
         iLeft := 6;
         Inc(iTop, 40);

         Lb.Left := iLeft;
         Lb.Top := iTop;

         if (OldLb <> nil) then
           OldLb.Width := (pnCamposLivres.Width - 6 - OldLb.Left);
         Inc(iLeft, Lb.Width);
         pnCamposLivres.Height := pnCamposLivres.Height+41;
       end;

       Inc(iLeft, 3);
       OldLb := Lb;

Sistemas para toda área Goumert, pequeno varejo e baladas.

www.controleautomacao.com.br

Link para o comentário
Compartilhar em outros sites

  • Este tópico foi criado há 3482 dias atrás.
  • Talvez seja melhor você criar um NOVO TÓPICO do que postar uma resposta aqui.

Crie uma conta ou entre para comentar

Você precisar ser um membro para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar Agora
×
×
  • Criar Novo...

Informação Importante

Colocamos cookies em seu dispositivo para ajudar a tornar este site melhor. Você pode ajustar suas configurações de cookies, caso contrário, assumiremos que você está bem para continuar.