精华内容
下载资源
问答
  • JS函数详解

    万次阅读 多人点赞 2019-07-10 22:56:56
    目录 1.函数概念,声明及调用 2.函数表达式(匿名函数) 3.函数传参 4.修改input的值 5.函数的不定参(可变...8.JS预解析机制(变量提升Hoisting) 9.作用域 10.window 11.全局污染(命名冲突问题) 12.作...

    目录

    1.函数概念,声明及调用

    2.函数表达式(匿名函数)

    3.函数传参

    4.修改input的值

    5.函数的不定参(可变参)—关键字arguments

    6.函数返回值

    7.封装获取元素的方法

    8.获取计算后样式—getComputedStyle(el)

    8.JS预解析机制(变量提升Hoisting)

    9.作用域

    10.window

    11.全局污染(命名冲突问题)

    12.作用域链(scope chain)

    13.闭包

    14.this当前执行代码的环境对象

    15.严格模式下的this指向

    16.this指向的修改

    16.1 function.call()

    16.2 function.apply()

    16.3 function.bind()

    16.4 bind方法原理分析:


    函数的基本概念、声明及调用;函数作用域、作用域链、闭包;this指向及修改和绑定this指向等。

    1.函数概念,声明及调用

    JS中的函数:把一段需要重复使用的代码,用function语法包起来,方便重复调用,分块和简化代码。复杂一点的,也会加入封装、抽象、分类等思想。

    声明方式:严格意义上两种方式,但还有匿名函数

    • 方式一:
    function 方法名(){
         //要执行的代码
    }
    • 方式二:ES6中声明方式箭头函数,()=>{} 
    • 方式三:匿名函数,将函数存到变量里 var func = function(){};

    函数调用:两种方式调用

    • 调用方式一:名字(); 函数可以多次调用
    //函数声明
    function fn(){
        console.log(1);
    }
    
    //函数的调用
    fn();

    调用方式二:在事件中调用,直接写函数名,不使用括号

    //函数声明
    function fn(){
        console.log(1);
    }
    
    //函数在事件中的调用
    document.onclick = fn;

    2.函数表达式(匿名函数)

    函数表达式:就是把函数存到变量里。

    匿名函数:没有名字的函数;

    匿名函数在使用时只有两种情况:

    • 匿名函数自执行:声明后不需要调用就直接执行
    (function(){
        console.log("匿名函数自执行");
    })();
    • 函数表达式:把函数存到变量,或将函数存到数组的对应位置里等,调用时通过变量或数组对应位置进行调用。调用时需要写括号。
    //2,函数表达式:把函数存到变量或数组等里,调用时通过变量进行调用
    var fn = function(){
        console.log("函数表达式:将函数存到变量里");
    };
    fn();//调用时需要写括号
    
    //2,函数表达式:把函数存到数组第0位,调用时通过数组第0位进行调用
    var arr = [];
    arr[0] = function(){
         console.log("函数表达式:将函数存到数组的对应位置");
    };
    arr[0]();//调用时需要写括号要写括号

    结果:

    事件函数扩展:给元素添加事件的说法是不正确的。事件时元素本身就具有的特征,只是触发事件后,默认没有相关的一些处理。这种操作其实就是给元素的某个事件添加一个事件处理函数。当事件被触发后,判断到属于该事件类型,就触发该事件函数的处理函数。

    可以通过console.dir()把对象的所有属性和方法打印出来,查看对象或元素本身具有的事件。

    <script>
           //事件时元素本身就具有的特征,只不过,触发事件后,默认没有相关的一些处理。事件函数其实就是给元素的某个时间添加一个事件处理函数。
           //可以通过console.dir()把对象的所有属性和方法打印出来
           document.onclick = function(){
               console.log("事件的处理函数");
           };
           //当被触发后,判断到属于该事件类型,就触发该事件函数的处理函数
           if(typeof document.onclick == "function"){
             document.onclick();
           }
    </script> 

     结果:

    3.函数传参

    获取元素,最好从父级元素获取,全部从document中获取,可能会出现混乱。

    • 形参:形式上的参数——给函数声明一个参数;
    • 实参:实际的参数——在函数调用时给形参赋的值
    function func(形参1,形参2){
        //函数执行代码
    }
    
    func(实参1,实参2);//调用时传参

    什么时候使用到传参?当有两段代码本身的功能极其相似,只有个别地方不一样时,就可以把两段代码合并成一个函数,然后把两段代码中不一致的内容通过传参传进去。

    案例:自定义(多个模块)选项卡封装

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <meta http-equiv="X-UA-Compatible" content="ie=edge">
        <script src="../index.js"></script>
        <title>选项卡封装</title>
        <style>
            body { margin: 0; padding: 0; }
            .tab .active { background: red; }
            .cont div { display: none; }
            .cont .show { background: #000; font-size: 60px; color: white; width: 220px; height: 220px; display: block;  }
        </style>
    </head>
    <body>
    <div id="wrap1" class="wrap">
        <div class="tab">
            <button class="active">选项卡一</button>
            <button>选项卡二</button>
            <button>选项卡三</button>
        </div>
        <div class="cont">
            <div class="show">内容一</div>
            <div>内容二</div>
            <div>内容三</div>
        </div>
    </div>
    
    <div id="wrap2" class="wrap">
            <div class="tab">
                <button class="active">选项卡一</button>
                <button>选项卡二</button>
                <button>选项卡三</button>
            </div>
            <div class="cont">
                <div class="show">内容一</div>
                <div>内容二</div>
                <div>内容三</div>
            </div>
    </div>
    <div id="wrap3" class="wrap">
            <div class="tab">
                <button class="active">选项卡一</button>
                <button>选项卡二</button>
                <button>选项卡三</button>
            </div>
            <div class="cont">
                <div class="show">内容一</div>
                <div>内容二</div>
                <div>内容三</div>
            </div>
    </div>
    <script>
    
        //通过id获取元素
        /*
        var wrap1 = _id("wrap1");
        var wrap2 = _id("wrap2");
        var wrap3 = _id("wrap3");
        
        tab(wrap1);
        tab(wrap2);
        tab(wrap3);
        */
       //通过数组方式获取一组
        var wraps = _selectorAll(document,".wrap");//注意这里的parent父级已经是body了, 所以最好使用document
        for (var i = 0; i < wraps.length; i++) {
            tab(wraps[i]);
        }
        function tab(wrap){
            var btn = _selectorAll(wrap,".tab button");
            var divs = _selectorAll(wrap,".cont div");
    
            var num = 0;//记录当前样式
            for (var i = 0; i < btn.length; i++) {
                btn[i].index = i;
                btn[i].onclick = function(){
                    //清除当前样式
                    btn[num].classList.remove("active");
                    divs[num].classList.remove("show");
    
                    this.classList.add("active");
                    divs[this.index].classList.add("show");
    
                    num = this.index;
                };
            }
        }
    </script>
    </body>
    </html>

    index.js:

    function _id(idName){
        return document.getElementById(idName);
    }
    function _selector(parent,selector){
        return parent.querySelector(selector);
    }
    function _selectorAll(parent,selectors){
        return parent.querySelectorAll(selectors);
    }

     结果:

    4.修改input的值

    value和innerHTML都可以用来获取和修改元素的值(或内容);value只能获取特定的textarea和input的值,但是innerHTML可以获取所有HMTL元素的值。

    不同之处如下:
    1)value可以用来修改(获取)textarea和input的value属性的值或元素的内容;
    2)innerHTML用来修改(获取)HTML元素(如div)html格式的内容。

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <meta http-equiv="X-UA-Compatible" content="ie=edge">
        <script src="../index.js"></script>
        <title>修改input的值</title>
        <style>
            .wrap input, .wrap button { display: none; }
            li { height: 30px; line-height: 30px; }
        </style>
    </head>
    <body>
        <div class="wrap">
            <ul>
                <li>
                    <span id="first">这是第一个列表</span>
                    <a href="javascript:;">修改</a>
                    <input type="text">
                    <button>确定</button>
                </li>
                <li>
                    <span>这是第二个列表</span>
                    <a href="javascript:;">修改</a>
                    <input type="text">
                    <button>确定</button>
                </li>
                <li>
                    <span>这是第三个列表</span>
                    <a href="javascript:;">修改</a>
                    <input type="text">
                    <button>确定</button>
                </li>
                <li>
                    <span value="asf">这是第四个列表</span>
                    <a href="javascript:;">修改</a>
                    <input type="text">
                    <button>确定</button>
                </li> 
            </ul>
        </div>
        <script>
            var lis = _selectorAll(document,"li");
            for (var i = 0; i < lis.length; i++) {
                modify(lis[i]);
            }
            function modify(li){
                var modify = _selector(li,"a");
                var span = _selector(li,"span");
    
                var input = _selector(li,"input");
                var btn = _selector(li,"button");
                //1.点击修改,“这是第一个列表”span标签隐藏,“修改”标签隐藏;input和确定按钮显示
                modify.onclick = function(){
                    span.style.display = "none";
                    this.style.display = "none";
                    input.style.display = "inline-block";
                    btn.style.display = "inline-block";
    
                    //注意:span标签只能通过.innerHTML获取元素的值,而不能通过.value
                    //2.将span标签的文字内容赋值给input输入框
                    input.value = span.innerHTML;
                };
                //3.点击确定按钮,先验证是否为空;再还原会span标签和修改a标签
                btn.onclick = function(){
                    var txt = input.value;
                    if(txt === ""){
                        alert("请输入内容");
                    }else{
                        input.style.display = "none";
                        this.style.display = "none";
                        span.style.display = "inline-block";
                        modify.style.display = "inline-block";
    
                        //4.将修改后的值赋给span标签
                        span.innerHTML = txt;
                    }
                };
            }
        </script>
    </body>
    </html>

    结果:

     

    5.函数的不定参(可变参)—关键字arguments

    案例:购物车商品累计。事先不知道用户买多少商品

    不定参(可变参)使用关键字:arguments,代表所有实参的集合。通过下标获取参数的每一位;通过length获取实参的个数;

    集合是类数组,可以使用下标,但是没有数组中的各种方法。

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <meta http-equiv="X-UA-Compatible" content="ie=edge">
        <title>可变参(不定参):arguments</title>
    </head>
    <body>
        <script>
            //arguments 代表所有实参的集合(类数组),可以通过下标获取各个实参,通过length获取集合长度
            function args(){
                console.log(arguments);
                console.log("arguments的各个参数为:");
                for (var i = 0; i < arguments.length; i++) {
                    console.log(arguments[i]);
                }
            } 
            
            args(23,45,999,10.90,"can","不定参");
        </script>
    </body>
    </html>

    结果:

     

    6.函数返回值

    函数返回值即函数执行之后的返回结果。

    1. 所有函数都会有函数返回值即函数执行后一定会返回一个结果,如果没有定义默认返回undefined;
    2. 在函数中,return后定义返回值;
    3. 在函数中,return之后的代码就不会再执行了
    4. return只能用于函数中,用在其他地方会报错
    <script>
            function func1(){
               console.log("函数func1执行内容");
            } 
            function func2(){
               console.log("函数func2执行内容");
               return 1;
               var a = 2;
               console.log(a);
            } 
            //如果没有定义默认返回undefined
            console.log("func1返回结果:"+func1());//undefined
            console.log("func2返回结果"+func2());//1
    </script>

    结果:发现return后的代码没有继续执行

    7.封装获取元素的方法

    封装通过id/CSS选择器获取(一般在父级下获取,所以传入父级和选择器名字)获取多个元素的方法,然后返回获取到的值

    //通过id名获取元素
    function _id(idName){
        return document.getElementById(idName);
    }
    
    //通过CSS选择器获取一个元素
    function _selector(parent,selector){
        return parent.querySelector(selector);
    }
    
    //通过CSS选择器获取一组元素
    function _selectorAll(parent,selectors){
        return parent.querySelectorAll(selectors);
    }

    使用:

    var wrap1 = _id("wrap1");
    var wrap2 = _id("wrap2");
    var wrap3 = _id("wrap3");
    
    var wraps = _selectorAll(document,".wrap");
    
    var btn = _selectorAll(wraps,".tab button");
    var divs = _selectorAll(wraps,".cont div");

    8.获取计算后样式—getComputedStyle(el)

    点击时获取box的宽度,在原有基础上+100

    • 从style中获取的是行间样式,但是通常样式不会写在行间;
    • 获取计算后样式:getComputedStyle(el)获取元素的计算后样式。属于window的方法,即window.getComputedStyle(el)。在JS中使用window下的方法时,window可以不写;
    • getComputedStyle(el)方法不兼容IE6,7,8
    • 计算后样式:优先级最高的样式,即当前显示出来的样式
    • 使用getComputedStyle(el)是获取window下所有的样式,getComputedStyle(el)['样式名']即可获取到特定样式
    • 写样式名时,使用驼峰样式的名字(否则IE下会有兼容问题),如margin-left必须写成marginLeft。
    • IE下获取元素的计算后样式,需要使用el.currentStyle['样式名']
    • 兼容IE和其他浏览器:判断el.currentStyle返回true即表示IE,否则就是其他浏览器,然后在对应浏览器下使用对应方法
    • 获取计算后样式会经常使用,因此可以封装成方法,进行复用
    • getComputedStyle(el)和el.currentStyle获取不到伪元素的样式,因为伪元素不是DOM的内容
    • 伪类样式计算后样式可以获取到,伪元素获取不到

    标准浏览器下:transition:.5s;设置过渡效果的时间,否则div会直接变到从100+100的宽度

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <meta http-equiv="X-UA-Compatible" content="ie=edge">
        <script src="../index.js"></script>
        <title>getComputedStyle(el)</title>
        <style>
            #box { width: 100px; height: 100px; background: red; transition:.5s; }
        </style>
    </head>
    <body>
        <div id="box"></div>
        <script>
            //需求:点击div,div的width在原有基础上+100px
            var box = _id("box");
            var ss = 0;
            box.onclick = function(){
                //直接获取box.style.width是获取不到的,因为样式时写到style标签,而非行间样式
                //console.log(box.style.width);//获取不到值
    
                //使用getComputedStyle(el)['样式名']即可获取到当前显示出来的样式
                var curStyle = getComputedStyle(box)['width'];
                //获取到的结果是“100px”,需要将其进行转为数字。width最后有可能会有小数点,所以最好使用parseFloat()。大多数情况下parseInt()亦可
                //但是parseInt(curStyle);才能去掉px进行相加
                //注意px前面的数字千万不要加引号
                this.style.width = parseInt(curStyle) + 100 + 'px';
            };
        </script>
    </body>
    </html>

    结果:

    不断点击后:

    兼容问题:发现在IE6,7,8下并不支持getComputedStyle(el)方法

    解决:通过el.currentStyle判断返回true代表在IE浏览器下,为false就不是在IE浏览器下。在IE浏览器下必须使用el.currentStyle才行

    //解决浏览器兼容问题:通过el.currentStyle判断返回true代表在IE浏览器下,为false就不是在IE浏览器下。在IE浏览器下必须使用el.currentStyle才行
    function currStyle(el,styleName){
        // var curStyle = '';
        // if(el.currentStyle){
        //     curStyle = el.currentStyle[styleName];
        // }else{
        //     curStyle = getComputedStyle(el)[styleName];
        // }
        // return curStyle;
        //使用三元获取返回值
        return el.currentStyle?el.currentStyle[styleName]:getComputedStyle(el)[styleName];
    }
    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <meta http-equiv="X-UA-Compatible" content="ie=edge">
        <script src="../index.js"></script>
        <title>getComputedStyle(el)</title>
        <style>
            #box { width: 100px; height: 100px; background: red; transition:.5s; }
        </style>
    </head>
    <body>
        <div id="box"></div>
        <script>
            //需求:点击div,div的width在原有基础上+100px
            var box = _id("box");
    
            box.onclick = function(){
                //直接获取box.style.width是获取不到的,因为样式时写到style标签,而非行间样式
                //console.log(box.style.width);//获取不到值
    
                //使用getComputedStyle(el)['样式名']即可获取到当前显示出来的样式
                // var curStyle = getComputedStyle(box)['width'];
                var curStyle = currStyle(box,'width');
                //获取到的结果是“100px”,需要将其进行转为数字。width最后有可能会有小数点,所以最好使用parseFloat()。大多数情况下parseInt()亦可
                //但是parseInt(curStyle);才能去掉px进行相加
                //注意px前面的数字千万不要加引号
                this.style.width = parseInt(curStyle) + 100 + 'px';
            };
        </script>
    </body>
    </html>

    结果:

    8.JS预解析机制(变量提升Hoisting)

    JS预解析机制(变量提升(Hoisting)):JS在读取到一个script标签(或者一个函数作用域)时,会先进行一个预解析的过程,在这个过程中,会把var声明的变量和function声明的函数体,提升到整个scriptt标签(或者一个函数作用域)最前边去。在预解析完之后,JS才会从上到下一行一行解析代码并执行。

    • var在预解析时,会把声明提升到最前边(赋值前打印返回undefined)。只提升声明,不会把赋值过程进行提升。
    • function的函数体在预解析时,会把整个函数体提升至最前边。(函数体:function fn(){ console.log(1);})
    • 函数表达式(函数表达式:var fn = function(){};)只会提升函数表达式的声明,不会执行(真正执行函数表达式前调用会返回undefined)
    • 在预解析时,会先预解析var(包括变量声明和函数表达式的变量声明),把var放在最前面,然后再预解析function,所以当var和function重名时,function会覆盖var;
       //JS var变量的预解析
        console.log("var变量的预解析:"+a);//undefined
        var a = 0;
    
        //JS函数体的预解析
        console.log("函数体的预解析:"+fn);
        function fn(){
            console.log("函数");
        }
        //JS函数表达式的预解析
        console.log("函数表达式的预解析:"+fnn);
        var fnn = function(){
            console.log("函数表达式");
        };

    结果:

    在预解析时,会先预解析var,把var放在最前面,然后再预解析function,所以当var和function重名时,function会覆盖var:

        /*
            解析过程:先预解析var声明的a,再预解析函数体a,后面覆盖前面,所以最后结果是function函数体
            var a;
            function a(){console.log("函数a");};//此函数体解析后会覆盖变量a
        */
        console.log(a);
        var a = 0;
        function a(){
            console.log("函数a");
        }

    结果:

    JS预解析示例:

        //JS预解析过程:遇到Script标签或一个函数作用域,会先进行预解析,先预解析var声明的变量(包括普通变量声明和函数表达式声明),再声明function函数体,如果有重名function声明会覆盖var声明
        /*
            预解析之后代码:
            var a;//变量a
            var a;//函数表达式a(函数表达式也是var声明)
            function a(){//函数体
                console.log(1);
            };
    
            console.log(a);//打印函数体a
            var a = 10;
            console.log(a);//10
            console.log(a);//10
            a = function(){
                console.log(2);//打印函数表达式a
            };
            console.log(a);
    
        */
        console.log(a);
        var a = 10;
    
        console.log(a);
        function a(){
            console.log(1);
        };
    
        console.log(a);
        var a = function(){
            console.log(2);
        };
    
        console.log(a);

    结果:

    JS预解析机制不是良好的编码习惯,不利于代码维护,建议不要使用,编码时建议先声明,再使用。

    扩展:从概念的字面意义上说,“变量提升”意味着变量和函数的声明会在物理层面移动到代码的最前面,但这么说并不准确。实际上变量和函数声明在代码里的位置是不会动的,而是在编译阶段被放入内存中。

    ES6之后就不能像JS预解析这么编写JS代码了。

    9.作用域

    通常来说一段程序代码中使用的变量和函数并不总是可用的,限定其可用性的范围即作用域,作用域的使用提高了程序逻辑的局部性,增强程序的可靠性,减少名字冲突。

    通俗的说,作用域:数据起作用的范围(某条数据可以在什么范围内使用)

    前端权威官方MDN:https://developer.mozilla.org/en-US/docs/Glossary/Scope

    作用域的分类:

    1. - 全局作用域:通过var或function声明在全局(声明在任意函数之外和代码块之外)中的数据,在全局的任意地方都可以调用或修改(即全局变量)和在window下的属性
    2. - 局部作用域:
    • 函数作用域:声明在函数内部的某个数据(var,function,参数),就只能在函数内部使用(函数的局部作用域)
    • 块级作用域(ES6新增)

    全局作用域:

        //声明在全局中的变量
        var a = 0;
        console.log(a);//可在全局任意地方调用
        function fn(){
            console.log(a);//可在函数中调用
            a = 10;//可在任意地方修改全局中的变量
        }
        fn();
        console.log(a);

    结果:

    10.window

    • 在JS中,默认情况下 var声明的全局变量和function声明的全局函数会挂载在window上(所以要避免声明全局变量和全局函数)
    • 在JS中,默认全局数据都会保存在window下(ES6之前)
    • 另外window是JS在浏览器里的顶层对象,所以window的属性和方法也都是全局的
    • 在JS中,调用window下的属性和方法,默认可以不写window,所以如果在函数里面声明变量没有写var,会把其当做window的一个属性;(不规范写法,要避免)
        //var声明的全局变量和function声明的全局函数,都默认挂载在window上
        var a = 0;
        console.log(window);
    
        function fn(){
            b = 10;
            console.log(1);
        }
        fn();
        console.log(b);//此处b没有写声明的var所以,b=10即为window.b = 10;相当于挂载在window上的全局变量
    
        //在JS中,默认全局数据都会保存在window下
        //window是浏览器的最顶层对象,所以默认window下的属性和方法都是全局的。所以window下的方法和属性,默认可以不写window

     结果:全局变量a和全局函数fn()都默认挂载在window上。而且,此处b没有写声明的var,所以,b=10即相当于window.b = 10;也是挂载在window上的全局变量:

    11.全局污染(命名冲突问题)

    全局变量污染:大家都在全局中写代码,很容易造成命名冲突,导致代码冲突。ES6中代码冲突会直接报错。所以要养成好的习惯不要在全局去声明变量

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <meta http-equiv="X-UA-Compatible" content="ie=edge">
        <title>全局污染</title>
    </head>
    <body>
        <div id="list"></div>
        <div class="memulist"></div>
        <script>
            var list = document.getElementById("list");
            var list = document.querySelector(".memulist");
            console.log(list);
        </script>
    </body>
    </html>

     结果:发现最后获取的只有一个元素,所以很容易造成代码冲突

    解决:不要声明全局变量

    (function(){
         var list = document.getElementById("list");
         console.log(list);
    })();
    
    (function(){
          var list = document.querySelector(".memulist");
          console.log(list);
    })();

    结果: 

    JS中提供了id使用的简便方法,直接调用id名即可:但尽量不要这么写,不规范:

    console.log(list);

    匿名函数:匿名函数自执行本身就是为了避免在全局写代码,避免冲突的。匿名函数自执行也叫开启一个新的命名空间。即开启新的作用域,此作用域和其他的不会冲突。

    12.作用域链(scope chain)

    作用域链决定了哪些数据能被函数访问。当一个函数创建后,它的作用域链会被创建此函数的作用域中可访问的数据对象填充。

    作用域链:JS中数据的查找规则。

    作用域链查找过程:在JS中我们调用一条数据时,会先在当前作用域进行查找,如果找不到,就从向上找父作用域的数据,还找不到就接着向上,一直找到全局作用域(window对象),window都找不到就报错。

        //调用fn()时,在其子函数fn2()被调用时,首先会在fn2()自己的作用域内找变量a
        //找不到就在其父级作用域即fn()作用域中找,即a=10,然后打印a=10
        function fn(){
            var a = 10;
            function fn2(){
                console.log(a);
            }
            fn2();
        }
        fn();

     结果:

    作用域链查找关系图:

     作用域链示例:

    <script>
        function fn(){
            var b = 0;
            return function(){
                b++;
                console.log(b);
            };
        }
        var f = fn();
        console.log(f);//ƒ (){ b++; console.log(b); }
        f();//1
        f();//2
        f();//3
        fn()();//1
    </script> 

    结果:

    解析(函数拆分)三个f():

    注意:这里的var f = fn();是将函数fn()的返回值函数体f(){ b++; console.log(b); };赋给变量f,但是并没有执行该返回值函数体,当f()调用时,便执行了该函数体。f此时是fn的子函数,那它可以访问和更改父级fn的作用域中的b。

    b变量会一直赋值,是因为JS的垃圾回收机制决定的,只要检测都有引用存在,就不会释放。

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <meta http-equiv="X-UA-Compatible" content="ie=edge">
        <title>作用域链示例-函数拆分</title>
    </head>
    <body>
    <script>
        // function fn(){
        //     var b = 0;
        //     return function(){
        //         b++;
        //         console.log(b);
        //     };
        // }
        // var f = fn();
        // f();//1
        // f();//2
        // f();//3
        // fn()();//1
        //这里的var f = fn();是将函数fn()的返回值函数体function(){ b++; console.log(b); };赋给变量f,但是并没有执行该返回值函数体,当f()调用时,便执行了该函数体
        //即这里的三个f()相当于,在函数fn()中写了三个子函数,再进行调用
        //由于b变量对于fn1(),fn2(),fn3()都是父级变量,所以每次b++都会将b的值+1,所以最后得到的值即1,2,3
        function fn(){
            var b = 0;
            function fn1(){
                b++;
                console.log(b);
            }
            fn1();
            function fn2(){
                b++;
                console.log(b);
            }
            fn2();
            function fn3(){
                b++;
                console.log(b);
            }
            fn3();
        }
    
        fn();
    </script>    
    </body>
    </html>

    结果:所以执行三个f();和执行三个fn();得到的结果是不一样的。

    以上进一步分解:

     

    <script>
        // function fn(){
        //     var b = 0;
        //     return function(){
        //         b++;
        //         console.log(b);
        //     };
        // }
        // var f = fn();
        // f();//1
        // f();//2
        // f();//3
        // fn()();//1
        //这里的var f = fn();是将函数fn()的返回值函数体function(){ b++; console.log(b); };赋给变量f,但是并没有执行该返回值函数体,当f()调用时,便执行了该函数体
        //即这里的三个f()相当于,在函数fn()中写了三个子函数,再进行调用
        //由于b变量对于fn1(),fn2(),fn3()都是父级变量,所以每次b++都会将b的值+1,所以最后得到的值即1,2,3
        function fn(){
            var b = 0;
            // function fn1(){
            //     b++;
            //     console.log(b);
            // }
            // fn1();
            // function fn2(){
            //     b++;
            //     console.log(b);
            // }
            // fn2();
            // function fn3(){
            //     b++;
            //     console.log(b);
            // }
            // fn3();
            function fnn(){
                b++;
                console.log(b);
            }
            fnn();
            fnn();
            fnn();
    
        }
        fn();
    </script>   

    结果:所以调用三次f()和再fn()函数里执行三次fnn()是一样的

    函数拆分fn()():

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <meta http-equiv="X-UA-Compatible" content="ie=edge">
        <title>作用域链示例——函数拆分fn()()</title>
    </head>
    <body>
    <script>
        // function fn(){
        //     var b = 0;
        //     return function(){
        //         b++;
        //         console.log(b);
        //     };
        // }
        // var f = fn();
        // f();//1
        // f();//2
        // f();//3
        // fn()();//1
    
        //此处的fn()();第一个括号表示执行fn()函数,第二个括号表示执行fn()函数中返回值中的函数,所以fn()()相当于整个fn函数再执行一次
        //函数每次调用,都相当于把这个代码复制出来执行了一遍。所以fn()();每次执行都是重新执行一遍代码,相当于以下:
        function fn(){
            var b = 0;
            return function(){
                b++;
                console.log(b);
            };
        }
        function fnA(){
            var b = 0;
            return function(){
                b++;
                console.log(b);
            };
        }
        fn()();//1
        fnA()();//1
    </script>
    </body>
    </html>

    结果:

    函数每次调用,如fn()和fnA()之间没有任何关联,都相当于把这个代码复制出来执行了一遍。

    13.闭包

    闭包是对作用域链的一种表现和使用。

    函数对象可以通过作用域链相互关联起来,函数体内的数据(变量和函数声明)都可以保存在函数作用域内,这种特性在计算机科学文献中被称为“闭包”。既函数体内的数据被隐藏于作用于链内,看起来像是函数将数据“包裹”了起来。从技术角度来说,js的函数都是闭包:函数都是对象,都关联到作用域链,函数内数据都被保存在函数作用域内。

    fn()();调用函数后的返回值还是一个函数,也对其进行执行

    函数的每次执行之间没有任何关系。每次执行都相当于在JS内部吧代码重新写了一遍。

    面试时:闭包就是能够读取其他函数内部变量的函数。例如在javascript中,只有函数内部的子函数才能读取局部变量,所以闭包可以理解成“定义在一个函数内部的函数“。在本质上,闭包是将函数内部和函数外部连接起来的桥梁。

    闭包:

    • 形式:函数嵌套函数;
    • 作用:子函数可以访问父函数的作用域,但是父级不能访问子级的。

    闭包示例:

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <meta http-equiv="X-UA-Compatible" content="ie=edge">
        <title>闭包</title>
    </head>
    <body>
    <script>
        function fn(){
            var a = 0;
            function fn2(){
                console.log(a);//fn2是fn的子函数,所以可以访问父级作用域的a
            }
            fn2();
        }
        fn();
        console.log(a);//在fn函数作用域外,不能访问其子级作用域fn中的变量a
    </script>
    </body>
    </html>

    结果:

    闭包应用:i传参给了fn函数,而点击事件是fn函数的子函数,所以也可以获取到fn函数中的i

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <meta http-equiv="X-UA-Compatible" content="ie=edge">
        <title>闭包应用</title>
    </head>
    <body>
        <button>按钮一</button>
        <button>按钮二</button>
        <button>按钮三</button>
        <script>
            var btns = document.querySelectorAll("button");
            for (var i = 0; i < btns.length; i++) {
                fn(i);
            }
            //i传参给了fn函数,而点击事件是fn函数的子函数,所以也可以获取到fn函数中的i
            function fn(index){
                btns[index].onclick = function(){
                    console.log(index);
                };
            }
        </script>
    </body>
    </html>

    结果:按钮进行循环后会将当前index传参给fn函数,当点击按钮时,再通过父级作用域获取到父级的index

    闭包应用二:(匿名函数自执行方式)页面刷新时解析for循环并将index传给fn,并且立即执行fn函数,当点击按钮时,再通过父级作用域fn获取到index

    <script>
            var btns = document.querySelectorAll("button");
            for (var i = 0; i < btns.length; i++) {
                (function fn(index){
                    btns[index].onclick = function(){
                        console.log(index);
                    };
                })(i);
            }
            //i传参给了fn函数,而点击事件是fn函数的子函数,所以也可以获取到fn函数中的i
            // function fn(index){
            //     btns[index].onclick = function(){
            //         console.log(index);
            //     };
            // }
        </script>

    结果:

    闭包应用三:点击按钮后,再立即执行一个匿名函数自执行。匿名函数自执行后,得到的是一个函数返回值,当点击时再执行该函数中的内容

        <script>
            var btns = document.querySelectorAll("button");
            for (var i = 0; i < btns.length; i++) {
                //匿名函数自执行后,得到的是一个函数返回值,当点击时再执行该函数中的内容
                btns[i].onclick = (function fn(index){
                    return function(){
                        console.log(index);
                    };
                })(i);
            }
        </script>

    结果:

    14.this当前执行代码的环境对象

    默认情况下:

    • 函数外:window
    • 函数内:函数中的this指向谁,取决于这个函数是怎么调用的
    • 严格模式下,默认为undefined
    1. 作为对象的属性(方法,事件(方法的一种))调用,指向当前对象
    2. 其余情况执行window
    <script>
    //函数外:window
    // 函数内:函数中的this指向谁,取决于这个函数是怎么调用的
        // 作为对象的属性(方法)调用,指向当前对象
        // 其余情况执行window
    
    function fn(){
        console.log(this);
    }
    //直接调用函数,this代表window
    console.log("没有作为对象的属性进行调用,而是直接调用:");
    fn();//this指向window 
    
    //作为对象的属性或方法调用
    //作为对象的属性进行调用
    console.log("作为对象的属性进行调用:");
    document.fn = fn;
    document.fn();//this 执行document
    
    //事件里,把this绑定在事件上
    console.log("作为对象的属性(事件)进行调用:");
    document.onclick = fn;
    document.onclick();//this 执行document
    
    //数组里,把函数放到数组里,再由数组调用,此时this指向当前数组
    console.log("作为对象(数组)进行调用:");
    var arr = [fn,1,2];
    arr[0]();//this指向当前数组
    
    //obj对象里
    console.log("作为对象(object对象)进行调用:");
    var obj = {
        fn:fn
    };
    obj.fn();//this指向object对象
    </script>

    结果:

    15.严格模式下的this指向

     在script标签最上面加上 'use strict';,加上'use strict'后预解析已经不能使用,会报错。

    严格模式下的function指向问题:在严格模式下,function如果不是作为对象的属性和方法被调用(即直接调用方法)就指向undefined。

    <script>
    'use strict';
    function fn(){
        console.log(this);
    };
    console.log("严格模式下,函数直接被调用(没有通过函数的属性或方法被调用,this就指向undefined):");
    //严格模式下,函数直接被调用(没有通过函数的属性或方法被调用,this就指向undefined)
    fn();
    
    //通过函数的属性或方法被调用,就指向被调用的对象
    console.log("通过函数的属性或方法被调用,就指向被调用的对象:");
    document.onclick = fn;
    document.onclick();
    
    </script>

    结果:

    16.this指向的修改

    16.1 function.call()

    1. function.call(this指向谁,参数1,参数2...)调用函数,并修改函数中的this指向;
    2. 执行函数的call方法,会调用该函数,并且修改函数中 的this指向;
    3. call中的第0个参数,代表当前函数执行时,函数中的this指向谁
    4. 其他参数都是给函数传的实参
    5. 注意修改执行为body时,一定要使用document.body
    <script>
    function fn(a,b){
        console.log(this,a,b);
    }
    //直接执行,this指向window
    console.log("直接调用函数,this指向window:");
    fn(1,2);//window
    
    //通过call更改当前函数的this指向
    //更改this指向为document
    console.log("调用函数的call方法,更改this指向document:");
    fn.call(document,'a','b');//document 
    
    //更改this指向为document.body
    console.log("调用函数的call方法,更改this指向document.body:");
    fn.call(document.body,'a','b');//body
    
    </script>  

    结果:

    16.2 function.apply()

    1. function.apply(this指向谁,[参数1,参数2...])调用函数,并修改函数中的this指向
    2. 指向函数的apply方法,会调用该函数,并且修改函数中的this指向;
    3. apply中的第0个参数,代表当前执行时,函数中的this指向谁;
    4. apply中第1个参数是个数组,数组中代表了我们要往函数中传递的参数;且所有参数只能放在一个数组里,有多个数组时,除了第一个,其他数值的参数不会被接收
    5. apply和call唯一的区别在于,call方法直接在方法里传参,而apply是将所有参数已数组形式进行传递;
    6. 注意修改执行为body时,一定要使用document.body
    <script>
    function fn(a,b){
        console.log(this,a,b);
    }
    //直接调用,this指向window
    console.log("直接调用,this指向window:");
    fn('s','r');
    
    //调用函数的apply方法,更改this指向为document
    console.log("调用函数的apply方法,更改this指向document:");
    fn.apply(document,['2','4']);
    
    //调用函数的apply方法,更改this指向document.body
    console.log("调用函数的apply方法,更改this指向document.body:");
    fn.apply(document.body,['2','4']);
    </script> 

    结果: 

    16.3 function.bind()

    1. function.bind(指向,参数1,参数2,...)绑定this指向
    2. 调用函数的bind方法,会返回一个绑定了this执行的新函数;
    3. 第0个参数是bind返回的新函数的this指向
    4. 返回新函数的this指向被绑定了,不能再被更改
    5. 新函数的this指向在修改原函数this指向时就已经被绑定,一旦被绑定不能再次修改

    总结:调用函数的bind方法,会生成新的函数,绑定的this指向是针对新函数的,新函数this指向被绑定后,不能再继续被绑定(call和apply也不行);如果调用时再传入新的参数,会将新的参数和被绑定的参数进行合并,被绑定的参数会一直存在;而原函数的this指向一直没有变,还可以继续调用bind方法,生成新的函数,同时给新的函数绑定新的this指向

    <script>
    function fn(a,b){
        console.log(this,arguments);
    }
    //直接调用函数,this指向window
    console.log("直接调用函数,this指向window:");
    fn(1,2);//window
    
    //使用函数的bind方法
    console.log("使用函数的bind方法,返回新的函数:");
    var fn2 = fn.bind(document,3,4);
    console.log(fn2 == fn);//false 新函数和旧函数不是同一个
    
    console.log("原函数的this指向:");
    fn(5,6);//原函数的this指向不变,依然是window,且还可以继续调用bind方法
    
    console.log("新的函数的this指向:");
    console.log("如果新的函数调用时传入新的参数,会将绑定的参数和新传入的参数进行合并:");
    fn2(7,8);//3,4,7,8  新函数的this指向即原函数绑定的this指向
    
    //新函数的this指向在修改原函数this指向时就已经被绑定,一旦被绑定不能再次修改,且被绑定的参数也不能再被修改
    //只是如果调用新函数时传入新参数,会合并两次的参数
    console.log("新函数的this指向再修改原函数this指向时就已经被绑定,一旦被绑定不能再次修改:");
    fn2.call(window,9,0);//这里即使再次更改this指向,fn2新函数的this指向永远不会再改变
    
    //再次调用fn的bind方法
    console.log("再次调用fn的bind方法,返回新的函数:");
    var fn3 = fn.bind(document.body,'a','b');
    console.log(fn3 == fn);
    fn3('c','d');
    </script> 

    结果:

    16.4 bind方法原理分析:

    为什么调用bind生成的新函数,this指向被绑定后就不能再绑定了?bind方法在ES5.1后才出来,如果想实现此功能,可以自己写可以再次绑定的bind方法。

    自己实现bind方法:

    参数:fn 要绑定this函数;_this返回新函数this指向谁

    <script>
    //为什么调用bind生成的新函数,this指向被绑定后就不能再绑定了
    //自己实现bind方法的原理
    //fn要绑定的新函数,_this给新函数绑定的this指向,...arg传参(展开运算符ES6新增)
    function bind(fn,_this,...arg){
        return function(...args2){
            fn.call(_this,...arg,...args2);
        };
    }
    
    function fn(){
        console.log(this,arguments);
    }
    //调用bind方法,返回新的函数function(){ fn.call(_this); };
    var fn2 = bind(fn,document,11);
    //执行fn2()即执行返回的新函数,并给新的函数绑定this指向
    fn2(2,3);//document
    fn();
    
    //重新调用绑定函数,并返回新的函数同时给其绑定this执行
    var fn3 = bind(fn,document.body,12);
    fn3(4,5);//this
    </script> 

    结果:

    展开全文
  • C++内联函数机制全面解析

    千次阅读 2017-01-19 14:31:26
    内联机制引入C++作为对宏(Macro)机制的改进和补充(不是取代)。内联函数的参数传递机制与普通函数相同。但是编译器会在每处调用内联函数的地方将内联函数的内容展开。这样既避免了函数调用的开销又没有宏定义...

    内联函数机制的引入


            内联机制被引入C++作为对宏(Macro)机制的改进和补充(不是取代)。内联函数的参数传递机制与普通函数相同。但是编译器会在每处调用内联函数的地方将内联函数的内容展开。这样既避免了函数调用的开销又没有宏定义机制的缺陷。由此可见,内联函数机制的引入与宏定义有很大关系,因此,有必要先了解下宏定义有哪些缺陷。

            1. 由于宏定义都是直接嵌入代码中的,所以代码可能相对多一点;

            2. 嵌套定义过多可能会影响程序的可读性,而且很容易出错;

            3. 对带参的宏而言,由于是直接替换,并不会检查参数是否合法,存在安全隐患,预编译语句仅仅是简单的值代替,缺乏类型的检测机制。这样预处理语句就不能享受C++严格的类型检查的好处,从而可能成为引发一系列错误的隐患。

            最后引用《C陷进与缺陷》的一句话,对其进行总结:“宏并不是函数,宏并不是语句,宏并不是类型定义 ”。


    inline关键字


            但是程序代码中的关键字"inline"只是对编译器的建议:被"inline"修饰的函数不一定被内联(但是无"inline"修饰的函数一定不是)。

            许多书上都会提到这是因为编译器比绝大多数程序员都更清楚函数调用的开销有多大,所以如果编译器认为调用某函数的开销相对该函数本身的开销而言微不足道或者不足以为之承担代码膨胀的后果则没必要内联该函数。这当然有一定道理,但是按照C、C++一脉相承的赋予程序员充分自由与决定权的风格来看,理由还不够充分。我猜想最主要的原因是为了避免编译器陷入无穷递归。如果内联函数之间存在递归调用则可能导致编译器展开内联函数时陷入无穷递归。有时候函数的递归调用十分隐蔽,程序员并不容易发现,所以简单起见,将内联函数展开与否的决定权交给编译器。

            开发人员有两种方式告诉编译器需要内联哪些函数,一种是在类的定义体外,一种是在类的定义体内。

            (2)当在类的定义体内且声明该成员函数时,同时提供成员函数的实现体。此时“inline”关键字不是必需的。

            因为C++是以“编译单元”为单位编译的,而一个编译单元往往大致等于一个“.cpp”文件。在实际编译前,预处理器会将“#include”的各个头文件的内容(可能会有递归头文件展开)完整地复制到cpp文件对应位置处(另外还会进行宏展开等操作)。预处理器处理后,编译真正开始。一旦C++编译器开始编译,它不会意识到其他cpp文件的存在。因此并不会参考其他cpp文件的内容信息。联想到内联的工作是由编译器完成的,且内联的意思是将被调用的内联函数的函数体代码直接代替对该内联函数的调用。这也就意味着,在编译某个编译单元时,如果该编译单元会调用到某个内联函数,那么该内联函数的函数定义(即函数体)必须也包含在该编译单元内。因为编译器使用内联函数体代码替代内联函数调用时,必须知道该内联函数的函数体代码,而且不能通过参考其他编译单元信息来获取这一信息。

            如果有多个编译单元会调用到同一个内联函数,C++规范要求在这多个编译单元中该内联函数的定义必须完全一致的。考虑到代码的维护性,最好将内联函数的定义放在一个头文件中,用到该内联函数的各个编译单元只需#include(包含)该头文件即可,进一步考虑,如果该内联函数是一个类的成员函数,这个头文件正好可以是该成员函数所属类的声明所在的头文件。


    内联函数什么时候不展开


            在内联函数内不允许用循环语句和开关语句(开关语句即switch语句)。如果内联函数有这些语句,则编译将该函数视同普通函数那样产生函数调用代码,递归函数(自己调用自己的函数)是不能被用来做内联函数的。内联函数只适合于只有1~5行的小函数。对一个含有许多语句的大函数,函数调用和返回的开销相对来说微不足道,也没有必要用内联函数实现。

            另一种不被内联的情况是使用函数指针来调用内联函数(解释见引申部分)。

            对于C++中内联机制的一个常见误解是:关键字"inline"只是对编译器的建议,如果编译器发现指定的函数不适合内联就不会内联;所以即使内联使用得不恰当也不会有任何副作用。这句话只对了一半,内联使用不恰当是会有副作用的:会带来代码膨胀,还有可能引入难以发现的程序臭虫。

            根据规范,当编译器认为希望被内联的函数不适合内联的时候,编译器可以不内联该函数。但是不内联该函数不代表该函数就是一个普通函数了,从编译器的实际实现上来讲,内联失败的函数与普通函数是有区别的:

            (1)普通函数在编译时被单独编译一个对象,包含在相应的目标文件中。目标文件链接时,函数调用被链接到该对象上。

            (2)若一个函数被声明成内联函数,编译器即使遇到该函数的声明也不会为该函数编译出一个对象,因为内联函数是在用到的地方展开的。可是若在调用该内联函数的地方发现该内联函数的不适合展开时怎么办?一种选择是在调用该内联函数的目标文件中为该内联函数编译一个对象。这么做的直接后果是:若在多个文件调用了内联失败的函数,其中每个文件对应的目标文件中都会包含一份该内联函数的目标代码。

            如果编译器真的选择了上面的做法对待内联失败的函数,那么最好的情况是:没吃到羊肉,反惹了一身骚。即内联的好处没享受到,缺点却承担了:目标代码的体积膨胀得与成功内联的目标代码一样,但目标代码的效率确和没内联一样。

            更糟的是由于存在多份函数目标代码带来一些程序臭虫。最明显的例子是:内联失败的函数内的静态变量实际上就不在只有一份,而是有若干份。这显然是个错误,但是如果不了解内幕就很难找到原因。


    宏定义与内联函数的区别


            从内联即函数体代码替代对该函数的调用这一本质看,它与C语言中的宏极其相似,但是它们之间有本质区别。宏代码本身不是函数,但使用起来却像函数,预处理器用复制宏代码的方式代替函数调用,省去了参数压栈、生成汇编语言的CALL调用、返回参数、执行return等过程,从而提高了速度。内联函数是代码被插入到调用者代码处的函数。对C++而言,内联函数的作用也不是万能的,它的使用是有所限制的,它只适合函数体内代码简单的函数使用,不能包含复杂的结构控制语句(如switch、while),并且内联函数本身不能直接调用递归函数。

            两者的区别主要表现在以下几个方面:第一,宏定义在预处理阶段进行代码替换,而内联函数是在编译阶段插入代码;第二,宏定义没有类型检查,而内联函数有类型检查,这对于写出正确且鲁棒的程序是一个很大的优势;最后,宏肯定会被展开,而用inline关键字修饰的函数不一定会被内联展开。


    内联函数与普通函数的区别有哪些


            内联函数的参数传递机制与普通函数相同,但是编译器会在每处调用内联函数的地方将内联函数的内容展开,这样既避免了函数调用的开销又没有宏机制的缺陷。

            内联函数和普通函数的最大区别在于其内部的实现,普通函数在被调用时,系统首先要跳跃到函数的入口地址,执行函数体,执行完毕后,再返回到函数调用的地方,函数始终只有一个复制;而内联函数则不需要进行一个寻址过程,当执行内联函数时,此函数展开,如果在N处调用了此内联函数,则此函数就会有N个代码段的复制。

            空间和时间比较,假设调用一个函数之前的准备工作和之后的善后工作的指令所需空间大小为SS,执行这些代码所需时间为TS。

            (1)空间。如果一个函数的函数体代码大小为AS,在程序中被调用N次,不采用内联的情况下,空间开销为:SS*N+AS。采用内联:AS*N。因为N一般很大,所以它们之间的比较就是SS跟AS的比较,得出的结论是:如果SS小于AS,不采用内联,空间开销更少。如果AS小于SS,则采用内联,空间开销更少。

            (2)时间。内联之后每次调用不再需要做函数调用的准备和善后工作;内联之后编译器获得更多的代码信息,看到的是调用函数与被调用函数连成的一大块代码,此时编译器对代码的优化可以做得更好。还有一个很重要的因素,即内联后调用函数体内需要执行的代码是相邻的,其执行的代码都在同一个页面或连续的页面中。如果没有内联,执行到被调用函数时,需要跳到包含被调用函数的内存页面中执行,而被调用函数所属的页面极有可能当时不在物理内存中。这意味着,内联后可以降低“缺页”的几率,“缺页”次数的减少带来的效果远好于代码量的减少。另外即使被调用函数所在的页面可能正好在物理内存中,但是因为与调用函数在空间上相隔甚远,所以可能会引起“Cache miss”,从而降低执行速度。因此总的来说,内联后程序的执行时间会比没有内联要少,即程序速度更快。不过,如果内联的函数非常大的话,正如前面提到的,当AS远大于SS,且N很大时,会使最终程序的代码量增多,代码量多意味着用来存放代码的内存页面增多,“缺页”也会相应增加,速度反而下降,所以很大的函数不适合内联。这也是为什么很多编译器对于函数体代码很多的函数,会拒绝对其进行内联的请求。即忽略"inline"关键字,而对如同普通函数那样编译。

            最后顺带提及,一个程序的唯一入口main()函数肯定不会被内联化。另外编译器合成的默认构造函数、拷贝构造函数、析构函数以及赋值运算符一般都被内联化。

    展开全文
  • 解析Swift函数式编程

    2020-03-18 15:43:47
    解析Swift函数式编程 解析Swift函数式编程 文 / 李洁信 函数式编程(Functional Programming)近年来得到了业界的广泛关注,而苹果新发布的iOS开发语言Swift也对其提供了部分支持。本文将简要介绍Swift语言中的函数...
  • MSVCRTD.lib(crtexew.obj) : error LNK2019: 无法解析的外部符号 _WinMain@16,该符号在函数 ___tmainCRTStartup 中被引用 1>F:\Projects\程设\expreriment8-3x\Debug\expreriment8-3x.exe : fatal error LNK1120: ...
  • error LNK2019: 无法解析的外部符号 _jpeg_std_error,该符号在函数 "unsigned int __cdecl rescaleJPEG(unsigned char *,unsigned int,unsigned char * *,int)" (?rescaleJPEG@@YAIPAEIPAPAEH@Z) 中被引用 jpeg_...
  • pandas模块常用函数解析之DataFrame 以下命令都是在浏览器中输入。 cmd命令窗口输入:jupyter notebook 打开浏览器输入网址http://localhost:8888/ 一、导入模块 import numpy as np import pandas as pd ...

    pandas模块常用函数解析之DataFrame

    关注公众号“轻松学编程”了解更多。

    以下命令都是在浏览器中输入。

    cmd命令窗口输入:jupyter notebook

    打开浏览器输入网址http://localhost:8888/

    一、导入模块

    import numpy as np
    import pandas as pd
    from pandas import Series,DataFrame
    

    二、DataFrame

    DataFrame是一个【表格型】的数据结构。DataFrame由按一定顺序排列的多列数据组成。设计初衷是将Series的使用场景从一维拓展到多维。DataFrame既有行索引,也有列索引。

    • 行索引:index
    • 列索引:columns
    • 值:values

    1、 DataFrame的创建

    展开全文
  • PB函数大全(超全,解析很全面)

    万次阅读 热门讨论 2014-03-09 23:49:45
    最主要的是熟悉语法格式和各种常用函数,再结合以前所学的编程语言,来快速消化并掌握它。  工欲善其事,必先利其器。所以熟悉了语法格式后,常用函数则需要有个大概了了解,方便用时来查。下面是我收集的常用...
           这几天在pb花的时间比较长,用一个新的ide,一个新的语言,在短时间内去开发一个MIS,也是比较有难度的一件事儿。最主要的是熟悉语法格式和各种常用函数,再结合以前所学的编程语言,来快速消化并掌握它。
    


           工欲善其事,必先利其器。所以熟悉了语法格式后,常用函数则需要有个大概了了解,方便用时来查。下面是我收集的常用函数,比较多,希望对大家有用。

    • Abs()
      功能计算绝对值。
      语法Abs ( n )
      参数n:要得到绝对值的数值型变量或表达式返回值返回值的数据类型与n的数据类型相同,函数执行成功时返回n的绝对值。如果参数n的值为NULL,Abs()函数返回NULL。
    • Ceiling()
      功能返回大于n的最小整数。
      语法Ceiling ( n )
      参数n:数值型变量或表达式返回值返回值的数据类型与n的数据类型相同。函数执行成功时返回大于n的最小整数。如果参数n的值为NULL,Ceiling()函数返回NULL。
    • Cos()
      功能计算余弦,其中参数以弧度为单位。
      语法Cos ( n )
      参数n:数值型变量或表达式返回值Double。函数执行成功时返回n的余弦。如果参数n的值为NULL,Cos()函数返回NULL。
    • Exp()
      功能计算e的n次方。
      语法Exp ( n )
      参数n:指定幂值返回值Double。函数执行成功时返回e(约等于2.71828)的n次方。如果参数n的值为NULL,Exp()函数返回NULL。
    • Fact()
      功能计算n的阶乘。
      语法Fact ( n )
      参数n:数值型变量或表达式返回值Double。函数执行成功时返回n的阶乘。如果参数n的值为NULL,Fact()函数返回NULL。
    • Int()
      功能得到小于等于n的最大整数。
      语法Int ( n )
      参数n:数值型变量或表达式返回值Integer。函数执行成功时返回小于等于n的最大整数。如果n的值太小或太大,超过了整数的表示范围,则函数返回0。如果参数n的值为NULL,Int()函数返回NULL。
    • Log()
      功能计算n的自然对数。
      语法Log ( n )
      参数n:数值型变量或表达式,其值必须大于0返回值Double。函数执行成功时返回n的自然对数。如果n小于等于0,将导致运行错误。如果参数n的值为NULL,Log()函数返回NULL。
    • LogTen()
      功能计算n的常用对数(以10为底)。
      语法LogTen ( n )
      参数n:数值型变量或表达式,其值必须大于0返回值Double。函数执行成功时返回n的常用对数。如果n小于等于0,将导致运行错误。如果参数n的值为NULL,LogTen()函数返回NULL。
    • Max()
      功能求两个数中的最大值。
      语法Max ( x, y )
      参数x:数值型变量或表达式,参加比较的第一个数y :数值型变量或表达式,参加比较的第二个数返回值以x、y中数据类型更精确的数据类型作为该函数的返回值数据类型。函数执行成功时返回参数比较的两个数中更大者。如果任何参数的值为NULL,Max()函数返回NULL。
    • Min()
      功能求两个数中的最小值。
      语法Min( x, y )
      参数x:数值型变量或表达式,参加比较的第一个数y :数值型变量或表达式,参加比较的第二个数返回值以x、y中数据类型更精确的数据类型作为该函数的返回值数据类型。函数执行成功时返回参数比较的两个数中较小者。如果任何参数的值为NULL,Min()函数返回NULL。
    • Mod()
      功能求余数。
      语法Mod ( x, y )
      参数x:数值型变量或表达式,被除数y :数值型变量或表达式,除数返回值以x、y中数据类型更精确的数据类型作为该函数的返回值数据类型。函数执行成功时返回x除以y所得的余数 。如果任何参数的值为NULL,Mod()函数返回NULL。
    • Pi()
      功能计算n与Pi(3.14159265358979323...)的乘积。
      语法Pi ( n )
      参数n:数值型变量或表达式返回值Double。函数执行成功时返回n与Pi(3.14159265358979323...)的乘积。发生错误时返回-1。如果参数n的值为NULL,Pi()函数返回NULL。
    • Rand()
      功能得到1与n之间的一个伪随机数。
      语法Rand ( n )
      参数n:数值型变量或表达式,指定要产生的伪随机数的上界。有效值在1到32,767之间返回值与n的数据类型相同。函数执行成功时返回1与n之间的一个伪随机数,包括1和n在内。如果参数n的值为NULL,Rand()函数返回NULL。
    Randomize()
    功能初始化伪随机数发生器,这样让应用程序每次使用不同的伪随机数序列。
    语法Randomize ( n )
    参数n:数值型变量或表达式,指定伪随机数生成器使用的起始值,不同的起始值可以生成不同的伪随机数序列。当n的值为0时,该函数把系统时钟作为伪随机数生成器的起始值,这样可以生成不可重复的伪随机数序列。当n的值不为0时,可以产生不同的伪随机数序列,但是,如果两次使用相同的伪随机数生成器起始值,那么两次生成的伪随机数序列相同。n的值在0到32,767之间返回值Integer。极少使用该函数的返回值。
    Round()
    功能将x四舍五入到n位。
    语法Round ( x, n )参数x:要四舍五入的数值型数据n:整数类型,指定从哪个小数位上四舍五入x。有效值在0到18之间返回值Decimal。函数执行成功时返回将x四舍五入到小数点后第n位的数值,如果函数执行失败或任何参数的值为NULL,Round()函数返回NULL。
    Sign()
    功能确定n是整数、负数还是零。
    语法Sign ( n )
    参数n:数值型变量或表达式,指定要测试符号的值返回值Integer。当n大于0时返回1;当n小于0时返回-1;当n等于0时返回0。如果参数n的值为NULL,Sign()函数返回NULL。
    Sin()
    功能计算正弦,其中参数以弧度为单位。
    语法Sin( n )
    参数n:数值型变量或表达式返回值Double。函数执行成功时返回n的正弦。如果参数n的值为NULL,Sin()函数返回NULL。
    Sqrt()
    功能计算平方根。
    语法Sqrt ( n )
    参数n:数值型变量或表达式,指定要计算平方根的数据返回值Double。函数执行成功时返回n的平方根。如果n是负数,则执行该函数时引发运行错误。如果参数n的值为NULL,Sqrt()函数返回NULL。
    Tan()
    功能计算正切,其中参数以弧度为单位。
    语法Tan( n )
    参数n:数值型变量或表达式返回值Double。函数执行成功时返回n的正切。如果参数n的值为NULL,Tan()函数返回NULL。
    • Truncate()
      功能截断数值到指定的小数位。
      语法Truncate ( x, n )
      参数x:要截断的数值型数据n:整数类型,指定从哪个小数位上截断x。有效值在0到18之间返回值Decimal。函数执行成功时返回将x截断到小数点后第n位的数值,如果函数执行失败或任何参数的值为NULL,Truncate()函数返回NULL。所谓截断就是舍弃指定位之后的数值。  
    Asc()
    功能得到字符串第一个字符的ASCII码整数值。
    语法Asc ( string )
    参数string:要得到第一个字符ASCII值的字符串返回值Integer。函数执行成功时返回string参数第一个字符的ASCII值,如果string参数的值为NULL,则Asc()函数返回NULL。
    Char()
    功能将字符串的第一个字符、Blob变量的第一个值、或一个整数转换成字符。
    语法Char ( n )
    参数n:字符串、Blob变量或整数,也可以是包含上述类型数据的Any类型变量返回值Char。返回参数n的第一个字符。如果n参数的值为NULL,则Char()函数返回NULL。
    Dec()
    功能将字符串或Blob值转换成Decimal类型的值。
    语法Dec ( stringorblob )
    参数stringorblob:string类型变量或Blob类型变量。Blob类型变量时,把该变量第一个值转换为Decimal类型的值,其余部分被忽略。stringorblob参数也可以是包含上述类型数据的Any类型变量返回值Decimal。函数执行成功时返回相应的Decimal类型值。如果stringorblob参数中的值不是有效的PowerScript数字或数据类型不兼容,那么Dec()函数返回0。如果stringorblob参数的值为NULL,则Dec()函数返回NULL。
    Double()
    功能将字符串或Blob值转换成Double类型的值。
    语法Double(stringorblob)
    参数stringorblob:string类型变量或Blob类型变量。Blob类型变量时,把该变量第一个值转换为Double类型的值,其余部分被忽略。stringorblob参数也可以是包含上述类型数据的Any类型变量返回值Double。函数执行成功时返回相应的Double类型值。如果stringorblob参数中的值不是有效的PowerScript数字或数据类型不兼容,那么Double()函数返回0。如果stringorblob参数的值为NULL,则Double()函数返回NULL。
    Integer()
    功能 将字符串或Blob值转换成Integer类型的值。
    语法Integer ( stringorblob )
    参数stringorblob:string类型变量或Blob类型变量。Blob类型变量时,把该变量第一个值转换为Integer类型的值,其余部分被忽略。stringorblob参数也可以是包含上述类型数据的Any类型变量返回值Integer。函数执行成功时返回相应的Integer类型值。如果stringorblob参数中的值不是有效的PowerScript数字或数据类型不兼容,那么Integer()函数返回0。如果stringorblob参数的值为NULL,则Integer()函数返回NULL。
    Long()
    功能将其它类型的数据转换为Long类型的值。该函数有两种语法格式:
    语法一、将两个无符号整数组合成一个长整数值;
    语法二、将字符串或Blob值转换成Long类型的值。下面分别予以介绍:
    语法一、将两个无符号整数组合成一个长整数值
    语法Long ( lowword, highword )
    参数lowword:UnsignedInteger类型,指定长整数中的低位值highword:UnsignedInteger类型,指定长整数中的高位值返回值Long。函数执行成功时返回由低位值和高位值组合后的长整数值,发生错误时返回-1。如果任何参数的值为NULL,则Long()函数返回NULL。
    语法二、将字符串或Blob值转换成Long类型的值
    语法Long ( stringorblob )
    参数stringorblob:string类型变量或Blob类型变量。Blob类型变量时,把该变量第一个值转换为Long类型的值,其余部分被忽略。stringorblob参数也可以是包含上述类型数据的Any类型变量返回值Long。函数执行成功时返回相应的Long类型值。如果stringorblob参数中的值不是有效的PowerScript数字或数据类型不兼容,那么Long()函数返回0。如果stringorblob参数的值为NULL,则Long()函数返回NULL。
    Real()
    功能将字符串或Blob值转换成Real类型的值。
    语法Real ( stringorblob )
    参数stringorblob:string类型变量或Blob类型变量。当该参数是Blob类型变量时,把该变量第一个值转换为Real类型的值,其余部分被忽略。stringorblob参数也可以是包含上述类型数据的Any类型变量返回值Real。函数执行成功时返回相应的Real类型值。如果stringorblob参数中的值不是有效的PowerScript数字或数据类型不兼容,那么Real()函数返回0。如果stringorblob参数的值为NULL,则Real()函数返回NULL。
    Date() 功能 将其它类型的数据转换为Date类型的数据。该函数有三种语法格式:
    语法一、将DateTime类型或第一个值是DateTime或Date的Blob值转换成Date类型的值;
    语法二、将其值是个有效日期的字符串转换成Date类型的值;
    语法三、将三个整数组合成一个日期。下面分别予以介绍:
    语法一、将DateTime类型或第一个值是DateTime或Date的Blob值转换成Date类型的值
    语法Date ( datetime )
    参数datetime:DateTime类型的值或第一个值是DateTime或Date的Blob类型的值。当该参数是Blob类型变量时,把该变量第一个值转换为Date类型的值,其余部分被忽略。datetime参数也可以是包含上述类型数据的Any类型变量返回值Date。函数执行成功时返回相应的Date类型值。如果datetime参数中的值不是有效的PowerScript日期或数据类型不兼容,那么Date()函数返回1900-01-01。如果datetime参数的值为NULL,则Date()函数返回NULL。
    语法二、将其值是个有效日期的字符串转换成Date类型的值
    语法Date ( string )
    参数string:string类型,其值包括一个有效的以字符串形式表示的日期(比如January 1, 1998或12-31-99),string参数也可以是包含字符串类型数据的Any类型变量返回值Date。函数执行成功时返回相应的Date类型值。如果string参数中的值不是有效的PowerScript日期或数据类型不兼容,那么Date()函数返回1900-01-01。如果string参数的值为NULL,则Date()函数返回NULL。
    语法三、将三个表示年、月、日的整数组合成一个日期
    语法Date ( year, month, day )
    参数year:integer类型,指定日期中的年份,用四位数字表示,从0到9999month:integer类型,指定日期中的月份,用一位或两位数字表示,从1到12day:integer类型,指定日期中的号数,用一位或两位数字表示,从1到31返回值Date。函数执行成功时返回由year、month、day三个参数确定的日期。如果这三个参数中任何一个参数使用了无效值(比如月份指定为14),则Date()函数返回1900-01-01。如果任何参数的值为NULL,则Date()函数返回NULL。
    DateTime()
    功能 将其它类型的数据转换为DateTime类型的数据。该函数有两种语法格式:语法一、把日期和时间值组合成DateTime类型的值;语法二、将Blob类型的值转换成DateTime类型的值。下面分别予以介绍:
    语法一、把日期和时间值组合成DateTime类型的值
    语法DateTime ( date {, time } )
    参数date:Date类型的日期值time:可选参数,Time类型的时间值,省略该参数时,PowerBuilder把时间设置为午夜(00:00:00.000000)。当指定该参数时,可以仅仅指定小时值返回值DateTime。函数执行成功时返回日期和时间组合而成的DateTime类型的值。如果任何参数的值为NULL,则DateTime()函数返回NULL。
    语法二、将Blob类型的值转换成DateTime类型的值
    语法DateTime ( blob )
    参数blob:Blob类型变量,把该变量第一个值转换为DateTime类型的值,其余部分被忽略。blob参数也可以是包含blob类型数据的Any类型变量返回值DateTime。函数执行成功时返回相应的DateTime类型值。如果blob参数的值为NULL,则DateTime()函数返回NULL。
    IsDate()
    功能检测指定的字符串是否包含有效的日期。
    语法IsDate ( datevalue )
    参数datevalue:string类型,指定要检测的字符串返回值Boolean。如果datevalue包含了有效的日期,则IsDate()函数返回TRUE,否则返回FALSE。如果datevalue参数的值为NULL,则IsDate()函数返回NULL。
    IsNull()
    功能测试变量或表达式的值是否是NULL。
    语法IsNull ( any )
    参数any:要测试的变量或表达式返回值Boolean:如果any的值为NULL,函数返回TRUE,否则函数返回FALSE。
    IsNumber()
    功能测试字符串是否是有效的数值。
    语法IsNumber ( string )
    参数string:string类型,要测试的字符串返回值Boolean:如果string的值为有效的PowerScript数字,函数返回TRUE,否则函数返回FALSE。如果string参数的值为NULL,则IsNumber()函数返回NULL。
    IsTime()
    功能测试字符串的值是否是有效的时间。
    语法IsTime ( timevalue )
    参数timevalue:string类型,要测试的字符串返回值Boolean:如果timevalue的值为有效的时间,函数返回TRUE,否则函数返回FALSE。如果timevalue 参数的值为NULL,则IsTime()函数返回NULL。
    String()
    功能按指定格式将数据转换成字符串。String()可以把Date、DateTime、数值类型、Time、String类型的数据转换成指定格式的字符串。
    语法String(data,{format})
    参数data:指定要转换格式的数据,其数据类型可以是Date、DateTime、数值类型、Time、String,也可以是包含上述类型数据的Any类型变量format:可选项,string类型,其值指定数据格式。如果data参数的类型为string,则必须指定format参数返回值String。函数执行成功时返回以字符串方式表示的指定数据,如果data参数的数据类型与format参数指定的格式不匹配、format参数指定的格式无效、或data参数不是前面提到的适宜数据类型时,String()函数返回空字符串("")。
    用法:
    format是个用掩码表示的字符串,对data参数为数值类型的情况来说,格式为:正数格式;负数格式;零的显示格式;空的显示格式除第一部分必须提供外,其它部分可以省略。数值型显示格式中使用两个掩码字符:#和0,其中,使用#代表0~9之间的任意数字,0代表每个零都要显示。另外,货币符号($或¥)、百分号(%)、小数点(.)、逗号(,)等字符也可以出现在格式字符串中,但是,除小数点(.)、逗号(,)能够出现在格式字符#和0之间外,其它字符只能放置在格式串的前面或后面,例如,###,###$###是个错误的格式串,¥###,###,###是个正确的格式串。省略format参数时,String()函数使用PowerBuilder缺省格式。注意,如果显示格式有多个部分,各部分之间的分号(;)不能省略。其它字符也可以出现在显示格式字符串中(只能放在格式串的开头和末尾),但它们没有特殊意义,系统只是照原样显示。例如,用显示格式字符串“收入##”格式化数值12时,显示结果为“收入12”。对data参数为字符串(String)类型的情况来说,format参数的语法格式为:正常字符串格式;空值时格式在“正常字符串格式”中,@代表字符串中的任意字符,除此之外的任何字符照原样显示,例如,如果定义了下面的格式:(@@)@@@@-@@@@则字符串0166767593显示为:(01)6676-7593对data参数为日期(Date)类型的情况来说,format参数的语法格式为:正常日期格式;日期为空值时的格式日期格式中格式字符意义如下:d棗开头不带0的日数(如8)dd棗开头带0的日数(如08)ddd棗星期的英文缩写(如Mon、Tue)dddd棗星期的英文全称(如Monday、Tuesday)m棗开头不带0的月份(如8)mm棗开头带0的月份(如08)mmm棗月份的英文缩写(如Jan、Feb)mmmm棗月份的英文全称(如January、February)yy棗两位数字表示的年份(如97)yyyy棗四位数字表示的年份(如1997)另外,还可以使用下面的关键字作为日期的显示格式:[General] Windows系统中定义的短日期格式[LongDate] Windows系统中定义的长日期格式[ShortDate] Windows系统中定义的短日期格式对data参数为时间(Time)类型的情况来说,语法格式为:正常时间格式;时间为空值时的格式时间格式中格式字符意义如下:h开头不带0的小时(比如6)hh棗开头带0的小时(比如06)m棗开头不带0的分钟(比如6)mm棗开头带0的分钟(比如06)s棗开头不带0的秒(比如6)ss棗开头带0的秒(比如06)f棗开头不带0的微秒,可以指定1~6个f,每个f代表一部分微秒AM/PM棗用AM/PM显示上、下午时间,12小时制am/pm棗用am/pm显示上、下午时间,12小时制A/P棗用A/P显示上、下午时间,12小时制a/p棗用a/p显示上、下午时间,12小时制另外,显示格式中还可以使用关键字[Time],它表示按当前Windows系统定义的格式显示时间。对data参数为日期时间(DateTime)类型的情况来说,语法格式为:正常日期时间格式;日期时间为空值时的格式日期时间类型使用的掩码就是把日期掩码和时间掩码结合起来即可。
    • Time()
      功能 把其它类型的数据转换为Time类型的值。该函数有三种语法格式:语法一、将DateTime类型或第一个值是DateTime或Time的Blob值转换成Time类型的值;语法二、将其值是个有效时间的字符串转换成Time类型的值;语法三、将表示时、分、秒、以及微秒的整数组合成一个时间值。下面分别予以介绍:
      语法一、将DateTime类型或第一个值是DateTime或Time的Blob值转换成Time类型的值
      语法Time ( datetime )
      参数datetime:DateTime类型的值或第一个值是DateTime或Time的Blob类型的值。当该参数是Blob类型变量时,把该变量第一个值转换为Time类型的值,其余部分被忽略。datetime参数也可以是包含上述类型数据的Any类型变量返回值Time。函数执行成功时返回相应的Time类型值。如果datetime参数中的值不是有效的PowerScript时间或数据类型不兼容,那么Time()函数返回00:00:00.000000。如果datetime参数的值为NULL,则Time()函数返回NULL。
      语法二、将其值是个有效时间的字符串转换成Time类型的值
      语法Time ( string )
      参数string:string类型,其值包括一个有效的以字符串形式表示的时间(比如9am或10:25),string参数也可以是包含时间类型数据的Any类型变量返回值Time。函数执行成功时返回相应的Time类型值。如果string参数中的值不是有效的PowerScript时间或数据类型不兼容,那么Time()函数返回00:00:00.000000。如果string参数的值为NULL,则Time()函数返回NULL。
      语法三、将表示时、分、秒、以及微秒的整数组合成一个时间值
      语法Time ( hour, minute, second {, microsecond } )
      参数hour:integer类型,指定时间中的小时,从0到23minute:integer类型,指定时间中的分钟,从0到59second:integer类型,指定时间中的秒,从0到59microsecond:integer类型,可选项,指定时间中的微秒,从0到32767返回值Time。函数执行成功时返回由hour、minute、second、microsecond 四个参数确定的时间。如果这四个参数中任何一个参数使用了无效值(比如小时指定为44),则Time()函数返回NULL。
     
    Beep()
    功能响铃n次(n超过10时只响10次)。
    语法Beep ( n )
    参数n:数值类型,指定需要的响铃次数。如果n的值大于10,那么计算机只响铃10次返回值Integer。函数执行成功时返回1,发生错误时返回-1。如果参数n的值为NULL,Beep()函数返回NULL。
    ClassName()
    功能确定指定变量的类(数据类型)。
    语法ClassName(variable)
    参数variable:指定要确定其数据类型的变量返回值String。函数执行成功时返回指定变量的数据类型,发生错误时返回空字符串。如果参数variable的值为NULL,ClassName()函数返回NULL。用法需要注意的是,ClassName()函数不能确定枚举类型变量的类型,此时,ClassName()函数返回空字符串("")。
    DebugBreak()
    功能暂停程序执行,打开调试器,进入调试模式。
    语法DebugBreak ( )
    返回值无用法 DebugBreak()函数可以帮助你调试应用程序。如果你希望应用程序执行某条语句后暂停执行,然后进入调试模式,那么可以在该语句后面放上DebugBreak()函数,应用程序执行到DebugBreak()函数后,打开Debug(调试)窗口,并在其中显示当前上下文信息。这种方式实现了应用程序在PowerBuilder开发环境中的即时调试功能。
    IntHigh()
    功能得到Long型值的高位字。
    语法IntHigh ( long )
    参数long:long型值或变量返回值 Integer。函数执行成功时返回参数long的高位字,发生错误时返回-1。如果参数long的值为NULL,IntHigh()函数返回NULL。用法IntHigh()函数通常用于分解外部C或C++语言函数的返回值和Windows消息。
    IntLow()
    功能得到Long型值的低位字。
    语法IntLow ( long )
    参数long:long型值或变量返回值Integer。函数执行成功时返回参数long的低位字,发生错误时返回-1。如果参数long的值为NULL,IntLow()函数返回NULL。用法IntLow()函数通常用于分解外部C或C++语言函数的返回值和Windows消息。示例请参看IntHigh()函数。
    IsValid()
    功能检查对象变量是否已经实例化,即实例变量的值是否是个有效的对象句柄。
    语法IsValid ( objectname )
    参数objectname:要检测的对象名返回值Boolean。如果指定对象已经创建了对象实例,那么IsValid()函数返回TRUE,否则返回FALSE。如果参数objectname的值为NULL,IsValid()函数返回NULL。
    KeyDown()
    功能检查用户是否按了键盘上指定的键。
    语法KeyDown ( keycode )
    参数 keycode:KeyCode枚举类型或integer类型,指明要检测的按键或某个键的ASCII值返回值Boolean。如果用户按了keycode参数指定的按键,函数返回TRUE,否则返回FALSE。如果参数keycode的值为NULL,KeyDown()函数返回NULL。用法KeyDown()函数通常在某个事件的事件处理程序中调用,它并不指明用户键入了哪个字符,而是说明当前事件(即事件处理程序中调用KeyDown()函数的事件)发生时用户正按着哪个按键。一般来说,应用程序在窗口的Key事件或控件的按键事件中调用KeyDown()函数,以检测用户是否按了某个特殊键。对控件来说,PowerBuilder没有定义预定义的Key事件,这也没有关系,如果在控件得到焦点后希望应用程序检测用户的按键,只要对该控件定义一个用户事件,并把pbm_keydown (其它控件)或pbm_dwnkey(数据窗口控件)映射到该用户事件上即可。
    MessageBox()
    功能显示一个消息对话框。
    语法MessageBox(title,text{,icon{,button{,default}}})
    参数title:string类型,指定消息对话框的标题text:指定消息对话框中显示的消息,该参数可以是数值数据类型、字符串或boolean值icon:Icon枚举类型,可选项,指定要在该对话框左侧显示的图标button:Button枚举类型,可选项,指定显示在该对话框底部的按钮default:数值型,可选项,指定作为缺省按钮的按钮编号,按钮编号自左向右依次计数,缺省值为1,如果该参数指定的编号超过了显示的按钮个数,那么MessageBox()函数将使用缺省值返回值Integer。函数执行成功时返回用户选择的按钮编号(例如1、2、3等),发生错误时返回-1。如果任何参数的值为NULL,MessageBox()函数返回NULL。
    用法当你的应用程序需要显示一段简短信息(比如显示出错、警告等信息)时,没有必要自己从头创建窗口、安排控件,使用MessageBox()函数既简单又方便。用户只有响应该窗口后,程序才能继续运行下去。MessageBox()函数的icon参数指定显示在窗口中的图标,它是枚举类型,可能取值为:取值 图标Information! StopSign! Exclamation! Question! None! 无图标其中Information!是Icon参数的缺省值。Button参数指定在窗口中显示哪些按钮,有效取值为:取值中文Windows 95下显示OK!“确定”按钮OKCancel!“确定”、“取消”按钮YesNo!“是”、“否”按钮 YesNoCancel!“是”、“否”、“取消”按钮RetryCancel!“重试”、“取消”按钮AbortRetryIgnore!“终止”、“重试”、“忽略”按钮
    PixelsToUnits()
    功能 将像素值转换为PowerBuilder单位PBU。
    语法PixelsToUnits ( pixels, type )
    参数pixels:integer类型,指定要转换为PowerBuilder单位的像素数type:ConvertType枚举类型,指定按哪个方向进行转换。有效取值为:XPixelsToUnits! - 按水平方向转换像素;YPixelsToUnits! - 按垂直方向转换像素返回值Integer。函数执行成功时返回pixels参数指定像素数按指定方向转换成的PowerBuilder单位数,发生错误时返回-1。如果任何参数的值为NULL,PixelsToUnits()函数返回NULL。用法窗口中水平方向和垂直方向相同的像素数表示的距离并不相同。如果你使用水平方向和垂直方向相同的像素数绘制一个方框,那么你会看到,该方框不是正方形而是个矩形,而使用PBU计量的相同单位数将绘出正方形。因此,在进行单位转换时,需要指明按那么方向进行转换。
    PopulateError()
    功能以应用程序定制的错误号和错误信息填充Error对象,该函数不触发应用对象的SystemError事件。
    语法PopulateError ( number, text )
    参数number:integer类型,指定要保存到Error对象number属性中的值text:string类型,指定要保存到Error对象text属性中的值返回值Integer。函数执行成功时返回1,发生错误时返回-1。
    用法当应用程序需要根据变量的当前取值来定制Error对象时,可以使用PopulateError()函数来填充Error对象的number和text属性,同时该函数根据上下文自动填充Error对象的其它属性。定制了Error对象后,应用程序可以使用不带参数的SignalError()函数触发应用对象的SystemError事件。这样,在SystemError事件的事件处理程序中可以编写处理定制错误和系统错误的通用代码。如果应用程序没有对SystemError事件编写事件处理程序,那么SignalError()函数什么也不做。
    RGB()
    功能将代表红、绿、蓝三原色的三个整数组合成一个表示颜色的长整数。
    语法RGB ( red, green, blue )
    参数red:integer类型,指定颜色中的红色分量强度,有效值在0到255之间green:integer类型,指定颜色中的绿色分量强度,有效值在0到255之间blue:integer类型,指定颜色中的蓝色分量强度,有效值在0到255之间返回值Long。函数执行成功时返回由指定分量确定的颜色,用长整数表示。发生错误时返回-1。如果任何参数的值为NULL,RGB()函数返回NULL。
    用法RGB()函数使用下述公式计算表示颜色的长整数:65536 * Blue+ 256 * Green+ Red其中,Blue代表蓝色分量,Green代表绿色分量,Red代表红色分量。各分量中,数值越小,亮度越低,数值越大,亮度越高。例如,RGB ( 0, 0, 0 )为黑色(亮度最低),RGB ( 255, 255,255 )为白色(亮度最高)。
    SetNull()
    功能将指定变量的值设置为NULL。这里的变量可以是除数组、结构、自动实例化对象之外的任何数据类型。
    语法SetNull ( anyvariable )
    参数anyvariable:要将其值设置为NULL的变量返回值Integer。函数执行成功时返回1,发生错误时返回-1。如果任何参数的值为NULL,SetNull()函数返回NULL。用法PowerBuilder应用程序在说明变量时,并不自动地将其初值设置为NULL,而是根据类型的不同而设置不同的初值,比如,数值类型的变量自动初始化为0,字符串型变量自动初始化为空字符串("")。因此,如果需要将某个变量的值设置为NULL,就需要使用SetNull()函数来完成任务了。一般来说,NULL值往往应用在数据库值未确定的列上。
    SetPointer()
    功能设置鼠标指针。
    语法SetPointer ( type )
    参数type:Pointer枚举类型,指明要设置为哪种鼠标指针返回值Pointer。返回更换前的鼠标指针,以便于应用程序恢复原有指针。如果参数type的值为NULL,SetPointer()函数返回NULL。用法type参数的可能取值为:Arrow!、Cross!、Beam!、HourGlass!、SizeNS!、SizeNESW!、SizeWE!、SizeNWSE!、UpArrow!。
    SignalError()
    功能以编程方式触发应用对象的SystemError事件。
    语法SignalError ( { number }, { text } )
    参数number:integer类型,可选项,指定出错编号,该编号将保存到Error对象的number属性中text:string类型,可选项,指定出错信息,该信息将保存到Error对象的text属性中返回值Integer。函数执行成功时返回1,发生错误时返回-1。用法SignalError()函数通常用于测试应用程序的出错处理代码,它以人工方式产生错误,以此模拟应用程序运行过程中可能出现的错误。我们知道,应用程序本身产生错误的条件往往不容易在测试时遇到。当应用程序使用PopulateError()函数定制了Error对象后,可以以不带参数的方式调用SignalError()函数,由该函数触发应用对象的SystemError事件。如果我们在调用SignalError()函数时指定了参数number和text,那么SignalError()函数将根据上下文填充Error对象的所有属性,然后触发应用对象的SystemError事件。如果应用程序没有对应用对象的SystemError事件编写事件处理程序,那么SignalError()函数什么也不做。
    • UnitsToPixels()
      功能将PowerBuilder单位(PBU)转换为像素。
      语法UnitsToPixels ( units, type )
      参数units:integer类型,指定要转换为像素的PowerBuilder单位(PBU)数type:ConvertType枚举类型,指定按哪个方向进行转换。有效取值为:XUnitsToPixels! - 按水平方向转换PBU;YUnitsToPixels! - 按垂直方向转换PBU返回值Integer。函数执行成功时返回units参数指定PBU数按指定方向转换成的像素数,发生错误时返回-1。如果任何参数的值为NULL,UnitsToPixels()函数返回NULL。用法窗口中水平方向和垂直方向相同的像素数表示的距离并不相同。如果你使用水平方向和垂直方向相同的像素数绘制一个方框,那么你会看到,该方框不是正方形而是个矩形,而使用PBU计量的相同单位数将绘出正方形。因此,在进行单位转换时,需要指明按那么方向进行转换。
    Blob()
    Blob()功能将字符串转换成Blob类型数据。
    语法Blob ( text )
    参数text: string类型,指定要转换的数据返回值Blob。函数执行成功时返回转换后的Blob类型数据;如果text参数的值为NULL,则Blob()函数返回NULL。
    BlobEdit()
    功能将任意类型的数据插入到Blob类型变量的指定位置。
    语法BlobEdit ( blobvariable, n, data )
    参数blobvariable:Blob类型的已初始化变量,将向该变量中插入数据n:指定插入位置,有效值在1到4,294,967,295之间data:要插入到Blob类型变量中的数据,其数据类型可以是任何有效的PowerBuilder数据类型返回值Unsigned long。函数执行成功时返回下次可以插入数据的位置;如果blobvariable变量中空间不够或任何参数的值为NULL,则BlobEdit()函数返回NULL。
    BlobMid()
    功能从Blob变量中提取出一段数据。提取之后,原Blob变量内容不变。
    语法BlobMid ( data, n {, length } )
    参数data:Blob类型的数据n:指定要提取数据的起始位置,有效值在1到4,294,967,295之间length:可选项,指定要提取数据的长度,以字节为单位,有效值在1到4,294,967,295之间。缺省时提取从指定位置n到末尾的所有数据返回值Blob。函数执行成功时返回指定字节数的数据。如果n的值大于data的字节数,函数返回空。如果n与length的和超过了data数据的字节数,那么BlobMid()函数返回剩下的数据,数据长度将小于参数length的值。如果任何参数的值为NULL,则BlobMid()函数返回NULL。
    • Len()
      功能得到Blob类型变量的数据长度,以字节为单位。
      语法Len ( blob )
      参数blob:Blob类型变量返回值Long。函数执行成功时返回blob变量的长度,发生错误时返回-1。如果任何参数的值为NULL,则Len()函数返回NULL。用法如果在说明Blob类型的变量时指定了变量长度,那么对该变量来说,Len()函数得到的就是这个指定的长度。如果在变量说明时未指定变量长度,那么PowerBuilder在赋值时调整长度,未赋值Blob类型变量的长度为0。
    • String()
      功能将Blob类型变量的值转换成字符串类型。如果Blob类型变量的值不是文本型数据,String()函数将其值解释成字符。
      语法String ( blob )
      参数blob:要对其值进行类型转换的Blob类型变量返回值String。函数执行成功时返回转换后的数据,失败时返回空字符串("")。如果blob变量中包含的数据不是字符串类型的数据,那么String()函数尽可能把数据解释为字符,并返回字符串类型数据。如果blob参数的值为NULL,则String()函数返回NULL。
    Clipboard()
    功能提取或替换Windows系统剪贴板的文本内容。
    语法Clipboard ( { string } )
    参数string:string类型,可选项,指定要复制到系统剪贴板上的文本。如果剪贴板上已有内容的话,该文本将取代剪贴板的当前内容返回值String。函数执行成功时,如果剪贴板上包含文本数据,那么函数返回剪贴板的当前内容;如果剪贴板上包含非文本数据(比如位图)或不包含任何数据,那么函数返回空字符串("")。如果string参数的值为NULL,Clipboard()函数返回NULL。用法无论是否指定string参数,Clipboard()都将返回剪贴板的当前内容。当指定string参数时,剪贴板的原有内容被string参数的值取代;省略string参数时,仅仅得到剪贴板的内容。
    CommandParm()
    功能得到应用程序运行时指定的命令参数。
    语法CommandParm ( )
    返回值String。函数执行成功时返回应用程序运行时的命令行参数,函数执行错误或没有命令行参数时函数返回空字符串("")。用法命令行参数是应用程序启动时跟在应用程序名称后面的任何参数,比如,在运行窗口中输入了下述命令:MyAppl C:/EMPLOYEE/EMPLIST.TXT那么MyAppl应用程序中使用CommandParm()函数得到的命令行参数为:C:/EMPLOYEE/EMPLIST.TXT当应用程序的命令行中包含几个参数时,CommandParm()函数作为一个字符串返回所有参数。利用字符串操作函数可以分离各参数。在应用对象的Open事件中没有必要执行CommandParm()函数。此时,Open事件的argument参数中包含了命令行参数。
    DoScript()
    功能执行AppleScript程序段,该函数只在Macintosh平台上有效。
    语法DoScript ( script, result )
    参数script:string类型,指定要运行的程序段(script)result:string类型,由AppleScript程序段返回的结果信息或出错信息返回值Integer。返回由AppleScript返回的结果代码。如果任何参数的值为NULL,DoScript()函数返回NULL。
    GetApplication()
    功能得到当前应用对象的句柄,这样你可以查询或设置应用对象的属性(通常用于编写通用代码)。
    语法GetApplication ( )
    返回值Application。返回当前应用对象的句柄。
    GetEnvironment()
    功能得到操作系统、处理器、屏幕显示等与系统相关的信息。
    语法GetEnvironment ( environmentinfo )
    参数environmentinfo:Environment对象名,用于保存系统环境信息返回值Integer。函数执行成功时返回1,发生错误时返回-1。如果参数environmentinfo的值为NULL,GetEnvironment()函数返回NULL。用法当开发交叉平台项目时,利用GetEnvironment()函数,应用程序能够得到当前运行的操作系统、使用的CPU类型、操作系统的版本、屏幕的大小以及颜色数等信息,这些信息的具体表示请参阅本书环境对象(Environment Object)的介绍。
    GetFocus()
    功能确定当前焦点位于哪个控件上。
    语法GetFocus ( )
    返回值GraphicObject。函数执行成功时返回当前得到焦点控件的引用,发生错误时返回无效引用。用法应用程序利用IsValid()函数可以检测GetFocus()是否返回有效的控件引用。同时,使用TypeOf()函数可以确定控件的类型。
    Post()
    功能将指定消息加入到某个窗口的消息队列中,这个窗口既可以是PowerBuilder应用的窗口,也可以是其它应用的窗口。
    语法Post( handle, messageno, word, long )
    参数handle:long类型,指定窗口的系统句柄,将向该窗口邮寄消息messageno:UnsignedInteger类型,指定要邮寄的消息号 word:long类型,指定与消息一起邮寄的word类参数值。如果messageno参数指定的消息不使用该参数,那么将这个参数的值设置为0long:long类型或string,指定与消息一起邮寄的long型参数值或字符串返回值Boolean。如果任何参数的值为NULL,Post()函数返回NULL。
    用法Post()函数用于向窗口发送非PowerBuilder预定义事件的消息,这个窗口可以是PowerBuilder应用的窗口,也可以是其它应用的窗口。Post()函数把发送的消息放置在指定窗口消息队列的尾部,然后返回到应用程序中,它并不等待相应事件事件处理程序的执行。这一点与Send()函数不同,Send()函数直接触发指定窗口相应的事件,执行事件处理程序后返回到调用应用中。因此,我们说Post()函数采用的是异步方式,Send()函数采用的是同步方式。Post()函数的参数handle指定接收消息的窗口句柄,对PowerBuilder窗口来说,使用Handle()函数可以得到该句柄。对其它应用程序的窗口来说,可以调用系统API函数查找窗口并得到相应窗口的句柄。如果应用程序要邮寄PowerBuilder定义事件(包括预定义事件和用户定义事件),那么使用PostEvent()函数既简单有方便。当应用程序在long参数位置指定一个字符串时,Post()函数复制一个该字符串的副本,然后将副本的地址传送给指定窗口。
    ProfileInt()
    功能从初始化文件(.ini)中读取整型设置值。
    语法ProfileInt ( filename, section, key, default )
    参数filename:string类型,指定初始化文件的名称,可以包括路径,省略路径时,该函数按操作系统的标准路径搜索指定文件section:string类型,指定要得到的值所在的节(Section)key:string类型,指定要得到的值的名称,不用区分大小写default:integer类型,当指定的文件、节名、项目名不存在或不能转换为整数时,函数返回该参数指定的值返回值Integer。函数执行成功时,在指定的文件、节名、项目名不存在任何错误的情况下,函数返回相应项的值;如果指定的文件、节名、项目名不存在或不能转换为整数时,函数返回default参数指定的缺省值。如果发生错误,函数返回-1。如果任何参数的值为NULL,ProfileInt()函数返回NULL。
    ProfileString()
    功能从初始化文件(.ini)中读取字符串型设置值。
    语法ProfileString ( filename, section, key, default )
    参数filename:string类型,指定初始化文件的名称,可以包括路径,省略路径时,该函数按操作系统的标准路径搜索指定文件section:string类型,指定要得到的值所在的节(Section)key:string类型,指定要得到的值的名称,不用区分大小写default:string类型,当指定的文件、节名、项目名不存在时,函数返回该参数指定的值返回值String。函数执行成功时,在指定的文件、节名、项目名不存在任何错误的情况下,函数返回相应项的值;如果指定的文件、节名、项目名不存在,函数返回default参数指定的缺省值。如果发生错误,函数返回空字符串。如果任何参数的值为NULL,ProfileString()函数返回NULL。
    Restart()
    功能停止所有程序段的执行、关闭所有窗口、提交事务、断开与数据库的连接,然后重新启动应用程序。
    语法Restart()
    返回值Integer。函数执行成功时返回1,发生错误时返回-1。
    Run()
    功能运行指定的应用程序。
    语法Run ( string {, windowstate } )
    参数string:string类型,指定要运行的应用程序的名称,其中可以包括路径以及相应的参数,就像在命令行中键入的那样windowstate:WindowState枚举类型,可选项,指定程序运行时的窗口状态。有效取值为:Maximized! - 最大化窗口;Minimized! - 最小化窗口;Normal! - 缺省值,正常窗口返回值Integer。函数执行成功时返回1,发生错误时返回-1。如果任何参数的值为NULL,Run()函数返回NULL。
    用法使用Run()函数,应用程序能够启动操作系统中的任何程序。当在Run()参数中指定了要启动应用程序的参数时,参数的意义、格式、个数等由具体的应用程序确定。如果在Run()函数的string参数中指定了文件名但没有给出扩展名时,PowerBuilder认为该文件的扩展名为.EXE。要运行扩展名不是.EXE的应用程序(比如.BAT, .COM, 或.PIF),必须在Run()函数的参数中指定文件的扩展名。
    Send()
    功能向窗口发送指定的消息并立即执行相应的事件处理程序。
    语法Send( handle, messageno, word, long )
    参数handle:long类型,指定窗口的系统句柄,将向该窗口发送消息messageno:UnsignedInteger类型,指定要发送的消息号word:long类型,指定与消息一起发送的word类参数值。如果messageno参数指定的消息不使用该参数,那么将这个参数的值设置为0long:long类型或string,指定与消息一起发送的long型参数值或字符串返回值Long。函数执行成功时返回Windows系统调用SendMessage()的返回值,发生错误时返回-1。如果任何参数的值为NULL,Send()函数返回NULL。
    用法Send()函数用于向窗口发送非PowerBuilder预定义事件的消息,这个窗口可以是PowerBuilder应用的窗口,也可以是其它应用的窗口。Send()函数直接触发指定窗口相应的事件,执行事件处理程序后返回到调用应用中,这一点与Post()函数不同,Post()函数把发送的消息放置在指定窗口消息队列的尾部,然后返回到应用程序中,它并不等待相应事件事件处理程序的执行。因此,我们说Post()函数采用的是异步方式,Send()函数采用的是同步方式。Send()函数的参数handle指定接收消息的窗口句柄,对PowerBuilder窗口来说,使用Handle()函数可以得到该句柄。对其它应用程序的窗口来说,可以调用系统API函数查找窗口并得到相应窗口的句柄。实际上,Send()函数把它的各个参数直接传送给Windows的系统调用SendMessage()。在各种C++开发工具的WINDOWS.H文件中可以查到各消息编号。如果应用程序要发送PowerBuilder定义事件(包括预定义事件和用户定义事件),那么使用TriggerEvent()函数既简单有方便。当应用程序在long参数位置指定一个字符串时,Send()函数复制一个该字符串的副本,然后将副本的地址传送给指定窗口。
    SetProfileString()
    功能设置初始化文件中指定项的值。
    语法SetProfileString ( filename, section, key, value )
    参数filename:string类型,指定初始化文件的名称,可以包括路径,省略路径时,该函数按操作系统的标准路径搜索指定文件section:string类型,指定要设置的值所在的节(Section)key:string类型,指定要设置的值的名称,不用区分大小写default:string类型,指定要设置项的值返回值Integer。函数执行成功时返回1,指定的文件未找到或指定的文件不能访问时函数返回-1。如果任何参数的值为NULL,SetProfileString()函数返回NULL。
    ShowHelp()
    功能显示应用程序帮助,该帮助使用Microsoft Windows帮助系统进行操作。
    语法ShowHelp ( helpfile, helpcommand {, typeid } )
    参数helpfile:string类型,指定帮助文件的名称helpcommand:HelpCommand枚举类型,指定显示帮助的格式。有效取值为:Index! - 显示目录主题,使用该值时不要指定typeid参数;Keyword! - 转移到由指定关键字确定的主题;Topic! - 显示指定主题的帮助typeid:可选项,指定帮助主题返回值Integer。函数执行成功时返回1,发生错误时返回-1。如果任何参数的值为NULL,ShowHelp()函数返回NULL。
    SignalError()
    功能触发应用对象的SystemError事件,通常用于代码调试。
    语法SignalError ( { number }, { text } )
    参数number:integer类型,可选项,其值将保存到Error对象的number属性中text:string类型,可选项,其值将保存到Error对象的text属性中返回值Integer。函数执行成功时返回1,发生错误时返回-1。
    • Yield()
      功能将控制权转移给其它图形对象,包括非PowerBuilder对象。该函数检测消息队列,如果有消息,就把消息取出。利用该函数可以在执行耗时较长的操作时把控制权转让给其它应用。
      语法Yield()
      返回值Boolean。如果在消息队列中提取到了消息,那么函数返回TRUE,否则返回FALSE。用法正常情况下,PowerBuilder应用程序在执行一段代码(比如函数或事件处理程序)的过程中不响应用户的操作。对耗时短暂的代码段来说,这种处理方式没有什么不妥的地方,但是,如果某个代码段的执行耗时较长,应用程序又希望为用户提供更多的控制权,那么需要在这段代码中插入Yield()函数,让用户能够进行其它操作,特别在循环执行的代码中更应该如此。应用程序执行Yield()函数后,如果发现消息队列中存在消息,它将允许对象处理这些消息,处理之后,继续Yield()函数后面代码的执行。因此,代码中插入Yield()函数将降低应用程序的运行效率。
    Close()
    功能关闭窗口并释放窗口以及窗口上的控件所占据的内存。
    语法Close(windowname)
    参数windowname:要关闭窗口的名称返回值Integer。函数执行成功时返回1,发生错误时返回-1。如果参数windowname的值为NULL,Close()函数返回NULL。
    用法应用程序使用Open()或其它Open簇函数打开窗口后,不需要窗口时,可以使用Close()关闭窗口并释放窗口以及窗口上所有控件占据的内存。Close()函数的执行过程为:如果要关闭窗口的CloseQuery和/或Close事件已经编写了事件处理程序,那么执行这些事件处理程序,从屏幕上删除要关闭的窗口、关闭窗口、之后执行调用Close()函数语句后面的语句。当窗口被关闭后,应用程序就不能再访问已经关闭窗口的属性、实例变量、对象函数、以及窗口上的控件了。如果关闭窗口后应用程序依然访问上述特性,那么将引发运行错误。当然,应用程序也可以阻止窗口被关闭,方法很简单,只要在欲阻止关闭窗口的CloseQuery事件处理程序中使用RETURN语句返回1即可,格式为:RETURN1
    CloseWithReturn()
    功能关闭窗口并将返回值保存在Message对象中,该函数只能对响应窗口使用。
    语法CloseWithReturn ( windowname, returnvalue)
    参数windowname:要关闭窗口的名称returnvalue:指定关闭窗口时保存到Message对象中的值,调用CloseWithReturn()函数的代码段通过查看Message对象属性的值得到关闭窗口时被关闭窗口传递的值。returnvalue参数必须是下述三种类型之一:String、Numeric、PowerObject返回值Integer。函数执行成功时返回1,发生错误时返回-1。如果参数任何的值为NULL,CloseWithReturn()函数返回NULL。
    Open()
    功能 打开窗口。该函数有两种语法格式:
    语法一、打开编程时已知数据类型的窗口对象;
    语法二、打开程序运行后才能确定数据类型的窗口对象。下面分别予以介绍:
    语法一、打开编程时已知数据类型的窗口对象
    语法Open ( windowvar {, parent } )
    参数windowvar:要打开窗口的窗口名,可以使用窗口画笔定义的窗口对象名,也可以使用该窗口对象的某个变量。Open()函数把打开窗口的引用放置到windowvar变量中parent:可选项,指定要打开窗口的父窗口,要打开窗口成为父窗口的子窗口,只有当要打开窗口需要成为某个窗口的子窗口时才需要指定该参数。如果应用程序使用Open()函数打开某个子窗口或弹出窗口而又省略了该参数,那么当前活动窗口成为被打开窗口的父窗口返回值Integer。函数执行成功时返回1,发生错误时返回-1。如果任何参数的值为NULL,Open()函数返回NULL。
    语法二、打开程序运行后才能确定数据类型的窗口对象
    语法Open ( windowvar, windowtype {, parent } )
    参数windowvar:指定窗口变量名,Open()函数把打开窗口的引用放置到该变量中windowtype:string类型,指定要打开窗口的数据类型,该参数指定的窗口数据类型必须与windowvar参数的类型相同或是windowvar类型的后继对象parent:可选项,指定要打开窗口的父窗口,要打开窗口成为父窗口的子窗口,只有当要打开窗口需要成为某个窗口的子窗口时才需要指定该参数。如果应用程序使用Open()函数打开某个子窗口或弹出窗口而又省略了该参数,那么当前活动窗口成为被打开窗口的父窗口返回值Integer。函数执行成功时返回1,发生错误时返回-1。如果任何参数的值为NULL,Open()函数返回NULL。
    OpenSheet()
    功能在MDI框架窗口中打开MDI子窗口,并在指定菜单中创建选择该子窗口的菜单项。
    语法OpenSheet(sheetrefvar{,windowtype},mdiframe{,position{,arrangeopen}})
    参数sheetrefvar:指定要作为工作表打开的窗口名windowtype:string类型,可选项,指定要打开窗口的类型(也就是窗口画笔中保存的窗口对象名)mdiframe:指定要放置工作表的MDI框架窗口名position:可选参数,指定所打开的工作表的名称作为一个菜单项显示在第几个菜单标题下面,缺省时,被放在倒数第二个菜单标题下,原因是,大多数商业软件的最后两个菜单标题是Window和Help,把工作表的名称放到Window菜单标题中用于选择工作表窗口是个合情合理的选择arrangeopen:ArrangeOpen枚举类型,可选参数,但如果选用了此参数,那么position参数也必须同时指定。arrangeopen参数告诉系统如何显示打开的工作表返回值Integer。函数执行成功时返回1,发生错误时返回-1。如果参数任何的值为NULL,OpenSheet()函数返回NULL。
    用法arrangeopen参数的可能取值为:Cascaded!把一个工作表放在另一个的上面,每个都向右下方偏移一点,这样所有工作表的标题栏用户都能看到。该值是OpenSheet()函数的缺省选择。Layered!将工作表显示在客户区的左上角,并最大化工作表,使其充满MDI框架窗口的整个客户区。Original!操作动作与Cascaded!参数相同,只是不放大窗口,而以窗口定义时的大小显示。
    OpenSheetWithParm()
    功能 在MDI框架窗口中打开MDI子窗口,同时把参数保存在Message对象中进行传递。
    语法OpenSheetWithParm(sheetrefvar,parameter{,windowtype},mdiframe{,position{,arrangeopen}}
    参数sheetrefvar:指定要作为工作表打开的窗口名parameter:指定要传递给打开工作表的数据,该数据保存在Message对象的属性中, parameter参数的数据类型必须是下述三种类型之一:String、Numeric、PowerObjectwindowtype:string类型,可选项,指定是要打开窗口的类型(也就是窗口画笔中保存的窗口对象名)mdiframe:指定要放置工作表的MDI框架窗口名position:可选参数,指定所打开的工作表的名称作为一个菜单项显示在第几个菜单标题下面,缺省时,被放在倒数第二个菜单标题下,原因是,大多数商业软件的最后两个菜单标题是Window和Help,把工作表的名称放到Window菜单标题中用于选择工作表窗口是个合情合理的选择arrangeopen:ArrangeOpen枚举类型,可选参数,但如果选用了此参数,那么position参数也必须同时指定。arrangeopen参数告诉系统如何显示打开的工作表返回值Integer。函数执行成功时返回1,发生错误时返回-1。如果参数任何的值为NULL,OpenSheet()函数返回NULL。
    用法arrangeopen参数的可能取值为:Cascaded!把一个工作表放在另一个的上面,每个都向右下方偏移一点,这样所有工作表的标题栏用户都能看到。该值是OpenSheet()函数的缺省选择。Layered!将工作表显示在客户区的左上角,并最大化工作表,使其充满MDI框架窗口的整个客户区。Original!操作动作与Cascaded!参数相同,只是不放大窗口,而以窗口定义时的大小显示。
    • OpenWithParm()
      功能带参数打开窗口,与打开窗口的Open()函数相似,OpenWithParm()有两种语法格式:
      语法一、带参数打开编程时已知数据类型的窗口对象;
      语法二、带参数打开程序运行后才能确定数据类型的窗口对象。下面分别予以介绍:
      语法一、带参数打开编程时已知数据类型的窗口对象
      语法OpenWithParm(windowvar,parameter{,parent})
      参数windowvar:要打开窗口的窗口名,可以使用窗口画笔定义的窗口对象名,也可以使用该窗口对象的某个变量。Open()函数把打开窗口的引用放置到windowvar变量中parameter:指定要传递给打开窗口的数据,该数据保存在Message对象的属性中,parameter参数的数据类型必须是下述三种类型之一:String、Numeric、PowerObjectparent:可选项,指定要打开窗口的父窗口,要打开窗口成为父窗口的子窗口,只有当要打开窗口需要成为某个窗口的子窗口时才需要指定该参数。如果应用程序使用Open()函数打开某个子窗口或弹出窗口而又省略了该参数,那么当前活动窗口成为被打开窗口的父窗口返回值Integer。函数执行成功时返回1,发生错误时返回-1。如果任何参数的值为NULL,OpenWithParm()函数返回NULL。
      用法消息对象Message有三个属性用于存储OpenWithParm()函数传递给打开窗口的数据。根据parameter参数数据类型的不同,该参数的值保存在Message对象的不同属性中。
      语法二、带参数打开程序运行后才能确定数据类型的窗口对象
      语法OpenWithParm(windowvar,parameter,windowtype{,parent})
      参数windowvar:指定窗口变量名,Open()函数把打开窗口的引用放置到该变量中parameter:指定要传递给打开窗口的数据,该数据保存在Message对象的属性中,parameter参数的数据类型必须是下述三种类型之一:String、Numeric、PowerObjectwindowtype:string类型,指定要打开窗口的数据类型,该参数指定的窗口数据类型必须与windowvar参数的类型相同或是windowvar类型的后继对象parent:可选项,指定要打开窗口的父窗口,要打开窗口成为父窗口的子窗口,只有当要打开窗口需要成为某个窗口的子窗口时才需要指定该参数。如果应用程序使用Open()函数打开某个子窗口或弹出窗口而又省略了该参数,那么当前活动窗口成为被打开窗口的父窗口返回值Integer。函数执行成功时返回1,发生错误时返回-1。如果任何参数的值为NULL,OpenWithParm()函数返回NULL。
    CloseChannel()
    功能关闭先前用OpenChannel()函数打开的DDE服务器的通道。
    语法CloseChannel ( handle {, windowhandle } )
    参数handle:long类型,通道句柄,指明要关闭的DDE通道windowhandle:long类型,可选项,指明用做DDE客户的PowerBuilder窗口的窗口句柄返回值Integer。函数执行成功时返回1,发生错误时返回下述值之一:-2通道不能被关闭-3不能确认服务器-9Handle参数的值为NULL
    ExecRemote()
    功能请求DDE服务器应用程序执行命令。该函数有两种语法格式:语法一、直接向DDE服务器应用发送一条命令(冷连接方式);语法二、应用程序打开某个通道后向DDE服务器应用发送命令(热连接方式)。下面分别予以介绍。
    语法一、直接向DDE服务器应用发送一条命令(冷连接方式);
    语法ExecRemote ( command, applname, topicname )
    参数command:string类型,其值为希望DDE服务器应用执行的命令,命令格式和语法需要参看DDE服务器应用的文档applname:string类型,指定服务器应用的DDE名称topicname:string类型,指定命令中要使用的DDE应用的数据或实例返回值Integer。函数执行成功时返回1,发生错误时返回下述值之一:-1未启动连接-2请求被拒绝-3不能终止服务器如果任何参数的值为NULL,ExecRemote()函数返回NULL。
    语法二、应用程序打开某个通道后向DDE服务器应用发送命令(热连接方式)
    语法ExecRemote ( command, handle {, windowhandle } )
    参数command:string类型,其值为希望DDE服务器应用执行的命令,命令格式和语法需要参看DDE服务器应用的文档handle:long类型,指定使用的DDE通道句柄windowhandle:long类型,可选项,指明用做DDE客户的PowerBuilder窗口的窗口句柄。省略该参数时,当前应用中的活动窗口用做DDE客户返回值Integer。函数执行成功时返回1,发生错误时返回下述值之一:-1未启动连接-2请求被拒绝-9handle参数的值为NULL
    GetDataDDE()
    功能从热连接服务器应用中获取数据,并将其保存到指定的字符串变量中。
    语法GetDataDDE ( string )
    参数string:string类型变量,用于保存接收到的数据返回值Integer。函数执行成功时返回1,发生错误时返回-1。如果任何参数的值为NULL,GetDataDDE()函数返回NULL。
    GetDataDDEOrigin()
    功能确定来自热连接DDE服务器应用的数据源,成功时将应用的DDE标识保存在参数指定的变量中。
    语法GetDataDDEOrigin ( applstring, topicstring, itemstring )
    参数applstring:string类型变量,用于保存服务器应用的名称topicstring:string类型变量,用于保存主题(比如,在Excel中,主题可以是REGION.XLS)itemstring:string类型变量,用于保存数据项标识(比如,在Excel中,数据项标识可以是R1C2)返回值Integer。函数执行成功时返回1,发生错误时返回-1。如果任何参数的值为NULL,GetDataDDEOrigin()函数返回NULL。
    GetRemote()
    功能请求服务器应用传送数据,该函数有两种格式:语法一、请求DDE服务器应用提供数据并将数据保存在变量中,该格式不要求事先打开通道,适用于仅发出少数几个请求的情况;语法二、请求DDE服务器应用提供数据并将数据保存在变量中,该格式适用于热连接的情况,即应用程序已经与服务器建立通道。下面分别予以介绍。
    语法一、请求DDE服务器应用提供数据并将数据保存在变量中,该格式不要求事先打开通道,适用于仅发出少数几个请求的情况。
    语法GetRemote ( location, target, applname, topicname )
    参数location:string类型,指明要从DDE服务器的哪个位置返回数据。位置的表达方式由具体的DDE服务器决定target:string类型变量,用于保存返回的数据applname:string类型,指定DDE服务器应用的DDE名称topicname:string类型,指定命令中要使用的DDE应用的数据或实例返回值Integer。函数执行成功时返回1,发生错误时返回下述值之一:-1未启动连接-2请求被拒绝如果任何参数的值为NULL,GetRemote()函数返回NULL。
    语法二、请求DDE服务器应用提供数据并将数据保存在变量中,该格式适用于热连接的情况,即应用程序已经与服务器建立通道。语法GetRemote ( location, target, handle {, windowhandle } )参数location:string类型,指明要从DDE服务器的哪个位置返回数据。位置的表达方式由具体的DDE服务器决定target:string类型变量,用于保存返回的数据handle:long类型,指定使用的DDE通道句柄 windowhandle:long类型,可选项,指明用做DDE客户的PowerBuilder窗口的窗口句柄。省略该参数时,当前应用中的活动窗口用做DDE客户。使用handle()函数可以得到窗口句柄。返回值Integer。函数执行成功时返回1,发生错误时返回下述值之一:-1未启动连接-2请求被拒绝-9Handle参数的值为NULL
    OpenChannel()
    功能打开连接DDE服务器的通道。
    语法OpenChannel ( applname, topicname {, windowhandle } )applname:string类型,指定DDE服务器应用的DDE名称topicname:string类型,指定命令中要使用的DDE应用的数据或实例windowhandle:long类型,可选项,指明用做DDE客户的PowerBuilder窗口的窗口句柄。省略该参数时,当前应用中的活动窗口用做DDE客户返回值Long。函数执行成功时返回一个正数作为已打开通道的句柄,发生错误时返回下述值之一:-1打开失败-9句柄为NULL
    RespondRemote()
    功能发送一条DDE消息,指示是否接受来自远程DDE应用的命令或数据。
    语法RespondRemote ( boolean )
    参数boolean:其值为boolean量的逻辑表达式,TRUE表示接收先前收到的命令或数据,FALSE表示不接收先前收到的命令或数据返回值Integer。函数执行成功时返回1,发生错误时返回-1。如果boolean参数的值为NULL,RespondRemote()函数返回NULL。
    SetRemote()
    功能请求服务器应用把指定项设置为指定值。该函数有两种语法格式:语法一、请求DDE服务器应用接收保存在指定位置的数据,该格式不要求事先打开通道,适用于仅发出少数几个请求的情况;语法二、请求DDE服务器应用接收保存在指定位置的数据,该格式适用于热连接的情况,即应用程序已经与服务器建立通道。下面分别予以介绍。
    语法一、请求DDE服务器应用接收保存在指定位置的数据,该格式不要求事先打开通道,适用于仅发出少数几个请求的情况。
    语法SetRemote ( location, value, applname, topicname )
    参数location:string类型,指明要DDE服务器的哪一部分接收数据。位置的表达方式由具体的DDE服务器决定value:string类型变量,指定发送给DDE服务器的数据applname:string类型,指定DDE服务器应用的DDE名称topicname:string类型,指定要接收数据的DDE应用的数据或实例返回值Integer。函数执行成功时返回1,发生错误时返回下述值之一:-1未启动连接-2请求被拒绝如果任何参数的值为NULL,SetRemote()函数返回NULL。
    语法二、请求DDE服务器应用接收保存在指定位置的数据,该格式适用于热连接的情况,即应用程序已经与服务器建立通道。
    语法SetRemote ( location, value, handle {, windowhandle } )
    参数location:string类型,指明要DDE服务器的哪一部分接收数据。位置的表达方式由具体的DDE服务器决定value:string类型变量,指定发送给DDE服务器的数据handle:long类型,指定使用的DDE通道句柄windowhandle:long类型,可选项,指明用做DDE客户的PowerBuilder窗口的窗口句柄。省略该参数时,当前应用中的活动窗口用做DDE客户返回值Integer。函数执行成功时返回1,发生错误时返回下述值之一:-1未启动连接-2请求被拒绝-9Handle参数的值为NULL
    StartHotLink()
    功能建立与DDE服务器应用的热连接,热连接建立之后,DDE服务器端相关数据的变化会立即触发PowerBuilder应用相关窗口的HotLinkAlarm事件。
    语法StartHotLink ( location, applname, topic )
    参数location:string类型,指明DDE服务器哪一部分数据变化时触发窗口的HotLinkAlarm事件。位置的表达方式由具体的DDE服务器决定applname:string类型,指定DDE服务器应用的DDE名称topicname:string类型,指定数据改变将触发窗口的HotLinkAlarm事件的DDE应用的数据或实例返回值Integer。函数执行成功时返回1,发生错误时返回下述值之一:-1无指定服务器-2请求被拒绝如果任何参数的值为NULL,StartHotLink()函数返回NULL。
    • StopHotLink()
      功能关闭与DDE服务器应用的热连接。
      语法StopHotLink ( location, applname, topic )
      参数location:string类型,指明要终止DDE服务器哪一部分的热连接。位置的表达方式由具体的DDE服务器决定applname:string类型,指定DDE服务器应用的DDE名称topicname:string类型,指定要终止热连接的DDE应用的数据或实例返回值Integer。函数执行成功时返回1,发生错误时返回下述值之一:-1连接未曾启动-2请求被拒绝-3不能终止服务器如果任何参数的值为NULL,StopHotLink()函数返回NULL。 
       
    CPU()
    功能得到自当前应用程序启动后开始CPU所消耗的时间,以毫秒为单位。
    语法CPU()
    返回值Long。返回自当前应用程序启动后开始CPU所消耗的时间,以毫秒为单位。
    Idle()
    功能该函数在用户每次活动(例如,按键盘、移动鼠标等)后重置定时器,n秒后触发应用对象的Idle事件。
    语法Idle ( n )
    参数n:指定空闲时间间隔,以秒为单位。该参数的值设置为0时,停止空闲检测,不再触发应用对象的Idle事件返回值Integer。函数执行成功时返回1,此时启动定时器。如果不能启动定时器或定时器未启动而n的值指定为0时,函数返回-1。如果任何参数的值为NULL,Idle()函数返回NULL。用法利用Idle()函数,应用程序可以构造自己的屏幕保护程序,避免安全数据的泄露。当使用Idle()函数已经启动了定时器后,如果再次以非0参数调用Idle()函数,那么该函数重设时间间隔,但并不启动新的定时器。Idle()函数启动定时器后,如果在指定的时间间隔(从用户最近一次操作算起)内没有操作应用程序,那么就触发应用对象的Idle事件,在这个事件中可以编写关闭窗口、退出数据库登录等一系列代码,然后使用Restart()函数重新启动应用程序,起到保密的目的。发生下述任何情况时,系统自动重置定时器(即重新开始计时):n 用户在该应用程序的任何窗口内移动鼠标或单击鼠标(双击鼠标时首先触发单击事件)n 在该应用程序的某个窗口是当前窗口时用户按下了任意一个或多个键n 在该应用程序的窗口最小化时,用户在该应用的图标上单击鼠标或移动鼠标n 在该应用程序的窗口最小化并且该应用程序是当前应用程序(应用名称被加亮显示)时,用户按了任何按键n 可视数据窗口检索数据时引起的编辑控件(指漂浮在数据窗口当前行/列上的编辑控件)重绘操作
    • Timer()
      功能 在指定的时间间隔内反复触发指定窗口的定时器事件。
      语法Timer ( interval {, windowname } )
      参数interval:指定两次触发Timer事件之间的时间间隔,有效值在0到65之间。如果该参数的值指定为0,那么关闭定时器,不再触发指定窗口的Timer事件windowname:窗口名,指定时间间隔到时要触发哪个窗口的Timer事件。省略该参数时,触发当前窗口的Timer事件返回值Integer。函数执行成功时返回1,发生错误时返回-1。如果任何参数的值为NULL,Timer()函数返回NULL。用法使用Timer()函数可以周期性地触发指定窗口的Timer事件,这样,每当时间间隔过去时,应用程序都可以完成一些周期性的工作,比如绘制简单动画等。将Timer()的interval参数设置为非0值时启动定时器并开始计时;将该函数的interval参数设置为0时关闭定时器,终止计时任务。需要注意的是,在Microsoft Windows系统中,该函数能够计时的最小时间间隔为0.055秒(约1/18秒),如果把interval参数的值设置小于0.055,那么该定时器将每隔0.055秒触发一次窗口的Timer事件。Microsoft Windows 3.x最多只支持系统中同时启动16个定时器。
    Day()
    功能得到日期型数据中的号数(1到31之间的整数值)。
    语法Day ( date )
    参数date:要得到号数的日期值返回值 Integer。函数执行成功时返回号数(1到31之间的整数值)。如果date参数的值为NULL,则Day()函数返回NULL。
    DayName()
    功能得到指定日期是一周中的星期几(例如,Sunday, Monday...)。
    语法DayName ( date )
    参数date:date类型值或变量返回值String。函数执行成功时返回指定日期的星期表示(例如,Sunday, Monday...)。如果date参数的值为NULL,则DayName()函数返回NULL。
    DayNumber()
    功能得到日期型数据是一星期中的第几天(用1到7之间的整数表示,星期天为1,星期一为2,...)。
    语法DayNumber ( date )
    参数date:date类型值或变量返回值Integer。函数执行成功时返回指定日期是一星期中的第几天(用1~7表示,星期天为1,星期一为2,...)。如果date参数的值为NULL,则DayNumber()函数返回NULL。
    DaysAfter()
    功能得到两个日期间的天数。
    语法DaysAfter ( date1, date2 )
    参数date1:date类型,指定起始日期date2:date类型,指定终止日期返回值Long。函数执行成功时得到两个日期之间的天数。如果date2的日期在date1的前面,那么DaysAfter()函数返回负值。如果任何参数的值为NULL,则DaysAfter()函数返回NULL。
    Hour()
    功能得到时间值中的小时,采用24小时制。
    语法Hour ( time )
    参数time:time类型的值返回值Integer。函数执行成功时得到time参数中的小时(00到23之间)。如果time参数的值为NULL,则Hour()函数返回NULL。
    Minute()
    功能得到时间值中的分钟,有效值在00~59之间。
    语法Minute ( time )
    参数time:time类型的值返回值Integer。函数执行成功时得到time参数中的分钟(00到59之间)。如果time参数的值为NULL,则Minute()函数返回NULL。
    Month()
    功能得到日期值中的月份,有效值在1~12之间。
    语法Month ( date )
    参数date:date类型的值返回值Integer。函数执行成功时得到date参数中的月份(1到12之间)。如果date参数的值为NULL,则Month()函数返回NULL。
    Now()
    功能得到客户机的当前系统时间,返回值为Time类型。
    语法Now()返回值Time。该函数返回客户机的当前系统时间。
    RelativeDate()
    功能得到指定日期前多少天或后多少天的日期。
    语法RelativeDate(date,n)
    参数date:Date类型,指定基准日期n:integer类型,指定天数返回值Date。当n的值大于0时返回参数date指定日期后第n天的日期;当n的值小于0时返回参数date指定日期前第n天的日期。如果任何参数的值为NULL,则RelativeDate()函数返回NULL。
    RelativeTime()
    功能得到指定时间前多少秒或后多少秒的时间,采用24小时制。
    语法RelativeTime ( time, n )参数time:time类型,指定基准时间n:long类型,指定秒数返回值Time。当n的值大于0时返回参数time指定时间后第n秒的时间;当n的值小于0时返回参数time指定时间前第n秒的时间。如果任何参数的值为NULL,则RelativeTime()函数返回NULL。
    Second()
    功能得到时间值中的秒,有效值在00~59之间。
    语法Second ( time )
    参数time:time类型的值返回值Integer。函数执行成功时得到time参数中的秒(00到59之间)。如果time参数的值为NULL,则Second()函数返回NULL。
    Today()
    功能得到当前系统日期,在某些情况下,同时得到当前系统时间。
    语法Today()返回值Date。该函数返回当前系统日期。用法单独调用Today()函数时,该函数总是返回当前系统日期,但是,虽然Today()函数的返回值类型为Date,在该函数用做某些函数的参数、而该参数要求DateTime类型的值时,Today()函数也能够在返回当前系统日期的同时返回当前系统时间。再如,Today()函数作为数据窗口控件SetItem()函数的参数,该函数参数中指定的数据窗口列的数据类型为DateTime,那么当前系统日期和时间将同时设置到数据窗口指定项中。
    • Year()
      功能得到日期值中的年度(有效取值1000到3000)。
      语法Year(date)
      参数date:date类型的值返回值Integer。函数执行成功时得到date参数中的年份(采用四位数字),发生错误时返回1900,如果date参数的值为NULL,则Year()函数返回NULL。用法当应用程序把有两位数字表示年份的字符串转换成日期时,PowerBuilder根据下述规则选择世纪:如果年份值在00到49之间,PowerBuilder将年份中的世纪(前两位数字)当作20;如果年份值在50到99之间,PowerBuilder将年份中的世纪(前两位数字)当作19。比如,字符串"20-10-25"被PowerBuilder转换为2020-10-25;字符串"98-10-25"被PowerBuilder转换为1998-10-25。因此,如果应用程序中需要指定1950年之前的日期,应该使用四位数字表示年份,以避免引起歧义。PowerBuilder能够处理的年份从1000到3000之间。 
       
    FileClose()
    功能关闭先前用FileOpen()函数打开的文件。
    语法FileClose ( fileno )
    参数fileno:integer,指定要关闭文件的文件句柄,该句柄使用FileOpen()函数打开文件时得到返回值Integer。函数执行成功时返回1,发生错误时返回-1。如果fileno参数的值为NULL,那么FileClose()函数返回NULL。
    FileDelete()
    功能删除指定的文件。
    语法FileDelete ( filename )
    参数filename:string类型,指定要删除文件的文件名,其中可以包含路径返回值Boolean。函数执行成功时返回TRUE,发生错误时返回FALSE。如果filename参数的值为NULL,那么FileDelete()函数返回NULL。
    FileExists()
    功能检查指定的文件是否存在。
    语法FileExists ( filename )
    参数filename:string类型,指定要检查存在性的文件的文件名,其中可以包含路径返回值Boolean。如果指定文件存在时返回TRUE,不存在时返回FALSE。如果filename参数的值为NULL,那么FileExists()函数返回NULL。用法如果filename参数指定的文件被另一个应用加锁锁住,那么FileExists()函数也将返回FALSE。
    FileLength()
    功能得到指定文件的长度(以字节为单位)。
    语法FileLength ( filename )
    参数filename:string类型,指定要得到其长度的文件的文件名,其中可以包含路径返回值Long。函数执行成功时返回指定文件的长度(以字节为单位)。如果指定的文件不存在,函数返回-1。如果filename参数的值为NULL,那么FileLength()函数返回NULL。
    FileOpen()
    功能以指定的读写方式打开指定的文件,同时返回该文件的句柄。
    语法FileOpen(filename{,filemode{,fileaccess{,filelock{,writemode,{creator,filetype}}}}})
    参数filename:string类型,指定要打开文件的名称,其中可以包含路径 filemode:FileMode枚举类型,可选项,指定文件打开方式。有效取值为:?LineMode! - 缺省值,行模式;?StreamMode! - 流模式fileaccess:FileAccess枚举类型,可选项,指定文件访问方式。有效取值为:?Read! - 缺省值,只读方式,这样打开的文件只能进行读操作;?Write! - 只写方式,这样打开的文件只能进行写操作?filelock:FileLock枚举类型,可选项,指定文件加锁方式。有效取值为:n LockReadWrite! - 缺省值,只有打开该文件的用户能够访问该文件,其它用 户对该文件的访问均被拒绝;n LockRead! - 只有打开该文件的用户能够读该文件,但其它任何用户均可写该文件;n LockWrite! - 只有打开该文件的用户能够写该文件,但其它任何用户均可读该文件;n Shared! - 所有用户均可读写该文件writemode:WriteMode枚举类型,可选项,当fileaccess参数指定为Write!时,该参数指定在指定文件已经存在时数据的添加方式。有效取值为:?Append! - 缺省值,将数据添加到原文件尾部;?Replace! - 覆盖原有数据creator:可选项,用于Macintosh机,使用四个字符的字符串指定文件的创建者。指定该参数后,必须同时指定filetype参数filetype:可选项,用于Macintosh机,使用四个字符的字符串指定文件类型返回值Integer。函数执行成功时返回打开文件的句柄,随后的文件操作函数利用该句柄完成对文件的操作。发生错误时函数返回-1。如果任何参数的值为NULL,那么FileOpen()函数返回NULL。用法当文件以行模式打开时,每执行一次FileRead()函数读取一行数据;每执行一次FileWrite()函数,该函数自动在写出的字符串末尾增加一个回车(CR)换行(LF)符(这是应用程序在Windows 系统中运行时的情况,在UNIX下只加一个换行字符)。当文件以流模式打开时,执行一次FileRead()函数读取32,765个字节的数据,如果余下数据没有这么多,那么FileRead()函数就读取所有余下的数据;执行一次FileWrite()函数时,最多可写入32,765个字节的数据,并且不添加回车换行字符。当文件以写方式使用FileOpen()函数打开时,如果指定的文件不存在,那么FileOpen()函数创建该文件。
    FileRead()
    功能从指定文件中读取数据。
    语法FileRead ( fileno, variable )
    参数fileno:integer类型,指定文件句柄(由FileOpen()函数得到)variable:string或blob类型的变量,用于保存读取的数据返回值Integer。函数执行成功时返回读取的字符数或字节数;如果在读取任何字符前读到了文件结束符(EOF),则FileRead()函数返回-100;当指定文件以行模式打开时,如果在读取任何字符之前遇到了回车(CR)或换行(LF)字符,则FileRead()函数返回0。如果发生其它错误,FileRead()函数返回-1。如果任何参数的值为NULL,那么FileRead()函数返回NULL。用法当指定文件以行模式(Line Mode)打开时,FileRead()函数一次读取一行数据,并把它保存到参数variable中,然后跳过行结束符(回车换行符,操作系统不同,使用的字符也不同),把文件指针移动到下一行的起始位置。当文件以流模式(Stream Mode)打开时,FileRead()函数或一直读取到文件结尾,或读取32,765字节的数据,决定于两者哪个数据长度更短些。
    FileSeek()
    功能将文件指针移动到指定位置。读写文件时相应函数会自动移动文件指针。
    语法FileSeek ( fileno, position, origin )
    参数fileno:integer类型,指定文件句柄(由FileOpen()函数得到)position:long类型,指定相对于origin参数指定位置的新位置偏移量,以字节为单位origin:SeekType枚举类型,指定从哪里开始移动文件指针,即指针移动的基准。有效取值为:?FromBeginning! - 缺省值,从文件开头移动指针;?FromCurrent! - 从当前位置移动文件指针;?FromEnd! - 从文件结尾处移动文件指针返回值Long。函数执行成功时返回指针移动后的指针位置。如果任何参数的值为NULL,那么FileSeek()函数返回NULL。
    FileWrite()
    功能向指定文件中写数据。
    语法FileWrite (fileno , variable )
    参数fileno:integer类型,指定文件句柄(由FileOpen()函数得到)variable:string或blob类型,其值将写入fileno参数指定的文件返回值Integer。函数执行成功时返回写入文件的字符或字节数,发生错误时返回-1。如果任何参数的值为NULL,那么FileWrite()函数返回NULL。用法FileWrite()函数从当前文件指针开始写入指定数据,写入之后,将文件指针调整到刚刚写入数据的下一个字节位置。当文件以writemode参数设置为Replace!方式打开时,文件指针最初位于文件的开头位置;当文件以writemode参数设置为Append!方式打开时,文件指针最初位于文件的结尾位置。当文件以行模式打开时,执行FileWrite()函数时,该函数自动在每次写入数据的后面加上回车换行符,并把文件指针移动到回车换行符后面。当文件以流模式打开时,FileWrite()函数一次最多写入32,765个字节。如果variable参数中数据的长度超过了32,765个字节,那么FileWrite()函数只向文件中写入前32,765个字符并返回32,765。
    GetFileOpenName()
    功能显示打开文件对话框,让用户选择要打开的文件。
    语法GetFileOpenName(title,pathname,filename{,extension{,filter}})
    参数title:string类型,指定对话框的标题pathname:string类型变量,用于保存该对话框返回的文件路径及文件名filename:string类型变量,用于保存该对话框返回的文件名extension:string类型,可选项,使用1到3个字符指定缺省的扩展文件名 filter:string类型,可选项,其值为文件名掩码,指定显示在该对话框的列表框中供用户选择的文件名满足的条件(比如*.*,*.TXT,*.EXE等)返回值Integer。函数执行成功时返回1;当用户单击了对话框上的“Cancel”按钮时函数返回0;发生错误时返回-1。如果任何参数的值为NULL,那么GetFileOpenName()函数返回NULL。
    用法filter参数的格式为:description,*. ext缺省值为:"All Files (*.*),*.*"其中,description说明扩展名的意义,比如“所有文件”、“文本文件”等。你可以根据需要指定在打开文件对话框中显示的文件名类型。当需要指定多种文件类型时,各类型之间使用逗号分隔,例如:"PIF 文件, *.PIF, 批处理文件, *.BAT"需要注意的是,该函数只是得到一个文件名,而并没有打开文件,需要打开文件时,依然需要使用FileOpen()函数。
    • GetFileSaveName()
      功能显示保存文件对话框,让用户选择要保存到的文件。
      语法GetFileSaveName(title,pathname,filename{,extension{,filter}})
      参数title:string类型,指定对话框的标题pathname:string类型变量,用于保存该对话框返回的文件路径及文件名filename:string类型变量,用于保存该对话框返回的文件名extension:string类型,可选项,使用1到3个字符指定缺省的扩展文件名filter:string类型,可选项,其值为文件名掩码,指定显示在该对话框的列表框中供用户选择的文件名满足的条件(比如*.*,*.TXT,*.EXE等)返回值Integer。函数执行成功时返回1;当用户单击了对话框上的“Cancel”按钮时函数返回0;发生错误时返回-1。如果任何参数的值为NULL,那么GetFileSaveName()函数返回NULL。
      用法filter参数的格式为:description,*. ext缺省值为:"All Files (*.*),*.*"其中,description说明扩展名的意义,比如“所有文件”、“文本文件”等。你可以根据需要指定在打开文件对话框中显示的文件名类型。当需要指定多种文件类型时,各类型之间使用逗号分隔,例如:"PIF 文件, *.PIF, 批处理文件, *.BAT"需要注意的是,该函数只是得到一个文件名,而并没有打开文件,需要打开文件时,依然需要使用FileOpen()函数。
    Fill()
    功能建立一个由指定字符串填充的指定长度的字符串。
    语法Fill ( chars, n )
    参数chars:string类型,指定用于重复填充的字符串n:long类型,指定由该函数返回的字符串的长度返回值String。函数执行成功时返回n个字符的字符串,该字符串以参数chars中的字符串重复填充而成。如果参数chars中的字符个数多于n个,那么使用chars字符串的前n个字符填充函数返回的字符串;如果参数chars中的字符个数少于n个,那么使用chars字符串反复填充,直到返回的字符串长度达到n为止。如果任何参数的值为NULL,Fill()函数返回NULL。
    Left()
    功能得到字符串左部指定个数的字符。
    语法Left ( string, n )
    参数string:string类型,指定要提取子串的字符串n:long类型,指定子串长度返回值String。函数执行成功时返回string字符串左边n个字符,发生错误时返回空字符串("")。如果任何参数的值为NULL,Left()函数返回NULL。如果n的值大于string字符串的长度,那么Left()函数返回整个string字符串,但并不增加其它字符。
    LeftTrim()
    功能返回指定字符串删除了左部空格后的字符串。
    语法LeftTrim ( string )
    参数string:string类型,指定要删除左部空格的字符串返回值String。函数执行成功时返回删除了string字符串左部空格的字符串,发生错误时返回空字符串("")。如果任何参数的值为NULL,LeftTrim()函数返回NULL。
    Len()
    功能得到字符串的长度。
    语法Len (string)
    参数string:string类型变量返回值Long。函数执行成功时返回字符串的长度,发生错误时返回-1。如果任何参数的值为NULL,则Len()函数返回NULL。
    Lower()
    功能将字符串中的大写字母转换为小写字母。
    语法Lower ( string )
    参数string:要将其中的大写字母转换为小写字母的字符串返回值String。函数执行成功时返回将大写字母转换为小写字母后的字符串,发生错误时返回空字符串("")。如果string参数的值为NULL,Lower()函数返回NULL。
    Match()
    功能确定字符串中是否包含指定模式的字符。
    语法Match ( string, textpattern )
    参数string:string类型,指定要检查是否匹配指定模式的字符串textpattern:string类型,指定文本匹配模式返回值Boolean:如果字符串string与模式textpattern相匹配,则函数返回TRUE,否则返回FALSE。如果指定的匹配模式无效或上述两个参数中的任何一个未曾赋值,那么Match()函数返回FALSE。如果任何参数的值为NULL,Match()函数返回NULL。
    用法textpattern参数的写法与正则表达式十分相似,它由元字符和普通字符组成。每个元字符都有不同的匹配含义,普通字符则与其自身相匹配。下面是匹配模式中使用的元字符及其意义:
    ^指示字符串的开始,例如,^asd表示以asd开头的字符串,字符串asdfgh与模式^asd匹配,而字符串basdfg与模式^asd不匹配。
    $指示字符串的结束,例如,red$表示所有以red结束的字符串均与该模式匹配,而redo与模式red$不匹配。
    .匹配任意单个字符,例如,^&&$匹配任何六个字符组成的字符串。
    []匹配括号中列出的字符,例如,^[ABC]$匹配由一个字符组成的字符串,其值只能是A或B或C。
    -与方括号一起,指定匹配字符的范围,例如,^[A-Z]$只匹配那些由一个大写字母组成的字符串。方括号里还可以使用^字符,表示匹配不在指定范围内的任何字符,例如,[^0-9]匹配除数字外的任何字符。
    *,+,?这些符号跟在一个字符后面表示该字符可以出现的次数。星号(*)表示可以出现0次或任意次;加号(+)表示可以出现多次,但至少出现一次;问号(?)表示出现0次或一次。例如,A*匹配0个或多个A(没有A、A、AA、AAA、AAAA、**);A+匹配1个或多个A(A、AA、AAA、AAAA、**);A?匹配空串或1个A。
    /斜杠(/)是转义字符,它去掉特殊字符的特殊含义,比如,模式/$匹配字符$,模式//匹配字符/。
    Mid()
    功能取字符串的子串。
    语法Mid ( string, start {, length } )
    参数string:string类型,指定要从中提取子串的字符串start:long类型,指定子串第一个字符在string字符串中的位置,第一个位置为1length:long类型,可选项,指定子串的长度返回值String。函数执行成功时返回string字符串中从start位置开始、长度为length的子串。如果start参数的值大于string中字符个数,那么Mid()函数返回空字符串。如果省略了length参数或length参数的值大于从start开始、string字符串中余下字符的长度,那么Mid()函数返回所有余下的字符。如果任何参数的值为NULL,Mid()函数返回NULL。
    Pos()
    功能在一个字符串中查找所包含的另一个字符串的起始位置。
    语法Pos ( string1, string2 {, start } )
    参数string1:string类型,指定要从中查找子串string2的字符串string2:string类型,指定要在string1中查找的字符串start:long类型,可选项,指定从string1的第几个字符开始查找。缺省值为1返回值Long。函数执行成功时返回在start位置后string2在string1中第一次出现的起始位置。如果在string1中按指定要求未找到string2、或start的值超过了string1的长度,那么Pos()函数返回0。如果任何参数的值为NULL,Pos()函数返回NULL。
    用法Pos()函数在字符串查找时区分大小写,因此,"aa"不匹配"AA"。
    Replace()
    功能将一个字符串中指定个数的字符串替换为另一个字符串。
    语法Replace ( string1, start, n, string2 )
    参数string1:string类型,指定要使用string2替换其中一部分内容的字符串start:long类型,指定要从哪个字符位置开始替换字符串,字符串中第一个字符的位置为1n:long类型,指定要替换多少个字符string2:string类型,指定用哪个字符串替换string1的部分字符返回值String。函数执行成功时返回替换后的字符串,发生错误时返回空字符串("")。如果任何参数的值为NULL,Replace()函数返回NULL。用法如果start参数指定的位置超过了string1的长度,那么Replace()函数把将string2拼接到string1的后面形成的字符串返回。如果n的值为0,那么Replace()函数把string2插入到string1指定位置后形成的字符串返回。
    Right()
    功能从字符串右端取指定个数字符。
    语法Right ( string, n )
    参数string:string类型,指定要提取子串的字符串n:long类型,指定子串长度返回值String。函数执行成功时返回string字符串右边n个字符,发生错误时返回空字符串("")。如果任何参数的值为NULL,Right()函数返回NULL。如果n的值大于string字符串的长度,那么Right()函数返回整个string字符串,但并不增加其它字符。
    RightTrim()
    功能删除字符串尾部空格。
    语法RightTrim ( string )
    参数string:string类型,指定要删除右部空格的字符串返回值String。函数执行成功时返回删除了string字符串右部空格的字符串,发生错误时返回空字符串("")。如果任何参数的值为NULL,RightTrim()函数返回NULL。
    Space()
    功能生成一个由空格组成的指定字符个数的字符串。
    语法Space ( n )
    参数n:long类型,指定要填充的空格个数,也就是填充后返回的字符串的长度返回值String。函数执行成功时返回由n个空格组成的字符串,发生错误时返回空字符串。如果参数n的值为NULL,Space()函数返回NULL。
    Trim()
    功能删除字符串首部和尾部的空格。
    语法Trim ( string )
    参数string:string类型,指定要删除首部和尾部空格的字符串返回值String。函数执行成功时返回删除了string字符串首部和尾部空格的字符串,发生错误时返回空字符串("")。如果任何参数的值为NULL,Trim()函数返回NULL。
    • Upper()
      功能将字符串中的小写字母转换为大写字母。
      语法Upper( string )
      参数string:要将其中的小写字母转换为大写字母的字符串返回值String。函数执行成功时返回将小写字母转换为大写字母后的字符串,发生错误时返回空字符串("")。如果string参数的值为NULL,Upper()函数返回NULL。 
       
    GetCommandDDE()
    功能得到DDE客户应用发送的命令。
    语法GetCommandDDE ( string )
    参数string:string类型的变量,用于保存DDE客户应用发送的命令返回值Integer。函数执行成功时返回1,发生错误时返回-1。如果string参数的值为NULL, GetCommandDDE()函数返回NULL。用法当DDE客户应用向DDE服务器应用发送一条命令时,这个动作将触发DDE服务器应用活动窗口的RemoteExec事件,在这个事件的事件处理程序中,可以使用GetCommandDDE()函数得到DDE客户应用发送的命令。
    GetCommandDDEOrigin()
    功能确定哪一个DDE客户应用向服务器发送了命令。
    语法GetCommandDDEOrigin ( applstring )
    参数applstring:string变量,用于保存发送命令的DDE客户应用的名称返回值Integer。函数执行成功时返回1,发生错误时返回-1。如果applstring参数的值为 NULL,GetCommandDDEOrigin()函数返回NULL。
    GetDataDDE()
    功能得到DDE客户应用发送的数据。
    语法GetDataDDE ( string )
    参数string:string类型变量,用于保存接收到的数据返回值Integer。函数执行成功时返回1,发生错误时返回-1。如果任何参数的值为NULL, GetDataDDE()函数返回NULL。
    GetDataDDEOrigin() 功能确定哪个DDE客户应用发送了数据。
    语法GetDataDDEOrigin ( applstring, topicstring, itemstring )
    参数applstring:string类型变量,用于保存客户应用的名称topicstring:string类型变量,用于保存主题(比如,在Excel中,主题可以是REGION.XLS)itemstring:string类型变量,用于保存数据项标识(比如,在Excel中,数据项标识可能是R1C2)返回值Integer。函数执行成功时返回1,发生错误时返回-1。如果任何参数的值为NULL,GetDataDDEOrigin()函数返回NULL。
    RespondRemote()
    功能向客户端应用指明最近的命令或数据是否已经接收。
    语法RespondRemote ( boolean )
    参数boolean:其值为boolean量的逻辑表达式,TRUE表示接收先前收到的命令或数据,FALSE表示不接收先前收到的命令或数据返回值Integer。函数执行成功时返回1,发生错误时返回-1。如果boolean参数的值为NULL,RespondRemote()函数返回NULL。
    SetDataDDE()
    功能向DDE客户应用发送数据。
    语法SetDataDDE ( string {, applname, topic, item } )
    参数string:指定要发送到DDE客户应用的数据applname:string类型,可选项,指定接收数据的客户应用的DDE名称topic:string类型,可选项,指定基础数据组item:string类型,可选项,指定基础数据组中的数据项返回值Integer。函数执行成功时返回1,发生错误时返回下述值之一:-1函数调用的环境不对-2数据未被接收如果任何参数的值为NULL,SetDataDDE()函数返回NULL。
    StartServerDDE()
    功能将当前应用设置为DDE服务器。
    语法StartServerDDE ( { windowname, } applname, topic {, item } )
    参数windowname:可选项,指定服务器窗口名,缺省值为当前窗口applname:当前应用的DDE名称topic:string类型,指定DDE客户应用能够引用的基本数据组item:由逗号(,)分隔的一个或多个字符串,指定服务器应用支持的数据项返回值Integer。函数执行成功时返回1,发生错误时返回-1,表示当前应用已经设置为DDE服务器。如果任何参数的值为NULL,StartServerDDE()函数返回NULL。
    • StopServerDDE()
      功能停止当前应用的DDE服务器功能。执行该函数后,发给该应用的任何DDE客户应用请求都将失败。
      语法StopServerDDE ( { windowname, } applname, topic )
      参数windowname:可选项,指定要关闭服务器功能的服务器窗口名,缺省值为当前窗口,如果当前应用有多个服务器窗口,那么必须指定该参数applname:当前应用的DDE名称topic:string类型,应该与StartServerDDE()中对应参数相同返回值Integer。函数执行成功时返回1,发生错误时返回-1,表示当前应用未曾作为DDE服务器启动。如果任何参数的值为NULL,StopServerDDE()函数返回NULL。
    IsAllArabic()
    功能确定指定的字符串是否全部由阿拉伯文字符组成,该函数只能在PowerBuilder的阿拉伯文版本中使用。
    语法IsAllArabic ( string )
    参数string:要测试的字符串返回值Boolean。如果string的内容全部由阿拉伯文字符组成,那么函数返回TRUE,否则返回FALSE。字符串中如果包含数字、空格、标点符号,那么该函数也返回FALSE。如果PowerBuilder不是阿拉伯文版本,该函数总是返回FALSE。
    IsAllHebrew()
    功能确定指定的字符串是否全部由希伯来文字符组成,该函数只能在PowerBuilder的希伯来文版本中使用。
    语法IsAllHebrew( string )
    参数string:要测试的字符串返回值Boolean。如果string的内容全部由希伯来文字符组成,那么函数返回TRUE,否则返回FALSE。字符串中如果包含数字、空格、标点符号,那么该函数也返回FALSE。如果PowerBuilder不是希伯来文版本,该函数总是返回FALSE。
    IsAnyArabic()
    功能确定指定的字符串中是否包含阿拉伯文字符,该函数只能在PowerBuilder的阿拉伯文版本中使用。
    语法IsAnyArabic( string )
    参数string:要测试的字符串返回值Boolean。如果string中至少包含一个阿拉伯文字符成,那么函数返回TRUE,否则返回FALSE。如果PowerBuilder不是阿拉伯文版本,该函数总是返回FALSE。
    IsAnyHebrew()
    功能确定指定的字符串中是否包含希伯来文字符,该函数只能在PowerBuilder的希伯来文版本中使用。
    语法IsAnyArabic( string )
    参数string:要测试的字符串返回值 Boolean。如果string中至少包含一个希伯来文字符,那么函数返回TRUE,否则返回FALSE。如果PowerBuilder不是希伯来文版本,该函数总是返回FALSE。
    IsArabic()
    功能确定指定的字符是否是阿拉伯文字符,如果参数为字符串,则只检查左边第一个字符是否是阿拉伯文字符。该函数只能在PowerBuilder的阿拉伯文版本中使用。
    语法IsArabic ( character )
    参数character:要测试的字符或字符串返回值Boolean。如果character是阿拉伯文字符,那么函数返回TRUE,否则返回FALSE。如果PowerBuilder不是阿拉伯文版本,该函数总是返回FALSE。
    IsArabicAndNumbers()
    功能确定指定的字符串是否全部由阿拉伯文字符或数字组成,该函数只能在PowerBuilder的阿拉伯文版本中使用。
    语法IsArabicAndNumbers ( string )
    参数string:要测试的字符串返回值Boolean。如果string的内容全部由阿拉伯文字符或数字组成,那么函数返回TRUE,否则返回FALSE。如果PowerBuilder不是阿拉伯文版本,该函数总是返回FALSE。
    IsHebrew()
    功能确定指定的字符是否是希伯来文字符,如果参数为字符串,则只检查左边第一个字符是否是希伯来文字符。该函数只能在PowerBuilder的希伯来文版本中使用。
    语法IsArabic ( character )
    参数character:要测试的字符或字符串返回值Boolean。如果character是希伯来文字符,那么函数返回TRUE,否则返回FALSE。如果PowerBuilder不是希伯来文版本,该函数总是返回FALSE。
    IsHebrewAndNumbers()
    功能确定指定的字符串是否全部由希伯来文字符或数字组成,该函数只能在PowerBuilder的希伯来文版本中使用。
    语法IsArabicAndNumbers ( string )
    参数string:要测试的字符串返回值Boolean。如果string的内容全部由希伯来文字符或数字组成,那么函数返回TRUE,否则返回FALSE。如果PowerBuilder不是希伯来文版本,该函数总是返回FALSE。
    Reverse()
    功能颠倒字符串中字符次序。
    语法Reverse ( string )
    参数string:要颠倒字符次序的字符串返回值String。函数执行成功时返回颠倒字符次序后的字符串,如果发生错误,那么返回空字符串("")。用法Reverse()函数将一个字符串中最后一个字符放置到另一个字符串的第一个字符位置、倒数第二个字符放置在另一个字符串的第二个字符位置,以此类推。
    ToAnsi()
    功能将Unicode字符转换成ANSI字符。
    语法ToAnsi ( string )
    参数string:要进行转换的Unicode编码的字符串返回值Blob。函数执行成功时返回指定字符串对应的ANSI编码的blob类型数据,发生错误时返回空值(NULL)。
    • ToUnicode()
      功能将ANSI字符转换成Unicode字符。
      语法ToUnicode( blob)
      参数blob:要进行转换的ANSI编码的blob类型数据返回值String。函数执行成功时返回指定字符串对应的Unicode编码的字符串,发生错误时返回空字符串。 
       
    LibraryCreate()
    功能创建一个空的PowerBuilder应用库,并可根据需要在创建应用库的同时添加库注解。
    语法LibraryCreate ( libraryname{, comments } )
    参数libraryname:string类型,指定要创建应用库的名称,可以带上路径,不带路径时在当前目录下创建应用库comments:string类型,可选项,指定要创建的应用库的注解返回值Integer。函数执行成功时返回1,发生错误时返回-1。如果任何参数的值为NULL,LibraryCreate()函数返回NULL。用法LibraryCreate()函数在指定路径下创建一个空的PowerBuilder应用库(PBL)。如果在指定应用库名称时没有指定文件的扩展名,那么该函数自动加上扩展名.PBL。
    LibraryDelete()
    功能删除应用库库文件或应用库中的数据窗口对象。
    语法LibraryDelete ( libraryname{, objectname, objecttype } )
    参数libraryname:string类型,指定库名,可以带上路径,不带路径时在系统搜索路径下查找应用库objectname:string类型,可选项,指定要从库中删除的数据窗口对象的名称objecttype:LibImportType类型,可选项,指定要删除对象的类型,目前仅支持ImportDataWindow!返回值Integer。函数执行成功时返回1,发生错误时返回-1。如果任何参数的值为NULL,LibraryDelete()函数返回NULL。
    用法执行LibraryDelete()函数时,如果未指定后两个参数,那么该函数删除指定的应用库;如果指定了后两个参数,那么该函数删除指定应用库中指定的数据窗口对象。LibraryDelete()函数只能删除应用库中的数据窗口对象,如果想删除其它对象,那么只能在PowerBuilder开发环境中使用库管理画笔(Library Painter)来实现了。
    LibraryDirectory()
    功能 得到应用库中指定对象的信息列表,内容包括对象名称、最近修改日期和时间、以及对象的注释。
    语法LibraryDirectory ( libraryname, objecttype )
    参数libraryname:string类型,指定PowerBuilder应用库的名称,如果名称中未指定路径,那么该函数根据操作系统标准的文件搜索路径查找指定文件objecttype:LibDirType枚举类型,指定希望函数列出的对象类型,有效取值请参看用法。返回值String。函数执行成功时返回一个字符串,每个对象占用一行,行中各信息之间使用Tab字符(~t)分隔。行中信息格式为:对象名~t修改日期/时间~t注释~n发生错误时函数返回空字符串("")。如果任何参数的值为NULL,LibraryDirectory()函数返回NULL。
    用法LibraryDirectory()函数的objecttype参数是个LibDirType枚举类型的量,其有效取值为:DirAll!得到所有对象的信息DirApplication!得到应用对象的信息DirDataWindow!得到所有数据窗口对象的信息DirFunction!得到所有函数对象的信息DirMenu!得到所有菜单对象的信息DirPipeline!得到所有数据管道对象的信息DirProject!得到工程对象的信息DirQuery!得到所有查询对象的信息DirStructure!得到所有结构对象的信息DirUserObject!得到所有用户对象的信息DirWindow!得到所有窗口对象的信息使用LibraryDirectory()函数得到指定对象的名称、修改日期/时间以及可能的注释后,应用程序既可以使用Pos()函数进行定位和字符串分割,也可以使用数据窗口的ImportString()函数将结果显示在数据窗口中。
    LibraryExport()
    功能从指定应用库中以对象的语法定义格式卸出对象。
    语法LibraryExport ( libraryname, objectname, objecttype )
    参数libraryname:string类型,指定要移出对象的应用库的名称,如果名称中未指定路径,那么该函数根据操作系统标准的文件搜索路径查找指定文件objectname:string类型,指定要移出对象的名称objecttype :LibExportType枚举类型,指定要移出对象的类型,具体取值请参看用法返回值String。函数执行成功时返回指定对象的语法,该语法与使用库管理画笔(Library Painter)移出对象时的语法相同,区别在于LibraryExport()函数省略了移出语法的头部。如果发生错误,则函数返回空字符串("")。如果任何参数的值为NULL,LibraryExport()函数返回NULL。
    用法LibraryExport()的objecttype参数的可能取值为: ExportApplication!应用对象ExportDataWindow!数据窗口对象ExportFunction!函数对象ExportMenu!菜单对象ExportPipeline!数据管道对象ExportProject!工程对象ExportQuery!查询对象ExportStructure!结构对象ExportUserObject!用户对象ExportWindow!窗口对象
    • LibraryImport()
      功能将以语法格式表示的数据窗口对象装入指定的应用库中。
      语法LibraryImport(libraryname,objectname,objecttype,syntax,errors{,comments } )
      参数libraryname:string类型,指定要移入对象的应用库的名称,如果名称中未指定路径,那么该函数根据操作系统标准的文件搜索路径查找指定文件objectname:string类型,指定要移入的数据窗口对象的名称 objecttype:LibImportType枚举类型,指定要移入对象的类型,目前该函数只支持ImportDataWindow!,表示只能向应用库中移入数据窗口对象syntax:string类型,指定要移入数据窗口对象的语法errors:string类型变量,用于在发生错误时保存出错信息comments:string类型,可选项,用于指定移入对象的注解返回值Integer。函数执行成功时返回1,发生错误时返回-1。如果任何参数的值为NULL,LibraryImport()函数返回NULL。
      用法当应用程序在运行过程中动态创建数据窗口对象后,可以使用LibraryImport()函数把动态数据窗口对象的定义保存到应用库中,以后就可以直接使用该对象了。
    LowerBound()
    LowerBound()功能得到指定数组第n维的下界。
    语法LowerBound ( array {, n } )
    参数array:数组名n:数值类型,可选项,指定要得到数组哪一维的下界。缺省值为1返回值Long。函数执行成功时返回array数组第n维的下界。如果n的值超过了指定数组的最大维数,那么该函数返回-1。如果任何参数的值为NULL,LowerBound()函数返回NULL。
    • UpperBound()
      UpperBound()功能得到指定数组第n维的上界。
      语法UpperBound( array {, n } )
      参数array:数组名n:数值类型,可选项,指定要得到数组哪一维的上界。缺省值为1 返回值Long。函数执行成功时返回array数组第n维的上界。如果n的值超过了指定数组的最大维数,那么该函数返回-1。如果任何参数的值为NULL,UpperBound()函数返回NULL。
    Print()
    功能以当前字体在打开的打印作业中打印一行或多行文本。
    语法Print(printjobnumber,{tab1,}string{,tab2})
    参数printjobnumber:用PrintOpen()函数打开的打印作业号tab1:Integer类型,可选项,指定文本开始打印的位置,在开始打印字符串之前将打印光标移动到该位置,从打印区的左边界开始计算,以千分之一英寸为单位。如果打印光标已经位于指定位置、或打印光标已经超过了指定位置、或省略了该参数,那么,Print()函数从打印光标的当前位置开始打印string:string类型,指定要打印的字符串。如果字符串中包括回车换行字符(~r~n),那么该字符串将被分成多行输出,但是,除第一行之外,其它行忽略tab1参数指定的起始打印位置tab2:Integer类型,可选项,指定字符串打印结束后打印光标移动到的位置,从打印区的左边界开始计算,以千分之一英寸为单位。如果打印光标已经超过了指定位置,那么Print()函数忽略该参数,打印光标位于已打印字符串的尾部。如果省略了该参数,Print()函数把打印光标移动到下一行的起始位置。返回值Integer。函数执行成功时返回1,发生错误时返回-1。如果任何参数的值为NULL,Print()函数返回NULL。用法在打印作业中,PowerBuilder使用打印光标来跟踪打印位置。打印光标保存了即将打印区域左上角的坐标。使用Print()函数打印文本后,PowerBuilder自动更新打印光标。PowerBuilder使用行距来决定打印出的两行文本之间的距离,行距与字符的高度成比例,缺省的行距是字符高度的1.2倍。使用PrintSetSpacing()函数可以改变行距。当Print()函数在下一行打印输出时,它把打印光标的x坐标设置为0、y坐标增加当前行距指示的数值。由于每打印一行时Print()函数都自动调整打印光标的y坐标位置,因此,该函数会自动处理分页,因此,应用程序没有必要调用PrintPage()函数进行分页。打印区由纸张的物理尺寸和边界空白决定,PrintSend()函数能够发送具体打印机的ESC控制序列,使用这个函数可以改变边界空白的大小。另外,在打印开始之前,使用PrintDefineFont()和PrintSetFont()函数可以改变Print()使用的字体。
    PrintBitmap()
    功能在打印区域的指定位置打印位图。
    语法PrintBitmap ( printjobnumber, bitmap, x, y, width, height )
    参数printjobnumber:用PrintOpen()函数打开的打印作业号bitmap:string类型,指定要打印的位图文件的文件名x:integer类型,指定位图起始打印位置的x坐标,以千分之一英寸为单位y:integer类型,指定位图起始打印位置的y坐标,以千分之一英寸为单位width:integer类型,指定位图的打印宽度,以千分之一英寸为单位。如果该参数的值指定为0,那么按图像的原始宽度打印height:integer类型,指定位图的打印高度,以千分之一英寸为单位。如果该参数的值指定为0,那么按图像的原始高度打印返回值Integer。函数执行成功时返回1,发生错误时返回-1。如果任何参数的值为NULL,PrintBitmap()函数返回NULL。用法执行PrintBitmap()函数后,打印光标的位置不变,依然停留在执行该函数前的位置上。
    PrintCancel()
    功能取消用PrintOpen()函数启动的打印作业。
    语法PrintCancel ( printjobnumber )
    参数printjobnumber:要取消的打印作业的作业号返回值Integer。函数执行成功时返回1,发生错误时返回-1。如果参数printjobnumber的值为NULL,PrintCancel()函数返回NULL。用法PrintCancel()函数取消指定的打印作业,删除相应的打印池文件,关闭打印作业,所以,应用程序执行了PrintCancel()函数之后,不需要再执行PrintClose()函数关闭打印作业了。
    PrintClose()
    功能关闭打印作业并把打印页面发送到打印机上。
    语法PrintClose ( printjobnumber )
    参数printjobnumber:要关闭的打印作业的作业号返回值Integer。函数执行成功时返回1,发生错误时返回-1。如果参数printjobnumber的值为NULL,PrintClose()函数返回NULL。用法应用程序使用PrintOpen()函数启动打印作业后,必须使用PrintClose()在完成打印任务后关闭打印作业,或根据需要使用PrintCancel()函数取消打印作业。
    PrintDataWindow()
    功能打印数据窗口控件的内容,用该函数可以在一个打印作业中打印多个数据窗口控件的内容,每个都从新的一页开始打印。
    语法PrintDataWindow ( printjobnumber, dwcontrol )
    参数printjobnumber:用PrintOpen()函数打开的打印作业号dwcontrol:要打印其内容的数据窗口控件名或子数据窗口控件名返回值Integer。函数执行成功时返回1,发生错误时返回-1。如果参数printjobnumber的值为NULL,PrintDataWindow()函数返回NULL。用法应用程序通过多次执行PrintDataWindow()函数可以在一个打印作业中一次打印多个数据窗口的内容,并且每个数据窗口都从新的一页开始打印。当数据窗口的表现风格为RichTextEdit时,数据窗口中的每一行都在新的一页上开始打印。需要注意的是,PrintDataWindow()函数在打印数据窗口时使用数据窗口本身定义的字体以及风格,使用PrintDefineFont()和PrintSetFont()函数为当前作业定义的字体不起作用。
    PrintDefineFont()
    功能定义打印作业使用的字体,对每个打印作业PowerBuilder支持八种字体。
    语法PrintDefineFont(printjobnumber,fontnumber,facename,height,weight,fontpitch,fontfamily, italic,underline)
    参数printjobnumber:用PrintOpen()函数打开的打印作业号fontnumber:指定赋给当前定义字体的编号,有效值在1到8之间 facename:string类型,指定字体名称,该字体应该是你的打印机支持的字体,比如“宋体”height:Integer类型,使用正值指定字体的高度,以千分之一英寸为单位;使用负值指定字体点数,比如,-18代表18点。一般来说,使用点数更精确些weight:指定字体的磅数,正常字体为400磅,粗体为700磅fontpitch:FontPitch枚举类型,指定字体标准。有效取值为:Default! - 缺省值;Fixed! - 固定形式;Variable! - 可变形式fontfamily:FontFamily枚举类型,指定字体系列。有效取值为:AnyFont!、Decorative!、Modern!、Roman!、Script!、Swiss!italic:boolean类型,指定是否使用斜体样式。有效取值为:TRUE - 使用斜体样式;FALSE - 不使用斜体样式。缺省值为FALSEunderline:boolean类型,指定是否加下划线。有效取值为:TRUE - 加下划线;FALSE - 不加下划线。缺省值为FALSE返回值Integer。函数执行成功时返回1,发生错误时返回-1。如果任何参数的值为NULL,PrintDefineFont()函数返回NULL。用法在一个打印作业中,应用程序能够最多同时定义8种字体。当应用程序需要使用更多的字体时,可以在使用了某个字体号输出内容后使用PrintDefineFont()函数将该字体号对应的字体更换为其它字体。
    PrintLine()
    功能在当前打印页上绘出指定厚度的一条线。
    语法PrintLine ( printjobnumber, x1, y1, x2, y2, thickness )
    参数printjobnumber:用PrintOpen()函数打开的打印作业号x1:integer类型,指定直线起点的x坐标,以千分之一英寸为单位y1:integer类型,指定直线起点的y坐标,以千分之一英寸为单位x2:integer类型,指定直线终点的x坐标,以千分之一英寸为单位y2:integer类型,指定直线终点的y坐标,以千分之一英寸为单位thickness:integer类型,指定直线的厚度,以千分之一英寸为单位返回值Integer。函数执行成功时返回1,发生错误时返回-1。如果任何参数的值为NULL,PrintLine()函数返回NULL。用法应用程序执行了PrintLine()函数后,该函数并不改变打印光标的位置。
    PrintOpen()
    功能启动打印作业并返回作业号。
    语法PrintOpen ( { jobname } )
    参数jobname:string类型,可选项,指定要打开打印作业的名称,该名称将显示在打印管理器窗口中返回值Long。函数执行成功时返回打印作业号,发生错误时返回-1。如果任何参数的值为NULL,PrintOpen()函数返回NULL。用法应用程序执行PrintOpen()函数后,启动新的打印作业并走纸到下一页,同时将打印机缺省字体设置为该打印作业的字体。打印光标的位置位于打印区的左上角。其它同组的打印函数使用PrintOpen()函数返回的作业号来标识作业。需要注意的是,使用PrintOpen()函数打开打印作业、使用同组的其它函数完成打印任务后,必须使用PrintClose()关闭打印作业,或根据需要使用PrintCancel()函数取消打印作业。
    PrintOval() 功能在指定位置以指定线宽绘制椭圆或圆。
    语法PrintOval ( printjobnumber, x, y, width, height, thickness )
    参数printjobnumber:用PrintOpen()函数打开的打印作业号x:integer类型,指定椭圆或圆外形框左上角的x坐标,以千分之一英寸为单位y:integer类型,指定椭圆或圆外形框左上角的y坐标,以千分之一英寸为单位width:integer类型,指定椭圆或圆外形框的宽度,以千分之一英寸为单位height:integer类型,指定椭圆或圆外形框的高度,以千分之一英寸为单位thickness:integer类型,指定椭圆或圆外边线的厚度,以千分之一英寸为单位返回值Integer。函数执行成功时返回1,发生错误时返回-1。如果任何参数的值为NULL,PrintOval()函数返回NULL。用法应用程序执行了PrintOval()函数后,该函数并不改变打印光标的位置。PrintOval()函数绘出的椭圆或圆是实心的,也就是说,执行该函数后,椭圆或圆下面的文字或图像将完全被覆盖。如果想在椭圆或圆中输出文字或图形,那么应用程序应该首先绘制椭圆或圆,然后使用其它函数在椭圆或圆中输出文字或图形。
    PrintPage()
    功能将当前页发送给打印机或打印池并在当前打印作业中启动一个新的打印页。
    语法PrintPage ( printjobnumber )
    参数printjobnumber:用PrintOpen()函数打开的打印作业号返回值Integer。函数执行成功时返回1,发生错误时返回-1。如果任何参数的值为NULL,PrintPage()函数返回NULL。
    PrintRect()
    功能在指定位置以指定线宽打印矩形。
    语法PrintRect ( printjobnumber, x, y, width, height, thickness )
    参数printjobnumber:用PrintOpen()函数打开的打印作业号x:integer类型,指定矩形左上角的x坐标,以千分之一英寸为单位y:integer类型,指定矩形左上角的y坐标,以千分之一英寸为单位width:integer类型,指定矩形的宽度,以千分之一英寸为单位height:integer类型,指定矩形的高度,以千分之一英寸为单位thickness:integer类型,指定矩形边线的厚度,以千分之一英寸为单位返回值Integer。函数执行成功时返回1,发生错误时返回-1。如果任何参数的值为NULL,PrintRect()函数返回NULL。用法应用程序执行了PrintRect()函数后,该函数并不改变打印光标的位置。PrintRect()函数绘出实心的矩形,也就是说,执行该函数后,矩形下面的文字或图像将完全被覆盖。如果想在矩形中输出文字或图形,那么应用程序应该首先绘制矩形,然后使用其它函数在矩形中输出文字或图形。
    PrintRoundRect()
    功能在指定位置以指定线宽打印圆角矩形。
    语法PrintRoundRect(printjobnumber,x,y,width,height,xradius,yradius,thickness)
    参数printjobnumber:用PrintOpen()函数打开的打印作业号x:integer类型,指定圆角矩形左上角的x坐标,以千分之一英寸为单位y:integer类型,指定圆角矩形左上角的y坐标,以千分之一英寸为单位width:integer类型,指定圆角矩形的宽度,以千分之一英寸为单位height:integer类型,指定圆角矩形的高度,以千分之一英寸为单位xradius:integer类型,指定圆角矩形圆角部分的x半径,以千分之一英寸为单位yradius:integer类型,指定圆角矩形圆角部分的y半径,以千分之一英寸为单位thickness:integer类型,指定圆角矩形边线的厚度,以千分之一英寸为单位返回值Integer。函数执行成功时返回1,发生错误时返回-1。如果任何参数的值为NULL,PrintRoundRect()函数返回NULL。用法应用程序执行了PrintRoundRect()函数后,该函数并不改变打印光标的位置。PrintRoundRect()函数绘出实心的圆角矩形,也就是说,执行该函数后,圆角矩形下面的文字或图像将完全被覆盖。如果想在圆角矩形中输出文字或图形,那么应用程序应该首先绘制圆角矩形,然后使用其它函数在圆角矩形中输出文字或图形。
    PrintScreen()
    功能在打印作业中打印屏幕图像。
    语法PrintScreen ( printjobnumber, x, y {, width, height } )
    参数printjobnumber:用PrintOpen()函数打开的打印作业号x:integer类型,指定要打印屏幕图像左上角在打印页上的x坐标,以千分之一英寸为单位y:integer类型,指定要打印屏幕图像左上角在打印页上的y坐标,以千分之一英寸为单位width:integer类型,可选项,指定屏幕图像的打印宽度,以千分之一英寸为单位。如果省略了该参数,那么PowerBuilder按屏幕的原始宽度打印屏幕图像。如果指定了该参数,必须同时指定height参数height:integer类型,可选项,指定屏幕图像的打印高度,以千分之一英寸为单位。如果省略了该参数,那么PowerBuilder按屏幕的原始高度打印屏幕图像返回值Integer。函数执行成功时返回1,发生错误时返回-1。如果任何参数的值为NULL,PrintScreen()函数返回NULL。
    PrintSend()
    功能直接向打印机发送任意字符串,通常用于发送打印机的控制代码。
    语法PrintSend ( printjobnumber, string {, zerochar } )
    参数printjobnumber:用PrintOpen()函数打开的打印作业号string:string类型,指定发送到打印机的字符串。在该字符串中,使用非打印字符的ASCII码值表示非打印字符zerochar:integer类型,可选项,指定在string参数中用于表示数值0的ASCII码值。有效取值在1到255之间返回值Integer。函数执行成功时返回1,发生错误时返回-1。如果任何参数的值为NULL,PrintSend()函数返回NULL。用法应用程序使用PrintSend()函数可以直接向打印机发送控制序列(换码序列),比如,设置打印文字的浓淡、打印页的四周空白等。不同类型的打印机使用不同的控制序列,你需要翻一翻你的打印机手册。由于PowerBuilder使用数值0(即ASCII码为0的字符)结束每个字符串,因此,如果打印控制序列中包含了数值0,应用程序需要使用其它字符在参数string中替代数值0,并用zerochar参数指明这个替代字符。一般来说,应该选择一个打印机控制序列中不使用的字符作为0值字符的替代字符。通常情况下,按下述次序组织打印作业:1. 使用PrintOpen()函数打开打印作业2. 使用PrintSend()函数设置打印机特性,比如打印方向、四周空白等3. 使用PrintDefineFont()和PrintSetFont()函数设置该打印作业使用的字体4. 使用该组的其它函数打印输出文字或图形5. 执行PrintClose()函数关闭打印作业
    PrintSetFont()
    功能设置当前打印作业使用的字体。
    语法PrintSetFont ( printjobnumber, fontnumber )
    参数printjobnumber:用PrintOpen()函数打开的打印作业号fontnumber:指定该打印作业使用字体的字体编号,该编号与PrintDefineFont()函数中定义的编号应该对应,字体编号的有效取值在1到8之间,0表示使用打印机的缺省字体返回值Integer。函数执行成功时返回当前字体的高度,发生错误时返回-1。如果任何参数的值为NULL,PrintSetFont()函数返回NULL。
    PrintSetSpacing()
    功能设置行间距因子,打印函数将使用该因子来决定行间距。
    语法PrintSetSpacing ( printjobnumber, spacingfactor )
    参数printjobnumber:用PrintOpen()函数打开的打印作业号spacingfactor:指定行间距因子,用字符高度的倍数表示,缺省值为1.2返回值Integer。函数执行成功时返回1,发生错误时返回-1。如果任何参数的值为NULL,PrintSetSpacing()函数返回NULL。用法在PowerBuilder应用程序中,行间距与字符的高度成正比,缺省值为字符高度的1.2倍。当Print组函数生成新行时,系统自动把打印光标的x坐标位置设置为0,y坐标位置在原有基础上增加当前行距值。使用PrintSetSpacing()函数可以改变当前打印作业的行距。
    PrintSetup()
    功能打开打印机设置对话框。
    语法PrintSetup ( )
    返回值Integer。函数执行成功时返回1,发生错误时返回-1。如果任何参数的值为NULL,PrintSetup()函数返回NULL。用法当系统中安装了多种打印机时,在Windows 95中PrintSetup()函数打开如图2-1所示的对话框,单击“Setup”按钮设置打印机各种特性。如果系统中只有一个打印机,则直接打开该打印机的打印设置对话框。需要注意的是,在Windows95和Windows NT 3.51以后的版本中,使用PrintSetup()函数设置的打印机设置只对当前应用起作用,并不影响其它应用的打印机设置。对Windows 3.1来说,使用PrintSetup()函数设置的打印机设置影响系统中的所有应用。
    PrintText()
    功能在指定位置打印一行文本。
    语法PrintText ( printjobnumber, string, x, y {, fontnumber } )
    参数printjobnumber:用PrintOpen()函数打开的打印作业号string:string类型,指定要打印的文本x:integer类型,指定文本开始打印位置的x坐标,以千分之一英寸为单位y:integer类型,指定文本开始打印位置的y坐标,以千分之一英寸为单位fontnumber:可选参数,指定打印文本使用的字体号,该编号由PrintDefineFont()函数确定。省略该参数时,以打印作业的当前字体打印文本返回值Integer。函数执行成功时返回文本打印后打印光标的x位置,即参数x的值加上打印文本的宽度。发生错误时返回-1。如果任何参数的值为NULL,PrintText()函数返回NULL。
    PrintWidth()
    功能确定一个字符串在指定打印作业中按当前字体所占的宽度,以千分之一英寸为单位。
    语法PrintWidth ( printjobnumber, string )
    参数printjobnumber:用PrintOpen()函数打开的打印作业号string:string类型,指定要决定其打印宽度的字符串返回值Integer。函数执行成功时返回按当前字体计算的字符串打印宽度,以千分之一英寸为单位,发生错误时返回-1。如果任何参数的值为NULL,PrintWidth()函数返回NULL。
    PrintX()
    功能返回打印光标的x坐标位置。
    语法PrintX ( printjobnumber )
    参数printjobnumber:用PrintOpen()函数打开的打印作业号返回值Integer。函数执行成功时返回打印光标的x坐标位置,以千分之一英寸为单位,发生错误时返回-1。如果任何参数的值为NULL,PrintX()函数返回NULL。
    • PrintY()
      功能返回打印光标的y坐标位置。
      语法PrintY ( printjobnumber )
      参数printjobnumber:用PrintOpen()函数打开的打印作业号返回值Integer。函数执行成功时返回打印光标的y坐标位置,以千分之一英寸为单位,发生错误时返回-1。如果任何参数的值为NULL,PrintY()函数返回NULL。
    RegistryDelete()
    功能删除Windows系统注册库中的一个键或键的某个值。
    语法RegistryDelete ( key, valuename )
    参数key:string类型,指定键名,将删除该键或删除该键的某个值valuename:string类型,指定要删除的值的名称。如果想删除键、键的值、以及其下的所有子键,那么将该参数指定为空字符串返回值Integer。函数执行成功时返回1,发生错误时返回-1。用法为了唯一地标识某个键,在key参数中,可以从根键开始依次指定各级父键,各键之间使用反斜杠(/)分隔。
    RegistryGet()
    功能从系统注册库中得到指定键的值。
    语法RegistryGet ( key, valuename, valuetype, valuevariable )
    参数key:string类型,指定键名valuename:string类型,指定要访问值的名称。每个键可以有一个未命名的值和多个命名的值。要访问未命名的值,把该参数指定为空字符串("")valuetype:RegistryValueType枚举类型,指定值的数据类型。有效取值请参看用法valuevariable:用于保存键值的变量,其数据类型应该与valuetype参数指定的类型相匹配返回值Integer。函数执行成功时返回1,发生错误时返回-1。如果valuevariable的数据类型与valuetype参数指定的类型不匹配,将引发运行错误。
    用法valuetype的可能取值为:RegString!以空字符结束的字符串RegExpandString!以空字符结束的字符串,其中包括了对环境变量的非扩展应用RegBinary!二进制数据ReguLong!32位数据ReguLongBigEndian!32位大数据RegLink!Unicode符号链RegMultiString!动态字符串数组为了唯一地标识某个键,在key参数中,可以从根键开始依次指定各级父键,各键之间使用反斜杠(/)分隔。
    RegistryKeys()
    功能从系统注册库中得到指定键的有效子键。
    语法RegistryKeys ( key, subkeys )
    参数key:string类型,指定键名subkeys:字符串数组变量,用于保存各子键返回值Integer。函数执行成功时返回1,发生错误时返回-1。用法在subkeys参数中可以使用定长数组,也可以使用动态数组。使用动态数组时,数组的上界反映了能够得到的子键个数。当使用定长数组时,其数组元素个数必须足够多,保证能够容纳所有子键,但是,在具体得到子键之前,没有办法能够预先知道实际子键个数。为了唯一地标识某个键,在key参数中,可以从根键开始依次指定各级父键,各键之间使用反斜杠(/)分隔。
    RegistrySet()
    功能在系统注册库中设置或创建指定键。
    语法RegistrySet ( key, valuename, valuetype, value )
    参数key:string类型,指定键名valuename:string类型,指定要访问值的名称。每个键可以有一个未命名的值和多个命名的值。要访问未命名的值,把该参数指定为空字符串("")。如果注册库中不存在指定值名,该函数将创建新的值名valuetype:RegistryValueType枚举类型,指定值的数据类型。有效取值请参看用法value:要设置的值,其数据类型应该与valuetype参数指定的类型相匹配返回值Integer。函数执行成功时返回1,发生错误时返回-1。如果valuevariable的数据类型与valuetype参数指定的类型不匹配,将引发运行错误。用法valuetype的可能取值为:RegString!以空字符结束的字符串RegExpandString!以空字符结束的字符串,其中包括了对环境变量的非扩展应用RegBinary!二进制数据ReguLong!32位数据ReguLongBigEndian!32位大数据RegLink!Unicode符号链RegMultiString!动态字符串数组为了唯一地标识某个键,在key参数中,可以从根键开始依次指定各级父键,各键之间使用反斜杠(/)分隔。
    • RegistryValues()
      功能得到与指定键相关的一组值名。该函数在Windows 3.1中无效。
      语法RegistryValues ( key, valuename )
      参数key:string类型,指定键名valuename:字符串数组变量,用于保存值名返回值Integer。函数执行成功时返回1,发生错误时返回-1。用法在valuename 参数中可以使用定长数组,也可以使用动态数组。使用动态数组时,数组的上界反映了能够得到的值名个数。当使用定长数组时,其数组元素个数必须足够多,保证能够容纳所有值名,但是,在具体得到值名之前,没有办法能够预先知道实际值名个数。为了唯一地标识某个键,在key参数中,可以从根键开始依次指定各级父键,各键之间使用反斜杠(/)分隔。  
    展开全文
  • 无法解析的外部符号的几种可能   1. lib 文件未引入。可使用“#pragma comment(lib, “winsock.lib”) ”语句添加 lib 引用,也可在项目依赖里添加。 2. 类方法的实现未加类标识。如, “CTest::Connect...
  • Idea 无法引用类问题解决办法

    千次阅读 2021-01-13 10:35:51
    Idea 无法引用类问题解决办法今天遇到一个最别坑的问题,就是我引入了一个lombok.jar包。这个Jar包中的其它类我都可以通过Alt+Enter来快速导入包,但是就其中一个@Data这个注解就是不行。我以为是版本问题,我就在...
  • Excel函数大全

    千次阅读 多人点赞 2020-05-01 22:00:27
    分享一篇Excel函数总结得很全面细致的文章,工作中常用的函数都写到了 原文作者是一位写文章很用心的博主,博客地址:https://blog.csdn.net/weixin_41261833 欢迎大家关注!   你没有看错,这是一份很好的Excel...
  • "无法解析的外部符号"的几种情况

    千次阅读 2014-06-23 22:31:55
    可使用“#pragma comment(lib, “winsock.lib”) ”语句添加 lib 引用,也可在项目依赖里添加。 2. 类方法的实现未加类标识。如, “CTest::Connect(void) { … }” 写成了 “Connect(void) { … }”。 3. ...
  • Oracle SQL提供了用于执行特定操作的专用函数。这些函数大大增强了SQL语言的功能。 SQL函数的分类: 单行函数 对每一个函数应用在表的记录中时,只能输入一行结果,返回一个结果,可以出现在 SELECT 子句中和 ...
  • 1>atlsd.lib(Externs.obj) : error LNK2019: 无法解析的外部符号 __CrtDbgReport,该符号在函数 "void __cdecl `dynamic initializer   for 'public: static class ATL::CTrace ATL::CTrace::s_trace''(void)" (?...
  • 声明 前阶段在项目中使用了...之所以会参考这么多书籍的原因是我在看一技术问题时,习惯参考不同书籍作者的看法,毕竟不同的书都有自己的侧重点,而且不同的作者对同一技术问题的理解深度也不同。 本文使用的代码时
  • pd.DataFrame()函数解析(最清晰的解释)

    万次阅读 多人点赞 2019-06-26 10:57:00
    DataFrame是Python中Pandas库中的一种数据结构,它类似excel,是一种二...==0 简介1 创建DataFrame1.1 使用numpy函数创建1.2 直接创建1.3 使用字典创建2 DataFrame属性2.1 查看列的数据类型2.2 查看DataFrame的头尾...
  • Java的接口回调与回调函数解析

    万次阅读 2016-04-01 00:14:05
    接口回调是指:可以把使用一接口的类创建的对象的引用赋给该接口声明的接口变量,那么该接口变量就可以调用类实现的接口的方法。实际上,当接口变量调用类实现的接口中的方法时,就是通知相应的对象调用接口的...
  • 1.函数接口说明 在C++中指定函数接口时,一些必须要解决的问题有: (1) 运算符函数还是非运算符函数? (2) 自由运算符还是成员运算符? (3) 虚函数还是非虚函数? (4) 纯虚成员函数还是非纯虚成员函数? (5) ...
  • ArrayList源码万字解析!透彻易懂!

    千次阅读 多人点赞 2020-05-20 20:22:05
    本文我们结合源码用通俗易懂的语言来解析ArrayList,尽量给每一行源码都写上注释,给每一个功能加上总结,助你进大厂一臂之力
  • jmeter函数和变量(一)

    万次阅读 2017-08-03 21:15:48
    概述对jmeter函数进行一次全面复习,依据是官网的文档版本3.2。本来想一篇写完的,中间做项目和一些杂事拖了2个礼拜,再回来写的时候发现太长了~还是分开写比较妥当。先放出一部分吧。函数和变量JMeter函数是一种...
  • Sybase IQ常用函数大全--分析函数

    千次阅读 2019-04-07 14:01:42
    就是按照一个条件排序,形成行号,如果值相等则行号相等,接下来的值不会跳一个行号,而会继续往下形成。 NTILE 函数:将查询结果分配到指定数量的表元中,并为表元中的每一行指派相应的表元号。就是给定一个数 n...
  • 上面之所以要在标志后面加上b,是因为引用之前的代码,如果要引用之后的代码就加f。 这里对size的操作约定是:如果复制失败,则size中保留的是还没有复制完的数据字节数。 由于复制数据的代码只有4行,其中可能...
  • 目前已经知道,线性分类器无法作用于类似上图一类“包起来”另一类的数据。现在我们有两种解决方法: 更换分类器 对数据进行处理 为了引申Kernel的意义,这里不再讨论第一种方法,只讨论第二种方法: 如何对数据进行...
  •  static数据成员的类型可以是该成员所属的类的类型,非static数据成员限定为其自生类的指针或引用。 class Person { private: string name; static const int age = 20;//在类的定义体内进行初始化 static ...
  • 最近想做个工具来做一些lua代码检测,比如统计某函数体里的a函数的调用次数,调用绑定事件后是否有把其返回值在某退出函数里解绑定,或者某函数调用的参数是不是和协议文档里的有对应上(这个还是建议直接从协议文档...
  • 在Transact-SQL语言中,函数被用来执行一些特殊的运算以支持SQL Server的标准命令。SQL Server包含多种不同的函数用以完成各种工作,每一个函数都有一个名称,在名称之后有一对小括号,如:GETDATE()。大部分的函数...
  • 字面值类型包括算术类型、引用、指针、枚举和数据成员都是字面值类型的聚合类。 聚合类的定义: 所有成员都是public的。 没有定义任何构造函数。 没有类内初始值。 没有基类,也没有虚函数。 如: struct...
  • 如何简单理解概率分布函数和概率密度函数

    万次阅读 多人点赞 2018-09-11 16:56:19
    本篇文章是在《应该如何理解概率分布函数和概率密度函数?》的基础上整理来的。非常感谢原作者。 目录 1先从离散型随机变量和连续性随机变量说起 2离散型随机变量的概率函数,概率分布和分布函数 2.1概率函数和...
  • Jmeter之函数助手

    千次阅读 2018-10-09 15:58:16
    一、使用jmeter函数助手 启动jmeter后,可以在JMeter的选项菜单中找到函数助手对话框(快捷键:Ctrl+Shift+F1),如下图所示: 打开函数助手,可以从下拉列表中选择一个函数,并为其参数设定值,不同函数要求的...
  • iOS之深入解析App的架构设计

    千次阅读 2021-07-20 15:46:34
    一、概述 ① 应用架构 App 架构是软件设计的一个分支,它关心的是如何设计一个 App 的结构。具体来说,它关注于两个方面:如何将 App 分解为不同的接口和概念层次部件,以及...但这种简单的框图几乎无法解释在实践中

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 104,686
精华内容 41,874
关键字:

无法解析某函数被引用