table 是一个关联数组, 也就是说,这个数组不仅仅以数字做索引,除了 nil 和 NaN 之外的所有 Lua 值 都可以做索引。 (Not a Number 是一个特殊的数字,它用于表示未定义或表示不了的运算结果,比如 0/0。) 表可以是 异构 的; 也就是说,表内可以包含任何类型的值( nil 除外)。 任何键的值若为 nil 就不会被记入表结构内部。 换言之,对于表内不存在的键,都对应着值 nil 。
表是 Lua 中唯一的数据结构, 它可被用于表示普通数组、序列、符号表、集合、记录、图、树等等。 对于记录,Lua 使用域名作为索引。 语言提供了 aname 这样的语法糖来替代 a["name"] 这种写法以方便记录这种结构的使用。 在 Lua 中有多种便利的方式创建表(参见 §349)。
我们使用 序列 这个术语来表示一个用 {1n} 的正整数集做索引的表。 这里的非负整数 n 被称为该序列的长度(参见 §347)。
和索引一样,表中每个域的值也可以是任何类型。 需要特别指出的是:既然函数是一等公民,那么表的域也可以是函数。 这样,表就可以携带 方法 了。 (参见 §3411)。
索引一张表的原则遵循语言中的直接比较规则。 当且仅当 i 与 j直接比较相等时 (即不通过元方法的比较), 表达式 a[i] 与 a[j] 表示了表中相同的元素。 特别指出:一个可以完全表示为整数的浮点数和对应的整数相等 (例如:10 == 1)。 为了消除歧义,当一个可以完全表示为整数的浮点数做为键值时, 都会被转换为对应的整数储存。 例如,当你写 a[20] = true 时, 实际被插入表中的键是整数 2 。 (另一方面,2 与 "2" 是两个不同的 Lua 值, 故而它们可以是同一张表中的不同项。)
表、函数、线程、以及完全用户数据在 Lua 中被称为 对象: 变量并不真的 持有 它们的值,而仅保存了对这些对象的 引用。 赋值、参数传递、函数返回,都是针对引用而不是针对值的 *** 作, 这些 *** 作均不会做任何形式的隐式拷贝。
库函数 type 用于以字符串形式返回给定值的类型
引用一个叫 var 的自由名字(指在任何层级都未被声明的名字) 在句法上都被翻译为 _ENVvar 。 此外,每个被编译的 Lua 代码块都会有一个外部的局部变量叫 _ENV (参见 §332), 因此,_ENV 这个名字永远都不会成为一个代码块中的自由名字。
在转译那些自由名字时,_ENV 是否是那个外部的局部变量无所谓。 _ENV 和其它你可以使用的变量名没有区别。 这里特别指出,你可以定义一个新变量或指定一个参数叫这个名字。 当编译器在转译自由名字时所用到的 _ENV , 指的是你的程序在那个点上可见的那个名为 _ENV 的变量。 (Lua 的可见性规则参见 §35)
被 _ENV 用于值的那张表被称为 环境。
Lua 保有一个被称为 全局环境 特别环境。它被保存在 C 注册表 (参见 §45)的一个特别索引下。 在 Lua 中,全局变量 _G 被初始化为这个值。 (_G 不被内部任何地方使用。)
当 Lua 加载一个代码块,_ENV 这个上值的默认值就是这个全局环境 (参见 load)。 因此,在默认情况下,Lua 代码中提及的自由名字都指的全局环境中的相关项 (因此,它们也被称为 全局变量 )。 此外,所有的标准库都被加载入全局环境,一些函数也针对这个环境做 *** 作。 你可以用 load (或 loadfile)加载代码块,并赋予它们不同的环境。 (在 C 里,当你加载一个代码块后,可以通过改变它的第一个上值来改变它的环境。)
Windows的API函数是应用程序开发的有力辅助工具,对它们的恰当使用,可大大增强和改进应用程序与系统打交道的能力,使自己的程序 真正具有底层 *** 作功能。作为RAD工具的基础代表,BORLANDDELPHI虽然本身也已提供了大 量强有力的函数和过程,但在某些场合、要求下,使用API函数将使你的程序进一步得到改 善,并可拓宽范围,简化程序代码。
在DELPHI中引用API函数,和使用DELPHI本身的函 数、过程几乎没有区别。在DELPHI目录下有一个WINDOWSPAS文件,凡是在其中声明过的API 函数,都可在编程时直接引用而无须另加说明。只是要注意,标准API函数都是以C或C++为 标准进行数据结构定义的,而DELPHI使用的是OBJECTPASCAL语言,因此在引用时应特别注 意参数和函数本身的数据类型。如一个API函数若为布尔值,则在DELPHI中就应以TRUE、FALSE 而不能用0、非0来对返回值进行判断。
下面以三个小例子来说明API函数在DELPHI中的 使用。
一、本地化消息框
想让自己的消息框显示“OK”、“Cancel”还是“确定”、“ 取消”?如果想使程序彻底本地化,那么还是放弃MessageDlg和ShowMessage吧——都怪DELPHI 没有。用MessageBox这个API函数照样方便。
使用语法为:
MessageBox(HWND:hWND,lpMessage:
PChar,lpCaption:PChar,uType:Cardinal);
各参数中,第一个为消息框所属的窗口句柄,第二 个为要显示的消息,第三个为消息框的标题,第四个为消息框的类型,函数返回值为整型数。
为使消息框有所归属,第一个参数设为当前窗口, 获取其句柄的方法是使用另一个API函数:GetActiveWindows(),且不需任何参数。
例1)Messagebox示例:
1.主要构件及属性的设置:
form1:caption:messagebox示例
bordericons:biMaximize和biHelp设为false
panel1:caption:文字部分Alignment:taLeftJustify
panel2:caption:图象部分Alignment:taLeftJustify
button1~button12:caption分别为:确定、确定取消、
确定帮助取消、是否、重试取消、终止重试取消、
信息、提问、系统图标、警告、停止、组合方式
bitbtn1:kind:bkClose
如图一所示:
2.事件说明:(详见源程序,下仅举两例)
{文字部分以button2click()为例}
procedureTForm1Button2Click(Sender:TObject);
begin
casemessagebox(getactivewindow(),
显示确定、取消框,例子,
okcancel)
ofidok:messagebox(getactivewindow(),
您按下的是“确定”按钮,
结果,mb_ok);
idcancel:messagebox(getactivewindow(),
您按下的是“取消”按钮,
结果,mb_ok);
end;
end;
{图象部分以button8click()为例}
procedureTForm1Button8Click(Sender:TObject);
begin
messagebox(getactivewindow(),显示警告图标,例子,
mb_iconwarning)
end;
二、改进Windows9x的系统登录的安全性:
Win9x的“用户登录”窗口可谓来者不拒,密码不 对照样可以“登堂入室”,系统为用户保留的个人设置等信息也就毫无保密性可言,通过查 看Profiles目录,可轻松地将其复制或删除。虽然Win95、Win98的应用对象是个人用户,但 在某些场合下,还是让登录窗口起点作用的好。
要使系统登录具有安全性,对非法使用者真正能 拒之门外,不妨用两个API函数来实现此目的。
例二)系统登录检查
1.主要构件及属性设置:
form1:caption:CheckUser
height、width:设为最小值
2.事件说明:
//定义变量
private
size:cardinal;
name:pchar;
entry:boolean;{Privatedeclarations}
procedureTCheckUserFormShow(Sender:TObject);
begin
size:=64;
name:=StrAlloc(64);
{检查用户名,判断是按了“取消”按钮还是键入了新用户名}
ifGetUsername(name,size)
thenifname=’wj’//‘wj’为笔者机器的登录用户名
{在此,若允许的合法使用者不止一个,还可利用关系运算指定
一个以上的用户进入。
如:if(name=’computer1’)or(name=’computer2’)
}
thenentry:=true;
close;
end;
procedureTCheckUserFormClose
(Sender:TObject;varAction:TCloseAction);
begin
ifnotentry
thenExitWindowsEx(EWX_REBOOT,32);
//若用户名不对,则重新启动Windows
end;
procedureTCheckUserFormCreate(Sender:TObject);
begin
entry:=false;//设定初始值
end;
编译完毕后,生成EXE文件,然后打开注册表—— 使用Regedit,找到HKEY_LOCAL_MACHINESOFTWAREMicrWindowsCurrentVersionRUN 行,添加键值名(如:CheckUser)及键值(EXE文件所在的完整路径)。如图所示:
好了,重新启动一次,没有正确的密码还能进入吗 ?
三.没有“媒体播放器”的声音播放
日前做了一个小程序,想在“关于”窗口加上一段 声音说明,但小小的“关于”FORM放上一个长长的、Visible属性需为False的MediaPlayer构 件实在别扭。东查西找之下,还是靠API函数SNDPLAYSOUND()解决了问题——从而摆脱了MediaPlayer 的“束缚”。例三)使用API函数控制声音文件的播放:(部分代码)
procedureTaboutBoxFormShow(Sender:TObject);
begin
//播放当前目录下的welcomewav文件
sndplaysound(‘welcomewav’,snd_async)
end;
procedureTAboutBoxFormClick(Sender:TObject);
begin
//停止播放
sndplaysound(‘’,snd_async);
end;
别忘了,在USES子句中加入mmsystem单元。如果只 需要播放声音,那么一条API函数就能实现功能的还用得着MediaPlayer来大动干戈吗?
总之,使用DELPHI的“聪明的程序员”们应该充分 发挥DELPHI调用API函数方便快捷的优势,好好利用API函数以更好地为自己程序服务。
这个是不是帮助文件里面的例子啊?我的和你差不多,成功过,你试试
double l1_endpt1[3] = {-14476606170268,23788333712953,00};
double l1_endpt2[3] = { 15471310496399,22539419253757,00};
double l2_endpt1[3] = {-14476606170268,12548103580189,00};
double l2_endpt2[3] = { 15471310496399,13797018039385,00};
double l3_endpt1[3] = {-14710981170268,18168218646571,00};
double l3_endpt2[3] = { 15289018829732,18168218646571,00};
double direction[3] = {00,00,10};
double ref_pt[3];
// double arc1_start_ang = (PI/180)87611984536731;
// double arc1_end_ang = (PI/180)27238801546327;
double arc1_start_ang = (PI/180)0;
double arc1_end_ang = (PI/180)360;
double arc1_rad = 05625;
double arc2_start_ang = (PI/180)27238801546327;
double arc2_end_ang = (PI/180)44761198453673;
double arc2_rad = 04375;
char part_name = "arm";
char taper_angle = "00";
char limit1[2] = {"10", "125"};
int english_units = 2, i, count = 4;
tag_t objarray[5], part, wcs_tag, matrix_tag;
uf_list_p_t loop_list, features;
UF_FEATURE_SIGN create = UF_NULLSIGN;
UF_CURVE_line_t line1, line2, line3;
UF_CURVE_arc_t arc1, arc2;
line1start_point[0] = l1_endpt1[0];
line1start_point[1] = l1_endpt1[1];
line1start_point[2] = l1_endpt1[2];
line1end_point[0] = l1_endpt2[0];
line1end_point[1] = l1_endpt2[1];
line1end_point[2] = l1_endpt2[2];
line2start_point[0] = l2_endpt1[0];
line2start_point[1] = l2_endpt1[1];
line2start_point[2] = l2_endpt1[2];
line2end_point[0] = l2_endpt2[0];
line2end_point[1] = l2_endpt2[1];
line2end_point[2] = l2_endpt2[2];
line3start_point[0] = l3_endpt1[0];
line3start_point[1] = l3_endpt1[1];
line3start_point[2] = l3_endpt1[2];
line3end_point[0] = l3_endpt2[0];
line3end_point[1] = l3_endpt2[1];
line3end_point[2] = l3_endpt2[2];
arc1start_angle = arc1_start_ang;
arc1end_angle = arc1_end_ang;
arc1arc_center[0] = l3_endpt1[0];
arc1arc_center[1] = l3_endpt1[1];
arc1arc_center[2] = l3_endpt1[2];
arc1radius = arc1_rad;
arc2start_angle = arc2_start_ang;
arc2end_angle = arc2_end_ang;
arc2arc_center[0] = l3_endpt2[0];
arc2arc_center[1] = l3_endpt2[1];
arc2arc_center[2] = l3_endpt2[2];
arc2radius = arc2_rad;
UF_CALL(UF_PART_new(part_name, english_units, &part));
UF_CALL(UF_CURVE_create_line(&line1,&objarray[0]));
UF_CALL(UF_CURVE_create_line(&line2,&objarray[1]));
UF_CALL(UF_CURVE_create_line(&line3,&objarray[4]));
UF_CALL(UF_CSYS_ask_wcs(&wcs_tag));
UF_CALL(UF_CSYS_ask_matrix_of_object(wcs_tag, &matrix_tag));
arc1matrix_tag = matrix_tag;
arc2matrix_tag = matrix_tag;
UF_CALL(UF_CURVE_create_arc(&arc1, &objarray[2]));
UF_CALL(UF_CURVE_create_arc(&arc2, &objarray[3]));
UF_CALL(UF_MODL_create_list(&loop_list));
// for(i = 0; i < count; i++) {
UF_CALL(UF_MODL_put_list_item(loop_list, objarray[2]));
// }
UF_CALL(UF_MODL_create_extruded(loop_list, taper_angle, limit1,
ref_pt, direction, create, &features));
我的UG卸掉了,你先试试这段行不行
未正确加载CATIA类型库文件。
在使用CATIA二次开发时,需要先加载CATIA的类型库文件。如果未正确加载类型库文件,则可能会导致无法使用apply等方法。
CATIA是汽车工业的事实标准,是欧洲、北美和亚洲顶尖汽车制造商所用的核心系统。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)