ThaiPBL.com

PowerBuilder Library Thailand

อีเมล พิมพ์ PDF

ทำ background แบบไล่เฉียดสี

วันนี้เราจะมาสร้าง user object ตัวหนึ่งเอาใว้จัดการกับหน้าจอของโปรแกรมที่เราพัฒนาให้ดูสวยงาม เตะตาผู้ใช้กันเริ่มจากการกำหนด user object ก่อน

ไฟล์ภาพ/ข้อมูล ---> ถูกแสดงอยู่




ให้ทำการคลิกที่ standard และเลือกเป็น datawindow ตั้งชื่อว่า gradient

 
ไฟล์ภาพ/ข้อมูล ---> ถูกแสดงอยู่




จากนั้นทำการ declare userobject functions กำหนด argument ดังรูปด้านบน และเขียนสคริปต์ตามด้านล่าง
IF ai_Red 255 THEN RETURN -1
IF ai_Green 255 THEN RETURN -1
IF ai_blue 255 THEN RETURN -1

ii_Red = ai_Red
ii_Green = ai_Green
ii_Blue = ai_Blue

RETURN this.RePaint()
จากนั้นก็ทำการ declare userobject functions อีกหนึ่งตัว แต่คราวนี้กำหนดแค่ access ให้เป็น private และ returns ให้เป็น integer และเขียนสคริปต์ด้านล่าง ตั้งชื่อ function ว่า Initialize
String ls_Errors
Environment lenv_Env

GetEnvironment( lenv_Env )

this.Create( 'release ' + String( lenv_Env.PBMajorRevision ) + &
';' + cis_DatawindowDef, ls_Errors )

IF Len( ls_Errors ) > 0 THEN
// This should never happen!
MessageBox( 'Gradient Initialize Error', ls_Errors )
RETURN -1
END IF

inc_gradient = CREATE nc_gradient

RETURN 1

ทำแบบเดิมอีกครั้ง แต่เปลี่ยนค่าของ access เป็น public ตั้งชื่อ function ว่า repaint และเขียนสคริปต์ตามด้านล่าง
String ls_Moderr

ls_ModErr = this.Modify( "datawindow.header.height=" + String( this.Height ) )
IF Len( ls_ModErr ) > 0 THEN
MessageBox( 'RePaint Error', $ls_ModErr )
RETURN -1
END IF

RETURN inc_Gradient.Gradient( this, this.width, "header", ii_red, ii_green, ii_blue )

this.Initialize()

และที่ event destructor ก็เขียนสคริปต์ด้านล่าง
IF IsValid( inc_gradient ) THEN DESTROY inc_gradient
จากนั้นก็ทำการ save user object ตัวนี้เอาใว้
จากนั้นก็ต้องสร้าง user object อีกหนึ่งตัวโดยการ ย้อนกลับไปทำตามตั้งแต่ขั้นตอนแรก อีกครั้งแต่คราวนี้เราเลือกประเภทของ user object เป็น class
แบบ custom
จากนั้นทำการ declare user object function ตั้งชื่อว่า gradient และกำหนดรายละเอียดต่างๆ แล้วเขียนสคริปต์ลงไปดังนี้

 
ไฟล์ภาพ/ข้อมูล ---> ถูกแสดงอยู่





Integer li_Red, li_Green, li_Blue, li_I, li_Y, li_Height
Integer li_UY, li_UHeight
Long ll_RGB
String ls_Modify, ls_ModErr

IF ai_Red 255 THEN RETURN -1
IF ai_Green 255 THEN RETURN -1
IF ai_blue 255 THEN RETURN -1

// Delete rectangles incase they have been painted before
FOR li_I = 1 TO cii_Segments
ls_Modify += ' destroy rec_' + String( li_I )
NEXT
adw_DW.Modify( ls_Modify )
ls_Modify = ""

li_Red = ai_Red
li_Green = ai_Green
li_Blue = ai_Blue
li_Height = UnitsToPixels( Long( &
adw_DW.Describe( "datawindow." + as_Band + ".height" ) ), YUnitsToPixels! )
li_Height /= cii_Segments

// Create the modify string with all the lines
// in the DW so that they create the gradient.
FOR li_I = 1 TO cii_Segments
li_UY = PixelsToUnits( li_Y, YPixelsToUnits! )
li_UHeight = PixelsToUnits( li_Height, YPixelsToUnits! )
ll_RGB = RGB( li_Red, li_Green, li_Blue )

// Create the line
ls_Modify += ' create rectangle(band=' + as_Band + ' x="1" y="' + String( li_UY ) + &
'" height="' + String( li_UHeight ) + '" width="' + String( ai_Width ) + &
'" name=rec_' + String( li_I ) + ' brush.hatch="6" brush.color="' + &
String( ll_RGB ) + '" pen.style="0" pen.width="5" pen.color="' + &
String( ll_RGB ) + '" background.mode="2" background.color="0" )'

// Do the counters :-)
li_Y += li_Height
li_Red -= ( 255 / cii_Segments )
IF li_Red < 0 THEN li_Red = 0
li_Green -= ( 255 / cii_Segments )
IF li_Green < 0 THEN li_Green = 0
li_Blue -= ( 255 / cii_Segments )
IF li_Blue < 0 THEN li_Blue = 0
NEXT

// Apply the modify in one hit
ls_ModErr = adw_DW.Modify( ls_Modify )
IF Len( ls_ModErr ) > 0 THEN
MessageBox( 'Error Adding Rectangle's, ls_ModErr )
RETURN -1
END IF

RETURN 1

จากนั้นก็ทำการ save
วิธีการใช้งานก็เปิด วินโดวส์ขึ้นมาใหม่ ทำการ declare instant variable
Boolean ib_First = TRUE
วาง user object ลงไป ที่ event open ของวินโดวส์ เขียนสคริปต์ลงไปดังนี้
ib_First = FALSE
dw_1.gradient(255,255,90)
ตัวเลขที่เรากำหนดลงไปนั้นคือตัวเลขของค่า RGB เรากำหนดได้ตามใจชอบแล้วแต่ว่าจะชอบสีอะไร
ที่ event resize เขียนสคริปต์ลงไป

dw_1.Resize( width, height )
IF NOT ib_First THEN
dw_1.RePaint()
END IF

เพื่อเป็นการขยายขนาดให้เต็มวินโดวส์โดยอัตโนมัติแต่ควรจะวาง object ให้ชิดมุมบนซ้ายนะครับ
เท่านี้ก็เรียบร้อยแล้วครับลองเอาไปทำใช้ดูนะครับมีปัญหาอะไรเชิญเมล์มา


บทความนี้มาจาก www.soopawat.com