[VB.NET/2.0] Probleem met variable tussen meerdere forms

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • SiXke
  • Registratie: September 2003
  • Laatst online: 30-11-2024
Hallo

Eerst en vooral wil ik vermelden dat ik programmeer als hobby, niet als job, dus gelieve mij te verontschuldigen voor eventuele domme vragen.

Ik heb 2 programmas, die spreken met tcplistener & sockets.

Programma 1 heeft verschillende panels, waar er altijd maar 1 zichtbaar van is (beetje zoals tabbladen)

Programma 2 heeft een main form, die subforms laad

Ik wil dat programma 1 het panel zichtbaar maakt, waarmee het geassocieerd is aan een form van programma 2

Dus bv, ik open in Programma 2 een subform "Aankopen", dan zou het panel PnlAankopen zichtbaar moeten worden.

Mijn probleem zit hem in het feit, dat wanneer ik een subform laad, mijn tcplistener nog altijd draait op mijn main form, en ik deze dus niet meer kan aanroepen om iets mee te versturen naar programma 1 (bv de string "aankopen")

Ik had gedacht om elke keer ik van form wissel, mijn huidige tcplistener te stoppen, en een nieuwe te starten op het subform, maar ik wil eens eerst jullie mening of jullie een properdere oplossing zien, anders dan ga ik wel heel veel redundant code hebben.

Alvast bedankt voor de hulp, en moest ik mij niet goed hebben uitgedrukt, vraag mij gerust om extra info.

Acties:
  • 0 Henk 'm!

  • pedorus
  • Registratie: Januari 2008
  • Niet online
SiXke schreef op woensdag 03 maart 2010 @ 22:31:
Mijn probleem zit hem in het feit, dat wanneer ik een subform laad, mijn tcplistener nog altijd draait op mijn main form, en ik deze dus niet meer kan aanroepen om iets mee te versturen naar programma 1 (bv de string "aankopen")
:? Ik weet niet precies wat je aan het doen ben, maar waarom kan dit dan niet? Er is zelfs geen aparte synchronisatie nodig als ik het goed zie omdat een subform in dezelfde thread draait.. En waarom gebruik je trouwens .net 2.0 als het voor hobby is en je de laatste express-editie zo kan downloaden?

Vitamine D tekorten in Nederland | Dodelijk coronaforum gesloten


Acties:
  • 0 Henk 'm!

  • SiXke
  • Registratie: September 2003
  • Laatst online: 30-11-2024
Hoe kan ik de listener aanspreken dan? Want de naam kent hij niet?

Ik ben al lang bezig aan dit programma, toen 2.0 het nieuwste was, en ik vrees als ik het ga omzetten naar 3.5 dat het niet meer gaat werken.

Thx

Acties:
  • 0 Henk 'm!

  • urk_forever
  • Registratie: Juni 2001
  • Laatst online: 16:40
Je zou je listener in je main form met een public property bereikbaar kunnen maken, of een publieke method in je main form maken die je aan kan roepen vanuit je sub form om zo een bericht te versturen. Bijvoorbeeld zo (pseudocode):

C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
public class MainForm : Form {
    private TcpListener _listener;
    
    public void SendMessage(string Message)
    {
                // Je moet wel een tcpclient hebben
                TcpClient _tcpClient = c.TcpClient;
                NetworkStream _clientStream = _tcpClient.GetStream();
                Byte[] buf = System.Text.ASCIIEncoding.ASCII.GetBytes(Message);
                _clientStream.Write(buf, 0, buf.Length);
                _clientStream.Flush();
    }
}

Hail to the king baby!


Acties:
  • 0 Henk 'm!

  • SiXke
  • Registratie: September 2003
  • Laatst online: 30-11-2024
Dit had ik al geprobeerd, maar blijkbaar moet je deze aanroepen via frmMain.variable :)

Bedankt!

Acties:
  • 0 Henk 'm!

  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
Het is overigens beter om niet direct op de fields te werken, maar properties te gebruiken. In het geval van je TcpListener kun je waarschijnlijk nog beter gewoon events defineren en die firen op het moment dat er iets gebeurt. Dan kan je in de class die de TcpListener beheert het gebruik beter afschermen, en dan is het bij bugs ook makkelijker om te localiseren waar het mis gaat. Bij het versturen van berichten kan je dus ook beter gebruik maken van een methode, dan hoeft de aanroepende class ook geen rekening te houden met de manier waarop de berichten verstuurd worden.

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


Acties:
  • 0 Henk 'm!

Verwijderd

TS,

Enkele simpele oplossingen:
1. Geef de instantie van het mainform mee in de constructor van het subform, zodat je de public members van het mainform vanuit het subform kunt aanspreken.
(dus: Subform form = new SubForm(this) )
2. Maak een soort van appcontroller klasse en implementeer deze als een singleton. Deze kun je dan overal in je applicatie gebruiken. Hierin maak je een property die de instantie van het MainForm teruggeeft. De waarde zet je eenmalig in de constructor van het MainForm.

Beter zou zijn de communicatie te implementeren in een eigen klasse ipv in de code-behind van het form.
Pagina: 1