Como fazer minha tela desta maneira?

Delphi

13/02/2006

Olá amigos, gostaria de uma ajuda de vocês, gostaria de fazer uma tela parecida com esta do Delphi 2005:

As abas seriam os Captions dos formulários, e quando eu clicasse na aba, automaticamente, abaixo abriria o Form, porém não sei fazer isso, estou tentando usar um componente que vem com o JEDI, porém me parece que ele come muita memória, e já me falaram que eu poderia usar Frame para isso... mas eu nunca usei...

Pois bem, queria fazer isso, e de uma forma que não ficasse muito pesado.. As abas eu já tenho o componente pra fazer, o que falta eh esse negócio do Form mesmo..

Aproveitando, vocês preferem a tela desta maneira ou MDI? Seria uma boa fazer uma enquete sobre isso :D

Desde já agradeço a todos...

[]s


Titanius

Titanius

Curtidas 0

Respostas

Titanius

Titanius

13/02/2006

Sobe...

Ninguém tem idéia de como fazer? :cry:

[]s


GOSTEI 0
Aroldo Zanela

Aroldo Zanela

13/02/2006

Colega,

Eu ainda não entendi, pois se eu tivesse entendido, bastaria usar PageControl.


GOSTEI 0
Weber

Weber

13/02/2006

Parece ser algum tipo de page control! Sei lá.


GOSTEI 0
Paulocesar1301

Paulocesar1301

13/02/2006

O ideal seria utilizar PageControl com frames, não ?


GOSTEI 0
Truck1n

Truck1n

13/02/2006

Page Control, pelo menos vc nao precisa ficar criando muitos formularios.

:lol:


GOSTEI 0
Titanius

Titanius

13/02/2006

[quote:3de326d2df=´Aroldo Zanela´]Colega,

Eu ainda não entendi, pois se eu tivesse entendido, bastaria usar PageControl.[/quote:3de326d2df]

Olá pessoal... Pois bem, vou explicar melhor :D

Tenho uma barra acima, que ficaria os Captions dos forms que eu criaria.. pois em baixo desta barra, eu mostraria o Form em questão, o problema do PageControl, eh que nao dá pra colocar um form dentro da ´página´ ou dá? o meu problema está mesmo em inserir um Form na parte de baixo da Barra, pois o form a ser inserido poderá ser qualquer um da aplicação...

O ideal seria utilizar PageControl com frames, não ?

Com o Frame eu posso mudar o Form dentro dele em RunTime?

Page Control, pelo menos vc nao precisa ficar criando muitos formularios.


A intenção é justamente essa, ao invés de criar um Form como MDIChild, eu criaria ele em forma de Tabs... :D


[]s


GOSTEI 0
Weber

Weber

13/02/2006

Uma vez vi em algum lugar uma forma para colocar um Form dentro de um panel, o procedimento dever ser o mesmo, ou na pior das hipóteses da pra colocar um panel dentro de pada tabsheet e colocar cada form dentro de seu panel.

Da uma olhada no site, acho que foi aqui mesmo no clubedelphi.net que vi esta dica!


GOSTEI 0
Titanius

Titanius

13/02/2006

Uma vez vi em algum lugar uma forma para colocar um Form dentro de um panel, o procedimento dever ser o mesmo, ou na pior das hipóteses da pra colocar um panel dentro de pada tabsheet e colocar cada form dentro de seu panel. Da uma olhada no site, acho que foi aqui mesmo no clubedelphi.net que vi esta dica!


blz, irei procurar... obrigado...


GOSTEI 0
Paulocesar1301

Paulocesar1301

13/02/2006

Este é apenas um teste rápido de como colocar um Form dentro de Outro componente:

Podes colocar no
procedure T<SeuFormBase>.<SeuPageControl>Change(Sender: TObject);

If <SeuFormBase>.<SeuPageControl>.ActivePageIndex = 0 Then
begin
If Assigned(Form2) Then
<FormACriar>.Show
Else begin
<FormACriar> := T<FormACriar>.Create(nil);
<FormACriar>.Parent := <SeuFormBase>.<SeuPageControl>.Pages[0];
<FormACriar>.Show;
End;
end;

Obs.:
Para teste coloquei o <FormACriar> com wsMaximized;
No OnClose do <FormACriar> coloquei Action:=caFree;
No OnDestroy do <FormACriar> coloquei <FormACriar> := nil;


GOSTEI 0
Titanius

Titanius

13/02/2006

Este é apenas um teste rápido de como colocar um Form dentro de Outro componente: Podes colocar no procedure T<SeuFormBase>.<SeuPageControl>Change(Sender: TObject); If <SeuFormBase>.<SeuPageControl>.ActivePageIndex = 0 Then begin If Assigned(Form2) Then <FormACriar>.Show Else begin <FormACriar> := T<FormACriar>.Create(nil); <FormACriar>.Parent := <SeuFormBase>.<SeuPageControl>.Pages[0]; <FormACriar>.Show; End; end; Obs.: Para teste coloquei o <FormACriar> com wsMaximized; No OnClose do <FormACriar> coloquei Action:=caFree; No OnDestroy do <FormACriar> coloquei <FormACriar> := nil;


Olá amigo,

Testei porém, parece que o Parent não funcionou... ele exibiu a tela, porém não dentro do pagecontrol :(

meu codigo:
  If Form1.PgC1.ActivePageIndex = 0 Then
  begin
    If Assigned(Form2) Then
    Form2.Show
    Else
    begin
      Form2 := TForm2.Create(nil);
      Form2.Parent := Form1.PgC1.Pages[0];
      Form2.Show;
    End;
  end;


Fiz algo de errado?

[]s


GOSTEI 0
Michael

Michael

13/02/2006

Olá!

Vc pode realmente simular o esquema de abas do Delphi 2005 usando o componente [b:9ed858b9e7]TPageControl[/b:9ed858b9e7], preferencialmente com a propriedade [b:9ed858b9e7]Style [/b:9ed858b9e7]definida para [b:9ed858b9e7]tsButtons [/b:9ed858b9e7]ou [b:9ed858b9e7]tsFlatButtons [/b:9ed858b9e7](pessoalmente prefiro este último).

Para criar o form dentro da TabSheet do PageControl, use um código como o a seguir:

begin
  with TForm2.Create(nil) do
  begin
    BorderStyle := bsNone;
    Align := alClient; // Sim, Align serve para alguma coisa em forms!
    Parent := TabSheet1;
    (Parent as TabSheet).Caption := Caption;
    Show;
  end;


Obviamente que as [b:9ed858b9e7]TabSheets [/b:9ed858b9e7]serão dinâmicas, então o código acima pode variar um pouco. Lembre-se tbm de criar um procedimento para liberar os forms da memória quando a aplicação terminar - pois estamos criando eles com [b:9ed858b9e7]nil[/b:9ed858b9e7]. Vc pode usar o mecanismo de Owner do Delphi, desta forma:

with TForm2.Create(TabSheet1) do
...


Assim vc só precisa liberar a TabSheet no [b:9ed858b9e7]OnDestroy [/b:9ed858b9e7]do formulário principal e o form associado a ela vai junto. De qualquer forma, se as abas forem fixas, então não será necessário destruí-las manualmente.

Vc pode melhorar ainda mais a interface associado uma imagem à cada aba do PageControl, que represente a funcionalidade do form. E, como o não haverá mais os botões de controle da janela (Minimiza, Maximizar e Fechar), será necessário implementar alguma maneira de o usuário poder pelo menos fechar o form.

Apenas para constar: a DevExpress possui um componente PageControl que é idêntico ao do Delphi 2005, inclusive com o botão de Fechar. Acredito que há outros, free ou open source, mas não me recordo de nenhum no momento.

[]´s


GOSTEI 0
Martins

Martins

13/02/2006

Michael, estou só trocando [color=red:3b3a0e5a77][b:3b3a0e5a77](Parent as TabSheet).Caption := Caption[/b:3b3a0e5a77][/color:3b3a0e5a77];
por [color=green:3b3a0e5a77][b:3b3a0e5a77](Parent as TTabSheet).Caption := Caption[/b:3b3a0e5a77][/color:3b3a0e5a77];
begin 
  with TForm2.Create(nil) do 
  begin 
    BorderStyle := bsNone; 
    Align := alClient; // Sim, Align serve para alguma coisa em forms! 
    Parent := TabSheet1; 
    (Parent as TTabSheet).Caption := Caption; 
    Show; 
  end;


Valew pela dica camarada!!!


GOSTEI 0
Michael

Michael

13/02/2006

Michael, estou só trocando [color=red:c6f9626d9e][b:c6f9626d9e](Parent as TabSheet).Caption := Caption[/b:c6f9626d9e][/color:c6f9626d9e]; por [color=green:c6f9626d9e][b:c6f9626d9e](Parent as TTabSheet).Caption := Caption[/b:c6f9626d9e][/color:c6f9626d9e];


É verdade. Nem havia percebido... ;-)

[]´s


GOSTEI 0
Martins

Martins

13/02/2006

[quote:dd7d39e263=´Martins´]Michael, estou só trocando [color=red:dd7d39e263][b:dd7d39e263](Parent as TabSheet).Caption := Caption[/b:dd7d39e263][/color:dd7d39e263]; por [color=green:dd7d39e263][b:dd7d39e263](Parent as TTabSheet).Caption := Caption[/b:dd7d39e263][/color:dd7d39e263];


É verdade. Nem havia percebido... ;-)

[]´s[/quote:dd7d39e263]

É a correria compadre, isso acontece, relaxa!!! :wink:


GOSTEI 0
Paulocesar1301

Paulocesar1301

13/02/2006

:oops: recolho-me a minha insignificância.... sua dica foi INFINITAMENTE mais construtiva que a minha !! :oops:


GOSTEI 0
Titanius

Titanius

13/02/2006

Galera, muito obrigado, irei testar aqui e posto qualquer coisa...

Quando ao componente eu vi lá que a DevExpress tem, porém só tenho para delphi 7... e estou pensando em passar este aplicativo pra 2006.. e a grana do pessoal pra comprar tá curta.. :D

De qualquer forma tem um da Berg que tem isso também...

Aproveitando, como eu coloco um bitmap na frente do button do pagecontrol?


OBrigado,

[]s


GOSTEI 0
Michael

Michael

13/02/2006

:oops: recolho-me a minha insignificância.... sua dica foi INFINITAMENTE mais construtiva que a minha !! :oops:


Não diga isso! A ajuda de todos é sempre bem vinda. Não existe neste fórum isso de uma dica ser melhor do que a outra. Todas são construtivas e contribuem para a difusão de conhecimento.

Aproveitando, como eu coloco um bitmap na frente do button do pagecontrol?


Insira as imagens em um [b:481430b5ac]TImageList [/b:481430b5ac]e depois aponte a propriedade Images do [b:481430b5ac]TPageControl [/b:481430b5ac]para ele. Ajuste os índices em cada [b:481430b5ac]TabSheet [/b:481430b5ac]através da propriedade [b:481430b5ac]ImageIndex[/b:481430b5ac].

[]´s


GOSTEI 0
Titanius

Titanius

13/02/2006

Insira as imagens em um [b:6318a60b5c]TImageList [/b:6318a60b5c]e depois aponte a propriedade Images do [b:6318a60b5c]TPageControl [/b:6318a60b5c]para ele. Ajuste os índices em cada [b:6318a60b5c]TabSheet [/b:6318a60b5c]através da propriedade [b:6318a60b5c]ImageIndex[/b:6318a60b5c]. []´s


Vixi.. nem tinha visto esta propriedade... foi mal... :oops: :oops:


Obrigado,

[]s


GOSTEI 0
Titanius

Titanius

13/02/2006

Olá Michael,

só agora que tive oportunidade de testar a função..

estou tendo problemas para criar um tabsheet em runtime! Você sabe como posso fazer?


[]s


GOSTEI 0
Titanius

Titanius

13/02/2006

Valeu consegui... Meu problema agora é o seguinte, preciso criar um form em RunTime, porém em uma função...

segue minha função:

function CriaTab(_Tab: TPageControl; _Caption: string; _FormLink: TForm; const _ImgIdx: integer = 3; const _Focar: Boolean = True): Boolean;
var
 Idx, i: integer;
 Nome: string;
begin
 try
  IncluindoTab := True;

{-------------------------------------------------------------------------------
 -  Crio uma página no PageList Principal.
 -------------------------------------------------------------------------------}
  with FrmPrincipal do
  begin

   with TTabSheet.Create(nil) do
   begin
    PageControl := PgCtrlPrincipal;
   end;

   with _FormLink.Create(nil) do
   begin
    BorderStyle := bsNone;
    Align := alClient; // Sim, Align serve para alguma coisa em forms!
    Parent := PgCtrlPrincipal.Pages[PgCtrlPrincipal.PageCount - 1];
    (Parent as TTabSheet).Caption := _Caption;
    (Parent as TTabSheet).ImageIndex := 4;
    Show;
   end;
   PgCtrlPrincipal.Update;
  end;
  Application.ProcessMessages;
  IncluindoTab := False;
  Result := True;
 except
  Result := False;
 end;
end;


Pois bem.. normalmente pra criar um form eu uso:

Form1 := TForm1.Create(nil);


Como eu uso dessa maneira na funcao acima? Pois tentei e nao funcionou.. :(

Outra coisa, na linha
with TTabSheet.Create(nil) do

quando coloco
with TTabSheet.Create([b:d3ec213eb2]Self[/b:d3ec213eb2]) do

dá este erro:

Undeclared Identifier: ´Self´




Obrigado,

[]s


GOSTEI 0
Michael

Michael

13/02/2006

Vou responder de trás para frente:

1) [b:3755fe3cb9]Self [/b:3755fe3cb9]é um atributo de classes. Como sua função não é um método de uma, [b:3755fe3cb9]Self[/b:3755fe3cb9] não está definido dentro dela.

2) Vc está passando para a função uma instância de [b:3755fe3cb9]TForm[/b:3755fe3cb9], e portanto não pode criá-la com [b:3755fe3cb9]Create[/b:3755fe3cb9], pois ele é um ponteiro, não uma classe.

Use essa rotina, que poderia ser uma pseudo-factory:

procedure TFormPrincipal.CreateNewForm(FormClass: TFormClass);
var
  TabSheet: TTabSheet;
begin
  // Cria a aba no PageControl
  TabSheet := TTabSheet.Create(PageControl);
  TabSheet.PageControl := PageControl;

  // Cria o formulário e o colacamos dentro da TabSheet
  with FormClass.Create(TabSheet) do
  begin
    Align := alClient;
    BorderStyle := bsNone;
    Parent := TabSheet;
    TabSheet.Caption := Caption;
    TabSheet.ImageIndex := 0;
  end;

  // Exibe o form
  Form.Show;

  // Focamos na aba recém-criada
  PageControl.ActivePage := TabSheet;
end;


Veja que usei o mecanismo de Owner do Delphi para não me preocupar em liberar os formulários nem as tabsheets da memória. Embora eu tenha dito no post anterior que vc precisaria destruir tudo qdo a aplicação terminal, isso não é necessário, desde que os Owner sejam definidos como na função acima. Qdo a aplicação terminar, o PageControl será destruído, o que irá liberar as abas, e conseqüentemente os forms.

[]´s


GOSTEI 0
Weber

Weber

13/02/2006

Tenho acompanhado está discução e vou complicar mais um pouco o trabalho de vocês.
A rotina deverá verificar se o form já está criado, caso esteja teria-se então que mandar o foco para o TabSheet já existente. :lol:


GOSTEI 0
Michael

Michael

13/02/2006

Tenho acompanhado está discução e vou complicar mais um pouco o trabalho de vocês. A rotina deverá verificar se o form já está criado, caso esteja teria-se então que mandar o foco para o TabSheet já existente. :lol:


Simples:

function TFormularioPrincipal.GetFormTabSheet(FormClass: TFormClass): TTabSheet;
var
  I: Integer;
begin
  Result := nil;
  with PageControl do
    for I := 0 to PageCount - 1 do
      if Pages[I].Components[0].ClassType = FormClass then
      begin
        Result := Pages[I];
        Break;
      end;
end;

procedure TFormularioPrincipal.CreateNewForm(FormClass: TFormClass);
var
  TabSheet: TTabSheet;
  TabObj: TComponent;
begin
  TabObj := GetFormTabSheet(FormClass);
  if Assigned(TabObj) then
  begin
    PageControl.ActivePage := TabObj as TTabSheet;
    Exit;
  end;
...
end;


[]´s


GOSTEI 0
Titanius

Titanius

13/02/2006

Michael... você tá salvando minha pele cara.!! :D

Vou criar uma função para isso tudo.. infelizmente não poderei testa-la, pois vou viajar de Férias :roll: :roll: hoje, e só volto depois do carnaval... mas testarei e qualquer coisa retorno aqui...

Mais uma vez obrigado....

Só uma perguntinha pra finalizar:

[b:e4263719ba]No sistema vocês preferem as telas desta maneira ou como MDI normal?[/b:e4263719ba]

[]s


GOSTEI 0
Marcello

Marcello

13/02/2006

Gostaria de aproveitar este tópico para minha dúvida.
Digamos q eu quero manter as TabSheets fixas e no evento onShow da mesma criar um form, e no evento onExit liberar apenas o form da memória, mantendo a TabSheet para poder clicar nela novamente, caso necessário.
Seguindo as instruções deste tópico criei o form e deu certo, mas não consegui fechá-lo.

Agradeço a ajuda dos colegas,

Marcello.


GOSTEI 0
Bon Jovi

Bon Jovi

13/02/2006

Aproveitando, vocês preferem a tela desta maneira ou MDI? Seria uma boa fazer uma enquete sobre isso Very Happy

Prefiro o estilo Docking/DockSite. Já rolou algo aqui:
http://forum.clubedelphi.net/viewtopic.php?t=67883


GOSTEI 0
Titanius

Titanius

13/02/2006

Fala aí Michael... cheguei de férias :( e estou testando os códigos... porém deu um errinho no seguinte código:

procedure TFormPrincipal.CreateNewForm(FormClass: TFormClass); 
var 
  TabSheet: TTabSheet; 
begin 
  // Cria a aba no PageControl 
  TabSheet := TTabSheet.Create(PageControl); 
  TabSheet.PageControl := PageControl; 

  // Cria o formulário e o colacamos dentro da TabSheet 
  with FormClass.Create(TabSheet) do 
  begin 
    Align := alClient; 
    BorderStyle := bsNone; 
    Parent := TabSheet; 
    TabSheet.Caption := Caption; 
    TabSheet.ImageIndex := 0; 
  end; 

  // Exibe o form 
  Form.Show; 

  // Focamos na aba recém-criada 
  PageControl.ActivePage := TabSheet; 
end;


Erro:
[b:a4cde460c6]
Undeclared identifier: ´Form´;
[/b:a4cde460c6]

Como eu uso isso? esse Form, aí é o nome do meu Form?

[]s


GOSTEI 0
Michael

Michael

13/02/2006

Fala aí Michael... cheguei de férias :( e estou testando os códigos... porém deu um errinho no seguinte código:


Que férias curtas hein...

Eu esqueci de declarar uma variável na função. Corrija como mostrado abaixo:

var
  ...
  Form: TCustomForm;
begin
 ...

  Form := FormClass.Create(TabSheet);
  with Form do
  ...
end;


Não percebeu isso? Voltou mas a cabeça ainda ficou na praia né ;-)

[]´s


GOSTEI 0
Titanius

Titanius

13/02/2006

Não percebeu isso? Voltou mas a cabeça ainda ficou na praia né ;-)


Vixi... nem percebi... :(.. to no ritmo da Bahia ainda... ficou muito bom... gostei do resultado, valeu mesmo...


[]s


GOSTEI 0
POSTAR