关于VisiBroker For Delphi的使用
DELPHI控件属性方法事件及常用函数
DELPHI控件属性方法事件及常用函数DELPHI是一种面向对象的编程语言,用于开发Windows平台上的应用程序。
在DELPHI中,控件是程序的可视化部件,用于用户界面的创建和交互。
以下是一些常用的DELPHI控件属性、方法、事件和常用函数的详细介绍。
一、控件属性:1. Name属性:用于指定控件的名称,以便在程序中引用它。
2. Caption属性:用于指定控件的显示文本。
3. Visible属性:用于控制控件是否可见。
4. Enabled属性:用于控制控件是否可用。
5. Color属性:用于指定控件的背景颜色。
6. Font属性:用于指定控件的字体。
7. Width和Height属性:用于指定控件的宽度和高度。
8. Top和Left属性:用于指定控件在父容器中的位置。
9. Parent属性:用于指定控件的父容器。
二、控件方法:1. SetFocus方法:用于使控件获得焦点。
2. Show方法:用于显示当前控件。
3. Hide方法:用于隐藏当前控件。
4. BringToFront方法:用于将当前控件移到其他控件之前显示。
5. SendToBack方法:用于将当前控件移到其他控件之后显示。
6. Invalidate方法:用于使控件的绘制区域无效,触发重绘操作。
三、控件事件:1. OnClick事件:当用户单击控件时触发。
2. OnDblClick事件:当用户双击控件时触发。
3. OnEnter事件:当控件获得焦点时触发。
4. OnExit事件:当控件失去焦点时触发。
5. OnKeyPress事件:当用户按下键盘上的字符键时触发。
6. OnMouseDown事件:当用户按下鼠标按钮时触发。
7. OnMouseUp事件:当用户释放鼠标按钮时触发。
8. OnMouseMove事件:当用户移动鼠标时触发。
四、常用函数:1. ShowMessage函数:用于在屏幕上显示一个消息框。
2. MessageBox函数:用于在屏幕上显示一个消息框,并且返回用户的选择。
delphi superobject 用法 -回复
delphi superobject 用法-回复Delphi SuperObject是Delphi编程语言中的一个开源类库,用于处理和操作JSON数据。
它提供了一种方便的方式来解析、创建和修改JSON文档,使开发人员能够轻松地在Delphi应用程序中处理JSON数据。
本文将详细介绍Delphi SuperObject的用法,以帮助读者理解如何使用该类库进行JSON数据的处理。
第一步:了解JSON和Delphi SuperObject在深入使用Delphi SuperObject之前,我们首先需要了解JSON数据格式以及Delphi SuperObject类库的基本概念。
JSON(JavaScript Object Notation)是一种用于数据交换的轻量级数据格式,具有易于阅读和编写的特点。
它由键值对组成,这些键值对可以嵌套并且可以包含基本数据类型(如字符串、整数、布尔值等)以及复杂的数据结构(如数组、对象等)。
Delphi SuperObject是一个库,为Delphi开发人员提供了一种方便的方式来处理JSON数据。
它提供了一组类和方法,可以轻松地解析、创建和修改JSON文档。
Delphi SuperObject支持多种方法来访问和操作JSON 数据,包括通过路径访问、操作对象和数组等。
第二步:安装和导入Delphi SuperObject要使用Delphi SuperObject,我们首先需要在Delphi开发环境中安装和导入这个库。
以下是安装和导入Delphi SuperObject的步骤:1. 下载SuperObject库的源代码,并将其解压缩到本地目录。
2. 在Delphi开发环境中创建一个新的项目或打开现有的项目。
3. 在Delphi的主菜单中,选择"Project" -> "Options"。
4. 在"Options"对话框中,选择"Delphi Compiler"。
delphi WebBrowser控件实现对IE浏览器的各种控制
WebBrowser 控件实现对 IE 浏览器的各种控制
在不是 js 打开的页面上按 window.close(),会有提示框,很烦,现在可以不用了,没有提示框直 接关闭窗口。
试试下面代码:
<object
id="WebBrowser"
■属性■ <input name=Button onClick=document.all.WebBrowser.ExecWB(10,1) type=button value= 属 性 ><OBJECT classid=CLSID:8856F961_340A_11D0_A96B_00C04FD705A2 height=0 id=WebBrowser width=0></OBJECT> ■打印■ <input name=Button onClick=document.all.WebBrowser.ExecWB(6,1) type=button value= 打 印 ><OBJECT classid=CLSID:8856F961_340A_11D0_A96B_00C04FD705A2 height=0 id=WebBrowser width=0></OBJECT> ■页面设置■ <input name=Button onClick=document.all.WebBrowser.ExecWB(8,1) type=button value= 页 面 设 置 ><OBJECT classid=CLSID:8856F961_340A_11D0_A96B_00C04FD705A2 height=0 id=WebBrowser width=0></OBJECT> ■刷新■ <input type=button value=刷新 name=refresh onclick="window.location.reload()"> ■导入收藏■ <input type="button" name="Button" value=" 导 入 收 藏 夹 " onClick=window.external.Impt; ■导出收藏■ <input type="button" name="Button3" value=" 导 出 收 藏 夹 " onClick=window.external.ImportExportFavorites(false,);> ■加入收藏■ <INPUT name=Button2 onclick="window.external.AddFavorite(location.href, document.title)" type=button value=加入收藏夹> ■整理收藏夹■ <INPUT name=Submit2 onclick="window.external.ShowBrowserUI(OrganizeFavorites, null)" type=button value=整理收藏夹> ■查看原文件■ <INPUT name=Button onclick=window.location = "view-source:" + window.location.href type=button value=查看源文件> ■语言设置■ <INPUT name=Button onclick="window.external.ShowBrowserUI(LanguageDialog, null)" type=button value=语言设置> ■前进■ <INPUT name=Submit onclick=history.go(1) type=submit value=前进> ■后退■ <INPUT name=Submit2 onclick=history.go(-1) type=submit value=后退>
delphi教程
delphi教程
Delphi 是一种基于 Pascal 的编程语言,用于创建窗体应用程序和控制台应用程序。
以下是一些Delphi的教程和指南,可以帮助您入门以及深入了解Delphi的各种功能和特性。
1. Delphi 简介和基础知识
- Delphi 是什么?它的历史和背景
- 安装和设置 Delphi 开发环境
- Delphi IDE 的界面和基本功能介绍
- Delphi 的 Pascal 语法和常用关键字
2. Delphi 窗体应用程序开发
- 创建一个简单的窗体应用程序
- 窗体的属性和事件
- 使用组件和控件设计用户界面
- 处理用户输入和事件响应
3. Delphi 数据库应用程序开发
- 连接和操作数据库
- 使用 SQL 查询和更新数据库
- 数据库表格和字段的创建和管理
- 数据集和数据绑定
4. Delphi 高级特性和技巧
- 使用面向对象编程技术
- 使用线程和并发处理
- 图形和图像处理
- 异常处理和调试技巧
5. Delphi 与其他技术的集成
- 使用外部 DLL 和动态链接库
- 与 Web 服务进行通信
- 与其他编程语言进行互操作
- 创建和使用自定义组件和控件
以上是一些Delphi教程的主要内容,在学习过程中,您可以通过搜索更多的资料来深入了解每个主题。
准备好了解Delphi 的强大功能和灵活性吗?开始学习吧!。
delphi vclskin 原理
delphi vclskin 原理Delphi VCLSkin原理Delphi是一种基于Object Pascal语言的集成开发环境,用于创建Windows应用程序。
VCL(Visual Component Library)是Delphi的核心库,提供了丰富的可视化组件,用于构建用户界面。
VCLSkin是一个第三方工具包,可以为Delphi中的VCL组件添加皮肤效果,使应用程序的界面更加美观和个性化。
VCLSkin的原理是基于Windows操作系统的窗口消息处理机制。
Windows操作系统中,每个窗口都有一个消息处理过程,用于处理各种消息事件。
VCLSkin通过拦截并重写VCL组件的消息处理过程,实现了界面的皮肤效果。
VCLSkin的主要工作原理如下:1. 拦截消息:VCLSkin通过重写VCL组件的WndProc方法,拦截并处理组件接收到的消息。
WndProc方法是VCL组件的消息处理函数,负责处理各种窗口消息事件。
2. 解析皮肤文件:VCLSkin会读取指定的皮肤文件,该文件包含了界面元素的样式信息。
皮肤文件通常是一种自定义的格式,包含了界面元素的颜色、字体、大小、位置等信息。
3. 应用皮肤效果:当VCL组件接收到消息后,VCLSkin会根据消息的类型和目标窗口的类名,查找对应的皮肤样式,并将样式应用到窗口上。
这样,窗口就会根据皮肤文件中定义的样式显示。
4. 处理事件消息:VCLSkin还可以处理一些特定的事件消息,例如鼠标移动、点击等事件。
这些事件可以触发一些特定的皮肤效果,例如按钮的状态切换、菜单的弹出等。
通过以上的原理,VCLSkin可以为Delphi的VCL组件提供丰富的皮肤效果。
开发人员只需要简单地引入VCLSkin的库文件,并在应用程序初始化时启用VCLSkin即可。
VCLSkin提供了一些API和属性,用于控制皮肤的加载和切换,以及自定义皮肤文件的使用。
使用VCLSkin能够为Delphi应用程序带来许多好处。
VNC_VIEWER控件 for Delphi7帮助
RequestUpdate
Procedure RequestUpdate;
说明
强制查看器更新一个帧
Events
--------------------------------------------------------------------------------
VNC Viewer有七个特殊事件:
安装
属性
方法
事件
安装
--------------------------------------------------------------------------------
打开"DVNC.dpk"项目,点击"install"按钮进行安装.安装完成后,可在"U-solution"面板找到VNC Viewer控件
OnStatus
Procedure OnStatus(Sender: TObject; ErrorMsg: String);
说明
在登录过程中触发此事件,ErrorMsg为返回信息.
ShareDesktop
Property ShareDesktop: Boolean;
说明
如果ShareDesktop为真,服务端在一个客户端查看器登录时不会断开其他的客户端连接
Stretch
Property Stretch: Boolean;
说明
如果Stretch为真,远程屏幕会伸展到用户设定的高度和宽度,同时属性autoscroll不再有效.
Password
Port
Server
RequestFrames
delphi webbrowser 使用方法
delphi webbrowser 使用方法Delphi WebBrowser 使用方法Delphi WebBrowser是一种强大的组件,可以嵌入web页面到Delphi应用程序中。
本文将详细介绍使用Delphi WebBrowser的各种方法。
1. 安装和引用要使用Delphi WebBrowser,首先需要做以下几步操作:1.下载并安装Delphi WebBrowser组件包。
2.打开Delphi IDE,创建新项目或打开现有项目。
3.在项目中导入WebBrowser组件包(在IDE的”Component”菜单中选择”Install Packages”)。
2. 创建和显示WebBrowser使用Delphi WebBrowser,你可以轻松创建和显示一个WebBrowser窗口。
以下是一个简单的示例:procedure (Sender: TObject);beginWebBrowser1 := (Self);:= Self;:= alClient;('end;在上述示例中,我们使用Form的OnCreate事件创建了一个WebBrowser对象,并将其展示在一个窗口上。
属性Align设置为alClient,将WebBrowser充满整个窗口。
最后,通过调用Navigate 方法,我们使WebBrowser加载了指定的网址。
3. 与Web页面交互Delphi WebBrowser允许你与嵌入的Web页面进行交互。
以下是一些常用方法的示例:执行JavaScript代码你可以使用Delphi WebBrowser的方法来执行JavaScript代码并获取返回值。
以下示例演示了如何执行JavaScript代码并将结果显示在一个Label控件中:procedure (const ACode: string);varvJsResult: OleVariant;begin// Execute JavaScript code and get the resultvJsResult := (ACode, 'JavaScript');:= vJsResult;end;操作DOM元素要操作Web页面中的DOM元素,你可以使用Delphi WebBrowser 的方法来获取和修改元素的属性和内容。
DELPHI控件属性方法事件及常用函数
DELPHI控件属性方法事件及常用函数DELPHI是一种基于对象的编程语言,具有强大的界面设计能力和丰富的控件库。
在DELPHI中,控件是程序中的基本构建块,用于创建图形用户界面(GUI)。
每个控件都有一组属性、方法和事件,可以通过它们来实现控件的定制和交互。
下面是一些常用的DELPHI控件属性、方法、事件及常用函数的介绍。
一、控件属性1. Name:控件的名称,用于在程序中标识和引用控件。
2. Left、Top、Width、Height:控件的位置和尺寸。
3. Caption:显示在控件上的文本。
4. Visible:控件是否可见。
5. Enabled:控件是否可用。
6. Color:控件的背景色。
7. Font:控件的字体设置,包括字体名称、大小、颜色等。
8. Align:控件相对于其父容器的对齐方式。
9. Parent:控件的父容器。
二、控件方法1. Show:显示控件。
2. Hide:隐藏控件。
3. SetFocus:设置控件获得焦点。
4. BringToFront:将控件置于顶层。
5. SendToBack:将控件置于底层。
6. Invalidate:使控件无效,并触发重绘。
7. Perform:发送自定义消息给控件。
8. Free:释放控件。
三、控件事件1. OnClick:鼠标单击控件时触发的事件。
2. OnDblClick:鼠标双击控件时触发的事件。
3. OnEnter:控件获得焦点时触发的事件。
4. OnExit:控件失去焦点时触发的事件。
5. OnKeyDown、OnKeyPress、OnKeyUp:键盘按下、按住和释放时触发的事件。
四、常用函数1. MessageBox:显示一个消息框,用于向用户显示一段消息并等待用户的响应。
2. InputBox:显示一个输入框,用于向用户获取一个字符串输入。
3. StrToInt、StrToFloat:将字符串转换为整数或浮点数。
4. IntToStr、FloatToStr:将整数或浮点数转换为字符串。
BrowseForFolder方法详解
---- Open 打开一个指定文件夹,包括一个参数:
---- vDir:一个路径或“特殊文件夹常数”
---- FileRun 显示“运行”对话框
---- FindComputer 显示“查找计算机”对话框
---- FindFiles 显示“查找文件”对话框
---- CascadeWindows 层叠排列桌面上所有窗口
---- 该方法返回一个Folder对象。
---- ControlPanelItem 运行一个指定的控制面板项目,包括一个参数:
---- szDir:控制面板项目名
---- Explore 用资源管理器浏览一个指定文件夹,包括一个参数:
---- vDir:一个路径或“特殊文件夹常数”
关于BrowseForFolder 方法的若干知识...
---- 什么是Shell对象?具体来讲,就是微软对一些常用外壳操作函数的封装。象打开或浏览一个文件夹、查找文件、关闭计算机等等,而且还能浏览整个文件系统,获取文件或文件夹的各种信息。由于这些封装是建立在OLE自动化服务的基础之上,所以我们就可以在VB和Web中方便的使用它们。
myFolders = myFolder.items();
for (var i = 0;i < myFolders.count;i++)
s += myFolders.item(i).name + "< br >";
return(s)
}
< /script >
---- Hwnd, Title, Options, [RootFolder]
---- Hwnd:包含对话框的窗体句柄(handle),一般设置为0。 Title:将在对话框中显示的说明,为字符串。
delphi superobject 用法
delphi superobject 用法SuperObject是一个用于处理JSON数据的轻量级类库,它可以用于Delphi和其他Pascal语言。
SuperObject可以创建、解析、序列化和反序列化JSON数据。
以下是使用SuperObject的一些基本方法:1. 创建SuperObject:```delphivarjson: ISuperObject;beginjson := SO(TJSONValue.ParseJSON('{"name":"John", "age":30}'));end;```2. 访问SuperObject中的属性:```delphivarjson: ISuperObject;name: string;age: Integer;beginjson := SO(TJSONValue.ParseJSON('{"name":"John", "age":30}'));name := json['name'].AsString;age := json['age'].AsInteger;end;```3. 修改SuperObject中的属性:```delphivarjson: ISuperObject;beginjson := SO(TJSONValue.ParseJSON('{"name":"John", "age":30}')); json['name'] := 'Jane';json['age'] := 25;end;```4. 将SuperObject序列化为JSON字符串:```delphivarjson: ISuperObject;jsonString: string;beginjson := SO(TJSONValue.ParseJSON('{"name":"John", "age":30}')); jsonString := json.AsString; // 序列化为JSON字符串end;```5. 将JSON字符串反序列化为SuperObject:```delphivarjson: ISuperObject;jsonString: string;beginjsonString := '{"name":"John", "age":30}'; // JSON字符串json := SO(TJSONValue.ParseJSON(jsonString)); // 反序列化为SuperObjectend;。
英语学习专用文章(必背)0096
Under Construction:CORBA Exceptions In Delphi by Bob SwartT wo months ago,we examinedVisiBroker for Delphi 5.Weused a CORBA server written inDelphi5and showed three possi-ble ways to connect a Delphi5CORBA client to it.This time,we’llfocus on the use of CORBAexceptions for Delphi.WebBroker And IE5Last time,we ended with aWebBroker example to return theHTTP/1.0401Unauthorizedheaders,as can be seen in Listing1.This code worked well withNetscape Navigator,but shortlyafterwards I found out that it didn’tquite work in Internet Explorer.Forsome reason,Internet Explorerjust showed the output,but neverthe login dialog.Strangely enough,the same approach using the plainCGI application worked just fine,soit must have been something spe-cific to WebBroker applications.Using IntraBob,my ISAPIdebugger(which can be found onmy website),I finally found thatWebBroker applications don’t usethe StatusCode unless a Reason-String is specified too.This was not indicated in the help,so Imissed it.Adding a statement toListing1to include a ReasonStringisn’t too hard.However,the codestill didn’t appear to work inInternet Explorer.Careful examina-tion of CGIApp.pas showed thecode in Listing2inside the proce-dure TCGIResponse.SendResponse.For some reason,the headerfield with the200OK or the errorcode401Unauthorized is not pre-fixed with HTTP/1.0but with Status:.And while this works fine with Netscape Navigator,it fails tofunction correctly inside InternetExplorer.So,I’ve changed the lastline in Listing 2 to:AddHeaderItem(StatusString,‘HTTP/1.0 %s’#13#10);Which solved my problem withInternet Explorer.Only one puzzleremains,and that’s the fact thatneither Netscape Navigator norInternet Explorer are able to showme the name of the Realm in thelogin dialog.And we do pass thisinformation in the Response.Realmproperty.The only problem is thatfor some reason the procedureTCGIResponse.SendResponse doesn’tuse the Realm property.In fact,Ifound no place at all where thisproperty was used,so we couldjust as well have left the assign-ment out of Listing 1.Obviously,this is yet anotherbug in WebBroker.In this case,weneed to replace the single call toAddHeaderItem(WWWAuthenticate,‘WWW-Authenticate:%s’#13#10);with the following two lines:StatusString :=Format(‘WWW-Authenticate: ‘+‘ %s realm="%s"’#13#10,[‘%s’, Realm]);AddHeaderItem(WWWAuthenticate,StatusString);The Format replaces the realmstring,while the AddHeaderItemtakes care of inserting theWWWAuthenticate string at thecorrect location.This final change to the CGIAppunit resolves the unknown realmproblem.Of course,similar modifi-cations are needed in the ISAPIAppunit to ensure that the code forauthentication/realm works finefor ISAPI DLLs too.CORBA ExceptionsBack to the main topic for today:CORBA exceptions.In Delphi4,and Delphi5without VisiBrokerfor Delphi,there was no supportfor CORBA-specific exceptions.Those of you who tried may haveseen the‘catastrophic failure’mes-sage,which is about the only indi-cation you get as a CORBA clientthat something went wrong insidethe CORBA server(ie when theCORBA server raises an exception,we always only get a‘catastrophicfailure’at the client,without any procedure TWebModule1.WebModule1WebActionItem3Action(Sender: TObject;Request: TWebRequest; Response: TWebResponse; var Handled: Boolean);var Auth: String;beginAuth := Request.Authorization;if Pos('Basic ',Auth) = 1 thenDelete(Auth,1,6);Auth := UnBase64(Auth);if Pos('bswart',Auth) = 0 then begin{ any "bswart" may enter }Response.StatusCode := 401;Response.WWWAuthenticate := 'Basic';Response.Realm := '/DrBob';Response.SendResponse;end else beginResponse.Content := 'Welcome: ['+Request.Authorization+']=['+Auth+'])'endend;®Listing 1: WebBroker Authorization example.if (ReasonString <> '') and (StatusCode > 0) thenStatusString := Format('%d %s', [StatusCode, ReasonString]) elseStatusString := '200 OK';AddHeaderItem(StatusString, 'Status: %s'#13#10);®Listing 2indication of what went wrong. This has been very frustrating(at least to me),when all that went wrong was an I/O exception or even an unhandled(by the CORBA server)StrToInt exception.Even apart from the fact that we don’t get any additional information,we don’t even get a slight indication what went wrong inside the CORBA server,so it’s much harder to pinpoint the exact location. Fortunately,as I wrote two months ago,VisiBroker for Delphi adds support for CORBA excep-tions,although initially only for CORBA clients written in Delphi. We need to wait for a later version of VisiBroker for Delphi for the CORBA server support.In the meantime,however,we can safely communicate with‘foreign’CORBA servers that raise CORBA exceptions.In Delphi,we use try..except to work with ObjectPascal excep-tions,while in C++and Java peopleuse throw..catch to work withexceptions.When using CORBAIDL we talk about raising excep-tions again,just like ObjectPascal.And although it’s not possible toactually raise an exception in IDL(IDL stands for Interface DefinitionLanguage),we must use IDL todefine exception types and specifywhich exceptions can be raised bya given method.An IDL exception is a record-liketype definition.We can add datamembers,but no methods.We alsodon’t get inheritance,so youcannot set up an exception hierar-chy,which is a shame since thatcan become quite handy for nar-rowing down specific error situa-tions.For example,in BobNotes,we had two methods to get and setthe Lines of a specified User.Apartfrom the Lines and User,we alsoneeded to pass a Password argu-ment.There are at least a numberof things that can go wrong here.For example,we can define a PermissionDenied exception,which can be raised if either the User isunknown or the Password doesn’tmatch the user’s password.You might consider specifying twosub-exception types,UserKnownand PasswordIncorrect,(although even if you could sub-class IDLexceptions,I personally wouldn’tuse those because of the increasedsecurity risks involved when givingaway too much detail).TheIDL-way is to add data members(properties)that hold the specificinformation,like a Reason field oftype String.Regardless of our use,theCORBA IDL definition of the abovespecified exception Permission-Denied type with a string fieldReason is as follows:exception PermissionDenied{string Reason;};Now,let’s consider the IDL file forBobNotes with the interfaceICorBobNotes as defined earlier.Asyou can see in Listing3,we havetwo methods inside the ICorBob-Notes interface.CORBA forces us tospecify the exceptions that can beraised by each of these methods,and in this case the exceptionPermissionDenied can be raised byboth methods (see Listing 4).Note that the exceptionPermisionDenied is defined outsideof the ICorBobNotes interface inListing 4.We could also haveembedded the exception defini-tion inside the interface,whichwould have made it a‘local’excep-tion type,unable to be used byother interfaces defined in thesame module.VisiBroker ExceptionsVisiBroker already contains anumber of pre-defined exceptionsthat are available to raise for everyinterface method.These excep-tions have pre-defined Object-Pascal type definitions,derivedfrom SystemException(which,inturn,is derived from Exception).Table1over the page shows a listof pre-defined exceptions,whichare described in more detail in thedocumentation that comes withVisiBroker for Delphi5and thenew CORBA.PAS unit.Even more interesting,however,are the user-defined exceptions,which are derived from theObjectPascal type UserException(which is also derived from Excep-tion).This is the base class for theObjectPascal equivalent of ourPermissionDenied exception,whichwe shall see after we run theIDL2PAS utility on the newBOBNOTES.IDL file.module BobNotes{interface ICorBobNotes{void GetLines(in wstring User, in wstring Password, out wstring Lines);void SetLines(in wstring User, in wstring Password, in wstring Lines);};interface CorBobNotesFactory{ICorBobNotes CreateInstance(in string InstanceName);};};®Listing 3: BOBNOTES.IDL (no exceptions).module BobNotes{exception PermissionDenied{string Reason;};interface ICorBobNotes{void GetLines(in wstring User, in wstring Password, out wstring Lines)raises (PermissionDenied);void SetLines(in wstring User, in wstring Password, in wstring Lines)raises (PermissionDenied);};interface CorBobNotesFactory{ICorBobNotes CreateInstance(in string InstanceName);};};®Listing 4: BOBNOTES.IDL (exceptions).C++Builder ExceptionsBefore we use IDL2PAS on the BOBNOTES.IDL file(to produce Client Stubs for a Delphi5CORBA client),we should first see if we can produce Server Skeletons for a CORBA server,written in any lan-guage except Delphi 5.About a year ago we saw JBuilder CORBA servers,so this time I’ll use a C++Builder CORBA server.One warning:if you want to connect C++Builder CORBA servers to Delphi CORBA clients,make sure you stick with VisiBroker 3.3, included with C++Builder4Enter-prise.C++Builder5Enterprise ships with VisiBroker3.4,which is newer,but also breaks Delphi5 CORBA code.After I installed C++Builder5Enterprise(and VisiBroker 3.4),I was no longerable to run any CORBA server orclient written in Delphi5becauseof DLL import routine mismatches.A clear case of DLL Hell.Rein-stalling VisiBroker 3.3(andVisiBroker for Delphi5just to besure)fixed things,so the followingC++code has been compiled usingC++Builder4Enterprise.I haven’tbeen able to get an officialresponse from VisiGenic(previ-ously called Inprise)on this,but Idid hear similar reports from otherDelphi/C++Builder5users,so Iguess it’s not merely an oversighton my part here.Using IDL2CPP we can generateServer Skeletons for the IDL file,resulting in a ICorBobNotesImplclass with two important methods:GetLines and SetLines.To test thefact that we can raise a CORBAexception inside these methods,Ijust entered the following lineinside each of them(doing nothingat all,except for raising theexception):throwBobNotes::PermissionDenied(“Exception raised by BCB4");The ORB will intercept the excep-tion and pass it on to the CORBAclient,which will turn it into anObjectPascal native exception andraise it there.Note that this func-tionality was not available beforeVisiBroker for Delphi.Delphi ExceptionsUsing IDL2PAS we can‘compile’the BOBNOTES.IDL file to two newunits:BobNotes_C.pas andBobNotes_I.pas.The first of these,BobNotes_C.pas,contains theClient Stub definitions,includingthe type definition of theEPermissionDenied exception(which suddenly has an E-prefix).Note that if we had defined thePermissionDenied exception insidethe ICorBobNotes interfacedefinition(in the IDL file shown inListing4),then we would have hadanother type name for the excep-tion here,namely one with theinterface name followed by anunderscore embedded as well.Inour case,the PermissionDeniedembedded in the ICorBobnotesinterface would result in the EICor-BobNotes_PermissionDenied Object-Pascal exception type.Note thatthe VisiBroker for Delphi docu-mentation is slightly wrong on thistopic,as it says that when anexception is defined within an®Table 1: CORBA SystemExceptions.EPermissionDenied = class(UserException)privateFReason : AnsiString;protectedfunction _get_Reason : AnsiString; virtual;publicproperty Reason : AnsiString read _get_Reason;procedure Copy(const _Input : InputStream); override;end;®Listing 5 : EPermissionDenied.interface,the ObjectPascal class name is prefixed with a leading underscore,the interface name,followed by another underscore,so in our case that would become _ICorBobNotes_PermissionDenied (obviously,the first underscore is in fact replaced by the letter E ).The code to handle the exception can be written using a regular ObjectPascal try...except block,as can be seen in Listing 6 of this article.Note that Listing 6was made using the embedded IDL exception definition (that is,EICorBobnotes_Perm-issionDenied ).Also note that this is currently the only CORBA exception that I check for.In real life,however,one should also check for CORBA system exceptions,especially in the Button1Click method where a connection to the CORBA Server is made,and all kinds of possible errors (system exceptions) can occur.ConclusionsVisiBroker for Delphi adds IDL2PAS for statically linked CORBA clients.It also adds the ability for records and exceptions,which finally brings the CORBA implemen-tation in Delphi to a professional level.I still can’t wait until the IDL2PAS for Delphi CORBA servers becomes available,probably first in Kylix and at a later date in Delphi 6 Enterprise.Next TimeNext month,we will examine more enhancements made to MIDAS 3,the Multi-tier Distributed Application Services for multi-tier applications.We’ll see what,why,how and more,including the new lower-than-ever deployment licence model.So stay tuned...Bob Swart (aka Dr.Bob,visit )is an @-Consultant for TAS Advanced Technologies,co-founder of the TAS-AT DOC Delphi Oplossings-Centrum (/doc),as well as a freelance technical author with numerous articles and some book sections to his name.®Listing 6: EICorBobNotes_PermissionDenied.。
delphi操作WebBrowser元素值
delphi操作WebBrowser元素值1. 自动填写表单并发布两种方法vari:integer;Doc:IHTMLDocument2;input:OleVariant;userinputelement,pwdinputelement,ValidateElement:ihtmlin putelement;ValidateImage: IHTMLImgElement;imagecount:integer;form:ihtmlformelement;myitem:Olevariant;beginDoc:=WebBrowser1.document as ihtmldocument2;if doc=nil then exit;// 第一种方式userinputelement:=(doc.all.item('nicknameId',0) as ihtmlinputelement);userinputelement.value:=edit7.text;pwdinputelement:=(doc.all.item('pwd',0) as ihtmlinputelement);pwdinputelement.value:=edit8.text;pwdinputelement:=(doc.all.item('name',0) as ihtmlinputelement);pwdinputelement.value:=edit9.text;myitem:=WebBrowser1.document;// 第二种方式并可操作 combo radio select 元素表for i:=0 to myitem.all.length-1 dobegin///if myitem.all.item(i).tagName = 'SELECT' then // 下拉框选择beginif myitem.all.item(i).Name='birth_year' thenmyitem.all.item(i).value:='1980'; //end;if myitem.all.item(i).tagName = 'INPUT' thenbeginif Uppercase(myitem.all.item(i).type)='RADIO' thenbeginif myitem.all.item(i).value='男生' then myitem.all.item(i).checked:=true; // 选中值是 '求'的选项end;if Uppercase(myitem.all.item(i).type)=Text thenbeginmyitem.all.item(i).value='';end;end;end;2.操作超链接vari:integer;myitem:Olevariant;begin //xid_reg_handlemyitem:=WebBrowser1.document;// 第一种方式aVal:=myitem.getElementById('xid_reg_handle').href;myitem.getElementById('xid_reg_handle').click; // 模拟点击超链接showmessage(InttosTr(myitem.Links.length));for i:=0 to myitem.Links.length-1 dobegin// myitem.Links.item(i).href // hrefUrl 可获取if myitem.Links.item(i).innertext='名称' then // <a href=''> 名称' </a>myitem.Links.item(i).click;// 模拟点击超链接end;end;。
用Delphi做一个组件探测器:WidgetSpy
用Delphi做一个组件探测器:WidgetSpy 用Delphi做一个组件探测器:WidgetSpy软件名称:WidgetSpy功能描述:探测系统运行程序界面中组件、窗口的基本信息:1、所测组件的类名;2、所测组件的句柄;3、所测组件的进程ID;4、所测组件的标题或文本内容;5、所测组件的父句柄;6、所测组件所在程序的名称及路径。
开发工具:Delphi7.0三方控件:无(全部使用Delphi自带控件完成)所需资源:定制资源文件,包含2个图标文件(默认图标、鼠标指针拖走后的图标)、1个鼠标指针。
实现方法:一、获取光标所在点的句柄要想知道目标组件的基本信息,必须要先获取它的句柄。
有了句柄,就可以进行各种各样的操作,以及进一步得到更加丰富的相关信息。
方法如下:varhWnd: THandle;beginhWnd := WindowFromPoint(Sender); // windowfrompoint 获得窗口指定点的句柄end;二、根据句柄获取相关参数varhWnd: THandle;Buf: array[0..1024] of Char;beginhWnd := WindowFromPoint(Sender);//显示目标的句柄:edit2.Text := IntT oStr(hWnd);//显示父句柄:edit5.Text:=IntToStr(GetParent(hWnd));//获取类名:if boolean(GetClassName(hWnd,Buf,1024)) thenedit1.Text := string(Buf)else edit1.Text := ’’(没找到!)’’;flashwindow(hWnd,true); //窗口标题栏闪烁//获取线程ID:GetWindowThreadProcessId(hwnd,@pid);edit3.Text := IntT oStr(pid);//获取标题或文本内容://GetWindowT ext(hWnd,Buf,256);//方法一、不能获取外部程序文本框的内容(不好)SendMessage(hWnd, WM_GETTEXT, 1024, Integer(@Buf)); //方法二、发送消息获取控件文本(好)edit4.Text := Buf;三、根据进程ID取得目标程序由于目标组件所在的程序,不能根据组件的句柄获取,因此要先通过目标句柄获取进程ID,再根据进程ID来获取目标所在的应用程序。
关于VisiBroker For Delphi的使用
《关于VisiBroker For Delphi的使用》(3)-CORBA技术实践(一)email:3boy@3,数组对象与简单数据对象的传递前面提到了一些较为简单的数据操作,我们都可以想象一下,如果操作COR BA对象与操作C/S结构的数据对象一样的方便,那么CORBA又有什么神奇了,不知道看过李维的分布式多层应用系统的书籍时,是否留意到李维对CORBA 的评价,无论你看过还是没有看过,我都要告诉正在使用CORBA编程的朋友们,CORBA比COM/CO M+简单,而CORBA的跨平台特性,以及与COM/COM+同样的负载平衡能力,足以让我们将这项分布式技术应用到应用体系的设计之中,其实对于使用Bor land的产品开发分布式系统无论你采用CORBA或是COM/COM+其实最核心的技术就是MIDAS,因为你总可以在CORBA/COM/COM+中看到MIDAS的影子,所以我建议无论你是准备学习CORBA还是学习COM/COM+最好先学习一下MIDAS,本文不涉及MIDAS,关于MIDAS请看李维的《Delphi5.X分布式多层应用—系统篇》。
为什么我从开始就一直要大家使用文本编辑器之类的东西书写IDL,而不用TypeLibrary来书写IDL,其实我觉得只是为了让刚刚接触CORBA的程序员获得一些更多的IDL方面的知识罢了,在实际的开发中你可以完全很方便的使用TypeLib rary来编写接口规则。
下面我简要的列举几类IDL书写的事例与利用IDL2PAS生成的PASCAL代码。
1、)常量的定义/**IDL书写**/module MyCRB{const long iMyConst=1;interface myFace{const long iiMyConst=2;};};/**Pascal**/unit MyCRB_I;interfaceuses Corba;constiMyCOnst:integer=1;myFace_iiMyConst=2;2、)不在接口中申明的常量/**IDL**/module MyCRB{const long myconst=1;};/*pascal*/unit MyCRB_I;interfaceconst myconst:integer=1;3、)枚举类型/*IDL*/enum MyCRBKind{A,B,C,D,……..} /*pascal*/myCRBkind=(A,B,C,D……..); 4、)结构体/*IDL*/struct mystructtype{long X;string Y;boolean Z;};/*pascal*///XXX_I.pastype mystructtype=interface;//XXX_C.pasmystructtype=interfacefunction_get_X:integer;function_get_Y:string;function_get_Z:boolean;procedure_set_X(const Value:integer);procedure_set_Y(const Value:string);procedure_set_Z(const Value:boolean);property X:integer read_get_X write_Set_X;property Y:string read_get_Y write_Set_Y;property Z:boolean read_get_Z write_Set_Z;…….还有太多的代码,自己创建一个看一下,为了节约篇幅我就不做详细的翻译了下面请大家试一下以下的申明会生成什么样的Pascal代码5、)联合体union un_exp switch(long){case1:long x;case2:string y;case3:st_exp Z;};6、sequence(我理解为动态数组)typedef sequence<long>UnboundeSeq;typedef sequence<long,42>ShortBoundSeq7,数组const long ArrayBound=10;typedef long longArray[ArrayBound];8,抽象接口module exp{interface myface{long op(in string s);};};9,多重继承module M{ interface A{void A1();void A2();};interface B{void B1();void B2();};interface AB:B,A{ void AB1()void AB2();};};10,交叉模型定义module m1{ interface if1;module m2{interface if2{m1::if1getIf1();};interface if1{m2::if2getif2()};};};以上我介绍了一些数据的定义规范,然而我们需要不仅仅是这样的一些比较抽象的接口定义法则,我们要将法则应用到实际的开发中去,那么我们又是如何运用这些法则了,对于接口描述语言的翻译我前面讲到直接使用IDL2PAS就不讲了,以后的章节中也不会在去将如何转换的问题。
Delphi内存释放问题
VisiBroker for Delphi 内存释放问题Delphi中使用VisiBroker 开发CORBA应用程序,会出现Server端接口的传入参数占用内存不能正常释放的错误,具体修法如下:一、VisiBroker 4.1(Delphi 6)版本修改方法:修改Delphi6\Source\Rtl\Corba40\Corba.pas 文件,找到代码段1的函数(line 687),并将其修改成代码段2。
代码段1:function TCORBAObject.Execute(Operation: PChar; const Strm: MarshalInBufferProxy):CorbaBoolean;typeTUnmarshalProc = procedure (const Input: InputStream) of object;varM: TUnmarshalProc;beginResult := False;tryTMethod(M).Code := Self.MethodAddress('_' + Operation);if TMethod(M).Code = nil then Exit;TMethod(M).Data := Self;M(TInputStream.Create(Strm));exceptExit;end;Result := True;end;代码段2:function TCORBAObject.Execute(Operation: PChar; const Strm: MarshalInBufferProxy):CorbaBoolean;typeTUnmarshalProc = procedure (const Input: InputStream) of object;varM: TUnmarshalProc;inBuf : TInputStream;beginResult := False;tryTMethod(M).Code := Self.MethodAddress('_' + Operation);if TMethod(M).Code = nil then Exit;TMethod(M).Data := Self;inBuf := TInputStream.Create(Strm);tryM(inBuf);finallyinBuf.free;end;exceptExit;end;Result := True;end;二、VisiBroker 3.3(Delphi 6 和VisiBroker for Delphi 5)版本修改方法:修改Delphi5\Source\Rtl\Corba\Corba.pas 文件,找到代码段3的函数(line 676),并将其修改成代码段4。
delphi中Webbrowser的使用技巧
WebBrowser组件和MSHTML 在Delphi 中的使用由于项目需要,近来研究了一下WebBrowser组件和MSHTML 在Delphi中的使用,整理了一下这段时间研究的结果,写下来一是方便大家查阅,二也可以加深我自己的记忆.希望能对大家有所帮助… …,同时,如果有更好的处理方式或者我没有提到的问题,请大家也告诉我哦, 咱们一块进步… ...,其中一部分是我从网络中搜集的资料,谢谢那些兄弟们… … MSHTML把HTML页面中的元素封装成了IHTMLInputElement、 IHTMLInputButtonElement、IHTMLInputTextElement、IHTMLTextAreaElement、IHTMLTitleElement、IHTMLFormElement 等等组件接口。
在程序中可以通过MSHTML提供的IHTMLDocument2接口得到整个Document对象,IHTMLElementCollection接口得到所有页面元素的集合,通过该接口的Item方法可以得到具体的某个组件,然后设置和读取该组件的属性值。
下面是一些常用功能的事例代码.1.打开某个页面:web.Navigate(ExtractFilePath(Application.ExeName) + 'Template/login.html'); 2.取出页面中某个HtmlElement的Value属性值:function GetValueByElementName(web: TWebBrowser; elementName: string; index: integer): string;beginresult := (((web.Document as IHTMLDocument2).body.all as IHTMLElementCollection).item(elementName, index) as IHTMLInputElement).valueend;3.给HtmlElement设置Value属性procedure SetValueTextAreaName(web: TWebBrowser; elementName, value: string;index: integer);begin(((web.Document as IHTMLDocument2).body.all asIHTMLElementCollection).item(elementName, index) as IHTMLTextAreaElement).value := value;end;4.判断页面执行结果是否成功因为Web应用中如果出错的一般是采用错误页面的方式呈现给最终用户,所以我们也无法抓到Http错误,只能通过在webBeforeNavigate2事件中将URL参数记录到全局变量中, 然后在webDocumentComplete事件中根据URL参数和全局变量中的URL参数来判断执行结果是否正确.当然,这样需要将页面地址编码到代码中,降低了灵活性,但是这也是我能想到的唯一的方法,如果大家有什么好的方法,请告诉我哦.5.屏蔽鼠标右键和某些快捷键本功能需要在webBrowser的窗口中加入ApplicationEvents组件,设置它的OnMessage事件代码如下即可.procedure TwebAdapterForm.ApplicationEvents1Message(var Msg: tagMSG;var Handled: Boolean);const_KeyPressMask = $80000000;begin//禁用右键with Msg dobeginif not IsChild(web.Handle, hWnd) then Exit;Handled := (message = WM_RBUTTONDOWN) or (message = WM_RBUTTONUP) or (message = WM_CONTEXTMENU);end;//禁止Ctrl + N//禁止Ctrl + F//禁止Ctrl + Aif Msg.message = WM_KEYDOWN thenbeginif ((Msg.lParam and _KeyPressMask) = 0) and(GetKeyState(VK_Control) <0) and ((Msg.wParam = Ord('N'))or (Msg.wParam = Ord('F')) or (Msg.wParam = Ord('A'))) thenbeginHandled := True;end;end;end;6.在页面关闭的时候,同时关掉包含页面的VCL Form.(仅限 InternetExplorer 6.0)本功能需要卸载掉Delphi自带的 WebBrowser组件,安装ActionX组件(Microsoft Internet Controls V1.1),而且以后的程序只能运行在安装有Internet Explorer 6.0 的环境下.具体方法如下:在WebBrowser组件的OnWindowClosing事件中,输入self.close; 代码即可.如果需要阻止窗口的关闭, 设置CanClose参数的值为Flase.7.如何将页面中超链接新开的页面窗口包到指定的VCL窗口中.procedure TForm1.webNewWindow2(Sender: TObject; var ppDisp: IDispatch;var Cancel: WordBool);varform : TForm1;beginform := TForm1.Create(nil);ppDisp := form.web.DefaultDispatch;form.Show;end;8.在WebBrowser加载html页面完成后,在页面顶端插入HTML代码, 下面两种方式斗可以.{1. ----------------------------------------------------------------} procedure TForm1.Button1Click(Sender: TObject);varRange: IHTMLTxtRange;beginRange := ((WebBrowser1.Document as IHTMLDocument2).body as IHTMLBodyElement).createTextRange;Range.collapse(False);Range.pasteHTML('<br/><b>Hello!</b>');end;{2. ----------------------------------------------------------------} procedure TForm1.WebBrowser1DocumentComplete(Sender: TObject;const pDisp: IDispatch; var URL: OleVariant);varWebDoc: HTMLDocument;WebBody: HTMLBody;beginWebDoc := WebBrowser1.Document as HTMLDocument;WebBody := WebDoc.body as HTMLBody;WebBody.insertAdjacentHTML('BeforeEnd', '<h1>Hello World!</h1>');end;9.将页面中显示的内容全部选中,然后粘贴到Word文档中.WebBrowser1.ExecWB(OLECMDID_SELECTALL, OLECMDEXECOPT_DODEFAULT);//全选网页WebBrowser1.ExecWB(OLECMDID_COPY, OLECMDEXECOPT_DODEFAULT); //复制网页WordDocu.Range.Paste; //word文档粘贴WebBrowser1.ExecWB(OLECMDID_UNDO, OLECMDEXECOPT_DODEFAULT); //取消全选注:WebBrowser的Document属性值和WordDocument的Document属性值必须都不为nil. 10.如何解决网页不响应回车事件public{ Public declarations }procedure MsgHandle(var Msg :TMsg; var Handled :Boolean);end;varForm1: TForm1;FOleInPlaceActiveObject :IOleInPlaceActiveObject;implementation{$R *.DFM}procedure TForm1.MsgHandle(var Msg :TMsg; var Handled :Boolean);variOIPAO :IOleInPlaceActiveObject;Dispatch :IDispatch;beginif WebBrowser1 =nil thenbeginHandled :=False;Exit;end;Handled :=(IsDialogMessage(WebBrowser1.Handle, Msg) =True);if (Handled) and (not WebBrowser1.Busy) thenbeginif FOleInPlaceActiveObject =nil thenbeginDispatch :=WebBrowser1.Application;if Dispatch <>nil thenbeginDispatch.QueryInterface(IOleInPlaceActiveObject, iOIPAO);if iOIPAO <>nil thenFOleInPlaceActiveObject :=iOIPAO;end;end;end;if FOleInPlaceActiveObject <>nil thenif ((Msg.message =WM_KEYDOWN) or (Msg.Message =WM_KEYUP)) and ((Msg.wParam =VK_BACK) or (Msg.wParam =VK_LEFT) or (Msg.wParam =VK_RIGHT)) thenelseFOleInPlaceActiveObject.TranslateAccelerator(Msg);end;procedure TForm1.FormCreate(Sender: TObject);beginApplication.OnMessage :=MsgHandle;end;procedure TForm1.FormDestroy(Sender: TObject);beginFOleInPlaceActiveObject :=nil;end;11.如何在WebBrowser中调用当前页面中的javascript函数SayHello()WebBrowser1.OleObject.Document.parentWindow.execScript('SayHello()', 'javascript');//or(WebBrowser1.Document as IHTMLDocument2).parentWindow.execScript('SayHello()', 'javascript')//orwebrowser1.document.script.SayHello();delphi中Webbrowser的使用技巧1.获取网页中变量的值例如:htm中<script> var currIDS=123</script>程序中可以这样调用 id :=Form1.WebBrowser1.OleObject.Document.script.currIDS备注:变量可以是javascript定义的,也可以是vbscript定义的,如果Webbrowser1中找不到该变量,调用会触发一个异常事件,即变量currIDS不存在。
ActiveX控件在Delphi中的使用方法
ActiveX控件在Delphi中的使⽤⽅法在开始⼀切⼯作之前,请确保ActiveX控件已经注册到计算机,请运⾏系统安装⽬录下⾯“registeractivex.bat”。
在Delphi6.0中,先要把控件安装进去才能使⽤。
在菜单上选择Component选择“Import ActiveX Control...”,打开⼀个对话盒查看⼤图按“Install...”按钮后,询问要把控件加载到哪个包(Package)中。
按“OK”按“Compile”,编译这个包。
在⼯具栏上将出现下⾯两个图标,注意,如果上⾯“Palette Page”中选择的不是“Standard”,这两个图标将出现在其他⼯具页。
左边的控件是主要的Visual Graph ActiveX控件,右边那个是属性列表窗⼝。
新建⼀个程序(Application),选择⼯具栏上左边那个Visual Graph ActiveX控件,在应⽤程序主窗⼝上⽤⿏标拉框创建⼀个控件,这个控件的缺省名为vgctrl1。
第⼀步:填写下⾯的代码第⼀步procedure TForm1.FormShow(Sender: TObject);beginvgctrl1.Design( '' );end;这句程序执⾏后,将在控件中设计⼀个新的Visual Graph视图⽂件,控件⽀持Design(设计)和Run(运⾏)两个函数,⽆论接下来要⼲什么,⼀开始必须执⾏这两个函数其中⼀个,在绘图版本中,多⽤Design函数,⽤户将可以⽤⿏标在控件窗⼝上编辑图形;在⼯业监控等领域⼀般多⽤Run函数,⽤户不能⽤⿏标直接编辑图形,但⽤⿏标点击画⾯上不同的图形时会有各种控制事件发⽣,⽽且某些图形还会产⽣动作。
如果要打开⼀个视图⽂件,参数是⽂件名。
第⼆步第⼆步:在窗⼝上放⼀个按钮Button1,双击这个按钮,编写下⾯的代码procedure TForm1.Button1Click(Sender: TObject);varASheet : ISheet;AShape : IUnit;beginASheet := vgctrl1.vg.ActiveSheet;AShape := ASheet.AddUnit( nil, 'Rect' );AShape.SetBounds( 0, 0, 100, 100 );AShape.Text := 'Hello World!'end;ActiveSheet是视图⽂件的当前页⾯(页⾯类),Visual Graph图形系统⽀持多个页⾯,当前画图的⼯作都是在ActiveSheet上实现的,⼀般应⽤中只要⼀个页⾯就够了,但是如果视图⽂件是作为图库来⽤,它⾥⾯可能页⾯就多了。
DelphiWebbrowser使用方法详解(一)
DelphiWebbrowser使用方法详解(一)
1.webbroser介绍
该组件是一个浏览器组件,可以显示一个指定地址的网页、设置网页打开时的主页以及对网页进行相关的操作,同时也可以对HTML 文件进行剪切、复制、粘贴、删除等操作。
该组件在Internet组件页中,属于TWebbrowser类。
它放在程序当中,可以像操作网页一样操作webbrowser控件。
2.webbrowser有哪些应用
webbrowser目前大多数都是完成自动提交或定时处理某种操作,例如:
1.网页数据采集,从别人的论坛里面把帖子采集出来,放到我们的论坛里面,例如火车头采集器;
2.发帖,不断的到百度贴吧或者其他论坛去发帖也称灌水;
3.网购,例如淘宝上限时秒抢之类的;
4.投票,不断的变换IP去投票;
5.抢火车票,不断的刷新火车票,一有票就提示抢购;
6.开发浏览器,像原来的的360,腾讯,搜狗浏览器都是基于IE 内核开发出来的;
3.同类控件
1.Indy中的idhttp 特点不可见,使用麻烦,有阻塞,但效率高;
2.ICS跟idhttp差不多
3.TEmbeddedwb第三方控件,跟webbrowser差不多,功能更强大,缺点是没有相关使用说明或资料;
本人目前使用的就是TEmbeddedWB,主要是该控件屏蔽弹窗很牛逼,而且能截获弹出窗口的信息,不管是不是带不带框架的,后续的介绍也都是基于TEmbeddedWB展开,它和webbroser的使用方法都差不多,有区别的会特意注明。
搞了N久的Webbroser,今天终于有心情把它总结出来贡献给大
家,希望能帮助到那些使用webbrowser的人们,转载请注明出处,谢谢!未完待续。
Delphi7.0第三方皮肤控件及使用方法
Delphi7.0第三方皮肤控件及使用方法
这个是没做任何设置只使用了皮肤控件的效果,至少比原来的好看多了,这个就要借助第三方的一个控件了,这边没办法上传附件,我给大家一个免费下载的连接
这个是我上传到CSND的三方软件,是不用积分的。
/detail/rongbelle/5431491
打开文件夹,找到WinSkinD7.dpk——单击install 《完成安装》安装完后、
1、讲Skin7.0文件复制到Delphi安装目录文件夹Delphi下
2、将"vclskin2.60 For Delphi7 Cracked"文件夹下的所以文件拷贝到delphi目录下的lib文件中(记得备份lib文件撒~~)(必须完成这两步,不然使用中会有问题)
完成后打开delphi
控件栏最后面会多一个VCLskin控件
拖拉里面的SkinData
把Active属性设置为true
通过Skinstore选择你的皮肤(就是刚复制到Delphi文件夹下的Skin7.0中的skins文件夹中的文件)
然后运行就可以看到你梦寐以求的皮肤啦,俺特别喜欢那个mxskin24诶个人喜好哈一个一个试试。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
《关于VisiBroker For Delphi的使用》(3)-CORBA技术实践(一)email: 3boy@3,数组对象与简单数据对象的传递前面提到了一些较为简单的数据操作,我们都可以想象一下,如果操作COR BA对象与操作C/S结构的数据对象一样的方便,那么CORBA又有什么神奇了,不知道看过李维的分布式多层应用系统的书籍时,是否留意到李维对CORBA 的评价,无论你看过还是没有看过,我都要告诉正在使用CORBA编程的朋友们,CORBA比COM/CO M+简单,而CORBA的跨平台特性,以及与COM/COM+同样的负载平衡能力,足以让我们将这项分布式技术应用到应用体系的设计之中,其实对于使用Bor land的产品开发分布式系统无论你采用CORBA或是COM/COM+其实最核心的技术就是MIDAS,因为你总可以在CORBA/COM/COM+中看到MIDAS的影子,所以我建议无论你是准备学习CORBA还是学习COM/COM+最好先学习一下MIDAS,本文不涉及MIDAS,关于MIDAS请看李维的《Delphi5.X分布式多层应用—系统篇》。
为什么我从开始就一直要大家使用文本编辑器之类的东西书写IDL,而不用TypeLibrary来书写IDL,其实我觉得只是为了让刚刚接触CORBA的程序员获得一些更多的IDL方面的知识罢了,在实际的开发中你可以完全很方便的使用TypeLib rary来编写接口规则。
下面我简要的列举几类IDL书写的事例与利用IDL2PAS生成的PASCAL代码。
1、)常量的定义/**IDL书写**/module MyCRB{const long iMyConst=1;interface myFace {const long iiMyConst=2;};};/**Pascal**/unit MyCRB_I;interfaceuses Corba;constiMyCOnst:integer=1;myFace_iiMyConst=2;2、)不在接口中申明的常量/**IDL**/module MyCRB{const long myconst=1;};/*pascal*/unit MyCRB_I;interfaceconst myconst:integer=1; 3、)枚举类型/*IDL*/enum MyCRBKind{A,B,C,D,……..} /*pascal*/myCRBkind=(A,B,C,D……..); 4、)结构体/*IDL*/struct mystructtype{long X;string Y;boolean Z;};/*pascal*///XXX_I.pastype mystructtype=interface;//XXX_C.pasmystructtype=interfacefunction _get_X:integer;function _get_Y:string;function _get_Z:boolean;procedure _set_X(const Value:integer);procedure _set_Y(const Value:string);procedure _set_Z(const Value:boolean);property X:integer read _get_X write _Set_X;property Y:string read _get_Y write _Set_Y;property Z:boolean read _get_Z write _Set_Z;…….还有太多的代码,自己创建一个看一下,为了节约篇幅我就不做详细的翻译了下面请大家试一下以下的申明会生成什么样的Pascal代码5、)联合体union un_exp switch(long){case 1:long x;case 2:string y;case 3:st_exp Z;};6、sequence(我理解为动态数组)typedef sequence <long> UnboundeSeq;typedef sequence <long,42> ShortBoundSeq7, 数组const long ArrayBound=10;typedef long longArray[ArrayBound];8, 抽象接口module exp{interface myface{long op(in string s);};};9,多重继承module M{ interface A{void A1();void A2(); };interface B{void B1();void B2();};interface AB:B,A{ void AB1()void AB2();};};10,交叉模型定义module m1{ interface if1;module m2{interface if2{m1::if1 getIf1();};interface if1{m2::if2 getif2()};};};以上我介绍了一些数据的定义规范,然而我们需要不仅仅是这样的一些比较抽象的接口定义法则,我们要将法则应用到实际的开发中去,那么我们又是如何运用这些法则了,对于接口描述语言的翻译我前面讲到直接使用IDL2PAS就不讲了,以后的章节中也不会在去将如何转换的问题。
下面我们实践一下:编写接口定义一个返回为浮点类型,输入为短整型变量数组对象的方法typedef short ArrayType[3];//自定义类型定义长度为3的数组interface Account {float InputArray(in ArrayType myArray);//输入为整形数组,返回类型为float的方法};//服务端程序的处理xxx_impl.pasinterfaceusesSysUtils,CORBA,account_i,account_c;typeTAccount = class;TAccount = class(TInterfacedObject, account_i.Account) protected//******************publicconstructor Create;function InputArray ( const myArray : account_i.ArrayType): Sing le;end;implementationuses ServerMain;constructor TAccount.Create;begininherited;end;function TAccount. InputArray (const myArray : account_i.ArrayType): Single;varj: Integer;begin// account_i.ArrayType是指我们自定义的数组类型在account_I单元中for j := 0 to 2 dobeginForm1.Memo1.Lines.Add('myArray[' + IntToStr(j) + '] = ' + IntToSt r(myArray[j]) );//接受从客户端传递过来的数组变量并将其依次加入到主窗体的MEMO中 end;result := random * 100;//返回一个随机数end;initializationrandomize;end.//服务端程序主单元unit ServerMain;interfaceusesWindows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Di alogs, Corba,Account_I, Account_C, Account_S, Account_Impl, StdCtrls;typeTForm1 = class(TForm)Memo1: TMemo;procedure FormCreate(Sender: TObject);private{ private declarations }protected{ protected declarations }Acct : Account; // skeleton 对象procedure InitCorba;public{ public declarations }end;varForm1: TForm1;implementation{$R *.dfm}procedure TForm1.InitCorba;beginCorbaInitialize;// Add CORBA server Code HereAcct := TAccountSkeleton.Create('Array Server', TAccount.Create); BOA.ObjIsReady(Acct as _Object);end;procedure TForm1.FormCreate(Sender: TObject);beginInitCorba;Memo1.Lines.Add('Account object created...');Memo1.Lines.Add('Server is ready');end;end.//客户端程序unit ClientMain;interfaceusesWindows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Di alogs,Corba, StdCtrls, Account_I, Account_C;typeTForm1 = class(TForm)Button1: TButton;Label1: TLabel;procedure FormCreate(Sender: TObject); procedure Button1Click(Sender: TObject); private{ private declarations }protected{ protected declarations }Acct : Account;myArray : ArrayType;procedure InitCorba;public{ public declarations }end;varForm1: TForm1;implementation{$R *.dfm}procedure TForm1.InitCorba;beginCorbaInitialize;Acct := TAccountHelper.bind;end;procedure TForm1.FormCreate(Sender: TObject); varj: Integer;beginInitCorba;for j := 0 to 2 domyArray[j] := (j + 1) * 100;end;procedure TForm1.Button1Click(Sender: TObject); beginLabel1.Caption := FormatFloat('InputArray = $#,##0.00', Acct.inputA rray(myArray));end;end.上面的程序实例很简单我就不一一说明了,下面我们来看一个数据访问的实例//IDLinterface Employee {any getEmployeesByName(in string name);};接口方法声明单元//XXX_Impl.pasinterfaceusesSysUtils,CORBA,employee_i,employee_c;typeTEmployee = class;TEmployee = class(TInterfacedObject, employee_i.Employee)publicconstructor Create;function getEmployeesByName ( const name : AnsiString): ANY; end;implementationuses dmEmployee,DMPooler, provider,DSIntf,ServerMain;constructor TEmployee.Create;begininherited;end;function TEmployee.getEmployeesByName ( const name : AnsiString): AN Y;varDM: TdmEmploy;RecsOut: Integer;Options: TGetRecordOptions;beginOptions := [grMetaData,grReset]; //must specify meta dataDM := ModulePooler.GetModule as TdmEmploy; //Get instance of datamo dule from PooltryDM.qryEmployee.Close;DM.qryEmployee.ParamByName('name').AsString:= name + '%';//显示连接服务器的数量Inc(Form1.HitCount);bel1.Caption := Format('Hit Count = %d', [Form1.HitCoun t]);DM.qryEmployee.Open;Result:=DM.proEmployee.GetRecords(-1, RecsOut, Byte(Options)); DM.qryEmployee.Close;finallyModulePooler.FreeModule(DM);//Return instance of DataModule to po olend;end;initialization//将TdmEmploy对象放入共享池中ModulePooler.ModuleClass := TdmEmploy;end.//共享池的声明单元主要描述如何提供一个多客户的访问数据提供unit DMPooler;interfaceuses SysUtils, Classes, Forms, SyncObjs, Windows;type//本单元用于为每个客户提供一个独立使用的DataModule对象,相当于我们在以前的CORBA DataModule中选择创建的多线程对象一样的功能TDataModuleClass = class of TDataModule; //定义类TPooledModule = record//声明记录类型Module: TDataModule; //继承标准的TdataModuleInUse: Boolean; //标明上面继承的TdataModule是否在使用end;TModulePooler = classprivateFCSect: TCriticalSection; //允许线程自己改变FModulesFModuleClass: TDataModuleClass; //在共享池中类化TDataModule FModules: array of TPooledModule; //定义一个动态的对象记录数组FSemaphore: THandle; //限定同时使用的用户规则publicproperty ModuleClass: TDataModuleClass read FModuleClass write FM oduleClass;constructor Create;destructor Destroy; override;function GetModule: TDataModule;procedure FreeModule(DataModule: TDataModule);end;constPoolSize = 5;varModulePooler: TModulePooler = nil;implementationuses Dialogs;{ TModulePool }constructor TModulePooler.Create;beginIsMultiThread := True;FCSect := TCriticalSection.Create;FSemaphore := CreateSemaphore(nil, PoolSize, PoolSize, nil); end;destructor TModulePooler.Destroy;beginFCSect.Free;CloseHandle(FSemaphore);end;procedure TModulePooler.FreeModule(DataModule: TDataModule); varI: Integer;beginFCSect.Enter;tryfor I := 0 to Length(FModules) - 1 doif FModules[I].Module = DataModule thenFModules[I].InUse := False;ReleaseSemaphore(FSemaphore, 1, nil);finallyFCSect.Leave;end;end;function TModulePooler.GetModule: TDataModule;varI: Integer;beginResult := nil;if WaitForSingleObject(FSemaphore, 5000) = WAIT_TIMEOUT then raise Exception.Create('Server too busy');FCSect.Enter;tryif Length(FModules) = 0 thenbeginSetLength(FModules, PoolSize);for I := 0 to PoolSize - 1 dobeginFModules[I].InUse := False;FModules[I].Module := FModuleClass.Create(Application); end;end;for I := 0 to Length(FModules) - 1 doif not FModules[I].InUse thenbeginFModules[I].InUse := True;Result := FModules[I].Module;Break;end;finallyFCSect.Leave;end;//检查曾经是否连接if not Assigned(Result) thenraise Exception.Create('Pool is out of capacity');end;initializationModulePooler := TModulePooler.Create;finalizationModulePooler.Free;end.//本单元是一个通用的方法单元,当然您也可以采用其他的方法来完成这样的一个功能//DataModule单元unit dmEmployee;interfaceusesWindows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Di alogs,Db, DBTables, Provider;typeTdmEmploy = class(TDataModule)Session1: TSession;EmployeeDatabase: TDatabase;qryEmployee: TQuery;proEmployee: TDataSetProvider;private{ Private declarations }public{ Public declarations }end;vardmEmploy: TdmEmploy;implementation{$R *.DFM}end.//服务器的主单元unit ServerMain;interfaceusesWindows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Di alogs,Grids, DBGrids, Db, DBTables, StdCtrls, Corba, Employee_I, Employee _C,Employee_S, Employee_Impl;typeTForm1 = class(TForm)Label1: TLabel;procedure FormCreate(Sender: TObject); private{ Private declarations }procedure CorbaInit;public{ Public declarations }hitcount : integer;end;varForm1: TForm1;myDBServer : Employee;implementation{$R *.DFM}procedure TForm1.CorbaInit;beginCorbaInitialize;myDBServer := TEmployeeSkeleton.Create('myServer', TEmployee.Creat e);Boa.ObjIsReady( myDBServer as _Object );end;procedure TForm1.FormCreate(Sender: TObject);beginCorbaInit;end;end.//客户端程序interfaceusesWindows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Di alogs,StdCtrls, Grids, Corba, Employee_i, Employee_c, Db, DBClient, ExtCt rls,DBCtrls, DBGrids;typeTForm1 = class(TForm)Button1: TButton;DBGrid1: TDBGrid;cdsEmployee: TClientDataSet;DataSource1: TDataSource;edtEmployeeName: TEdit;Memo1: TMemo;Label1: TLabel;procedure FormCreate(Sender: TObject);procedure Button1Click(Sender: TObject);private{ Private declarations }myEmployee : Employee;public{ Public declarations }end;varForm1: TForm1;implementation{$R *.DFM}procedure TForm1.FormCreate(Sender: TObject); beginmyEmployee := TEmployeeHelper.bind;end;procedure TForm1.Button1Click(Sender: TObject); begincdsEmployee.Data := myEmployee.getEmployeesByName(edtEmployeeName.T ext);cdsEmployee.Open;end;end.我想大家应该可以看得懂上面的程序,如果看不懂也不要紧,下一次我将围绕这个实例展开一系列的问题描述并会同时于COM+/MIDAS进行比较说明,为了让大家留下一个思维的空间我在这里就不多说了。