第一讲:n_svc_mgr(服务管理器)

184270428 2011-05-25 11:20:13
Kodigo 3.3.1.5
第一讲:n_svc_mgr(服务管理器)
网上学习kodigo之风吹了一阵,又消声了……
很多人反应这套系统太复杂了,其实一步一步的认真去读代码,这套系统了不难懂的。
最近我准备写写我对Kodigo的理解,欢迎有人一起讨论。

首先,我们来看看,n_svc_mgr的定义结构(我对PB的source语法给出了相应的注释):
/*
Forward段是用来提前声明的。
相当于C语言中,在调用后面才给出实现的函数时,要声明一下一样。
只不过PB用forward关键把它们框起来了。
*/

Forward//提前声明段
global type n_svc_mgr from n_svc_base
end type//声明内容
end forward
shared variables//共享变量定义段
str_svc sstr[]
end variables
global type n_svc_mgr from n_svc_base autoinstantiate
end type

type variables//普通属性定义段
Protected:
str_svc istr[]
end variables

forward prototypes//方法声明段
public function integer of_loadsvc (ref n_svc_base anv_ref, readonly string as_classname)
protected subroutine of_catchloadsvc (ref n_svc_base anv_ref, readonly string as_cls) throws n_x_svc
protected function long of_findsvclocal (readonly string as_cls)
protected function long of_findsvcshared (readonly string as_cls)
public function long of_getsvcusage (readonly string as_cls)
public subroutine of_unloadsvc (readonly string as_cls, readonly boolean ab_destroy)
public subroutine of_unloadsvc (readonly boolean ab_destroy)
public subroutine of_unloadsvc (readonly string as_classname)
public subroutine of_unloadsvc (readonly string as_classnames[])
protected function long of_getinstanceavailableindex ()
protected function long of_getsharedavailableindex ()
end prototypes


用C++语法表示
Class n_svc_mgr :public n_svc_base
{
Protected:
Static str_svc sstr[];//为什么共享变量对应static,后面再说明.
str_svc istr[];
//尾部的throws n_x_svc 表示函数调用有异常的时候抛出一个n_x_svc
of_catchloadsvc (ref n_svc_base anv_ref, string as_cls) throws n_x_svc;
long of_findsvclocal (string as_cls);
long of_findsvcshared (string as_cls);
long of_getinstanceavailableindex ();
long of_getsharedavailableindex ();
public:
integer of_loadsvc (ref n_svc_base anv_ref, string as_classname);
long of_getsvcusage (string as_cls);
of_unloadsvc (string as_cls, boolean ab_destroy);
of_unloadsvc (boolean ab_destroy);
of_unloadsvc (string as_classname);
of_unloadsvc (string as_classnames[]);
long of_getinstanceavailableindex ();
long of_getsharedavailableindex ();
};
上面的伪C++的写法,是不是也很好看呢?^-^

看看属性段:
为什么要定义两个同类型(str_svc)的数组来存对服务的引用呢?

说到这里,我要讲讲共享变量的特征:

1, 生成期:对象共享变量在它的第一个实列实列化起,一直到程序结束。
2, 返问权:该同类对象的所有实列都可以返问共享变量。

这一点刚好和C++的类的静态属性相似。

那么共享变量有什么用呢?
试想:第一个实列起,该变量的内容都可以在内存里找到,那么是不是可以共享多个地方都要使用的数据呢?
这一点全局变量也可以做到,但为什么不用全局变量呢?
我想大家看到多很多PB系统大量使用全局变量,随变量越来越多,写代码都要小心了,生怕和全局变量冲突。虽然可以通过命名归则来防止这样的事发生,但看到这些变量,总是有种不舒服的感觉。



说到这里,下面我开始一个方法一个方法的讲,最后再总结这个管理器的功能。

public function integer of_loadsvc (ref n_svc_base anv_ref, readonly string as_classname);
//通过anv_ref,返问,as_classname对应的实列.
TRY
of_catchloadsvc(anv_ref, as_classname)//功能同of_loadsvc
RETURN CRet.SUCCESS
CATCH (n_x_svc ex)
RETURN CRet.FAILURE
CATCH (runtimeerror err)
RETURN CRet.FAILURE
END TRY
end function

protected subroutine of_catchloadsvc (ref n_svc_base anv_ref, readonly string as_cls) throws n_x_svc;

long n, c
IF ISVALID(anv_ref) THEN RETURN
n = of_findsvclocal(as_cls)//在本地数组里查找as_cls服务
IF n > 0 THEN //如果找到返回其引用
anv_ref = istr[n].nvo
RETURN
END IF
n = of_findsvcshared(as_cls)//共享数组里查找as_cls服务
TRY
IF n > 0 THEN //如果找到,插入到本地,同时共享数组里的引用计数增1
c = UPPERBOUND(istr) + 1
istr[c].classname = sstr[n].classname
istr[c].nvo = sstr[n].nvo
sstr[n].counter = sstr[n].counter + 1
ELSE//如果没有找到新建一个
n = of_getsharedavailableindex()//得到共享数组里的一个可插入点
//插入到共享数组中去
sstr[n].classname = as_cls
sstr[n].nvo = CREATE USING as_cls
sstr[n].counter = 1
c = of_getinstanceavailableindex()//得到本地插入点
//插入到本地
istr[c].classname = sstr[n].classname
istr[c].nvo = sstr[n].nvo
END IF
anv_ref = istr[c].nvo
CATCH (runtimeerror err)
END TRY
end subroutine

protected function long of_findsvclocal (readonly string as_cls);
//本地查找as_cls服务
long n, ll_count
ll_count = UPPERBOUND(istr)

FOR n = 1 to ll_count
IF lower(istr[n].classname) = lower(as_cls) AND ISVALID(istr[n].nvo) THEN RETURN n
NEXT
RETURN CRet.FAILURE
end function

protected function long of_findsvcshared (readonly string as_cls);
//共享数组中查找as_cls服务

long n, ll_count
ll_count = UPPERBOUND(sstr)
FOR n = 1 to ll_count
IF NOT ISVALID(sstr[n].nvo) THEN CONTINUE
IF lower(sstr[n].classname) = lower(as_cls) THEN RETURN n
NEXT
RETURN CRet.FAILURE
end function

public function long of_getsvcusage (readonly string as_cls);
//返回as_cls服务的引用计数
long n
n = of_findsvcshared(as_cls)//在共享数组里查找as_cls服务
IF n = CRet.FAILURE THEN RETURN CRet.FAILURE//没找到
RETURN sstr[n].counter//返问引用计数
end function

public subroutine of_unloadsvc (readonly string as_cls, readonly boolean ab_destroy);
//卸载as_cls服务
//注意:当ab_destroy为假且服务的#pooled属性为真时,只将引用记数减1
long n
n = of_findsvcshared(as_cls)//在共享数组中查找
IF n = CRet.FAILURE THEN RETURN
sstr[n].counter --//引用计数减1
IF NOT ab_destroy THEN//是否真正卸载
IF sstr[n].counter = 0 AND sstr[n].nvo.of_ispooled() THEN RETURN
END IF
IF sstr[n].counter = 0 THEN//没有再引用,可以删掉了
DestroyObject(sstr[n].nvo)
sstr[n].counter = 0
SetNull(sstr[n].classname)
END IF
end subroutine

public subroutine of_unloadsvc (readonly boolean ab_destroy);
//全部卸载,或全部将引用计数减1
long ll_count, n

ll_count = UPPERBOUND(istr)

FOR n = 1 to ll_count
of_unloadsvc(istr[n].classname, ab_destroy)
NEXT
end subroutine

public subroutine of_unloadsvc (readonly string as_classname);
//卸载as_classname服务
of_unloadsvc(as_classname, TRUE)
end subroutine

public subroutine of_unloadsvc (readonly string as_classnames[]);
//卸载一批服务
long ll_count, n
ll_count = UPPERBOUND(as_classnames)
FOR n = 1 to ll_count
of_unloadsvc(as_classnames[n], TRUE)
NEXT
end subroutine

protected function long of_getinstanceavailableindex ();
//在本地查找可插入点
long ll_index
long ll_count, n

ll_count = UPPERBOUND(istr)

IF ll_count > 0 THEN
FOR n = 1 to ll_count
IF istr[n].counter = 0 THEN
IF ISVALID(istr[n].nvo) THEN
CONTINUE
ELSE
RETURN n
END IF
END IF
NEXT
RETURN ll_count + 1
ELSE
RETURN 1
END IF
end function

protected function long of_getsharedavailableindex ();
//在共享数组里查找可插入点
long ll_index
long ll_count, n

ll_count = UPPERBOUND(sstr)

IF ll_count > 0 THEN
FOR n = 1 to ll_count
IF sstr[n].counter = 0 THEN
IF ISVALID(sstr[n].nvo) THEN
CONTINUE
ELSE
RETURN n
END IF
END IF
NEXT
RETURN ll_count + 1
ELSE
RETURN 1
END IF
end function

on n_svc_mgr.create
call super::create
end on

on n_svc_mgr.destroy
call super::destroy
end on

event destructor;call super::destructor;
of_unloadsvc(FALSE)//引用计数全部减1
end event

到了这里这个服务管理器的功能,是不是清楚了呢?

实际上它的一个服务载入,和存储服务的一个对象,它有的功能:

1, 载入一个服务
2, 统一管理服务
3, 可以通过共享数组返问其它地方创建的服务

载入服务的时候,先查找,找不到再建。这样是不是总个系统,同样的服务只建了一次呢?
大家不防看看单列模式的内容,是不是很像呢?

如果大家看懂了,这个服务管里器,不防去看看kodigo V4.5的servicemanager,是不是和这个类实呢?
Kodigo的所有服务都是用n_svc_mgr载入的,所以第一讲就是这个服务管理器了。
好了,n_svc_mgr就讲到这里。
...全文
494 24 打赏 收藏 转发到动态 举报
写回复
用AI写文章
24 条回复
切换为时间正序
请发表友善的回复…
发表回复
184270428 2011-06-20
  • 打赏
  • 举报
回复
Function ulong ImageList_SetBkColor(long himl, ulong clrBk) Library "comctl32.dll"
//设置ImageList背景色
Function ulong ImageList_GetBkColor(long himl) Library "comctl32.dll"
//返回ImageList背景色
Function boolean ImageList_Destroy(long himl) Library "comctl32.dll"
//卸载ImageList
Function boolean ImageList_SetOverlayImage(long himl, long iImage, long iOverlay) Library "comctl32.dll"
//
Function boolean ImageList_Draw(long himl, long i, long hdcDst, long x, long y, ulong fStyle) Library "comctl32.dll"
//选ImageList中的一个图片绘制在指定DC上
Function boolean ImageList_DrawIndirect(IMAGELISTDRAWPARAMS p) Library "comctl32.dll"
//按IMAGELISTDRAWPARAMS结构指示绘图
Function boolean ImageList_Replace( long himl, long i, long hbmImage, long hbmMask) Library "comctl32.dll"
//替换ImageList中被选中的位图
Function boolean ImageList_DrawEx( long himl, long i, long hdcDst, long x, long y, long dx, long dy, ulong rgbBk, ulong rgbFg, ulong fStyle) Library "comctl32.dll"
//ImageList_Draw相似
Function boolean ImageList_Remove( long himl, long i) Library "comctl32.dll"
//移去一个图片
Function boolean ImageList_BeginDrag( long himlTrack, long iTrack, long dxHotspot, long dyHotspot) Library "comctl32.dll"
开始托动
Function boolean ImageList_EndDrag() Library "comctl32.dll"
结束托动
Function boolean ImageList_DragEnter( long hwndLock, long x, long y) Library "comctl32.dll"
将托动图象锁定到指定窗口,并显视在指定位置
Function boolean ImageList_DragLeave( long hwndLock) Library "comctl32.dll"
刚好跟ImageList_DragEnter相反
Function boolean ImageList_DragMove( long x, long y) Library "comctl32.dll"
移动托动图象
Function boolean ImageList_SetDragCursorImage( long himlDrag, long iDrag, long dxHotspot, long dyHotspot) Library "comctl32.dll"
指定新的托动图片
Function boolean ImageList_DragShowNolock( boolean fShow) Library "comctl32.dll"
//显视或隐藏被托动的图像
Function boolean ImageList_GetIconSize(long himl, Ref long cx, Ref Long cy) Library "comctl32.dll"
//得到ImageList尺寸
Function boolean ImageList_SetIconSize(long himl, long cx, long cy) Library "comctl32.dll"
//设置ImageList尺寸
Function boolean ImageList_GetImageInfo(long himl, long i, Ref IMAGEINFO pImageInfo) Library "comctl32.dll"
//得到ImageList中的指定图片的基本信息
Function long ImageList_Duplicate( long himl) Library "comctl32.dll"
//复制ImageList得到一个新的ImageList
// Stream Functions
Function long ImageList_Read( long pstm) Library "comctl32.dll"
//从数据流中读取一个ImageList
Function boolean ImageList_Write( long himl, long pstm) Library "comctl32.dll"
//将ImageList写到一个数据流中
//draw state for disable look non-XP
FUNCTION long DrawState(Long hdc, Long hBrush, Long lpDrawStateProc , Long lParam, Long wParam, Long X, Long Y, Long cX, Long cY, Long fuFlags) Library "user32.dll" Alias for "DrawStateA;Ansi"
//显示图像并应用可视化效果来表示一个状态。(事实上我也没有搞清这个函数。)

关于imagelist的更多内容,可以查MSDN
http://msdn.microsoft.com/en-us/library/ms927688.aspx
也可以查一下cimagelist的使用
http://msdn.microsoft.com/zh-cn/library/cc468275(v=VS.71).aspx
http://msdn.microsoft.com/zh-cn/library/3wbc1wt4.aspx
184270428 2011-06-17
  • 打赏
  • 举报
回复

Function ulong ImageList_SetBkColor(long himl, ulong clrBk) Library "comctl32.dll"
//设置ImageList背景色
Function ulong ImageList_GetBkColor(long himl) Library "comctl32.dll"
//返回ImageList背景色
Function boolean ImageList_Destroy(long himl) Library "comctl32.dll"
//卸载ImageList
Function boolean ImageList_SetOverlayImage(long himl, long iImage, long iOverlay) Library "comctl32.dll"
//
Function boolean ImageList_Draw(long himl, long i, long hdcDst, long x, long y, ulong fStyle) Library "comctl32.dll"
//选ImageList中的一个图片绘制在指定DC上
Function boolean ImageList_DrawIndirect(IMAGELISTDRAWPARAMS p) Library "comctl32.dll"
//按IMAGELISTDRAWPARAMS结构指示绘图
Function boolean ImageList_Replace( long himl, long i, long hbmImage, long hbmMask) Library "comctl32.dll"
//替换ImageList中被选中的位图
Function boolean ImageList_DrawEx( long himl, long i, long hdcDst, long x, long y, long dx, long dy, ulong rgbBk, ulong rgbFg, ulong fStyle) Library "comctl32.dll"
//ImageList_Draw相似
Function boolean ImageList_Remove( long himl, long i) Library "comctl32.dll"
//移去一个图片
Function boolean ImageList_BeginDrag( long himlTrack, long iTrack, long dxHotspot, long dyHotspot) Library "comctl32.dll"
开始托动
Function boolean ImageList_EndDrag() Library "comctl32.dll"
结束托动
Function boolean ImageList_DragEnter( long hwndLock, long x, long y) Library "comctl32.dll"
将托动图象锁定到指定窗口,并显视在指定位置
Function boolean ImageList_DragLeave( long hwndLock) Library "comctl32.dll"
刚好跟ImageList_DragEnter相反
Function boolean ImageList_DragMove( long x, long y) Library "comctl32.dll"
移动托动图象
Function boolean ImageList_SetDragCursorImage( long himlDrag, long iDrag, long dxHotspot, long dyHotspot) Library "comctl32.dll"
指定新的托动图片
Function boolean ImageList_DragShowNolock( boolean fShow) Library "comctl32.dll"
//显视或隐藏被托动的图像
Function boolean ImageList_GetIconSize(long himl, Ref long cx, Ref Long cy) Library "comctl32.dll"
//得到ImageList尺寸
Function boolean ImageList_SetIconSize(long himl, long cx, long cy) Library "comctl32.dll"
//设置ImageList尺寸
Function boolean ImageList_GetImageInfo(long himl, long i, Ref IMAGEINFO pImageInfo) Library "comctl32.dll"
//得到ImageList中的指定图片的基本信息
Function long ImageList_Duplicate( long himl) Library "comctl32.dll"
//复制ImageList得到一个新的ImageList
// Stream Functions
Function long ImageList_Read( long pstm) Library "comctl32.dll"
//从数据流中读取一个ImageList
Function boolean ImageList_Write( long himl, long pstm) Library "comctl32.dll"
//将ImageList写到一个数据流中
//draw state for disable look non-XP
FUNCTION long DrawState(Long hdc, Long hBrush, Long lpDrawStateProc , Long lParam, Long wParam, Long X, Long Y, Long cX, Long cY, Long fuFlags) Library "user32.dll" Alias for "DrawStateA;Ansi"
//显示图像并应用可视化效果来表示一个状态。(事实上我也没有搞清这个函数。)

关于imagelist的更多内容,可以查MSDN
http://msdn.microsoft.com/en-us/library/ms927688.aspx
也可以查一下cimagelist的使用
http://msdn.microsoft.com/zh-cn/library/cc468275(v=VS.71).aspx
http://msdn.microsoft.com/zh-cn/library/3wbc1wt4.aspx

fuxiaoyang13 2011-06-07
  • 打赏
  • 举报
回复
顶顶,有没有源码啊!!
184270428 2011-06-04
  • 打赏
  • 举报
回复

这个是属于window下的comctl32库的内容,这里我也简单讲一下吧
Function long ImageList_Create(long cx, long cy, ulong flags, long cInitial, long cGrow) Library "comctl32.dll"
/*
创建ImageList(说到这个ImageList补充一下:这个ImageList实际上是一个Image<图片>集在逻辑上的一个容器,是装图片的。它的存在是让应用程序可以方便的使用和集中管理图片。)
(cx,cy) 是ImageList的距形的左上角的坐标,采用的是pixels为单位
flags这个标志是ImageList的类型标志,它的值如下:
#define ILC_MASK 0x00000001
//遮罩类型,如果用过flash的遮罩效果,这个就很好理解了。意思是:用一个单色的位图来求和另一个位图有点的公共布分。
//flash是怎么做的呢:两个图层,一个是遮罩,另一个是被遮罩。当被遮罩被遮罩层遮罩住了的时候,被遮罩被遮罩住的那部分图像就显视出来.
#define ILC_COLOR 0x00000000//使用默认的方式。
#define ILC_COLORDDB 0x000000FE//使用与设备相关的位图
#define ILC_COLOR4 0x00000004//使用4位(16色:4位二进制可以表式0~F,16个值)
#define ILC_COLOR8 0x00000008//使用8位(256色:8位二进制可以表式00~FF,256个值)
#define ILC_COLOR16 0x00000010//使用16位(65536色:16位二进制可以表式0000~FFFF,65536个值)
#define ILC_COLOR24 0x00000018//使用24位(16777216色:24位二进制可以表式000000~FFFFFF,16777216个值)
#define ILC_COLOR32 0x00000020//使用32位(4294967296色:24位二进制可以表式00000000~FFFFFFFF,4294967296个值)
#define ILC_MIRROR 0x00002000 // 镜像图
cInitial//最初图片个数
cGrow//新增图片个数
返回值为ImageList的句柄
*/
Function long ImageList_GetImageCount(long himl) Library "comctl32.dll"
//返回ImageList的图片数
Function long ImageList_Add(long himl, long hbmImage, long hbmMask) Library "comctl32.dll"
/*
向ImageList添加一个位图
himl为ImageList的句柄
hbmImage待加的位图句柄
hbmMask遮罩位图句柄,如果不是用的遮罩方式,这个参数被忽略。
成功时返回添加后的素引,失败时返回-1
*/
Function long ImageList_ReplaceIcon(long himl, long i, long hicon) Library "comctl32.dll"
//替换图标
Function long ImageList_AddMasked( long himl, long hbmImage, ulong crMask) Library "comctl32.dll"
//添加一个掩码图
//这个跟遮罩相同还是相反,我也记不清了。
//如果的相同,就是取公共
//如果相反就是去公共
Function long ImageList_GetIcon( long himl, long i, ulong flags) Library "comctl32.dll"
//用ImageList中的位图创建一个图标,返回图标句柄
Function long ImageList_LoadImage( long hInstance, String lpbmp, long cx, long cGrow, ulong crMask, ulong uType, ulong uFlags) Library "comctl32.dll" ALIAS FOR "ImageList_LoadImageA;Ansi"
//创建一个ImageList,图片来源为application或DLL
Function long ImageList_Merge(long himl1, long i1, long himl2, long i2, long dx, long dy) Library "comctl32.dll"
//在两个ImageList中选各选一个图片,合并.
184270428 2011-06-04
  • 打赏
  • 举报
回复

forward
global type n_imagelist from n_base
end type
end forward
global type n_imagelist from n_base
end type
global n_imagelist n_imagelist
type variables
Public:
String Name
Long Handle
String ImageName[]
String FullPath[]
Long ImageCount
Integer ImageWidth, ImageHeight
end variables
forward prototypes
public function integer of_getimageindex (readonly string as_imagename)
end prototypes
public function integer of_getimageindex (readonly string as_imagename);string ls
long n
ls = UPPER(as_imagename)
FOR n = 1 to ImageCount
IF ls = ImageName[n] THEN RETURN n
NEXT
RETURN CRet.FAILURE
end function

C++伪码表示:

class n_imagelist:public n_base
{
public:
string Name;//给imagelist一个命名。(这个对象主要是给n_svc_resource使用,而各图象的路径是存在一个数据窗口对象里面的,所以这里实际上就是一个数据窗口对象名)
long Handle;//imagelist的句柄
String ImageName[];//图象名字表(这个图象,可以在输入数据窗口的对应字段里找到.可以查看:imgcommon16,imgcommon24,imgfamfam等)
String FullPath[];//图象路径表(用的是全路径)
Long ImageCount;//图象数目
Integer ImageWidth;//图象宽
Integer ImageHeight;//图象高
integer of_getimageindex (readonly string as_imagename);//查找图象名
}

integer n_imagelist::of_getimageindex (readonly string as_imagename)//这个函数没有什么好说的,相信大家都可以看懂
{
string ls;
long n;
ls = UPPER(as_imagename);
FOR(n = 1;n <= ImageCount;n ++)
IF(ls = ImageName[n])
RETURN n;
RETURN CRet.FAILURE;
}

184270428 2011-06-01
  • 打赏
  • 举报
回复
占位(是CSDN有问题,还是我电脑有问题,明明登录了,且跳转到正确的页面了,回复还提示我没有登录。)
fsmooth 2011-05-31
  • 打赏
  • 举报
回复
我来顶。谢谢楼主分享!
wag_enu 2011-05-31
  • 打赏
  • 举报
回复
band()

把代码格式一下就更易看了。
j9dai 2011-05-30
  • 打赏
  • 举报
回复
顶下热心人,破3回复
184270428 2011-05-30
  • 打赏
  • 举报
回复
global type n_svc_powerbuilder from n_svc_base
end type
forward prototypes
public function boolean of_isdescendant (readonly string ancestor, readonly string cls)
//确定cls是否为ancestor的子孙
public subroutine of_pixelstounits (ref long al_x, ref long al_y)
//像素点转成单位点
public subroutine of_unitstopixels (ref long al_x, ref long al_y)
//单位点转成像素点
public function boolean of_isvalidclass (readonly string as_classname)
//是否为本系统存在的类
public function boolean of_isdescendant (string as_ancestor, readonly classdefinition acd)
// 定义对象acd是否是as_ancestor子孙的定义
public function boolean of_isfcobject (readonly powerobject apo)
//是否为kodigo自定义的基类
public function long of_getwindowobjects (powerobject apo, ref windowobject awo[])
//将容器对象的windowobject存在数组里,返回对象个数
public function boolean of_hasevent (readonly powerobject apo, readonly string as_eventname, readonly string as_args[])
// as_eventname是否为apo的事件
public function boolean of_hasevent (readonly powerobject apo, readonly string as_eventname)
public function boolean of_hasfunction (readonly powerobject apo, readonly string as_functionname, readonly string as_args[])
// as_functionname是否为apo的方法
public function boolean of_hasfunction (readonly powerobject apo, readonly string as_functionname)
end prototypes
lao_bulls 2011-05-27
  • 打赏
  • 举报
回复
好文章
184270428 2011-05-27
  • 打赏
  • 举报
回复
第三讲,主要讲一些基本服务的功能,要了解实现可以自己读一读代码

1,n_svc_string
forward
global type n_svc_string from n_svc_base
end type
end forward

forward prototypes
public function long of_parsetoarray (string as_source, string as_delimiter, ref string as_array[])
//将特定格式的字符串(形如: 值串 分隔串 值串 分隔串 值串 分隔串. . .)
//分解到一个数组中
//返回值为这个数组元素个数.(注:格式化字符串或分隔串,任一值为空,返回空数组)
public function string of_padleft (string as_source, long al_length)
//返回定长掩码填充后的值(掩码填在左边)
//什么意思呢 如比用 ‘s’ 作为掩码,额定长度为 10, 原来的值 为 ab
//那么填充后的结果为:ssssssssab
public function string of_padright (string as_source, long al_length)
//返回定长掩码填充后的值(掩码填在右边)
public function string of_padleft (readonly character ac_padchar, string as_source, long al_length)
public function string of_padright (readonly character ac_padchar, readonly string as_source, readonly long al_length)

public function boolean of_islower (string as_source)
//是否全为小写串
public function boolean of_isupper (string as_source)
//是否全为大写串
public function boolean of_iswhitespace (string as_source)
//是否由不可见字符组成的串(这些不可见字符包括:退格符,TAB符,换行符,坚直TAB符,换页符,回车符,空格符)
public function boolean of_isalpha (string as_source)
//是否是由小写或小写字母组成
public function boolean of_isalphanum (string as_source)
//是否是由小写或小写字母或数字组成
public function string of_quote (string as_source)
//返回as_source首尾追加了双引号的串(参数为NULL返回也是NULL)
public function boolean of_isspace (string as_source)
//是否是由空格组成的串
public function boolean of_ispunctuation (string as_source)
//是否是全由特定标点符号组成的串
//包括: ! “ ‘ , . : ; ?
public function long of_lastpos (string as_source, string as_target, long al_start)
//同PB的lastpos(低版本没有这个函数的时候,可以用这个)
184270428 2011-05-27
  • 打赏
  • 举报
回复
有了n_svc_mgr就不用message传数据了
xiaoping04408 2011-05-27
  • 打赏
  • 举报
回复
这个kodigo框架 ,在openuserobectwithparm()传入message变量时,message丢失、困惑中...
fsmooth 2011-05-27
  • 打赏
  • 举报
回复
支持一下!希望有更多人分享对其他人有用的心得、资源。
酒尽雪满天 2011-05-26
  • 打赏
  • 举报
回复
看不懂。。。
fuxiaoyang13 2011-05-26
  • 打赏
  • 举报
回复
顶顶,学习学习!
路人甲cw 2011-05-26
  • 打赏
  • 举报
回复
这个必须支持!!!
184270428 2011-05-26
  • 打赏
  • 举报
回复
列一个聊天记录,希望对大家有帮助:
孙益华 11:20:32
按我的思路一个个看下去
回复
影の葉秋夢 11:20:46
那有那么多时间
回复
影の葉秋夢 11:20:49
天天加班赶工.
回复
孙益华 11:21:50
在拨开云前,要忍一忍,才可以看到揭开面沙的那个美女
回复
孙益华 11:21:59
哪要多少时间呢?
回复
影の葉秋夢 11:22:10
50%的工作都是在浪费时间
回复
影の葉秋夢 11:22:16
天天加班周周加班
回复
孙益华 11:22:20
看程序也是这样的,一层层的拔开
回复
影の葉秋夢 11:22:35
用到会用.
回复
影の葉秋夢 11:22:41
看也能看懂.
回复
孙益华 11:22:44
我写的这个两个东西,你不能看懂吗?
回复
影の葉秋夢 11:22:56
就是没地方可用 这个项目经理不是我
回复
影の葉秋夢 11:22:58
能看懂啊.
回复
孙益华 11:22:59
我会抽时间写下去
回复
影の葉秋夢 11:23:09

回复
孙益华 11:23:17
怎么会没有地方用呢?
回复
影の葉秋夢 11:23:27
领导 不让嘛.
回复
影の葉秋夢 11:23:33
不管说什么领导都不用
回复
影の葉秋夢 11:23:38
不管方便不方便.
回复
影の葉秋夢 11:23:41
不管有没有用.
回复
孙益华 11:23:40
看懂了 n_svc_mgr,你就可以取这个取出来用
回复
孙益华 11:23:49
又不要你搞整里。
回复
孙益华 11:24:00
里面的东西,用个把,还是可以的吧
回复
影の葉秋夢 11:24:07
恩.
回复
影の葉秋夢 11:24:09
领导 不让用.
回复
孙益华 11:24:18
看懂一个,抽一个用。
回复
影の葉秋夢 11:24:32
领导 根本就不用.
回复
孙益华 11:25:32
当然,n_svc_resize这种全局使用的类,抽出来,不改根基,休现不出效果,就取里面的思想
回复
影の葉秋夢 11:26:01
现在就是学里面的思想.
回复
影の葉秋夢 11:26:06
很多先进的,好用的思想的
回复
影の葉秋夢 11:26:48
不过这种思想和JAVA现在的做法很接近.
回复
孙益华 11:26:43
我解释n_svc_resize

不是有几个自己给它命的名词
回复
影の葉秋夢 11:27:13
n_svc_mgr这东西是所有服务的入口吧.
回复
孙益华 11:27:09
如:

活动区,工作区,可变区
回复
孙益华 11:27:37
n_svc_mgr我给它命名,是服务管理器
回复
孙益华 11:27:47
用入口形容不准
回复
孙益华 11:28:10
应该说所有服务,是靠这个东西载入的
回复
影の葉秋夢 11:28:58
然后对每一个对象都建了一个服务来管理控制.
回复
孙益华 11:29:43
如:

活动区,工作区,可变区,停靠(这个是源于.net,不过.net的是全局停靠,这个实现的是按活动区来实现的停靠,这个活动区是算出来的)

回复
孙益华 11:29:54
然后对每一个对象都建了一个服务来管理控制.

不是的
回复
影の葉秋夢 11:30:06
我感觉是啊.
回复
影の葉秋夢 11:30:07
什么DW
回复
影の葉秋夢 11:30:09
ST
回复
影の葉秋夢 11:30:15
CB都建了对应的SVC
回复
孙益华 11:30:25
应该说,每次要用服务的时候,用服务管理器载入
回复
孙益华 11:31:16
这样的好处是,有可能服务管理器里,以有这个服务了。就不要真的建新的,直接得到引用,且把引用计数加一,就可以用了。
回复
孙益华 11:31:49
也就是说,多个地方要用服务的时候,只有第一次用的时候才要建立
回复
孙益华 11:32:14
只要用过一次,服务就常主在内存了
回复
影の葉秋夢 11:32:30
我感觉他的类,方法定义的实在太多了.绕的很晕
回复
影の葉秋夢 11:32:34
难道说每一个都有作用吗?
回复
孙益华 11:32:29
提搞了内存代码复用率
回复
孙益华 11:32:52
不需要不断的卸载创建
回复
影の葉秋夢 11:33:53
那些创建按钮之类的.也是这样子吗?
回复
孙益华 11:33:54
抓主线
回复
影の葉秋夢 11:34:06
比如我要用到这个按钮.用完后销毁?
回复
影の葉秋夢 11:34:12
还是说用完后,准备下次征用?
回复
影の葉秋夢 11:34:15
重用*
回复
孙益华 11:35:42
类化的作用是提高重用率,和提搞方便偶合,或提高功能化的分清晰度==
回复
孙益华 11:36:41
影の葉秋夢 11:34:06
比如我要用到这个按钮.用完后销毁?
影の葉秋夢 11:34:12
还是说用完后,准备下次征用?

只有由服务管理器载入的对象,且设定了可重用的属性的服务,才走这个规则
回复
影の葉秋夢 11:38:41
有些明白了
回复
影の葉秋夢 11:38:49
就是说我要考虑重要的时候就可以使用这种模式.
回复
影の葉秋夢 11:39:07
这样可以节省很多创建销毁的时间开销?
回复
孙益华 11:39:46
在PB中,合理的分类。

认总个应用分区合理,只有一个不好面:就是一个应用的代码,移至另一个代码应用里的时候,由于蜘蛛网太多,和PB没有库命名空间==导至的称至困难

而在当前应用平台上扩展,是很方便的
回复
孙益华 11:41:04
影の葉秋夢 11:38:41
有些明白了
影の葉秋夢 11:38:49
就是说我要考虑重要的时候就可以使用这种模式.
影の葉秋夢 11:39:07
这样可以节省很多创建销毁的时间开销?


还可以清除全局变量的使用
回复
孙益华 11:41:39
forward
global type n_user from n_svc_base
end type
end forward

shared variables

end variables

global type n_user from n_svc_base
end type
global n_user n_user

type variables
string user
string name
string pass
string picture_path

end variables


回复
影の葉秋夢 11:42:00
我觉得需要学的东西好多
回复
孙益华 11:42:06
比如上面,我建的一个数据对象,每次载入的时候,数据还在
回复
孙益华 11:42:37
那么,其它地方载入修改好的数据,在另外的地方也可以用的
回复
影の葉秋夢 11:43:22
先吃饭去啦
回复
影の葉秋夢 11:43:23
8888
回复
孙益华 11:43:24
我们可以用建一个这个服务管理器技持的一个强大的数据地图
回复
孙益华 11:43:27
好的
回复
孙益华 11:43:29
去吧
184270428 2011-05-26
  • 打赏
  • 举报
回复
网上一大把
加载更多回复(4)

396

社区成员

发帖
与我相关
我的任务
社区描述
PowerBuilder 非技术版
社区管理员
  • 非技术版社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧