|
|
"[a-z|A-Z]" will match on any string that contains any alphabetic characters, including something like "123456a789". If you want to have the whole string pass or fail, bracket the regex with ^ (beginning of string) and $ (end of string).
Also, unless you want to match one - and only one - character, you should specify the length of the intended match. * match zero or more occurances, + matches one or more, and {#, #} matches a given number of matches (for instance {1, 4} will match if there are at least one, but no more than four occurances).
So, if I'm correct in my understanding that you want to match "A", "ABC" and "abcDED", but not "", "ab c" or "abc123", you'd use something like "^[a-zA-Z]+$". (Note that the pipe isn't nessecary in this case).
As an aside, you don't need to call ToString on the Text property, as it is already a string.
Charlie
if(!curlies){ return; }
|
|
|
|
|
Charlie Williams wrote:
So, if I'm correct in my understanding that you want to match "A", "ABC" and "abcDED", but not "", "ab c" or "abc123", you'd use something like "^[a-zA-Z]+$". (Note that the pipe isn't nessecary in this case).
You are absolutely correct and I appreciate your help!
Charlie Williams wrote:
As an aside, you don't need to call ToString on the Text property, as it is already a string.
I'm just anal that way sometimes. I can't control myself...
Thanks again!
Paul Lyons, CCPL Certified Code Project Lurker
|
|
|
|
|
FYI, the | is not necessary. You simply need [a-zA-Z].
This posting is provided "AS IS" with no warranties, and confers no rights.
Software Design Engineer
Developer Division Sustained Engineering
Microsoft
[My Articles] [My Blog]
|
|
|
|
|
Heath Stewart wrote:
FYI, the | is not necessary. You simply need [a-zA-Z].
You are correct, and I mentioned it wasn't required in my answer. I was quoting the OPs regex in the first line.
Charlie
if(!curlies){ return; }
|
|
|
|
|
Hi guys,
Basically i want to convert the System.Drawing.Image object which is created from BitMap basically from a bit map file to another Image Object of JPEG format. I dont want to use the files for saving intermediately.
can u guys help me in this regard?
thanks,
vinod
|
|
|
|
|
It's as simple as calling the Save method on the Image object.
Image img = Image.FromFile(@"C:\SomeDir\SomeImage.bmp");
if(img != null)
img.Save(@"C:\SomeDir\SomeImage.jpg");
- Nick Parker My Blog | My Articles
|
|
|
|
|
Hi Nick,
i dont want to save to another file. I want an image object of jpeg format without saving. Thats what i need.
eligeti
|
|
|
|
|
|
Then just modify Nick's example to save to a MemoryStream instead of a filename.
Keep in mind, however, that whenever you read in an image a bitmap (in the general sense) exists in memory. Some functionality does not work for indexed images, however, because they maintain a separate palette and work a little different.
So, once you've read, say, a .bmp file into a Bitmap object you've it doesn't matter in what format it is, really. To what end is "saving" (or re-encoding) the image if the in-memory data is still the same?
If you're trying to read EXIF headers from a JPEG, then you'll need to re-encode and save it to a MemoryStream so that you can read the headers manually. If that's what you're trying to do, also keep in mind that the .NET Framework has limited support for EXIF already. See the PropertyItem class and the Image.PropertyItems property in the .NET Framework SDK for more information.
This posting is provided "AS IS" with no warranties, and confers no rights.
Software Design Engineer
Developer Division Sustained Engineering
Microsoft
[My Articles] [My Blog]
|
|
|
|
|
Use the overload of the Save method that accepts a Stream and an ImageFormat as parameters. You can then call Image.FromStream to retrieve the new Image .
Charlie
if(!curlies){ return; }
|
|
|
|
|
I would like to have a thread that runs only when the system is idle, and yields when other threads are ready to run. How could I do this?
Thanks
|
|
|
|
|
There is a way to do "idle time processing" but in general, you really want your threads "compartmentalized". That is you want them to stay out of each others way. Each thread of execution should be able to run concurrently without interferring with another or you'll get "very bad behavior".
When you say "yield" do you mean you want to have a thread suspend? This is often unnecessary and causes major threading and debugging issues (threads telling other threads to suspend is a classic way to get into a deadlock). You can preempt the current thread by doing Thread.Sleep(0) .
In any event, look at the Application.Idle event if you want to do something when the application thinks it is idle. I highly recommend you do not count on this though. Instead construct a custom thread safe queue or use the one provided by the .Net Framework where you feed in "work" that gets completed in another thread. Without knowing more of your application there is little reason to suspend any thread. If a thread "resource intensive" that is a completely different problem that won't be solved by idle time processing.
|
|
|
|
|
My application is a realtime system. Frome time to time, I need to save data to disk without slowing down the whole system. That is why I am thinking of "idle time processing". If I use Thread.Sleep(0) in the thread, how do I know when to sleep? Do you mean I insert the sleep(0) in between the saving code?
Another question is that if I don't use Application.Idle how could I know when to start the saving thread?
Thanks
|
|
|
|
|
Hi,
there another way of doing this. There is something called system hooks in windows. ur application needs to hook into windows to get events. and one of this events includes WH_FOREGROUNDIDLE gets fired when the system is idle.
check the link http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dnwui/html/msdn_hooks32.asp
it explains clearly how u can write hooks. pretty simple and yet such an effective way to do. remember it is highly recommended that u use the system hooks very cautiously.
hope this helps u
eligeti
|
|
|
|
|
Thank you. I read the link, and it seems that WH_FOREGROUNDIDLE only applies to foreground thread. The realtime system I talked about runs in the background. Maybe what I could do is to lower the saving thread's priority and let it sleep from time to time?
|
|
|
|
|
It should be noted that Windows is not a realtime OS and .Net is not a realtime API framework and will not respond properly if you need true realtime behavior in your threading and processing. If you need true realtime behavior you need to find another system.
Beyond this, without actually knowing percisely what you are trying to do I can only guess as to what to do or are trying to do. If you need to save perodically use a custom built threaded queue or use ThreadPool to spawn new threads to save data. You don't want to suspend saving in the middle or you'll have messed up data in the context before and after the suspend which means that this will break any realtime response.
As for using Application.Idle :
private void idle(object sender,EventArgs e)
{
System.Threading.ThreadPool.QueueUserWorkItem(new WaitCallback(SaveStuff), stuff))
}
private static void SaveStuff(object state)
{
SaveStateStuff stuff = state as SaveStateStuff;
stuff.Save();
}
* this assumes SaveStateStuff is MT safe.
|
|
|
|
|
Hi,
I'm new to C# and I'm stuck with a problem
I'm trying to write a vector-based drawing program but I don't know how to scale the shapes or move them by the mouse..
I've used the serialization way to draw objects, as Budi Kuraniwan's tutorial in O'Reilly Network
http://www.oreillynet.com/lpt/a/2495[^]
My main question is how to manipulate shapes' properties from its array?
Like pen width, colour, size and position
If I change a shape property using the matrix statement, it doesn’t delete the old shape..
How to delete shapes from my draw area without clearing the whole page?
And how to Hit Test.. And select objects?
I've found an example in The Code Project website (Draw Tools) but its too complicated for a beginner like me..
http://www.codeproject.com/csharp/DrawTools.asp[^]
I’m trying to do a similar application
Thank you!
|
|
|
|
|
This is a simple matter of abstraction. You define a general Shape class, for example, from which each shape derives. On that you define general properties like the bounding rectangle, perhaps an ID, connection points, etc.
To move those shapes your container, or drawing surface, need to handle the MouseDown , MouseMove , and MouseUp events. When a user clicks, you use the coordinates and loop through the array finding the shape that contains those coordinates (the Rectangle.Contains method is handy in this case). While the mouse is down (use a simple state variable that gets reset in your MouseUp handler) change the location of the image as the user drags.
You extend a base class because you can implement helper methods in a single class. The container just needs to worry about positioning and sizing while the shapes worry about drawing themselves (the dumber the container is, the more extensible your solution is).
To scale individual images you need to implement functionality in either the shape or the container to size it. You can use the mouse techniques above to do that as well. Define a threshold and when the mouse is within that threshold and near the edge of a shape you can resize it. If you want to resize the whole drawing surface, you can apply a scale transform in your OnPaint override using the Graphics.ScaleTransform method.
This is not an easy subject and I recommend you start off with basic functionality. If the article you found is too complicated (welcome to the reality of application development) then I suggest picking up some object-oriented development books or reading additional articles. Eventually it will start making sense.
Be sure to read, however, because just using IntelliSense like I see far too many people doing in lieu of reading documentation won't teach you anything. When someone mentions classes, methods, properties, etc. that you're not familiar with (like I did above several times) find them in the .NET Framework SDK that is installed by default with VS.NET and is available online at http://msdn.microsoft.com/library[^] and read about them.
This posting is provided "AS IS" with no warranties, and confers no rights.
Software Design Engineer
Developer Division Sustained Engineering
Microsoft
[My Articles] [My Blog]
|
|
|
|
|
Hi folks,
My class library calls for me to constantly parse information sent to me by a server, and to do that I am currently using Socket.BeginReceive and Socket.EndReceive for my needs.
This is working fine. The only problem I am having is the threading design issues.
Whenever information comes in from the server I parse it and fire appropriate events based on the information received. The issue is that these events are fired using the worker thread that my callback was invoked on, not the client thread.
The question I'm asking is should I be taking steps to ensure that all of my events are being fired on the main client thread? If so, how? Or should I be looking at a different design altogether?
I would appreciate any advice anyone could offer
Thanks!
This space for rent!
My Blog
|
|
|
|
|
It depends on what you are doing when handling the events. If you want to show the status in your GUI you should not directly change it from a different thread than the one in which the GUI was created. To perform this and cross the thread borders look at the documentation of the function Control.Invoke. If no GUI is affected there is (in my opinion) no necessisty to make those changes. Just make sure everything is synchronized
|
|
|
|
|
Just a small addition to the previous answer:
Also take a look at the InvokeRequired property of the Control class, which helps to determine whether an invoke method must be called or not.
www.troschuetz.de
|
|
|
|
|
I looked at ISynchronizeInvoke, but I wasn't sure if it would meet my needs because I don't know if the objects of the class libray will be called from the UI thread or another thread. The library will be freely distributable, so I can't assume it will always be used from a UI thread.
Thanks for your comments!
This space for rent!
My Blog
|
|
|
|
|
The following code snippet:
private void OnMouseMove(object sender, MouseEventArgs e)
{
if (dragging)
{
string[] filenames=new string[] {dragImageFilename};
DataObject data=new DataObject(DataFormats.FileDrop, filenames);
((Control)sender).DoDragDrop(data, DragDropEffects.Copy);
dragging=false;
}
}
Behaves strangely. If I drop the object on the originating form (something I'm going to disallow later) then the DragEventArgs.Data is of type SystemWindows.Forms.DataObject and all is happy.
If I drag the object onto another instance of the exact same application, then DragEventArgs.Data is of type System.__ComObject.
The code that handles the drop does this:
Array data=((DataObject)e.Data).GetData("FileDrop") as Array;
Expecting a DataObject for e.Data. How do send/receive the data so that it's a DataObject and not a ComObject?
Thanks!
Marc
MyXaml
Advanced Unit Testing
|
|
|
|
|
"__ComObject" is an internal class of the mscorelib. Im not 100% sure but I think its a COM wrapper for the remoting mechanisms of .Net. It inherits from "MarshalByRefObject" so its probably the best way to first cast your data into this class and try to go further from here.
But this is probably more than you want to achieve. I think you dont want to do remote calls between your two application instances - just pass some data. You should probably pass the data in some binary - or even better XML - format and make the serialization and deserialization by yourself.
|
|
|
|