COMUNICAO ENTRE FORMS

CAIO.FR.SP 31/01/2014 01:57:21
#434000
Galera procura bastante na net mais não encontrei nada que me ajuda-se muito. tenho dois forms, o primeiro onde tenho todos os controles e um segundo onde fica um player (axwmp), preciso controlar esse player pelo primeiro, como play, stop, pause...

alguém pode me ajudar?
PEDROALSOI 31/01/2014 08:12:17
#434003
Form2.player.start()
Form2.player.pause()
Form2.player.stop()
GUIMORAES 31/01/2014 09:05:19
#434005
Resposta escolhida
Primeiro você tem que instanciar o seu formulário, para depois executar seus métodos.
Exemplo.

form2 f = new form2();
f.player.start();
LUIS.HERRERA 31/01/2014 15:20:44
#434031
Bem vou dizer como fiz. Meu caso é um MID (Ambiente) com os botões padrões para todos os outros forms, Incluir, Alterar, etc...

Dentro do Program.cs, inclui o seguinte código
/// <summary>
/// Classe criada para gerenciar abertura de formulários em toda a aplicação
/// </summary>
public static class Formularios
{
public static System.Collections.Generic.List<System.Windows.Forms.Form> forms = new List<System.Windows.Forms.Form>();

/// <summary>
/// Abre um formulário.
/// </summary>
/// <param name=[Ô]frm[Ô]>Nova instancia do formulario que deseja abrir, caso ja exista uma ele desconsidera e elimina da memoria. ex: new Form1()</param>
/// <param name=[Ô]mdi_frm[Ô]>Formulário MDI. Recipiente. Caso não haja nenhum insira null. ex: frmPrincipal ou null</param>
/// <param name=[Ô]dialog[Ô]>Se o formulário é Dialog ou não! Formulário que sobrepoem a aplicação.</param>
public static void abrir(Form frm, System.Windows.Forms.Form mdi_frm, bool dialog) //abre um formulário chamado
{
bool aberto = false;
for (int i = 0; i < forms.Count; i++)
{
if (frm.Name == forms[i].Name)
{
aberto = true;
MessageBox.Show(Idioma.RetornaMensagem([Ô]ModuloJaAberto[Ô]), Idioma.RetornaMensagem([Ô]TituloAvisoMSG[Ô]), MessageBoxButtons.OK, MessageBoxIcon.Information);
forms[i].Show();
break;
}
}

if (!aberto)
{
if (mdi_frm != null)
{
frm.MdiParent = mdi_frm;
}

forms.Add(frm);
frm = forms[forms.Count - 1];

if (dialog)
{
//forms[forms.Count - 1].ShowDialog();
frm.StartPosition = FormStartPosition.CenterScreen;
frm.ShowDialog();
}
else
{
//forms[forms.Count - 1].Show();
frm.StartPosition = FormStartPosition.CenterScreen;
frm.Show();
}
//forms[forms.Count - 1].Focus();
frm.Focus(); ;
}
}

/// <summary>
/// Fecha um formulario. Elimina da memória.
/// </summary>
/// <param name=[Ô]frm[Ô]>Adicionar o metodo Formularios.fechar(this); no evento FormClosed do formulario em questao.</param>
public static void fechar(System.Windows.Forms.Form frm)
{
for (int i = 0; i < forms.Count; i++)
{
if (frm.Name == forms[i].Name)
{
//frm.Close();
forms[i].Dispose();
forms.RemoveAt(i);
frm = null;
}
}
}

// Isso irá controlar a abertura e fechamento dos formulários em seu sistema.

//Agora cria um arquivo chamado InterfacesBotoesPadrao.cs e inclui esse código.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace NamespaceSeuApp
{
interface InterfaceBotoesPadrao
{
}

public interface IIncluir
{
void BtIncluirClicado();
}

public interface ICancelarInclusao
{
void BtCancelarInclusao();
}

public interface ISalvar
{
void BtSalvarRegistro();
}

// uma para cada botão que interagir com o filho
}


No MID (você faz assim:

No cliquei do menu que irá abrir seu form filho inclui:

this.SeuMenuForm_ToolStripMenuItem.Checked = true;

// cria um delegate para cada botões que irá acionar métodos no filho
EventHandler di = delegate // método do botão Incluir
{
IIncluir frm = NamespaceSeuApp.Ambiente.ActiveForm.ActiveMdiChild as IIncluir;
if (frm != null)
{ frm.BtIncluirClicado(); }
};

EventHandler dci = delegate // método cancela inclusão do filho
{
ICancelarInclusao frm = NamespaceSeuApp.Ambiente.ActiveForm.ActiveMdiChild as ICancelarInclusao;
if (frm != null)
{ frm.BtCancelarInclusao(); }
};
// etc....

for (int i = 0; i < Program.Formularios.forms.Count; i++)
{
if (Program.Formularios.forms[i].Name == [Ô]NomeDoSeuFormQueIraControlar[Ô])
{
Program.Formularios.forms[i].Closed += delegate
{
this.SeuMenuForm_ToolStripMenuItem.Checked = false;
this.btIncluir.Enabled = false;
this.btIncluir.Click -= di;
this.btCancelaIncluir.Click -= dci;
this.btIncluir.Visible = true;
this.btCancelaIncluir.Visible = false;
this.btFechar.Enabled = true;
};
break;
}
}
this.btIncluir.Click += di;
this.btCancelaIncluir.Click += dci;
this.btIncluir.Enabled = true;
}

// clique dos botões que controlam o filho

private void btFechar_Click(object sender, EventArgs e)
{
for (int i = 0; i < Program.Formularios.forms.Count; i++) //Procura form aberto no momento para fechar
{
if (Program.Formularios.forms[i].Name == formAberto) //encontrou formulário. formAberto é variável com nome do form que foi aberto e se irá acionar (filho).
{
sAcaoDoFormulario = String.Empty;
Program.Formularios.forms[i].Close(); //fecha o form
}
}
}

private void btIncluir_Click(object sender, EventArgs e)
{
//estado dos botões de atalho genéricos
sAcaoDoFormulario = [Ô]Incluir[Ô];
btIncluir.Visible = false;
btCancelaIncluir.Visible = true;
btFechar.Enabled = false;
btSalvar.Enabled = true;
}

// esta rotina pode ser disparada pelo form filho também, com uso de interface.
private void btCancelaIncluir_Click(object sender, EventArgs e)
{
//é usado quando bt Cancelar Incluir for acionado. estado dos botões de atalho genéricos
btIncluir.Visible = true;
btCancelaIncluir.Visible = false;
btFechar.Enabled = true;
btSalvar.Enabled = false;
}

//Se você tiver alguma método no filho, que precisa acionar pelo form pai, usaremos interface para isso. Aqui um método que será acionado no filho pelo botão cancelar, fazendo com que um botão do pai seja clicado para executar a tarefa de cancelar inclusão.
public void AcionaCancelarInclusaoPeloFormFilho()
{
btCancelaIncluir.PerformClick();
}


// Cada delegate tem de ter um nome diferente.

No form filho faz assim:


[c]
public partial class frmSeuFormFilho : Form, IIncluir, ICancelarInclusao, ISalvar
{
public void BtIncluirClicado() //Implementado método da interface padrão que aciona métodos deste form
{
//rotina a executar na inclusão do registro no form.
}

public void BtCancelarInclusao() //Implementa método da interface padrão que aciona métodos deste form
{
NamespaceSeuApp.Ambiente.sAcaoDoFormulario = string.Empty; //variável que identifica se é inclusão, edição, consulta, etc...
LimparCampos();
HabilitarCampos(false);
}

// onde você quiser chamar a rotina do form pai, de dentro do form filho, faz assim:

((NamespaceSeuApp.Ambiente)MdiParent).AcionaCancelarInclusaoPeloFormFilho(); // rotina no MDI pai
}

espero ter ajudado.
CAIO.FR.SP 01/02/2014 20:39:28
#434059
Obrigado galera.
Os três me ajudaram bastante, mas como o nosso amigo GUIMORAES123, foi o que deu a resposta que me ajudou primeiro foi dar esses pontos a ele.
Tópico encerrado , respostas não são mais permitidas