Como fazer minha tela desta maneira?
13/02/2006
0
[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
Posts
15/02/2006
Titanius
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
15/02/2006
Michael
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.
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
15/02/2006
Titanius
Vixi.. nem tinha visto esta propriedade... foi mal... :oops: :oops:
Obrigado,
[]s
17/02/2006
Titanius
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
17/02/2006
Titanius
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
17/02/2006
Michael
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
17/02/2006
Weber
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:
17/02/2006
Michael
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
18/02/2006
Titanius
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
27/02/2006
Marcello
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.
28/02/2006
Bon Jovi
Prefiro o estilo Docking/DockSite. Já rolou algo aqui:
http://forum.clubedelphi.net/viewtopic.php?t=67883
02/03/2006
Titanius
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
02/03/2006
Michael
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
02/03/2006
Titanius
Vixi... nem percebi... :(.. to no ritmo da Bahia ainda... ficou muito bom... gostei do resultado, valeu mesmo...
[]s
Clique aqui para fazer login e interagir na Comunidade :)