Tech Articles


Window Object Information Service


Here is an easy to implement service geared towards developers who are working on complex, many layered applications. In its basic form it shows the current window object, which pbl it is located in, all the various ancestors of the window, their pbl locations, all datawindows and datawindow objects on the window, and the sql statements for those datawindow objects.

The only dependency in the window is the pfc resize service. This can easily be stripped out if needed.

To implement the service, add the following to the window/ancestor window event (rbuttondown for example):

openwithparm(w_window_info,THIS)


The screenshot is an example output.

Window Information Service Window

 

Here are the export files for the window and datawindow.

-------------- window export

$PBExportHeader$w_window_info.srw
forward
global type w_window_info from window
end type
type cb_1 from commandbutton within w_window_info
end type
type dw_1 from datawindow within w_window_info
end type
end forward

global type w_window_info from window
integer width = 1198
integer height = 1288
boolean titlebar = true
string title = "Window Info"
boolean controlmenu = true
boolean minbox = true
boolean resizable = true
windowtype windowtype = popup!
long backcolor = 67108864
string icon = "AppIcon!"
boolean center = true
cb_1 cb_1
dw_1 dw_1
end type
global w_window_info w_window_info

type variables
window iw
n_cst_resize inv_resize //remove if not needed
end variables

on w_window_info.create
this.cb_1=create cb_1
this.dw_1=create dw_1
this.Control[]={this.cb_1,&
this.dw_1}
end on

on w_window_info.destroy
destroy(this.cb_1)
destroy(this.dw_1)
end on

event close;close(this)
end event

event open;iw = message.powerobjectparm

boolean lb_found
long ll_i, ll_j, ll_k
classdefinition lcd
datawindow ldw
string ls_msg, ls_liblist, ls_dwlist, ls_lib, ls_libarray[]
string ls_dwval
long ll_curpos, ll_newpos, ll_row
inv_resize =  CREATE n_cst_resize //remove if not needed
ll_curpos = 1
ll_i = 1

//Set the original size
inv_resize.of_SetOrigSize(1161, 1184) //remove if not needed

inv_resize.of_register(dw_1, 'SCALETORIGHT&BOTTOM')
inv_resize.of_register(cb_1, 'FIXEDTOBOTTOM')

// build array of libraries so we can search through them
// for the specified datawindow object
ls_liblist = getlibrarylist()
// add final comma to define last entry in list
ls_liblist += ','
// build librarylist array
ll_newpos = pos(ls_liblist,',',ll_curpos)
DO UNTIL ll_newpos = 0
    ls_lib = Mid(ls_liblist,ll_curpos, ll_newpos - ll_curpos)
    ll_curpos = ll_newpos + 1
    ls_libarray[ll_i] = ls_lib
    ll_i++
    ll_newpos = pos(ls_liblist,',',ll_curpos)
LOOP
// reset position vars
ll_curpos = 1
ll_newpos = 0
// window
lcd = iw.classdefinition
do while IsNull(lcd) = FALSE
    IF ll_j = 1 THEN
        ls_msg = 'Ancestors'
        ll_row = dw_1.insertrow(0)
        dw_1.setitem(ll_row,'info',ls_msg)

    END IF
    ll_j ++
    ls_msg = lcd.libraryname + '  ' + lcd.name 
    ll_row = dw_1.insertrow(0)
    dw_1.setitem(ll_row,'info',ls_msg)

    lcd = lcd.ancestor
    IF IsNull(lcd) THEN CONTINUE
    IF lcd.issystemtype THEN EXIT
loop
ll_j = 0
// controls on window
FOR ll_k = 1 TO upperbound(iw.control)
    lcd = iw.control[ll_k].classdefinition

   DO WHILE IsNull(lcd) = FALSE
        // datawindow controls
        // is_control limits the search to a single dw control, this could be
        // changed to show the information for all dw controls
        IF iw.control[ll_k].typeof() = Datawindow! THEN
            IF ll_j = 0 THEN
                ls_msg = 'Datawindow object'
                ll_row = dw_1.insertrow(0)
                dw_1.setitem(ll_row,'info',ls_msg)
                ll_j ++
            END IF
             ls_msg += lcd.libraryname + '  ' + lcd.name + '~r'
            // if looking at all controls, need to do a typeof to verify it is a datawindow
            // prior to the following assignment
            ldw =  iw.control[ll_k]
            ls_msg =  ldw.dataobject
            ll_row = dw_1.insertrow(0)
            dw_1.setitem(ll_row,'info',ls_msg)

            FOR ll_i = 1 TO upperbound(ls_libarray) // loop through libraries to find datawindow object
                ll_curpos = 1
                ls_dwlist = LibraryDirectoryEx(ls_libarray[ll_i],DirDataWindow!)
                // Look through list of dw objects to find one associated with the dw control
                ll_newpos = pos(ls_dwlist,'~n',ll_curpos)
                DO UNTIL ll_newpos = 0
                    ls_lib = Mid(ls_dwlist,ll_curpos, ll_newpos - ll_curpos)
                    ls_dwval = ls_lib
                    ls_dwval = Left(ls_dwval, POS(ls_dwval, '~t') - 1)
                    IF ls_dwval = ldw.dataobject THEN
                        ls_msg = 'Library: ' + ls_libarray[ll_i]
                        ll_row = dw_1.insertrow(0)
                        dw_1.setitem(ll_row,'info',ls_msg)

                        // sql statement
                        IF ldw.object.datawindow.table.SQLselect <> '' THEN
                            ls_msg = 'Last SQL:~r ' + ldw.object.datawindow.table.SQLselect     
                        ELSE
                            ls_msg = 'DWO SQL:~r ' + ldw.object.datawindow.table.select
                        END IF
                        ll_row = dw_1.insertrow(0)
                        dw_1.setitem(ll_row,'info',ls_msg)
                        lb_found = TRUE
                        EXIT
                    END IF
                    ll_curpos = ll_newpos + 1
                    ll_newpos = pos(ls_dwlist,'~n',ll_curpos)
                LOOP
                // found what we are looking for so no more need to search libraries
                IF lb_found then 
                    lb_found = FALSE
                    EXIT
                END IF
            NEXT
        END IF
        lcd = lcd.ancestor
        IF IsNull(lcd) THEN CONTINUE
        IF lcd.issystemtype THEN EXIT
    LOOP // valid classdefinition
NEXT // controls on window
end event

event resize;if IsValid(inv_resize) then  //remove if not needed
    inv_resize.Event pfc_Resize (sizetype, This.WorkSpaceWidth(), This.WorkSpaceHeight())
end if

end event

type cb_1 from commandbutton within w_window_info
integer x = 786
integer y = 1044
integer width = 325
integer height = 92
integer taborder = 20
integer textsize = -10
integer weight = 400
fontcharset fontcharset = ansi!
fontpitch fontpitch = variable!
fontfamily fontfamily = swiss!
string facename = "Arial"
string text = "Close"
end type

event clicked;parent.event post close()
end event

type dw_1 from datawindow within w_window_info
integer x = 27
integer y = 24
integer width = 1102
integer height = 956
integer taborder = 10
string title = "none"
string dataobject = "d_window_info"
boolean hscrollbar = true
boolean vscrollbar = true
boolean livescroll = true
borderstyle borderstyle = stylelowered!
end type

-------------- datawindow export

$PBExportHeader$d_window_info.srd
release 11.5;
datawindow(units=0 timer_interval=0 color=1073741824 brushmode=0 transparency=0 gradient.angle=0 gradient.color=8421504 gradient.focus=0 gradient.repetition.count=0 gradient.repetition.length=100 gradient.repetition.mode=0 gradient.scale=100 gradient.spread=100 gradient.transparency=0 picture.blur=0 picture.clip.bottom=0 picture.clip.left=0 picture.clip.right=0 picture.clip.top=0 picture.mode=0 picture.scale.x=100 picture.scale.y=100 picture.transparency=0 processing=1 HTMLDW=no print.printername="" print.documentname="" print.orientation = 0 print.margin.left = 110 print.margin.right = 110 print.margin.top = 96 print.margin.bottom = 96 print.paper.source = 0 print.paper.size = 0 print.canusedefaultprinter=yes print.prompt=no print.buttons=no print.preview.buttons=no print.cliptext=no print.overrideprintjob=no print.collate=yes print.background=no print.preview.background=no print.preview.outline=yes hidegrayline=no showbackcoloronxp=no picture.file="" grid.lines=0 )
header(height=68 color="0" transparency="0" gradient.color="8421504" gradient.transparency="0" gradient.angle="0" brushmode="0" gradient.repetition.mode="0" gradient.repetition.count="0" gradient.repetition.length="100" gradient.focus="0" gradient.scale="100" gradient.spread="100" )
summary(height=0 color="536870912" transparency="0" gradient.color="8421504" gradient.transparency="0" gradient.angle="0" brushmode="0" gradient.repetition.mode="0" gradient.repetition.count="0" gradient.repetition.length="100" gradient.focus="0" gradient.scale="100" gradient.spread="100" )
footer(height=0 color="536870912" transparency="0" gradient.color="8421504" gradient.transparency="0" gradient.angle="0" brushmode="0" gradient.repetition.mode="0" gradient.repetition.count="0" gradient.repetition.length="100" gradient.focus="0" gradient.scale="100" gradient.spread="100" )
detail(height=72 color="536870912" transparency="0" gradient.color="8421504" gradient.transparency="0" gradient.angle="0" brushmode="0" gradient.repetition.mode="0" gradient.repetition.count="0" gradient.repetition.length="100" gradient.focus="0" gradient.scale="100" gradient.spread="100" height.autosize=yes )
table(column=(type=char(8000) updatewhereclause=yes name=info dbname="info" )
 )
column(band=detail id=1 alignment="0" tabsequence=10 border="0" color="33554432" x="14" y="8" height="60" width="2807" format="[general]" html.valueishtml="0"  name=info visible="1"  resizeable=1 height.autosize=yes edit.limit=0 edit.case=any edit.focusrectangle=no edit.autoselect=yes edit.autohscroll=yes  font.face="MS Sans Serif" font.height="-8" font.weight="400"  font.family="2" font.pitch="2" font.charset="0" background.mode="1" background.color="536870912" background.transparency="0" background.gradient.color="8421504" background.gradient.transparency="0" background.gradient.angle="0" background.brushmode="0" background.gradient.repetition.mode="0" background.gradient.repetition.count="0" background.gradient.repetition.length="100" background.gradient.focus="0" background.gradient.scale="100" background.gradient.spread="100" tooltip.backcolor="134217752" tooltip.delay.initial="0" tooltip.delay.visible="32000" tooltip.enabled="0" tooltip.hasclosebutton="0" tooltip.icon="0" tooltip.isbubble="0" tooltip.maxwidth="0" tooltip.textcolor="134217751" tooltip.transparency="0" transparency="0" )
text(band=header alignment="0" text="Window Information" border="0" color="16777215" x="5" y="12" height="52" width="2816" html.valueishtml="0"  name=t_1 visible="1"  font.face="MS Sans Serif" font.height="-8" font.weight="400"  font.family="2" font.pitch="2" font.charset="0" background.mode="1" background.color="553648127" background.transparency="0" background.gradient.color="8421504" background.gradient.transparency="0" background.gradient.angle="0" background.brushmode="0" background.gradient.repetition.mode="0" background.gradient.repetition.count="0" background.gradient.repetition.length="100" background.gradient.focus="0" background.gradient.scale="100" background.gradient.spread="100" tooltip.backcolor="134217752" tooltip.delay.initial="0" tooltip.delay.visible="32000" tooltip.enabled="0" tooltip.hasclosebutton="0" tooltip.icon="0" tooltip.isbubble="0" tooltip.maxwidth="0" tooltip.textcolor="134217751" tooltip.transparency="0" transparency="0" )
htmltable(border="1" )
htmlgen(clientevents="1" clientvalidation="1" clientcomputedfields="1" clientformatting="0" clientscriptable="0" generatejavascript="1" encodeselflinkargs="1" netscapelayers="0" pagingmethod=0 generatedddwframes="1" )
xhtmlgen() cssgen(sessionspecific="0" )
xmlgen(inline="0" )
xsltgen()
jsgen()
export.xml(headgroups="1" includewhitespace="0" metadatatype=0 savemetadata=0 )
import.xml()
export.pdf(method=0 distill.custompostscript="0" xslfop.print="0" )
export.xhtml()
 

Comments (0)
There are no comments posted here yet

Find Articles by Tag

Database Table Schema SQL Encryption RESTClient DevOps Variable GhostScript JSON SOAP .NET Assembly Installation OLE Database Connection Git Data DataType Excel JSONParser OAuth 2.0 REST Import Branch & Merge Error TortoiseGit MessageBox License JSONGenerator Bug Encoding Icon Event Handling External Functions Repository HTTPClient Debugging DataWindow JSON Resize Export JSON Platform Window DataWindow Application Android Database Table Design PDFlib Testing Service Database Profile SnapDevelop XML Syntax Authorization PostgreSQL ODBC driver Debug RibbonBar Windows 10 Icons UI Themes ActiveX Source Code Outlook Open Source OrcaScript .NET Std Framework 64-bit Azure Migration Web Service Proxy Configuration Jenkins WinAPI Filter RichTextEdit Control Linux OS 32-bit Transaction Charts PowerBuilder (Appeon) SDK Source Control SnapObjects Messagging Oracle Array Import JSON Sort Validation PBDOM CI/CD TFS SqlExecutor OAuth Graph DLL Database Painter NativePDF Debugger SQL Server Model PostgreSQL RibbonBar Builder Expression PowerBuilder Compiler Automated Testing Web API PowerServer Web SqlModelMapper Event Handler TreeView Deployment Script CoderObject File Elevate Conference Interface Performance Menu Event PowerServer Mobile iOS Mobile SVN UI InfoMaker Authentication API Text WebBrowser PowerScript (PS) ODBC UI Modernization Export CrypterObject PDF BLOB PFC Database Windows OS TLS/SSL Database Table Data Database Object PowerBuilder Class Stored Procedure C# Trial IDE .NET DataStore COM DragDrop