Barra de Ferramentas em Aplicação Form MDI (Igual WindowsBar do IbExpert)

30/05/2009

Olá

Estou desenvolvendo uma aplicação FormMDI e gostaria de criar uma barra de ferramentas que mostrasse as opções abertas na aplicação, igual a windowsbar do ibexpert ou a barra de ferramentas do windows xp.

Como eu poderia fazer isto?

Abaixo modelo de como seria.

Abraços,

Rogério


Rogério Nascimento

Rogério Nascimento

Curtidas 0

Respostas

Wesley Yamazack

Wesley Yamazack

30/05/2009

Olá Rogério,
   Estarei desenvolvendo o teu exemplo, e logo retornarei com o mesmo.
   Peço que aguarde. Grato pela compreensão.

Att,

Wesley Y
GOSTEI 0
Wesley Yamazack

Wesley Yamazack

30/05/2009

Olá Rogério,

   Segue abaixo exmplo para que você possa fazer a mesma ideia do ibexpert .


unit uPrincipal;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, Menus, ToolWin, ComCtrls, StdCtrls;

type
  TFrmPrincipal = class(TForm)
    MainMenu1: TMainMenu;
    Cliente1: TMenuItem;
    ToolBar1: TToolBar;
    Button1: TButton;
    procedure Cliente1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
    Botao : TToolButton; // Add este botão aqui
    procedure DoClick(Sender: TObject); // add esta procedure e implemente a mesma
  end;

var
  FrmPrincipal: TFrmPrincipal;

implementation

uses uCliente;

{$R *.dfm}

procedure TFrmPrincipal.Cliente1Click(Sender: TObject);
begin
  FrmCliente := TFrmCliente.Create(Self);
  FrmCliente.Show;
  Botao := TToolButton.Create(ToolBar1);
  Botao.Caption := FrmCliente.Caption;
  Botao.tag := Integer(FrmCliente);
  Botao.Parent  := ToolBar1;
  Botao.OnClick := DoClick;
  ToolBar1.ShowCaptions := True;  
end;

procedure TFrmPrincipal.DoClick(Sender: TObject);
begin
  TForm(TComponent(Sender).Tag).Color := clRed;
  TForm(TComponent(Sender).Tag).show;
end;

end.



Att,

Wesley Y
GOSTEI 0
Rogério Nascimento

Rogério Nascimento

30/05/2009

Olá Wesley

Muito obrigado pela ajuda, é extamente isto que estou precisando, mas preciso de uma ajuda ainda em relação a isto.

Como devo fazer para que ao o botão fique checado conforme o form selecionado.

Exemplo:

 Abri 3 Form´s (Clientes,Fornecedores e Produtos) pelo MainMenu, mas estou operando no form Fornecedores, gostaria que na toolbar identificasse o form em operação, se eu trocar para o form Clientes, o botão checado será o relacionado ao cliente e o anterior (Fornecedores) volta ao estado normal.


E mais uma ajuda !

Qual a melhor forma de chamar o Form Child para que ele não abra mais de uma vez, eu utilizo desta forma:

 if FrmClientes = nil then
begin
 FrmClientes := TFrmClientes.Creat(Self);
 FrmClientes.Show;
end
else
 FrmClientes.Show;


e depois eu faço assim para fechar o mesmo:


procedure TFrmClientes.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  FrmClientes.FormClose;
end;

procedure TFrmClientes.FormDestroy(Sender: TObject);
begin
  FrmClientes := nil;
end;


Esta é a melhor forma? ou a forma mais correta?

Abraços,

Rogério Nascimento
GOSTEI 0
Wesley Yamazack

Wesley Yamazack

30/05/2009

Olá Rogério,
  Estarei fazendo as alterações e logo te retornarei com a solução.
  Peço que aguarde.

Att,

Wesley Y
GOSTEI 0
Wesley Yamazack

Wesley Yamazack

30/05/2009

Olá Rogério,

  Vamos lá.
  1 - No Form que você que "destruir" o botão faça o seguinte.

  2 - Dar uses nos forms em ComCtrls;

procedure TFrmCliente.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  TToolButton(tag).Destroy; // Adicionando isso, ao fechar o teu form o Botão que esta associoado a ele será destruído.
  Action := caFree;
end;


   Você não precisa botar num bloco begin / end e dar um Show novamente, do jeito que esta agora já funciona.
 if FrmClientes = nil then
    FrmClientes := TFrmClientes.Creat(Self);
FrmClientes.Show;

    Altere também a forma de abrir cada Form.

    FrmCliente            := TFrmCliente.Create(Self);
    Botao                 := TToolButton.Create(ToolBar1);
    Botao.Parent          := ToolBar1;
    Botao.Caption         := FrmCliente.Caption;
    Botao.Tag             := Integer(FrmCliente);
    FrmCliente.Tag        := Integer(Botao);
    Botao.Style           := tbsCheck;
    Botao.Grouped         := True;
    Botao.OnClick         := DoClick;
    FrmCliente.Show;
    ToolBar1.ShowCaptions := True;

   Conseguimos resolver o problema, desta forma?

Att,

Wesley Y
GOSTEI 0
Rogério Nascimento

Rogério Nascimento

30/05/2009

Caro Wesley, perfeito, é isto mesmo.

Chamado resolvido. Valeu pela atenção e grande ajuda !!!


Até a proxima,

 Abraços,

Rogério Nascimento.



GOSTEI 0
Wesley Yamazack

Wesley Yamazack

30/05/2009

Olá Rogério,
  Estamos aqui sempre que precisar, pode contar com agente.

Abraços,

Wesley Y
GOSTEI 0
Rogério Nascimento

Rogério Nascimento

30/05/2009

Olá Wesley, tdo bem?!!!

Primeiramente peço desculpas, somente agora que eu consegui finalizar o formChild e apresentou problemas sobre ao apagar o button. Preciso de sua ajuda.

Esta é a linha com o problema:

TToolButton(tag).Destroy;


esta desta forma:


procedure TFrmAlunos.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  TToolButton(tag).Destroy;
  OnClose := FrmAlunos.FormClose;
  Action := caFree;
end;


Vale lembrar que a toolbar esta no frmPrincipal, o frm MDI, não sei se isto influencia, mas qdo vou compilar, da este erro:

[DCC Warning] uFrmAlunos.pas(8): W1005 Unit 'FileCtrl' is specific to a platform
[DCC Error] uFrmAlunos.pas(130): E2004 Identifier redeclared: 'ComCtrls'
[DCC Fatal Error] RPSIG.dpr(8): F2063 Could not compile used unit 'D:\Exemplos\Curso CDS\uFrmAlunos.pas'

em uses esta desta forma:

uses uDmAlunos, uFrmPrncipal, ComCtrls;

o que devo fazer?


Abraços,


Rogério Nascimento.

GOSTEI 0
Rogério Nascimento

Rogério Nascimento

30/05/2009

Ah mais um detalhe,

Se eu tiro da uses o ComCtrls, o projeto compila, porem qdo vou fechar o Frm Child, da Acess Violation.
GOSTEI 0
Wesley Yamazack

Wesley Yamazack

30/05/2009

Olá Rogério,
  Primeiramente peço enormes desculpas pela demora ao responder o chamado, tive problemas pessoais.
  Vamos ao que interessa seguem as alterações.
 


procedure TFrmPrincipal.Cliente1Click(Sender: TObject);
begin
  Botao := TToolButton.Create(ToolBar1);
  FrmCliente := TFrmCliente.Create(Self);
  Botao.Caption := FrmCliente.Caption;
  Botao.tag := Integer(FrmCliente);
  Botao.Parent  := ToolBar1;
  Botao.OnClick := DoClick;
  ToolBar1.ShowCaptions := True;
  FrmCliente.Show;
  FrmCliente.btnBotao := Botao;
end;




unit uFrmCliente;

interface

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

type
  TFrmCliente = class(TForm)
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
  private
    { Private declarations }
  public
    { Public declarations }
    btnBotao : TToolButton;
  end;

var
  FrmCliente: TFrmCliente;

implementation

{$R *.dfm}

procedure TFrmCliente.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  Action := caFree;
  btnBotao.Destroy;
end;

end.


    Espero que isso possa te ajudar meu caro.

Att,

Wesley Y
GOSTEI 0
Rogério Nascimento

Rogério Nascimento

30/05/2009

Que isto Wesley, eu que peço desculpas por não ter feito todos os testes.

Acabei de testar, ficou show de bola, muito obrigado !!!!

Abraços,

Rogério Nascimento
GOSTEI 0
Wesley Yamazack

Wesley Yamazack

30/05/2009

Blz então meu amigo, estamos a disposição.

Att,

Wesley Y
GOSTEI 0
POSTAR