New Page 1
A user on the message box asked about creating a list box on an Xdialog that
could be dynamically filtered.
I posted the answer in the thread where the question was asked, but it
occurs to me that the answer would be of interest to all users who have started
discovering the joys of Xdialog.
Note: You must have an understanding of Xdialog events in order to understand
this. If you are not familiar with Xdialog events, you should refer to the
"Learning Xdialog" book.
This script has a combo box where you can select a state, and then a list box
which shows the customers in the selected state. Paste this code into a
new script in AlphaSports. You will see that it shows the customers for a
selected state.
The key to the script is to regenerate the list whenever the state changes.
So we put the code that generates the list into a function (called
get_data() ), and we call the function whenever the state changes.
Another thing worth noting is that we have defined a variable called "VL"
which points to the local variable frame. ( local_variables() ). When we call
the get_data() function, the only parameter that we pass in is the VL variable.
This means that the function can see all of the variables defined in the script
and that any variables defined in the function are visible outside the script.
This saves us from having to pass in a list of parameters every time we call the
function, and from having to have the function return a particular value.
'Create an XDialog dialog
box to prompt for parameters.
DIM SHARED state as C
DIM SHARED customers as C
DIM SHARED varC_result as C
auto_list_state =
table.external_record_content_get("customer","Bill_State_Region","Bill_state_region",".t.
.and. unique_key_value()")
temp_count = w_count(auto_list_state,crlf())
DIM a_state[temp_count] as c
a_state.initialize(auto_list_state)
DIM a_customers[1] as c
dim vl as p
vl = local_variables()
state = "MA"
Dim format as p
Format.tab_stops=""
Format.odd_row_color="White"
Format.even_row_color="Blue White"
Format.odd_selected_color="Dark Blue"
Format.even_selected_color="Dark Blue"
Format.font="Arial,8"
Format.font_color_unselected="Black"
Format.font_color_selected="White"
Format.lastbutton="OK"
Format.group_size=2
Format.number_rows=.f.
Format.alternating_bands=.t.
get_data(vl)
ok_button_label = "&OK"
cancel_button_label = "&Cancel"
varC_result = ui_dlg_box("Alpha Five",""%dlg%
{region}
Which State:| [%v%.37state^=a_state!state_changed];
Select Customer:| [%d;O={@@}%.100,20customers^#a_customers];
{endregion};
{line=1,0};
{region}
"*15=ok_button_label!OK" "15=cancel_button_label!CANCEL"
{endregion};
%dlg%,""%code%
if a_dlg_button = "state_changed" then
a_dlg_button = ""
get_data(vl)
end if
%code%)
'-----------------------------------------------------
function get_data as c (vars as p)
with vars
'IMPORTANT ---make sure
that this command is all ONE LINE --
auto_list_customers =
table.external_record_content_get("customer","alltrim(Customer_Id) +
\"|{I:'a5_vertical_line'}\" + alltrim(lastname) + \"|{I:'a5_vertical_line'}\" +
alltrim(firstname) + \"|{I:'a5_vertical_line'}\" + bill_state_region","Lastname","(Bill_state_region
= " + quote(var-"state)+")")
'Apply 'owner draw'
formatting information to the list
auto_list_customers = a5_owner_draw_list_fmt(auto_list_customers,Format)
temp_count = w_count(auto_list_customers,crlf())
REDIM a_customers[temp_count] as c
a_customers.clear()
a_customers.initialize(auto_list_customers)
customers = a_customers[1]
end with
end function
Comment