Tja! Du har helt rätt att det är inte snyggt eller modulärt att dela ut hela form som instance. Standard är ju att ha en metod man anropar för att uppdatera ett objekt. Jo precis, frågan är om det kan orsaka några problem om vi inte kör multithreading?Invoke?
Säg att vi har ett fönster (säg att det heter form1) i detta fönster finns en massa kontroller för att visa information. Vi delar nu ut en instans av form1 till ett annat objekt som är skapat innanför form1.
Detta andra objekt får in viss data från annat håll och vill då notera det o form1, efter som den har en referens till instansen så kan den lätt komma åt de publica funktionerna i form1.
form1 har ett par publika funktioner som tar in data(ex strängar) och publicerar det i formen, ex textbox1.text = indata.
1. Jag har fått för mig att man ska aldrig dela ut en hel instance av en form på detta vis, istället ska man använda delegater? frågan är om det kan uppstå några fel om inte kör med delegaterna?(det handlar om tiden)
2. Jag har även fått för mig att man alltid ska använda invoke på de kontroller som ligger i form1 eller ialla fall använda InvokeRequired för att se om det är huvud tråden som anropar. Om det inte är huvud tråden så ska invoke användas för att väcka huvudtråden(den tråd som skapade kontrollen) och låta den göra jobbet. Värt att veta är också att detta andra objekt kan mycket väl vara en annan form där events kastas då man trycker på olika knappar/kontroller och dessa events kommer att gå vidare och försöka ändra datan i form1.
Värt att nämna är att detta är inget multithreading program, men däremot kommer den att köras i flera instancer och dessa instancer kommer dela en viss hårdvara.
Man kan se mjukvaran som en drivrutin med ett debug fönster.
MVH
JimmySv: Invoke?
Men som du skriver är mjukvaran som en drivruting med flera From's kopplade till och
och det talar ändå mer för att man inte ska "peka in i ett objekt" som äger "drivrutinen"
(Det går att göra i Visual Studio 2005 så maste amn under intällningar inaktivera skyddet för detta. Du får normalt ett felmeddelande om du försöker göra detta)
Två sätt är att använda Invoke och Events (och båda anvädner sig av delegate).
Delegate är en funktionspekare som du du kan koppla till Events eller Invoke.
Vad du väljer är en smaksak, men Invoke lämpar sig bra till om du ska just göra anrop till kontroller i ett formulär. Jag själv är ingen expert på Invoke(), men så vitt jag vet så måste du ha kännedom om objektet som äger kontrollen som ska ha information eftersom du gör invoke på just ett specifikt objekt, men det kanske någon annan kan mera om.
Fördelen med Events (enligt min mening) är du behöver inte veta något om mottagaren och du kan nå flera mottagare samtidigt. Typ som Radio fungerar. Du skickar ett event "här finns data" och sen är det upp till andra om dom vill ha data.
Hoppas att svaret kan vara till någon hjälp.
// PierreSv:Invoke?
Sen säg att en event kastas i det andra formuläret(ex en knapp e tryckt i andra formuläret) denne event går till en funktion i andra formuläret som i sin tur ändrar en inställning i form1 genom instansen som form2 har av form1.
Frågan är nu, är det en ny tråd som skapas eller är det fortfarande huvud tråden som kör all? alltså den tråd som skapade kontrollerna i form1?