Highlighted
New Member.
1364 views

Passing Array Between Forms

Jump to solution

Hi

I want to pass an array of arbitrary size from one form to another.  The array would contain employee numbers PIC 9(9) and a flag to say whether the employee had been selected.

Basically, from the main form the user can press a List... button which calls up a subform.  This subform contains a multiselect ListView which is populated from a flat file of employees.  There could be 1 employee in the file, or thousands, so no limit.  When the user has selected the employees they want and the subform is closed, then the selected employees are passed back to the main form for processing.

Currently, I am using the linkage in public methods to pass data between forms, but the size of the data is known.  I know SteveC had a similar problem recently but the complete solution was not provided.

I need to know the best way to go about passing the information required back to the main form.  Thank you.

0 Likes
1 Solution

Accepted Solutions
Highlighted
Micro Focus Expert
Micro Focus Expert

RE: Passing Array Between Forms

Jump to solution

The following is an example which demonstrates the following:

1. main form populates an array with an Employee object like Robert explained.
2. Pass this array to a subform where it will be stored in working-storage
3. Subform places the emp-nos from array into a listview control and returns
4. main form displays subform
5. User selects one or more emp-nos from listview and clicks button
6. Subform closes and returns to main form
7. main form calls method iun subform to get array of selected items
8. main form then displays selected items in a listbox

main form:

 

  class-id passarray.Form1 is partial
                 inherits type System.Windows.Forms.Form.
       
       working-storage section.
       01 empArray type Employees occurs any.
       method-id NEW.
       procedure division.
           invoke self::InitializeComponent
           goback.
       end method.

       method-id button1_Click final private.
       procedure division using by value sender as object e as type System.EventArgs.
       
           set size of empArray to 5
           perform varying sub1 as binary-long from 1 by 1 until sub1 > 5
              set empArray(sub1) to new Employees
              set empArray(sub1)::emp-no to sub1
              set empArray(sub1)::checked to false
           end-perform
           
           declare mysubform as type passarray.subform = new passarray.subform
           invoke mysubform::setArray(empArray)
           invoke mysubform::ShowDialog
           
           set empArray to mysubform::getArray
           
           invoke listBox1::Items::Clear
           perform varying ret-emps as type Employees thru empArray
              if ret-emps::checked
                 invoke listBox1::Items::Add(ret-emps::emp-no)
              end-if
           end-perform.
           
       end method.
      
       end class.
       class-id Employees.
       working-storage section.
       01 emp-no    pic 9(9) property.
       01 checked   condition-value property.
       procedure division.
       
       end class.



subform:

       class-id passarray.subform is partial
                 inherits type System.Windows.Forms.Form.

       working-storage section.
       01 empArray type Employees occurs any.
       method-id NEW.
       procedure division.
           invoke self::InitializeComponent()
           goback.
       end method.

       method-id button1_Click final private.
       procedure division using by value sender as object e as type System.EventArgs.
           invoke self::Close
       end method.

       method-id setArray public.
       procedure division using by value myArray as type Employees occurs any.
           
           set empArray to myArray
           
           perform varying myemployee as type Employees thru myArray
              declare lvi as type ListViewItem = new ListViewItem(myEmployee::emp-no::ToString)
              invoke listView1::Items::Add(lvi)
           end-perform
                 
           goback.
       end method.
       method-id getArray public.
       procedure division returning myArray as type Employees occurs any.
           
           perform varying mylistitem as type ListViewItem thru listView1::SelectedItems
              perform varying myemployee as type Employees thru empArray
                 if myemployee::emp-no = type Int32::Parse(mylistitem::Text) 
                    set myemployee::checked to true
                    exit perform
                 end-if
              end-perform
           end-perform
           set myArray to empArray
           goback.
       end method.
       
       end class.

View solution in original post

0 Likes
2 Replies
Highlighted
Micro Focus Expert
Micro Focus Expert

RE: Passing Array Between Forms

Jump to solution

Hi Brendan, I'm not certain I fully understand what you're trying to do, but could you do something like:

class-id Employee.

01 Number binary-long.

01 Selected condition-value.

...

end class.

You can then build an array or a List of instances of this class:

01 employees type Employee occuurs any.

...or:

01 employees list[type Employee].

...and the list or array can then be passed between methods as a parameter.

Robert.

0 Likes
Highlighted
Micro Focus Expert
Micro Focus Expert

RE: Passing Array Between Forms

Jump to solution

The following is an example which demonstrates the following:

1. main form populates an array with an Employee object like Robert explained.
2. Pass this array to a subform where it will be stored in working-storage
3. Subform places the emp-nos from array into a listview control and returns
4. main form displays subform
5. User selects one or more emp-nos from listview and clicks button
6. Subform closes and returns to main form
7. main form calls method iun subform to get array of selected items
8. main form then displays selected items in a listbox

main form:

 

  class-id passarray.Form1 is partial
                 inherits type System.Windows.Forms.Form.
       
       working-storage section.
       01 empArray type Employees occurs any.
       method-id NEW.
       procedure division.
           invoke self::InitializeComponent
           goback.
       end method.

       method-id button1_Click final private.
       procedure division using by value sender as object e as type System.EventArgs.
       
           set size of empArray to 5
           perform varying sub1 as binary-long from 1 by 1 until sub1 > 5
              set empArray(sub1) to new Employees
              set empArray(sub1)::emp-no to sub1
              set empArray(sub1)::checked to false
           end-perform
           
           declare mysubform as type passarray.subform = new passarray.subform
           invoke mysubform::setArray(empArray)
           invoke mysubform::ShowDialog
           
           set empArray to mysubform::getArray
           
           invoke listBox1::Items::Clear
           perform varying ret-emps as type Employees thru empArray
              if ret-emps::checked
                 invoke listBox1::Items::Add(ret-emps::emp-no)
              end-if
           end-perform.
           
       end method.
      
       end class.
       class-id Employees.
       working-storage section.
       01 emp-no    pic 9(9) property.
       01 checked   condition-value property.
       procedure division.
       
       end class.



subform:

       class-id passarray.subform is partial
                 inherits type System.Windows.Forms.Form.

       working-storage section.
       01 empArray type Employees occurs any.
       method-id NEW.
       procedure division.
           invoke self::InitializeComponent()
           goback.
       end method.

       method-id button1_Click final private.
       procedure division using by value sender as object e as type System.EventArgs.
           invoke self::Close
       end method.

       method-id setArray public.
       procedure division using by value myArray as type Employees occurs any.
           
           set empArray to myArray
           
           perform varying myemployee as type Employees thru myArray
              declare lvi as type ListViewItem = new ListViewItem(myEmployee::emp-no::ToString)
              invoke listView1::Items::Add(lvi)
           end-perform
                 
           goback.
       end method.
       method-id getArray public.
       procedure division returning myArray as type Employees occurs any.
           
           perform varying mylistitem as type ListViewItem thru listView1::SelectedItems
              perform varying myemployee as type Employees thru empArray
                 if myemployee::emp-no = type Int32::Parse(mylistitem::Text) 
                    set myemployee::checked to true
                    exit perform
                 end-if
              end-perform
           end-perform
           set myArray to empArray
           goback.
       end method.
       
       end class.

View solution in original post

0 Likes
The opinions expressed above are the personal opinions of the authors, not of Micro Focus. By using this site, you accept the Terms of Use and Rules of Participation. Certain versions of content ("Material") accessible here may contain branding from Hewlett-Packard Company (now HP Inc.) and Hewlett Packard Enterprise Company. As of September 1, 2017, the Material is now offered by Micro Focus, a separately owned and operated company. Any reference to the HP and Hewlett Packard Enterprise/HPE marks is historical in nature, and the HP and Hewlett Packard Enterprise/HPE marks are the property of their respective owners.