Sie sind auf Seite 1von 112

Powerbuilder tips

// Changing DataWindow object by code methods


string error_syntaxfromSQL, error_create

string new_sql, new_syntax

new_sql = 'SELECT emp_data.emp_id, emp_data.emp_name from emp_data' &

+ 'WHERE emp_data.emp_salary> 45000'

new_syntax = SQLCA.SyntaxFromSQL (new_sql, 'Style (Type = Form)', error_syntaxfromSQL)

IF Len (error_syntaxfromSQL)> 0 THEN // Display errors

mle_sfs.Text = error_syntaxfromSQL

ELSE // Generate new DataWindow

dw_new.Create (new_syntax, error_create)

IF Len (error_create)> 0 THEN

mle_create.Text = error_create

END IF

END IF

dw_new.SetTransObject (SQLCA)

dw_new.Retrieve ()

// Open dynamic window approach:


window newarray [3]

string win [3]

int i

win [1] = "w_employee"

win [2] = "w_customer"

win [3] = "w_sales"

for i = 1 to 3
Open (newarray [i], win [i])

next

// Displays a consistent style with the Windows operating


system About dialog. First, the following statement
external function:
function int ShellAboutA (ulong al_hWnd, string as_szApp, string as_szOtherStuff, ulong hIcon) library
"shell32"

ShellAboutA (handle (parent), "About ... # ferryman studio", "Welcome to the ferryman studio", 0)

// How COLUMN display style between EDIT, DDDW, DDLB switch between:

(1) is switched to the DDDW:

dw_1.Modify ("# 1.dddw.Name = 'dddw_jg'")

dw_1.Modify ("# 1.dddw.DisplayColumn = 'name_jg'")

dw_1.Modify ("# 1.dddw.DataColumn = 'id_jg'")

(2) switch to DDLB:

dw_1.Modify ("# 1.ddlb.case = 'any'")

dw_1.Object. # 1.Values = "red ~ t1 / white ~ t2"

(3) switch to the EDIT:

dw_1.Modify ("# 1.edit.case = 'any'")

dw_1.Modify ("# 1.edit.")

(4) Get the current style:

dw_1.Describe ("# 1.Edit.Style")

(5) If not enough, you may have to do the following:

dw_1.Modify ("# 1.dddw.Name = ''") about;


// Few records you want to print selected in the dw_1
long ll_pos

dataStore lds_ds

lds_ds = create dataStore

lds_ds.dataObject = dw_1.dataObject

for ll_pos = 1 to dw_1.rowCount ()

if dw_1.IsSelected (ll_pos) then

dw_1.RowsCopy (ll_pos, ll_pos, Primary!, lds_ds, lds_ds.rowCount () + 1, Primary!)

end if

next

lds_ds.print ()

// Achieved when the cycle is terminated by clicking the


button loop
integer n

// sb_interrupt is shared variables

sb_interrupt = false

for n = 1 to 3000

yield ()

value if sb_interrupt then // sb_interrupt modifications to true in the "Cancel" button in the Clicked
event

MessageBox ("I quit", "You're bad!")

sb_interrupt = false

exit

else // other processing, display the current value of n in a single line editor

sle_1.text = string (n)

end if

next
// SQL statement calling convention
INTEGER li_customer_id = 1

STRING ls_city_code = '501'

PREPARE SQLSA FROM "DELETE bb_customer_info_t WHERE city_code = AND customer_id = ";

EXECUTE SQLSA USING: ls_city_code,: li_customer_id;

// Modify function by modifying multiple tables


simultaneously
1, a new data window d_grid_dep_emp, its Select statement

SELECT department.dept_id,

department.dept_name,

employee.emp_id,

employee.emp_fname,

employee.emp_lname

FROM department, employee

WHERE employee.dept_id = department.dept_id

2, set the data window d_grid_dep_emp properties of the column taborder to non-zero value; and click
on the menu Rows -> Update

Properties, set this data window Allow Updates, Table to Update to department, Updateable Columns of

department.dept_id, department.dept_name.

3, update the data window button in the window clicked event scripting:

long ll_rtn

// Modify Department table (Department table in step 2 is


set to be updated)
ll_rtn = dw_1.update (true, false)

If ll_rtn = 1 then
// Close modifications to the Department table

dw_1.Modify ("department_dept_name.Update = 'No'")

dw_1.Modify ("department_dept_id.Update = 'No'")

dw_1.Modify ("department_dept_id.Key = 'No'")

// Set the Employee table into a new table can be modified

dw_1.Modify ("DataWindow.Table.UpdateTable = 'employee'")

dw_1.Modify ("employee_emp_id.Update = 'Yes'")

dw_1.Modify ("employee_emp_fname.Update = 'Yes'")

dw_1.Modify ("employee_emp_lname.Update = 'Yes'")

dw_1.Modify ("employee_emp_id.Key = 'Yes'")

// Modify the Employee table

ll_rtn = dw_1.Update ()

IF ll_rtn = 1 THEN

COMMIT USING SQLCA;

dw_1.retrieve ()

messagebox ('message', 'updated successfully!')

ELSE

ROLLBACK USING SQLCA;

MessageBox ('message', 'update failed!')

END IF

// Reset modify flag

dw_1.Modify ("department_dept_name.Update = 'Yes'")

dw_1.Modify ("department_dept_id.Update = 'Yes'")

dw_1.Modify ("department_dept_id.Key = 'Yes'")

dw_1.Modify ("DataWindow.Table.UpdateTable = 'department'")

dw_1.Modify ("employee_emp_id.Update = 'No'")

dw_1.Modify ("employee_emp_fname.Update = 'No'")

dw_1.Modify ("employee_emp_lname.Update = 'No'")

dw_1.Modify ("employee_emp_id.Key = 'No'")


ELSE

ROLLBACK USING SQLCA;

MessageBox ('message', 'update failed!')

END IF

// Above functions can be made a function call can be when necessary.

// Click Edit marquee in which the content

getfocus event write code: this.selecttext (1, len (this.text)). Save running, do not get what we want

Effect. Think of an alternative approach: to pbm_bnclicked for the event ID, create a single-line edit box
custom event ue_clicked,

Code is: this.selecttext (1, len (this.text)),

code getfocus event changed: This.Post Event ue_clicked (). After the save operation, the effect came
out!

// How to get the number of characters in the string

For i = 1 to Len (aString)

ls_ch = Mid (aString, i, 1)

If Asc (ls_ch)> = 128 then // Chinese characters

li_num ++

i=i+1

End if

Next

// Finally, li_num is the number of characters

// DW supports double-click the title to sort

String ls_old_sort, ls_column, ls_name, ls_criteria

Char lc_sort
IF Right (dwo.Name, 2) = '_t' THEN // made whether the column header name

ls_column = LEFT (dwo.Name, LEN (String (dwo.Name)) - 2)

ls_old_sort = this.Describe ("Datawindow.Table.sort")

IF ls_column = LEFT (ls_old_sort, LEN (ls_old_sort) - 2) THEN

lc_sort = RIGHT (ls_old_sort, 1)

IF lc_sort = 'A' THEN

lc_sort = 'D'

ELSE

lc_sort = 'A'

END IF

this.SetSort (ls_column + "" + lc_sort)

ELSE

ls_criteria = ls_column + "A"

this.SetSort (ls_criteria)

END IF

this.Sort ()

END IF

// DW support press Ctrl or Shift-click to select more than

line int il_last_row // il_last_row for instance variables, recording the last click

int li_current_row // current click OK

int li_row // intermediate variables

// Not choose to return

if row = 0 then

return

else

li_current_row = row

end if
if keydown (keyshift!) then // press the SHIFT key

if il_last_row = 0 then

this.selectRow (row, true)

il_last_row = li_current_row

else

this.selectRow (0, false)

if li_current_row> il_last_row then

for li_row = il_last_row to li_current_row

this.selectrow (li_row, true)

end for

else

for li_row = il_last_row to li_current_row step -1

this.selectrow (li_row, true)

end for

end if

end if

else // SHIFT key pressed

il_last_row = li_current_row

if keydown (keycontrol!) then // press the CTRL key

if this.isSelected (li_current_row) then

this.selectrow (li_current_row, false)

else

this.selectrow (li_current_row, true)

end if

else // no CTRL key or SHIFT key is pressed

this.selectrow (0, false)

this.selectrow (li_current_row, true)

end if

end if
// DW queries change conditional statements

string ls_select, ls_filter

ls_select = dw_1.getSqlSelect ()

ls_select = mid (ls_select, 1, pos (upper (ls_select), 'FROM') +30)

ls_filter = "WHERE service_kind =" + vi_service_kind + "ORDER BY FEE_ID ASC"

ls_select = ls_select + ls_filter

dw_1.Reset ()

dw_1.SetTransObject (SQLCA)

dw_1.SetSQLSelect (ls_select)

dw_1.Retrieve ()

CloseQuery event // data window: Tips to save data

dw_1.AcceptText ()

IF dw_1.ModifiedCount () + dw_1.DeletedCount ()> 0 THEN

CHOOSE CASE MessageBox ("Operation Tips", "data has been changed, whether to save ", Question!,
YesNoCancel!, 1)

CASE 1

cb_save.TriggerEvent (clicked!)

CASE 2

Return 0 // do nothing directly to Close

CASE 3

Return 1 // not run Close Event, to maintain the original case

END CHOOSE

END IF
// Tip: Select to delete records

if dw_2.GetSelectedRow (0) = 0 then

MessageBox ("message", "Please select the record to be deleted!")

return

end if

// Sorted by a field

IF dwo.name = "fee_id_t" THEN

this.setSort ("fee_id a")

this.sort ()

elseif dwo.name = "fee_position_t" then

this.setsort ("fee_position a, fee_id a")

this.sort ()

END IF

// Control DATAWINDOW in the number of rows displayed per page

An increase in Datawindow a computational domain, named: ceil_page, the computational domain must
be placed Detail section,

Expression enter ceiling (getrow () / 25) 25 25 rows per page said, it can be a parameter.

2, grouping, select the menu Rows \ Create Group, select ceil_page

By ceil_page grouping, and select New Page On Group Break (meaning began to change when a new set
of pages).

3, this computational domain is set to hide (in the properties page expression pages written in the visible
attributes 0).

4, fill an empty line:

Write the following code in the open event of the window:

long li_count, li_i

li_count = dw_1.retrieve ()
if mod (li_count, 25) <> 0 then

for li_i = 1 to 25 - mod (li_count, 25)

dw_1.insertrow (0)

next

end if

// How to achieve data window data automatically wrap

1) Open the DataWindow object in the DataWindow Painter.

2) Double-click the mouse on a column in the need to set up automatic fold line, bounced off the
Properties window for this column.

3) Select the Position tab, select Autosize Height checkbox.

4) Select the Edit tab and uncheck Auto Horz Scroll checkbox.

5) Click the OK button to save your changes.

6) points Detail Band (ie write long belt Detail gray), and click the right mouse button and select
Properties ... menu item.

7) Select the Autosize Height checkbox.

8) Click the OK button to save your changes.

9) Save the DataWindow.

Note: The characters together (with no punctuation or spaces), the system will be considered as a word,
does not automatically wrap,

English is also true ...... DW window wrap if there are characters, then it will be necessary to wrap the
intermediate spaces, otherwise how to set up will not work. For example, you

If you want to fold in the first 20 rows, you first determine whether it is the first 20 characters, if not to
put a space after the first 20, if the characters in the

The first 19 spaces. Determine whether the characters in the ASCII code can use it to determine whether
it is greater than 127.

// By conditions on color-coded data in a row

case (cj when is> = 90 then rgb (255,0,0) when is <60 then rgb (0,255,0) else rgb (0,0,255)))
// PB simultaneously connect to multiple databases, such as connecting SQLServer2000 and Oracle8

string ls_startupfile

ls_startupfile = 'hisini.ini'

sqlca.DBMS = ProfileString (ls_startupfile, "database", "dbms", "")

sqlca.database = ProfileString (ls_startupfile, "database", "database", "")

sqlca.userid = ProfileString (ls_startupfile, "database", "userid", "")

sqlca.dbpass = ProfileString (ls_startupfile, "database", "dbpass", "")

sqlca.logid = ProfileString (ls_startupfile, "database", "logid", "")

sqlca.logpass = ProfileString (ls_startupfile, "database", "LogPassWord", "")

sqlca.servername = ProfileString (ls_startupfile, "database", "servername", "")

sqlca.dbparm = ProfileString (ls_startupfile, "database", "dbparm", "")

remote_trans = CREATE transaction

remote_trans.DBMS = ProfileString (ls_startupfile, "Database_remote", "dbms", "")

remote_trans.database = ProfileString (ls_startupfile, "Database_remote", "database", "")

remote_trans.userid = ProfileString (ls_startupfile, "database_remote", "userid", "")

remote_trans.dbpass = ProfileString (ls_startupfile, "database_remote", "dbpass", "")

remote_trans.logid = ProfileString (ls_startupfile, "database_remote", "logid", "")

remote_trans.logpass = ProfileString (ls_startupfile, "database_remote", "LogPassWord", "")

remote_trans.servername = ProfileString (ls_startupfile, "database_remote", "servername", "")

remote_trans.dbparm = ProfileString (ls_startupfile, "database_remote", "dbparm", "")

// Attached hisini.ini

[Database]

DBMS = MSS Microsoft SQL Server 6.x

Database = his

UserId =

DatabasePassword =

ServerName =.
LogId = sa

Lock =

Prompt = 0

computer = '11 '

ocx = 0

use0 = 's hospital management'

cfprint = '1'

[Database_remote]

DBMS = "O84 Oracle8 / 8i (8.x.4 +)"

ServerName = "oracle8"

LogId = "dba"

Database = zx

UserId =

DatabasePassword =

Lock =

Prompt = 0

computer = '11 '

ocx = 0

cfprint = '1'

//PB6.5 Connection Oracle8i and 9i of

SQLCA.DBMS = "O84 Oracle8 / 8i (8.x.4 +)"

SQLCA.LogPass = "test"

SQLCA.ServerName = "myora"

SQLCA.LogId = "test"

SQLCA.AutoCommit = False

SQLCA.DBParm = "TableCriteria = ', test,' 'TABLE' ',' 'VIEW' ''"


// Retrieving data rows in a row plus

dataWindowChild dwc

dw_service.getchild ('svcid', dwc)

dwc.settransobject (sqlca)

dwc.retrieve ()

dwc.insertrow (1)

dwc.setitem (1, 'svcid', '00')

dwc.setitem (1, 'svcname', 'does not distinguish between')

dw_service.setTransObject (sqlca)

dw_service.Retrieve ()

// Data window, press the enter key to achieve tab function (in Enter event data window)

send (handle (this), 256,9, long (0,0))

return 1

// send usage: Send (handle, message #, lowword, long)

// This statement scrolls the window w_emp up one page:

Send (Handle (w_emp), 277, 2, 0)

// Both of the following statements click the CommandButton cb_OK:

Send (Handle (Parent), 273, 0, Handle (cb_OK))

cb_OK.TriggerEvent (Clicked!)

// minimizes the DataWindow:

Send (Handle (dw_1), 274, 61472, 0)

// maximizes the DataWindow:

Send (Handle (dw_1), 274, 61488, 0)

// returns the DataWindow to its normal, defined size:


Send (Handle (dw_1), 274, 61728, 0)

// Reset search statement data window

ls_accept_city = gs_citycode

ld_beg_date = datetime (date (em_assign_beg_date.text), time ('00: 00: 00 '))

ld_end_date = datetime (date (em_assign_end_date.text), time ('23: 59: 59 '))

ls_where = "WHERE b.assign_date> =: id_begin_date &

AND b.assign_date <=: id_end_date &

AND a.register_number = b.register_number &

AND a.accept_city =: is_accept_city &

AND a.action = 6 AND current_action = 1 AND status IN (1, -1) "

ls_sql = dw_wp.Describe ("DataWindow.Table.Select")

if pos (ls_sql, 'WHERE') <> 0 then

ls_sql = mid (ls_sql, 1, pos (ls_sql, 'WHERE') - 1)

end if

ls_sql = 'DataWindow.Table.Select = "' + ls_sql + ls_where + '"'

ls_err_info = dw_wp.modify (ls_sql)

if ls_err_info <> "" then

messagebox ('message', 'inquiry unusual, please verify' + ls_err_info)

return

end if

af_connect ()

dw_wp.settransobject (sqlca)

dw_wp.retrieve (ld_beg_date, ld_end_date, ls_accept_city)

af_disconnect ()
// PB standard sql statement calling

ls_sql = "select road_name from bb_data_wide_bus_temp_t where register_number = '" +


ls_register_number + "'"

declare cur_get dynamic cursor for sqlsa;

prepare sqlsa from: ls_sql;

open dynamic cur_get;

fetch cur_get into: ls_value;

if sqlca.sqlcode <> 0 then

messagebox ('operational information', 'extraction failed!', exclamation!)

end if

close cur_get;

// PB standard cycle call sql statement

DECLARE cur_sql DYNAMIC CURSOR FOR SQLSA;

PREPARE SQLSA FROM: ls_sql;

OPEN DYNAMIC cur_sql;

do while sqlca.sqlcode = 0

FETCH cur_sql INTO: ls_register_number,: ls_complete_note;

ll_sqlcode = sqlca.sqlcode

if ll_sqlcode <0 then

CLOSE cur_sql;

af_disconnect ()

messagebox ('error', 'Wrong number retrieved accepted!', StopSign!)

return

elseif ll_sqlcode = 100 then

exit

end if
ddlb_register_number.additem (trim (ls_register_number + '|' + ls_complete_note))

loop

CLOSE cur_sql;

// Generic Script window open event

// Home window centered

af_center_window (this)

// Connect to the database

af_connect ()

// Define variables

dataWindowChild dwc

// Get City Code drop-down list and value

dw_city_code.getChild ('city_code', dwc)

dwc.setTransObject (sqlca)

dwc.Retrieve (gs_citycode, gi_citylevel)

dw_city_code.setTransObject (sqlca)

dw_city_code.Retrieve ()

dw_city_code.setItem (1, 'city_code', dwc.getItemString (1, 'city_code'))

is_city_code = dw_city_code.getItemString (dw_city_code.getRow (), 'city_code')

// Get business type drop-down list and value

dw_service_kind.getChild ('service_kind', dwc)

dwc.setTransObject (sqlca)

dwc.Retrieve ()

dw_service_kind.setTransObject (sqlca)

dw_service_kind.Retrieve ()

dw_service_kind.setItem (1, 'service_kind', 10)

ii_service_kind = dw_service_kind.getItemNumber (dw_service_kind.getRow (), 'service_kind')

// Access applications drop-down list and values matter


dw_apply_event.getChild ('apply_event', dwc)

dwc.setTransObject (sqlca)

dwc.Retrieve (ii_service_kind)

dw_apply_event.setTransObject (sqlca)

dw_apply_event.Retrieve ()

dw_apply_event.setItem (1, 'apply_event', dwc.getItemNumber (1, 'apply_event'))

ii_apply_event = dw_apply_event.getItemNumber (dw_apply_event.getRow (), 'apply_event')

// Stimulate inquiry events

cb_query.TriggerEvent (clicked!)

// Disconnect the database

af_disconnect ()

// Query button Generic Script

// Connect to the database

af_connect ()

// Define variables

dataWindowChild dwc

// retrieving data dw_1

dw_1.setTransObject (sqlca)

dw_1.Retrieve (ii_service_kind)

// retrieving data dw_2

int li_row, li_row_temp

dw_2.getChild ('action', dwc)

dwc.setTransObject (sqlca)

dwc.Retrieve (ii_service_kind)

dw_2.setRowFocusIndicator (hand!)

dw_2.setTransObject (sqlca)

li_row_temp = dw_2.Retrieve (ii_apply_event, ii_service_kind, is_city_code)


dw_2.scrollToRow (li_row_temp)

// If you do not retrieve the data into a blank line, the data on filter

string ls_filter

int li_action

if li_row_temp = 0 then

dw_2.insertRow (0)

else

for li_row = 1 to dw_2.rowCount ()

li_action = dw_2.getItemNumber (li_row, 'action')

ls_filter = 'action <>' + string (li_action)

dw_1.setFilter (ls_filter)

dw_1.filter ()

next

end if

// Disconnect the database

af_disconnect ()

// Add button Generic Script

// Variable definitions

int li_step, li_action, li_auto_status, li_row

// Confirm the selection to increase the record

if dw_1.getSelectedRow (0) = 0 then

MessageBox ('prompt', 'Please select the record you want to add!', Exclamation!)

return

end if

// Removed to increase the information

li_step = dw_2.getItemNumber (dw_2.getRow (), 'step')

li_action = dw_1.getItemNumber (dw_1.getSelectedRow (0), 'action')


li_auto_status = dw_1.getItemNumber (dw_1.getSelectedRow (0), 'auto_status')

// Add information

li_row = dw_2.insertRow (0)

dw_2.setItem (li_row, 'step', li_step)

dw_2.setItem (li_row, 'action', li_action)

dw_2.setItem (li_row, 'auto_status', li_auto_status)

dw_2.scrollToRow (li_row)

// Delete button Generic Script

// First confirmation before deleting

IF dw_2.GetRow () = 0 THEN

MessageBox ('prompt', 'Please select the record to be deleted!', Exclamation!)

Return

ELSE

IF MessageBox ("message", "really want to delete the specified record ", Question!, YesNo!, 2) = 2 THEN
Return

dw_2.DeleteRow (dw_2.getRow ())

END IF

// Save button Generic Script

// Connect to the database

af_connect ()

// Define variables

string ls_city_code, ls_error

int li_service_kind, li_apply_event, li_row, li_step

dataWindowChild dwc

// Detect whether the data changes


dw_2.AcceptText ()

IF dw_2.ModifiedCount () + dw_2.DeletedCount () = 0 THEN

MessageBox ("Operation Tips", "data does not change, no need to save!", Exclamation!)

return

END IF

// Detects whether empty or zero

dw_2.setSort ('step a')

dw_2.sort ()

FOR li_row = 1 TO dw_2.RowCount ()

li_step = dw_2.GetItemNumber (li_row, 'step')

IF IsNull (li_step) OR li_step = 0 THEN

MessageBox ('operating tips', 'step can not be blank or zero, please re-enter!', Exclamation!)

dw_2.setRow (li_row)

Return

END IF

NEXT

// Save

dw_2.SetTransObject (sqlca)

if dw_2.update () = 1 then

commit;

messagebox ("message", "saved successfully!")

dw_2.ScrollToRow (dw_2.RowCount ())

else

ls_error = sqlca.sqlErrText

rollback;

messagebox ("message", "Save Failed!" + char (13) + ls_error, stopSign!)

return

end if

// Disconnect the database


af_disconnect ()

// Print button Generic Script

if dw_1.rowCount ()> 0 then

if PrintSetup () = -1 then

messagebox ('message', 'printer settings wrong!', Exclamation!)

return

else

if dw_1.print (true) = 1 then // can cancel the print dialog box is displayed

Messagebox ('prompt', 'print success! ")

else

Messagebox ('prompt', 'Print fail! ", StopSign!)

end if

end if

else

Messagebox ('prompt', 'no data can be printed, please check the data! ", Exclamation!)

return

end if

// Export button Generic Script

if dw_1.rowcount () <= 0 then

messageBox ('message', 'no data can be exported, please check!', exclamation!)

return

end if

if dw_1.SaveAS ('', text!, true) = 1 then

messageBox ('message', 'export success!')

end if
// Import button Generic Script

// Variable definitions

string ls_pathfile, ls_file, ls_title, ls_ext, ls_filter

int li_pos, li_fileid

long ll_buffer

// Variable assignment

ls_title = "Please select the data file."

ls_ext = "txt"

ls_filter = "text files (* .txt), *. txt, all files (*. *), *. *"

li_fileid = GetFileOpenName (ls_title, ls_pathfile, ls_file, ls_ext, ls_filter)

if (li_fileid = 0 or ls_file = "") then

return

end if

sle_file_name.text = ls_pathfile

cb_ok.enabled = true

// Exit button Generic Script

close (parent) or closeWithReturn (parent, returnvalue)

// Generic script calling process

if dw_wp.rowcount () <= 0 then return

// Variable definitions

string ls_sql, ls_err_info

string ls_register_number, ls_accept_city, ls_department, ls_oper_person

integer li_err_code, li_apply_event


// Variable assignment

ls_register_number = dw_wp.getitemstring (1, 'register_number')

ls_accept_city = gs_citycode

li_apply_event = dw_wp.getitemnumber (1, 'apply_event')

ls_department = gl_dealerid

ls_oper_person = gs_workerid

// Connect to the database

af_connect ()

// Call with number cancellation process

ls_sql = "execute bb_pstn_assign_no_repeal_p ( , , , , )"

declare proc_assign_no_repeal dynamic cursor for sqlsa;

prepare sqlsa from: ls_sql;

open dynamic proc_assign_no_repeal using: ls_register_number,: ls_accept_city,: li_apply_event,:


ls_department,: ls_oper_person;

if sqlca.sqlcode = -1 then

ls_err_info = sqlca.sqlErrText

close proc_assign_no_repeal;

Rollback;

Messagebox ("Error Message 1", "execution exception!" + Ls_err_info, stopSign!)

af_disconnect ()

return

End if

fetch proc_assign_no_repeal into: li_err_code,: ls_err_info;

if li_err_code <0 then

close proc_assign_no_repeal;

Rollback;

Messagebox ("Error message 2", "execution exception!" + Ls_err_info, stopSign!)

af_disconnect ()

return
end if

close proc_assign_no_repeal;

commit;

// Disconnect the database

af_disconnect ()

// Withdrawals after the success of the print work orders

dw_wp.print ()

// PB some controls Chinese display problems

If PB's ListView can not properly display Chinese, you should set the ListView's FontCharSet property into
other types. The

Export ListView where the object into the source code. Find ListView definition section in the source
code, which will FontCharSet property into

DefaultCharSet! If other controls PB corresponding phenomenon also occurs when the same
adjustments to its FontCharSet properties. General

Speaking for Simplified Chinese fonts in Chinese WINDOWS environment should be set to DefaultCharSet
!. Display Chinese control in question

It's FontChatSet property forcibly set to DefaultCharSet! Should be no problem. Or change the font !!!

//PB6.5 Run-time dynamic link library (Runtime Library)

PBVM60.DLL (PowerBuilder virtual machine) (required)

PBDWE60.DLL (DataWindow engine) (optional)

PBRTC60.DLL (Rich Text Control) (Optional)

PBTRA60.DLL (DLL used for tracing db calls) (optional)

Straight connector (Native Driver) or ODBC database interface connections required (ODBC Driver)

PBSYC60.DLL (connecting Sybase straight connector)

PBO7360.DLL (connection Oracle7.3 straight connector)

Client-side (such as Sybase's Open Client, Oracle's SQL Net) database connection required
These are Sybase's proposal.

My experience is that the compiled program must have pbdwe60.dll and pbvm60.dll job.

Also, if you need to use the ODBC database links pbodb60.dll, if you are using a dedicated interface, you
need the corresponding DLL database

As Oracle7.3 with PBO7360.DLL, Sybase with PBSYC60.DLL

exe file execution //pb6.5 upgrade to problems that may occur after 6.5.1

Re-copy \ Sybase \ pbvm60.dll Shared under (3.24M) instead of when not upgraded pbvm60.dll (3.25M)
on ok!

// Several common colors

Red: rgb (255,0,0) or change the eye-catching effect

Blue: rgb (0,0,255) attention to the role

Dark green: rgb (0,128,0) prompt action

// SQL AnyWhere installation methods:

When you install PB65 custom installation components ODBC Databases Drives in the Sybase SQL
anywhere 5.5.04, this is just

PB components installed ODBC driver is not installed SQL ANYWHERE, if you need to use SQL Anywhere
administration tools, you

Have the following operations: Genuine PB6.5 in the sixth disc, there is a directory name is SQLANY5504,
there is SQL ANYWHERE

Installation disk, and run SETUP can. If it is pirated, it had to rely on your own to go up. In the installation
directory there is a SETUP.BMP,

There SQL words ANHWERE above.

// Speaking to a lot of books FILE menu midpoint CREATE DATABASE, how to make this option out
In pb sixth CD (or use the D version of the second disc \ 6 \ sqlany5504), enter sqlany5504 directory,
install sql anywhere 5.5,

The default installation path is: C: After the \ Program Files \ Sybase \ SQL Anywhere 5.0 \ win32,
installation, modification

autoexec.bat, add a line for sqlanywhere file into the system search path:

path% PATH%; C: \ Progra ~ 1 \ Sybase \ SQLAny ~ 1.0 \ win32

After this reboot, you can see the File menu of the Create Database more this one.

Special Note: In the ... \ This directory under win32 there is a very important document, dbtl50t.dll, you
can do an experiment, enter

PB DataBase drawing board (no exit), then switch to the File Manager will dbtl50t.dll files to rename, and
then switch back to the PB,

Point File menu, you will find this a Create Database has disappeared. The dbtl50t.dll renamed back,
back again PB Click here

File menu, everything has returned to normal. But no Create DataBase This one is not very important,
you can also use

Sybase Central to manage the database, it is a comprehensive database management tool Sql anywhere,
you can build storage procedures, triggers.

(In the "Start" -> "Programs" -> "Sybase" -> "Sql anywhere 5.0" below, in the hard disk to perform the file
name is scview.exe).

// Not install Oracle client Oracle 8 ways to connect

Please following files are copied to the directory where the file operation

One, ODBC dynamic libraries:

ctl3d32.dll msvcrt40.dll odbc16gt.dll odbc32.dll odbc32gt.dll odbccp32.dll odbccr32.dll odbcint.dll

Second, the establishment EXTRA subdirectories, copy files to the subdirectory MSVCRT.DLL

EXTRA \ MSVCRT.DLL

Three, ORACLE dynamic libraries and configuration files

Tnsnames.ora CORE35O.DLL NASNSNT.DLL NAUNTSNT.DLL NCRNT.DLL Nlnt.dll NLSRTL32.DLL Nnfdnt.dll

NNFNNT.DLL NSNT.DLL NTNT.DLL NTTNT.DLL CIW32.DLL Ora73.dll OTRACE73.DLL Sqlnet.ora

Sqltnsnt.dll CORE35.DLL

Four, PB dynamic library


pbvm70.dll pbdwe70.dll Pbo7370.dll PBO8470.DLL pbodb70.dll libjcc.dll

// SQL7 client is not installed, the method SQL7 connection:

Just to SQL's DBNMPNTW.DLL, NTWDBLIB.DLL and PB of PBVM60.DLL, PBDWE60.DLL copied to the


directory where the EXE file

You can!

// Set the default properties of an object

In the user interface design, each adding an object such as buttons, text boxes, etc., PowerBuilder will
use the default font, size, color

And other attributes to define objects. If this is not the properties we need, then we need to modify the
properties individually. You can by default

Property changes needed to simplify for this operation. Open the application brush, in the properties can
be the default font, size, color and other attributes

Need to change the default properties.

// Data type conversion

Conversion between numeric types automatically by the system, usually converted to high-level accuracy
based on the operator to participate in operations.

Precision numeric types from high to low priority as follows:

double ← real ← decimal ← UnsignedLong, long ← UnsignedInteger

String to numeric type conversion functions:

integer (str), long (str), real (str), double (str), dec (str)

Numeric to string conversion function is:

string (number, format), number is any numeric type, format after format conversion instructions can
usually be omitted.

// Pronouns
this: This representative of the window, the user object, menu, application object or control itself, which
represents the object being to whom to write event handlers.

parent: Parent refers to the window where the current control.

ParentWindow: ParentWindow representative runtime menu window where the pronoun used only in
the event handler menu.

super: When writing a control sub-objects or object, the child object can call the parent object's event
handler, the program can directly use

The name of the parent object to call them, can also be used to refer to Super pronouns. For example,
when you want to call the parent object's Clicked event handler,

Sub-objects can be written: CALL Super :: Clicked

// System of five predefined global variables

sqlca, sqlda, sqlsa, error, message

// Relationship in PowerBuilder and RGB color values between the values as follows:

color = R * 256 * 256 + G * 256 + B

// There are fourteen kinds of standard data types

blob binary large object, used to store large amounts of data, such as images, large text, etc., such as:
blob {100} ib_test // length 100

boolean Boolean, Boolean variable has only two possible values : TRUE or FALSE

char or character, a single ASCII character

date date, including the year (1000-3000), month (01-12), 1999 (01-31)

DateTime data type datetime date and time, only for database access

dec or decimal, signed decimal number, maximum 18 precision, such as: dec {2} ld_test // 2-bit precision

double floating-point number with sign, 15 significant digits

int or integer, 16-bit signed integer


long 32-bit signed integer

real signed floating point precision 6

string string type, ASCII characters used to store an arbitrary length of 0 to 60,000 (16 environments), 32
environment length

Limited only by the capacity of the system. When the program writes directly to the string, use single
quotation marks (') or double quotes (") to enclose the string

The default value is an empty string ("")

time 24-hour time, including the hour (00 to 23), points (00 to 59), second (00 to 59) and the second
decimal place (up to six),

Range from 00:00:00 to 23:59: 59: 999999

uint or unsignedInteger, unsignedInt, 16-bit unsigned integer ranging from 0 to 65,535

ulong or unsignedLong, 32-bit unsigned integer ranging from 0 to 4,294,976,295

Any type of any variable in order to know the type of stored data, you can use the function ClassName ()

// How pictures will be stored into the database

Define a Bolb variable lb_file, the file read lb_file, with insertblob or updateblob on OK

// Variable scope

Global variables: the entire application can access, its scope is the entire application

Instance variables: the object is associated with, only be used for the object instance variables defined in
the event handler or function of the object.

Instance variables when it is associated with an object created is opened, when it is closed to disappear

Shared variables: a static variable, which means not only share when it opened again after the object is
closed object variable remains closed

Value, but also means keeping multiple instances of the same value with the same name in a class
shared variables

Local variables: the use of its event handler or function described in its scope is limited to the description
of its program segment, any segment of the program

Places can access local variables, but other programs can access this section block local variables. After
running the program, enter
When a program segment, the system automatically allocates memory for local variables, when you exit
the program segment, the memory of local variables is released.

// exit, continue, return

1.exit (exit loop):

DO ... LOOP and FOR ... NEXT loop statement, when we wanted to quit in the middle of the cycle when
the EXIT statement, control procedures

Go to the statement after the loop, in the case of nested loops, EXIT statement to exit the current level
circulation, but not all cycles.

2.CONTINUE (continued circulation):

In the body of the loop DO ... LOOP and FOR ... NEXT statement, after encountering CONTINUE
statement, after the end of the cycle does not execute CONTINUE statement

All statements before, and began a new round of circulation.

3.RETURN statement:

Return control to the user or the calling function places. (When the termination of the application you
want to run, use the HALT statement), the immediate termination of the event processing

Execution of the program or function, the control is returned to the calling program when the RETURN
statement at the event handler and a user action triggers the event

After the treatment program, the implementation of the RETURN statement, which immediately
terminates the execution of the event handler and waits for the user's next operation when the program

When calling a function or event handler, after executing the RETURN statement, which immediately
terminates execution event handler or function, and to

Control is returned to the calling program.

4.HALT {CLOSE} statement:

HALT statement is used to terminate the application to run when HALT CLOSE statement with no options,
the statement immediately terminate running applications.;

When HALT statement with CLOSE option, after execution to the statement, the application to execute
the application object Close event handler, and then re-

Terminate the application.


// Buffer

primary buffer, filter buffer, delete buffer, original buffer

When we read the data from the database, all data will be placed in the main buffer (primary buffer),
and will put a copy of the original

Buffer (original buffer) within in the data window we can see the data the main buffer (primary buffer)
within any

Data processing are also doing the main buffer for data processing, but remember, no matter what we
do the data in the buffer zone of any treatment,

Unless we run the update () function, no changes to the data in the buffer, for the back-end database
without any effect.

// How to generate a fixed-length front plus zero digits, for example: 12 generation "00012" 1234
generation "01234." The method is simple:

String (ll_number, "00000")

// row represents the number of rows, col represents the field name, val represents the value

dw_1.setItem (row, 'col', val)

dw_1.getItemX (row, 'col') // single read data faster than dot notation

dw_1.object.data // read multi-function pen notation faster data

dw_1.object.data [1]

dw_1.object.data [1,2]

dwc.object.data [1,1]

dw_1.object.data [1,1,2,2]

dw_1.object.col [1]

dw_1.object.col.current

dw_2.object.data = dw_1.object.data

dw_2.object.data = dw_1.object.data.select

// Example 1 (only executed once)


string ls_name []

ls_name = dw_1.object.col.current // all data read column col

// Example 2 (have to implement dw_1.rowCount () times)

string ls_name []

for li_row = dw_1.rowCount () to 1 step -1

ls_name [li_row] = dw_1.getItemString (li_row, 'col')

next

// Read data

retrieve ()

> // = 1 the actual number of data read from the database

= 0 // can not find any qualified data

= -1 // Read data failed

// Increase data

dw_1.insertRow (row)

dw_1.insertRow (0) // to last a

// Delete data: primary => delete!!

dw_1.deleteRow (row)

dw_1.deleteRow (0) // delete all current data rows

// Filtering data: primary => filter!!

dw_1.setFilter ('kind <1000')

dw_1.filter ()

// Data sorting

dw_1.setSort ('kind d')

dw_1.sort ()

// Data Clear

dw_1.reset () // remove the data from all of the buffer, but does not have any effect on the data in the
database
// Data calculation

dw_1.rowCount ()

dw_1.filteredCount ()

dw_1.deletedCount ()

sum dw_1.modifiedCount () // calculate all rows state DataModified! or NewModified!'s

// Data Status

notModified!

dataModified!

new! // rows only

newModified! // rows only

// Data copy

dw_1.rowsCopy (startRow, endRow, sourceBuffer!, destDW, beforeRow, destBuffer!)

dw_1.RowsCopy (dw_1.GetRow (), dw_1.RowCount (), Primary!, dw_2,1, Primary!)

// Data movement

dw_1.rowsMove (startRow, endRow, sourceBuffer!, destDW, beforeRow, destBuffer!)

dw_1.RowsMove (1, dw_1.DeletedCount (), Delete!, dw_1,1, Primary!)

// Data rolling

dw_1.scrollToRow (row)

// dw parameter

dwo.name

// describe () function

ll_color = dw_1.describe ('dataWindow.color') // ll_color = dw_1.dataWindow.color

ll_color = dw_1.describe ('kind_t.color') // ll_color = dw_1.kind_t.color

// modify () function

dw_1.modify ("dataWindow.color = '255'")

dw_1.modify ("kind_t.color = '255'")

dw_1.modify ("kind_t.color = '0 ~ tif (kind> 1000,255,0)'") // ~ t 0 is the default value for the previous

// Operating external data

fileExists ()
fileRead ()

fileLength ()

fileClose ()

fileSeek ()

fileOpen ()

fileWrite ()

// Dbf format file, or text file tab key segment fields directly introduced in the data window buffer

importFile (fileName, startRow, endRow, startCol, endCol, dwStartCol)

// How to Grid-based datawindow into Tabular type

Export data window into .srd file, use Notepad to open the processing = 1 into processing = 0

Role // Yield () function

Yield () is a function not used to PowerBuilder. However, a large loop in the process, if the user wants to
perform half

By clicking a button or menu to exit, then it must use to Yield () function, otherwise the program will
complete the entire cycle will be executed after

Respond to the Click event of the button or menu. The Yield () function in the middle of the loop body.
So find that during the execution of the loop has something new

Pieces of messages in the message queue and returned immediately to respond.

//sqlca.SQLCode

When using Embedded SQL for each SQL command you should run a check once the transaction object
attributes SQLCode, rather than wait until

All SQL command has finished running and then go run a check transaction object SQLCode properties.
When the function we use the data provided by the window, the

Do you want to remember to check SQLCode to determine whether the run was successful. But to every
function in accordance with the value of the return run to determine whether to run
Success.

update tab_test set col1 = 'test'

if sqlca.sqlCode = -1 then

rollback using sqlca;

if sqlca.sqlCode = -1 then

messageBox ('error', 'Connection failed!')

end if

messageBox ('error', 'Connection failed!')

else

commit using sqlca;

end if

To ensure the success of the data stored //

if dw_1.update () = -1 then

RollBack Using SQLCA;

MessageBox ("Warning!", "Data save failed!")

else

Commit Using SQLCA;

End if

// In PB how to open a file (such as .txt, .doc), just like in Explorer, double-click to open the file the same

A: You can by API function to achieve.

In Global External Functions are defined in the application:

Function long ShellExecuteA (ulong hwnd, string lpOperation, string lpFile, & string

lpParameters, string lpDirectory, long nShowCmd) library "shell32.dll"

Call as follows:

String ls_null
SetNull (ls_null)

ShellExecuteA (Handle (Parent), ls_null, "c: \ doc \ hello.txt", ls_null, ls_null, 1)

// Insert a row after a default value to the default value but do not modify, CloseQuery event does not
excite method

long 1_Row

1_Row = dw_1, InsertRow (dw_1, GetRow ())

dw_1.SetItem (1_Row, "discount_pct", 0,10)

dw_1.SetItemStatus (1_Row, 0, Primary!, New!)

// Value of a column with a data window is retrieved based on the value of another column (on
itemchanged event in DW)

dataWindowChild dwc

Field name if dwo.name = "vw_type_type1" then // Province

s_type1 = data

field name this.getChild ("vw_type_type2", dwc) // County

this.setItem (this.getRow (), "vw_type_type2", "")

this.setItem (this.getRow (), "vw_type_type3", "")

this.setItem (this.getRow (), "type", i_null)

s_sql = "Select distinct type2 From vw_type Where type1_code =" + "'" + s_type1 + "'" // dynamically
generated SQL statements

dwc.setTransObject (sqlca)

dwc.SetSQLSelect (s_sql)

dwc.retrieve ()

end if
Rule checking data window //

When a user enters data in the edit control, the data will not be written immediately buffer the data
window until the occurrence of any of the following,

PowerBuilder DataWindow only writes data from the edit control buffer.

1 user presses the Enter key

2 user presses the Tab key to jump to the next field

3 user presses the mouse button to jump to another field

4 Run AcceptText () function

After completely through the four steps of rule checking, will really put data into the data buffer from
the edit control window. Error in any one step

. Would produce data window ItemError Event data rule checking step data window are as follows:

Whether 1 data change

2 Data Types meets

3 meets user-defined field rules

4 meets ItemChanged Event program

// Edit control function

AcceptText (): write data to the data in the edit control window buffer.

Do not write Acceptext () function in Itemchanged or ItemError event because Acceptext () function may
drive

ItemChanged or ItemError event, which will cause an infinite loop occurs.

GetText (): read the text edit control.

// Function Function similar event and every event, there will be arguments argument and return value
return value.

ItemChanged Event Returns:


0.5 accept data values (default)

1 reject the value of data

2-value data and refuse to change focus

ItemError Event Returns:

0.5 reject the value of the data, and displays a system error message (default)

Value of 1. Reject the data, but the system does not display an error message

Accept the value of the data

3-value data and refuse to change focus

// dw's update properties

Where conditional clause is generated by:

1. Key Columns: When comparing raw data buffer and the data generated by the current database where
clause condition is not stringent enough, so in the same

A time when there are a lot of users may use the database with the changed circumstances would
someone data coverage will occur in order to

Avoid this from happening, usually we will KeyColumns way relationship with a single user or a table, all
the fields are

Primary Key of the situation.

2.Key and Updateable Columns: because the data in the buffer and compare the original data generated
by the current database

where conditional clause is very rigorous, so in the same time, when a lot of users use the database
together, does not happen to other people

Data covering the situation changed, so we can get the maximum consistency when data is saved.

3.Key and Modified Columns: because the data in the current database generated by comparing the data
buffer where clause

Conditions more flexible (Modified to modify the current value of the field), so in the same time, when
many users use the data together

Library, the situation will be changed by others data coverage may occur.

The main field (Key Column) changes the way:

1.Use Delete then Insert: This is the data window when you modify the main field (Key Column) is the
default option, the choice this way
When you modify the data, the data will first be deleted and then re-increase a data, but in the use of
special note is that if the relationship

Database, when designing deleted for Cascade Delete, modify data in time may result in additional data
not want to delete are deleted.

In addition, the choice of the field must select all the fields, otherwise there is no way to increase a
further weight data.

2.Use Update: This option will directly modify the value Key field, but not all of the relational database
(DBMS) provides such

Function.

// Dynamic Data Window

DataWindow object syntax:

ls_syntax = sqlca.syntaxFromSql ('select kind, name from tab_t', 'style (type = tabular)', ls_err1)

dw_1.create (ls_syntax, ls_err2)

dw_1.setTransObject (sqlca)

dw_1.retrieve ()

// Read multiple rows of data

1 shows a cursor with a DECLARE; (post without checking SQLCode property, to use a semicolon to end
the statement.)

Open the cursor using the OPEN statement;

3 Use the FETCH statement reads a line of data;

4 processing data;

5 to determine whether all of the data has been read, repeat steps 3 to 5 when not reading;

6. CLOSE statement to close the cursor.

int Emp_num

string Emp_name

DECLARE Emp_cur CURSOR FOR

SELECT employee.emp_number, employee.emp_name FROM employee;


open emp_cur;

FETCH Emp_cur INTO: Emp_num,: Emp_name;

if sqlca.sqlcode = -1 then

rollback;

messagebox ('', '')

return

end if

CLOSE Emp_cursor;

// Dynamic SQL (There are four types)

// 1. Neither input parameters, and no result set

string Mysql

Mysql = "CREATE TABLE Employee" &

+ "(emp_id integer not null," &

+ "dept_id integer not null," &

+ "emp_fname char (10) not null," &

+ "emp_lname char (20) not null)"

EXECUTE IMMEDIATE: Mysql USING SQLCA;

// 2. Has input parameters, but no result set

int Emp_id_var = 56

PREPARE SQLSA FROM "DELETE FROM employee WHERE emp_id = ";

EXECUTE SQLSA USING: Emp_id_var;

// 3. Already know the parameters and result set when compiling the column (cursor or stored
procedure)

int Emp_id_var

String Emp_state_var = "Beijing", Sqlstatement

Sqlstatament = "SELECT emp_id FROM employee WHERE emp_state = "

DECLARE my_cursor DYNAMIC CURSOR FOR SQLSA;


PREPARE SQLSA FROM: Sqlstatement;

OPEN DYNAMIC my_cursor using: Emp_state_var;

FETCH my_cursor INTO: Emp_id_var;

if sqlca.sqlcode = -1 then

rollback;

messagebox ('', '')

return

end if

CLOSE my_cursor;

// Or

int Emp_id_var

String Emp_state_var = "Beijing", proc, ls_error, ls_prompt

proc = "execute bb_pstn_complete_wp_p ( )"

DECLARE my_cursor DYNAMIC CURSOR FOR SQLSA;

PREPARE SQLSA FROM: proc;

OPEN DYNAMIC my_cursor using: Emp_state_var;

if sqlca.sqlcode = -1 then

ls_error = sqlca.sqlErrText

rollback;

MessageBox ('message', 'process execution failed!' + Char (13) + ls_error)

end if

FETCH my_cursor INTO: Emp_id_var;

if li_flag = -1 then

rollback;

MessageBox ('message', 'process execution failed!' + Char (13) + ls_prompt)

end if

CLOSE my_cursor;

// 4. Development program fashion do not know the parameters and result sets

string Stringvar, Sqlstatement


int Intvar

Sqlstatement = "SELECT emp_id FROM employee"

PREPARE SQLSA FROM: Sqlstatement;

DESCRIBE SQLSA INTO SQLDA;

DECLARE my_cursor DYNAMIC CURSOR FOR SQLSA;

OPEN DYNAMIC my_cursor USING DESCRIPTOR SQLDA;

FETCH my_cursor USING DESCRIPTOR SQLDA;

// When the FETCH statement is executed successfully, the dynamic description area SQLDA contains the
first row of the result set data can be obtained repeatedly execute the FETCH statement

// Rest of the data. SQLDA.NumOutputs contains a number of output parameters. SQLDA.OutParmType


array contains the data of the parameters

// Example TypeInteger !, or TypeString! Etc., use CHOOSE CASE statement calling for different output
parameters of different types of objects

// Function to get the value of the corresponding parameter.

CHOOSE CASE SQLDA.OutParmType [1]

CASE TypeString!

Stringvar = GetDynamicString (SQLDA, 1)

CASE TypeInteger!

Intvar = GetDynamicNumber (SQLDA, 1)

END CHOOSE

CLOSE my_cursor;

// In addition to the DECLARE statement, executed after all other statements should check SQLCode
property transaction object, in order to determine whether the current SQL statement execution

// Successful.

// Get the display value of the pull-down data window

ls_value = dw_1.Describe ("Evaluate ('LookupDisplay (column_name)'," + string (row_number) + ")")


// Previous column method of fixing the data window, for example, the first column called "id", fixed the
column and started to show from the second half of the next column:

dw_1.HSplitScroll = True

dw_1.Object.DataWindow.HorizontalScrollSplit = dw_1.object.id.Width

dw_1.Object.DataWindow.HorizontalScrollPosition2 = dw_1.object.id.Width

// Print data window last one approach:

string ls_pagecount

ls_PageCount = dw_1.describe ("Evaluate ('PageCount ()', 0)")

dw_1.object.datawindow.print.page.range = '"+ ls_PageCount +"' "

dw_1.print ()

// When the edit box to get focus automatically selected content:

this.selecttext (1, len (sle_1.text))

// Determine whether there is a column in the data window

You can use Describe ("column_name.width") to determine whether the "!";

// Hide the taskbar method in use in the OnCreate event Window API function SetWindowLong:
SetWindowLong (Application.Handle, GWL_EXSTYLE, WS_EX_TOOLWINDOW);

PB using the first declare the function FUNCTION long SetWindowLong (ulong hWnd, integer nIndex,
ulong dwNewLong) library "user32.dll" ALIAS FOR "SetWindowLongA",

Then call: SetWindowLong (Handle (this), - 20,128);

// If more than 23 this month, will be the 1st time is set for next month, otherwise take the current time
// Method 1:

if day (today ())> 23 then

if month (today ()) + 1> 12 then

this.text = left (string (today (), 'yyyy-mm-dd'), 5) + '01-01'

else

this.text = string (date (year (today ()), month (today ()) + 1,1))

end if

else

this.text = string (today ())

end if

// Method 2:

dateld_temp = today ()

if day (ld_temp)> 23 then ld_temp = date (year (RelativeDate (ld_temp, 10)), month (RelativeDate
(ld_temp, 10)), 1)

sle_1.text = string (ld_temp)

PB // two useful internal functions

1.shRunDefltBrowser call the default browser, open the specified page

Version: PBVM60.dll, PBVM80.dll, PB7 I have not used, but I think there should be.

Function declaration: function long shRunDefltBrowser (string szUrl) library "pbvm60.dll"

Call the method: shRunDefltBrowser ("http://www.pdriver.com/")

2 shCenterWindow the window in the center of the screen

Version: PBVM60.dll, PBVM80.dll, PB7 I have not used, but I think there should be.

Function declaration: function long shCenterWindow (long hWnd) library "pbvm60.dll"

Call the method: shCenterWindow (handle (w_about))


// Allows the user to modify the newly added records, and the records retrieved are not allowed to
modify.

Open the properties listed in the Expressions, input conditions in protect the discriminant:

if (isRowNew (), 0,1)

// Ole object, such as when using the communication with the Word, how to avoid multiple Word and
other programs to start:

OLEObject ole_object

ole_object = CREATE OLEObject

li_ret = ole_object.ConnectToObject ("", "word.application")

IF li_ret <> 0 THEN

// If Word is not open, then New.

li_ret = ole_object.ConnectToNewObject ("word.application")

if li_ret <> 0 then

MessageBox ('OLE Error', 'OLE unable to connect Error Number:!' + String (li_ret))

return

end if

ole_object.visible = true

END IF

Use // progress bar

Although no such controls, but there is a PowerBuilder user object in the case brought in in
PowerBuilder

uo_progress_bar able to complete the necessary requirements. The object is copied to the user's user
database application resides, place it in the user interface

Local needs arise. Then when the task progress, with uf_set_position object () function indicates the
current progress of the task.
// Call screen protection method in PB:

send (handle (This), 274,61760,0)

// Get an application such as Outlook's path

RegistryGet ("HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ Windows \ CurrentVersion \ App Paths \


MSIMN.EXE", &

"Path", ls_outlook_path)

Path // Outlook will be saved in the string variable ls_outlook_path.

// Get path when the program is running

// External functions declared in the global:

Function uLong GetModuleFileNameA (long hinstModule, Ref String lpszPath, uLong cchPath) Library
"kernel32.dll"

// Program path is stored in the variable ls_AppPath

string ls_AppPath

int li_ret

ls_AppPath = Space (128)

li_ret = GetModuleFileNameA (Handle (GetApplication ()), ls_apppath, 128)

// To compile into an executable file .exe available, otherwise get is the path of pb60.exe or PB050.exe of
Powerbuilder.

// Editing style columns dynamically set in the program for the pull-down data window
(DropDownDataWindow)

// Assumptions set as department number "department_id", associated sub-data window for


"d_dddw_dep",

// Display as a department name "dept_name", data as department number "dept_id", achieved as


follows:
dw_1.Modify ("department_id.DDDW.Name = d_dddw_dep")

dw_1.Modify ("department_id.DDDW.DisplayColumn = 'dept_name'")

dw_1.Modify ("department_id.DDDW.DataColumn = 'dept_id'")

// Or:

dw_1.object.department_id.dddw.name = "d_dddw_dep"

dw_1.object.department_id.DDDW.DisplayColumn = "dept_name"

dw_1.object.department_id.DDDW.DataColumn = "dept_id"

// Note: PowerBuilder has a small tool DWSyntax (program called: dwsyn60.exe), provides access to and
modification of the data window,

The syntax of the attribute value // columns, etc., of the programming is very helpful. These scripts can
be found in DWSyntax.

// Incremental search function realization

// 1. Line editor for user-defined event ue_enchange, ID events is: pbm_enchange. This event can
respond to keyboard input.

// 2. Write the following script in a single-line editor ue_enchange event:

long ll_found_row

string ls_find

ls_find = "string (id) like" + "'" + this.text + "%'" // search conditions (left part of the single-line text editor
equivalent)

ll_found_row = dw_1.Find (ls_find, 1, dw_name.RowCount ()) // find qualified OK

if ll_found_row <= 0 then return

dw_1.ScrollToRow (ll_found_row) // scroll to match the line

dw_1.SelectRow (0, false)

dw_1.SelectRow (ll_found_row, true) // will highlight matching lines

// How in the program written for the database BLOB

And database-related: to SQLANYWAY example:


General use UPDATEBLOB and SELECTBLOB two SQL statement to achieve.

Build a table TABLE1, a field is ID, and the other is BLOB,

SELECTBLOB BLOB FROM TABLE1 WHERE ID = 'xx';

UPDATEBLOB SET BLOB =: BLB_X FROM TABLE1 WHERE ID = 'yy';

Deleted when you delete ID is 'mm' records can be, is to insert a new ID as 'mm' records, and then writes
the data with UPDATEBLOB

Table. Other databases may reference manual, the command above is not very different!

// How to remove content DDDW the Display Column of.

dw_1.describe ("Evaluate ('lookupdisplay (column_name)', 1)")

// column_name = column name, 'a' represents the first row; look at Help the Describe

// Shielded window ALT + F4 keys

// Method one:

1 Add the following code in systemkey event window:

IF KeyDown (KeyF4!) THEN

Message.Processed = TRUE

END IF

2 Add the following code in closequery event window:

Long ll_ret

IF KeyDown (keyF4!) THEN

ll_ret = 1

END IF

return ll_ret

// Method two:

Build a instance variables in your True then close the program assigns a value judgment that closequery,
such as False then Return 1
// When the program is used in a dynamic join objects, such as BMP resource files, data window object,
PB compile time is less than the scan, the solution:

1. This object is written to the resource file:

The use Notepad to create a resource file dw_object.pbr writes: c: \ myprogram.pbl (dw_sj)

This file into the Resource File Name selected at compile time.

2. The application is compiled into PBD, DLL files.

// How to achieve in PB delay:

subroutine Sleep (long dwMilliseconds) library "kernel32.dll"

Delay of one second is called: Sleep (1000) // milliseconds.

// With the following expression can be obtained in a certain group recorded line number:

Getrow () - First (Getrow () for Group 1) +1

// Call the API function steps:

1, in the appropriate position statement functions, such as windows, the Application, UserObject inside,

Defined in the Local External Function or Global External Function, as playing sounds:

Function boolean sndPlaySoundA (string SoundName, uint Flags) Library "WINMM.DLL"

Function uint waveOutGetNumDevs () Library "WINMM.DLL"

You can also create a UserObject, centralized declared common API and localization functions, such as
the definition of user objects u_external_function:

Declare Local External Function (define external function):

Function boolean sndPlaySoundA (string SoundName, uint Flags) Library "WINMM.DLL"

Function uint waveOutGetNumDevs () Library "WINMM.DLL"


Declare User Object Function (user-defined object function):

uf_play_sound (string as_wave_name, integer ai_option)

Function as follows:

// Parameters: as_wave_name: wav file name ai_option: synchronous or asynchronous (1/0)

uint lui_numdevs

lui_numdevs = WaveOutGetNumDevs ()

If lui_numdevs> 0 Then

sndPlaySoundA (as_wave_name, ai_option)

return 1

Else

return -1

End If

2, the definition of an entity called in the program and call its function:

u_external_function iu_external_function

iu_external_function = create u_external_function

iu_external_function.uf_play_sound ('c: \ windows \ media \ ding.wav', 1)

Try, if you have a sound card, you will hear a "ding" sound. Other API functions are treated as such.

// GRID format data under the window, according to the actual situation of each row to control the
background

// Adjust the properties of the color detail the expression on it, such as:

if (currentrow () = getrow (), rgb (255,240,194), if (mod (getrow (), 2) = 1, rgb (255,254,249), rgb
(247,247,239)))

// Expression rgb (255,240,194) as a yellow, rgb (255,254,249) as a pale white, rgb (247,247,239) as a
pale yellow.

// CurrentRow () to get the data window to get the input focus current line number.

// GetRow () returns the data window corresponding with the current line number.
// Achieve the data window of a column / row is displayed as a specified color

// If you meet the conditions, displays a gray background, otherwise white;

This method can also set the font color of the column: where "column_name" as the column name.

dw_1.object.column_name.background.color = "16777215 ~ tif (fromid = 'string', rgb (192,192,192), rgb


(255,255,255))"

May also have a line color:

dw_1.object.Datawindow.detail.color = "16777215 ~ tif (fromid = 'string', rgb (192,192,192), rgb


(255,255,255))"

// Previous column method of fixing the data window, for example, the first column called "id", fixed the
column and started to show from the second half of the next column:

dw_1.HSplitScroll = True

dw_1.Object.DataWindow.HorizontalScrollSplit = dw_1.object.id.Width

dw_1.Object.DataWindow.HorizontalScrollPosition2 = dw_1.object.id.Width

// In the data window How to hide a computing unit

Set in its properties \ expression \ visible property "IF (1 = 2,1,0)" on it.

// Hyperlink

Inet linet_base

GetContextService ("Internet", linet_Base)

linet_Base.HyperlinkToURL ('http://www.neusoft.com')

Destroy (linet_base)

// ================================================ ===========================

// Function: Returns the value of the expression


// Parameters: string thestr calculation expression, such as 2 * (3 + 5)

// Return value: string retVal calculated value of the expression, such as 2 * (3 + 5) result is 16

// If it is an incorrect expression, returns false.

// ================================================ ===========================

string retVal

datastore lds_evaluate

lds_evaluate = create datastore

lds_evaluate.create ('release 8; ~ r ~ ntable ()')

retVal = lds_evaluate.describe ("evaluate ('" + thestr + "', 1)")

destroy lds_evaluate

return retVal

// Commonly used API functions by example

1. How to make PB window always on top (Always On Top)

By SetWindowPos function to display the level of the window changes to HWND-TOPMOST, you can
make the specified window will never be another window cover

Cover, this function is declared as:

Function Long SetWindowPos (Long hwnd, Long ord, Long x, Long y, Long dx, Long dy, Long uflag) Library
"user32"

Parameter 1 to be the top-level display window handle parameter 2 to specify the display level,
parameter 7 as an additional option, the remaining parameters specify the window position and

Size, can be ignored. Add the following function in Open or Activate event window to call:

SetWindowPos (Handle (This), - 1,0,0,0,0,3)

Parameter 2 to take -1 indicates the topmost display window, take 1 represents the lowest level in the
display; If we take one last parameter, indicating that the window size remains
Variable, indicating the holder 2 to take the same position, and therefore, take 3 (= 1 + 2) indicates the
size and position remain unchanged, 0, it indicates the size of the window, and

Position is changed to the specified value.

2. How to get the disc drive in PB

You can get the drive through GetDriveType function (eg: floppy drive, hard disk, CD-ROM, network
mapped drives, etc.) information, the function

Declared as:

Function Uint GetDriveTypeA (String drive) Library "kernel32.dll"

Parameters for a drive letter (such as "C:"), the return value: 1 means unknown, 2 floppy drive, three said
the local hard drive, 4 represents a network drive,

5 shows the optical drive. Therefore, the following code can get the disc drive:

For i = Asc ('D') to Asc ('Z')

// Enumerate all possible CDROM drive

If GetDriveTypeA (Char (i) + ":") = 5 Then

// If you find CDROM

MessageBox ("CDROM", Char (i) + ":")

// Display disc drive

Exit // exit list

End If

Next

3. How to get directory information in PB

⑴ get the current directory. You can get the current directory by GetCurrentDirectory function, which is
declared as:

Function Ulong GetCurrentDirectoryA (Ulong buflen, ref String dir) Library "kernel32.dll"

Parameter 2 to receive the current directory character buffer, ref must be added in front of said address
references; parameter 1 to length specified character buffer.

Call the procedure as follows:

String curdir
curdir = Space (256)

// Opened up space for character buffer memory

GetCurrentDirectoryA (256, curdir)

MessageBox ("Current Directory", curdir)

⑵ get Windows and system directories. GetWindowsDirectory and GetSystemDirectory to use two
functions, subject to the following statement:

Function Uint GetWindowsDirectoryA (ref String dir, Uint buflen) Library "kernel32.dll"

Function Uint GetSystemDirectoryA (ref String dir, Uint buflen) Library "kernel32.dll"

4. How in the PB off the current user, shut down the computer, restart the computer

ExitWindowsEx function can be achieved by these three functions, first make the following statement:

Function Long ExitWindowsEx (Long uflag, Long nouse) Library "user32.dll"

Parameter 2 remains unused, it is advisable 0; take 0 parameters one can log off the current user, you
can take a turn off the computer, take the two can restart the computer, and its value

Plus 4 represents the forced end "not responding" process.

5. Control program run by the Run (referred to Run Program)

In the PB programming, some programs can be run using Run (). For example, the user presses the F1,
you run a chm file. Run the program but can not

PB coordination with the main program, if the user presses a number of F1, will launch multiple
instances Run the program, the main program exits, Run the program remains

Operation. You can use the following functions to enable them to coordinate work:

Function Ulong FindWindowA (Ulong classname, String windowname) Library "user32.dll"

Function Long SetParent (Long childwin, Long parentwin) Library "user32.dll"

⑴ make Run the program run only one instance of

handle = FindWindowA (nul, wtitle)

// Look for Run program is already running, wtitle title Run program

IF handle> 0 Then Return

// If you are already running on return

Run ("C: \ Program Files \ Joint \ Joint.chm")


// Otherwise run Run program

When ⑵PB main exit, Run program also closed

handle = FindWindowA (nul, wtitle)

SetParent (handle, Handle (w-main))

// Make Run PB main program window becomes a child window

6. Mapping a network drive

To program the remote host's resources mapped to a local drive, you can use the following function:

Function long WNetAddConnectionA (String path, string pwd, String drv) Library "mpr.dll"

The following code can share files on a remote host Alexander My Documents folder is mapped to the
local J disk:

WNetAddConnectionA ("\\ Alexander \ My Documents", "", "J:") // parameter 2 to access password

It acts to perform at the DOS prompt: Net Use J: file: // alexandermy / Documents

7. Show or hide the Windows taskbar

To show or hide the taskbar, it must first get the window handle. Taskbar is a special window, its window
class as follows:

Shell-TrayWnd, no title, it can only be used FindWindowEx function to get its handle:

Function long FindWindowEx (long ph, long ch, ref String cn, ref String wn) Library 'user32'

Function Long ShowWindow (Long hWnd, Long nCmdShow) Library 'user32'

Use ShowWindow to show or hide the window, its second parameter is 0 to hide for five, said display:

handle = FindWindowEx (0,0, "Shell-TrayWnd", wn) // wn empty string

ShowWindow (handle, 0) // hide the taskbar

8. How long file names to short file name

GetShortPathName function through long file names can be converted to 8.3 format, which is declared
as:

Function Long GetShortPathNameA (String lf, ref String sf, Long buflen) Library 'kernel32'

Parameter 1 for long file names, parameter 2 to save short file name buffer, the buffer length parameter
3. For example:
GetShortPathNameA ("C: \ My Documents \ PowerBuilder programming practices .Doc", sf, 256) // sf =
Space (256)

9. How to achieve the delay in PB

Delay function is useful, although PB is not provided, but can be extended by the Win32 Sleep function:

Function Long Sleep (Long ms) Library "kernel32"

Call: Sleep (1000) // delay one second

10. How to play music in PB

PB did not provide any multimedia function, to play music only through the Win32 API PlaySound to
achieve:

Function Long PlaySound (String Filename, Int Mod, Int Flags) Library "winmm.dll"

Wav file name parameter 1, parameter 2 must be 0, parameter 3 to take a background player said, taking
eight said loop, so take 9 (= 1 + 8) in the background loop.

11, access to the Windows system directory

First, the following statement external function:

Function uint GetWindowsDirectoryA (ref string dirtext, uint textlen) library "KERNEL32.DLL"

Script follows:

String ls_WinPath

ls_WinPath = Space (128)

GetWindowsDirectoryA (ls_WinPath, 128)

12, play AVI files

First, declare external functions as follows:

Function uLong SendMessageA (ulong hWnd, ulong wMsg, ulong wParam, string lParam) library
"user32.dll"

External user-defined object uo_comctl_animate, DLL name filled comctl32.dll, class names fill
sysanimate32.

User object instance variables are defined as follows constants:


Constant Private Long WM_USER = 1024

Constant Private Long AviFileComp = 101

Constant Private Long AviSearch = 102

Constant Private Long AviFileCopy = 103

Constant Private Long AviDownload = 104

Constant Private Long AviPrinting = 105

Constant Private Long ACM_OPEN = WM_USER + 100

Constant Private Long ACM_PLAY = WM_USER + 101

Constant Private Long ACM_STOP = WM_USER + 102

Function (play AVI files) define the user object:

of_playavi (readonly string as_avifilename) returns long

SendMessagea (handle (this), ACM_OPEN, 0, as_avifilename)

Return Send (handle (this), ACM_PLAY, -1, 4294901760)

And functions (stop playing):

of_stopplay () returns long

Return Send (Handle (this), ACM_STOP, 0, 0)

Next, create the user object uo_test in the window, calling uo_test.of_playavi ("xxx.avi")

And uo_test.of_stopplay () to play and stop a file named "xxx.avi" of AVI.

13. limit the application runs only once

. Declare external functions as follows:

FUNCTION boolean ShowWindow (ulong winhandle, & int wincommand) Library "user32"

FUNCTION boolean BringWindowToTop (ulong HWND) & Library "user32"

FUNCTION long FindWindowA (ulong Winhandle, & string wintitle) Library "user32"

Creating a window 'w_test'. The title is set to "Test Window".

Add the following code in the application's Open event:

long ll_winhandle

ll_winhandle = FindWindowA (0, "Test Window")

If ll_winhandle> 0 Then
BringWindowToTop (ll_winhandle)

ShowWindow (ll_winhandle, 5)

Return

End If

Open (w_test)

14 will be converted to long file names short file name

Declare external functions as follows:

function long GetShortPathNameA (string lpLong, ref string lpShort, long lBuff) library 'kernel32'

Defined functions f_Convert (string as_long), the function code is as follows:

String ls_Buffer

Long ll_RC

ls_Buffer = Space (255)

ll_RC = GetShortPathNameA (as_Long, ls_Buffer, 255)

RETURN ls_Buffer

// other events are what use

other event occurs when a Windows message and when the message is do not correspond to the control
of a powerBuilder event trigger;

The numerical number message.number representative events, this number is provided by Windows

// PB of SHELL command

1 command: rundll32.exe shell32.dll, Control_RunDLL

Function: Display Control Panel

2 command: rundll32.exe shell32.dll, Control_RunDLL access.cpl ,, 1

Function: Display "Control Panel -> Accessibility Options -> Keyboard" option Windows

3 command: rundll32.exe shell32.dll, Control_RunDLL access.cpl ,, 2


Function: Display "Control Panel -> Accessibility Options -> Sound" option Windows

4 command: rundll32.exe shell32.dll, Control_RunDLL access.cpl ,, 3

Function: Display "Control Panel -> Accessibility Options -> Display" option Windows

5 command: rundll32.exe shell32.dll, Control_RunDLL access.cpl ,, 4

Function: Display "Control Panel -> Accessibility Options -> Mouse" option Windows

6 command: rundll32.exe shell32.dll, Control_RunDLL access.cpl ,, 5

Function: Display "Control Panel -> Accessibility Options -> General" option Windows

7 command: rundll32.exe shell32.dll, Control_RunDLL sysdm.cpl // 1

Function: Performs "Control Panel -> Add New Hardware" wizard.

8 command: rundll32.exe shell32.dll, SHHelpShortcuts_RunDLL AddPrinter

Function: Performs "Control Panel -> Add New Printer" wizard.

9 command: rundll32.exe shell32.dll, Control_RunDLL appwiz.cpl ,, 1

Function: Display "Control Panel -> Add / Remove Programs -> Install / Uninstall" panel.

10. command: rundll32.exe shell32.dll, Control_RunDLL appwiz.cpl ,, 2

Function: Display "Control Panel -> Add / Remove Programs -> Install Windows" panel.

11 command: rundll32.exe shell32.dll, Control_RunDLL appwiz.cpl ,, 3

Function: Display "Control Panel -> Add / Remove Programs -> Startup Disk" panel.

12 command: rundll32.exe syncui.dll, Briefcase_Create

Function: Create a new "My Briefcase" on the desktop.

13 command: rundll32.exe diskcopy.dll, DiskCopyRunDll

Function: Display Copy Floppy Windows

14 command: rundll32.exe apwiz.cpl, NewLinkHere% 1

Function: Display "Create Shortcut" dialog box, created a shortcut to the location determined by the% 1
parameter.

15. command: rundll32.exe shell32.dll, Control_RunDLL timedate.cpl ,, 0

Function: Display the "Date and Time" option window.

16. command: rundll32.exe shell32.dll, Control_RunDLL timedate.cpl ,, 1

Function: Display "Time Zone" option window.

17 command: rundll32.exe rnaui.dll, RnaDial [a dial-up connection name]


Function: Display a dial-up connection dial window. If you have dial-up connection, it shows the current
connection status window.

18. command: rundll32.exe rnaui.dll, RnaWizard

Function: Display "New Connection" wizard window.

19. command: rundll32.exe shell32.dll, Control_RunDLL desk.cpl ,, 0

Function: Display the "Display Properties -> Background" option window.

20. command: rundll32.exe shell32.dll, Control_RunDLL desk.cpl ,, 1

Function: Display the "Display Properties -> Screen Saver" option window.

21. command: rundll32.exe shell32.dll, Control_RunDLL desk.cpl ,, 2

Function: Display the "Display Properties -> Appearance" option window.

22. command: rundll32.exe shell32.dll, Control_RunDLL desk.cpl ,, 3

Function: Display shows "Display Properties -> Properties" option window.

23. command: rundll32.exe shell32.dll, SHHelpShortcuts_RunDLL FontsFolder

Function: Display the Windows "Fonts" folder.

24. command: rundll32.exe shell32.dll, Control_RunDLL main.cpl // 3

Function: the same display the Windows "Fonts" folder.

25. command: rundll32.exe shell32.dll, SHformatDrive

Function: Display formatted floppy disk dialog.

26. command: rundll32.exe shell32.dll, Control_RunDLL joy.cpl ,, 0

Function: Display "Control Panel -> Game Controllers -> General" option window.

27. command: rundll32.exe shell32.dll, Control_RunDLL joy.cpl ,, 1

Function: Display "Control Panel -> Game Controllers -> Advanced" options window.

28. command: rundll32.exe mshtml.dll, PrintHTML (HTML document)

Function: print an HTML document.

29. command: rundll32.exe shell32.dll, Control_RunDLL mlcfg32.cpl

Function: Display the Microsoft Exchange General Options window.

30. command: rundll32.exe shell32.dll, Control_RunDLL main.cpl // 0

Function: Display "Control Panel -> Mouse" option.

31. command: rundll32.exe shell32.dll, Control_RunDLL main.cpl // 1


Function: Display "Control Panel -> Keyboard Properties -> Speed " option window.

32. command: rundll32.exe shell32.dll, Control_RunDLL main.cpl // 1,, 1

Function: Display "Control Panel -> Keyboard Properties -> Language" option window.

33. command: rundll32.exe shell32.dll, Control_RunDLL main.cpl // 2

Function: Display Windows "Printers" folder.

34. command: rundll32.exe shell32.dll, Control_RunDLL main.cpl // 3

Function: Display Windows "Fonts" folder.

35. command: rundll32.exe shell32.dll, Control_RunDLL main.cpl // 4

Function: Display "Control Panel -> Input Method Properties -> Input Method" option window.

36. command: rundll32.exe shell32.dll, Control_RunDLL modem.cpl ,, add

Function: Perform "Add New Modem" wizard.

37. command: rundll32.exe shell32.dll, Control_RunDLL mmsys.cpl ,, 0

Function: Display "Control Panel -> Multimedia Properties -> Audio" property page.

38. command: rundll32.exe shell32.dll, Control_RunDLL mmsys.cpl ,, 1

Function: Display "Control Panel -> Multimedia Properties -> Video" property page.

39. command: rundll32.exe shell32.dll, Control_RunDLL mmsys.cpl ,, 2

Function: Display "Control Panel -> Multimedia Properties -> MIDI" property page.

40. command: rundll32.exe shell32.dll, Control_RunDLL mmsys.cpl ,, 3

Function: Display "Control Panel -> Multimedia Properties -> CD Music" property page.

41. command: rundll32.exe shell32.dll, Control_RunDLL mmsys.cpl ,, 4

Function: Display "Control Panel -> Multimedia Properties -> Device" property page.

42. command: rundll32.exe shell32.dll, Control_RunDLL mmsys.cpl // 1

Function: Display "Control Panel -> Sound" option window.

43. command: rundll32.exe shell32.dll, Control_RunDLL netcpl.cpl

Function: Display "Control Panel -> Network" option window.

44. command: rundll32.exe shell32.dll, Control_RunDLL odbccp32.cpl

Function: Display ODBC32 data management options window.

45. command: rundll32.exe shell32.dll, OpenAs_RunDLL {drive: \ path \ filename}

Function: Display the specified file (drive: \ path \ filename) of the "Open" dialog box.
46. command: rundll32.exe shell32.dll, Control_RunDLL password.cpl

Function: Display "Control Panel -> Password" option window.

47. command: rundll32.exe shell32.dll, Control_RunDLL powercfg.cpl

Function: Display "Control Panel -> Power Management Properties" option window.

48. command: rundll32.exe shell32.dll, SHHelpShortcuts_RunDLL PrintersFolder

Function: Display Windows "Printers" folder. (With rundll32.exe shell32.dll, Control_RunDLL main.cpl //
2)

49. command: rundll32.exe shell32.dll, Control_RunDLL intl.cpl ,, 0

Function: Display "Control Panel -> Regional Settings Properties -> Regional Settings" option window.

50. command: rundll32.exe shell32.dll, Control_RunDLL intl.cpl ,, 1

Function: Display "Control Panel -> Regional Settings Properties -> Digital" option window.

51. command: rundll32.exe shell32.dll, Control_RunDLL intl.cpl ,, 2

Function: Display "Control Panel -> Regional Settings Properties -> Currency" option window.

52. command: rundll32.exe shell32.dll, Control_RunDLL intl.cpl ,, 3

Function: Display "Control Panel -> Regional Settings Properties -> Time" option window.

53. command: rundll32.exe shell32.dll, Control_RunDLL intl.cpl ,, 4

Function: Display "Control Panel -> Regional Settings Properties -> Date" option window.

54. command: rundll32.exe desk.cpl, InstallScreenSaver [Screen Saver File name]

Function: The screen saver file specified settings for Windows screensavers, screen saver and display
properties window.

55. command: rundll32.exe shell32.dll, Control_RunDLL sysdm.cpl ,, 0

Function: Display "Control Panel -> System Properties -> Traditional" Properties window.

56. command: rundll32.exe shell32.dll, Control_RunDLL sysdm.cpl ,, 1

Function: Display "Control Panel -> System Properties -> Device Manager" Properties window.

57. command: rundll32.exe shell32.dll, Control_RunDLL sysdm.cpl ,, 2

Function: Display "Control Panel -> System Properties -> Hardware Profiles" Properties window.

58. command: rundll32.exe shell32.dll, Control_RunDLL sysdm.cpl ,, 3

Function: Display "Control Panel -> System Properties -> Performance" Properties window.

59. command: rundll32.exe user.exe, restartwindows


Function: forced to close all programs and restart the machine.

60. command: rundll32.exe user.exe, exitwindows

Function: forced to close all programs and shut down.

61. command: rundll32.exe shell32.dll, Control_RunDLL telephon.cpl

Function: Display "Dialing Properties" option window. .

62. command: rundll32.exe shell32.dll, Control_RunDLL themes.cpl

Function: Display "Desktop Themes" option panel.

// PB key code constants described

vbKeyLButton 1 left mouse button

vbKeyRButton 2 Right

vbKeyCancel 3 CANCEL button

vbKeyMButton 4 middle mouse button

vbKeyBack 8 BACKSPACE key

vbKeyTab 9 TAB key

vbKeyClear 12 CLEAR key

vbKeyReturn 13 ENTER key

vbKeyShift 16 SHIFT key

vbKeyControl 17 CTRL key

vbKeyMenu 18 Menu key

vbKeyPause 19 PAUSE key

vbKeyCapital 20 CAPS LOCK key

vbKeyEscape 27 ESC key

vbKeySpace 32 SPACEBAR key

vbKeyPageUp 33 PAGEUP key

vbKeyPageDown 34 PAGEDOWN key

vbKeyEnd 35 END key

vbKeyHome 36 HOME key

vbKeyLeft 37 LEFT ARROW key


vbKeyUp 38 UP ARROW key

vbKeyRight 39 RIGHT ARROW key

vbKeyDown 40 DOWN ARROW key

vbKeySelect 41 SELECT key

vbKeyPrint 42 PRINT SCREEN key

vbKeyExecute 43 EXECUTE key

vbKeySnapshot 44 SNAP SHOT button

vbKeyInser 45 INS key

vbKeyDelete 46 DEL key

vbKeyHelp 47 HELP key

vbKeyNumlock 144 NUM LOCK key

// A key to the Z key and its corresponding ASCII code value

Constant Value Description

vbKeyA 65 A key

vbKeyB 66 B key

vbKeyC 67 C bond

vbKeyD 68 D key

vbKeyE 69 E key

vbKeyF 70 F key

vbKeyG 71 G keys

vbKeyH 72 H bond

vbKeyI 73 I bond

vbKeyJ 74 J key

vbKeyK 75 K keys

vbKeyL 76 L key

vbKeyM 77 M bond

vbKeyN 78 N bond

vbKeyO 79 O bond

vbKeyP 80 P key
vbKeyQ 81 Q key

vbKeyR 82 R key

vbKeyS 83 S bond

vbKeyT 84 T key

vbKeyU 85 U key

vbKeyV 86 V key

vbKeyW 87 W key

vbKeyX 88 X key

vbKeyY 89 Y bond

vbKeyZ 90 Z key

// 0 key to 9 keys to their corresponding ASCII code value

Constant Value Description

vbKey0 48 0 key

vbKey1 49 1 key

vbKey2 50 2 keys

vbKey3 51 3 keys

vbKey4 52 4 key

vbKey5 53 5 keys

vbKey6 54 6 key

vbKey7 55 7 key

vbKey8 56 8 key

vbKey9 57 9 key

// Key on the numeric keypad

Constant Value Description

vbKeyNumpad0 96 0 key

vbKeyNumpad1 97 1 key

vbKeyNumpad2 98 2 keys

vbKeyNumpad3 99 3 keys

vbKeyNumpad4 100 4 key


vbKeyNumpad5 101 5 keys

vbKeyNumpad6 102 6 key

vbKeyNumpad7 103 7 key

vbKeyNumpad8 104 8 key

vbKeyNumpad9 105 9 key

vbKeyMultiply 106 multiplication sign (*) key

vbKeyAdd 107 plus sign (+) button

vbKeySeparator 108 ENTER key (on the numeric keypad)

vbKeySubtract 109 minus (-) keys

vbKeyDecimal 110 decimal (.) key

vbKeyDivide 111 division sign (/) key

// Function keys

Constant Value Description

vbKeyF1 112 F1 key

vbKeyF2 113 F2 key

vbKeyF3 114 F3 key

vbKeyF4 115 F4 key

vbKeyF5 116 F5 key

vbKeyF6 117 F6 key

vbKeyF7 118 F7 key

vbKeyF8 119 F8 key

vbKeyF9 120 F9 key

vbKeyF10 121 F10 key

vbKeyF11 122 F11 key

vbKeyF12 123 F12 key

vbKeyF13 124 F13 key

vbKeyF14 125 F14 key

vbKeyF15 126 F15 key

vbKeyF16 127 F16 key


// PowerBuilder system tables

PBCatTbl database table

PBCatCol database columns

PBCatFmt display format

PBCatVld validation rules

PBCatEdt editing style

// PBCatTbl

pbt_tnam table name

SQL Server Object ID PBt_tid table (only for SQL Server)

owner pbt_ownr table

pbd_fhgt data font height, in PowerBuilder units in

pbd_fwgt data font stroke thickness (400 = Normal, 700 = Bold)

pbd_fitl italic font is bit (Y = YES, N = NO)

whether the font is underlined pbd_funl data (Y = YES, N = NO)

pbd_fchr data font character ji (0 = ANSI, 2 = Symbol, 255 = OEM)

pbd_fptc character spacing and font data series, obtained by adding the two constants

Pitch (0 = Default, 1 = Fixed, 2 = Variable)

Family (0 = do not care, 16 = Roman, 32 = Swiss, 48 = Modern, 64 = Scrit, 80 = Decorative)

pbd_ffce data font glyph

pbh_fhgt title font height, in PowerBuilder units in

pbh_ fwgt title font stroke thickness (400 = Normal, 700 = Bold)

pbh_fitl title font is italicized bits (Y = YES, N = NO)

Are pbh_funl title font is underlined (Y = YES, N = NO)

pbh_fchr title font character set (0 = ANSI, 2 = Symbol, 255 = OEM)

pbh_fptc title character spacing and font family, by two constants obtained by adding

Pitch (0 = Default, 1 = Fixed, 2 = Varible)

Family (0 = do not care, 16 = Roman, 32 = Swiss, 48 = Modern, 64 = Scrit, 80 = Decorative)


pbh_ffce title font glyphs

pbl_fhgt label font height, in PowerBuilder units in

pbl_ fwgt label font stroke thickness (400 = Normal, 700 = Bold)

pbl_fitl label italic font is bit (Y = YES, N = NO)

Are pbl_funl label font Underline (Y = YES, N = NO)

pbl_fchr label font character set (0 = ANSI, 2 = Symbol, 255 = OEM)

pbl_fptc label font character spacing and series, the number obtained by adding the two

Pitch (0 = Default, 1 = Fixed, 2 = Varible)

Family (0 = do not care, 16 = Roman, 32 = Swiss, 48 = Modern, 64 = Scrit, 80 = Decorative)

pbl_ffce label font glyphs

Notes pbt_cmnt table

// PBCatCol

pbc_tnam table name

SQL Server Object ID pbc_tid table

owner pbc_ownr table

pbc_cnam column name

pbc_cid SQL ServerColumn ID

pbc_labl label

pbc_lpos label position (23 = left, 24 = right)

pbc_hdr title

pbc_hpos title position (23 = left, 24 = right side, 25 = center)

pbc_jtfy alignment (23 = left, 24 = right)

pbc_mask display name format

pbc_case case (26 = Actual, 27 = UPPER, 28 = lower)

pbc_hght column height

pbc_wdth column width

Name pbc_ptrn effective rules

pbc_bmap bitmap / picture (Y = Yes, N = No)

pbc_init initial value


Note pbc_cmnt column

pbc_tag (reserved)

// PBCatFmt

pbf_name display name format

pbf_frmt display format

pbf_type what type of data format used in

pbf_cntr concurrent usage flag

// PBCatVld

Name pbv_name validity of the rule

pbv_frmt validation rules

pbv_type role in the type of data validation rules

pbv_cntr concurrent usage flag

pbv_msg validation error messages

// PBCatEdt

pbe_name editorial style name

pbe_edit format string

pbe_type editorial style type:

85 = CheckBox, 86 = RadioButton, 87 = DropDownListBox

88 = DropDownDataWindow, 89 = Edit, 90 = Edit Mask

pbe_cntr modify the number of counters

pbe_seqn type PNCatEdt standard for editing multiple lines need to specify the line sequential

pbe_flag editing style logo

pbe_work additional domain


// In the data window after which press the Enter key, the focus moves to the back of the field, such as
from the last movement, then automatically jump to the next line

send (handle (this), 256,9, long (0,0))

// Window among the enter event! In datawindow events which create a custom event ue_enter, in
even_id among paste "pbm_dwnprocessenter"

long ll_row, ll_RowCount

integer li_col, li_colcount

li_col = dw_1.GetColumn ()

li_ColCount = long (describe (dw_1, "datawindow.column.count"))

if li_col = li_ColCount then

ll_row = dw_1.GetRow ()

ll_RowCount = dw_1.RowCount ()

if ll_row = ll_RowCount then

ll_row = dw_1.InsertRow (0)

dw_1.setredraw (false)

scrolltorow (dw_1, ll_Row)

setrow (dw_1, ll_Row)

setcolumn (dw_1,1)

dw_1.setredraw (true)

dw_1.SetFocus ()

dw_1.modify ("datawindow.horizontalscrollposition = 1")

return 1

end if

end if

send (handle (this), 256,9, long (0,0))

return 1
// How in the program for datawindow plus computational domain or line

// The following procedure plus a computational domain sum (dept_id for all)

string ls_modrow

dw_1.Modify ("DataWindow.summary.Height = 64")

ls_modrow = 'Create compute (band = summary font.charset = "0" font.face = "MS Sans Serif" font.family
= "2" font.height = "- 8" font.pitch = "2" font.weight = "400" background.mode = "1" background.color =
"536870912" color = "0" x = "9" y = "4" height = "52" width = "297" format = "[general]" expression =
"sum (dept_id for all)" alignment = "1" border = "0" crosstab.repeat = no) ~ r ~ n '

dw_1.modify (ls_modrow)

// The following procedures add a line

string ls_line

dw_1.Modify ("DataWindow.detail.Height = 332")

ls_line = 'Create line (band = detail background.mode = "2" background.color = "16777215" pen.style =
"0" pen.width = "5" pen.color = "0" x1 = "37" y1 = "320" x2 = "1458" y2 = "316") ~ r ~ n '

dw_1.modify (ls_line)

dw_1.settransobject (sqlca)

dw_1.retrieve ()

// How can I control the security of a good program it

For example, I want to control the operating authority of a button in a window which

In datawindow, the operation of a field can be operated property, is to separate the coding of these it

Is there a better way

Windows were placed in authority among variables, and then cancel the permission of the window on it!

// A window redraw the screen in the middle of the function:

f_wincenter (windowname)

environment lenv
long ll_height, ll_width

if getenvironment (lenv) = -1 then

messagebox ("error", "get screen message error!")

else

ll_height = pixelstounits (lenv.screenheight, Ypixelstounits!)

ll_width = pixelstounits (lenv.screenwidth, xpixelstounits!)

awin.y = (ll_height - awin.height) / 2 - 200

awin.x = (ll_width - awin.width) / 2

return 0 // successful return 0

end if

return 1

// How to get the path of the current application

FUNCTION unit getmodulefilenamea (ulong hmodule, ref string lpfilename, ulong nsize) library
"kernel32.dll"

string ls_buffer = space (255)

int i

if getmodulefilenamea (handle (getapplication ()), ls_buffer, 255) = 0 then

setnull (ls_buffer)

else

do while pos (ls_buffer, "", i + 1)> 0

i = pos (ls_buffer, "", i + 1)

loop

ls_buffer = left (ls_buffer, i)

if right (ls_buffer, 1) <> "" then ls_buffer = ls_buffer + ""

end if

return ls_buffer
// Get the current name of the computer

FUNCTION boolean GetComputerNameA (ref string cname, ref long nbuf) LIBRARY "kernel32.dll"

String ls_computername = space (512)

Long ll_buffer = 512

Getcomputernamea (ls_computername, ll_buffer)

Return ls_computername

// Get the current path

FUNCTION ulong GetCurrentDirectoryA (ulong nBufferLength, ref string lpBuffer) Library kernel32.dll "

String ls_buffer

Ls_buffer = space (255)

If getcurrentdirectorya (255, ls_buffer) = 0 then

Setnull (ls_buffer)

Else

If Right (ls_buffer, 1) <> "1" then ls_buffer = ls_buffer + ""

End if

Return ls_buffer

// How to configure an ODBC data source code

ODBC is automatically created based on the Windows registry direct writes to achieve

Steps:

First, create a function:

gf_create_odbc (string as_odbc_name, string as_odbc_type, string as_path)


string ls_key, ls_key1

ls_key = 'HKEY_CURRENT_USER \ Software \ ODBC \ ODBC.INI \' + as_odbc_name

ls_key1 = 'HKEY_CURRENT_USER \ Software \ ODBC \ ODBC.INI \ ODBC Data Sources'

if as_odbc_type = 'DBF' then

Registryset (ls_key, 'Driver', "C: \ WINDOWS \ SYSTEM \ PBDBF12.DLL")

Registryset (ls_key, 'Description', "automatically generates ODBC '")

Registryset (ls_key, 'Database', as_path)

Registryset (ls_key, 'CreateType', "FoxPro25")

Registryset (ls_key, 'Locking', "RECORD")

Registryset (ls_key, 'LockCompatibility', "Fox")

Registryset (ls_key, 'FileOpenCache', "1")

Registryset (ls_key, 'CacheSize', "4")

Registryset (ls_key, 'DataFileExtension', "DBF")

Registryset (ls_key, 'IntlSort', "C: 0")

Registryset (ls_key, 'UseLongNames', "1")

Registryset (ls_key, 'UseLongQualifiers', "1")

Registryset (ls_key, 'ApplicationUsingThreads', "1")

Registryset (ls_key1, as_odbc_name, "PB INTERSOLV OEM 3.01 32-BIT dBASEFile (* .dbf)")

end if

if as_odbc_type = 'SQLANY' then

Registryset (ls_key, 'Driver', as_path + "WOD50T.DLL")

Registryset (ls_key, 'Description', "automatically generates ODBC '")

Registryset (ls_key, 'UID', "DBA")

Registryset (ls_key, 'PWD', "SQL")

Registryset (ls_key, 'Start', as_path + 'dbeng50')

Registryset (ls_key, 'DatabaseFile', as_path + as_odbc_name + '. DB')

Registryset (ls_key, 'DatabaseName', as_odbc_name)

Registryset (ls_key, 'AutoStop', "Yes")

Registryset (ls_key1, as_odbc_name, "Sybase SQL Anywhere 5.0")


end if

if as_odbc_type = 'FOXPRO' then

Registryset (ls_key, 'DefaultDir', as_path)

Registryset (ls_key, 'Description', as_odbc_name + "automatic ODBC '")

Registryset (ls_key, 'Driver', 'C: \ WINDOWS \ SYSTEM \ odbcjt32.dll')

Registryset (ls_key, 'DriverId', ReguLong!, 280)

Registryset (ls_key, 'FIL', "FoxPro 2.0")

Registryset (ls_key, 'SafeTransactions', ReguLong!, 0)

Registryset (ls_key, 'UID', "")

Registryset (ls_key + '\ Engines \ Xbase', 'CollatingSequence', 'ASCII')

Registryset (ls_key + '\ Engines \ Xbase', 'Deleted', Regulong!, 1)

Registryset (ls_key + '\ Engines \ Xbase', 'ImplicitCommitSync', 'Yes')

Registryset (ls_key + '\ Engines \ Xbase', 'PageTimeout', ReguLong!, 600)

Registryset (ls_key + '\ Engines \ Xbase', 'Statistics', Regulong!, 0)

Registryset (ls_key + '\ Engines \ Xbase', 'Threads', Regulong!, 3)

Registryset (ls_key + '\ Engines \ Xbase', 'UserCommitSync', 'Yes')

Registryset (ls_key1, s_dbfname, "Microsoft FoxPro Driver (* .dbf)")

end if

...

Second, before the establishment of the first to create the ODBC connection information, such as

...

string ls_dbfname = "c: \ Foxprow \ Database"

gf_create_odbc ('TestDBF', 'FOXPRO', ls_dbfname)

SQLCA.DBMS = "ODBC"

SQLCA.AutoCommit = False

SQLCA.Database = 'TestDBF'

SQLCA.dbparm = "ConnectString = 'DSN = TestDBF'"

connect using sqlca;

if sqlca.sqlcode <> 1 then


messagebox ('error', 'Unable to connect to database files developed! (' + ls_dbfname + ')', stopsign!)

halt close;

end if

...

Third, remove the ODBC settings;

Create a public function gf_erase_odbc (string as_odbc_name)

...

Through the above steps, you do not through ODBC tool in Control Panel to set up.

You may consider the following improvements:

An increase ODBC create parameter setting function;

2, an ODBC own set of tools that can operate within the system;

3, ODBC driver can be assigned to a specific directory or file.

// How to build such a function it

First two excellent dropdownlistbox, when select one of the item, and another dropdownlistbox display
the corresponding first

Select the content item. For example, a display name of each center, when you select the name of one of
the center, and the other displays the corresponding center

The names of all sectors.

(1) dropdownDW better with generation parameters

(2) I just realized. Tables can be built:

Mobile Brand Table: MOBILE phone model table: MOBILEMODEL

In dw of itemfocuschanged write the following code:

Long ll_model

ll_model = dw_edit.getitemnumber (dw_edit.getrow (), 'mob_id')

if dwo.name = 'model_id' and not isnull (ll_model) then

datawindowchild idwc_model

dw_edit.GetChild ("model_id", idwc_model)


idwc_model.SetTransObject (SQLCA)

idwc_model.Retrieve ()

// Idwc_model.Setfilter ("model_id =" + string (ll_model))

idwc_model.Setfilter ("mob_id =" + string (ll_model))

idwc_model.filter ()

end if

// Grid window in which, in a column does not allow editing a column allows editing

With the following method, you can not very convenient, what they want it

// Method one:

In the DataWindow, between the column and the column when using the Tab key to move, is based on
the DataWindow Tb values for each column is set to be moved.

When a column of Tab is 0, this column can not be edited, so that users can not add, delete, change and
other operations. It can be a column of values Tab is set to 0,

This column is set to allow non-editable.

Follows (set columnname for the DataWindow column name to be set to non-editable):

dw_1.setorder ("columnname", 0)

Or modify data in the script window with the following statement:

dw_1.modify (: columnname.tabsequence = 0 ")

Or dw_1.modify ("#" + string (number) + ". Tabsequence = 0")

The advantage of this method is easy to realize, the drawback is not allowed to move the column. Grid-
style DataWindow that must not checked

column moving, otherwise it will cause confusion when you press the tab key sequence.

// Method two:

You can view the edit column properties in the properties view style style. To set a column can not be
edited in the column edi style = "edit" in

Select the display only; or script window with the following statement be modified:

dw + 1.modify ("columnname.edit. displayonly = Yes)

Or dw_1.modify ("#" + string (number) + ". Edit.displayonly = Yes")


If the column back to editable in the edit style of the column = "edit", and uncheck display only; or script
used in window

Modify the following statement:

dw_1.modify ("columnname.edit.displayonly = No")

This method is very simple, but also does not allow the column to move.

// Method three:

DataWindow with the clicked event of the method can be implemented to protect the column. If a
column can not be changed, you can set r otect = 0. Namely:

dw_1.modify ("columnname.protect = 0")

Or dw_1.modify ("#" + string (number) + ". Protect = 0")

To the column to be changed, set protect = 1, namely:

dw_1.modify (: columnname.protect = 1 ")

Or dw_1.modify ("#" + string (number) + ". Protect = 1")

This method does not affect the Tab key to move, users can pull the column, but also in the application
process to decide which column can be edited, which column is not

Edited.

// Data Sheet d_query have a data column id, set to DropDownDW format and linked to another data
table d_info (id, name).

Data is displayed when the program is running so the value name, and dw_1.getitemstring (1, 'id') /
dw_1.object.date (1,1)

The resulting data is id value. But now I want the name of values , there is no simple way

dw_object.Describe ("evaluate ('LookUpDisplay (" Column Name ")'," + String (line number) + ")")

You is:

dw_1.Describe ("evaluate ('LookUpDisplay (id)', 1)")

// Window within w_gcde, into a DW_1, how to get the contents inside yuonghu_id column dw_1

long lng_column_count
integer i

string str_column [] // column name

string str_column_text [] // text name

// Get the total number of columns in the data window

lng_column_count = long (dw_1.Describe ("DataWindow.Column.Count"))

// Cycle in order to read

for i = 1 to lng_column_count

str_column [i] = dw_1.Describe ("#" + string (i) + ". name")

str_column_text [i] = dw_1.Describe (str_column [i] + "_t.text")

next

// Save the report to excel table

string fpath, fname

int f_s

boolean lb_exist

f_s = GetFileSaveName ("Please select the file name to be saved", fpath, fname, "txt", "Text File (* .txt),
*. txt, Excel (*. xls), *. xls")

lb_exist = FileExists (fpath)

if f_s <> 1 then

return

elseif lb_exist then

choose case MessageBox ("Save", "OK to over write file:" + fname, Question !, OKCancel!)

case 1

dw_1.saveas (fname, text !, TRUE)

messagebox ("successful coverage", "successful overwrite the file" + fname)

case else

messagebox ("warning", "File not saved successfully.")

return
end choose

else

dw_1.saveas (fname, text !, TRUE)

end if

// PB in how to write data to EXCEL table has a fixed format

int i, handle, n

handle = openchannel ("Excel", 'book1.xls')

if handle <0 then

messagebox ('prompt', 'Please open EXCLE program! and open BOOK1.XLS, and empty the table!')

return

end if

setremote ('r1c1', 'customer arrears analysis table', handle)

setremote ('r2c5', 'Statistics Date:' + is_rq1 + 'to' + is_rq2, handle)

setremote ('r3c1', 'rank', handle)

setremote ('r3c2', 'client code', handle)

setremote ('r3c3', 'Customer Name', handle)

setremote ('r3c4', 'total receivables', handle)

setremote ('r3c5', 'total arrears', handle)

setremote ('r3c6', 'ratio', handle)

setremote ('r3c7', tab_1.tabpage_1.dw_1.object.no1_t.text, handle)

setremote ('r3c8', tab_1.tabpage_1.dw_1.object.no2_t.text, handle)

setremote ('r3c9', tab_1.tabpage_1.dw_1.object.no3_t.text, handle)

setremote ('r3c10', tab_1.tabpage_1.dw_1.object.no4_t.text, handle)

setremote ('r3c11', tab_1.tabpage_1.dw_1.object.no5_t.text, handle)

for i = 1 to tab_1.tabpage_1.dw_1.rowcount ()

setremote ("r" + string (i + 3) + 'c1', string (i), handle)

setremote ("r" + string (i + 3) + 'c2', tab_1.tabpage_1.dw_1.getitemstring (i, 'khbm'), handle)


setremote ("r" + string (i + 3) + 'c3', tab_1.tabpage_1.dw_1.getitemstring (i, 'khmc'), handle)

setremote ("r" + string (i + 3) + 'c4', string (tab_1.tabpage_1.dw_1.getitemdecimal (i, 'ys')), handle)

setremote ("r" + string (i + 3) + 'c5', string (tab_1.tabpage_1.dw_1.getitemdecimal (i, 'qf')), handle)

setremote ("r" + string (i + 3) + 'c6', string (tab_1.tabpage_1.dw_1.getitemdecimal (i, 'bl')), handle)

setremote ("r" + string (i + 3) + 'c7', string (tab_1.tabpage_1.dw_1.getitemdecimal (i, 'no1')), handle)

setremote ("r" + string (i + 3) + 'c8', string (tab_1.tabpage_1.dw_1.getitemdecimal (i, 'no2')), handle)

setremote ("r" + string (i + 3) + 'c9', string (tab_1.tabpage_1.dw_1.getitemdecimal (i, 'no3')), handle)

setremote ("r" + string (i + 3) + 'c10', string (tab_1.tabpage_1.dw_1.getitemdecimal (i, 'no4')), handle)

setremote ("r" + string (i + 3) + 'c11', string (tab_1.tabpage_1.dw_1.getitemdecimal (i, 'no5')), handle)

next

closechannel (handle)

messagebox ('prompt', 'save finished!')

// Save the data window for generic functions excel (decision wonderful)

// Function name: gf_dw2excel

// Scope: public

// Description: The window to pass the data to EXCEL table, there are 26 columns limit (generally been
good enough)

// Parameters:

// [Value] datawindow adw_data need to save the data window

// [Value] string as_reptitle table title

// Return value: LONG

// Author: xiaolihua Date: 2003-05-20


// Modified: DoItNow Date: 2003.06.06

CONSTANT Integer ppLayoutBlank = 12

Pointer oldpointer

OLEObject ole_object

ole_object = CREATE OLEObject

String s_english = "ABCDEFGHIJKMNLOPQRSTUVWXYZ"

Integer li_ret

////////////////////////////////////////////////// ////////////////////

// ================================================ ====================

// Script - gf_dw2excel (datawindow adw_data, string as_reptitle)

// [Reason]: Since then the case has been opened EXCEL, and sometimes when using the OLE connection
error, so instead

// OLE directly connected to the new application.

// ------------------------------------------------ --------------------

// [MODIFIED By]: DoItNow Date: 2003.06.06

// ================================================ ====================

// li_ret = ole_object.ConnectToObject ("", "Excel.Application")

// IF li_ret <> 0 THEN

// // If Excel is not open, then New.

li_ret = ole_object.ConnectToNewObject ("Excel.Application")

IF li_ret <> 0 THEN

MessageBox ('open error', '! Unable to connect EXCEL EXCEL has been installed the wrong number: ' +
String (li_ret))

RETURN 0

END IF

ole_object.Visible = FALSE // ole application service is displayed

// END IF

// ------- MODIFIED END --------------------------------------- ----------


////////////////////////////////////////////////// ////////////////////

oldpointer = SetPointer (HourGlass!)

ole_object.Workbooks.Add

Long ll_colnum, ll_rownum

String ls_value

String ls_objects, ls_obj, ls_objs [], ls_objtag [], ls_width []

Long ll_pos, ll_len, ll_num = 0

The number of rows // Excel table for the number of rows of data window +2

ll_rownum = adw_data.RowCount () + 2

String ls_colname

Integer i, j

Dec ld_width

ll_colnum = Long (adw_data.Object.DataWindow.Column.Count) // obtain total field

ls_objtag [1] = "number"

SetNull (ls_width [1])

i=1

FOR ll_num = 1 TO ll_colnum

IF adw_data.DESCRIBE ("#" + String (ll_num) + ". Visible") = "1" THEN // column does not show signs of
nun_Visible

i=i+1

ls_obj = adw_data.DESCRIBE ("#" + String (ll_num) + ". name") // actually stored value field name

ls_objs [i] = ls_obj

ls_objtag [i] = adw_data.DESCRIBE (ls_obj + "_t.text") // display the value of the field name

ls_width [i] = adw_data.DESCRIBE (ls_obj + '.width') // width of each column

END IF

NEXT

ll_colnum = i // number of columns in the table

// Generated total title

ole_object.Cells (1,1) .value = as_reptitle


ole_object.Range ('A1'). SELECT

ole_object.Selection.Font.Size = 24

ole_object.Selection.HorizontalAlignment = 3

ole_object.Range ('A1:' + Mid (s_english, ll_colnum, 1) + '1'). select

ole_object.Range ('A1:' + Mid (s_english, ll_colnum, 1) + '1') Merge.

// Set the title bar

FOR i = 1 TO ll_colnum

ls_value = ls_objtag [i]

ole_object.Cells (2, i) .value = ls_value

IF IsNull (ls_width [i]) THEN

ld_width = 12

ELSE

ld_width = Dec (ls_width [i]) / 35 // why devided by 35

END IF

ole_object.Columns (i) .ColumnWidth = ld_width

ole_object.Columns (i) .HorizontalAlignment = 3

ole_object.Columns (i) .Borders.LineStyle = 1

ole_object.Columns (i) .Font.Bold = TRUE

NEXT

// Tim filling actual data to EXCEL

String column_name, ls_coltype

FOR i = 3 TO ll_rownum

ole_object.Cells (i, 1) .Font.Bold = FALSE

ole_object.Cells (i, 1) .value = i - 2

FOR j = 2 TO ll_colnum

column_name = ls_objs [j]

IF adw_data.DESCRIBE (column_name + '.type') = 'column' THEN

ls_value = adw_data.DESCRIBE ("Evaluate ('LookupDisplay (" + column_name + ")'," + String (i - 2) + ")")

END IF
IF adw_data.DESCRIBE (column_name + '.type') = 'compute' THEN

ls_value = adw_data.DESCRIBE ("Evaluate ('" + adw_data.DESCRIBE (column_name +' .expression ') + "',"
+ String (i - 2) + ")")

END IF

ls_coltype = adw_data.DESCRIBE (column_name + '. coltype')

IF Pos (Upper (ls_coltype), "CHAR")> 0 THEN // for character data processing

ole_object.Cells (i, j) .NumberFormat = "//"

END IF

ole_object.Cells (i, j) .Font.Bold = FALSE

ole_object.Cells (i, j) .value = ls_value

NEXT

NEXT

////////////////////////////////////////////////// ////////////////////

// ================================================ ====================

// Script - gf_dw2excel (datawindow adw_data, string as_reptitle)

// [Reason]: EXCEL file saved in PB

// ------------------------------------------------ --------------------

// [MODIFIED By]: DoItNow Date: 2003.05.28

// ================================================ ====================

string sFileName, sFile

integer value

value = GetFileSaveName ("Save As", sFileName, sFile, "xls", "Excel Files (* .xls), *. xls")

IF value = 1 THEN

ole_object.ActiveWorkbook.saveas (sFileName)

ole_object.Displayalerts = FALSE // close saved when you exit EXCEL Tips

ole_object.Quit () // exit EXCEL

ELSE

messagebox ("Error", "Save file error, manually save")


ole_object.Visible = TRUE // display ole Apps

END IF

// ------- MODIFIED END --------------------------------------- ----------

////////////////////////////////////////////////// ////////////////////

SetPointer (oldpointer)

ole_object.DisconnectObject ()

DESTROY ole_object

RETURN 1

// Nine lines of code to achieve the expression evaluates!

// ================================================ ===========================

// Function: Returns the value of the expression

// Parameters: string thestr calculation expression, such as 2 * (3 + 5)

// Return value: string retVal calculated value of the expression, such as 2 * (3 + 5) result is 16

// If it is an incorrect expression, returns false.

// ================================================ ===========================

// Author: Raojia Hong Time: November 19, 2002

// ================================================ ===========================

string retVal

datastore lds_evaluate

lds_evaluate = create datastore

lds_evaluate.create ('release 8; ~ r ~ ntable ()')

retVal = lds_evaluate.describe ("evaluate ('" + thestr + "', 1)")

destroy lds_evaluate

return retVal
// String into an array

LONG lPosEnd, lPosStart = 1, lSeparatorLen, lCounter = 1

IF UpperBound (sOutputArray)> 0 THEN sOutputArray = {""}

lSeparatorLen = len (sSeparator)

lPosEnd = Pos (sString, sSeparator, 1)

DO WHILE lPosEnd> 0

sOutputArray [lCounter] = Mid (sString, lPosStart, lPosEnd - lPosStart)

lPosStart = lPosEnd + lSeparatorLen

lPosEnd = Pos (sString, sSeparator, lPosStart)

lCounter ++

LOOP

sOutputArray [lCounter] = Right (sString, Len (sString) - lPosStart + 1)

RETURN lCounter

// PB in the TreeView control using techniques (sweep blind)

PowerBuilder TreeView control in a tree tour, similar to the WINDOWS Explorer, which is characterized
by tree-level information items were

Structure, can show more clearly the main, a breakdown of the relationship, the operation is very
convenient. It can be used in conjunction with the DataWindow application, a

Provide information classification system, one to provide specific information to achieve even beads Pitt
together wonderful effect. It is especially suitable for multi-level classification of information seized

Faso, is a multi-level menu can not be more than like, its manifestations by the program designers and
the majority of users in many application software

Can see her heroic.

In PowerBuilder, application TreeView control is much more complex than the other controls, somewhat
at a loss when you are new to it often. However, if

The mechanism to figure out if it, it is not hard to grasp things. Here I combine Changbai company books
classification and retrieval instance, the TreeView

Use controls, and we explore.

First, the application of the general steps TreeView control


1, the establishment of an application, and set a good interface with the database, which is a
prerequisite for the operation of the database.

2, built an application window W_1 in the application, adding datawindow control object named dw_3
and dw_4 two on and one in the name

TreeView object TV_1's.

3, modify DW_3 property

General: The Datawindow object datawindow called DW_date fill in the name of an existing (Note: it

datawindow control object is different), for spanning tree view item, set its Visible items are not visible.

4, modify DW_4 property

General: The Datawindow object datawindow object name to fill an existing named DW_TS for display
check out

The specific content.

5, edited TV_1 properties

TreeView tree view item can not be directly edited, the program must be written in the Script.

Picture: Picture Name added in four different icons to represent the tree view of two levels (one, two),
two kinds of

State (not selected, selected).

General: can be selected depending on whether the application settings, including:

Delete Items: whether to allow the operation to delete entries.

Disable PragDrog: drag and drop operation is allowed entry.

Edit Labels: whether to allow the operation to change entries, click the title entries. Show Buttons:
whether to display the entries put

+ - Buttons, there is shown the relative expansion and contraction.

Hide Selection: when the control loses focus, the selected item is displayed with high brightness.

Show Line: whether between entries plus one vertical bar.

Lines At Root: All entries in the root zone is connected by a vertical bar.

Indentation: the child entries shrink relative to the right schedule parent entries.

6, The Script writing TV_1

Here is the key to the TreeView control is difficult.

Two, TreeView control information form and create


Tree view item TreeViewItem TreeView control is the basic unit of information, and generates a tree view
items are generally two ways, one is

Mr. Cheng root layer view item, and then dynamically generate lower view items in the application, the
other is the tree view of all time and a. Each of the two methods

There are advantages, chosen according to the specific circumstances, the latter method is used in this
example.

1, the main properties of the tree view item TreeViewItem

Label: String type, display information tree view item.

Data: Any type, the internal value tree view item.

Level: Integer type, tree view item level in the tree view.

Children: Boolean type, which determines whether the next level (as shown in the title).

PictureIndex: Integer type, when used in the non-selected icons in the icon queue number.

SelectedPictureIndex: Integer type, when used by the selected number of icons in the icon queue.

2, the functions used to generate entries TreeViewItem

InsertItemFirst (): will be added as the first item

InsertItemLast (): will join the item as the last one

InsertItem (): will join the item into the back of the specified items

InsertItemSort (): the order placement.

3, TreeView common event

Constructor: This event is triggered when the control is created, can be constructed here TreeViewItem.

Click: Click TreeViewItem item, execute the query process.

Double Click: Double-click the TreeViewItem item, execute the query process.

ItemPopulate event: This event when entries for the first time launched a TreeViewItem trigger, while
the system will trigger the

TreeViewItem item handle handle passed over by the arguments. It is mainly used to generate the
underlying information item corresponding item. Mainly used for the first

Ways.

Third, the event code

A tree view control TV_1 the constructor event code wanqi 1999.6.28

integer li_rowcount, li_row


string li_current_dn, li_last_dn, li_current_ei, li_last_ei

// Declare instance variables of two tree view

treeviewitem itvi_level_one, itvi_level_two

// long ii_h_l_one

// long ii_h_l_two

dw_3.settransobject (sqlca) // dw_3

For implicit data window, there are data spanning tree

li_rowcount = dw_3.retrieve () // Rows

dw_3.setsort ("lb, pm")

dw_3.sort ()

// Spanning all levels of the tree view item view

for li_row = 1 to li_rowcount

li_current_dn = dw_3.object.lb [li_row]

// DW_3 object "LB category"

li_current_ei = dw_3.object.pm [li_row]

// DW_3 object "PM Name"

if isnull (li_current_ei) then

li_current_ei = ""

end if

if li_current_dn <> li_last_dn then

// IF LB does not repeat with the primary view item

// Set a tree view item

itvi_level_one.label = dw_3.object.LB [li_row]

// View displays information items

itvi_level_one.level = 1 // level

itvi_level_one.data = li_current_dn

// View items inside information

itvi_level_one.pictureindex = 1

No. When the icon is not selected // used


itvi_level_one.selectedpictureindex = 3

// Icon used when selected number

itvi_level_one.children = (li_current_ei <> '')

// Is there under a tree view

ii_h_l_one = this.insertitemlast (0, itvi_level_one)

// The item was added to one end of a tree

end if

// Set two tree view item

if li_current_dn <> li_last_ei then

if li_current_ei <> '' then

itvi_level_two.label = dw_3.object.pm [li_row]

itvi_level_two.level = 2

itvi_level_two.data = li_current_dn

itvi_level_two.pictureindex = 2

itvi_level_two.selectedpictureindex = 4

itvi_level_two.data = li_current_ei

itvi_level_two.children = false

ii_h_l_two = this.insertitemlast

(ii_h_l_one, itvi_level_two)

// The item was added to the two trees in the last one

end if

end if

li_last_dn = li_current_dn // located relatively items

li_last_ei = li_current_ei

next

2, clicked event code tv_1 controls

string s1

treeviewitem ii

this.getitem (handle, ii)


s1 = string (ii.label)

choose case ii.level

case 1

// Filter category

dw_4.setfilter ("lb = '" + s1 + "'")

dw_4.filter ()

case 2

dw_4.setfilter ("pm = '" + s1 + "'")

dw_4.filter ()

// Filtering title

end choose

// Lowercase to uppercase Amount Amount

string CN_NUM [10] = {"zero", "one", "two", "three", "market", "Mrs.", "Miss", "seven", "eight",
"Nine"} // capital 0-9

string CN_CARRY [19] = {"minute", "corner", "", "dollars", "pick up", "Bai", "1,000", "000", "pick up",
"Bai", "1,000" "100 million", "pick up", "Bai", "1,000", "000", "pick up", "Bai", "1,000"}

string ls_pos, ls_number, ls_rc

integer li_for, li_len

Boolean lb_zero = FALSE // whether to allow the next one appears zero

ls_number = string (number, "0.00")

li_len = Len (ls_number)

FOR li_for = 1 TO li_len


ls_pos = MID (ls_number, li_for, 1)

IF ls_pos = "-" THEN

ls_rc + = "negative"

continue

END IF

IF ls_pos = '.' THEN continue

IF ls_pos <> "0" THEN

ls_rc + = CN_NUM [integer (ls_pos) + 1] + CN_CARRY [li_len - li_for + 1]

ELSEIF MOD (li_len - li_for - 3,4) = 0 THEN

IF Right (ls_rc, 2) = CN_NUM [1] THEN ls_rc = Left (ls_rc, Len (ls_rc) - 2)

ls_rc + = CN_CARRY [li_len - li_for + 1] + CN_NUM [integer (ls_pos) + 1]

ELSEIF lb_zero THEN

ls_rc + = CN_NUM [integer (ls_pos) + 1]

END IF

lb_zero = ls_pos <> "0"

NEXT

IF Right (ls_rc, 2) = CN_NUM [1] THEN ls_rc = Left (ls_rc, Len (ls_rc) - 2)

RETURN ls_rc

// Pb in custom printed pages long

In the case of continuous paper to print the data window, you need to customize the printed pages long,
in order to ensure the correct printer paper feed without human intervention,

Continuous printing. In PB shall call external functions to customize the length of the paper, more
cumbersome. This paper presents a direct printer

Control method is simple to achieve page-long set.

First, prior knowledge

Communication Computer and printer using the ASCII code, which includes the standard ASCII code
printable characters and non-printing characters (control codes),
The printer uses control code to customize the printer. Most printer instructions use control codes
escape sequence code as the first of its instruction sequence.

Here are a few instruction code sequence used in this article:

Set the line spacing (line spacing) 8-inch

ASCII code ESC 0

Decimal 2748

Set in units of pages long

ASCII code ESC C n

Decimal 27 67 n

Where n is the number of lines per page range (1-127)

Two, PB control the transmission and custom-page code of realization

In PB to achieve by sending control codes to the printer function Printsend (printjobnumber, string,
{zerochar}).

The parameters are defined as follows:

printjobnumber: by printjob () function returns the number of print jobs;

string: control string, use the ASCII code;

zerochar: used to replace string of digits 0;

Because of the string, 0-terminated string, if string contains 0, you need to use other characters to
represent 0, parameters that do this zerochar

Purposes set, when the PB to the printer transmits a control string to replace the character zerochar
converted to 0.

Here is the complete program specific custom pages long print data window (length of 2.75 inches
custom page):

long ll_job

dw_print.reset ()

ll_job = printopen ()

if ll_job = -1 then

messagebox (gs_title, "printer not ready")

return

end if
// 8-inch custom spacing

PrintSend (ll_job, CHAR (27) + CHAR (48))

// Setting page length 22 lines

PrintSend (ll_job, CHAR (27) + CHAR (67) + CHAR (22))

printdatawindow (ll_job, dw_print)

printclose (ll_job)

Line 22 is a narrow line just one-third of a page long continuous paper, many bills are not the problem in
this paper .win2000, my program run well.

// pb some experience and skills

1.RGB function formula: color values = (65536 * Blue) + (256 * Green) + (Red)

2 controls draggable: send (handle (this), 274,61458,0)

3 How to use the drop-down drop down sub-program control data window and away

Modify or directly by using dw_1.object.col1.dddw.showlist = true

4 search parameters and some do not need to pass the pass%.

5 how to shield the mouse wheel to trigger events in the control of other write

if message.number = 522 then return 1

6 to get the syntax of the data window:

string ls_dwsyntax

ls_dwsyntax = dw_1.describe ("datawindow.syntax")

7 to get the data in each column and window title:

long ll_count, i

string ls_value, ls_colname

ll_colnum = Long (dw_1.object.datawindow.column.count)

for i = 1 to ll_colnum

// Get the name of the title head

ls_colname = dw_1.describe ('#' + string (i) + ".name") + "_t"

ls_value = dw_1.describe (ls_colname + ".text")


next

8 dynamically set the initial value in the program:

ex: dw_control.object.columnName.initial = 'xxxx'

9 How to achieve without using SELECT DISTINCT delete duplicate rows in the DataWindow SQL syntax:

At first you want to display a column to sort of unique values : "city A", and then add the following filter
string:

"City <> city [-1] or GetRow () = 1"

10. how to change the font color column, this column is to remind the user to make changes:

In the Color attribute column, enter the following expression

IF (column_name <> column_name.Original, RGB (255, 0, 0), RGB (0, 0, 0)).

In this condition, if this column has changed, is displayed in red font, otherwise display black font. This
expression is mainly used

column_name <> column_name.Original compare the current value of the column and the original
columns are the same to achieve the purpose of judgment.

11 written clicked or doubleclicked event data window on annotations // solve some unexpected bug!

// Data window to achieve a combination of field

Now assume that the customer's province, city, address, zip code were stored in a different field, they
are Province, City, Address,

PC. We want to get "Zip + State + City + address" format, such as: "(214001) Renmin Road, Wuxi City,
Jiangsu Province 1." Specific implementation

As follows:

1, in the position you want to display to add a calculated field (Compute Field)

2, in which the expression column write "'(' + PC + ')' + Province + City + Address"

3 Click OK to finish.

It is not easy. Need to remind everyone that the computational domain can only be used to display, you
can not modify it, because it does not TAB property,

Can not get the focus.


Technical data automatically refresh the window //

When we write, such as inventory, sales and other applications, always want the program to be able to
dynamically auto-refresh inventory or sales, for example,

Every 1 second refresh. To achieve this function as long as we use the time interval of the data window
properties (Timer Interval),

When the value is 0 data window is not refreshed, if you want the data window to refresh frequency
every second, so long as the value is set

1000, that is 1000 milliseconds.

We can also add functionality to the application flashing alarms. Take inventory for instance, the most
common is when the stock reaches certain goods

When a minimum inventory program should be able to automatically determine and display a warning
color, usually red. At this point, we simply use the above

The method then requires the flashing on the field, such as stocks, in which the color properties of the
corresponding write statement. The following code to achieve

"When an item of inventory is less than 20, the program displays a warning in red blinking"

if (Store_Num <20, &

if mod (Second (Now ()), 2) <> 0, & // once per second, even red, odd-numbered display white, i.e.
background

RGB (255, 255, 255), RGB (255, 0, 0))

// How to find the listed conditions for Datetime data types used in the DataWindow

1. Use when you want to find a date condition is a constant expression as follows:

ls_Find = "datetime_col = DateTime ('1/1/1999')"

2. The following expression uses the date the conditions when you are looking for is a variable:

ls_Find = "datetime_col = DateTime ('" + ls_Date + "')"

3. Use when you want to find the date of the conditions is a DateTime data type the following
expression:

ls_Find = "datetime_col = DateTime ('" + String (ldt_DateTime) + "')"

// Realize how not to use SELECT DISTINCT delete duplicate rows in the DataWindow SQL syntax
At first you want to display a column to sort of unique values : "city A", and then add the following filter
string:

"City <> city [-1] or GetRow () = 1"

// How to display line numbers in each group, respectively, in the form of packets of the DataWindow

When we Datawindow display line numbers for each line, you can simply put an expression of GetRow ()
computed column.

But for grouping Datawindow, to show the line number in each group, you should use the expression for

GetRow () - First (GetRow () for Group 1) computed column + 1.

// How to change the font color column, this column is to remind the user to make changes

In the Color attribute column, enter the following expression

IF (column_name <> column_name.Original, RGB (255, 0, 0), RGB (0, 0, 0)).

In this condition, if this column has changed, is displayed in red font, otherwise display black font. This
expression is mainly used

column_name <> column_name.Original compare the current value of the column and the original
columns are the same to achieve the purpose of judgment.

// In the data window, remove the line, but do not filter or delete operation

RowsDiscard () function to do this, it is removed to perform work in the data window, but it can not be
removed in the row is deleted or any

Save the modified nature.

// How DataWindow display multiple lines in the Footer Band data is displayed in the first line of the
current and the last line number

We look at two expressions calculated columns:

IF (GetRow () = First (GetRow () FOR Page), 1, 0) // 1 for the first row of the current page
IF (GetRow () <> 1 AND GetRow () = Last (GetRow () FOR Page), 1, 0) // 1 as the last line of the current
page

By seen above, set the following computed column expression in the Footer Band:

'Rows' + String (First (GetRow () FOR Page)) + 'to' + String (Last (GetRow () FOR Page)) + 'are displayed'.

Can achieve this functionality.

// Window Center:

function long shCenterWindow (long hwnd) library "Pbvm60.dll"

// Opens the specified Web page using IE:

function long shRunDefltBrower (string sellrl) library "Pbvm60.dll"

// How to obtain the value of the data window computational domain!

em_data.text = dw_1.getdatavalue (compute_1) is not enough, how to write

Answer: a name, then the same value as the field! Named in the name attribute in compute_1

em_date.Text = dw_1.Object.compute_1 [dw_1.GetRow ()]

//PB6.5 In grid-style DataWindow how to automatically wrap

1, open the DataWindow in the DataWindow Painter;

2, in the column to be set to automatically wrap, double-click the mouse properties window bounce this
column;

3, select the Position tab, select Autosize Height checkbox;

4, select the Edit tab, and uncheck Auto Horz Scroll checkbox;

5, click the OK button to save your changes;

6, points Detail Band (ie written Detail gray long belt), click the right mouse button and select
Properties ... menu item;
7, select Autosize Height checkbox;

8, click the OK button to save your changes;

9, save DataWindow.

Height property still write a column expression:

if (len (trim (file_name)) / 18> 1, ceiling (len (trim (file_name)) / 18) * 24,18) how many characters on the
fold line

// [12 with a written statement about the date function]

Can be directly assigned to a variable, not written in functional form. Another function is suitable for
pb6.5, a character occupies two bytes, if used

Please modify more than the actual situation pb8.0

// A Zodiac. (Year parameters: int ls_year return parameters: string):

mid (fill ('Rat Ox Tiger Rabbit snakes Horse Sheep Monkey Jigou pig', 48), (mod (ls_year -1900,12) +13) *
2 -1,2)

// 2 attribution (Year parameters: int ls_year return parameters: string).:

mid (fill ('B, CD Wuji Gengxin Jen-kuei', 40), (mod (ls_year -1924,10) +11) * 2 -1,2) + mid (fill ('Zichou Mao
Yin Chen Si Wu did not Shenyou Xu Hai' , 48), (mod (ls_year -1924,12) +13) * 2 -1,2)

// 3 constellation. (Date parameters: date ls_date return parameters: string):

mid ("Capricorn Aquarius Pisces Aries Taurus Gemini Cancer Leo Virgo Libra Scorpio Sagittarius
Capricorn", (month (ls_date) + sign (sign (day (ls_date) - (19 + integer (mid ('102123444423', month
(ls_date), 1)))) + 1)) * 4 3,4) + 'seat'

// 4 judgment leap year. (Year parameters: int ls_year return parameters: int 0 = average year, 1 = leap
year):

abs (sign (mod (sign (mod (abs (ls_year), 4)) + sign (mod (abs (ls_year), 100)) + sign (mod (abs (ls_year),
400)), 2)) -1 )

// 5 days a month (date parameters: date ls_date return parameters: int).:

integer (28 + integer (mid ('3' + string (abs (sign (mod (sign (mod (abs (year (ls_date)), 4)) + sign (mod
(abs (year (ls_date)), 100) ) + sign (mod (abs (year (ls_date)), 400)), 2)) -1)) + '3232332323', month
(ls_date), 1)))

// 6 date of the last day of a month. (Date parameters: date ls_date return parameters: date):
date (year (ls_date), month (ls_date), integer (28 + integer (mid ('3' + string (abs (sign (mod (sign (mod
(abs (year (ls_date)), 4)) + sign (mod (abs (year (ls_date)), 100)) + sign (mod (abs (year (ls_date)), 400)),
2)) -1)) + '3232332323', month (ls_date), 1)) ))

// 7 the last day of a month seeking another date (date parameters: date ls_date return parameters:
date):

a.RelativeDate (date (year (ls_date) + sign (month (ls_date) -12) + 1, mod (month (ls_date) +1,13) + abs
(sign (mod (month (ls_date) +1,13) ) -1), 1) - 1)

b.RelativeDate (date (year (ls_date) + integer (month (ls_date) / 12), mod (month (ls_date), 12) +1,1), - 1)

// 8 seeking another few days a month. (Date parameters: date ls_date return parameters: int):

a.day (RelativeDate (date (year (ls_date) + sign (month (ls_date) -12) + 1, mod (month (ls_date) +1,13) +
abs (sign (mod (month (ls_date) +1, 13)) -1), 1) - 1)),

b.day (RelativeDate (date (year (ls_date) + integer (month (ls_date) / 12), mod (month (ls_date), 12)
+1,1), - 1))

// 9 a certain day of the week - with the PB system function DayName. (Date parameters: date ls_date
return parameters: string):

'Week' + mid ('day one hundred twenty-three thousand four hundred fifty-six', (mod (year (ls_date) -1 +
int ((year (ls_date) -1) / 4) - int ((year (ls_date) -1) / 100) + int ((year (ls_date) -1) / 400) + daysafter (date
(year (ls_date), 1,1), ls_date) +1,7) +1) * 2 -1,2)

// 10 seeking several months apart after a relative date (the date parameters: date ls_date apart month
(desirable negative): int ls_add_month return parameters: date):

date (year (ls_date) + int ((month (ls_date) + ls_add_month) / 13), long (mid (fill
('010203040506070809101112', 48), (mod (month (ls_date) + ls_add_month -1,12) +13 ) * 2 -1,2)), day
(ls_date) -integer (right (left (string (day (RelativeDate (date (year (ls_date) + int ((month (ls_date) +
ls_add_month) / 13) + sign (long (mid (fill ('010203040506070809101112', 48), (mod (month (ls_date) +
ls_add_month -1,12) +13) * 2 -1,2)) -12) + 1, mod (long (mid (fill ('010203040506070809101112', 48),
(mod (month (ls_date) + ls_add_month -1,12) +13) * 2 -1,2)) + 1,13) + abs (sign (mod (long (mid (fill
('010203040506070809101112', 48), (mod (month (ls_date) + ls_add_month -1,12) +13) * 2 -1,2)) +
1,13)) -1), 1), - 1) ) -day (ls_date), '00') + '00000', 5), 3)) / 100)

// 11 weeks of the year in which demand a certain date. (Date parameters: date ls_date return
parameters: int):

// a. weeks starting date for Sunday

// a1

abs (int (- ((daysafter (RelativeDate (date (year (ls_date), 1,1), -mod (year (ls_date) -1 + int ((year
(ls_date) -1) / 4) - int ((year (ls_date) -1) / 100) + int ((year (ls_date) -1) / 400) + 1,7) +1), ls_date) +1) /
7)))

// a2 (using DayNumber function)


abs (int (- ((daysafter (RelativeDate (date (year (ls_date), 1,1), -DayNumber (date (year (ls_date), 1,1)) +
1), ls_date) +1) / 7) ))

// b. weeks before the date Monday

// b1

abs (int (- ((daysafter (RelativeDate (date (year (ls_date), 1,1), -integer (mid ('6012345', mod (year
(ls_date) -1 + int ((year (ls_date) -1 ) / 4) - int ((year (ls_date) -1) / 100) + int ((year (ls_date) -1) / 400) +
1,7), 1))), ls_date) +1) / 7 )))

// b2 (using DayNumber function)

abs (int (- ((daysafter (RelativeDate (date (year (ls_date), 1,1), -integer (mid ('6012345', DayNumber (date
(year (ls_date), 1,1)), 1)) ), ls_date) +1) / 7)))

// 12 seeking a date relative to the past few weeks in which a certain date. (Date parameters: date
ls_date_1 (requires a certain date), ls_date_2 (past a certain date) return parameters: int):

// Note: ls_date_1> ls_date_2

// a. weeks starting date for Sunday

// a1

abs (int (- ((daysafter (RelativeDate (ls_date_2, -mod (year (ls_date_2) -1 + int ((year (ls_date_2) -1) / 4) -
int ((year (ls_date_2) -1) / 100) + int ((year (ls_date_2) -1) / 400) + daysafter (date (year (ls_date_2), 1,1),
ls_date_2) + 1,7) +1), ls_date_1) +1) / 7)))

// a2 (using DayNumber function)

abs (int (- ((daysafter (RelativeDate (ls_date_2, -DayNumber (ls_date_2) +1), ls_date_1) +1) / 7)))

// b. weeks before the date Monday

// b1

abs (int (- ((daysafter (RelativeDate (ls_date_2, -integer (mid ('6012345', mod (year (ls_date_2) -1 + int
((year (ls_date_2) -1) / 4) - int ((year (ls_date_2) -1) / 100) + int ((year (ls_date_2) -1) / 400) + daysafter
(date (year (ls_date_2), 1,1), ls_date_2) + 1,7), 1))), ls_date_1) +1) / 7)))

// b2 (using DayNumber function)

abs (int (- ((daysafter (RelativeDate (ls_date_2, -integer (mid ('6012345', DayNumber (ls_date_2), 1))),
ls_date_1) +1) / 7)))

// pb pure function analog Explorer window, click the mouse in action dynamic data sorting and display
the sort arrow

// Function name: f_dwsort (datawindow fdw_dw, dwobject fdwo_dwo) return none


// Description: for analog Explorer click action dynamic sorting in the data window, and display the sort
arrow

// Invoke rules: In the data window controls clicked written f_dwsort (this, dwo)!

// Parameters: fdw_dw datawindow

// Fdwo_dwo dwobject

// Return Value: None

String ls_clicked_pos, ls_col, ls_format, ls_tag

Long ll_pos

string ls_text, ls_column []

int li_i

ls_clicked_pos = fdwo_dwo.Name

ll_pos = Pos (ls_clicked_pos, '_ t')

If ll_pos> 0 Then

// Set the sort

ls_col = Left (ls_clicked_pos, ll_pos -1)

ls_tag = fdwo_dwo.tag

If ls_tag = ls_col + "A" Then

fdwo_dwo.tag = ls_col + "D"

ls_format = ls_col + "A"

ELSEIF ls_tag = ls_col + "D" Then

fdwo_dwo.tag = ls_col + "A"

ls_format = ls_col + "D"

Else

fdwo_dwo.tag = ls_col + "D"

ls_format = ls_col + "A"

End If

// Set column headers

for li_i = 1 to long (fdw_dw.object.datawindow.column.count)

ls_column [li_i] = fdw_dw.describe ("#" + string (li_i) + ".Name") // get column names
ls_text = fdw_dw.Describe (ls_column [li_i] + "_t.text")

if right (ls_text, 2) = "▽" or right (ls_text, 2) = "△" then

ls_text = left (ls_text, len (ls_text) - 2)

end if

fdw_dw.modify (ls_column [li_i] + "_t.text = '" + ls_text + "'")

next

ls_text = fdw_dw.Describe (ls_clicked_pos + ".text")

if right (ls_text, 2) = "▽" or right (ls_text, 2) = "△" then

ls_text = left (ls_text, len (ls_text) - 2)

end if

if right (ls_format, 1) = 'A' then

fdw_dw.modify (ls_clicked_pos + ".text = '" + ls_text + "△'")

elseif right (ls_format, 1) = 'D' then

fdw_dw.modify (ls_clicked_pos + ".text = '" + ls_text + "▽'")

end if

fdw_dw.SetSort (ls_format)

fdw_dw.Sort ()

End If

// This program tested in pb6.5

// pb in the first character of a string of characters to take a function zhoukan (Collection)

Today saw the first character of a fetch function xuejun characters, and try a little, feeling very good, not
exclusive, come to share with you:

$ PBExportHeader $ uf_getfirstletter.srf

$ PBExportComments $ return for a given string of characters string initials, xuejun, 19990821

global type uf_getfirstletter from function_object

end type

forward prototypes
global function string uf_getfirstletter (string as_inputstring)

end prototypes

global function string uf_getfirstletter (string as_inputstring); // Function name: uf_GetFirstLetter

// Used to: Returns the given string of characters string initials, that consonant strings

// Input Arguments: as_InputString - string, string given kanji

// Return Value: ls_ReturnString - String, given the string of consonants string characters, all lowercase

// Notice: 1. the validity of this method is based on the national standard kanji characters Reservoir bit
encoding, this encoding systems do not meet this function is invalid!

// 2 If the Chinese character string containing non-Kanji characters, such as graphic symbols or ASCII
code, then these non-kanji characters will remain unchanged.

// Sample: ls_rtn = uf_GetFirstLetter ("People's Republic of China")

// Ls_rtn will be: zhrmghg

// Scripts:

start area code char lc_FirstLetter [23] // store GB a different pronunciation of the corresponding
Chinese character pronunciation

string ls_ch // temporary unit

string ls_SecondSecTable // store all GB two Chinese pronunciation

Returns the string string ls_ReturnStr //

start area code integer li_SecPosValue [23] // store GB a different pronunciation of Chinese characters

integer i, j

integer li_SectorCode // Kanji area code

integer li_PositionCode // Chinese-bit code

integer li_SecPosCode // Kanji area code

integer li_offset // two character offsets

// Set initial value

li_SecPosValue [] =
{1601,1637,1833,2078,2274,2302,2433,2594,2787,3106,3212,3472,3635,3722,3730,3858,4027,4086,43
90,4558,4684,4925,5249 }

lc_FirstLetter [] = {"A", "B", "C", "D", "E", "F", "G", "H", "J", "K", "L", "M "," N "," O "," P "," Q "," R "," S ","
T "," W "," X "," Y "," Z "}
ls_SecondSecTable = "CJWGNSPGCGNE [Y [BTYYZDXYKYGT [JNNJQMBSGZSCYJSYY [PGKBZGY
[YWJKGKLJYWKPJQHY [W
[DZLSGMRYPYWWCCKZNKYYGTTNJJNYKKZYTCJNMCYLQLYPYQFQRPZSLWBTGKJFYXJWZLTBNCXJJJJTXDTTS
QZYCDXXHGCK [PHFFSS [YBGXLPPBYLL [HLXS [ZM
[JHSOJNGHDZQYKLGJHSGQZHXQGKEZZWYSCSCJXYEYXADZPMDSSMZJZQJYZC [J
[WQJBYZPXGZNZCPWHKXHQKMWFBPBYDTJZZKQHYLYGXFPTYJYYZPSZLFCHMQSHGMXXSXJ
[[DCSBBQBEFSJYHXWGZKPYLQBGLDLCCTNMAYDDKSSNGYCSGXLYZAYBNPTSDKDYLHGYMYLCXPY
[JNDQJWXQXFYYFJLEJPZRXCCQWQQSBNKYMGPLBMJRQCFLNYMYQMSQYRBCJTHZTQFRXQHXMJJCJLXQG
JMSHZKBSWYEMYLTXFSYDSWLYCJQXSJNQBSCTYHBFTDCYZDJWYGHQFRXWCKQKXEBPTLPXJZSRMEBWHJL
BJSLYYSMDXLCLQKXLHXJRZJMFQHXHWYWSBHTRXXGLHQHFNM [YKLDYXZPYLGG
[MTCFPAJJZYLJTYANJGBJPLQGDZYQYAXBKYSECJSZNSLYZHSXLZCGHPXZHZNYTDSBCJKDLZAYFMYDLEBBGQ
YZKXGLDNDNYSKJSHDLYXBCGHXYPKDJMMZNGMMCLGWZSZXZJFZNMLZZTHCSYDBDLLSCDDNLKJYKJSYCJ
LKWHQASDKNHCSGANHDAASHTCPLCPQYBSDMPJLPZJOQLCDHJJYSPRCHN
[NNLHLYYQYHWZPTCZGWWMZFFJQQQQYXACLBHKDJXDGMMYDJXZLLSYGXGKJRYWZWYCLZMSSJZLDBYD
[FCXYHLXCHYZJQ [[QAGMNYXPFRKSSBJLYXYSYGLNSCMHZWWMNZJJLXXHCHSY
[[TTXRYCYXBYHCSMXJSZNPWGPXXTAYBGAJCXLY
[DCCWZOCWKCCSBNHCPDYZNFCYYTYCKXKYBSQKKYTQQXFCWCHCYKELZQBSQYJQCCLMTHSYWHMKTLKJL
YCXWHEQQHTQH [PQ
[QSCFYMNDMGBWHWLGSLLYSDLMLXPTHMJHWLJZYHZJXHTXJLHXRSWLWZJCBXMHZQXSDZPMGFCSGLSX
YMJSHXPJXWMYQKSMYPLRTHBXFTPMHYXLCHLHLZYLXGSSSSTCLSLDCLRPBHZHXYYFHB
[GDMYCNQQWLQHJJ [YWJZYEJJDHPBLQXTQKWHLCHQXAGTLXLJXMSL [HTZKZJECXJCJNMFBY
[SFYWYBJZGNYSDZSQYRSLJPCLPWXSDWEJBJCBCNAYTWGMPAPCLYQPCLZXSBNMSGGFNZJJBZSFZYNDXHP
LQKZCZWALSBCCJX
[YZGWKYPSGXFZFCDKHJGXDLQFSGDSLQWZKXTMHSBGZMJZRGLYJBPMLMSXLZJQQHZYJCZYDJWBMYKLD
DPMJEGXYHYLXHLQYQHKYCWCJMYYXNATJHYCCXZPCQLBZWWYTWBQCMLPMYRJCCCXFPZNZZLJPLXXYZT
ZLGDLDCKLYRZZGQTGJHHGJLJAXFGFJZSLCFDQZLCLGJDJCSNZLLJPJQDCCLCJXMYZFTSXGCGSBRZXJQQCTZH
GYQTJQQLZXJYLYLBCYAMCSTYLPDJBYREGKLZYZHLYSZQLZNWCZCLLWJQJJJKDGJZOLBBZPPGLGHTGZXYGHZ
MYCNQSYCYHBHGXKAMTXYXNBSKYZZGJZLQJDFCJXDYGJQJJPMGWGJJJPKQSBGBMMCJSSCLPQPDXCDYYK
Y
[CJDDYYGYWRHJRTGZNYQLDKLJSZZGZQZJGDYKSHPZMTLCPWNJAFYZDJCNMWESCYGLBTZCGMSSLLYXQSX
SBSJSBBSGGHFJLYPMZJNLYYWDQSHZXTYYWHMZYHYWDBXBTLMSYYYFSXJC [DXXLHJHF
[SXZQHFZMZCZTQCXZXRTTDJHNNYZQQMNQDMMG
[YDXMJGDHCDYZBFFALLZTDLTFXMXQZDNGWQDBDCZJDXBZGSQQDDJCMBKZFFXMKDMDSYYSZCMLJDSY
NSBRSKMKMPCKLGDBQTFZSWTFGGLYPLLJZHGJ
[GYPZLTCSMCNBTJBQFKTHBYZGKPBBYMTDSSXTBNPDKLEYCJNYDDYKZDDHQHSDZSCTARLLTKZLGECLLKJLQ
JAQNBDKKGHPJTZQKSECSHALQFMMGJNLYJBBTMLYZXDCJPLDLPCQDHZYCBZSCZBZMSLJFLKRZJSNFRGJHX
PDHYJYBZGDLQCSEZGXLBLGYXTWMABCHECMWYJYZLLJJYHLG
[DJLSLYGKDZPZXJYYZLWCXSZFGWYYDLYHCLJSCMBJHBLYZLYCBLYDPDQYSXQZBYTDKYXJY
[CNRJMPDJGKLCLJBCTBJDDBBLBLCZQRPPXJCJLZCSHLTOLJNMDDDLNGKAQHQHJGYKHEZNMSHRP
[QQJCHGMFPRXHJGDYCHGHLYRZQLCYQJNZSQTKQJYMSZSWLCFQQQXYFGGYPTQWLMCRNFKKFSYYLQBM
QAMMMYXCTPSHCPTXXZZSMPHPSHMCLMLDQFYQXSZYYDYJZZHQPDSZGLSTJBCKBXYQZJSGPSXQZQZRQT
BDKYXZKHHGFLBCSMDLDGDZDBLZYYCXNNCSYBZBFGLZZXSWMSCCMQNJQSBDQSJTXXMBLTXZCLZSHZCX
RQJGJYLXZFJPHYMZQQYDFQJJLZZNZJCDGZYGCTXMZYSCTLKPHTXHTLBJXJLXSCDQXCBBTJFQZFSLTJBTKQBX
XJJLJCHCZDBZJDCZJDCPRNPQCJPFCZLCLZXZDMXMPHJSGZGSZZQLYLWTJPFSYASMCJBTZKYCWMYTCSJJLJC
QLWZMALBXYFBPNLSFHTGJWEJJXXGLLJSTGSHJQLZFKCGNNNSZFDEQFHBSAQTGYLBXMMYGSZLDYDQMJJ
RGBJTKGDHGKBLQKBDMBYLXWCXYTTYBKMRTJZXQJBHLMHMJJZMQASLDCYXYQDLQCAFYWYXQHZ "

// Get it!

ls_ReturnStr = ""

For i = 1 to Len (as_InputString) // sequentially processing each character as_InputString

ls_ch = Mid (as_InputString, i, 1)

If Asc (ls_ch) <128 then // non-kanji

ls_returnStr = ls_returnStr + ls_ch // unchanged

Else // Chinese characters

ls_ch = Mid (as_InputString, i, 2) // out this characters

li_SectorCode = Asc (Left (ls_ch, 1)) - 160 // area code

li_PositionCode = Asc (Right (ls_ch, 1)) - 160 // bit code

li_SecPosCode = li_SectorCode * 100 + li_PositionCode // area code

If li_SecPosCode> 1600 and li_SecPosCode <5590 then // first character

For j = 23 to 1 Step -1 // find initials

If li_SecPosCode> = li_SecPosValue [j] then

ls_returnStr = ls_returnStr + lc_FirstLetter [j]

Exit

End if

Next

Else // first character

li_offset = (li_SectorCode - 56) * 94 + li_PositionCode - 1 // calculate the offset

If li_offset> = 0 and li_offset <= 3007 then // two zones characters

ls_returnStr = ls_returnStr + Mid (ls_SecondSecTable, li_offset, 1) // remove this word initials

End if

End if

i = i + 1 // point to the next one kanji

End if

Next // processed
// Return result

Return lower (ls_returnStr) // return as_InputString consonant strings

end function

Avoid head side table // Grid data window selection mode when there form lines.

Grid data window with a way to achieve a tabular report output, but if not controlled or treated at the
head table side, it appears

Form Line Detail Band of each column of data, which we do not need. Reference method is to solve the
problem:

①. Could head side table in the Header Band of adding a text box, so that the text box and can be wide
enough to cover all of the data columns, while the

Vertical length adjustment Header Band in the head portion of the table flush.

②. Properties ... in the text box window, displays the contents of the text box to clear empty,
background Font tab in the font in the

Colors (Background) with the same background color is set to the data window and Position tab will be
its Layer (level) is amended as

Foreound, click the OK button, and immediately be able to see the effect.

// How to use WINSOCK control in the POWER BUILDER

With resource sharing and real-time communication needs, many computer applications have already
bypassing individual combat mode, into joint action.

Network in the computer world, increasingly play a pivotal role. In WINDOWS applications, most
commonly used for real-time communication

MICROSOFT WINSOCK control or provided by the company. Much of the information detailing the
WINSOCK in VB to use, even WINDOWS

Hlp file itself is also written for VB. The author because of the need of practical application, figure out the
application WINSOCK control in the PB of

Methods. Good things did not dare to enjoy alone, come to share with you.

Following a simple program to illustrate the use of the PB WINSOCK control of:

First, add WINSOCK control in the window:


In the application to open a new window, click on the controls in the window painter -> OLE menu item
Insert object pop-up window, click

Insert control labels, selected from the list box, double-click the Microsoft Winsock control, the winsock
icon attached to the window.

The control name in the program as winsock_a (Party) and winsock_b (B).

Second, the setting information input and output text box:

Add a button cb_1 in the window, two-line text box sle_1, sle_2, respectively, the input string to send
and accept each other for sending

String

Third, set the communication protocol:

WINSOCK control allows the user to UDP and TCP Choose one of two protocols for communication.

1.UDP protocol settings: UDP protocol is a connectionless protocol, before the communication, the need
to bind remotehost and remoteport

Property, if necessary two-way communication, but also set localport property.

Party A (the machine address is: 134.1.1.1) Open event window add the following statement:

winsock_a.object.protocol = 1

// winsock communication protocol is set to UDP protocol

winsock_a.object.remotehost = "134.1.1.2"

// Each other's ip address

winsock_a.object.remoteport = 6000

// The other side of winsock communication port number

winsock_a.object.localport = 6001

// This machine winsock communication port number

winsock_a.object.bind

// Binding protocol

Open event of the window to add the following statement: In the B (134.1.1.2 address of the machine):

winsock_b.object.protocol = 1

// winsock communication protocol is set to UDP protocol

winsock_b.object.remotehost = "134.1.1.1"

// Each other's ip address


winsock_b.object.remoteport = 6001

// The other side of winsock communication port number

winsock_b.object.localport = 6000

// This machine winsock communication port number

winsock_b.object.bin

// Binding protocol

2.TCP Protocol Settings: TCP protocol communications need to be connected before.

Party A (as a server-side) Open event window add the following statement:

winsock_a.object.protocol = 0

// winsock communication protocol to TCP protocol

winsock_a.object.localport = 6001

// This machine winsock communication port number

winsock_a.listen ()

// Start listening

Add the following statement Connectionrequest Party winsock_a control's event:

// The other side of the connection request received

if winsock_a.object.state <> 0 then

winsock_a.close ()

end if

winsock_a.accept (requestID)

// Establish a direct connection

// requestID event is Connectionrequest own parameters

In B (as a client) Open event window add the following statement:

winsock_b.object.protocol = 0

// winsock communication protocol to TCP protocol

winsock_b.object.remotehost = "134.1.1.2"

// Each other's ip address

winsock_b.object.remoteport = 6000

// The other side of winsock communication port number


winsock_b.connect () // connection request

3 Either protocol uses, should add the following statement in the Close event of the window:

if winsock_a.object.state <> 0 then

winsock_a.close ()

end if

Otherwise, problems may occur when using unusual second time

Third, start communication

Add the following sentence at the button cb_1 (caption attribute is set to 'send')'s click event:

winsock_a.object.send (sle_1.text)

Add the following statement dataarrival winsock_a control's event:

Other data received after //

string datastr1

winsock_a.object.getdata (def datastr1)

sle_2.text = datastr1 // the data string is displayed in a text box

The above procedure is actually reflects the underlying chat works, minor modifications can be made to
expand a nice chat software

Das könnte Ihnen auch gefallen