HDSoftware Skrevet 8. mai 2009 Del 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() } } Lenke til kommentar
MrEspen Skrevet 8. mai 2009 Del Skrevet 8. mai 2009 Prøv å ta en titt på BubbleEvent. Lenke til kommentar
HDSoftware Skrevet 8. mai 2009 Forfatter Del 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 Lenke til kommentar
dabear Skrevet 8. mai 2009 Del 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. Lenke til kommentar
GeirGrusom Skrevet 9. mai 2009 Del 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"); } } Lenke til kommentar
HDSoftware Skrevet 11. mai 2009 Forfatter Del 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....... Lenke til kommentar
GeirGrusom Skrevet 11. mai 2009 Del 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 Lenke til kommentar
BennyXNO Skrevet 11. mai 2009 Del Skrevet 11. mai 2009 Her ville jeg heller lært meg og brukt "Command Pattern" Lenke til kommentar
GeirGrusom Skrevet 11. mai 2009 Del 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. Lenke til kommentar
BennyXNO Skrevet 12. mai 2009 Del 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. Lenke til kommentar
HDSoftware Skrevet 12. mai 2009 Forfatter Del 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. Lenke til kommentar
GeirGrusom Skrevet 12. mai 2009 Del Skrevet 12. mai 2009 Bruker interface metoden til undo/redo i databasedesignprogrammet mitt. Lenke til kommentar
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å