Anonymní profil RiZe – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Anonymní profil RiZe – Programujte.comAnonymní profil RiZe – Programujte.com

 

Příspěvky odeslané z IP adresy 85.207.186.–

.NET › [C#] Form po otevření zamrzne
18. 11. 2008   #90076

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á
}
}
}

.NET › [C#] Problém s eventy
13. 11. 2008   #89684

Zabrousil jsem ještě po internetu a našel jsem citát: "Invoking an event can only be done from within the class that declared the event", takže to vypadá, že máš pravdu. Trošku divné omezení ale budiž, trošku to překopu.

.NET › [C#] Problém s eventy
13. 11. 2008   #89661

Programuji si knihovnu pro aplikaci. Mám v ní uložené interface tříd, které aplikace obsahuje, tj. hlavně interface pro Controller. Ve třídě Controller jsou tři eventy (jejichž delegáti jsou deklarováni v knihovně) a metody, kterým předávám argumenty eventů. Bez problému eventy přiřadím, ale při jejich použití už nastává chyba. Více snad poví kód. Předem děkuji za každou radu.

Soubor s interface Controlleru v knihovně



/// <summary>
/// Argumenty eventu
/// </summary>
public class MessageEventArgs : EventArgs
{
...
}

/// <summary>
/// Argumenty eventu
/// </summary>
public class SystemMessageEventArgs : EventArgs
{
...
}

/// <summary>
/// Argumenty eventu
/// </summary>
public class ContactListEventArgs : EventArgs
{
...
}

/// <summary>
/// Delegát pro zpracování klientských zpráv
/// </summary>
/// <param name="sender"></param>
/// <param name="args"></param>
public delegate void MessageTo(Object sender, MessageEventArgs args);

/// <summary>
/// Delegát pro event systémové zprávy
/// </summary>
/// <param name="sender"></param>
/// <param name="args"></param>
public delegate void SystemMessageTo(Object sender, SystemMessageEventArgs args);

/// <summary>
/// Delegát event ContactListu
/// </summary>
/// <param name="sender"></param>
/// <param name="args"></param>
public delegate void ContactListTo(Object sender, ContactListEventArgs args);

/// <summary>
/// Controller pro klientskou aplikaci
/// </summary>
public interface IClientController
{
/// <summary>
/// Eventhandler na okno zpráv
/// </summary>
event MessageTo MessageRedirect;

/// <summary>
/// Eventhandler pro systémové zprávy
/// </summary>
event SystemMessageTo SystemMessageRedirect;

/// <summary>
/// Eventhandler pro kontakt list
/// </summary>
event ContactListTo ContactListRedirect;

/// <summary>
/// Metoda vrací instanci třídy Server pro komunikaci se serverem
/// </summary>
IServer Server { get; }

/// <summary>
/// Metoda pro handlování příchozí systémové zprávy, kterou zaslal
/// server.
/// </summary>
/// <param name="sender"></param>
/// <param name="args"></param>
void SystemMessageHandler(Object sender, SystemMessageEventArgs args);

/// <summary>
/// Metoda pro handlování příchozích zpráv od serveru, které zaslal
/// nějaký klient.
/// </summary>
/// <param name="sender"></param>
/// <param name="args"></param>
void MessageHandler(Object sender, MessageEventArgs args);

/// <summary>
/// Metoda pro handlování contact listu
/// </summary>
/// <param name="sender"></param>
/// <param name="args"></param>
void ContactListHandler(Object sender, ContactListEventArgs args);
}


Další soubor knihovny



public class ClientLoginStatus : IPacketReadable
{
private IClientController Controller;

public ClientLoginStatus(..., IClientController controller)
{
...
this.Controller = controller;
}

public void Run()
{
...
Controller.ContactListRedirect += new ContactListTo(Controller.ContactListHandler);
Controller.MessageRedirect += new MessageTo(Controller.MessageHandler);
Controller.SystemMessageRedirect += new SystemMessageTo(Controller.SystemMessageHandler);
}
}
}


A nyní chybka v nemožnosti použít event v třídě podobné výše zmiňované, která je taktéž v knihovně. Chyba je: The event '...IClientController.SystemMessageRedirect' can only appear on the left hand side of += or -=



public class ClientSystemMessage : IPacketReadable
{
private String Data;
private IClientController Controller;

public ClientSystemMessage(..., IClientController controller)
{
...
this.Controller = controller;
}

public void Run()
{
...
SystemMessageEventArgs Arguments = new SystemMessageEventArgs(Data);
Controller.SystemMessageRedirect(this, Arguments); // Zde chyba
}
}

.NET › Design formuláře dle OS
24. 1. 2008   #63904

Napsal jsem si první program v C# (mockrát díky Nargonovi zato že vydržel všechny mé dotazy ;-)) ale všiml jsem si, že formuláře víceméně nepřebírají design některých prvků podle OS. Programuji pod Vista ve Visual C# 2008 a vzhled některých prvků, konkrétně menu baru, nebo kontextové nabídky vypadají ve stylu Office XP. Jak mám nastavit úplnou závislost vzhledu na OS?

.NET › [C#] Přístup k ovládacím prv…
20. 1. 2008   #63237

Alespoň to budu vědět dopředu, díky :smile1:

.NET › [C#] Přístup k ovládacím prv…
20. 1. 2008   #63234

I toto jsem zkoušel, ale nakonec mi bylo řečeno, ať využiji následující metodu, která dovolí text u tláčítka změnit. U ostatních prvků, zrovna v mém případě text ve stavovém řádku, skutečně stačilo this.TStatus.Text = Args, u tlačítka jsem musel použít ChangeText(this.Tlacitko, "Text"); a teď ten kód.



public void ChangeText(Control ctrl, String value)
{
if (ctrl.InvokeRequired)
ctrl.Invoke((MethodInvoker)delegate() { ctrl.Text = value; });
else
ctrl.Text = value;
}

.NET › [C#] Přístup k ovládacím prv…
20. 1. 2008   #63232

Tak já radši dám kousky zdrojáků. Tlačítka kterých se to týká mají Modifiers nastavený na Public a stejně když je zkouším upravit tak to padá. Jinak, BConnect je tlačítko, TAdress je textové pole pro IP adresu, TStatus je popisek ve stavové liště, program padne na řádku (zde) 15



private void ChangeState(uint Type, String Args)
{
// Status čekání na akci
//
if (Type == S_READY)
{
this.BConnect.Text = "Připojit";
this.BConnect.Enabled = true;
}
// Status přpojování
//
else if (Type == S_CONNECTING)
{
this.BConnect.Text = "Připojuji";
this.BConnect.Enabled = false;
this.TStatus.Text = Args;
}
// Status připojen
//
else if (Type == S_CONNECTED)
{
this.BConnect.Text = "Obnovit";
this.BConnect.Enabled = true;
this.TStatus.Text = "Odezva: " + Args;
}
// Status chyba
//
else
{
this.BConnect.Text = "Připojit";
this.BConnect.Enabled = true;
this.TStatus.Text = Args;
}
}

private void BConnect_Click(object sender, EventArgs e)
{
Thread tPing = new Thread(Ping);

tPing.IsBackground = true;
tPing.Start(TAdress.Text);

// TODO: Ukončení a opětovný start vlákna
//
}

private void Ping(object IAdress)
{
// Převod objektu na string
String Adress = (string)IAdress;


// Pokračování za předpokladu vyplněné adresy
//
if (Adress != "")
{
while (true)
{
this.ChangeState(S_CONNECTING, "Připojuji se k serveru");

String[] CIpHost = Adress.Split(':');
String CIp = CIpHost[0];
Int16 CPort = Convert.ToInt16(CIpHost[1]);

Ping pingSender = new Ping();
PingOptions options = new PingOptions();

// Use the default Ttl value which is 128,
// but change the fragmentation behavior.
options.DontFragment = true;

// Create a buffer of 32 bytes of data to be transmitted.
string data = "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa";
byte[] buffer = Encoding.ASCII.GetBytes(data);
int timeout = 500;
PingReply reply = pingSender.Send(CIp, timeout, buffer, options);

if (reply.Status == IPStatus.Success)
{
//MessageBox.Show(Convert.ToString(reply.RoundtripTime));
this.ChangeState(S_CONNECTED, Convert.ToString(reply.RoundtripTime) + "ms");
}
else
{
this.ChangeState(S_CONNECTED, "Timeout");
}

Thread.Sleep(500);
}
}
// Není vyplněna IP adresa
//
else
{
this.ChangeState(S_ERROR, "Vyplňte prosím IP adresu");
}
}

.NET › [C#] Přístup k ovládacím prv…
20. 1. 2008   #63230

Modifiers jsem našel, ale teď jsem si všiml že mám všechna nastavení pro ovládací prvky zašedlá, je tam nějaký zámek nebo co? :smile19:

IDE: Visual C# 2008

EDIT: hmm, asi jsem si otevřel nějaký špatný soubor nebo co :-)

.NET › [C#] Přístup k ovládacím prv…
20. 1. 2008   #63216

Mám metodu ve třídě Form1 která na základě stisknutí tlačítka vytvoří vlákno druhé metody ve stejné třídě, která vykonává nějaký činný kód a podle výsledků zpracování zavolá další metodu která nastaví třeba popisky tlačítek atp. Problém je v tom, že program zkompiluji, ale spadne právě při pokusu upravit ty ovládací prvky. Zkoušel jsem k prvkům přistupovat přes Form1.JmenoPrvku.Text, nebo this.JmenoPrvku.Text, jenže přes Form1 to ani nezkompiluji (An object reference is required for the non-static field, method, or property 'CSSCon.Form1.BConnect') a přes this to spadne za běhu. Jak mám tedy přistupovat k ovládacím prvkům?

.NET › C# - Jaký event na textové p…
18. 1. 2008   #63052

Tak jsem to zatím začal tvořit přes tlačítko, ovšem začíná mě docela štvát to formátování kódu které používá VS. Když například přepisuji deklarace proměnných, tak mi neustále maže tabulátory mezi jménem proměnné a rovnítkem, narušuje mi tak pracně dělanou strukturu kódu. Jde tahle pitomina někde vypnout? Už jsem hledal v nastavení ale nějak jsem se nedohledal.

RiZe
.NET › C# - Jaký event na textové p…
18. 1. 2008   #63036

Zkouším si naprogramovat utilitku které do textového pole zadám IP adresu i s portem ve tvaru 0.0.0.0:00000 a program se po jejím zadání pokusí připojit "na druhou stranu" a vrátit výsledek akce. Jaký mám ale použít event na textové pole abych nemusel používat potvrzovací tlačítko ve stylu "Připojit" a přitom mohl po zadání celé adresy rovnou vyzkoušet připojení?

 

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032024 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý