Forms - manter uma lista na form principal das janelas abertas que nao sao modal e atualizar quando as filhas fecham

Top  Previous  Next

// este programa exemplo é o seguinte. existem forms do tipo SHOW (nao modal)

// mas nao é MDI, como notificar a form principal que uma delas fechou?

// tipo: manter uma lista atualizada na principal das forms que estao 

// abertas e tirar desta lista sempre que uma for fechada.

 

 

// form principal

// 1 listbox e 3 buttons

 

unit MultFormsExemploUnit;

 

interface

 

uses Forms, Windows, Messages, StdCtrls, Classes, Controls;

 

type

  TForm1 = class(TForm)

    ListBox1: TListBox;

    Button1: TButton;

    Button2: TButton;

    Button3: TButton;

    procedure Button1Click(Sender: TObject);

    procedure Button2Click(Sender: TObject);

    procedure Button3Click(Sender: TObject);

    procedure ListBox1DblClick(Sender: TObject);

  private

    procedure AtualizaLista(Indice: Integer = -1);

    procedure Atua(var Msg: TMessage); message WM_USER + 1;

  end;

 

var

  Form1: TForm1;

 

implementation

 

uses MultForms2, MultForms3, MultForms4;

 

{$R *.dfm}

 

procedure TForm1.Button1Click(Sender: TObject);

begin

  form2.show;

  AtualizaLista;

end;

 

procedure TForm1.Button2Click(Sender: TObject);

begin

  form3.show;

  AtualizaLista;

end;

 

procedure TForm1.Button3Click(Sender: TObject);

begin

  form4.show;

  AtualizaLista;

end;

 

procedure Tform1.AtualizaLista(Indice: Integer = -1);

var

  I: Integer;

begin

  // o índice é a janela a ser ignorada.

  ListBox1.Items.Clear;

  for I := 0 to Screen.FormCount - 1 do

    if (Screen.Forms[I] <> Self) and (Screen.Forms[I].Showing) and (I <> Indice) then

     ListBox1.Items.add(Screen.Forms[I].Caption);

end;

 

procedure TForm1.Atua(var Msg: TMessage);

begin

  AtualizaLista(Msg.WParam);

end;

 

procedure TForm1.ListBox1DblClick(Sender: TObject);

var

  I: Integer;

begin

  // percorre todas as janelas

  for I := 0 to Screen.FormCount - 1 do

    // se nao for a principal, estiver ativa e o titulo for igual ao do list box...

    if (Screen.Forms[I] <> Self) and (Screen.Forms[I].Showing) and

       (Screen.Forms[I].Caption = ListBox1.Items[ListBox1.ItemIndex]) then

    begin

      // trás pra frente

      Screen.Forms[I].BringToFront;

      Break;

    end;

end;

 

end.

 

// =========== coloque este código para todas as outras janelas do projeto:

 

procedure TForm2.FormClose(Sender: TObject; var Action: TCloseAction);

var

  I : Integer;

begin

  // este "for" descobre o indice desta form e manda como parametro da msg

  // para a tela principal saber que esta form foi fechada

  for I := 0 to Screen.FormCount - 1 do

    if Screen.Forms[I] = Self then Break;

  SendMessage(Application.MainForm.Handle, WM_USER + 1, I, 0);

end;