Group,

I have 36 string names that I'd like to create. In general these string names can be very similar. I thought I'd try creating a loop to do this for me. But I can seem to find the correct syntax to do this. To clarify, these string names can be as simple as

name1
name2
name3
and so forth and so on.

I tried doing the following:

For i As Integer = 1 To 36
Dim line As String = Me.ToString("line" & i)
Dim txt As TextBox = Me.Controls("txbUserFld" & i)
        Using reader As StreamReader = New StreamReader("c:\BusinessBasics\miscspareflds.txt")
        line = reader.ReadLine
End Using
txt.Text = line
Next

So you understand, StreamReader is reading a .txt file that has 36 names in it. I want to display these 36 names in 36 separate TextBoxes (TextBox1 thru TextBox36). To do this I need 36 separate string names (line1 thru line36). Obviously, I can write "Dim line1 As String" thru "Dim line36 As String" and "TextBox1.Text = line1" thru "TextBox36.Text = line36". But I've got to believe there is an easier way using a loop to do this.

Thoughts?

Thanks again!

Don

If your textboxes are named TextBox1 through TextBix36 you can do

For i As Integer = 1 To 36
    Dim txt As TextBox = Me.Controls("TextBox" & i)
    txt.Text = "name" & i
Next

My suggestions for improving the code as given:

Keep only the minimum needed code inside the loop; everything else should be placed before or after the loop. In particular, move the code that opens the StreamReader before the loop. You have it restarting the file each time through the loop, reading the first line over and over. You shoud also make sure that the StreamReader has not run out of lines to read (the file could become corrupt and get shortened). Check for an end-of-file condition before reading the line; if so, get out of the loop.

Try to use variable names that 1) tell you what type they are without needing to look back at the declarations, and 2) are meaningful to what their use is in the function; intChildCount means so much more that x.

If you assign a value to a variable, use it. Avoid assigning a value to a variable and then replace that value without using the old value. See if you can eliminate a variable assignment by using the value returned by a method/proerty/function directly, instead of storing in a variable, although keeping the variables might be useful while debugging and validating that the method/function/property gave the type of information expected.

Dim txtTmp As TextBox

Using reader As StreamReader = New StreamReader("c:\BusinessBasics\miscspareflds.txt")
    For intIndex As Integer = 1 To 36
        txtTmp = Me.Controls("txbUserFld" & intIndex)
        strLine = reader.ReadLine
        txtTmp.Text = strLine
        ' Could be optimized to:
        ' Me.Controls("txbUserFld" & intIndex).Text = reader.ReadLine
    Next
End Using

Nutster,
Awesome! It worked as I planned. You make a good point regarding checking for the end of file. I'll write some logic in to set a default so it doesn't happen.

I did choose to use the following:

Using reader As StreamReader = New StreamReader("c:\BusinessBasics\miscspareflds.txt")
            For intIndex As Integer = 1 To 36
                Me.Controls("TextBox" & intIndex).Text = reader.ReadLine

Thanks again!

Don

Edited 3 Years Ago by doncwilson_1

You should not use

Me.Controls("txbUserFld" & intIndex).Text = reader.ReadLine

because Me.Controls does not return a TextBox control. It returns a reference that must be converted to a TextBox reference. You can do that by assigning it to a TextBox variable or by doing an explicit cast (which is probably the preferred way).

Comments
Quite right. I forgot about that. The generic Control needs to be cast to TextBox.

Rev. Jim/Nutster,

I've changed my syntax to the following:

Private Sub InventoryPartSetup_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

        Dim txtTmp As TextBox
        Dim strLine As String
        Using reader As StreamReader = New StreamReader("c:\BusinessBasics\miscspareflds.txt")
            For intIndex As Integer = 1 To 36
                txtTmp = Me.Controls("txbLabel" & intIndex)
                strLine = reader.ReadLine
                txtTmp.Text = strLine
            Next
        End Using

    End Sub

     Private Sub InventoryMasterBindingNavigatorSaveItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles InventoryMasterBindingNavigatorSaveItem.Click
        Me.Validate()
        Me.InventoryMasterBindingSource.EndEdit()
        Me.TableAdapterManager.UpdateAll(Me.BusinessBasicsDataSet)



    End Sub

I'm now getting a error message that is pointed at the lines "strLine = reader.ReadLine" and "txtTmp.Text = strLine" when trying to run this. The message says, "NullReferenceException was Unhandled". It offers me a couple of choices to fix: "Use the new 'keyword' to create an object instance" and "Check to determine if the object is null before calling the method". Can you share where I'm going wrong here? Does it have to do with the fact that this page is linked to a database file?

Thanks again for the help.

Don

Do you have enough lines in the file to satisfy all of the textbox reads? What do you mean by "this page is linked to a database file"?

Check that the textboxes are named properly on the form. It is looking for names txbLabel1, txbLabel2, etc., through to txbLabel36. Are the control names begin with TextBox, like you stated in the previous solution? What is the value of intIndex when the error occurs? This may indicate which control is misnamed.

Rev. Jim/Nutster,

I've confirmed that I have 36 lines within the file "c:\BusinessBasics\miscspareflds.txt" as well as 36 Textboxes that I am trying to fill. I have also confirmed that I have created "txbLabel1" through "txbLabel36" and that all are properly named. I'm not sure how to find the value of "intIndex". I've done this before, but it escapes me right now as to how to do it.

To clarify your earlier question about "this page is linked to a database file", I chose not to use "DataGridView" in displaying the data within the database. I chose to design the view using the drag and drop method via the "Data Sources" list.

Nutster, in your earlier suggestion you wrote the following code:

Dim txtTmp As TextBox

Using reader As StreamReader = New StreamReader("c:\BusinessBasics\miscspareflds.txt")
    For intIndex As Integer = 1 To 36

        txtTmp = Me.Controls("txbUserFld" & intIndex)
        strLine = reader.ReadLine
        txtTmp.Text = strLine

    Next
End Using

In this the name "strLine" was not defined through a "Dim" statement as you did with "txtTmp". I've tried defining "strLine" as a string and changing the name "txbUserFld" to "txbLabel" in an effort to try to fix this. I get the same error. Is it possible that I am defining "strLine" wrong?

If you have some code to write that will send the number of "intIndex" to the Imediate box, please send it. I do want to look there to see if I can see what may be happening.

Thanks again guys. I greatly appreciate the help.

Don

"NullReferenceException was Unhandled"

Try this Dim strLine As String = "". It's usally a good habit to initialize every variable when you declare it.

send the number of "intIndex" to the Imediate box

Debug.WriteLine(intIndex). Also you could set up a breakpoint, when your code stops, show the locals window. As you step through the code the values of the local variables will be displayed.

Edited 3 Years Ago by tinstaafl

Sorry about that, Don. I was sure I put two Dim lines at the beginning of the code I gave you. To catch if a varible is undeclared, put Option Explicit at the top of your source files; this will generate an error during compilation if a variable name is used prior to it being declared. There should be another Dim line at line 2 of my code:
Dim strLine as String
I see you put this in your code. That was exactly what was needed.

Debug.WriteLine(value) will print value on the immediate window.

As a first pass at debugging, I would set a breakpoint at the first executable line of the function (click on the first line after the Dim's press F9) and then display the Automatic window. This will display the variables that you are using in the current and last statements so can easily see what is happening. You can then step through the procedure by pressing F8 (one line at a time, diving into function calls) and Shift-F8 (one line at a time, but do not show function calls).

Initializing a variable is generally more efficient than declaring the variable and then assigning its initial value at little later, but don't bother initializing a variable if you are just going to throw away that value the first chance you get.

Group, after writing the debug code, I got the following message: "A first chance exception of type 'System.NullReferenceException' occurred in Business Basics.exe". I did not get any "intValue" as an output. I did write the line as "Debug.WriteLine(intIndex)". If it should mean anything, the statement "txtTemp.Text = strLine" (the italisized) is highlighted.

I have inserted "Option Explicit" at the top of the form. VS2010 finished it as "Option Explicit on Imports System.IO". I trust that was correct.

You've written "As a first pass at debugging, I would set a breakpoint at the first executable line of the function". I'm not sure what you mean by this or how to do it.

Thanks for the reminder on "Debug". I had forgotten that I did that frequently when taking my courses.

Thanks for the input, guys!

Don

tinstaafl, Yes. I tried it with and without the quotes. Same result. This is something of a challenge! The interesting thing is that it works on a different form perfectly. However that other form is not linked to a database. I'll ask again.... Could that be the cause?

Don

"A first chance exception of type 'System.NullReferenceException'

Don,

Most likely you have misnamed one of the Textboxes or it is not parented to the form.

Try adding the if-block shown below.

Me.Controls("something") will return either a control named "something" or Nothing (null) if the requested control does not exist in the collection.

Dim txtTmp As TextBox
Using reader As StreamReader = New StreamReader("c:\BusinessBasics\miscspareflds.txt")
    For intIndex As Integer = 1 To 36

        txtTmp = Me.Controls("txbUserFld" & intIndex)
        ' put in this 
        if txtTmp Is Nothing Then 
          msgbox("txtUserFld" & intIndex.ToString() & " not found on " & me.name)
          stop
        end if
        strLine = reader.ReadLine
        txtTmp.Text = strLine

    Next
End Using

If you are running in debug mode, this will stop execution. Do not leave the code in for the final version.

Edited 3 Years Ago by TnTinMN

TnTinMN,

Your code gave me the error. It tells me that the TextBox I'm looking for isn't on the form. And that is partially true. The TextBox is on the form, however it is within a Panel that I'm using because it needs a vertical scroll bar. This suggests that I may need some other code for it to recognize the TextBox within the panel that IS on the form!! What tangled webs I weave!

Assuming my thought process is correct, what will allow the form to recognize the panel? Something tells me I'm going to have to create a "AddHandler" sub-routine and run these commands within that. I'm I starting to think correctly here?

Don

Perhaps we are going about this all wrong. What we have been doing is trying to get this 36 textbox thing going. Why don't you tell us what you are trying to do instead of how you are trying to do it and we can try to suggest a more reasonable approach.

Rev. Jim,

I've created a form (frmInvSpareFldsSetup) that will give the end user to define 36 alpha and numeric fields to store data that will be useful primarily to them. These fields need to have a title for their reference. This form will allow them to name those 36 fields as they wish. Their names are now stored in a .txt file I've called "miscsprflds.txt". All of the writing and reading of this form from and to the text file works fine.

The second form (frmInventorPrtsSetup) will allow the user to setup their part records for the individual part numbers they require. On this form are those 36 user defined fields. Instead of using labels, I've formated 36 Textboxes to look like a label (I did this to see if my StreamReader problem was related to the labels). Because the Inventory database has a fair number of fields (I manually designed the form instead of using "DataGridView") I was required to put all of these fields within a PANEL to allow for a vertical scroll bar. I believe this is where the problem is. I suspect that the form doesn't "see" the TextBox names because it is embedded on the panel. Thus the error that I'm getting.

I hope this helps.

Don

I don't understand what you mean by the form doesn't "see" the TextBox names. Forms don't see things. How are you trying to reference a textbox inside the panel? I put a textbox in a panel and had no trouble referencing it. Did you create the textboxes ar runtime? If so then that might have been worth a mention.

Edited 3 Years Ago by Reverend Jim

Rev. Jim,

Please forgive my syntax use. But it does seem to me that for some reason, these TextBoxes aren't being recognized in some way. In the code view, you can begin to type in "txbLabel...." and these names show up in the drop down box. So the next question is, does the "Me.Controls("txbLabel" & intIndex)" make some change that makes it appear that "txbLabel1" is not there?

To clarify, these TextBoxes were installed via the GUI and not at run time. The only "different" thing I've done is a) the panel has the labels and TextBoxes that I drug from the Data Source to create the form. As well, I deleted the original 36 labels from these user defined fields and replaced them with the new TextBoxes to be used as labels. I did this because the original plan was to replace the Label.Text with the information from miscsprflds.txt.

I hope this helps.

Don

Don,

You are beginning to see the issues that I tried to cautioned you about in this post.

http://www.daniweb.com/software-development/vbnet/threads/449051/saving-multiple-strings-to-a-single-.txt-file-in-top-to-bottom-order#post1941747

Consider the time that you have wasted already just to trying and save some time typing in names of the controls that you wish to save the text from by using a loop to generate the control's name. Is it really worth it?

The class shown in that post will manage the saving and restoring of the Text property. All you need to do is create an instance of it and tell it which controls to manage and then issue it the commands for saving and loading the text at the proper point in your code.

Or he could do

Public Class Form1

    Private TextBoxes(37) As TextBox

    Private Sub Form1_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load

        For i As Integer = 1 To 36

            Dim txt As New TextBox
            txt.Location = New Point(10, 25 * i)
            txt.Name = "TextBox" & i
            txt.Text = "TextBox" & i
            Panel1.Controls.Add(txt)
            TextBoxes(i) = txt

        Next

    End Sub

End Class

and just reference each textbox as in

TextBoxes(i).Text

Considering that he is a self-admitted newbie perhaps the custom class might be a tad confusing just now.

If you need to add handlers for the textbox events we can show you how to easily manage that. As a plus, you'd only need one handler for all 36 controls.

Don,

I realized that I did not address the questions you raised in the following text.

...it is within a Panel that I'm using because it needs a vertical scroll bar. This suggests that I may need some other code for it to recognize the TextBox within the panel that IS on the form!! What tangled webs I weave!

Controls can parent other controls. You can make a control a child be another by adding it to the target parent control's Controls collection or by setting the Parent property of the child control.

parent.Controls.Add(child)

or

child.Parent = parent

If all the textboxes are parented to the panel, then you could change Me.Controls to Panel1.Controls (replace Panel1 with the true name of the panel) and your logic would function. "Me" is an internal reference to the class in which you are writing code; in this case the form you are defining. The reason you are able to type the name of the textbox reference and it is recognized by the IDE is because you have defined in the class even if you are not aware that you have done so.

When you drag a control to the design, visual studio executes a design routine for that control that generates the statements necessary to instaniate it and set its properties. This code is then written to the form's designer file. You can view this file by going to the solution explorer window and clicking on the "Show all Files" button and then expanding the tree for the form by clicking on the plus sign to the left of the form entry. You should see a file under that tree with a name like "Form1.designer.vb". Feel free to look at it, but at this point do not modify the code in it as you could easily make an inadvertant mistake an render the form inaccessible. Once you become more experienced, recovering from such mistakes is not hard, but there is no reason to give yourself an ulcer right now.

Assuming my thought process is correct, what will allow the form to recognize the panel? Something tells me I'm going to have to create a "AddHandler" sub-routine and run these commands within that. I'm I starting to think correctly here?

I do not understand what you are trying to ask here. However, all designer added controls are instaniated with a syntax like this:

Friend WithEvents TextBox1 As New System.windows.Forms.TextBox

The "WithEvents" keyword allows you to use event handlers with the "Handles" keyword in their definition.

Private Sub TextBox1_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles TextBox1.TextChanged

End Sub

Which event is it that you wish to monitor and/or act on?

Try to Start your loop from 0

For intIndex As Integer = 0 To 36

For intIndex As Integer = 1 To 36

if im right, this generates 35 txtbox only

Wow..... In one sense, I'm glad I have had these problems. This has been a great learning issue. On the other hand, it has me realizing I have so much more to learn!! Thanks for sharing your knowledge and using it to teach!

I'll try to address everyone's thoughts, ideas and suggestions here:

TnTinMN,

All you need to do is create an instance of it and tell it which controls to manage and then issue it the commands for saving and loading the text at the proper point in your code.

I hate to admit this, but the term "create an instance" isn't clear to me. I understand managing the controls (i.e "txbLabel1.Text = "Insert Name Here"). Help me understand what an "Instance" is.

You also mentioned "Parents" and "Childs", both of which I've been introduced to. However my classes taught me about Parent and Child forms and not Parent and Child controls. But I'm thinking that we've did some of this back when I was trying to create a panel and it's controls within another panel when I was creating my Order Entry form. Last night I did go back and try adding a command to create this. My thought was to enter, "Me.Controls.Add(pnlPrtsPanelSetup)", hoping that doing this would allow the form to recognize the controls within the panel and allow the loop to generate the names of the TextBoxes and insert the names. It didn't work.

You mentioning "dragging" the TextBox design from the tool mention onto the form did cross my mind. I did wonder if dropping it directly into the Panel as opposed to being on the form could cause the issue I'm having.

I did search the "tree" and found the following in it:

 Private Sub InitializeComponent()
        Me.components = New System.ComponentModel.Container()

Dim resources As System.ComponentModel.ComponentResourceManager = New System.ComponentModel.ComponentResourceManager(GetType(frmInventoryPartSetup))
        Me.pnlPartsSetup = New System.Windows.Forms.Panel()
        Me.txbLabel36 = New System.Windows.Forms.TextBox()
        Me.txbLabel35 = New System.Windows.Forms.TextBox()
        Me.txbLabel34 = New System.Windows.Forms.TextBox()

I looked further down the command lines and found:

'pnlPartsSetup
        '
        Me.pnlPartsSetup.AutoScroll = True
        Me.pnlPartsSetup.AutoSize = True
        Me.pnlPartsSetup.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink
        Me.pnlPartsSetup.BorderStyle = System.Windows.Forms.BorderStyle.Fixed3D
        Me.pnlPartsSetup.Controls.Add(Me.txbLabel36)
        Me.pnlPartsSetup.Controls.Add(Me.txbLabel35)
        Me.pnlPartsSetup.Controls.Add(Me.txbLabel34)

and further down

    Friend WithEvents txbLabel33 As System.Windows.Forms.TextBox
    Friend WithEvents txbLabel32 As System.Windows.Forms.TextBox
    Friend WithEvents txbLabel31 As System.Windows.Forms.TextBox

Assuming my thought process is correct, what will allow the form to recognize the panel?

I think I worded this wrong. I meant to say, what code will allow the form to "recognize" (if that is the right term) the controls (txbLabel1 thru 36) that are within the Panel?

Rev. Jim,

I'm gathering your suggestion for a "fix" is to generate the TextBoxes via code and inserted at runtime. Yes? If so, I'm not sure that will work that easily. Unfortunately some of these textboxes aren't in regularly spaced columns or rows. I'd have to do these individually.

Now that I (and we) understand better what I've done, is there some code I can enter to populate these 36 Textboxes with the data from the .txt file?

Guys, again thanks! The way this has flowed has been a HUGE learning experience for me. I appreciate your interest in helping me. You guys are awesome!

Don

Gentlemen,

Call off the wolves... Via your teaching, I found the fix!

Dim txtTmp As TextBox
        Dim strLine As String
        Dim pnlPartsSetup As New Panel
        Me.Controls.Add(pnlPartsSetup)
        Using reader As StreamReader = New StreamReader("c:\BusinessBasics\miscspareflds.txt")
            For intIndex As Integer = 1 To 36
                txtTmp = Me.pnlPartsSetup.Controls("txbLabel" & intIndex)
                strLine = reader.ReadLine
                txtTmp.Text = strLine
            Next
        End Using

It works perfectly!! I've tested it multiple times with multiple changes in the .txt file. It works!

May I refer to each of you as "Sensay"? LOL!

Guys, you rock.... Thanks!!

Don

Don,

I had seen your prior post and decided to add some comments to the example that I had previouly provided. For once I refreshed my browser before posting it and seen that you have got it working. Good job!

Since you seen to be having problems with terminology (wat! you no speekee mi lingo!), I am going to post it anyways so that it may help you understand some of the jibberish. :)

Public Class Form1

   ' the following statement creates an instance of the class ControlTextSaver
   ' the constructor for the class (the "New" subroutine) expects a string that
   ' is the path to a file that will store the Text property for the specified controls
   Private controlTextManager As New ControlTextSaver("savedtb.txt")

   ' Form_Load is an event handler that runs after an instance of the form is created.
   ' the default configuration of VB.Net automatically creates the form instance for you.
   Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

      ' the following for-next loop is an attempt to show you that you could add the controls to the 
      ' text manager in a loop, eventhough I do not agree with this methodology

      For i = 1 To 3 ' I an only using 3 texboxes for this example
         ' assuming that all the textboxes are parented to a panel
         ' the control manager exposes a List(of Controls) property
         ' since the is just like any other List(of type) instance, 
         ' you can add, insert, remove, etc. items from/to it
         controlTextManager.savedControl.Add(Panel1.Controls("TextBox" & i.ToString))
      Next

      ' just to show you that you can add any control that is derived from the Control Class to the manager
      controlTextManager.savedControl.Add(ComboBox1)

      ' now that all the managed controls have been defined by adding them to the manager,
      ' tell the manager to load the text from the specified file
      controlTextManager.LoadText()
   End Sub

   ' Form1_FormClosing is an event handler for the form, it executes on closing the form
   ' this is a good place to tell the manager to save the text.
   Private Sub Form1_FormClosing(ByVal sender As Object, ByVal e As System.Windows.Forms.FormClosingEventArgs) Handles Me.FormClosing
      controlTextManager.SaveText()
   End Sub
End Class

' the reason for using a class to handle this is so that all the logic is in one place.
' by doing this you will be able to use this code anywhere you want the same functionality without
' the need to implement the logic contained in it each time.
' idea is write it once - use many times

Public Class ControlTextSaver

   Private fn As String

   ' the following xml statement is used by intellesence to to provide 
   ' the popup help that it shows you

   ''' <param name="savedfilename">a valid path to the file to use for storing the text</param>
   Public Sub New(ByVal savedfilename As String)
      fn = savedfilename
      savedControl = New List(Of Control)
   End Sub

   ' _savedControl is an instance of the generic class List(Of T)
   ' a generic class is used a template by the compiler to generate a strongly
   ' typed version of the class using the passed type parameter
   ' in this case, a List of controls is defined
   ' _savedControl is sometimes referred to as the backing data storage
   ' it is the source/destination for the savedControl property defined below
   ' the instaniation of the List is done if the class's constructor
   Private _savedControl As List(Of Control)
   Public Property savedControl() As List(Of Control)
      Get
         Return _savedControl
      End Get
      Set(ByVal value As List(Of Control))
         _savedControl = value
      End Set
   End Property 'savedTextBoxes

   ''' <summary>
   ''' Method to save Text property to the file
   ''' </summary>
   Public Sub SaveText()
      'Dim output() As String = (From cntrl In savedControl Select CType(cntrl, Control).Text).Cast(Of String)().ToArray()

      Dim output(0 To savedControl.Count - 1) As String
      For i As Int32 = 0 To savedControl.Count - 1
          output(i) = savedControl.Item(i).Text
      Next i

      IO.File.WriteAllLines(fn, output)
   End Sub

   ''' <summary>
   ''' Method to load the texxt from the file and set the Text property
   ''' </summary>
   Public Sub LoadText()
      ' verify that the file exist before trying to open it
      If Not IO.File.Exists(fn) Then Exit Sub

      ' create an instance of a string array to hold the lines read from the file
      ' and read the lines
      Dim savedtext() As String = IO.File.ReadAllLines(fn)

      ' minimal error chech to make sure that the number of controls and the number 
      ' text lines are the same
      If savedtext.Length <> savedControl.Count Then
         Throw New Exception("Saved data problem")
      Else
         ' loop from 0 to the upper bound of the string array
         ' could also have been defined as: For i As Int32 = 0 To savedtext.Length - 1
         For i As Int32 = 0 To UBound(savedtext, 1)
            savedControl(i).Text = savedtext(i)
         Next
      End If
   End Sub
End Class

Excellent post!! Is this above routine something I can put in and test? If so, what controls do I need to add to "form1" to use it? I'm asking this as I'm a "learn by doing" person. I might even try to build this in parts and watch it behave as I test it. Writing the code and watching it work facinates me!!

As I said in an earlier post, this nothing like "old BASIC", and I'm glad. The idea of writing code for every sequence of every event would make for a long program. I'm really liking Visual Basic! Which prompts me to ask..... Is VB still being used alot as a program language? A friend of mine has encouraged me to learn Java (I know absolutely nothing about it).

For the record, I'm a "late in life learner". I was an operations exec in a family-owned Ceramic Tile and Stone company here in Atlanta for 26 years. The mortgage meltdown trimed that company down by almost two-thirds. I've been out of work now for 19 months. While I was there, the software package we used had a report generator in call "IQ", or as the software supplier called it "PRISMWRITER". It used a language very similar to the "old BASIC" (that I taught myself when Radio Shack began to market their "TRS-80" back in the early 1980s). Writing those reports required me to learn KornShell scripting as our program sat on a UNIX box. With the down time I've had while looking for work, I've taken a couple of courses at the local college on VB. I'm now trying to do something with it. I always hated parts of the software package my last employer used. So I'm now trying to create something new they could drop their saved data in and pickup and go on without a lot of challenges. I am trying to take the good stuff and include it.

Before I can move on, I've got to build some databases to house open and closed orders. With that said, I'm not going away! You'll see me back here hopefully in a few days.

Many thanks to you and Reverend Jim for your paitence. I do hope in time I'll understand this as well as you two.

I hope to hear from you soon.

Don

This question has already been answered. Start a new discussion instead.