DELPHI Variant变量的运用技巧
delphi三种变量:全局变量,类变量,局部变量
delphi三种变量:全局变量,类变量,局部变量通常按照变量声明的范围,可以分为:全局变量,类变量,局部变量。
全局变量:是指在类外声明的变量,通常这种变量时在整个工程内有效的,也就是说在整个工程中的类都可以使用。
该变量的生存周期是在工程创建时有效,工程销毁时销毁。
类变量:是指在类中声明的变量,这种变量在类中的方法都可以使用。
其生命周期是在类创建时有效,类销毁时销毁。
局部变量:是指在方法内部声明的变量,这种变量只能在方法内部使用。
其生命周期也是在方法内部有效,当方法调用结束后,其内部所声明的变量也随之销毁。
正确声明3种变量的代码如下:TForm1=Class(TForm)Edit1 : TEdit;Label1 : TLabel;Button1 : TButton;Button2 : TButton;Button3 : Tbutton;procedure Button1Click(Sender : TObject);procedure Button2Click(Sender : TObject);procedure Button3Click(Sender : TObject);private{Private declarations}Name : String; //类变量;public{Public declarations}end;VarForm1 : TForm;Name : String;//全局变量。
//在implementation之上定义为全局都可以看见implementation//在implementation之下定义为本单元看见{$R *.dfm}procedure TForm1.Button1Click(Sender : TObject); varName : String; //局部变量;beginName := '局部变量';Edit1.Text := Name;end;end.。
delphi texpander的用法
在Delphi 中,TExtExpander 是一个用于扩展文本的组件。
它允许你在文本中添加自定义的标记,然后在运行时将其替换为指定的内容。
这可以用于创建可重复使用的文本模板,其中可以包含动态数据和固定文本。
以下是使用TTextExpander 的基本步骤:1. 在Delphi 的表单或对话框中,将TTextExpander 组件拖放到合适的位置。
2. 在TTextExpander 的属性窗口中,设置`Expanders` 属性以定义要扩展的标记。
每个标记都应该以`<%` 开头,以`%>` 结尾。
例如,`<%NAME%>` 表示一个占位符,可以将其替换为动态数据。
3. 在运行时,你可以使用TTextExpander 的`ExpandText` 方法来扩展标记。
该方法接受一个字符串参数作为输入文本,并返回扩展后的文本。
以下是一个简单的示例代码,演示了如何使用TTextExpander:```delphiprocedure TForm1.Button1Click(Sender: TObject);varexpander: TTextExpander;output: string;beginexpander := TTextExpander.Create(Self);try// 设置要扩展的标记expander.Expanders := '${NAME}, ${AGE}, ${CITY}';// 替换标记为动态数据output := expander.ExpandText('John Doe, 30, New York');// 显示扩展后的文本ShowMessage(output);finallyexpander.Free;end;end;```在上面的示例中,我们创建了一个TTextExpander 对象,并设置了要扩展的标记。
然后,我们调用`ExpandText` 方法,将标记替换为动态数据,并将结果存储在`output` 变量中。
DELPHI 表格控件DBGridEh全属性设置详解 最全的属性设置说明
DELPHI 表格控件DBGridEh属性设置详解----白波九道-----Allowedoperations[alopInsertEh,alopUpdateE h,alopDeleteEh,alopAppen dEh]允许操作类型:插入、更新、删除、追加Allowedselections[gstRecordBookmarks,gst Rectangle,gstColumns,gst All] gstRecordBookmarks:书签选中行 gstRectangle :区域选择 gstColumns :列选择 gstAll :所有AutoFitColWidths以自动重置列宽来设置网格的宽度等于客户区宽度AlwaysShowEditBu tton列显示下拉编辑按钮 AutoDropDown 自动下拉框DblClickNextVal 双击单元格为下一个值,数值为加1,列表下下一个 DropDownShowTitl es下拉框显示标题 DropDownSizing 下拉框可否手动调整大小 EndEllipsis 列内容显示不全的显示省略号 [Footer].Tooltips 底栏是否显示提示 HighLightRequired Layout内容位置 Alignment 标题对齐方式 Color 标题颜色EndEllipsis 标题过长用省略号结束 Orientation 标题文字方向 TitleButton 是否显示标题按钮 TitleTooltips 标题是否显示提示 ColumnDefValuesEh (列缺省值)Tooltips是否显示提示Columns[index]/Columns[ColumnName] 列对象,可用索引和名称调用 ColumnsOptimizeWidth根据内容自动调整列宽 Constraints 控件尺寸约束规定 ContraColCount 右侧锁定列 Ctl3D 3d 风格显示 Cursor显示鼠标指针样式 Active 激活数据分组 Color汇总行颜色DefaultStateExpand ed 默认显示是否为为全展开 Font 汇总行字体显示选项DataGrouping(数据分组设置) 表格中显示如EXCEL 中的分类汇总效果须加 MemT ableEh DataSetDriverEh,GroupLevels分组的级数如先按国别分组再按城市分GroupPanelVisible是否显示顶部的分组图示面板 ParentColor 使用父件颜色设置 Uses 添加EhLibMTE ParentFont 使用父件字体设置 AutoEdit自动提交表格修改到数据源 Dataset 数据集选项 Enabled 启用数据源 Datasoure (数据源设置) Tag 数据源标记(LongInt)DefaultDrawing 使用缺省的方式绘制表格,如为FALSE 须 OnDrawDataCell 事件中提供自己的例程 DrawGraphicDataDrawMemoText显示文本式备注字段EditActions[geaCutEh,geaCopyEh,gea PasteEh,geaDeleteEh,geaS electAllEh] 编辑属性,设置是否可以剪切、复制、粘贴、删除、选择 sebshowOnlyforCur Celleh只在当前单元格显示 sebshowOnlyforCur Roweh只在当前行显示 sebshowOnlyWhen GridActiveEh 当表格激活时显示EditButtonShowOptio ns(编辑按钮显示选项)sebshowOnlyWhen DataEditingEh当单元格进入编辑状态时显示 EvenRowColor 偶数行颜色FixedColor 固定区域颜色(如表头列头) Flat 平面显示效果(标题行渐变色须启用) Font 字体设置选项 FooterColor 底栏颜色 FooterFont 底栏字体设置 FooterRowCount 底栏行数 FrozenCols左侧冻结列数 ExtScrollBarSmoothStep True 平滑滚动/False 按列滚动 Tracking True 跟踪显示/Fasle 松开后显示 HorzScrollBar (水平滚动条设置) Visible 是否显示 Imemode 输入法模式选项 ImeName输入法 gioShowRowIndicatorEh 显示行指针 gioShowRecNoEh 显示行号 IndicatorOption (行首指示选项)gioShowRowselCheckbox esEh显示行选择框 IndicatorTitle (行道指示标题)DropdownMenupmNoVisibleCols/ PopupMenu1表头下拉菜单样式ShowDropdownSign显示下拉箭头图案 TitleButton 按钮是否启用 UseGlobalMenu用全局菜单 Left左端位置 MinAutoFitWidth 自适应宽度最小值 Name 控件名称 OddRowColor奇数行颜色 dgEdit能否编辑,dgAlwaysShowEditor 总是显示编辑项,选中时单击单元格直接进入编辑状态,否则双击进入编辑状态 dgTitles 显示列标题 dgIndicator 显示行首指针dgColumnResize 可否调整列宽 dgColLines 显示列线 dgRowLines 显示行线dgTabs 接收TAB 键移动到下一单元格 dgRowSelect整行选择 dgAlwaysShowSelection 显示选择区域 dgConfirmDelete 删除时确认 dgCancelOnExitOptions(表格通用选项)dgMultiSelect 可多行选择dghFixed3D 固定区(表头列头)3D 效果(渐变色须启用) dghFrozen3D 冷区3D 效果 dghFooter3D 栏底3D 效果 dghData3D数据区3D 效果 dghResizeWholeRightPartdghHighlightFocus 高光选择焦点dghClearSelection 移到下一个单元时是否清除已选记录 dghFitRowHeightToText 按文本适应行高 dghAutoSortMarking 自动排序 dghMultiSortMarking 多级排序 dghEnterAsTab 回车键作为TAB dghTraceColSizing 移动列宽时动态显示内容dghIncSearch允许在数据网格中进行增量搜索 Ctrl+F - 开始增量搜索。
DELPHI Variant变量的使用技巧
DELPHI Variant变量的使用技巧。
delphi 为了完全支持OLE,32位Delphi 增加了Variant 数据类型,本节将从宏观角度来分析这种数据类型。
实际上,Variant类型对Pascal语言有普遍而深入的影响,Delphi 控件库中与OLE 无关的地方也使用到这种类型。
Variant变量没有类型一般说来,你可以用Variant 变量存储任何数据类型,对它执行各种操作和类型转换。
需要注意的是:这违反了Pascal 语言的一贯原则,有悖于良好的编程习惯。
variant 变量的类型检查和计算在运行期间才进行,编译器不会提示代码中的潜在错误,这些错误在进一步测试中才能发现。
总之,你可以认为包含variant变量的代码是解释性代码,正如解释性代码一样,许多操作直到执行时才能知道,这对代码运行速度会有很大的影响。
上面对Variant 类型的使用提出了警告,现在来看看Variant 类型究竟能干什么。
基本上说,如果声明了一个variant 变量:varV: Variant;你就可以把各种不同类型的值赋给它:V := 10;V := 'Hello, World';V := 45.55;一旦得到一个variant 值,你可以把它拷贝给任何兼容或不兼容的数据类型。
如果你把值赋给不兼容的数据类型,Delphi 会力尽所能进行转换,无法转换则颁布一个运行时间错误。
实际上,variant变量中不仅包含了数据还包含有类型信息,并允许一系列运行时间操作,这些操作很方便,但运行速度慢且安全性差。
见例VariTest,它是上面代码的扩展。
窗体上有三个编辑框,一对按钮,第一个按钮的OnClick 事件代码如下:procedure TForm1.Button1Click(Sender: TObject);varV: Variant;beginV := 10;Edit1.Text := V;V := 'Hello, World';Edit2.Text := V;V := 45.55;Edit3.Text := V;end;很有趣是不是?你可以把一个值为字符串的variant 变量赋给编辑框Text 属性,还可以把值为整数或浮点数的variant 变量赋给Text 属性。
delphi变异系数
delphi变异系数
Delphi方法是一种专家调查技术,旨在通过多轮匿名调查来获取专家意见,以便预测未来事件或趋势。
变异系数是描述数据变异程度的统计量,通常用来衡量数据的离散程度。
在Delphi方法中,变异系数可以用来衡量专家意见的一致性或者不一致性。
在使用Delphi方法时,可以计算专家对于某一问题的意见或预测的变异系数,以评估专家意见的一致性。
如果变异系数较小,说明专家意见比较一致,反之则意见差异较大。
这有助于研究人员判断专家组的一致性程度,从而决定是否需要进行进一步的调查或讨论。
另外,变异系数还可以用来比较不同专家组之间的一致性,或者在Delphi方法的不同轮次中专家意见的变化情况。
通过对变异系数的分析,可以更好地理解专家意见的分布情况,有助于提高Delphi方法的预测准确性和可靠性。
总之,变异系数在Delphi方法中可以作为衡量专家意见一致性的重要指标,有助于评估专家组的一致性程度,从而提高预测结果的可靠性。
delphi中操作Excel用分列方法将数字转换为文本格式
delphi中操作Excel用分列方法将数字转换为文本格式在Delphi中操作Excel,可以使用Variant类型和OleVariant类型与Excel进行交互。
要将Excel单元格的数字转换为文本格式,可以使用如下的分列方法:1. 使用Variant类型声明并打开Excel文件:```delphivarExcelApp: Variant;beginExcelApp := CreateOleObject('Excel.Application');ExcelApp.Visible := True; // 可见Excel应用窗口ExcelApp.Workbooks.Open('路径\文件名.xlsx');//打开或新建工作表等操作end;```2.选择并操作单元格:```delphivarSheet: Variant;beginSheet := ExcelApp.Worksheets['Sheet1'];//获取单元格的数值varCellValue: Double;beginCellValue := Sheet.Cells[1, 1].Value;//将数值转换为文本Sheet.Cells[1, 1].Value := FloatToStr(CellValue);end;```3. 关闭Excel应用:```delphiExcelApp.Quit;ExcelApp := Unassigned;```以上代码片段将Excel文件中的第一个单元格的数值转换为文本格式。
delphi 引用方法
delphi 引用方法摘要:1.Delphi简介2.Delphi引用方法概述3.引用类型的分类与使用4.引用在Delphi编程中的应用实例5.总结与建议正文:【1.Delphi简介】Delphi是一种强大的编程语言,起源于Borland公司的Turbo Pascal。
它具有高效率、易学易用和跨平台等特点,广泛应用于各种领域的软件开发。
Delphi的语法结构类似于Pascal,同时吸收了C++和Java的一些特性,成为一种独特的中型编程语言。
【2.Delphi引用方法概述】在Delphi中,引用是一种特殊的变量,它存储的是另一个变量的内存地址。
引用可以为整数、实数、字符串等数据类型。
引用方法主要包括声明引用、初始化引用、使用引用变量等。
【3.引用类型的分类与使用】1.值类型引用:适用于整数、实数等基本数据类型。
2.指针类型引用:适用于存储内存地址的场景,如动态内存分配。
3.对象类型引用:适用于面向对象编程,如类、结构体等。
4.数组类型引用:适用于数组数据的操作。
【4.引用在Delphi编程中的应用实例】1.动态内存分配:使用指针类型引用,如:```delphivarPtr: Pointer;beginPtr := AllocMem(1024); // 分配1024字节内存if Ptr <> nil thenbegin// 在这里使用Ptr指向的内存区域FreeMem(Ptr); // 释放内存end;end;```2.类之间的引用:使用对象类型引用,如:```delphi// 定义一个简单的人格类classPerson: TObject{publicconstructor Create(const Name: string);procedure SayHello;end;// 构造函数constructor TPerson.Create(const Name: string) begininherited Create;FName := Name;end;// 方法procedure TPerson.SayHello;beginWriteln("Hello, my name is " + FName);end;}varPerson1: TPerson;beginPerson1 := TPerson.Create("张三");Person1.SayHello; // 输出:Hello, my name is 张三end;```【5.总结与建议】在Delphi编程中,引用是一种非常实用的编程技巧。
Delphi实用技巧经验(图文)
‘’空‘’空格空格调整对齐方式窗体的visible属性设置相当于showmodalaq一行一行执行,所以要把一些语句写在循环里(除了在grid添加数据)Caption,Text:显示名Name:系统名Sql表:create,drop,alter 数据:insert,delete,update数据模块在uses里时用文件名,调用时用系统名全局变量:用于不同表单间的传值。
如在public中定义变量a,使用时把值赋给form.a,具体可参考设置第一列为下拉式菜单Delphi设置切换窗体project-options-forms 字体tools-options-display问题处理属性栏消失按F11Image提示“unknown picture file extension(.jpg) ”在uses中加Jpeg重建某个窗体(如unit2):新建unit1unit2,退出再重建,使之产生dcu文件,再将这三个文件复制到所需目录下,同时删除history 文件夹DBGrid某列的小数位数(at默认会去掉末尾的0,如1.00->1)TFloatField(dbGrid1.Columns[2].Field).DisplayFormat := '0.00'; 函数定位posex(str1, str2,[n]) 在str1在str2从n的位置开始的位置,默认从1开始,输出int类型,必须在uses中加入StrUtils posex('b','abcabcabc',3)=5复制copy(str,2,3),输入输出都是str,如copy(inttostr(1234),2,2)=23长度length(str) 输出int重复dupestring(chr(9),10) 将Tab重复10次,必须在uses中加入StrUtils左取leftstr(str,2),rightstr(str,2),必须在uses中加入StrUtils保留小数位数(2位),会四舍五入FormatFloat('0.00',1.111),str类型格式小数小数定义成real,转换floattoint,inttofloat;floattostr ,strtofloat Asfloat 验证trystrtofloat(同理trystrtoint)Vars: string;x:double;begins:='123.45x';if not trystrtofloat(s,x)then showmessage('数据类型转换出错');end保留小数位数(2位),会四舍五入FormatFloat('0.00',1.111),str类型DBGrid某列的小数位数(默认会去掉末尾的0,如1.00->1,下面语句只改变DBGrid显示格式,若从at取出数据给edit,显示的还是去0,但是sql表中定义成money类型而delphi中提交如1,则sql表中自动转换为 1.00)TFloatField(dbGrid1.Columns[2].Field).DisplayFormat := '0.00';日期定义成date1:TDateTime,转换用datetostr, strtodate [ if not TryStrToDate(str,date1) then...] AsDateTime常见键值vbKeyBack 8 BACKSPACE 键vbKeyTab 9 TAB 键vbKeyReturn 13 ENTER 键警告窗口application.MessageBox('输入内容','标题 ', MB_ICONEXCLAMATION);1.指定讯息视窗上的图示1.1 MB_ICONEXCLAMATION 或 MB_ICONWARNING出现「黄三角形内有一个惊叹号」图示1.2 MB_ICONINFORMATION 或 MB_ICONASTERISK出现「白色椭圆内有一个蓝色小写 i」图示1.3 MB_ICONQUESTION出现「问号」图示1.4 MB_ICONSTOP 或 MB_ICONERROR 或 MB_ICONHAND出现「红色X」图示2.指定讯息视窗出现的按钮2.1 MB_ABORTRETRYIGNORE出现「Abort」「Retry」「Ignore」三个按钮2.2 MB_OK出现「Ok」按钮,为预设值。
delphi 变体类型(variant)的介绍(流与变体类型的相互转换变体类型常用的函数
delphi 变体类型(variant)的介绍(流与变体类型的相互转换变体类型常用的函数一、变体类型常用的函数介绍:Variant:一种可以拥有各种数据类型;也可以告诉目前存储的数据是什么类型(通过使用VarType函数);可以给相同的Variant分配不同的数据类型,只要Variant包含数字值就可以执行算法;variant数组只不过是variant型的数组,不必包含同类型的数据;1、VarArrayOf函数:更快捷的创建一维变体数组,可以创建全异的数值数组;function VarArrayOf(const Values: array of Variant): Variant;VarArrayOf是一种快速(写代码快而不是运行快)的方法生成一个一维Variant数据的方法,它接受一个Variant 类型的Open Array,用这个数据生成一个一维的Variant Array of Variant(类型为Variant)。
由于Delphi对Open Array类型参数的支持,使你可以用一行语句生成一个数组。
不过它有两个缺陷:只能生成一维数组;只能生成元素类型是Variant的数组。
使用Variant数组, 与使用标准Delphi数组类似;例如:MyArray := VarArrayOf(['李维',30,'60', 60.369,'China']);2、VarArrayCreate函数:function VarArrayCreate(const Bounds: array of Integer; VarType: TVarType): Variant;Bounds: 告诉数组的上下界;VarType: 决定了数组的中存储什么类型的数据。
其它的数组(如二维、或者其他类型等)只能用VarArrayCreate去创建,并用循环给元素赋值。
例如:创建数组的数组, 可以模仿任何类型的数据结构类型:VarArrayX := VarArrayCreate([1,10], varVariant);数组的单个元素可以装载一个数组:VarArrayX[1] := VarArrayCreate([1,5], varVariant);3、VarArrayHighBound、VarArrayLowBound函数:返回变体数组上/下限,从1开始(1:列;2:行;3:3维的最后一维)。
variant变量说明
见例VariTest,它是上面代码的扩展。窗体上有三个编辑框,一对按钮,第一个按钮的OnClick 事件代码如下:
procedure TForm1.Button1Click(Sender: TObject);
var
V: Variant;
begin
V := 10;
Edit1.Text := V;
Variant类型内部结构
Delphi中定义了一个 variant 记录类型,TVarData,它与Variant 类型有相同的内存布局。你可以通过TVarData访问variant变量的实际类型。TVarData 结构中包含了Variant类型信息(由Vtype域表示)、一些保留域及当前值。
VType域的取值包括OLE 自动化中的所有数据类型,这些类型通常叫OLE 类型或variant 类型。以下是variant 类型的完整列表,按字母顺序排列:
varArray
varBoolean
varByRef
varCurrency
varDate
varDispatch
Delphi技巧-Variant类型2007-06-21 12:31为了完全支持OLE,32位Delphi 增加了Variant 数据类型,本节将从宏观角度来分析这种数据类型。实际上,Variant类型对Pascal语言有普遍而深入的影响,Delphi 控件库中与OLE 无关的地方也使用到这种类型。
一旦得到一个variant 值,你可以把它拷贝给任何兼容或不兼容的数据类型。如果你把值赋给不兼容的数据类型,Delphi 会力尽所能进行转换,无法转换则颁布一个运行时间错误。实际上,variant变量中不仅包含了数据还包含有类型信息,并允许一系列运行时间操作,这些操作很方便,但运行速度慢且安全性差。
数据库操作语句中变量的使用-Delphi
数据库操作语句中变量的使用 -Delphi
delphi及sql的语句中,字符串都需要用单引号,为了处理方便以及安全考虑,我使用了参数,刚从网上搜的是这样的方式:
cmd.Parameters.CreateParameter()
mandText:=sql; cmd.Parameters.ParamByName('UN').Value:= edit1.Text; cmd.Parameters.ParamByName('PW').Value:= edit2.Text; cmd.Parameters.ParamByName('RM').Value:= edit3.Text; cmd.Parameters.ParamByName('MO').Value:= edit4.Text; cmd.Parameters.ParamByName('CK').Value:= ckd; cmd.Parameters.ParamByName('ID').Value:= edit5.Text;
含有四个参数,麻烦不说,还总是出错,甚是烦人,后来查阅பைடு நூலகம்料,改成下面的方式,就没那么多事了。
sql:='UPDATE tb_register SET reg_username = :UN,reg_password = :PW,' +'reg_check = :CK,reg_readme = :RM,reg_memo = :MO WHERE id = :ID';
delphi olevariant 判断
delphi olevariant 判断如何在Delphi中使用OLEVariant进行类型判断在Delphi中,OLEVariant是一种特殊的数据类型,用于在不同类型之间进行转换和操作。
在某些情况下,我们可能需要判断OLEVariant的具体类型,以便执行相应的操作。
本文将介绍如何使用Delphi的OLEVariant 进行类型判断。
在Delphi中,OLEVariant类型是一种动态变量类型,可以包含来自不同COM服务器的数据。
它可以自动进行类型转换,以适应所需的操作。
为了使用OLEVariant进行类型判断,我们需要使用VarType函数。
VarType函数返回OLEVariant变量的具体类型。
它返回一个整数值,该值表示变量的类型代码。
我们可以使用该类型代码来判断变量的具体类型。
以下是一些常见的类型代码及其对应的类型:1. varEmpty:空变量2. varNull:Null变量3. varSmallint:16位整数4. varInteger:32位整数5. varSingle:单精度浮点数6. varDouble:双精度浮点数7. varCurrency:货币类型8. varDate:日期类型9. varOleStr:字符串类型10. varBoolean:布尔类型11. varUnknown:未知类型12. varDispatch:派发类型13. varError:错误类型为了演示如何使用VarType进行类型判断,让我们考虑一个简单的示例。
假设我们有一个OLEVariant变量V,我们想要判断它是什么类型。
varV: OLEVariant;初始化VV := 123;使用VarType判断类型case VarType(V) ofvarSmallint, varInteger:ShowMessage('整数');varSingle, varDouble:ShowMessage('浮点数');varDate:ShowMessage('日期');varOleStr, varString:ShowMessage('字符串');varBoolean:ShowMessage('布尔值');elseShowMessage('未知类型');end;在上面的示例中,我们定义了一个OLEVariant变量V并将其初始化为整数值123。
DELPHI Variant变量的使用技巧
DELPHI Variant变量的使用技巧。
delphi 为了完全支持OLE,32位Delphi 增加了Variant 数据类型,本节将从宏观角度来分析这种数据类型。
实际上,Variant类型对Pascal语言有普遍而深入的影响,Delphi 控件库中与OLE 无关的地方也使用到这种类型。
Variant变量没有类型一般说来,你可以用Variant 变量存储任何数据类型,对它执行各种操作和类型转换。
需要注意的是:这违反了Pascal 语言的一贯原则,有悖于良好的编程习惯。
variant 变量的类型检查和计算在运行期间才进行,编译器不会提示代码中的潜在错误,这些错误在进一步测试中才能发现。
总之,你可以认为包含variant变量的代码是解释性代码,正如解释性代码一样,许多操作直到执行时才能知道,这对代码运行速度会有很大的影响。
上面对Variant 类型的使用提出了警告,现在来看看Variant 类型究竟能干什么。
基本上说,如果声明了一个variant 变量:varV: Variant;你就可以把各种不同类型的值赋给它:V := 10;V := 'Hello, World';V := 45.55;一旦得到一个variant 值,你可以把它拷贝给任何兼容或不兼容的数据类型。
如果你把值赋给不兼容的数据类型,Delphi 会力尽所能进行转换,无法转换则颁布一个运行时间错误。
实际上,variant变量中不仅包含了数据还包含有类型信息,并允许一系列运行时间操作,这些操作很方便,但运行速度慢且安全性差。
见例VariTest,它是上面代码的扩展。
窗体上有三个编辑框,一对按钮,第一个按钮的OnClick 事件代码如下:procedure TForm1.Button1Click(Sender: TObject);varV: Variant;beginV := 10;Edit1.Text := V;V := 'Hello, World';Edit2.Text := V;V := 45.55;Edit3.Text := V;end;很有趣是不是?你可以把一个值为字符串的variant 变量赋给编辑框Text 属性,还可以把值为整数或浮点数的variant 变量赋给Text 属性。
VARIANT类型的用法
VARIANT类型的⽤法 VARIANT的结构可以参考头⽂件VC98\Include\OAIDL.H中关于结构体tagVARIANT的定义。
对于VARIANT变量的赋值:⾸先给vt成员赋值,指明数据类型,再对联合结构中相同数据类型的变量赋值,举个例⼦:VARIANT va;int a=2001;va.vt=VT_I4;///指明整型数据va.lVal=a; ///赋值 对于不马上赋值的VARIANT,最好先⽤Void VariantInit(VARIANTARG FAR* pvarg);进⾏初始化,其本质是将vt设置为VT_EMPTY,下表我们列举vt与常⽤数据的对应关系:unsigned char bVal; VT_UI1short iVal; VT_I2long lVal; VT_I4float fltVal; VT_R4double dblVal; VT_R8VARIANT_BOOL boolVal; VT_BOOLSCODE scode; VT_ERRORCY cyVal; VT_CYDATE date; VT_DATEBSTR bstrVal; VT_BSTRIUnknown FAR* punkVal; VT_UNKNOWNIDispatch FAR* pdispVal; VT_DISPATCHSAFEARRAY FAR* parray; VT_ARRAY|*unsigned char FAR* pbVal; VT_BYREF|VT_UI1short FAR* piVal; VT_BYREF|VT_I2long FAR* plVal; VT_BYREF|VT_I4float FAR* pfltVal; VT_BYREF|VT_R4double FAR* pdblVal; VT_BYREF|VT_R8VARIANT_BOOL FAR* pboolVal; VT_BYREF|VT_BOOLSCODE FAR* pscode; VT_BYREF|VT_ERRORCY FAR* pcyVal; VT_BYREF|VT_CYDATE FAR* pdate; VT_BYREF|VT_DATEBSTR FAR* pbstrVal; VT_BYREF|VT_BSTRIUnknown FAR* FAR* ppunkVal; VT_BYREF|VT_UNKNOWNIDispatch FAR* FAR* ppdispVal; VT_BYREF|VT_DISPATCHSAFEARRAY FAR* FAR* pparray; VT_ARRAY|*VARIANT FAR* pvarVal; VT_BYREF|VT_VARIANTvoid FAR* byref; VT_BYREF _variant_t是VARIANT的封装类,其赋值可以使⽤强制类型转换,其构造函数会⾃动处理这些数据类型。
delphi全局变量的定义与初始化赋值
delphi全局变量的定义与初始化赋值delphi全局变量的定义与赋值主要有下⾯⼏种⽅法:1.全局变量的初始化在最后结束的end.之前,增加initialization关键字,然后加⼊对全局变量的初始化,这样就可以初始化全局变量了.不论在interface还是在implementation部分的全部变量,都可以这么来初始化//省略前⾯的interface, uses, type.vari: Integer;implementationvarj: Integer;{$R *.dfm}procedure TForm1.Button1Click(Sender: TObject);beginInc(i);Inc(j);Form1.Caption := IntToStr(i) + ' ' + IntToStr(j);end;initializationi := 100;j := 200;end.2. 新建⼀个公⽤单元,专门放置公⽤全局变量呗unit untCommon;interfacevarv1:integer;v2:string;end.-----------------unit unit1;interfaceuseswindows, ................, untCommon ; //在每个需要使⽤v1、v2变量的单元中引⽤上⾯那个单元untCommon就可以了3.跟⼀般变量赋值差不多!unit Unit1;interfaceusesWindows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,Dialogs, StdCtrls;typeTForm1 = class(TForm)Button1: TButton;Button2: TButton;procedure Button1Click(Sender: TObject);procedure Button2Click(Sender: TObject);private{ Private declarations }public{ Public declarations }end;varForm1: TForm1;///////////////////////////////在 implementation上定义的全局变量在所有单元可见 var teststr:string;implementation{$R *.dfm}////////////////////////////////在implementation下定义的只对本单元可见var teststr1:string;procedure TForm1.Button1Click(Sender: TObject); begin////////////////////////对teststr赋值teststr := '我是对所有单元都可见的';showmessage(teststr);end;procedure TForm1.Button2Click(Sender: TObject); begin///////////////////////对teststr11赋值teststr1 := '我只对本单元可见';showmessage(teststr1);end;end.。
delphi 数据类型数据操作.
算术运算符算术运算符接受实数或整数作为操作数。
算术运算符包括+, -, *, /, div, mod。
运算符操作操作数结果类型范例+加整数,实数整数,实数X + Y-减整数,实数整数,实数Result - 1*乘整数,实数整数,实数P * InterestRate /实数除整数,实数实数X / 2div整数除整数整数Total div UnitSize mod取模整数整数Y mod 6运算符操作操作数结果类型范例+(一元符号等同整数,实数整数,实数+7-(一元符号相反整数,实数整数,实数-X下列规则对算术运算符试用:·表达式 x/y 的值始终是Extended类型,而不管 x 和 y 是何类型。
对于其他算术运算符,只要至少其中一个操作数是实数,其运算结果就是Extended类型;否则,其中一个操作数是Int64类型,其运算结果是Int64类型;否则运算结果是Integer类型。
如果一个操作数的类型是整数类型的子界,那么它将被视为整数类型。
·表达式 x div y 的值是表达式 x/y 的值向零取整(即从该值到零方向的第一个整数。
· mod 运算符返回操作数整除的余数。
也就是说,x mod y = x - (x div y * y。
·对于表达式x/y、x div y、x mod y,当 y 为零时将发生运行时错误。
布尔运算符布尔运算符not、and、or、xor操作任何布尔类型的操作数并返回Boolean类型的值。
运算符操作操作数类型结果类型范例否定布尔型Boolean not (C in MySetand与布尔型BooleanDone and (Total > 0or或布尔型BooleanA or Bxor异或布尔型BooleanA xor B这些运算符遵循标准的布尔逻辑。
例如表达式 x and y 为真(True当且仅当 x 和y 均为真(True。
delphi变体记录如何使用
delphi变体记录如何使用delphi的变体记录类型变体的条件是什么?TEmployee = recordID: Integer;case Integer of0:(YearMoney: Integer);1:(MonthMoney: ShortInt);end;上面变体记录类型什么时候该选择0什么时候该选择1,这个条件是什么?系统怎么判定的,还有case integer of 这句怎么解析?谢谢大家。
精彩回答这样理解是有误的,这只是一种写法,并不是要赋给0,1什么的,表示的是这个记录有两种变体。
系统跟据你所使用的成员变量名称来自动进行判断。
case integer of 其实是指对一块内存的不同解读方式,YearMoney,MonthMoney会共用一块系统为其分配的内存。
var emp: TEmployee你这样的输入emp.的时候就会显示如上两个属性(即所有的),怎么用就是你自己的事了。
系统不会判定到底是0还是1,这个都是你自己处理的,你自己判定到底用哪个值,你可以把结构改成这样:TEmployee = recordID: Integer;case t:Integer of//注意:这里加了个t,用来区分用0还是用10:(YearMoney: Integer);1:(MonthMoney: ShortInt);end;给这个结构赋值的时候,你自己要赋给t一个值,这样你才能判断是年薪还是月薪。
变体结构最大的意义是内存共享,象你上面的结构,其实YearMoney和MonthMoney都用同一块内存(虽然它们长度不一样),这样,当你给一个赋值时另一个也会有值,只是因为数据类型不同而有不同的表现结果。
给你起一个简单的例子你就明白了,比如Delphi中的TColor(颜色类型),其实它是一个整型,而我们知道,颜色是由红(r),绿(g),蓝(b)三原色组成的,那我们怎么知道一个颜色值的R,G,B值各是多少呢?请看下面:定义一个变体结构:TypeTColorRec=recordcase Integer of0:(Color:TColor);1:(r,g,b:Byte);end;定义结构体后,其实Color和r,g,b三个都共享一块内存,但是TColor是整型占四个字节,而r,g,b三个总共只占三个字节,所以有一个字节没用上。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
DELPHI Variant变量的使用技巧。
delphi 为了完全支持OLE,32位Delphi 增加了Variant 数据类型,本节将从宏观角度来分析这种数据类型。
实际上,Variant类型对Pascal语言有普遍而深入的影响,Delphi 控件库中与OLE 无关的地方也使用到这种类型。
Variant变量没有类型一般说来,你可以用Variant 变量存储任何数据类型,对它执行各种操作和类型转换。
需要注意的是:这违反了Pascal 语言的一贯原则,有悖于良好的编程习惯。
variant 变量的类型检查和计算在运行期间才进行,编译器不会提示代码中的潜在错误,这些错误在进一步测试中才能发现。
总之,你可以认为包含variant变量的代码是解释性代码,正如解释性代码一样,许多操作直到执行时才能知道,这对代码运行速度会有很大的影响。
上面对Variant 类型的使用提出了警告,现在来看看Variant 类型究竟能干什么。
基本上说,如果声明了一个variant 变量:varV: Variant;你就可以把各种不同类型的值赋给它:V := 10;V := 'Hello, World';V := 45.55;一旦得到一个variant 值,你可以把它拷贝给任何兼容或不兼容的数据类型。
如果你把值赋给不兼容的数据类型,Delphi 会力尽所能进行转换,无法转换则颁布一个运行时间错误。
实际上,variant变量中不仅包含了数据还包含有类型信息,并允许一系列运行时间操作,这些操作很方便,但运行速度慢且安全性差。
见例VariTest,它是上面代码的扩展。
窗体上有三个编辑框,一对按钮,第一个按钮的OnClick 事件代码如下:procedure TForm1.Button1Click(Sender: TObject);varV: Variant;beginV := 10;Edit1.Text := V;V := 'Hello, World';Edit2.Text := V;V := 45.55;Edit3.Text := V;end;很有趣是不是?你可以把一个值为字符串的variant 变量赋给编辑框Text 属性,还可以把值为整数或浮点数的variant 变量赋给Text 属性。
正如你在图10.1中所看到的,一切正常。
(图10.1)按Assign按钮后,例VariTest的输出结果图10.1: 例VariTest 的Assign 按钮Click 事件输出结果更糟糕的是:你还可以用variant变量计算数值,从第二个按钮的Click事件代码就可看到这一点:procedure TForm1.Button2Click(Sender: TObject);varV: Variant;N: Integer;beginV := Edit1.Text;N := Integer(V) * 2;V := N;Edit1.Text := V;end;至少这种代码带有一定危险性,如果第一个编辑框包含了一个数字,那么一切运行正常;如果不是,将会引发异常。
这里再重申一遍,如果不到万不得以,不要随便使用Variant 类型,还是应坚持使用传统的Pascal 数据类型和类型检查方法。
在Delphi 和VCL中,variant变量主要是用于OLE 支持和数据库域的访问。
Variant类型内部结构Delphi中定义了一个variant 记录类型,TVarData,它与Variant 类型有相同的内存布局。
你可以通过TVarData访问variant变量的实际类型。
TVarData 结构中包含了Variant类型信息(由Vtype域表示)、一些保留域及当前值。
VType域的取值包括OLE 自动化中的所有数据类型,这些类型通常叫OLE 类型或variant 类型。
以下是variant 类型的完整列表,按字母顺序排列:varArrayvarBooleanvarByRefvarCurrencyvarDatevarDispatchvarDoublevarEmptyvarErrorvarIntegervarNullvarOleStrvarSinglevarSmallintvarStringvarTypeMaskvarUnknownvarVariant你可以在Delphi 帮助系统的variants 主题下找到这些类型的说明。
还有许多操作variant 变量的函数,你可以用它们进行特定的类型转换,或通过它们获取variant变量的类型信息(例如VarType 函数),当你用variant变量写表达式时,Delphi会自动调用这些类型转换和赋值函数。
另外还有操作variant 数组的例程,你可以通过帮助文件的Variant support routines 主题了解相关内容。
Variant类型运行很慢!Variant 类型代码运行很慢,不仅数据类型转换如此,两个值为整数的Variant 变量相加也是如此。
它们几乎跟Visual Basic这种解释性代码一样慢!为了比较Variant变量和整型变量的运行速度,请看例VSpeed 。
程序中设置了一个循环,记录运行时间并在进程条中显示运行状态。
下面是基于variant类型的一段代码,基于整型的代码与此相似:procedure TForm1.Button1Click(Sender: TObject);vartime1, time2: TDateTime;n1, n2: Variant;begintime1 := Now;n1 := 0;n2 := 0;ProgressBar1.Position := 0;while n1 < 5000000 dobeginn2 := n2 + n1;Inc (n1);if (n1 mod 50000) = 0 thenbeginProgressBar1.Position := n1 div 50000;Application.ProcessMessages;end;end;// we must use the resultTotal := n2;time2 := Now;Label1.Caption := FormatDateTime ('n:ss', Time2-Time1) + ' seconds';end;记时这段代码值得一看,因为你可以把它用到任何类型的性能测试中。
正如你所看到的,程序用Now 函数获取当前的时间,用FormatDateTime 函数格式化时间差,输出结果以分("n")和秒("ss")表示。
除此之外,你可以用Windows API的GetTickCount 函数,该函数能精确显示操作系统启动后至当前的毫秒数。
从上例可见两者的速度差异非常之大,以至于不用精确记时也能看到这种差异。
图10.2是在本人计算机上运行程序看到的结果。
当然运行结果取决于运行程序的计算机,但是两者的数值比不会有太大变化。
Delphi笔记(整理)-变体博客分类:学习笔记Delphi数据结构J#除结构类型和指针外,变体类型能存储其它的任何类型;变体类型能存储接口,并能通过它使用接口的方法和属性(参考Object interfaces);变体类型能存储动态数组,也能存储一种特殊的静态数组:变体数组(Variant array)。
变体类型能和其它变体类型、整数、实数、字符串和布尔值在表达式和赋值语句中混合使用,编译器自动完成类型转换。
可以通过自定义来扩展变体类型,从而能存储任意值。
比如,你可以定义一个使用索引的变体字符串类型,或者让它存储特定的类引用、记录或静态数组。
自定义变体类型通过TCustomVariantTyp 的子类来创建。
所有的变体类型在创建时被初始化为Unassigned,Null 表示未知或没有数据。
赋空值:VarV:Variant;v:=vaNil;标准函数VarType 返回变体类型的类型码,常量varTypeMask 是一个位掩码,用来从VarType 的返回值中提取类型码,所以,在下面的例子中VarType(V) and varTypeMask = varDouble若V 包含Double 或Double 数组,则它返回True在System 单元定义的TVarData 记录类型能被用来转换变体类型,并且可以访问它们的内部构造。
VarAsType 和VarCast 标准例程能用来改变一个Variant 的内部表示。
除了^、is 和in,所有运算符都可以使用Variant 作为运算数对Variant 的操作返回Variant 值;若有一个运算数是Null 则结果为Null;若有一个运算数为Unassigned 则引发异常。
在二元运算中,若只有一个运算数是Variant,则另一个被转换为Variant。
不能把一个普通的静态数组赋给Variant,取而代之的是,通过调用VarArrayCreate 或VarArrayOf 两者之一来创建Variant 数组。
比如,V: Variant;...V := VarArrayCreate([0,9], varInteger);要创建字符串类型的Variant 数组,使用varOleStr使用VarArrayRedim 函数来更改Variant 数组的大小。
其它用于Variant 数组的标准例程包括VarArrayDimCount 、VarArrayLowBound 、VarArrayHighBound 、VarArrayRef 、VarArrayLock 和VarArrayUnlock.。
Variant 和OleVariant 的主要区别是,Variant 能包含只有当前程序才能理解的数据类型,OleVariant 只包含为Ole 自动化兼容而定义的数据类型,它说明,这些数据类型能在程序间或通过网络传送,而不必担心另一端是否知道如何处理它们。
typeT1 = Integer;T2 = T1;T3 = Integer;T4 = T2;T1、T2、T3、T4 和Integer 都是指的同一种类型。
要声明一种不同的类型,在声明中重复type 关键字。
比如type TMyInteger = type Integer;创建了一种新类型TmyInteger,它和Integer 不同。
一个类型声明指定一个标志符,来表示一种数据类型。
类型声明的语法为type newTypeName = type这里,newTypeName 是一个有效的标志符。
比如,给定如下的类型声明type TMyString = string;你就可以声明变量var S: TMyString;同时声明多个变量时不能包括初始化,Variant 和文件类型的变量声明也不能初始化。