|
I have two separate combo boxes and I would like to create one function to populate them.
I would like to be able to pass a combobox control and use it.
I.E.
void LoadDD(<no sure=""> <ddname>)
{
string[] dirs = Directory.GetDirectories("\\Family");
foreach (string dir in dirs)
{
<ddname>.Items.Add(new ListItem(GetName(dir), dir));
}
}
Any ideas??
|
|
|
|
|
You almost had it. If you want to tie the method to a particular control:
void LoadData(ComboBox box)
{
string[] dirs = Directory.GetDirectories("\\Family");
foreach(string dir in dirs)
{
box.Items.Add(new ListItem(GetName(dir), dir));
}
}
- Nick Parker My Blog | My Articles
|
|
|
|
|
I have an ArrayList. At some point I wish to copy all of it's items to a new ArrayList. I could probably loop through all objects in the ArrayList but isn't there a faster way (it seems to be a bit stupid method) ?
Just to explane why I need this: I'm translating an old Visual C++ MFC program into C# (with blessings of the original author). I ran into an object CArray that is an usual array but is capable of growing and shrinking dynamically. Anyway, at some point the thing copies itself into another CArray. There's no equivalent for that in C# as far as I know. Code:
oldArr.Copy(newArr);
oldArr.RemoveAll;
Regards, Desmond
|
|
|
|
|
ArrayList oldArr = new ArrayList();
oldArr.AddRange( new string[] {"hello", "world!"} );
ArrayList newArr = new ArrayList(oldArr);
Console.WriteLine(newArr[0].ToString());
Additionally, you can use the .CopyTo method, using an array as a temporary buffer, or as a the destination array itself:
ArrayList list = new ArrayList();
list.AddRange( new string[] {"hello", "world"} );
string[] tempArr = new string[2];
list.CopyTo(tempArr);
ArrayList list2 = new ArrayList(tempArr);
MessageBox.Show(list2[0].ToString());
---------------------------
He who knows that enough is enough will always have enough.
-Lao Tsu
|
|
|
|
|
Doesn't this make a swallow copy instead of a deep copy ?
|
|
|
|
|
Yes, so long as what the ArrayList contains are reference types. If you want to perform a deep copy, you could do something like this:
private ArrayList Copy(ArrayList list)
{
if (list == null) throw new ArgumentNullException("list");
ArrayList copy = (ArrayList)list.Clone();
for (int i=0; i<copy.Count; i++)
if (copy[i] is ICloneable) copy[i] = ((ICloneable)copy[i]).Clone();
return copy;
} So long as the objects that the list contains are cloneable, you'll clones depending on the internal implement (perhaps deep or only partly deep).
Microsoft MVP, Visual C#
My Articles
|
|
|
|
|
Or just call ArrayList.Clone .
Microsoft MVP, Visual C#
My Articles
|
|
|
|
|
I am trying to draw RTF text in my custom UserControl without actually having a RichTextBox window. I have seen a couple articles on the web about creating a windowless RichTextBox by supplying it with a custom ITextHost interface (see http://www.codeguru.com/Cpp/controls/richedit/windowless/article.php/c5367).
The problem is, these examples are for c++ and I am wondering how one could go about doing this from C#. Is there a way to somehow import the ITextHost interface from the control? Does anybody have any clue to point me in the right direction? (and no, I am not above using unmanaged code to get this to work).
Or is there a better way to accomplish this?
Thanks in advance!
Michael
Developer, Author, Chef
|
|
|
|
|
.NET is a natural progression from COM, and can easily interop with COM. Read Interoperating with Unmanaged Code[^] in the .NET Framework SDK for basic information on these concepts.
Also, be sure to read Windowless Rich Edit Controls[^] in the Platform SDK for details information, not just examples.
First, you should consider encapsulating both the CreateTextServices API as well as the implementation of ITextHost in a class to make it easy to use. You then need to declare the ITextHost and, optionally (though recommended), ITextServices interfaces in C#. An example of (part, since it's so long) of ITextHost host looks like this (methods must be in order since this interface inherits from IUnknown and methods must be in the proper VTBL order):
[Guid("c5bdd8d0-d26e-11ce-a89d-00aa006cadc5")]
[InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
public interface ITextHost
{
IntPtr TxGetDC();
IntPtr TxReleaseDC(IntPtr hdc);
bool TxShowScrollBar(IntPtr fnBar, bool fShow);
} Be sure you know the conversion from unmanaged to managed data types. For example, many of the methods use INT , which is not necessarily 32 bits. It is system dependent, just like IntPtr . You can also use a Int64 (long ) and use MarshalAs(UnmanagedType.SysInt) which would make it easier and should work well for many, many years (since 64-bit processors are just starting to hit main-stream on the x86 platform supported by current CLI implementations).
The CreateTextServices factory function would look like this:
[DllImport("riched20.dll")]
private static extern int CreateTextServices(
[MarshalAs(UnmanagedType.IUnknown)] object punkOuter,
ITextHost pITextHost,
[MarshalAs(UnmanagedType.IUnknown), Out] out object ppUnk); You could also use IntPtr instead of object and then use appropriate methods from the System.Runtime.InteropServices.Marshal class to get the information you need. Note that you do not need to implement IUnknown on your object. The CLR does this for you. Note that the out object is a pointer to a pointer that returns either a ITextService or ITextDocument implementation. If you re-declare these in managed code, you can simply cast the output object to these interfaces (or use the as operator). If the cast return null (or throws an exception), then then interface it not supported. The CLR performs the QueryInterface for you automatically.
When you start looking at all the structs, consts, and other interfaces you would need to implement for full support, I'm sure you'll see why there isn't a .NET implementation! It's much easier in C++ where you can include the headers that contain all these definitions for you and don't have to worry about marshaling (all that would be handled by the COM runtime).
If you decide to venture this way, be sure to have a good working knowledge of COM interoperability in .NET.
You might consider using a mixed-mode MC++ (Managed C++ assembly) that can include the necessary headers and aggregate the methods you need on a __gc class (since a managed class can't implement an unmanaged interface like ITextHost . You could easily use the resulting assembly from any other .NET language like C#. There's still be a lot fo to, but this will probably be a much easier approach.
Microsoft MVP, Visual C#
My Articles
|
|
|
|
|
Heath,
You had 49 minutes (since I posted) to think about and write a response and that is all you could manage?
Seriously, many many many many thanks for the tips and pointers. I will be looking into this as you suggest. If I manage to get this working well, I will share the info in the form of an article.
Again, thanks thanks thanks for setting me down the right path!
Michael
Developer, Author, Chef
|
|
|
|
|
|
Heath Stewart wrote:
Sorry it took so long!
Practice makes perfect!
- Nick Parker My Blog | My Articles
|
|
|
|
|
Heath,
1) Just wanted to let you know that I was successful in taking the second route you outlined. I initially spent about 2 hours trying to get everything defined in C#. This was a bit of a nightmare as you suggested. Then I spent about 10 minutes doing it as a mixed-mode MC++ class library, and exposing the routines I needed. Works like a charm! In the future, I plan revisit the c# way (to eliminate the mc++ dll and learn what I was doing wrong), but for now this is completely workable. Thanks for the previous advice.
2) 5 Years ago I was lucky enough to take a 1 year sabbatical. What did I do? Since I was about to turn 30 I decided I wanted to see the world, but learn something as well. Since I have always cooked, I decided to go to Paris and attend culinary school at Le Cordon Bleu. I heartily reccommend it for burned-out developers! Amazing time, amazing people, amazing food, and an amazing amount of work. The only problem: Software pays way too much to let it go completely! So I heartily applaud the mid-life career change, but I warn you that you will find it hard to let go of your current one.
Thanks again!
Michael
Developer, Author, Chef
|
|
|
|
|
Mwolski wrote:
...but I warn you that you will find it hard to let go of your current one
I don't think I'll have any problems letting go of the chest pains, irregular heart beat, headaches, stiff joints, tendenitous, and stress. Money is a slight factor, but hopefully these stock options pay-out.
Microsoft MVP, Visual C#
My Articles
|
|
|
|
|
Any sample C# speech recognition source code with speech input through fourier transforms anywhere? Thanks all.
|
|
|
|
|
Many, many moons ago on http://research.microsoft.com[^] the Speech SDK was posted with some COM controls that made interaction with TTS and STT engines easy. Much of this went into Microsoft Agent.
Recently, Microsoft created its Speach Server[^] which uses the newer Speech SDK and technology for voice technologies (their answer to VoiceML, I guess). Unfortunately, it doesn't seem to leverage the same component-based technology that previous versions did so that you could use it with, say, a Windows Forms application. You could, however, use the older, stable versions (4.0 I think? ...it's been a while since I've used the Speech SDK in anything) to create RCWs (runtime-callable wrappers) from the COM components and use that.
The Microsoft Speech API is pretty good and has a much smaller footprint than IBM's ViaVoice and the (not extinct?) DragonDictate, plus it can easily be bundled with applications and, IIRC, is royalty free (it was, after all, free to download and develop on anyway).
There was a lot of sample code with previous versions, though it was in VB and C++. But since you'd be creating RCWs, the VB code would be close to what you need, which is just instantiating the components, calling methods, and getting/setting properties in much the same way the VB samples would. There was also pretty decent documentation with it.
See http://research.microsoft.com/srg/[^] for more information and downloads.
Microsoft MVP, Visual C#
My Articles
|
|
|
|
|
Maybe I should write up a little article on wrapping the Speech API to be used in .NET as I did for the Imagine Cup project?
- Nick Parker My Blog | My Articles
|
|
|
|
|
Sounds like a good idea.
Microsoft MVP, Visual C#
My Articles
|
|
|
|
|
I should probably do it up after our FAQ article is done. Once graduation rolls around I don't think it will take too long for us to put together the article (FAQ article).
- Nick Parker My Blog | My Articles
|
|
|
|
|
|
Hello,
I want to know more about Custom-Proxies
Can you please give me a detail explanation of Custom-Proxies
and a brief implementation example.
Thank You.
|
|
|
|
|
See Extending RealProxy[^] in the .NET Framework SDK for more information.
Basically, on a ContextBoundObject you can attribute your class with aProxyAttribute -derivative to specify the type of a RealProxy derivative class that will proxy calls (even creation calls a la new ) to your object.
For instance, if you wanted to implement a singleton pattern in your application using a ContextBoundObject , you would override RealProxy.Invoke and determine if the message is an IConstructionCallMethod and either create the single instance of the class or return an existing instance (basically).
To gain more in-depth knowledge, I suggest you read "Microsoft .NET Remoting" from MS Press[^] or "Advanced .NET Remoting" from Ingo Rammer[^].
Microsoft MVP, Visual C#
My Articles
|
|
|
|
|
Bonjour,
Windows NT/2000/Xp. My service is running but i want to make some actions when i move mouse in CTRL-ALT-DEL windows or when i hit a key on my keyboard.
How to do this ?
Please help.
Thanks.
|
|
|
|
|
phil63 wrote:
My service is running but i want to make some actions when i move mouse in CTRL-ALT-DEL windows or when i hit a key on my keyboard.
You want to to do something when Windows is displaying the login box? What do you mean by "OR when I kit a key"? When do you want this to happen? What do you want to happen?
Your service cannot interact with the keyboard and mouse since it is running on a different desktop, not the one your seeing on the screen.
RageInTheMachine9532
|
|
|
|
|
Dave Kreskowiak wrote:
Your service cannot interact with the keyboard and mouse since it is running on a different desktop, not the one your seeing on the screen.
Unless it's marked to interact with the desktop, in which case it either uses the desktop session (creates it if necessary) of the specified login (if the account has "Log in locally" rights), or the current desktop if logged in as LocalSystem (SYSTEM).
Microsoft MVP, Visual C#
My Articles
|
|
|
|
|