HDSoftware Skrevet 8. mai 2009 Skrevet 8. mai 2009 Heisan Jeg har et program som kan starte opp en masse forskjellige FORM's. I en av disse formene, la oss kalle den Kontrolpanel, så skal jeg, når bruker trykker på en knapp, starte et eksternt program. Oppstarten av dette eksterne programmet er allerede definert i den globale delen av programmet. Jeg trenger å gi beskjed oppover i programmet om hva som skal skje. Derfor tenkte jeg at jeg kunne sende en event. Jeg vet bare ikke hvordan jeg skal gjøre dette. I tillegg så er "kontrolpanelet" definert i en egen CLASS DLL og det er den globale EXE fila som bruker denne dLL'en. Derfor kan jeg ikke kalle direkte. Sett at det er slik: EXE FILE (Refererer til Kontrolpanel) class main { public Kontrolpanel ThisKontrolPanel = new Kontrolpanel(); public void StartEtProgram(string ProgName) { // Kode som starter programmet } } DLL FILE public class Kontrolpanel { public void OnKnappSomStarterProgram() { // Hva skal jeg ha her for å starte main.StartEtProgram() } }
HDSoftware Skrevet 8. mai 2009 Forfatter Skrevet 8. mai 2009 Det der skjønnte jeg faktisk ikke noe av. Er det ikek en enkel måte å gjøre dette på da? Skal jo bare fra en Form fortelle en annen form at noe skal skje. Windows er jo basert på eventer. Må da være en grei skuring å sende en event
dabear Skrevet 8. mai 2009 Skrevet 8. mai 2009 Prøv å ta en titt på BubbleEvent. Det der er vel kun for ASP.NET (dvs WEB)? Trådstarter; du kan bruke remoting: http://generally.wordpress.com/2007/05/31/...g-example-in-c/ Alternativt kan du også se på COM+. Remoting er nok enklere da.
GeirGrusom Skrevet 9. mai 2009 Skrevet 9. mai 2009 Flere løsninger: 1. Legg til .exe fila som en referanse i .dll fila (så får du tilgang til Main klassen) 2. Named pipes 3. Windows Message Queue 4. Registrer en delegate som skal kjøres i .dll klassen public static class Program { public static void Main() { var ctrl_panel = new Kontrollpanel(); ctrl_panel.StartEtProgram = new StartProgramProc(StartEtProgram); } public static void StartEtProgram(string prog) { // blablabla } } //Dll public delegate StartProgramProc(string prog); public class Kontrollpanel { public StartProgramProc StartEtProgram; public void OnKnappSomStarterEtProgram() { StartEtProgram("notepad.exe"); } }
HDSoftware Skrevet 11. mai 2009 Forfatter Skrevet 11. mai 2009 Flere løsninger:1. Legg til .exe fila som en referanse i .dll fila (så får du tilgang til Main klassen) Gåd det da? EXE fila henter jo inn denne DLL'en. Blir ikek det komplisert for kompilatoren? Høna og egget du vet... 2. Named pipes Dette trodde jeg var nettverksgreier ;-) Blei litt nysgjerrig.... 3. Windows Message Queue Krever ikke dette en Server2003+ da? 4. Registrer en delegate som skal kjøres i .dll klassen public static class Program { public static void Main() { var ctrl_panel = new Kontrollpanel(); ctrl_panel.StartEtProgram = new StartProgramProc(StartEtProgram); } public static void StartEtProgram(string prog) { // blablabla } } //Dll public delegate StartProgramProc(string prog); public class Kontrollpanel { public StartProgramProc StartEtProgram; public void OnKnappSomStarterEtProgram() { StartEtProgram("notepad.exe"); } } HVA!!!! Dette er jo DRITKULT!! Går virkelig dette??? Steike knuse! Dette skal jeg sjekke ut.......
GeirGrusom Skrevet 11. mai 2009 Skrevet 11. mai 2009 (endret) 1. Ja, funker det. Har gjort det selv. 2. Er for interprocess kommunikasjon. Virker som nettverk, men er ikke det. 3. Ja, stemmer det. Windows 2003 eller Vista+ 4. ^^ edit: ser jeg manglet en void i delegate definisjonen min public delegate void StartProgramProc(string prog); Endret 11. mai 2009 av GeirGrusom
BennyXNO Skrevet 11. mai 2009 Skrevet 11. mai 2009 Her ville jeg heller lært meg og brukt "Command Pattern"
GeirGrusom Skrevet 11. mai 2009 Skrevet 11. mai 2009 Hvordan er command pattern relevant til problemet? Problemet ligger jo i at funksjonen ikke er tilgjengelig fra dll-fila, og det løses ikke ved journaling alene.
BennyXNO Skrevet 12. mai 2009 Skrevet 12. mai 2009 Kontrolpanel kan kjenne til interface ICommand/IExecuter. Programmet setter det ved oppstart slik at Kontrolpanel kan kalle Execute på interfacet ved behov. Dette virker nok likt tidligere anbefalt metode, men gir bedre testbarhet samt endringsdyktighet og separerer funksjon og kode på en bedre måte.
HDSoftware Skrevet 12. mai 2009 Forfatter Skrevet 12. mai 2009 Kontrolpanel kan kjenne til interface ICommand/IExecuter. Programmet setter det ved oppstart slik at Kontrolpanel kan kalle Execute på interfacet ved behov. Dette virker nok likt tidligere anbefalt metode, men gir bedre testbarhet samt endringsdyktighet og separerer funksjon og kode på en bedre måte. Ja så klart. Interfaces tenkte jeg ikek på i farta. Skal vurdere begge variantene.
GeirGrusom Skrevet 12. mai 2009 Skrevet 12. mai 2009 Bruker interface metoden til undo/redo i databasedesignprogrammet mitt.
Anbefalte innlegg
Opprett en konto eller logg inn for å kommentere
Du må være et medlem for å kunne skrive en kommentar
Opprett konto
Det er enkelt å melde seg inn for å starte en ny konto!
Start en kontoLogg inn
Har du allerede en konto? Logg inn her.
Logg inn nå