|
are you talking about two EXE files, hence interprocess communication?
or different parts of a single process, maybe an application with plug-ins?
and the existing program is a .NET one, you have the code, and will be able and allowed to modify it once?
Luc Pattyn [Forum Guidelines] [Why QA sucks] [My Articles]
I only read formatted code with indentation, so please use PRE tags for code snippets.
I'm not participating in frackin' Q&A, so if you want my opinion, ask away in a real forum (or on my profile page).
|
|
|
|
|
Luc,
I'm open to whatever would work, two .EXE's or whatever. A friend suggested using DLL's for the "slave" routines, but I don't know if there is a method for run-time setting the call name of a DLL at run time in the supervisory program that once established, I don't want to change.
Yes, the existing program is .NET and I would modify it to call sending/receiving arrays of data in a standardized format.
Thanks,
|
|
|
|
|
OK,
I find having only one EXE simpler, so I would suggest a plog-in scheme. This is how it could be made to work:
- you take the existing code, add some, and create the EXE; that is one project.
- you define an Interface, which basically is a contract describing the methods and parameters all the plug-ins must offer.
- for one or more plug-ins, you create a DLL project, implementing the required functionality.
- in the main program, you add detect logic, select logic, and call logic.
The detect logic could be: all DLL files in a particular subfolder, say "plugins".
The select logic is up to you, it could be a Menu, a ComboBox, or whatever, populated with the names of the DLL files (assuming those are relevant); a more complex scheme would require you load those "assemblies", execute some code to get the types they implement, and call some method/property on them to get a display name, with which you populate the GUI.
The call logic would require some "reflection" code, look at Activator.CreateInstance()
I did not immediately find a relevant article that is based on VB.NET; however there are several with C#, here[^] is one (haven't read it though); the principles should be exactly the same, basically the only difference is syntactic.
I hope this gets you started.
Luc Pattyn [Forum Guidelines] [Why QA sucks] [My Articles]
I only read formatted code with indentation, so please use PRE tags for code snippets.
I'm not participating in frackin' Q&A, so if you want my opinion, ask away in a real forum (or on my profile page).
|
|
|
|
|
OK, Luc, thanks a lot. This is pretty much what I was looking for. I'll work on getting a test case going.
|
|
|
|
|
Hi,
I need to limit the user to only entering integers (positive and negative) into a textbox.
Now I know the trick with the KeyPress event and e.KeyChar , to limit the user to entering only numbers into a textbox, and with CChar("-") I can check for the minus sign.
The problem is, how do I make sure that when entered, the minus sign is always in first place?
Is it possible to check for the index position of the caret ?
Or am I going about this in an overly complicated fashion ?
My advice is free, and you may get what you paid for.
|
|
|
|
|
You can check the position of a specific character in the text box by calling indexOf on the control. Then check it is only at position 1. You will also want to check that it doesn't already have one by calling contains .
You will also need to do the same thing for a decimal point. (if it is the first character entered, then good practice is to prefix the textbox with a 0, so the dp is more visible.
And as you say you already know about the the keypress and keychar, I tend to use the keydown event, but it upto you how you want to do things.
|
|
|
|
|
I had thought of this solution as well, but I had a silent hope that maybe I could do the checking In Flagrante Delicto so to speak, instead of after the minus sign has been entered already.
I mean, during the KeyPress (or indeed KeyDown) event the key has not actually been entered yet, so I can't check for its index yet (right?).
My advice is free, and you may get what you paid for.
|
|
|
|
|
In that situation you can check for the length of myTextBox.Text , if it is greater than zero, don't allow the minus.
Henry Minute
Do not read medical books! You could die of a misprint. - Mark Twain
Girl: (staring) "Why do you need an icy cucumber?"
“I want to report a fraud. The government is lying to us all.”
Why do programmers often confuse Halloween and Christmas?
Because 31 Oct = 25 Dec.
|
|
|
|
|
Tried that (and it works, thanks), but yet another but: I would like for the user to be able to enter a number and then add the minus sign afterward (but only at the beginning of the text of course).
So I suppose I am back to finding the index where the new character is going to be entered.
My advice is free, and you may get what you paid for.
|
|
|
|
|
IMO you can't check validity of user input by only watching which keys get presses; unless you are willing to not support pasting. A good user interface IMO will always support copy and paste, and the clipboard could contain arbitrary text.
So you could:
- save the content before the modification
- read the content after modification
- validate it (int.TryParse could be appropriate)
- when not valid, restore the last saved content that was valid
Warning: this gets tricky when intermediate values don't have a valid syntax, e.g. when you want to accept floating-point numbers in engineering format.
Luc Pattyn [Forum Guidelines] [Why QA sucks] [My Articles]
I only read formatted code with indentation, so please use PRE tags for code snippets.
I'm not participating in frackin' Q&A, so if you want my opinion, ask away in a real forum (or on my profile page).
|
|
|
|
|
Generally speaking, and in terms of best practices and such, you are of course entirely right. And I suppose I will be doing it your way in the end.
But I don't have to like it
In this case I am handling a form with a bunch of textboxes, each representing a setting. Each setting is simply a value between -999 and 999, and won't be changed much.
I suppose I am trusting the users to be lazy enough to not go through the trouble of copying and pasting such a short value.
So I limited the max length to 3 (which brings to mind another problem), and I handle their KeyPress events to limit input to numbers.
Anyway, now it is more a matter of interest than necessity. In other words can it be done?
My advice is free, and you may get what you paid for.
|
|
|
|
|
of course it can be done.
Assuming SelectionLength is zero, you would need TextBox.SelectionStart to know where the caret is, so you can perform the insert/append yourself, validate and then allow/disallow the keypress to be handled.
And when SelectionLength isn't zero, the new character will replace all the ones selected; and you could handle that too.
But is it all worth it?
The popular approach is:
- to only allow characters that could appear somewhere in the input
- to validate afterwards
So yes a minus sign is allowed, so KeyPressed accepts it; and no, it is not acceptable but as the first character, so int.TryParse() will make sure of that in the end.
And then some people will advise to use a NumericUpDown thingy; I'm not one of them, as I find those controls horribly user-unfriendly.
Luc Pattyn [Forum Guidelines] [Why QA sucks] [My Articles]
I only read formatted code with indentation, so please use PRE tags for code snippets.
I'm not participating in frackin' Q&A, so if you want my opinion, ask away in a real forum (or on my profile page).
|
|
|
|
|
You can always use a MaskedTextBox or a NumericUpDown, and use those controls internal validation.
|
|
|
|
|
This thread must rate as one of the most asked questions on CodeProject, and Dave's[^] was the best answer.
What is it that ties people to text boxes, when the NumericUpDown is designed out of the box to handle numbers only, and ranges for that matter? [Sorry: mini rant there, having seen the same question to many times]
If the control you are using doesn't do the job, maybe you are using the wrong control.
|
|
|
|
|
Don't worry, by all means, rant away.
Just checked the numeric updown control, and although it does what Luc suggested, about going back to the last valid value, it doesn't do what I was after.
In other words, indeed it efficiently corrects bad input, but it doesn't prevent it right from the bat, which was what I was interested in solving. I must admit I haven't really investigated the masked textbox though.
My advice is free, and you may get what you paid for.
|
|
|
|
|
Don't know how your getting on, but i have just been playing this afternoon trying to write a function to see if it can be done
This appears to work, and caters for various, minus and 0 entry perms.
e.g. if you enter 0 then 1, the leading 0 is binned.
e.g. if you enter 111 then a -, it will change it to -111
it won't allow 0000
Private Sub TextBox1_KeyDown(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles TextBox1.KeyDown
Dim tb As TextBox = CType(sender, TextBox)
Select Case e.KeyCode
Case Keys.Decimal, Keys.OemPeriod
If tb.Text.Contains(".") Then
e.SuppressKeyPress = True
Else
If tb.TextLength = 0 Then
tb.Text = "0" & tb.Text
tb.SelectionStart = tb.TextLength
ElseIf tb.TextLength = 1 And tb.Text.StartsWith("-") Then
tb.Text = "-0"
tb.SelectionStart = tb.TextLength
End If
End If
Case Keys.Subtract, Keys.OemMinus
If tb.Text.Contains("-") Then
e.SuppressKeyPress = True
Else
If tb.TextLength >= 1 Then
tb.Text = "-" & tb.Text
tb.SelectionStart = tb.TextLength
e.SuppressKeyPress = True
End If
End If
Case Keys.Back, Keys.Delete, Keys.Left, Keys.Right
e.SuppressKeyPress = False
Case Else
If Not IsNumeric(Chr(e.KeyValue)) Then
e.SuppressKeyPress = True
Else
If (e.KeyCode = Keys.D0 Or e.KeyCode = Keys.NumPad0) Then
If tb.Text.Contains("0") And Not tb.Text.Contains(".") Then
If Val(tb.Text) = 0 Then e.SuppressKeyPress = True
End If
Else
If tb.Text.Contains(".") = False And tb.Text.Contains("0") Then
If Val(tb.Text) = 0 Then
tb.Text = tb.Text.Remove(tb.Text.IndexOf("0"), 1)
tb.SelectionStart = tb.TextLength
End If
End If
End If
End If
End Select
End Sub
|
|
|
|
|
That is a lot of code for a very subjective set of validity rules.
I think you are ignoring the current selection; if anything is selected, typing would replace it.
And I still want to paste something into the control!
So I'd go for a second, hidden control in the KeyDown handler, which deals with the editing, then apply whatever rules (or TryParse) to the content (not the latest change) to determine validity.
Luc Pattyn [Forum Guidelines] [Why QA sucks] [My Articles]
I only read formatted code with indentation, so please use PRE tags for code snippets.
I'm not participating in frackin' Q&A, so if you want my opinion, ask away in a real forum (or on my profile page).
|
|
|
|
|
i know, i know, i was just playing though!
It maybe doesn't meet your needs, but it might (unlikely) fit Johans, failing that it may give him ideas of how to come up with his own validation requirements to meet his own needs.
i'm going for chocolate, irn-bru and a ciggy now.
|
|
|
|
|
Enjoy.
Luc Pattyn [Forum Guidelines] [Why QA sucks] [My Articles]
I only read formatted code with indentation, so please use PRE tags for code snippets.
I'm not participating in frackin' Q&A, so if you want my opinion, ask away in a real forum (or on my profile page).
|
|
|
|
|
Very nice indeed. I hadn't considered the multiple zero, and leading zero scenarios yet, good catch.
Now I haven't bothered (yet) checking for decimal separators, as I was looking to limit to whole integers, so using Luc's advice, I got this:
In a generic KeyPress event that handles all textboxes:
Select Case True
Case e.KeyChar = CChar("-")
If sender.SelectionStart > 0 Or sender.Text.Contains("-") Then
e.Handled = True
End If
Case Not Char.IsDigit(e.KeyChar)
e.Handled = True
End Select
...and in a generic Leave event that handles all textboxes:
If sender.text.length < 1 Or sender.text = "0" Or sender.text = "-" Then
MsgBox("The field may not be empty, and the value may not be zero or just minus.", MsgBoxStyle.Critical)
sender.text = "1"
sender.focus()
End If
Now that you made me aware of it, I think I'll just use the Leave event to drop leading zeros and check for multiple-zeros-only.
My advice is free, and you may get what you paid for.
|
|
|
|
|
Hello my favorite forum!
I have problem i have converted vb6 code to vb.net its a application for images...
and i have problem with Image descriptor to picturebox to image to bitmap??? not shure...
i have:
Structure imgdes
Dim ibuff As Integer
Dim stx As Integer
Dim sty As Integer
Dim endx As Integer
Dim endy As Integer
Dim buffwidth As Integer
Dim palette As Integer
Dim colors As Integer
Dim imgtype As Integer
Dim bmh As Integer
Dim hBitmap As Integer
End Structure
Structure GUID
Dim Data1 As Integer
Dim Data2 As Short
Dim Data3 As Short
'Dim Data4() As Byte
<VBFixedArray(7)> Dim Data4() As Byte
'UPGRADE_TODO: "Initialize" must be called to initialize instances of this structure. Click for more: 'ms-help://MS.VSCC.v90/dv_commoner/local/redirect.htm?keyword="B4BFF9E0-8631-45CF-910E-62AB3970F27B"'
Public Sub InitializeMe()
ReDim Data4(7)
End Sub
End Structure
Public Function image_to_picturebox(ByRef srceimg As imgdes) As System.Drawing.Image
Dim rcode As Object
Dim retval As Integer
Dim Pic As New PicBmp
' IPicture requires a reference to "Standard OLE Types."
' in VB6 Select: Project, References, and check OLE Automation
Dim IPic As System.Drawing.Image
'UPGRADE_WARNING: Arrays in structure IID_IDispatch may need to be initialized before they can be used. Click for more: 'ms-help:
Dim IID_IDispatch As New GUID
Dim tempimage As imgdes
If (srceimg.hBitmap = 0) Then
' We have a packed dib, gotta make it a dib section-type of image
'UPGRADE_WARNING: Couldn't resolve default property of object rcode. Click for more: 'ms-help:
rcode = dibtoimage(srceimg.bmh, tempimage)
'UPGRADE_WARNING: Couldn't resolve default property of object rcode. Click for more: 'ms-help://MS.VSCC.v90/dv_commoner/local/redirect.htm?keyword="6A50421D-15FE-4896-8A1B-2EC21E9037B2"'
If rcode = NO_ERROR Then
' Replace previous image
freeimage(srceimg)
copyimgdes(tempimage, srceimg)
End If
End If
' Fill in with IDispatch Interface ID.
IID_IDispatch.InitializeMe()
With IID_IDispatch
.Data1 = &H20400
.Data4(0) = &HC0
.Data4(7) = &H46
End With
' Fill Pic with necessary parts.
With Pic
.Size = Len(Pic) ' Length of structure.
.Type = 1 ' Type of Picture (bitmap).
.hBmp = srceimg.hBitmap ' Handle to bitmap.
.hPal = 0 ' Handle to palette (may be null).
End With
' Create Picture object.
retval = OleCreatePictureIndirect(Pic, IID_IDispatch, 1, IPic)
'MsgBox(retval.ToString)
If (retval = 0) Then
image_to_picturebox = IPic
Else
image_to_picturebox = My.Resources.notavi
End If
End Function
Declare Function OleCreatePictureIndirect Lib "olepro32.dll" (ByRef PicDesc As PicBmp, ByRef RefIID As GUID, ByVal fPictureOwnsHandle As Integer, ByRef IPic As System.Drawing.Image) As Integer
and the problem is that "retval = OleCreatePictureIndirect(Pic, IID_IDispatch, 1, IPic)" returns -2147467262 and should return 0 but i dont think its problem with OleCreatePictureIndirect!
i think its problem somewhere in IID_IDispatch or Pic can annyone help?
i left all those update comments from microsoft so maybe it can be helpful?!?
Thanks
|
|
|
|
|
First of all, what exactly are you trying to do?
There may be much better ways to do it now with managed code, rather than trying to upgrade old VB6 codebase.
|
|
|
|
|
hi Dave!
daveauld wrote: First of all, what exactly are you trying to do?
this is vb6 application http://rapidshare.com/files/389129825/compar.zip.html[^] and i need the compare two images in my application like i would with this application! this is the easiest way i explain...
daveauld wrote: There may be much better ways to do it now with managed code, rather than trying to upgrade old VB6 codebase.
i know i made mine but its to slow and i dont get good results and here i get all good with this one!
Thanks
|
|
|
|
|
sorry, but i will not download the file from the link while at work, so don't know what the applications does.
in what way are you trying to compare? visually? file content? byte by byte? pixel x pixel?
Maybe your version that runs slow just needs the implementation overhauled and maybe is doing things not required?
|
|
|
|
|
daveauld wrote: sorry, but i will not download the file from the link while at work, so don't know what the applications does.
dont worry! :P be happy...
daveauld wrote: in what way are you trying to compare? visually? file content? byte by byte? pixel x pixel?
i need visualy compare, exsample:
compare of two scanned images (exsample of small busines card), one scaned image is original and other one is a little ripped off "distroyed" and i need to detect which part is different (which part is missing) and how much percent of it! hope u understand. thats the problem with my code becose i scan pixel by pixel and scanned image have manny pixels :P and gives me nothing becose every pixel is different (i also tried to give some tolerancy for pixels but didnt success) so i want to convert that vb6 code becose it works (fast, and gives me what i need) just i dont understand in that vb6 code nothing why is using ole, guid, dispatch, imagedescriptor!?!? i only worked with bitmap, and graphics (i am new in visualy and .net drawing)
Thanks
|
|
|
|
|