首页 > 其他分享 >关于powerbuilder的全局函数重载问题

关于powerbuilder的全局函数重载问题

时间:2023-08-03 21:03:40浏览次数:59  
标签:subroutine log powerbuilder ll global insertrow 重载 dw 全局


今天在调试反编译器,发掘几个网上下载的源码,是pb7写的程序,总是报错。最后ue打开仔细观察,发掘在一个func内赫然放着2个函数体。在最开始开发反编译器时,是从最简单的struct和func开始开发的,所以当初为struct和func单独写了函数,而且认定func内只有一个函数体。这就奇怪了。莫非是以前我想过的全局函数重载。。其实全局函数不能重载有时真的很烦人的。必须得写几个功能近似的。关键是函数名得另外取,不便于理解。其实我们知道,编译后是不需要函数名,只是一个查找和呼叫代号。

 

 

在网上搜一下,果然有篇2009的帖子给出了提示,也就是在source edit下可以手工增补而实现重载。编译器编译时会像c,c++编译器一样将函数按照不同的param列表来命名。并在联合编译器,在其他对象内引用时,给出具体的函数名。这其实是利用源码编辑直接绕过IDE的检测。我前段尝试在对象的create事件中手写代码来完成一些功能,貌似也是可以的。但是如果你一用画板,并修改了部分地方后保存的话,create中的代码就会被重新刷新。也就是它们都是由IDE直接控制的,如同其他编程语言的工程文件一样。

 

但是也发现一个问题,下面的帖子里是写成

global subroutine f_log (readonly string as_msg)
global subroutine f_log (throwable at, readonly integer ai_nu)
global subroutine f_log (readonly integer ai_nu)

但是从网上那个pbl中我看到重载的函数函数名不一样,有一个函数它内部的两个函数的参数表是不一致的,但是另外还有参数表相同的情况,搞不清楚到底是怎么回事。

 

因为我下载的是pb源码我打开pbl看到如下源码:

//Here is Source in PBL or PBD,see it directly
//Comments: 
global type f_addrecord from function_object
end typeforward prototypes
global subroutine uo_addrecord (datawindow dw, long row, string data)
global subroutine f_addrecord (datawindow dw, long row, string data, datawindow dw_grid)
end prototypesglobal subroutine uo_addrecord (datawindow dw, long row, string data);     long ll_insertrow
     string ls_id
     datetime ldtm_server_time
     
     ls_id=dw.getitemstring(row,'id')
     ///
      ll_insertrow=dw.insertrow(0)
                    dw.setitem(ll_insertrow,'id',data)
                    dw.setitem(ll_insertrow,'state','0')//将状态设置为‘正常’
                    ldtm_server_time=f_get_server_time()
                    dw.setitem(ll_insertrow,'create_date',ldtm_server_time)
                    dw.setitem(ll_insertrow,'update_date',ldtm_server_time)
                 dw.setitem(ll_insertrow,'create_by',gs_username)
                 dw.setitem(ll_insertrow,'update_by',gs_username)
                 //建档日期,修改日期均为服务器的当前日期
                 //建档人和修改人均为登录系统的用户名
       dw.setitem(row,'id',ls_id)
       dw.scrolltorow(ll_insertrow)
       dw.setcolumn(2)
end subroutineglobal subroutine f_addrecord (datawindow dw, long row, string data, datawindow dw_grid);     long ll_insertrow
     string ls_id
     datetime ldtm_server_time
     
     //ls_id=dw.getitemstring(row,'id')
     ///
      ll_insertrow=dw.insertrow(0)
               dw.setitem(ll_insertrow,'id',data)
     dw.setitem(ll_insertrow,'state','0')//将状态设置为‘正常’
     ldtm_server_time=f_get_server_time()
     dw.setitem(ll_insertrow,'create_date',ldtm_server_time)
     dw.setitem(ll_insertrow,'update_date',ldtm_server_time)
     dw.setitem(ll_insertrow,'create_by',gs_username)
     dw.setitem(ll_insertrow,'update_by',gs_username)
     dw.setitemstatus(ll_insertrow,0,primary!,notmodified!)
                 //建档日期,修改日期均为服务器的当前日期
                 //建档人和修改人均为登录系统的用户名
       //dw.setitem(row,'id',ls_id)
//      dw.scrolltorow(ll_insertrow) 
       dw_grid.scrolltorow(ll_insertrow)
//     dw_grid.setfocus()
//       dw_grid.setcolumn(2)
end subroutine

原来的确是在源码中就是写的两个不同的函数名。

 

实际上func虽然独立为一个对象,但是也可以理解为存放函数体的一个容器。正常情况,一个func对象内只有一个函数体,但是他跟uo,win一样都具备存放多个函数体的条件。只是IDE限制我们而已。

 

 

如果重载可以用,不过这种方法也太危险。因为画板会破坏手写的部分。还是建议用nvuo,符合类的概念。扩展也比较方便。

 

 

帖子

全局函数重载原文:http://www.rgagnon.com/pbdetails/pb-0257.html

 

Overload a global function

thanks to Lawrence Sims for the following tip

You can overload global function objects in PowerBuilder with a simple trick. Just always edit them in source view, not in the painter. The following function (f_log) can be called like so:


f_log("Message To Be Logged") f_log(t_throwable_caught, populateError (0, "")) f_log(populateError(0, "Got to here ..."))


[f_log.srf]
just imported this file into a PBL to be able to use the overloaded f_log function)


global type f_log from function_object
end type
 
type prototypes
subroutine OutputDebugString (string as_msg) library "kernel32.dll" &
   alias for "OutputDebugStringA"
end prototypes
 
forward prototypes
global subroutine f_log (readonly string as_msg)
global subroutine f_log (throwable at, readonly integer ai_nu)
global subroutine f_log (readonly integer ai_nu)
end prototypes
 
global subroutine f_log (readonly string as_msg);
OutputDebugString (as_msg)
end subroutine

global subroutine f_log (throwable at, readonly integer ai_nu);
string ls_message
 
ls_message = error.text
if isNull (error.text) or error.text = "" &
   then ls_message = at.getMessage ()
 
OutputDebugString (error.object + "." + error.objectevent + &
                   ": line " + string (error.line) + ": " + ls_message)
end subroutine
 
global subroutine f_log (readonly integer ai_nu);
if isValid (error) then
 OutputDebugString (error.object + "." + error.objectevent + &
                    ": line " + string (error.line) + ": " + error.text)
end if
end subroutine

标签:subroutine,log,powerbuilder,ll,global,insertrow,重载,dw,全局
From: https://blog.51cto.com/u_16000165/6953170

相关文章

  • uniapp 之h5修改全局滚动条(浏览器下滑有小矩形滚动条)
    在index.html文件里<!DOCTYPEhtml><htmllang="zh-CN"><head><metacharset="UTF-8"/><metaname="viewport"content="width=device-width,user-scalable=no,initial-......
  • 12-面向对象-方法重载(OverLoad)
    基本介绍重载(Overload):指一个类中可以有多个方法具有相同的名字,但这些方法的参数不同(参数的类型和个数不同)即在Java中允许同一个类中,多个同名方法的存在,但要求形参列表不一致!publicclassOverLoad01{publicstaticvoidmain(String[]args){MyCalculatormc......
  • C++逆向分析——运算符重载
    运算符重载现在有一个类,其中有一个函数用于比较2个类的成员大小:#include<stdio.h>classNumber{private:intx;inty;public:Number(intx,inty){this->x=x;this->y=y;}intMax(Number&n){returnthis->x>n.x&&this->y......
  • HTML | HTML全局属性
    全局属性是所有HTML元素共有的属性;它们可以用于所有元素,即使属性可能对某些元素不起作用。我们可以在所有的HTML元素,甚至是在标准里没有指定的元素上指定全局属性。这意味着任何非标准元素仍必须能够允许应用这些属性,即使使用这些元素意味着文档不再是HTML5兼容的。例如,虽......
  • 运算符重载
    运算符重载:对已有的运算符重新进行定义,赋予其另一种功能,以适应不同的数据类型1.加号运算符重载 2.左移运算符重载一般输出时 cout<<p.m_A<<""<<p.m_B<<endl; 但是现在想用<<直接输出p,(直接输出类类型的p, cout<<p<<endl; )该怎么办呢?利用成员函数重载 左移运算符  ......
  • 手机设置全局ip步骤
    在互联网时代,隐私和安全问题备受关注。使用全局ip能够帮助我们保护个人信息,突破地理限制,并提高网络速度。但是,你是否对全局ip的安全性存有疑虑?而且,如何在手机上设置全局ip呢?今天就让我们揭开这些疑问的答案,让你轻松设置手机全局ip,享受安全的网络环境吧!全局代理的安全性是怎样的?全......
  • C#的重载决策
    重载是许多编程语言支持的特性。所谓重载,就是指可以定义多个名称相同但参数(个数、类型和顺序)不同的方法(函数)。先来看一个例子:voidMain(){charcvalue='a';malem=newmale();m.write(cvalue);}classhuman{publicvoidwrite(charvalue){......
  • 【12.0】DRF之全局异常处理
    【一】引入在前端开发中,为了便于处理后端报错,通常需要后端返回统一的格式。通过统一的格式,前端可以更方便地处理后端返回的错误信息比如根据错误码展示不同的提示信息给用户。{code:999,msg:'系统异常,请联系系统管理员'}//其中code表示错误码,msg表示错误信息。只要......
  • Mybatis学习(1)——mybatis介绍 & 入门案例 & 全局配置文件详解 & 增删改查 + mybatis事
    Mybatis学习(1)——mybatis介绍&入门案例&全局配置文件详解&增删改查+mybatis事务&mapper.xml文件#{}和${}&动态SQL入门原文链接:https://blog.csdn.net/Pireley/article/details/131520252目录引出一、mybatis是啥1.官网&ORM(ObjectRelationMapping)对象关......
  • C++ | 运算符重载
    运算符重载在类中的函数进行重载(成员函数)运算符重载用于重新定义运算符的作用,使用函数名称operatorOP作为函数名,其中OP为具体的运算符(如operator+)classTime{Timeoperator+(constTime&t);};Timea,b;Timec=a+b;在成员函数中重载的运算符,如+-等,默认左边......