A Genie Style Dialog with Tabs

Description

This script shows how you can create a Genie style Xdialog that also has tabs allowing quick access to individual pages of the Genie.

images/XD_Genie_with_tabs.gif

First specify the tab names.

dim lv as P
lv = local_variables()
'Specify the List of Tab Names for the Genie
panes = <<%a%
Page 1
Page 2
Page 3
%a%

Next, specify the Xdialog code (dialog body and event code) for each Genie page.

dim code_pages[1] as P
code_pages[1].name = "Page 1"
code_pages[1].dialog_body = <<%dlg%
This is the body of the 'Page 1' page;
%dlg%
code_pages[1].dialog_events = <<%code%
1=1
%code%
code_pages.insert(1,1)
code_pages[1].name = "Page 2"
code_pages[1].dialog_body = <<%dlg%
This is the body of the 'Page 2' page;
%dlg%
code_pages[1].dialog_events = <<%code%
1=1
%code%
code_pages.insert(1,1)
code_pages[1].name = "Page 3"
code_pages[1].dialog_body = <<%dlg%
This is the body of the 'Page 3' page;
%dlg%
code_pages[1].dialog_events = <<%code%
1=1
%code%

Next, display the dialog box.

current_pane = 1
dim flag_next as L
dim flag_prev as L
dim flag_finish as L
flag_next = .t.
flag_prev = .f.
flag_finish = .f.
ui_dlg_box("Genie with Tabs",<<%dlg%
{startup=init}
[%R=1%.144,19current_pane^^panes!current_pane_*]
{embedded=142,13embedded1}
{line=1,0};
{justify=right}<10&Cancel> <10&< Previous!prev?flag_prev><10&Next \>!next?flag_next> <10&Finish?flag_finish>;
%dlg%,<<%code%
if a_dlg_button = "init" then
    a_dlg_button = ""
    show_page(lv)
end if
if left(a_dlg_button, 13) = "current_pane_" then
    if a_dlg_button = "current_pane_change" then
        show_page(lv)
        set_flags(lv)
    end if
    a_dlg_button = ""
end if
if a_dlg_button = "prev" then
    a_dlg_button = ""
    current_pane = current_pane - 1
    if current_pane = 0 then
        current_pane = 1
    end if
    show_page(lv)
    set_flags(lv)
end if
if a_dlg_button = "next" then
    current_pane = current_pane + 1
    if current_pane > line_count(panes) then
        current_pane = line_count(panes)
    end if
    a_dlg_button = ""
    show_page(lv)
    set_flags(lv)
end if
%code%)

The show_page()function swaps the embedded dialog boxes as the user clicks the tabs.

function show_page as v (vars as P)
with vars
    dim page_to_show as C
    dim dlg_body_embedded as C
    dim dlg_event_embedded as C
    page_to_show = word(panes,current_pane,crlf())
    dim tempIndx as N
    tempIndx = code_pages.find(ut(page_to_show), "ut(name)")
    if tempIndx > 0 then
        dlg_body_embedded = code_pagestempIndx.dialog_body
        dlg_event_embedded = code_pagestempIndx.dialog_events
    else
        dlg_body_embedded = "Code for this page not found"
        dlg_event_embedded = "1=1"
    end if
    ui_modeless_dlg_box("embedded1", dlg_body_embedded, dlg_event_embedded)
end with
end function

The set_flags()function sets the values of the logical variables, which in turn determine whether buttons will display.

function set_flags as v (vars as P)
with vars
    if current_pane = 1 then
        flag_prev = .f.
    else
        flag_prev = .t.
    end if
    if current_pane = line_count(panes) then
        flag_next = .f.
        flag_finish = .t.
    else
        flag_next = .t.
    end if
end with
end function

Limitations

Desktop applications only.

See Also