Como fazer minha tela desta maneira?

13/02/2006

0

Olá amigos, gostaria de uma ajuda de vocês, gostaria de fazer uma tela parecida com esta do Delphi 2005:
[img:bd112992f3]http://www.digitum.info/cb.gif[/img:bd112992f3]

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

Responder

Posts

15/02/2006

Titanius

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


Responder

15/02/2006

Michael

: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


Responder

15/02/2006

Titanius

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


Responder

17/02/2006

Titanius

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


Responder

17/02/2006

Titanius

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


Responder

17/02/2006

Michael

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


Responder

17/02/2006

Weber

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:


Responder

17/02/2006

Michael

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


Responder

18/02/2006

Titanius

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


Responder

27/02/2006

Marcello

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.


Responder

28/02/2006

Bon Jovi

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


Responder

02/03/2006

Titanius

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


Responder

02/03/2006

Michael

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


Responder

02/03/2006

Titanius

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


Responder

Assista grátis a nossa aula inaugural

Assitir aula

Saiba por que programar é uma questão de
sobrevivência e como aprender sem riscos

Assistir agora

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar