OpenForcal扩展动态库之一:FcWin.dll V1.0

    FcWin.dll在加载时,会自动打开FcWin窗口。若窗口被关闭,使用FcWin[]函数可以重新打开窗口。
    该动态库中定义了以下几个函数:

    1)、 打开窗口函数(实数函数):FcWin[];
    2)、 清除输出窗口的内容(实数函数):clear[];
    3)、 字符串输出函数(实数函数):str["aaaa"];
        该函数可能返回如下运行错误:1、指定的字符串不存在。
    4)、 换行函数(实数函数):endl[];
    5)、 数值输出函数:out[x];
        该函数输出一个数值并返回该值。可以用流程控制该函数进行数值输出。
    6)、 将一个实数数组的值输出到窗口(实数函数):outarray(i);

    可以在窗口中直接进行表达式计算、函数查询(查询扩展动态库中的函数,多个关键字之间用空格分隔)和执行命令等。
    用户可以通过动态库说明文件添加各种菜单命令。以#COMMAND:开头的动态库说明文件将作为一个弹出式菜单添加到FcWin的主菜单中,文件格式如下:

    #COMMAND:该行内容将被添加到命令菜单

    <命令1
     //以下表达式被作为命令1被执行;
     1+2;
     str["命令1执行完毕!"];
    >

    <命令2
     //以下表达式被作为命令2被执行;
     2+3;
     str["命令2执行完毕!"];
    >

    当FcWin第一次启动或者重新加载了动态库说明文件时,需要执行“重载所有命令”以重新加载所有命令菜单。

OpenForcal扩展动态库之二:FcFunWin.dll V1.1

    FcFunWin.dll是OpenForcal的窗口界面,用户可在窗口中自定义多个控件,为计算提供了方便。目前可以使用的控件有编辑框、静态文本、普通按钮、单选按钮、复选框、组框等。
    该动态库中定义了以下几个函数:

    1)、 函数窗口生成函数(实数函数):FcFunWin[...];
        以下将专门介绍该函数的用途。
    2)、 消息框函数(实数函数):MessageBox["消息框中显示的字符串","作为标题的字符串"];
        该函数可能返回如下运行错误:1、指定的字符串不存在。
    3)、 交换字符串函数(实数函数):strex["aaaa","bb"];
        交换两个字符串地址的内容。执行了该函数后,原字符串"aaaa"所在地址中的内容将成为"bb",原字符串"bb"所在地址中的内容将成为"aaaa"。
        该函数可能返回如下运行错误:1、指定的字符串不存在。
    4)、 复制字符串函数(实数函数):strcpy["aaaa","bb"];
        将字符串"bb"地址中的内容复制到字符串"aaaa"的地址中。
        该函数可能返回如下运行错误:1、指定的字符串不存在;2、内存分配错误。
    5)、 清除输出窗口函数(实数函数):ClearFcFunWin[];
        清除当前有效的编辑框输出窗口的内容。
    6)、 设置指定的编辑框窗口的内容(实数函数):SetEditText("编辑框名称","内容");
        如果指定的编辑框"编辑框名称"存在,将该编辑框的内容替换为"内容"。
        该函数可能返回如下运行错误:1、指定的字符串不存在。
    7)、将当前命令字符串传送到指定的编辑框(实数函数):SetCodeToEdit("编辑框名称");
        如果指定的编辑框"编辑框名称"存在,用当前命令字符串替换该编辑框的内容。该函数用于编程调试。
        该函数可能返回如下运行错误:1、指定的字符串不存在。
    8)、部分数组元素赋值函数(实数函数):SetPartArray(array,begin,end,x1,x2,...xn);
        将x1,x2,...xn按顺序传送到实数数组array的begin ~ end地址中。
        该函数可能返回如下运行错误:1、参数不匹配;2、数组元素地址begin或end错误;3、指定的数组array不存在。
    9)、数组元素连续赋值初始化函数(实数函数):ContinueSetArrayIni(k,i);
        设置连续赋值的数组为k,从第i个元素开始赋值。通常该函数返回0。
        若k<0,该函数返回当前进行连续赋值的数组序号。
        若k>=0但i<0,该函数返回当前数组已经赋值的元素个数。
    10)、数组元素连续赋值函数(实数函数):ContinueSetArray(x1,x2,... ...);
        将数值x1,x2,... ...在当前数组中连续存放。
        该函数可能返回如下运行错误:1、指定的数组不存在;2、数组元素个数不够。

   以下是FcFunWin[]函数的详细介绍:

    每次调用FcFunWin[...]函数将会打开一个窗口,可以在窗口中放置多个预定义的控件,当用户选择了该控件时,可以执行相应的预定义的操作。我们通过例子说明FcFunWin[]函数的使用:

//将控件ID定义为常量:1、普通按钮;2、单选按钮;3、复选框;4、组框;5、编辑框;6、静态文本。
const:BUTTON=1,RADIOBUTTON=2,CHECKBOX=3,GROUPBOX=4,EDIT=5,STATIC=6;
//将字符串"DoStr"定义为公用字符串;
"char"()=strex //交换字符串,请参考strex[]的说明;
{"DoStr",
 "
 (*计算时清屏*)clearFcFunWin[];
//在单击普通按钮时(*...*)中的字符串将被替换为指定的文本;
 (*表达式*);
 (*MB*);
 "
};
//在FcFunWin[...]函数中定义各类控件及操作;
FcFunWin{"例子",0,0,500,500,//窗口名称为"例子",0,0,500,500定义了该窗口的大小;

    //静态文本控件定义,控件标题是"表达式:",10,10,70,20是该控件在窗口中的相对位置;
    STATIC,"表达式:",10,10,70,20,

    //编辑框控件定义,该编辑框的名称为"表达式",1表示是多行编辑框,若该项为-1则表示是单行编辑框
    //
80,10,380,100是该控件在窗口中的相对位置,最后的字符串""用于设置初始化文本;
    //
在单击普通按钮时将用编辑框中的文本替换指定字符串中的子串(*表达式*)
    EDIT,"表达式",1,80,10,380,100,"",

    //组框控件定义,控件标题是"组框"10,120,90,60是该控件在窗口中的相对位置;
    GROUPBOX,"组框",10,120,90,60,

    //单选按钮控件定义,控件标题是"消息框1",15,135,80,20是该控件在窗口中的相对位置;
    //"MB"表示是同一组单选按钮(只要该位置有相同的字符串,就属于同一组单选按钮,用户只能选择其中的一个);
    //最后一个字符串
"..."定义了按钮被选择后将被替换的文本;
    //
在单击普通按钮时,若选择了"消息框1",则用"MessageBox(\"aaa\",\"消息框1\")"替换指定字符串中的子串 (*MB*)
    //
在单击普通按钮时,若选择了"消息框2",则用"MessageBox(\"bbb\",\"消息框2\")"替换指定字符串中的子串 (*MB*)

    RADIOBUTTON,"消息框1",15,135,80,20,"MB","MessageBox(\"aaa\",\"消息框1\")",
    RADIOBUTTON,"消息框2",15,155,80,20,"MB","MessageBox(\"bbb\",\"消息框2\")",

    //
复选框控件定义,控件标题是"计算时清屏",120,135,100,20是该控件在窗口中的相对位置;
   
//在单击普通按钮时,若设置了选中标志,则用""替换指定字符串中的子串 (*计算时清屏*);
   
//在单击普通按钮时,若没有设置选中标志,则用"//"替换指定字符串中的子串 (*计算时清屏*);
    //-1表示初始化时不设置选中标志,若为1则表示初始化时设置选中标志;

    CHECKBOX,"计算时清屏",120,135,100,20,"","//",-1,

    //
普通按钮控件定义,控件标题是"计算",400,290,50,25是该控件在窗口中的相对位置;
    //
在单击该按钮时,先对字符串@"DoStr"中的子串(*...*)进行相
应地替换,具体替换行为如前所述;
    //对
字符串@"DoStr"处理完所有的控件替换后,编译计算该字符串中的表达式,将结果输出到编辑框"结果输出2:";
    //注意
字符串"DoStr"中的内容在前面进行了定义,@"DoStr"表示取字符串"DoStr"的地址;

    BUTTON,"计算",400,290,50,25,@"DoStr","结果输出2:",

    STATIC,"结果输出1:",10,260,100,20,
    EDIT,"结果输出1:",-1,120,260,330,20,"aaaaaa",

    STATIC,"结果输出2:",10,290,100,20,
    EDIT,"结果输出2:",1,10,320,450,130,""
}

    可在任何一个加载使用OpenForcal.dll正式版的程序中运行以上代码,请输入 SetEditText("结果输出1:","结果输出到了这里!"); 后观察程序运行情况。

    在共享版中,可以使用一个数组给FcFunWin[]函数传递参数,格式如下:
        FcFunWin[n,array];
    其中array表示数组,数组中预先按顺序存放所有的控件定义,n为有效的数组元素个数-1。
    下面我们用这种方法重新实现上面的程序(注意这些代码与前面的代码有什么不同),您仍然可以输入 SetEditText("
结果输出1:","结果输出到了这里!"); 观察程序运行情况

//将控件ID定义为常量:1、普通按钮;2、单选按钮;3、复选框;4、组框;5、编辑框;6、静态文本。
const:BUTTON=1,RADIOBUTTON=2,CHECKBOX=3,GROUPBOX=4,EDIT=5,STATIC=6;

//将字符串"DoStr"定义为公用字符串;
"char"()=strex //交换字符串,请参考strex[]的说明;
{"DoStr",
 "
 (*计算时清屏*)clearFcFunWin[];
//在单击普通按钮时(*...*)中的字符串将被替换为指定的文本;
 (*表达式*);
 (*MB*);
 "
};

const: array=0,n=100;
//数组常量定义; 
NewDoubleArrays[1]; //申请一个实数数组; 
NewDoubleArray[array,n]; //第array个数组元素个数为n个,添加的控件越多,n越大; 
ContinueSetArrayIni[array,0]; //从数组array的第0个元素开始存放数值;

//以下用ContinueSetArray[...]函数定义各类控件及操作:

//窗口名称为"例子",0,0,500,500定义了该窗口的大小;
ContinueSetArray["例子",0,0,500,500];

//静态文本控件定义,控件标题是"表达式:",10,10,70,20是该控件在窗口中的相对位置;
ContinueSetArray[STATIC,"表达式:",10,10,70,20];

//编辑框控件定义,该编辑框的名称为"表达式",1表示是多行编辑框,若该项为-1则表示是单行编辑框;
//80,10,380,100是该控件在窗口中的相对位置,最后的字符串""用于设置初始化文本;
//在单击普通按钮时将用编辑框中的文本替换指定字符串中的子串(*表达式*);
ContinueSetArray[EDIT,"表达式",1,80,10,380,100,""];

//组框控件定义,控件标题是"组框",10,120,90,60是该控件在窗口中的相对位置;
ContinueSetArray[GROUPBOX,"组框",10,120,90,60];

//单选按钮控件定义,控件标题是"消息框1",15,135,80,20是该控件在窗口中的相对位置;
//"MB"表示是同一组单选按钮(只要该位置有相同的字符串,就属于同一组单选按钮,用户只能选择其中的一个);
//最后一个字符串"..."定义了按钮被选择后将被替换的文本;
//在单击普通按钮时,若选择了"消息框1",则用"MessageBox(\"aaa\",\"消息框1\")"替换指定字符串中的子串 (*MB*);
//在单击普通按钮时,若选择了"消息框2",则用"MessageBox(\"bbb\",\"消息框2\")"替换指定字符串中的子串 (*MB*);
ContinueSetArray[RADIOBUTTON,"消息框1",15,135,80,20,"MB","MessageBox(\"aaa\",\"消息框1\")"];
ContinueSetArray[RADIOBUTTON,"消息框2",15,155,80,20,"MB","MessageBox(\"bbb\",\"消息框2\")"];

//复选框控件定义,控件标题是"计算时清屏",120,135,100,20是该控件在窗口中的相对位置;
//在单击普通按钮时,若设置了选中标志,则用""替换指定字符串中的子串 (*计算时清屏*);
//在单击普通按钮时,若没有设置选中标志,则用"//"替换指定字符串中的子串 (*计算时清屏*);
//-1表示初始化时不设置选中标志,若为1则表示初始化时设置选中标志;
ContinueSetArray[CHECKBOX,"计算时清屏",120,135,100,20,"","//",-1];

//普通按钮控件定义,控件标题是"计算",400,290,50,25是该控件在窗口中的相对位置;
//在单击该按钮时,先对字符串@"DoStr"中的子串(*...*)进行相应地替换,具体替换行为如前所述;
//对字符串@"DoStr"处理完所有的控件替换后,编译计算该字符串中的表达式,将结果输出到编辑框"结果输出2:";
//注意字符串"DoStr"中的内容在前面进行了定义,@"DoStr"表示取字符串"DoStr"的地址;
ContinueSetArray[BUTTON,"计算",400,290,50,25,@"DoStr","结果输出2:"];

ContinueSetArray[STATIC,"结果输出1:",10,260,100,20];
ContinueSetArray[EDIT,"结果输出1:",-1,120,260,330,20,"aaaaaa"];

ContinueSetArray[STATIC,"结果输出2:",10,290,100,20];
ContinueSetArray[EDIT,"结果输出2:",1,10,320,450,130,""];

//用FcFunWin[...]函数显示窗口,其中ContinueSetArrayIni(array,-1)获取数组array的有效元素个数。
FcFunWin[ContinueSetArrayIni(array,-1)-1,array];

    FcFunWin[]函数可能返回如下运行错误:
      1、参数不匹配;
      2、字符串地址错误;
      3、窗口或控件的位置及大小不能小于0;
      4、内存分配失败;
      5、不可识别控件ID;
      6、数组地址错误,指定的数组不存在;
      7、没有足够的数组元素个数。