|
I've written a fairly complex MDI app and I cannot think of any instance where movement of the children bothered the app. However I definitely did not want my menu selector, etc. being played with. To handle those forms within the MDI parent I used docking controls......but then they do not become MDI children and an exception would be thrown if they were set to be children.
If you were using an MDI parent for specific placement of forms for multiple displays....for example the upper left window shows all processes running on a selected server while the upper right window shows processor availability and below these two are all possible servers to select from....then an MDI parent was not a good design choice.
In the prior example you can get a better UI by dumping the MDI parent, placing panels on the parent form where you want specific windows, build out each 'window' as user controls, and then at startup populating the panels with the controls.
Now you have the advantage of MDI children (each control manages itself) and you cannot move the 'windows' around anymore.
Not sure if this helps -- if not provide more details on what you are doing and I'll see if I can help.
_____________________________________________
Of all the senses I could possibly lose, It is most often the one called 'common' that gets lost.
|
|
|
|
|
does anyone know of a dll that would convert mp3 to cda, or something else that would help me with that.....Thank You
Da Intern
|
|
|
|
|
Not entirely sure, but you may want to try directX - there is plenty of functionality to use filters to compress/decompress different multimedia types.
Peter
|
|
|
|
|
When i make a reference to excel it works fine, but when i try to make one to outlook or office i get the following error:
"A reference to "'officePath'.Outlook.exe" could not be added. This is not a valid assembly or Com Component. Only components with extensions 'dll' and Com Components can be added. Please make sure the file is accesisble and that it is a valid assembly or com component"
I am using Office 2003 professional.
Does anyone know how to fix this??
|
|
|
|
|
When you want to connect to Outlook, using the add reference in Visual Studio, and point to Microsoft Outlook 11 (which isnt the outlook.exe).
If I was at home, I could give you the full details, but I am pretty sure you cannot directly connect to the Outlook executable.
|
|
|
|
|
You should install the Visual Studio Tools for the Microsoft Office System, which comes with O2K3 Pro I believe. You can download the Office XP PIAs (primary interop assemblies) which you should use as opposed to making your own. These are verified assemblies that are associated with the COM components and typelibs typically produced by the company that wrote the application that you're interop'ing.
The Office XP PIAs can be downloaded from http://www.microsoft.com/downloads/details.aspx?FamilyId=C41BD61E-3060-4F71-A6B4-01FEBA508E52&displaylang=en[^] and should work in a pinch (since properly-written COM is mostly backward compatible). The Office 2K3 PIAs cannot be downloaded (except through MSDN Subscriptions), but should be on the O2K3 Pro CD.
Microsoft MVP, Visual C#
My Articles
|
|
|
|
|
refer to the link below
http://support.microsoft.com/default.aspx?kbid=327823#1
using System;
using System.Windows.Forms;
public class MyTextBox :System.Windows.Forms.TextBox
{
// Override IsInputKey method to identify the Special keys
protected override bool IsInputKey( System.Windows.Forms.Keys keyData )
{
switch ( keyData)
{
// Add the list of special keys that you want to handle
case Keys.Tab:
return true;
default:
return base.IsInputKey(keyData);
}
}
}
Based on the sample above, I've managed to modify and fire KeyDown Event for textbox, combobox, checkbox, datetimepicker, etc...
except NUMERICUPDOWN.
how to make it work??
|
|
|
|
|
You should override OnTextBoxKeyPress on the NumericUpDown control as well. The existing code handles numbers and letters A-F if Hexidecimal is set to true . Override it and execute your code first, then call base.OnTextBoxKeyPress .
Microsoft MVP, Visual C#
My Articles
|
|
|
|
|
I still can't make it work. Maybe I did some way wrong.
Actually, what I want is to create a customize NumericUpDown(nud) as a class component.
Then, when I create a winform, I can drag and drop the customized nud from toolbox into the winform.
In the winform, and where the nud is, a KeyDown event is binded to it. In the KeyDown Event, I would like to have the code below:
if(e.Keys == Keys.Tab || e.Keys == Keys.Enter)
{
// ...
// Do Something.... some checking here
// ...
//After the checking
//Then only I "manually" call SelectNextControl method
this.SelectNextControl(Control(sender), true, true, true, true);
}
I've put in the "Override IsInputKeys" code and the OnTextBoxKeyPress as well in the component class. When I run debugger, I noticed that Tab Key didn't go into OnTextBoxKeyPress.
Maybe you have to describe more in detail. Thanks.
|
|
|
|
|
I'm trying to create a plugin for an app I am building. I am trying to utalize CreateInstanceAndUnwrap. Been trying for days now, still with no luck. Heres my code:
Sorry its a little messy
AppDomain remote = AppDomain.CreateDomain("Remote DLL");
IPlugin plugin = (IPlugin) remote.CreateInstanceAndUnwrap(
PluginManager.strPath + @"\" + pluginList.SelectedItem,
"IPlugin");
plugin.loadAssembly(PluginManager.strPath + @"\" + pluginList.SelectedItem);
I read some demos of apps sorta like this that use Loader : MarshalByRefObject. But that only gives me a referance to the object not an instance. As you can see I'm trying to place the instence in its own AppDomain so I can unload it later.
Anyone have any suggestions, I'm litteraly pulling my hair out (and its quite painfull )
If you have an example that would be great, what my goal is -- to create the object from the DLL in the other app domain so I can call its functions.
The plugin dll is seralizable.
This is what IPlugin looks like:
public interface IPlugin
{
string Description {get;}
string Author {get;}
void Initalize();
void Render();
void SendData();
void Dispose();
}
The plugin I created looks like this:
public class Plugin : IPlugin
{
public string Author { get { return "Matthew Hazlett"; } }
public string Description { get { return "Testing the plugin"; } }
public void Initalize() {}
public void Render() {}
public void SendData() {}
public void Dispose() {}
public Plugin() { }
}
Matthew Hazlett
Windows 2000/2003 MCSE
Never got an MCSD, go figure...
|
|
|
|
|
Why not try:
ObjectHandle o;
IPlugin plugin;
Type t = Type.GetType("SomeAssembly.dll");
o = Activator.CreateInstance(t);
plugin = (IPlugin)o.Unwrap();
plugin.Render();
- Nick Parker My Blog
|
|
|
|
|
Thank you for your help, but it still will not work correctly. But at least its giving me a different error now:
An unhandled exception of type 'System.NullReferenceException' occurred in PluginHost.exe. It dies on this line o = Activator.CreateInstance(dll, t.ToString());
ObjectHandle o;
IPlugin plugin;
string dll = PluginManager.strPath + @"\" + pluginList.SelectedItem;
Type t = Type.GetType(dll);
o = Activator.CreateInstance(dll, t.ToString());
plugin = (IPlugin)o.Unwrap();
MessageBox.Show(plugin.Author);
I will keep at this and try to get it to work, thanks for pointing me in another direction. Also, if you have any further ideas please let me know.
Matthew Hazlett
Windows 2000/2003 MCSE
Never got an MCSD, go figure...
|
|
|
|
|
I'm still having issues, here is my fussionlog:
*** Assembly Binder Log Entry (3/8/2004 @ 9:12:15 PM) ***
The operation was successful.
Bind result: hr = 0x0. The operation completed successfully.
Assembly manager loaded from: C:\WINDOWS\Microsoft.NET\Framework\v1.1.4322\fusion.dll
Running under executable C:\Documents and Settings\hazlema.FRAGNET\My Documents\Visual Studio Projects\PluginHost\bin\Debug\PluginHost.exe
--- A detailed error log follows.
=== Pre-bind state information ===
LOG: DisplayName = IPortal, Version=1.0.1528.2599, Culture=neutral, PublicKeyToken=null
(Fully-specified)
LOG: Appbase = C:\Documents and Settings\hazlema.FRAGNET\My Documents\Visual Studio Projects\PluginHost\bin\Debug\
LOG: Initial PrivatePath = NULL
LOG: Dynamic Base = NULL
LOG: Cache Base = NULL
LOG: AppName = NULL
Calling assembly : PluginHost, Version=1.0.1528.37815, Culture=neutral, PublicKeyToken=null.
===
LOG: Processing DEVPATH.
LOG: DEVPATH is not set. Falling through to regular bind.
LOG: Policy not being applied to reference at this time (private, custom, partial, or location-based assembly bind).
LOG: Post-policy reference: IPortal, Version=1.0.1528.2599, Culture=neutral, PublicKeyToken=null
LOG: Attempting download of new URL file:///C:/Documents and Settings/hazlema.FRAGNET/My Documents/Visual Studio Projects/PluginHost/bin/Debug/IPortal.DLL.
LOG: Assembly download was successful. Attempting setup of file: C:\Documents and Settings\hazlema.FRAGNET\My Documents\Visual Studio Projects\PluginHost\bin\Debug\IPortal.DLL
LOG: Entering run-from-source setup phase.
Do you have any other ideas?
Matthew Hazlett
Windows 2000/2003 MCSE
Never got an MCSD, go figure...
|
|
|
|
|
Post some of the code that is failing.
- Nick Parker My Blog
|
|
|
|
|
Nick, thanks for your hellp.
I fixed it, works like a charm now!
Matthew Hazlett
Windows 2000/2003 MCSE
Never got an MCSD, go figure...
|
|
|
|
|
If you're getting a FileNotFoundException (in which the default error message is what you're getting), it's because the CLR cannot find your assembly that contains the Type. Nick's code was almost correct (Type.GetType("MyPlugin, MyAssembly") instead of what he wrote, which was just the assembly filename), but the assembly (MyAssembly.dll in this case) needs to be in a directory that can be resolved (or online with the necessary assembly binding information in the app's .config file).
See How the Runtime Locates Assemblies[^] in the .NET Framework SDK for more information.
There's also many articles here on CodeProject that discuss plugin architectures if you're having problems.
Microsoft MVP, Visual C#
My Articles
|
|
|
|
|
Thanks for the link.
Matthew Hazlett
Windows 2000/2003 MCSE
Never got an MCSD, go figure...
|
|
|
|
|
Heath Stewart wrote:
Type. Nick's code was almost correct
followed by a throw in a little and end it with a .
I guess you got me.
- Nick Parker My Blog
|
|
|
|
|
Look at my Plugin Manager article/code, it does it all there, with alot of work (that could probably be improved on).
Now lemme remember what the trick was? BAD MSDN DOCS!
snippet:
string assname = typeof(PluginManager).Assembly.FullName;
string typename = typeof(PluginManager).FullName;
pm = plugdom.CreateInstanceAndUnwrap(assname, typename,
true, BindingFlags.Default, null, this.objs, null, null, null) as PluginManager;
top secret
|
|
|
|
|
Yes, I read your artical a nice piece of work.
And you are right, the MSDN docs on this topic are horible !
Matthew Hazlett
Windows 2000/2003 MCSE
Never got an MCSD, go figure...
|
|
|
|
|
Got it to work using a subset of your example.
Thanks...
Matthew Hazlett
Windows 2000/2003 MCSE
Never got an MCSD, go figure...
|
|
|
|
|
My idea was to specifically allow changes at runtime without loading multiple versions of the same assembly, not sure if you wanted something like that.
top secret
|
|
|
|
|
I'm not looking for a solution to a problem; I want to know why .NET won't allow the following:
interface IFoo
{
void Invalidate();
}
class FooBar
{
private System.Windows.Form winForm;
private IFoo theFoo;
...
theFoo = winForm;
}
On the call theFoo = winForm , the compiler complains that an explicit cast is required. Why? winForm has an .Invalidate method, so why bother? Of course, an explicit cast generates a runtime error. Again, why? If a class implements all methods required by a particular interface without actually implementing the interface, why is an exception thrown? At the very least, an explicit cast should work (even though the compiler could verify and do implicit casts).
Could someone shed some light on why it is designed this way?
---------------------------
He who knows that enough is enough will always
have enough.
-Lao Tsu
|
|
|
|
|
I have two classes A and B , both of which have MyMethod() .
Now this is my problem:
A a = new B();
But the compiler complains that it is not possible even though they both have MyMethod() method.
Do you know why it is designed this way?
Don't forget, that's Persian Gulf not Arabian gulf!
Murphy: Click Here![^] I'm thirsty like sun, more landless than wind...
|
|
|
|
|
You're not making sense. Of course you can't do that conversion; classes A and B are not compatible even if they share a method (or even all methods).
However, an interface is supposed to work like that; ICloneable specifies a .Clone method, and all objects that implement ICloneable have a .Clone method. If I create my own interface IFoo that specifies a .Clone method, any class that is ICloneable should be convertible to IFoo.
Here's an example situation I ran into last night that brought about this question. I have a component that is passed either a Sys.Win.Forms.Form object or a Sys.Win.Forms.Control object. It is completely up to the consumer of my component whether to pass a Form or a Control . In my component class, the only thing I care about is that the passed object, either Form or Control, have a .Handle getter property and a .Invalidate() method. Because both Form and Control have these types, it would be ideal if I could create my own interface and store that type, like so:
interface IHandleWithInvalidate
{
IntPtr Handle{get;}
void Invalidate();
}
class myComponent
{
private IHandleWithInvalidate passedObject;
public myComponent(Form f)
{
this.passedObject = f;
}
public myComponent(Control c)
{
this.passedObject = c;
}
private void DoSomething()
{
this.passedObject.Invalidate();
IntPtr h = this.passedObject.Handle;
}
}
Alas, .NET won't let me do this. Instead, I have to keep 2 variables, and throughout my code, I have to check which one to use, nearly doubling the amount of code I have to write. For example, the above snippet would now look like this:
class myComponent
{
private Form passedForm;
private Control passedControl;
public myComponent(Form f)
{
this.passedForm = f;
}
public myComponent(Control c)
{
this.passedControl = c;
}
private void DoSomething()
{
if(this.passedForm != null)
{
this.passedForm.Invalidate();
IntPtr h = this.passedForm.Handle;
}
else
{
this.passedControl.Invalidate();
IntPtr h = this.passedControl.Handle;
}
}
}
As you can see in the DoSomething() method, I have to write 10 lines of code instead of 2. Given that I'll be using my passed object often, one can clearly see the side effects of using such a model.
I think C# should have some construct to allow me to accomplish a similar task without writing extra lines of code; if not interfaces, then maybe something like C unions. What do you guys think?
---------------------------
He who knows that enough is enough will always have enough.
-Lao Tsu
|
|
|
|
|