|
Crystal Reports really isn't suited to this purpose anyway, and it would be overkill to deploy (there's several Merge Modules (if you're using a Windows Installer package) to distribute and you need a developer key).
There's three options when printing anything (including fix-width paragraphs for text): reduce the size of the object; crop the object; display the object on multiple pages.
Obviously the first two options are out since you care about the true size of the PCB and a partial PCB wouldn't be much help.
When you handle the PrintPage event of the PrintDocument , you can query the printable portion of that page by using the PrintPageEventArgs.MarginBounds , which is size of the page minus the margins for each side (these can be changed on a page-by-page basis using the PrintDocument.QueryPageSettings , but the printer has to support that and have the right paper loaded into trays or expect is correctly using a manual feed). When you draw the image, use the PrintPageEventArgs.Graphics property and call DrawImage initially using coordinates of Point(0, 0)</cod> and <code>PrintEventArgs.MarginBounds.Size .
If you do want to scale the image, use a different overload for Graphics.DrawImage call with the appropriate arguments. Several of these will scale the image.
Be sure to read the class documentation for the PrintDocument.PrintPage event in the .NET Framework SDK. It includes an example. There are also articles you could search for and look at here on CodeProject using the search bar just below the CodeProject logo at the top of the page.
Microsoft MVP, Visual C#
My Articles
|
|
|
|
|
Still trying to wrap my head around this security stuff, I still can't seem to find a simple way to find out if I have the needed permission when running my program before I call the code that would cause the error. What I would like to do is just see if I have access at the begining of my program and if not pop up a message box and exit. I am trying using the Demand but that seems to be the wrong usage, I also tried using the IsUnrestricted() but that doesn't even seem to be true when running locally.
<br />
FileIOPermission canAccess = new FileIOPermission(FileIOPermissionAccess.Write, "C:\\");<br />
try {<br />
canAccess.Demand()<br />
}<br />
catch {<br />
MessageBox.Show "Don't have permissions";<br />
}<br />
Is there another way to go about this?
|
|
|
|
|
You don't need to check, really. An exception will be thrown if you don't have the permission. Also, you can't demand a permission if you don't have it (it's more of a check, really). Such checks are handy when you want to know ahead of time if you can do something or not.
If you need that permission, it must be granted by a code group with an associated permission set (either custom or one of the pre-configured sets, like FullTrust), and the evidence gathered for your assembly must match the membership condition used for that code group (otherwise the code group policy isn't applied and your assembly (/assemblies) aren't granted the permission set you'd expect.
You've got the right idea, though.
Microsoft MVP, Visual C#
My Articles
|
|
|
|
|
Thats what is getting me confused, The .Demand doesn't throw an exception but when I actually try to modify the file then it throws a security exception.
This is some of the test code I have in my program now (that's to test stuff)
<br />
FileIOPermission canAccess = new FileIOPermission(FileIOPermissionAccess.Write, "C:\\");<br />
try {<br />
canAccess.Demand();<br />
File.Delete(cmdArgs[0]);
}<br />
catch {<br />
}<br />
I would expect the .Demand() call to throw the exception but it doesn't, I get the security error when calling File.Delete, which doesn't make sense... (I also tried replacing Write with AllAccess)
The reason I want to run a "pre-check" like this is the delete/renaming stuff doesn't occur until 15 seconds or so in the program so I don't want to make the user wait 15 seconds just to find out that they can't do anything because the code isn't running with the proper permissions.
P.S. The SecurityException message that is thrown is: "Request for the permission of type System.Security.Permissions.FileIOPermission, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 failed."
|
|
|
|
|
That's a good scenario for a "pre-check"!
The problem is that, as the documentation states, Demand checks callers higher in the stack. While all callers higher in the stack may have the permission, you may not. So, lets say you add this code in an event handler you've assigned to an event defined in the BCL assemblies (like handling Button.Click or something). Invoking the delegate (your handler) happens from the BCL. Those assemblies would have FullTrust permissions, but you might not.
Now, when you simply call File.Delete , you become the caller and don't have that permission, so the SecurityException is thrown.
A simple work-around is to attempt to create a dummy file (and delete it, if successful). If you can't write the file, you won't be able to delete a file (well, at least from the CLR's perspective).
Microsoft MVP, Visual C#
My Articles
|
|
|
|
|
Hi,
I need to run an Expect script (Expect for Windows of course) from managed code. By "run a script" I mean link (dynamically load) the Tcl and Expect libs (DLLs), create a Tcl_Interp and pass it the script to run.
At a high level what does this involve? Can I load (at runtime) the Tcl and Expect DLLs from "unsafe" code? What's the best way to do this?
TIA,
Matt
|
|
|
|
|
Technically, the CLR loads them. What you can do in C# (or in most managed languages) is P/Invoke the native functions, so long as the Tcl libs are resolvable (i.e., in the current process's current working directory - not the DLL's (though that may be the same as the process's current working directory) - or a directory in the PATH environment variable, the same as all executables in Windows).
See the DllImportAttribute documentation in the .NET Framework SDK, as well as Consuming Unmanaged DLL Functions[^].
When you call a P/Invoke method, the CLR loads the native library, gets the proc, pushes your arguments on the stack, and executes the function. The return value is pushed on the stack (typically; depends on calling convention) and returned by the CLR to your managed code.
So, you'll need to read the API documentation for Tcl. Chances are there'll be a setup function (to initialize the execution environment) and a function that will accept arguments (including the path to the Tcl script you want to execute). Getting the path to the Tcl script is easy: let the user specify it on the command line, using an OpenFileDialog , hard-code it (bad idea usually), or whatever.
Microsoft MVP, Visual C#
My Articles
|
|
|
|
|
Hey does anybody know how to convert an MPEG file to and AVI file??
By BigBlob202
Dinco Inc.
|
|
|
|
|
|
|
Well, he did answer your question.
Converting anything to anything is done using decoders and encoders. Microsoft DirectX does a great job of this and has a managed API for use with .NET. You can find more information about Managed DirectX 9.0b and download the DirectX runtime and managed components from http://msdn.microsoft.com/directx[^].
You chain a decoder for the MPEG (which, keep in mind, there are different codecs for MPEG) to an encoder for an AVI (again, there are many types of encoders and, in fact, AVI does not define a particular codec for either sound (if applicable) or video).
So, to provide you with any examples, it really helps to know exactly what you want to do, because there are so many ways of doing this. Besides, do you really need to write a program to do this? There are tons of free applications on the 'net that already do this, and even the DirectX SDK includes a utility (GraphEdit) that lets you link decoders and encoders (as well as DMOs and other handy utility classes) and do whatever you want (with what's installed on your system).
There are other ways to do this as well, and unless you find a simple unmanaged library that lets you do this with one or two function calls (which you can P/Invoke in C#), they won't be easy to use. .NET is just too high-level to do stuff like this easily (unless you were to write a mixed-mode Managed C++ project that calls native functionality from a managed execution environment which can be used by any other managed language projects, like those in C# and VB.NET).
Microsoft MVP, Visual C#
My Articles
|
|
|
|
|
Hello, I'm writing a small application in which a draw onto a panel and want to control the painting on the panel with the arrow keys (think of it as a painting program with the keys instead of mouse if you wish..)
Now the thing is, from what I figure the Panel can't gain keyboard focus. So I would need some other way to retrieve the key events. What do I do? Place a dummy control somewher, hide it, give it keyb. focus and then reacts on the events from there?
A better solution? If so please tell me the 'right' way to do it..
/Bjorn
|
|
|
|
|
Is it possible for you to use a UserControl rather than a panel? That would solve your keyboard input problem.
Karl Baum
CEO of KGB Technologies
Specializing in custom software development.
|
|
|
|
|
Yes it's most certainly possible, thanks for the suggestion. But just out of interest, would there be a way to do it even with a panel control? And if so, how?
|
|
|
|
|
The only thing I can think of is to have the form that the panel is on receive the keyboard events. Then it could call functions that cause your panel to do appropriate things.
Karl Baum
CEO of KGB Technologies
Specializing in custom software development.
|
|
|
|
|
Hi Guys...
My Name Is Hani And I'm a New Member 2 Code Project..
I'm Planing 2 Develop A Buetooth Application On My PC Wich Can Allocate All The BT Devices Around, Send & Receive text msgs From Them & Catch This txt msg To Work On It.!!
Do Any 1 Knows How To Deal With My (MSI BT USB) connected To My PC In My Code(C#.net Or VB.net)..?
I Need 2 Know How To Start..!
Is There Any SDK To Use..? IF Yes, Where Can I Get It..?
Please Any Pice Of Clear Code And Steps Will Be Helpfull..!!
Thx 4 Listening And I'm Waiting 2 Hear From You ASAP.
Thx Again
Regards 2 u All.. )
|
|
|
|
|
A five second search on MSDN for "bluetooth" netted:
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/bluetooth/bluetooth/about_bluetooth.asp
|
|
|
|
|
Posting you messages in multiple forums at the same time is considered very rude, so please don't.
RageInTheMachine9532
"...a pungent, ghastly, stinky piece of cheese!" -- The Roaming Gnome
|
|
|
|
|
i want to implement a personal firewall
with packet filtering api's but i dont want
to just filtering packets iwant do some more
works like other firewalls
1-i want to notify the user when
a program try to access to internet do you think
is there any event in .net or in windows for this
purpose and if there is which events
2- i want to see all open ports in mycompuetr
somthing like netstat command in windows but iwant
do this programmatically
3-if i saw a port is open how can i close it
programmatically
koosha
|
|
|
|
|
|
Most, if not all, firewall programs work by using an NDIS Hook to (in simplified terms) see all the packets fly through the network adapter. They get a chance to examine every packet that passes through and can optionally pass the packet to the network adapter (on the way out) or pass it on to Windows (on the way in). A firewall works by just dropping any packet it doesn't like the look of.
In answer to #3. If you want to close a port then all you need to do in your NDIS Hooked code is to block any packets on that port. As you examine every packet as is passed through, this means that you just don't pass the packed on the ports you want closed.
"You can have everything in life you want if you will just help enough other people get what they want." --Zig Ziglar
The Second EuroCPian Event will be in Brussels on the 4th of September
Can't manage to P/Invoke that Win32 API in .NET? Why not do interop the wiki way!
My Blog
|
|
|
|
|
Really i thought that using the hook would wind up degrading performance, and that a seperate socket layer was used. Interesting thanks
Discovery consist of seeing what everybody has seen and thinking what nobody has thought -- Albert Szent-Györgyi
Name the greatest of all the inventors: accident --Mark Twain
|
|
|
|
|
I've created a user control and added a designer for it so I can add some custom code that will setup the form to work with the control. Problem is, I have keep track of the number of these controls that have been created. Reason is that I need to display them in a certain order. So, let my control be called jControl... then I need to generate something like the following: jControlsCollection.Add(jControlk.layered ? jControlk.layer : k); This way, I can draw the jControls in the order that they are created in the designer if I want, or set some layer that they should appear on. I have the code to put the code into the forms document, but don't have a way to get k(the kth control that I just created in the designer).
Also, while debugging my designer, I've noticed that: public override object Serialize(IDesignerSerializationManager manager, object value); gets called just about any time some happens to the control... even when the control is deleted... so I need a way to tell what happend to the control(like when it was first constructed(maybe by using a constructor, not sure... I don't know much about what I'm doing... just what I want to do ;/). I can't seem to find much information on it, and the info that is doesn't go into much detail about what I want to do.
Anways, any help would be appreciated! Thanks, JS
P.S. How can I generate code for the controls only once. Basically, I would like to setup my form to use the controls(declare a jControlsCollection and add the controls to it). i.e. generate the code for only once and only if there is atleast one jControl on the form).
|
|
|
|
|
The fact of the matter is that you can't control how the designer does things, only how it interacts with your code. In fact, in many of the more well-written topics in the .NET Framework SDK covering design-time functionality, this is basically stated.
Serialize is called on any container being designed (if applicable) when anything happens because the source code must be kept in-sync.
The fortunate thing is that controls are instantiated as they would be at runtime by the designer. If you want to keep track of information about a control (such as how many are created), then add a static field (probably a private static field) and increment that in your constructor. You can also decrement that in the finalizer (written in descructor notation as ~<classname()> ) or implement IDisposable , which the designer should call when done with your object (you can never be gauranteed of when the finalizer is called by the GC).
Still, though, a collection (ICollection implementation, presumably) has a Count property. The kth element is Count - 1 . Why can't you use that for whatever you're doing? And the order of the controls if the order in which they were added (unless you inserted a control before the end of the collection, of course).
Microsoft MVP, Visual C#
My Articles
|
|
|
|
|
well, I tried to messa round with that stuff and doesn't seem to work(For me atleast, I just started recoding after a couple of years and I'm not up to par at the moment). I've tried that static method and problem is, constructor is called even when deleted the control. I've tried the IDisposable, but not sure how it works(seems to not be called all the time or sometimes to many times(used code reference from .NET sdk). The only thing that seems to be consistant is that the serializer gets called each time and for all controls when one is added or deleted to the form design(so, when I add the 4th control, it will call serializer 4 times). I got all this through debugging.
Heres what I need to do(create designer to generate):
// Is created only when one or more jControl's exist
// Is deleted when there are no jControl's
jControlsCollection jControls = new jControlsCollection();
//
// jControlk
//
// The next lines are generated by the base serializer
this.jControlk = new ns_jControl.jControl();
this.jControlk.Location = new System.Drawing.Point(56, 32);
this.jControlk.Name = "jControl1";
this.jControlk.Size = new System.Drawing.Size(112, 96);
this.jControlk.TabIndex = 0;
// I want to add this line
// the problem being, how do I figure how what k is in my code generator
// Only way I can think of is by extracting it from one of the previous code statements
// But that seems like a hack to me, and theres gotta be a better way...
this.jControls.Add(this.jControlk)
P.S. I know it can be done because the default code generator does it. It adds "this.SuspendLayout();" only once.
|
|
|
|
|