2013-06-10 4 views
1

Так я этот класс называется Common.cs в этом классе у меня есть функция, которая создает экземпляр формы, frmMainGame.cs, который затем вызывает метод, должен ссылаться на этот новый экземпляр формы, но по какой-то причине он этого не делает. Поэтому, когда форма отображается с использованием mainGame.Show(); форма просто висит там, и я ничего не могу с этим поделать.Form.Show() вешает новую форму экземпляра

Вот код:

frmMainGame.cs

using System; 
using System.Collections.Generic; 
using System.ComponentModel; 
using System.Data; 
using System.Drawing; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 
using System.Windows.Forms; 
using System.Net.Sockets; 
using System.Threading; 

namespace Ghoul_Engine 
{ 

public partial class frmMainGame : Form 
{ 

public delegate void openGame(); 
public delegate void refreshGame(); 
public delegate void updateScreen(Bitmap image); 

drawing draw; 


public bool isTyping = false; 


    public Graphics g; 

    public List<String> Chat = new List<String>(); 

    public List<String> chat 
    { 
     get { return Chat; } 
    } 

    public frmMainGame() 
    { 

     draw = new drawing(this); 

     InitializeComponent(); 

    } 

    public Size size{ 
     get { return this.Size; } 
    } 

    public void showGame() 
    { 
     if (InvokeRequired) 
     { 
      MessageBox.Show("Invoke"); 
      BeginInvoke(new openGame(showGame), null); 
     } 
     else 
     { 
      this.Show(); 
      this.Focus(); 
     } 
    } 


    public void refresh() 
    { 
     if (this.InvokeRequired) 
     { 
      this.Invoke(new refreshGame(refresh), null); 
     } 
     else 
     { 
      this.Refresh(); 
     } 
    } 
    private void frmMainGame_Load(object sender, EventArgs e) 
    { 
     this.DoubleBuffered = true; 
     draw.drawText(new string[] { "GHOUL Game Engine Alpha V0.0.1" }, 12, 0, 0, Brushes.Yellow); 
     clientNetHandler handlers = new clientNetHandler(); 

    } 

    public void update(Bitmap image) 
    { 
     if (InvokeRequired) 
     { 
      this.Invoke(new updateScreen(update), new object[] { image }); 
     } 
     else 
     { 
      pbScreen.Image = image; 
     } 
    } 


    private void frmMainGame_Close(object sender, FormClosingEventArgs e) 
    { 

     Program.Network.Send("logout", Program.netHandlers.getDataByte(clientNetHandler.cNetType.Logout)); 
     //Program.Network.closeSocket(); 
     Program.mainMenu.showMainMenu(); 
     Program.mainGame = new frmMainGame(); 
    } 

    private void tmrRefreshScreen_Tick(object sender, EventArgs e) 
    { 

    } 

    private void frmMainGame_KeyPress(object sender, KeyPressEventArgs e) 
    { 

    } 

    private void pbScreen_Click(object sender, EventArgs e) 
    { 
     draw.drawText(Chat.ToArray(), 12, 0, 30, Brushes.Green); 
    } 
} 
} 

Common.Cs:

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 
using System.Net.Sockets; 
using System.Net; 
using System.Threading; 
using System.Drawing; 

namespace Ghoul_Engine 
{ 
class Common 
{ 


    public Common() 
    { 
    } 
    public void innnitiateGame(String login) 
    { 

     Program.mainMenu.hideMainMenu(); 
     frmMainGame mainGame = new frmMainGame(); 
     mainGame.showGame(); 
    } 

    public void preExit() 
    { 
      Program.Network.closeSocket(); 
    } 

} 
} 

ответ

2

Вам нужно сообщение накачать, который создается путем пропускания экземпляр формы до Application.Run():

 Application.Run(new frmMainGame()); 
+0

Если я это сделаю, то я не могу получить доступ к классу сети, созданному в программе. Он ждет, пока frmMainGame не закроется, прежде чем запускать что-либо в классе. –

+0

Я согласен с @dotNET, вам нужно реструктурировать то, как у вас есть вещи. Application.Run() не является обязательным, если у вас есть формы. Если ваше сообщение не работает до тех пор, пока основная форма не будет закрыта, вы делаете что-то действительно нетрадиционное, и нам нужно будет больше деталей, чтобы понять это ... –

+0

@ DylanDodds запускает сетевой код в другом потоке перед вызовом 'Application. Run' –

2

Возможно, вам придется немного изменить структуру классов. Вместо того, чтобы создавать экземпляр вашей основной формы в Common.cs, я предлагаю вам перейти к нормальному движению вещей, т. Е. Создать экземпляр вашей основной формы в program.cs с помощью Application.Run(), чтобы он установил для вас насос сообщений, поддерживайте связь сокетов классы в отдельном файле (вероятно, как они есть), а затем создайте их в своей основной форме. Если вы должны иметь эти классы связи в нескольких формах, продолжайте создавать свои экземпляры в program.cs и передавать их в разные формы/другие модули в качестве параметров.

Смежные вопросы