Event/Delegate for progress bar issue
-
I'm trying to add an interface, but it's causing havoc with my ProgressBar update events (My progress bar event is null so my progress bar never gets updated). I have the following older link about it: [^] The progress bar works where it doesn't use events in Generic, but it's not working where I'm using the events in CR5_new and CR5_Comm. As you can see below, when I get to RaiseProgressChange in my CR5_new class, the event is null. I can't figure out why it's null. I'm not very good with events, and throwing in the interface (the iCR_Comm interface is new) doesn't help, since I'm not very good at interfaces either. I removed unrelated code, so hopefully this post isn't missing important definitions. I realize that this doesn't look familiar to you and is a lot of info, but any help would be appreciated. If anyone is mean, I'm not going to upvote that comment. There are very specific project related reasons that these are all separate vs projects. (re-use, multiple CRx's, multiple CRx_comm's, and numerous dynamic data classes that give extra control info to the Generic class.) Everything works (programming, write, read, through CR5_Comm class), so don't focus on that. It's just the events that update the progress bar that don't work. Names of classes have been changed enough that they don't give away our information, but still resemble my code. My code looks like this now (all separate vs projects): vs project: crTool frmUserForm.cs:
using USB_Comm;
namespace CRWriter
{
public partial class frmUser:Form
{
public frmUser(string dllSelected, TemplateHandlerApplication.Templates.TEMPL[] template, string dll, Site.Site.SITE cert0)
{
programDll = dllSelected;
templateArr = template;
itsDll = dll;
cert = cert0;
InitializeComponent();
CreateSubForms(); //start here
}
private void CreateSubForms()
{
cb = new CrComm();
int errValue = cb.FindUsbHid(ref HWndBoxID); //see how many boxes there are
for (int i = 0; i < cb.cbInfos.Length; i++)
{
iCRComm cb1 = null;
if (controls[i] == null)
{
CRComm_Factory.CRCommFactory factory = new CRComm_Factory.CRCommFactory();
int type = factory -
I'm trying to add an interface, but it's causing havoc with my ProgressBar update events (My progress bar event is null so my progress bar never gets updated). I have the following older link about it: [^] The progress bar works where it doesn't use events in Generic, but it's not working where I'm using the events in CR5_new and CR5_Comm. As you can see below, when I get to RaiseProgressChange in my CR5_new class, the event is null. I can't figure out why it's null. I'm not very good with events, and throwing in the interface (the iCR_Comm interface is new) doesn't help, since I'm not very good at interfaces either. I removed unrelated code, so hopefully this post isn't missing important definitions. I realize that this doesn't look familiar to you and is a lot of info, but any help would be appreciated. If anyone is mean, I'm not going to upvote that comment. There are very specific project related reasons that these are all separate vs projects. (re-use, multiple CRx's, multiple CRx_comm's, and numerous dynamic data classes that give extra control info to the Generic class.) Everything works (programming, write, read, through CR5_Comm class), so don't focus on that. It's just the events that update the progress bar that don't work. Names of classes have been changed enough that they don't give away our information, but still resemble my code. My code looks like this now (all separate vs projects): vs project: crTool frmUserForm.cs:
using USB_Comm;
namespace CRWriter
{
public partial class frmUser:Form
{
public frmUser(string dllSelected, TemplateHandlerApplication.Templates.TEMPL[] template, string dll, Site.Site.SITE cert0)
{
programDll = dllSelected;
templateArr = template;
itsDll = dll;
cert = cert0;
InitializeComponent();
CreateSubForms(); //start here
}
private void CreateSubForms()
{
cb = new CrComm();
int errValue = cb.FindUsbHid(ref HWndBoxID); //see how many boxes there are
for (int i = 0; i < cb.cbInfos.Length; i++)
{
iCRComm cb1 = null;
if (controls[i] == null)
{
CRComm_Factory.CRCommFactory factory = new CRComm_Factory.CRCommFactory();
int type = factorypublic Control GetPC(iCRComm cbInstance, string dllSelected, TemplateHandlerApp.Templates.TEMPL\[\] template, string dll, Site.Site.SITE cert0, int slaveIndex, int boxID, Form theParent) { //cr = new CR5\_new.CR5(slaveIndex); cr = factory.GetCR(type, slaveIndex); cr.ProgressChanged += new ProgressChangeHandler2(updateProgressBar); }
What type is "cr"? And what does the factory return? Btw, your naming isn't very helpful here. Any way we could translate what you're trying to achieve to a simple console-app? Makes it easier to focus on the problem itself, without having to worry about the rest of the app. Why does the CR5_new class have a
Main
method? It's not the entry-point for your app, is it?Bastard Programmer from Hell :suss: If you can't read my code, try converting it here[^]
-
public Control GetPC(iCRComm cbInstance, string dllSelected, TemplateHandlerApp.Templates.TEMPL\[\] template, string dll, Site.Site.SITE cert0, int slaveIndex, int boxID, Form theParent) { //cr = new CR5\_new.CR5(slaveIndex); cr = factory.GetCR(type, slaveIndex); cr.ProgressChanged += new ProgressChangeHandler2(updateProgressBar); }
What type is "cr"? And what does the factory return? Btw, your naming isn't very helpful here. Any way we could translate what you're trying to achieve to a simple console-app? Makes it easier to focus on the problem itself, without having to worry about the rest of the app. Why does the CR5_new class have a
Main
method? It's not the entry-point for your app, is it?Bastard Programmer from Hell :suss: If you can't read my code, try converting it here[^]
Thanks for the input, Eddy. I guess it's a good idea to try and put it in a simple console app. It might be crucial that I'm jumping through separate vs projects etc, so I left it as-is. I'm not sure why CR5 has a main. It's mostly just a dll and not a form, unlike a lot of my other classes. cr is an iCR type. It looks like this in the factory:
public iCR GetCR(CRType type, int slaveIndex)
{
iCR cr = null;
switch (type)
{
case CRType.CR5:
cr = new CR5_new.CR5(slaveIndex);
break;
case CRType.CR6:
cr = new CR6.CR6(slaveIndex);
break;
default:
throw new ArgumentException(string.Format("A CR of type {0} cannot be found", Enum.GetName(typeof(CRType), type)));
}
return cr;
} -
Thanks for the input, Eddy. I guess it's a good idea to try and put it in a simple console app. It might be crucial that I'm jumping through separate vs projects etc, so I left it as-is. I'm not sure why CR5 has a main. It's mostly just a dll and not a form, unlike a lot of my other classes. cr is an iCR type. It looks like this in the factory:
public iCR GetCR(CRType type, int slaveIndex)
{
iCR cr = null;
switch (type)
{
case CRType.CR5:
cr = new CR5_new.CR5(slaveIndex);
break;
case CRType.CR6:
cr = new CR6.CR6(slaveIndex);
break;
default:
throw new ArgumentException(string.Format("A CR of type {0} cannot be found", Enum.GetName(typeof(CRType), type)));
}
return cr;
}using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;namespace ConsoleApplicationXXIV
{
enum CRType { CR5, CR6 }
public delegate void ProgressChangeHandler2(int progress, int id);
public interface iCR
{
event ProgressChangeHandler2 ProgressChanged;
}
public class CR5 : iCR
{
public int SlaveIndex { get; set; }
public event ProgressChangeHandler2 ProgressChanged;
public CR5(int slaveIndex)
{
SlaveIndex = slaveIndex;
}
public int ProcessTagWrite() //(ref byte[] WriteDat, bool isFastProgramMode)
{
AttemptWrites();
return 0;
}
private void AttemptWrites()
{
for (int i = 0; i < (10); i++)
{
RaiseProgressChange(i, SlaveIndex);
}
}
private void RaiseProgressChange(int progress, int id)
{
if (ProgressChanged != null) //this is null
{
ProgressChanged(progress, id); //not getting here
}
}
}
class GenericPC
{
public object GetPC()
{
var cr = Program.GetCR(CRType.CR5, 0);
cr.ProgressChanged += new ProgressChangeHandler2(updateProgressBar);
(cr as CR5).ProcessTagWrite();
return cr;
}private void updateProgressBar(int n, int id) { Console.WriteLine(String.Format("Progress: {0}\\tid:{1}", n, id)); } } class Program { static void Main(string\[\] args) { var npc = new GenericPC(); npc.GetPC(); Console.ReadKey(); } public static iCR GetCR(CRType type, int slaveIndex) { iCR cr = null; switch (type) { case CRType.CR5: cr = new CR5(slaveIndex); break; case CRType.CR6: cr = null; //new CR6(slaveIndex); break; default: throw new ArgumentException(string.Format("A CR of type {0} cannot be found", Enum.GetName(typeof(CRType), type))); } return cr; } }
}
First things first; place the cursor on the word
ProgressChangeHandler2
and press F2 (or Ctrl-R, Ctrl-R) and rename that to something wit -
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;namespace ConsoleApplicationXXIV
{
enum CRType { CR5, CR6 }
public delegate void ProgressChangeHandler2(int progress, int id);
public interface iCR
{
event ProgressChangeHandler2 ProgressChanged;
}
public class CR5 : iCR
{
public int SlaveIndex { get; set; }
public event ProgressChangeHandler2 ProgressChanged;
public CR5(int slaveIndex)
{
SlaveIndex = slaveIndex;
}
public int ProcessTagWrite() //(ref byte[] WriteDat, bool isFastProgramMode)
{
AttemptWrites();
return 0;
}
private void AttemptWrites()
{
for (int i = 0; i < (10); i++)
{
RaiseProgressChange(i, SlaveIndex);
}
}
private void RaiseProgressChange(int progress, int id)
{
if (ProgressChanged != null) //this is null
{
ProgressChanged(progress, id); //not getting here
}
}
}
class GenericPC
{
public object GetPC()
{
var cr = Program.GetCR(CRType.CR5, 0);
cr.ProgressChanged += new ProgressChangeHandler2(updateProgressBar);
(cr as CR5).ProcessTagWrite();
return cr;
}private void updateProgressBar(int n, int id) { Console.WriteLine(String.Format("Progress: {0}\\tid:{1}", n, id)); } } class Program { static void Main(string\[\] args) { var npc = new GenericPC(); npc.GetPC(); Console.ReadKey(); } public static iCR GetCR(CRType type, int slaveIndex) { iCR cr = null; switch (type) { case CRType.CR5: cr = new CR5(slaveIndex); break; case CRType.CR6: cr = null; //new CR6(slaveIndex); break; default: throw new ArgumentException(string.Format("A CR of type {0} cannot be found", Enum.GetName(typeof(CRType), type))); } return cr; } }
}
First things first; place the cursor on the word
ProgressChangeHandler2
and press F2 (or Ctrl-R, Ctrl-R) and rename that to something wit -
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;namespace ConsoleApplicationXXIV
{
enum CRType { CR5, CR6 }
public delegate void ProgressChangeHandler2(int progress, int id);
public interface iCR
{
event ProgressChangeHandler2 ProgressChanged;
}
public class CR5 : iCR
{
public int SlaveIndex { get; set; }
public event ProgressChangeHandler2 ProgressChanged;
public CR5(int slaveIndex)
{
SlaveIndex = slaveIndex;
}
public int ProcessTagWrite() //(ref byte[] WriteDat, bool isFastProgramMode)
{
AttemptWrites();
return 0;
}
private void AttemptWrites()
{
for (int i = 0; i < (10); i++)
{
RaiseProgressChange(i, SlaveIndex);
}
}
private void RaiseProgressChange(int progress, int id)
{
if (ProgressChanged != null) //this is null
{
ProgressChanged(progress, id); //not getting here
}
}
}
class GenericPC
{
public object GetPC()
{
var cr = Program.GetCR(CRType.CR5, 0);
cr.ProgressChanged += new ProgressChangeHandler2(updateProgressBar);
(cr as CR5).ProcessTagWrite();
return cr;
}private void updateProgressBar(int n, int id) { Console.WriteLine(String.Format("Progress: {0}\\tid:{1}", n, id)); } } class Program { static void Main(string\[\] args) { var npc = new GenericPC(); npc.GetPC(); Console.ReadKey(); } public static iCR GetCR(CRType type, int slaveIndex) { iCR cr = null; switch (type) { case CRType.CR5: cr = new CR5(slaveIndex); break; case CRType.CR6: cr = null; //new CR6(slaveIndex); break; default: throw new ArgumentException(string.Format("A CR of type {0} cannot be found", Enum.GetName(typeof(CRType), type))); } return cr; } }
}
First things first; place the cursor on the word
ProgressChangeHandler2
and press F2 (or Ctrl-R, Ctrl-R) and rename that to something wit -
Good start. The Cr5_Comm class is missing from that. Good idea for ProgressChangeHandler to lose the 2. If you don't have the iCR_Comm interface, it's like I never made my changes at all.
To use the other interface, the CR5 class would need to inherit from it and implement it.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;namespace ConsoleApplicationXXIV
{
enum CRType { CR5, CR6 }
public delegate void ProgressChangeHandler2(int progress, int id);
public interface iCRComm
{
event ProgressChangeHandler2 ProgressChanged;
int ReadTag(ref byte[] dataDumpWriteCheck);
}
public class CR5 : iCRComm
{
public int SlaveIndex { get; set; }
public event ProgressChangeHandler2 ProgressChanged;
public CR5(int slaveIndex)
{
SlaveIndex = slaveIndex;
}
public int ReadTag(ref byte[] dataDumpWriteCheck)
{
Console.WriteLine(String.Format("Data: {0}", dataDumpWriteCheck));
return 0;
}
private void RaiseProgressChange(int progress, int id)
{
if (ProgressChanged != null) //this is null
{
ProgressChanged(progress, id); //not getting here
}
}
}
class GenericPC
{
public iCRComm GetPC()
{
var cr = Program.GetCR(CRType.CR5, 0);
cr.ProgressChanged += new ProgressChangeHandler2(updateProgressBar);
byte[] b = null;
cr.ReadTag(ref b);
return cr;
}private void updateProgressBar(int n, int id) { Console.WriteLine(String.Format("Progress: {0}\\tid:{1}", n, id)); } } class Program { static void Main(string\[\] args) { var npc = new GenericPC(); npc.GetPC(); Console.ReadKey(); } public static iCRComm GetCR(CRType type, int slaveIndex) { iCRComm cr = null; switch (type) { case CRType.CR5: cr = new CR5(slaveIndex); break; case CRType.CR6: cr = null; //new CR6(slaveIndex); break; default: throw new ArgumentException(string.Format("A CR of type {0} cannot be found", Enum.GetName(typeof(CRType), type))); } return cr; } }
}
Bastard Programmer from Hell :suss: If you can't read my code, try converting it
-
To use the other interface, the CR5 class would need to inherit from it and implement it.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;namespace ConsoleApplicationXXIV
{
enum CRType { CR5, CR6 }
public delegate void ProgressChangeHandler2(int progress, int id);
public interface iCRComm
{
event ProgressChangeHandler2 ProgressChanged;
int ReadTag(ref byte[] dataDumpWriteCheck);
}
public class CR5 : iCRComm
{
public int SlaveIndex { get; set; }
public event ProgressChangeHandler2 ProgressChanged;
public CR5(int slaveIndex)
{
SlaveIndex = slaveIndex;
}
public int ReadTag(ref byte[] dataDumpWriteCheck)
{
Console.WriteLine(String.Format("Data: {0}", dataDumpWriteCheck));
return 0;
}
private void RaiseProgressChange(int progress, int id)
{
if (ProgressChanged != null) //this is null
{
ProgressChanged(progress, id); //not getting here
}
}
}
class GenericPC
{
public iCRComm GetPC()
{
var cr = Program.GetCR(CRType.CR5, 0);
cr.ProgressChanged += new ProgressChangeHandler2(updateProgressBar);
byte[] b = null;
cr.ReadTag(ref b);
return cr;
}private void updateProgressBar(int n, int id) { Console.WriteLine(String.Format("Progress: {0}\\tid:{1}", n, id)); } } class Program { static void Main(string\[\] args) { var npc = new GenericPC(); npc.GetPC(); Console.ReadKey(); } public static iCRComm GetCR(CRType type, int slaveIndex) { iCRComm cr = null; switch (type) { case CRType.CR5: cr = new CR5(slaveIndex); break; case CRType.CR6: cr = null; //new CR6(slaveIndex); break; default: throw new ArgumentException(string.Format("A CR of type {0} cannot be found", Enum.GetName(typeof(CRType), type))); } return cr; } }
}
Bastard Programmer from Hell :suss: If you can't read my code, try converting it
-
-
Yes, but I have two factories. One for CR5 interface and one for CRComm interface. It may not be obvious from what I posted, but they have very different uses. Generic needs to use CR5 for writes. CR5Comm is used all over the place and definitely isn't the same/can't be condensed into one with CR5. You're changing the use of everything too much for it to be helpful. Maybe we need to go back to the original VS project definitions of everything? I know it's difficult, but it's like that for a reason. Even where you put the delegate doesn't translate to anywhere in my code.
-
Yes, but I have two factories. One for CR5 interface and one for CRComm interface. It may not be obvious from what I posted, but they have very different uses. Generic needs to use CR5 for writes. CR5Comm is used all over the place and definitely isn't the same/can't be condensed into one with CR5. You're changing the use of everything too much for it to be helpful. Maybe we need to go back to the original VS project definitions of everything? I know it's difficult, but it's like that for a reason. Even where you put the delegate doesn't translate to anywhere in my code.
MichCl wrote:
It may not be obvious from what I posted, but they have very different uses.
I'd expect anything out that factory to behave similar; otherwise you'd be checking whether you're working on a CR5 or a CR6 everywhere in code, making things even more complicated.
MichCl wrote:
Even where you put the delegate doesn't translate to anywhere in my code.
As far as the compiler is concerned, it's located in "some" namespace. As long as it's referenced, it can be used.
Bastard Programmer from Hell :suss: If you can't read my code, try converting it here[^]
-
MichCl wrote:
It may not be obvious from what I posted, but they have very different uses.
I'd expect anything out that factory to behave similar; otherwise you'd be checking whether you're working on a CR5 or a CR6 everywhere in code, making things even more complicated.
MichCl wrote:
Even where you put the delegate doesn't translate to anywhere in my code.
As far as the compiler is concerned, it's located in "some" namespace. As long as it's referenced, it can be used.
Bastard Programmer from Hell :suss: If you can't read my code, try converting it here[^]
Like I said. There are two different factories. One for comm, one for crx. I get two different things from them. The fact that I don't have a check for CR5 or CR6, is because my cr factory returns an instance of iCR that is an instance of either cr5 or cr6. When I make a call from my instance of icr that is returned, it will automatically go to the implementation of cr5 or cr6, whichever I instantiated in the factory. I realize the compiler doesn't care about the delegate location and usage, but I do. The structure/fix that you are suggesting doesn't translate even slightly to my code, which is in separate vs projects. I can't put my delegate where you have it, so it's not a fix for my problem. Thanks for the help!
-
Like I said. There are two different factories. One for comm, one for crx. I get two different things from them. The fact that I don't have a check for CR5 or CR6, is because my cr factory returns an instance of iCR that is an instance of either cr5 or cr6. When I make a call from my instance of icr that is returned, it will automatically go to the implementation of cr5 or cr6, whichever I instantiated in the factory. I realize the compiler doesn't care about the delegate location and usage, but I do. The structure/fix that you are suggesting doesn't translate even slightly to my code, which is in separate vs projects. I can't put my delegate where you have it, so it's not a fix for my problem. Thanks for the help!
MichCl wrote:
The structure/fix that you are suggesting doesn't translate even slightly to my code, which is in separate vs projects.
Aight, can you add in the project names in the original post? Make 'em fake ones if required :)
Bastard Programmer from Hell :suss: If you can't read my code, try converting it here[^]
-
MichCl wrote:
The structure/fix that you are suggesting doesn't translate even slightly to my code, which is in separate vs projects.
Aight, can you add in the project names in the original post? Make 'em fake ones if required :)
Bastard Programmer from Hell :suss: If you can't read my code, try converting it here[^]
-
MichCl wrote:
The structure/fix that you are suggesting doesn't translate even slightly to my code, which is in separate vs projects.
Aight, can you add in the project names in the original post? Make 'em fake ones if required :)
Bastard Programmer from Hell :suss: If you can't read my code, try converting it here[^]
-
Guess what???! I cleaned all of my classes, detached and re-attached references, and it's working now. I guess I had the delegates/events and the interfaces set up correctly after all!!!! I was stepping through and noticed an exception was being thrown so I wasn't getting to my event setup (+/-), so that's why it was null and missing updating the progressBar. :) Thanks for the help!!
-
Guess what???! I cleaned all of my classes, detached and re-attached references, and it's working now. I guess I had the delegates/events and the interfaces set up correctly after all!!!! I was stepping through and noticed an exception was being thrown so I wasn't getting to my event setup (+/-), so that's why it was null and missing updating the progressBar. :) Thanks for the help!!