Ir ao conteúdo
  • Cadastre-se

Pascal/Delphi Um unico painel visivel em todos os forms da aplicação


Posts recomendados

Olá amigos. Preciso de uma ajuda...

Imagine que em uma aplicação tenho vários forms. Quero ter uma barra lateral sempre visivel que deve ser tipo um painel com botões para navegar por entre os forms. Este painel é um só para a aplicação inteira, ou seja, ao trocar de form o painel com os botões deve aparecer neste outro form também. Tem algum componente especifico pra isso em vez de ter que ficar dando um ctrl+c e ctrl+v no painel? Se eu fizer ctrl+c e ctrl+v no painel pra copiá-lo para os demais forms, vai dar o maior trabalho ter que sempre repetir o código dos botões e se mudar algo tem que copiar tudo de novo correndo o risco de deixar algum form desatualizado...

Tem que ser botões grandinhos pra usar com display touch-screen então por isso não uso tabcontrols ou menus. Também não gosto de usar notebook porque acho que o controle dele me faz perder muito tempo ao fazer o layout dos forms e além disso todas as funções e eventos de objetos ficariam acumulados em uma unica unit deixando o código muito desorganizado...

Agradeço sugestões (pode ser um componente das novas versões do delphi [embarcadero])

Sem título.png

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

Boa tarde,

 

Você poderia criar apenas um modelo e carregar toda vez no oncreate do form.

 

Você pode utilizar a propriedade parent.

 

Por exmeplo deixe ele na memoria de um formulario Exemplo

 


// no evento on create

Begin

      Application.createform(TFormExemplo, Fexemplo);

      Twincontrol(Fexemplo.panel1).parent := self;

 

 { atenção o panel está na memoria junto com o formulario "Fexemplo", porém está sendo exibido no novo form ("SELF");

não testei, mas acredito que ao liberar o formulário "Fexemplo" ocorrerá um erro, antes de liberar o form ("self");

}

end;

 

Outra maneira seria desenhar o form novo dentro do form dos menus. Exemplo


 Begin

// Estou admitindo que Form2 ja foi criado 

   Form2.parent :=  self; //  {Aqui poderia usar um panel}

    form2.left := 0;

    form2.top := 0;

    form2.show;

end;

 

 

Abraços.

 

 

 

Link para o comentário
Compartilhar em outros sites

Cara sua dica de criar um form pra conter meu painel de botões e depois fazer este form aparecer nos outros forms da aplicação foi demais.

Fiz assim:

1. Criei os forms "Form1", "Form2" e "FormPainel", onde "FormPainel" é o form que contém os botões pra troca de telas, que é visivel em todos os forms da aplicação.

2. Na unit do programa criei uma classe pra ter as funções OnActivate e OnClose que responderão a todos os forms da aplicação, vinculando as funções dos forms para as funções desta classe

 

program Project1;

uses
  Controls, //acrescentado
  Forms,
  U_Diversos in 'U_Diversos.pas',
  Unit1 in 'Unit1.pas' {Form1},
  Unit2 in 'Unit2.pas' {Form2},
  U_UniversalPanel in 'U_UniversalPanel.pas',
  U_Painel in 'U_Painel.pas' {FormPainel},
  U_GlobalUnit in 'U_GlobalUnit.pas';

//cria instância para eventos OnFormActivate e OnFormClose
//que responderão a todos os forms da aplicação
Type
  TUniversalEvents = class
    procedure FormActivate(Sender: TObject);
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
  end;

{$R *.res}

var
  UniversalEvents: TUniversalEvents;

{ TOnShowEvent }

procedure TUniversalEvents.FormActivate(Sender: TObject);
var
  i: integer;
begin
  //faz todos os outros forms ficarem invisíveis, ficando
  //visível apenas o form que chamou esta função
  //(o form que chamou esta função é passada como "Sender")
  for i:= 0 to Screen.FormCount-1 do
  begin
    if(Screen.Forms[i] <> TForm(Sender))then
      Screen.Forms[i].Visible:= False;
  end;

  //verifica se o form que contém os botões de navegação
  //entre forms já está criado
  if(assigned(FormPainel))then
  begin
    //se o painel de botões não estiver no form atual
    //ele será colocado no form atual
    if(FormPainel.Parent <> TForm(Sender))then
    begin
      FormPainel.BorderStyle:= bsNone;
      FormPainel.Parent:= TForm(Sender);
      FormPainel.Visible:= True;
      FormPainel.Align:= alLeft;
    end;
  end;
end;

procedure TUniversalEvents.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  //se qualquer form for fechado então
  //a aplicação será encerrada
  Application.Terminate;
end;

var
  i: integer;

begin
  Application.Initialize;
  Application.CreateForm(TForm1, Form1);
  Application.CreateForm(TForm2, Form2);
  Application.CreateForm(TFormPainel, FormPainel);

  for i:= 0 to Screen.FormCount-1 do
  begin
    Screen.Forms[i].OnActivate:= UniversalEvents.FormActivate;
    Screen.Forms[i].OnClose:= UniversalEvents.FormClose;
  end;

  Application.Run;
end.

E agora o código do form que contém os botões pra troca de telas:

unit U_Painel;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, Buttons, ExtCtrls;

type
  TFormPainel = class(TForm)
    Panel1: TPanel;
    Btn1: TSpeedButton;
    Btn2: TSpeedButton;
    procedure Btn1Click(Sender: TObject);
    procedure Btn2Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  FormPainel: TFormPainel;

implementation

uses Unit1, Unit2;

{$R *.dfm}

procedure TFormPainel.Btn1Click(Sender: TObject);
begin
  Form1.Show;
end;

procedure TFormPainel.Btn2Click(Sender: TObject);
begin
  Form2.Show;
end;

end.

E pronto!

 

Agora ao invés de utilizar os eventos OnFormShow e OnFormClose será que não daria pra usar um TApplicationEvents pra responder ao comando de troca de form pra poder alterar o parent do form de painel de botões?

Link para o comentário
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisa ser um usuário 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

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...

Ebook grátis: Aprenda a ler resistores e capacitores!

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!