terça-feira, 9 de junho de 2009
Correção de Bug no Microsoft VisualStudio 2008: Mudando entre janelas MDI
Recentemente tive um pequeno problema com o sistema que desenvolvi em C# Windows Forms, Visual Studio 2008.
O aplicativo é padrão Windows com janelas MDI, assim os usuários podem abrir várias janelas de consulta e cadastro ao mesmo tempo, agilizando o serviço deles.
Uma vez, uma das funcionárias me mostrou que não conseguia mudar entre as janelas filhas do sistema, clicando dentro do formulário que ela queria trabalhar. Porém, me mostrou que se clicasse na barra de título dessa janela ela passaria a ter o foco, ficando no topo das outras janelas.
Jamais havia percebido esse problema nas máquinas de desenvolvimento. Fiz o teste aqui novamente e não ocorreu o problema para mim.
Devido às prioridades do sistema, essa solicitação ficou aguardando até esta semana, retornei ao usuários e pedi para me mostrassem novamente o problema. Para minha surpresa, o problema não só persistia, mas também estava generalizado em todas as máquinas de produção.
Teoricamente as máquinas de desenvolvimento e as máquinas dos usuários (produção) são iguais, tirando os softwares de desenvolvimento nas nossas máquinas e as permissões, que são mais restritivas nos computadores de produção.
Depois de uma pesquisa na internet, acabei verificando que era um problema já reportado no Visual Studio 2003.
Então, bastou codificar um método na minha janela ancestral (bendita Orientação à Objetos) para propagar a correção para todos os meus sistemas.
Se você estiver tendo esse mesmo problema, basta codificar o seguinte método nas suas janelas, ou de preferência crie uma janela ancestral para acomodar o procedimento:
/// <summary>
/// Corrige Bug, do VisualStudio, que impede a mudança de foco entre as janelas MDI
/// clicando dentro do formulário.
/// A mudança de foco só ocorre se usuário clicar na barra de título da janela MDI.
/// -------------------------------------------------------------------------------
/// Referência:
/// http://support.microsoft.com/kb/871045/pt-br
/// </summary>
/// <param name="m"></param>
protected override void WndProc(ref Message m)
{
int WM_MOUSEACTIVATE = 0x21;
if (m.Msg == WM_MOUSEACTIVATE)
{
this.Focus();
}
base.WndProc(ref m);
}
Para mais detalhes sobre o problema e outras possíveis soluções (em Visual Basic) veja o seguinte link da Microsoft:
- Erro: um formulário MDI filho não poderá maximizar se o formulário filho contém um controle ActiveX no Visual Studio .NET 2003(http://support.microsoft.com/kb/871045/pt-br)
O aplicativo é padrão Windows com janelas MDI, assim os usuários podem abrir várias janelas de consulta e cadastro ao mesmo tempo, agilizando o serviço deles.
Uma vez, uma das funcionárias me mostrou que não conseguia mudar entre as janelas filhas do sistema, clicando dentro do formulário que ela queria trabalhar. Porém, me mostrou que se clicasse na barra de título dessa janela ela passaria a ter o foco, ficando no topo das outras janelas.
Jamais havia percebido esse problema nas máquinas de desenvolvimento. Fiz o teste aqui novamente e não ocorreu o problema para mim.
Devido às prioridades do sistema, essa solicitação ficou aguardando até esta semana, retornei ao usuários e pedi para me mostrassem novamente o problema. Para minha surpresa, o problema não só persistia, mas também estava generalizado em todas as máquinas de produção.
Teoricamente as máquinas de desenvolvimento e as máquinas dos usuários (produção) são iguais, tirando os softwares de desenvolvimento nas nossas máquinas e as permissões, que são mais restritivas nos computadores de produção.
Depois de uma pesquisa na internet, acabei verificando que era um problema já reportado no Visual Studio 2003.
Então, bastou codificar um método na minha janela ancestral (bendita Orientação à Objetos) para propagar a correção para todos os meus sistemas.
Se você estiver tendo esse mesmo problema, basta codificar o seguinte método nas suas janelas, ou de preferência crie uma janela ancestral para acomodar o procedimento:
/// <summary>
/// Corrige Bug, do VisualStudio, que impede a mudança de foco entre as janelas MDI
/// clicando dentro do formulário.
/// A mudança de foco só ocorre se usuário clicar na barra de título da janela MDI.
/// -------------------------------------------------------------------------------
/// Referência:
/// http://support.microsoft.com/kb/871045/pt-br
/// </summary>
/// <param name="m"></param>
protected override void WndProc(ref Message m)
{
int WM_MOUSEACTIVATE = 0x21;
if (m.Msg == WM_MOUSEACTIVATE)
{
this.Focus();
}
base.WndProc(ref m);
}
Para mais detalhes sobre o problema e outras possíveis soluções (em Visual Basic) veja o seguinte link da Microsoft:
- Erro: um formulário MDI filho não poderá maximizar se o formulário filho contém um controle ActiveX no Visual Studio .NET 2003(http://support.microsoft.com/kb/871045/pt-br)
Marcadores: CSharp, Desenvolvimento, Dicas, Visual Studio, Windows
terça-feira, 24 de junho de 2008
Abrir apenas uma instância de uma janela MDI em WindowsForms - C#
Durante a implantação de um sistema verificamos que algumas pessoas se confundem com a abertura de janelas MDI.
Assim, após abrir uma janela e efetuar o cadastramento de alguma informação, minimizam o formulário e começam a realizar alguma outra tarefa.
Depois de um tempo, ao invés de retornar para a tela minimizada, acessam o item de menu e abrem outra instância da mesma janela. Assim, acabam se confundindo quando restauram a primeira janela minimizada e se deparam com dados desatualizados.
Para evitar esse problema, devemos restaurar a janela minimizada, ao invés de abrir uma nova instância dela.
A codificação consiste em verificar se o formulário já está na lista de janelas MdiChildren da janela principal e reativá-lo caso ele seja encontrado.
Portanto, a codificação do evento Click de um item de menu (da janela principal) ficaria o seguinte:
private void imenuInclusaoTeste_Click(object sender, EventArgs e)
{
try
{
// Localiza o formulario
foreach (Form form in this.MdiChildren)
{
if (form is JanCadastroTeste)
{
// Torna-o ativo
form.WindowState = FormWindowState.Normal;
form.Activate();
return;
}
}
// Senão, abre uma instancia da janela
JanCadastroTeste janCadastro = new JanCadastroTeste();
janCadastro.MdiParent = this;
janCadastro.Show();
}
catch (Exception exception)
{
// Tratamento do Erro ...
}
}
Referências:
Assim, após abrir uma janela e efetuar o cadastramento de alguma informação, minimizam o formulário e começam a realizar alguma outra tarefa.
Depois de um tempo, ao invés de retornar para a tela minimizada, acessam o item de menu e abrem outra instância da mesma janela. Assim, acabam se confundindo quando restauram a primeira janela minimizada e se deparam com dados desatualizados.
Para evitar esse problema, devemos restaurar a janela minimizada, ao invés de abrir uma nova instância dela.
A codificação consiste em verificar se o formulário já está na lista de janelas MdiChildren da janela principal e reativá-lo caso ele seja encontrado.
Portanto, a codificação do evento Click de um item de menu (da janela principal) ficaria o seguinte:
private void imenuInclusaoTeste_Click(object sender, EventArgs e)
{
try
{
// Localiza o formulario
foreach (Form form in this.MdiChildren)
{
if (form is JanCadastroTeste)
{
// Torna-o ativo
form.WindowState = FormWindowState.Normal;
form.Activate();
return;
}
}
// Senão, abre uma instancia da janela
JanCadastroTeste janCadastro = new JanCadastroTeste();
janCadastro.MdiParent = this;
janCadastro.Show();
}
catch (Exception exception)
{
// Tratamento do Erro ...
}
}
Referências:
Single Instance Children Forms in MDI Applications
Introduction to MDI Forms with C#
Marcadores: CSharp, Desenvolvimento, Dicas, Visual Studio
domingo, 27 de abril de 2008
Desenvolvimento .Net no Linux

O Visual Studio é uma grande IDE para o desenvolvimento de aplicações DotNet, porém, por ser uma ferramenta da Microsoft, somente pode ser utilizada em máquinas Windows.
Portanto, para realizar o desenvolvimento em máquinas Linux devemos utilizar o MonoDevelop, que também é uma IDE gratuita para ambientes GNOME Linux criada pela Novell.
O MonoDevelop faz parte do projeto Mono, que torna possível a utilização de aplicativos .Net no Linux.
Download: MonoDevelop
Marcadores: CSharp, Desenvolvimento, DotNet, Linux, Mono, OpenSource, Ubuntu, Visual Studio
Assinar Postagens [Atom]
Coelho na Rede


iPhone Preview






