Pracuji na svém IM klientovi a serveru a dostal jsem se k poněkud zvláštnímu problému. Pokud klient číslo 1 poklepe na položku svého kontakt listu, spustí se metoda ContactListItemClick (kód níže), která otevře formulář MessageForm. Klient 1 napíše zprávu, která se přes server pošle a dorazí ke klientu číslo 2. Eventem je zpráva odchycena a je zavolána metoda MessageNotify, která provede prakticky to samé, jako metoda ContactListItemClick. Vytvoří instanci formuláře MessageForm a zobrazí ho, nicméně. Po kompilaci klient 1 otevře přes kontakt list formulář MessageForm, bez problémů, napíše zprávu a pošle, klient na druhé straně zprávu odchytí a zobrazí formulář MessageForm ale ten neodpovídá, jeho prvky nejsou vykreslené, pouze je nastaveno pozadí. Má někdo nějaký návrh, protože už opravdu netuším co s tím. Děkuji.
/// <summary>
/// Dvojklik na položku Contact Listu vyvolá otevření okna pro
/// psaní zpráv. Jemu se vyplní titulek podle jména kontaktu.
/// </summary>
/// <param name="sender"></param>
/// <param name="args"></param>
public void ContactListItemClick(Object sender, EventArgs args)
{
ContactListItem Client = sender as ContactListItem;
/**
* Okno je již otevřené, předáme mu focus
*/
if (Messages.ContainsKey(Client.Client))
{
MessageForm Window = Messages[Client.Client] as MessageForm;
Window.Focus();
}
else
{
/**
* Předáme ref., třídu pro komunikaci, jméno klienta a status a okno uložíme do Hashtable
*/
MessageForm Window = new MessageForm(this, Server, Client.Client, Client.Status);
Messages.Add(Client.Client, Window);
Window.Show();
}
}
/// <summary>
/// EventHandler pro přijetí zprávy
/// </summary>
/// <param name="sender"></param>
/// <param name="args"></param>
public void MessageNotify(Object sender, MessageEventArgs args)
{
if (Messages.ContainsKey(args.Client))
{
MessageForm Window = Messages[args.Client] as MessageForm;
Window.MessageReceive(args.Time, args.Message);
}
else
{
if (ContactList.Clients.ContainsKey(args.Client))
{
SimpleClient Client = ContactList.Clients[args.Client] as SimpleClient;
MessageForm Window = new MessageForm(this, Server, args.Client, Client.Status);
Messages.Add(Client.Name, Window);
Window.MessageReceive(args.Time, args.Message); // Předáme čas přijetí serverem a text zprávy
Window.Show(); // Po zobrazení formuláře jeho okno zamrzá a neodpovídá
}
}
}