I have some applications that currently use a list control to display status messages from the process. As time goes by, the number of messages in the list would grow without bounds if I did not limit it. I do this by checking if adding a new message will make the line count go over the configured maximum. If so, I delete the first line in the control and then add my new line. There is no real need for the user to interact with the list other than to read it, possibly using the scroll bar. The list control has one column, wide enough for a reasonable length message.
The difficulty with this is that it causes a lot of flashing of the control, whether or not I ensure that the newly added line is visible. If messages are rapidly being added to the list, the list can go completely blank for periods of time while tons of updating is going on.
So what is a better way? I'm open to anything, particularly to using something other than a list control. Essentially, I'm trying to mimic how a read-only command prompt window works. Once it gets a certain number of lines in it, new lines cause old lines to disappear, with no annoying flicker.
Since my last post on Design Patterns, I've been reading up on them and in particular the Observer Pattern, as I think it's the right tool for my specific task.
My scenario is this: I have a small(ish) application which uses a barcode scanner to read barcodes (naturally). Various parts (forms) of the application need to be able to accept the data from the barcode scanner (although not all at once, which I manage on a focus basis). To this end, I created a BarcodeScanner class as a Singleton, so that only one instance exists and so that it has public visability; I also created an event in this class so that it can notify any listeners when a Barcode has been successfully read. Each form that needs to read barcodes simply attaches itself as an Event receiver and so can listen (observe) the barcode scanner class.
And this all works pretty well, which is the important thing. But what I'd like to know is, is this an example of the Observer pattern as implemented in C#? Most of the articles I've read on the subject are great at explaining the abstract concept, but rely on the reader's intelligence ( ) to work out the implementation details for themselves.
is this an example of the Observer pattern as implemented in C#?
Yes, it is. A few points that may be worth mentioning:
Observers can attach themselves by chaining a listening delegate to BarcodeScanner or implementing an IBarcodeScannerListener interface and attaching themselves by calling an BarcodeScanner.addListener() method. Delegates offer more flexibility in that the observer can supply any (valid) listening method at run time. I find the latter method meets my needs as it clearly indicates that a class is an observer of BarcodeScanner events.
As with any listener, you need to be careful of cross thread calls (if BarcodeScanner is running in a separate thread). See the doc on BeginInvoke() and EndInvoke() for more information.
Because listeners will typically block execution of BarcodeScanner, you should ensure that the listener method is lightweight.
I need help with a strange problem.
Symptom: my C# application crashes with a AccessViolationException. The interesting thing is that it happens only when running as 32bit-process on 64-bit Windows. Running 32bit on 32bit works fine, so does 64bit on 64bit.
FxCop does not complain about my P/Invoke declarations, so I don't think I confused IntPtr and int parameters - it runs fine both as 32bit process and 64bit process - just not as 32 bit process on Windows XP Professional x64 Edition.
Using the managed debug assistent in VS05, I get the error message "The runtime has encountered a fatal error. The address of the error was at 0x79fccc04, on thread 0x6c8. The error code is 0xc0000005.".
The line where it's failing is "return CallNextHookEx(...);", the callstack suggests it fails while/after calling CallNextHookEx; not when returning from my own hook procedure. What makes this really interesting is that the code using the hook is working fine until the text-editor portion of the app is activated. It crashes when the hook receives the message caused by activating the IME (input method editor; for asian languages).
Here is the P/Invoke declaration for the hook (I'm creating the hook with code=WH_CALLWNDPROCRET, hInstance=IntPtr.Zero and threadID=AppDomain.GetCurrentThreadId()):
CallNextHookEx[^] definition from MSDN:
LRESULT CallNextHookEx(HHOOK hhk, int nCode, WPARAM wParam, LPARAM lParam);
And here is the P/Invoke declaration for the IME:
private const int WM_IME_CONTROL = 0x0283;
private static extern IntPtr SendMessage(IntPtr hWnd, int msg, IntPtr wParam, [In, MarshalAs(UnmanagedType.LPStruct)] LOGFONT lParam);
[ StructLayout(LayoutKind.Sequential) ]
private class LOGFONT
public int lfHeight = 0;
public int lfWidth = 0;
public int lfEscapement = 0;
public int lfOrientation = 0;
public int lfWeight = 0;
public byte lfItalic = 0;
public byte lfUnderline = 0;
public byte lfStrikeOut = 0;
public byte lfCharSet = 0;
public byte lfOutPrecision = 0;
public byte lfClipPrecision = 0;
public byte lfQuality = 0;
public byte lfPitchAndFamily = 0;
[ MarshalAs(UnmanagedType.ByValTStr, SizeConst=32) ] public string lfFaceName = null;
So, how could I find what the problem is? Are there any other tools for checking such problems? I don't have any idea what can I do now. We need to run as 32bit on 64bit Windows because a library used by another part of the app is available for 32bit only.
What 64-bit dll?
I think I should add that I don't even have an IME installed - just some users of our software have.
All P/Invoke calls are from user32.dll - it uses the 32bit version of that dll. When disabling the IME call (I personally don't need an IME, only some users do), everything works fine.
Hey guys, I have a problem with DataGridView !!!
I have a DataGrid that is binded to a DataSet (MyDS)
and I have some Text boxes that are also binded to the DataSet(Using the below comand), so when I click on any rows in my DataGrid, the data is shown in my text Boxes. dataGrid1.SetDataBinding(myDS, TableName);
It works perfectly.
Now I want to do the same thing with DataGridView, but it doesn't have that command, and i'm stuck !!! I 've been working on it for days but NO LUCK !!!!!!!
Can you please give m a hand ?!
When using WinForms databinding in .NET 2.0, it is recommended to use the new BindingSource[^] component. All of the databound controls on a form should bind to that component. It works very well with the DataGridView as well.
For example, if a user clicks a file highlighting it, or drag selects multiple files, and they did this on the deskop or anywhere in some drive folder, then is their an api or something in .net that can help me figure out the file/s that were selected?
You might want to try overriding OnInsert and OnRemove and unconditionally throw an exception. The designer should catch that exception and display a messagebox to the user after he/she clicks the Add or Remove buttons.
Firstly, is there a way to enumerate the CD and DVD drives in the system? This is the most important question.
Aditionally, if possible I'd like to know whether they support DVD reading, or CDs only, and if possible I'd like to know whether there are CDs or DVDs in the drives. For extra extra coolness, is there a way to know whether a present disk is an Audio CD, a VCD, an SVCD, or a DVD?