Delphi接口

Delphi 的 TInterfacedObject 类与智能指针 是 Delphi 中的一个特殊类,它主要用于简化接口的管理,特别是接口的引用计数管理。这个类在 Delphi 的 COM 编程和接口实现中扮演着重要角色。 阅读详情

第一章在Delphi中使用接口
1.1 定义接口:
目的:什么是接口,以及和抽象类的关联以及不同点。
抽象类(备注理解接口最简单的方法)
永远不能创建一个抽象类的实例;
本身不能实现功能,依靠派生类实现;
接口
被申明为interface类型。接口名从字母I开始。类类型名从T开始。
所有的接口从IUnknown继承;
不能创建接口实例;
不能在接口中指定范围指示。所有的方法都是公有型(public),不能在接口中申明包括范围指示;
不能申明变量;接口只能决定提供什么样的功能,对于如何完成功能没有限制;
接口中申明的所有函数和过程,概念上都是虚抽象函数和过程;因此申明时不能带Virtual;
接口是不变的;
1.2申明一个接口
目的:如何声明一个接口
常用的接口:CLSID、IID、和LIBID;
GUID(Globally Unique Identifier)全球唯一标示符: CoCreateGuid产生(API);
CLSID(Class Identifier):代表COM对象的类别,代表COM对象的CoClass;
IID(Interface Identifier): 代表一个COM对象的接口;
例如:如何建立COM对象的方法;
var
iRoot: IUnkown;
begin
...
iRoot := CreateComObject(ProgIDToClassID('Project1.Interface1')); //取得实体样例
...
end;
应用程序在内存中建立了COM对象的实体样例;
注意: CreateComObject回传的是COM对象的实体样例的IUnknown接口;
APPID(Application Indentifier): 应用程序ID;
CATID(Category Identifier): COM组件实现的组件类型;
LIBID(Library Identifier): COM对象实现的Type Library代表的ID;
ProgID: 有意义的字符串代表特定的CLSID;
1.3 实现接口
目的:如何实现接口
实现IUnknown: QueryInterface、 _AddRef、 _Release
使用TInterfaceObject来自动实现Iunknown,否则的话自己要实现上面的方法。
创建、使用及销毁接口: create;指向接口的指针不访问任何信息;自动释放、强迫销毁一个接口将变量置为nil
注:delphi自动创建和销毁接口。
获取单个接口的指针:
直接分配:类与他们实现的接口类型兼容的
GetInterface(const IID: TGUID; out obj):判断对象是否支持一个接口
as操作符:对象支持特定的接口(对象不支持接口就错的话,可以拦截错误);
as自动调用计数功能;

1.4 高级多级接口问题
目的:在一个类中实现多个接口
在一个类中实现多个接口
TXY = class(TInterfacedObject, IXX, IYY): 类TXY 实现了IXX和IYY接口的所有方法。
多个接口不是多重继承:TXY有且只有一个基类TInterfacedObject;
方法分辨字句:当接口方法在类中实现时,方法分辨子句可使用改变他的名称
TXY = class(TInterfacedObject, IXX, IYY)
procedure IXX.pxy = pxy1
procedure IYY.pxy = pxy2

接口授权:一个接口的实现授权给另一个类:一个类包含针对另一个类的指针。
内部类: 实现一个或多个接口的功能性;
外部类:简单的将这些方法传递给内部类,而不是重新实现接口;

接口属性:可以定义只读、只写、或者读写属性;
但是所有访问都必须通过访问函数,因为接口不能定义存储。 
1.5 小结
目的:如何在delphi应用程序中内部使用接口,了解delphi语言要素的接口。
申明一个接口; 
在类中实现接口; 
实现IUnknown所需要的功能; 
自动对象析构的处理; 
在类中实现多个接口; 
将一个接口的实现授权给一个内部对象; 
定义并实现接口属性
[第一章 接口][第二章 接口与COM][第三章 类型库][第四章自动化][第五章 ActiveX][末尾]
第二章 接口与COM
2.1 GUIDs 和 COM
目的:
CLSID: Class ID是GUID一个具体的类型的名称,注册表 HKEY_CLASSES_ROOT/CLSID
每个接口CLSID或GUID都代表一个COM接口的实现 
COM对象: TCOMObject继承(TInterfacedObject不提供实现COM对象的必要功能)
Hresult: 特殊类型的返回值,意味着函数调用成功还是失败。
OleCheck: 检查函数调用可能产生的错误;当调用返回HResult的COM函数时应使用该函数;
类厂(Class Factory):
COM对象不是由程序直接例示的;
COM使用类厂来创建对象;
类厂是一个对象,目的就是创建其他对象;
每一个COM都有一个相关的类厂,负责创建在服务器中实现的COM对象;
类厂把COM从实际构造一个对象的过程中分离出来,COM没有对象构造过程
类厂支持IClassFactory接口: IClassFactory只定义2个函数CreateInstance和LockServer
CreateInstance函数: 负责创建类厂涉及的COM对象的实例的函数;
LockServer: 保持服务器在内存中,一般不要调用他;
类厂中的双重类:
2.2 进程内的COM服务器(In-Process COM Server)
目的:理解进程内的COM服务器
共性:有一个InprocServer32的子键、所有进程内服务器都输出以下四个标准函数;
DllRegisterServer: 2种方式自动调用
IDE的Register ActiveX Server菜单
Windows的命令行应用程序RegSvr32.exe(或Boland应用程序TRegSvr)
DllUnregisterServer: 是DllRegisterServer的逆进程,移走放在注册表中的条目;
DllGetClassObject:
负责提供给COM一个类厂,该类厂用语创建一个COM对象;
每个COM服务器将实现它输出的每个COM对象的类厂;
DllCanUnloadNow: 返回S_True,CO在内存中移走COM服务器;如果返回S_False

线程支持(Threading Support): 只适用于进程内服务器;被保存在注册表中;线程模型如下
Single-Thread Apartment(STA):实际上根本没有线程支持,所有对COM服务器的访问由Windows顺序执行,不必考虑同步存取的问题。
Mutli-Threaded Apartment(MTA): 允许同时有多个线程存取COM对象,必须控制不同线程同步存取的程序代码;
Both Apartment: 可以执行在MTS或STA中;
自由的:
注册服务器(registering the Server):所有的COM服务器都需要Windows注册表来工作。 
定制构造函数(Custom constructors): delphi中COM对象的基类包括一系列的非虚构造函数。
只需重载Initialize方法;
不要试图重载一个COM对象的构造函数;
创建一个进程内COM对象
function CreateComObject(const ClassID: TGUID): IUnknown;
CoCreateInstance内部创建负责创建COM对象类厂的实例,然后使用类厂来创建对象,创建完后COM对象后,类厂被销毁;
虚方法表(Virtual Method Tables):
接口实现为独立的方法表,该表实现在内存中紧靠VMT的地方;
不同的接口占据不同的内存部分,不能简单的把一个接口值赋给另外一个接口;
通常使用as操作符从一个接口转换为另外一个接口;
2.3 进程外COM服务器(Out-Of-Process COM Server)
目的:理解进程外COM服务器
进程外服务器是在exe中实现; 
实例化(Instancing): 创建多少个客户需要的实例;可以支持三个实例化方法中的一个;
Single Instace(单实例):
只容许一个COM对象的实例
每个需要COM对象实例的应用程序将产生COM服务器的单独拷贝;
Multiple Instance(多实例):
指COM Server可以创建一个COM对象的多个拷贝;
客户请求COM对象的一个实例时,由当前运行的服务器创建COM对象的一个实例;
Internal Only(内部实例):用于不被客户应用程序使用的COM对象;

调度数据(Marshaling Data):
一个可执行的程序不能直接访问另一个可执行程序的地址空间;
Windows通过调度(Marshaling)进程在调用应用程序和进程外COM服务器之间移动数据;
自动化兼容 SmallInt、Integer、Single、Double、currency、TDateTime、WideString、Idispatch、 Scode、WordBool、Olevariant、IUnknown、ShortInt、Byte;
记录和数组不能自动调度;
2.4 Variant 数组
目的:如何使用Variant 数组;
Variant:
一种可以拥有各种数据类型;
也可以告诉目前存储的数据是什么类型(通过使用VarType函数);
可以给相同的Variant分配不同的数据类型,只要Variant包含数字值就可以执行算法;

variant数组只不过是variant型的数组,不必包含同类型的数据; 
variant数组的创建方法:
function VarArrayCreate(const Bounds: array of Integer; VarType: integer): variant;
Bounds: 告诉数组的上下界;
VarType: 决定了数组的中存储什么类型的数据。

例如:创建数组的数组, 可以模仿任何类型的数据结构类型:
VarArrayX := VarArrayCreate([1,10], varVariant);
数组的单个元素可以装载一个数组: VarArrayX[1] := VarArrayCreate([1,5], varVariant);
function VarArrayOf(const Values: array of Variant): Variant;
运行时用于创建一维数组;
可以创建全异的数值数组;
例如: MyArray := VarArrayOf(['李维', 30, '60', 60.369, 'China']);

使用Variant数组:与使用标准Delphi数组类似;
VarArrayLowBound、VarArrayHighBound(与数组的low、high类似)计算边界;
VarArrayDimCount:计算数组的维数;
2.5 小结
目的:接口GUID及进程COM服务器的基本知识了解;

Guid是什么;以及为什么Guid对COM是如此重要;如何创建Guid以供自己使用; 
进程内COM服务器,创建及如何使用; 
Variant数组; 是什么、及如何使用; 
进程外COM服务器的介绍、调度及Windows可自动调度的类型; 
只有能理解虚方法表(VMT)的面向对象的语言才能访问只有虚方法表的COM服务器
[第一章 接口][第二章 接口与COM][第三章 类型库][第四章自动化][第五章 ActiveX][末尾]

第三章 类型库
3.1 定义类型库
目的: 类型库是什么,和它的作用是什么。

使用类型库的好处:
编写自动化控制时早期连接(Early Binding);
许多编译器可以从一种类型库中自动生成针对特定编程语言的代码;
实用程序可以用来读取并显示有关包含类型库的COM服务器的信息;
在COM客户和服务器之间自动参数调度;

类型库对某些COM服务器是必须的,例如:自动化服务器和ActiveX控件; 
TTypedComObject: Delphi由该类及其派生类提供了对类型库的支持;
Delphi自动创建XXXX_TLB.pas文件;
COM由TTypedComObject派生,而不是TComObjectFactory.Create;
初始时,delphi调用了TTypedComObjectFactory.create、而不是TComObjectFactory.Create;
3.2 使用delphi来创建类型库
目的: 如何使用Delphi来创建类型库的基本知识;

可以使用IDL(Interface Definition LAnguage 接口定义语言)编码类型库; 
类型库编辑器:
工具条:可以添加接口、方法、以及属性到COM服务器中;
注:工具条上可以通过点击鼠标右键弹出的菜单中选择Text Labels命令打开工具条的标题;
Interface(接口): 自动为每一个新建的接口产生一个GUId;
Dispinterface(派遣接口): 与接口类似,但是使用不同的派遣机制调用服务器中的方法;
CoClass(): 类别的定义,被指定给实现接口的COM对象;
使用COM对象之前必须先使用一种方法从类别定义建立真正的类别对象(变量);
再从类别对象取去需要的接口;
最后再从取得的接口中调用需要执行的方法或需要存取的属性;
Enumeration(枚举): 与枚举类型类似;有整数ID来指明,而不是通过集合类型;
Constant(常量):只有在枚举下才有用;可以编辑Name、Value属性;
Alias(别名): 用于定义用户要包括一条记录类型(record)或联合类型(union)中的类型;
Record(记录类型): 记录结构;
Union(联合类型): 等同于Pascal Variant类型;
Module(模块): 模块是方法和常量的集合;
Method(方法): 输入参数(in)、输出参数(out)、可变参数(var);
Property(属性): 只读、只写、读写三种;
Refresh(更新): 使Delphi更新源文件;
Register(注册): 编译COM服务器并把服务器注册到Windows中;
Export(输出到IDL): 在MIDL或Corba格式中很有用;

friend
对象列表(Object List):显示服务器中定义的接口、方法等;
页控件(Page control):显示对象列表中当前选中的接点的类型信息;

类型库也是一种资源; 
不必在客户应用程序中直接读取类型库;
3.3 小结
目的: 类型库的运用;

类型库是什么; 
如何创建一个类型库; 
如何编译一个类型库类给自己的服务器添加方法、属性及枚举类型; 
如何读取类型库的信息;
[第一章 接口][第二章 接口与COM][第三章 类型库][第四章自动化][第五章 ActiveX][末尾]

第四章 自动化

通过自动化操作类型库;接口和自动化;Variants和自动化;派遣接口;双重接口;自动化ADO;
4.1 定义自动化
目的: 自动化以及客户通过使用接口、Variants派遣接口和双重接口创建并使用自动化服务器;

自动化是一种从应用程序的内部自动控制另一个应用程序的方法。 
获取自动化服务器的COM对象的两种主要访问方法:
接口:早期连接(early binding)
早期连接是指对接口方法的所有调用在编译时检查参数是否正确;
Variants: 后期连接 (late binding)
后期连接指连接意味着方法调用直到运行时才被实现;
Variant不是对象指针;对象的调用方法是后期连接;
编写快速、简单的客户应用程序不用费力去输入一个类型库;

派遣接口(DispInterface)
在接口和Variant中间的某个地方就是派遣接口;与接口有很多类似;
只是方便客户而设定的;
并没有在服务器上实现派遣接口;是服务器上实现了接口;
假设服务器的COM对象也支持IDispatch接口,客户应用程序可以使用Variants或派遣接口;

双重接口(Dual Interface): 自动化服务器
简单定义为自动化服务器,支持早期连接(接口)和后期连接(Variants);
使用delphi创建的任何任何自动化服务器将自动支持双重接口;
4.2 进程内自动化服务器
目的: 创建并使用进程内自动化服务器;

CreateOleObject和GetActiveOleObject
CreateOleObject:总是创建特定服务器的新实例;
GetActiveOleObject: 用来获取正在内存中运行的服务器的引用;
例如:
Procedure StartOrLinkToWord;
var v: Variant;
begin
try
v := GetActiveOleObject('Word.Basic'); //判断是否Wod已启动;
except
v := CreateOleObject('Word.Basic'); //否则启动Word; 通常自动化服务器启动是隐藏的;
v.AppShow; //显示Word应用程序;
end;
V.FileNew; //创建一个新的文档;
v.Insert('Automation is easy!');
end;

访问自动化服务器的方法:
Interface 通过接口;
Variant 通过Variant: 通过可使用的类名;CreateOleObject
DispInterface 通过派遣接口;
4.3 进程外自动化服务器
目的: 自动化的基础;创建一个Automation服务器,如何使用接口、派遣接口、和Variants来控制此服务器;

在本身应作为独立服务器应用程序的情况下,使用进程外非常好; 
HResult:
自动服务器中的所有方法必须返回一个HResult,暗示是成功还是失败;
所有其他参数必须在out参数中返回;

safecall:
调用协议可使编码;
指示Delphi自动把所有方法包括在try...except模块中;
在客户端safecall导致客户检查是否有HResult类型的返回失败码;
4.4 COM事件和回调
目的: 两种方式的比较;

派遣接口(DispInterface):
与Interface的比较
DispInterface: 为事件提供了更好的支持;与VB兼容;实现事件是最兼容的方法;
Interface: 不与VB兼容;但速度比派遣接口稍快;

回调接口(CallBack Interface):除非有极重要的原因否则不要使用;
服务器做大量的工作,而刻户端不需要太多的工作;
接口中定义回调方法,而不是使用派遣接口把事件送回到客户端;
回调接口在服务器中定义,但在客户中实现;
如果知道服务器和客户提供的接口,回调接口更有效;
4.5 自动化ADO: Microsoft最新的数据库技术;
目的:如何使用Delphi来快速、轻松的使用基于COM的技术;

主要组件:Connection、RecordSet、Command;
Connection对象: 用于连接到一个本地或远处的数据库;
RecordSet对象: 提供了一个记录集的连接;
Command对象: 向数据库发出命令,不返回结果集;

连接数据库:Connection.Open();  
记录集打开:RecordSet.Open();  
执行命令:对数据库进行操作,并返回结果集,应使用Command对象(与Parameter一起工作); 
访问字段值:
访问Field对象的值: RecordSet.Fields.Item[FieldNo].Value;
访问字段名称:RecordSet.Fields.Item[FieldNo].Name;

数据库错误处理:Error对象,该对象提供任何错误的详细代码;
4.6 小结
目的: 接口、派遣接口和Variants三种方法之间的不同,在特定的环境中使用那种方法;

创建进程内和进程外COM自动化服务器; 
Vraiants在COM自动化服务器中的作用,以及如何使用容许后期连接到自动化对象; 
实现COM事件和回调; 
如何使用Delphi能相对轻松的使用ADO; 
知道接口、派遣接口、和Variants的区别;
[第一章 接口][第二章 接口与COM][第三章 类型库][第四章自动化][第五章 ActiveX][末尾]

第五章 ActiveX控件和ActiveForms
5.1 ActiveX控件
目的:

5.2 创建ActiveX控件;
目的:  

5.3 ActiveForm(Active窗体);
目的: 组件导向的中介软件;ActiveForm的开发;开发浏览器的客户端应用程序;

创建ActiveX工程:
New-->ActiveX-->ActiveX Library
New-->AcitveX-->Active Form
设计时期开发执照;
关于对话框;
版本控制编号;(一般要包括,控制新旧版本、以及是否从服务器下载);
分发:Project-->Web Deploy Options
Target dir: ActiveForm组件于HTML首页中codebase tag的目的;
Target URL: Delphi分发ActiveX组件的时候自动产生一个HTML的首页档案;
HTML dir: 储存这个HTML首页档案的位置;
Use CAB file compression:
Include file version number: 分发时包含版本信息;
Auto increment release number: 自动增加版本编号;
Deploy required package:
Deploy additional file:
project-->Wep deploy开始分发;
5.4 小结
目的:加强ActiveX组件的能力;
使用ActiveX组件; 
如何把已有组件转换为ActiveX组件;实现Delphi没有提供的功能; 
如何从窗体创建ActiveForm;

Delphi中制作DLL中回调函数的应用 Delphi中制作DLL •一 Dll的制作一般分为以下几步: 1 在一个DLL工程里写一个过程或函数 2 写一个Exports关键字,在其下写过程的名称。不用写参数和调用后缀。 二参数传递 1 参数类型最好与window C++的参数类型一致。不要用DELPHI的数据类型。 2 最好有返回值[即使是一个过程],来报出调用成功或失败,或状态。成功或失败的返回值最好为1[成功]或0[失败].一句话,与windows c++兼容。 3 用stdcall声明后缀。 4 最好大小写敏感。 5 无须用far调用后缀,那只是为了与windows 16位程序兼容。 三 DLL的初始化和退出清理[如果需要初始化和退出清理] 1 DLLProc[SysUtils单元的一个Pointer]是DLL的入口。在此你可用你的函数替换了它的入口。但你的函数必须符合以下要求[其实就是一个回调函数]。如下: procedure DllEnterPoint(dwReason: DWORD);far;stdcall; dwReason参数有四种类型: DLL_PROCESS_ATTACH:进程进入时 DLL_PROCESS_DETACH进程退出时 DLL_THREAD_ATTACH 线程进入时 DLL_THREAD_DETACH 线程退出时 在初始化部分写: DLLProc := @DLLEnterPoint; DllEnterPoint(DLL_PROCESS_ATTACH); 2 如Form上有TdcomConnection组件,就Uses Activex,在初始化时写一句CoInitialize (nil); 3 在退出时一定保证DcomConnection.Connected := False,并且数据集已关闭。否则报地址错。 四全局变量的使用 在widnows 32位程序中,两个应用程序的地址空间是相互没有联系的。虽然DLL在内存中是一份, 但变量是在各进程的地址空间中,因此你不能借助dll的全局变量来达到两个应用程序间的数据 传递,除非你用内存映像文件。 五、其他:调用方式按照标准的Windows调用方式. 六、关于参数传递 •Delphi程序之间调用DLL,如果要用String类型的话,要在引用的单元加上ShareMem 单元。 •如果Delphi写的DLL供其他开发工具使用的话,不要使用String类型,用PAnsiChar类型。 尽量使用标准DLL接口。指的是传递的参数类型及函数返回类型不能是Delphi特有的, 比如string(AnsiString),以及动态数组和含有这些类型成员的复合类型(如记录),也不 能是包含有这些类型成员数据成员的对象类型,以避免可能的错误。如果使用了string类型或 动态数组类型,且调用方不是Delphi程序,则基本上会报错。如果调用方是Delphi但调用方或 被调用方没有在工程文件的第一包含单元不是ShareMem,也可能会出错。 七、关于回调Funciton 你可以把Callback函数看作是一种特殊的消息响应函数,一般来说我们不会自己调用这种函数, 而是有某些系统函数调用,而且不需要向后传递消息。 只要象C/C++这样支持函数指针的语言都 有回调函数的概念,它实际上是向被调用函数传一个你的函数地址,然后被调用函数向通过你传 入的函数地址来调用你的函数 。 以上是结构化回调,到高级语言Object Pascal、C++中回调函数并没有退出,反而得到延伸与 扩展,在面向对像中的回调,其实是指面向对像中类对像的事件,事件就是原始的回调函数。面 向对像, 将回调函数定义成事件过程,在程序引用对像时,若指定了对像的过程事件后,那么在 要进行事件触发的地方检查事件过程是否分配,如果分中的就执行事,也就是执行了回调函数。 立即下载

相关推荐

用示波器抓一次MIPI D-PHY的波形,手把手教你读懂HS模式和LP模式的切换时序

本文详细解析了MIPI D-PHY信号的双模切换机制,包括高速模式(HS)和低功耗模式(LP)的波形捕获与诊断技巧。通过示波器设置、关键状态分析和实战案例,帮助工程师快速定位信号完整性问题,提升调试效率。

weixin_30696427的博客 455

delphi 接口的知识

Delphi 接口是 Delphi 编程语言中的一个重要概念。它是用于实现面向对象编程中的接口技术,可以使得程序代码具有更好的灵活性和可扩展性。接口定义了一组方法,任何实现该接口的类都必须实现这些方法,这样就可以通过接口访问这些方法,而不必关心具体实现类的细节。 在 Delphi 中,可以使用 interface 关键字定义接口,并通过实现该接口的类来实现接口的方法。接口中定义的方法都是抽象的,不...

weixin_35756690的博客 435

矿卡CMP 170HX的AI推理性能优化实战

GPU计算在现代AI推理中扮演着核心角色,其并行计算架构特别适合处理神经网络的大规模矩阵运算。通过CUDA指令集优化和计算管线重构,可以显著提升硬件利用率,这在边缘计算和带宽敏感型任务中尤为重要。以NVIDIA CMP 170HX矿卡为例,通过禁用FMA指令和框架适配优化,其FP32性能可提升15.9倍,在Qwen2.5-1.5B模型的4-bit量化推理中达到A100同架构78%的解码速度。这种优化技术不仅让淘汰矿卡重获新生,更为边缘AI部署提供了高性价比解决方案,特别适合7B以下量化模型部署和多路视频分析

weixin_30432579的博客 625

delphi-多态(overload,override)与接口(interface)

delphi-多态(overload,override)与接口(interface) 先来聊聊重载问题(也叫超载,总之是那个Overload)吧。在同一个类中,出现多个同名的方法的现象就是Overload。联系起上面提到的兄弟俩,我想这更好理解。他们从外观上是相似的,不同的是某些“参数”,类型上可能各异或是个数上不同。 在Delphi中,所有方法都默认是静态的,便于编译器和链...

554

细说STM32单片机SPI-Flash芯片的FatFS移植及其应用实例详解

本文以开发板上的SPI-Flash芯片W25Q16为媒介详细介绍CubeMX中FatFS各个参数的意义和设置,分析生成的代码中FatFS各个文件的作用和关联,完成针对W25Q16的硬件访问层的移植。继续使用旺宝红龙开发板STM32F407ZGT6 KITV1.0。

wenchm的博客 1638

华为路由器 VRRP主备配置

3、R3 出口路由器。

一直被模仿,从未被超越 5584

Delphi语法(六)接口

Delphi语法 第七章 接口

ForAnnuus的博客 1039

知识追踪实战:lstm+ Multi-head Attention注意力机制的学生做题成绩预测实战

知识追踪实战:lstm+ Multi-head Attention注意力机制的学生做题成绩预测实战

2221

delphi 接口

学习 delphi 接口 一切都是纸老虎!!! 第四章          接口  前不久,有位搞软件的朋友给我出了个谜语。谜面是“相亲”,让我猜一软件术语。我大约想了一分钟,猜 出谜底是“面向对象”。我觉得挺有趣,灵机一动想了一个谜语回敬他。谜面是“吻”,也让他猜一软件术 语。一分钟之后,他风趣地说:“你在面向你美丽的对象时,当然忍不住要和她接口!”。我们同时哈哈大 笑起来。谈笑间,似

流年~~ 1万+

ArtMate —— 美术公开课智能体开发全记录

本文档详细描述了一款专为中小学美术公开课设计的智能教学助手的开发过程。该智能体融合了多模态感知、自然语言交互、风格迁移与智能评价等技术,旨在辅助教师开展生动、高效的美术鉴赏与创作课程。全文包含需求分析、系统架构设计、核心模块代码实现、交互界面搭建及完整运行示例,并配有详尽的行内注释和设计思想阐述,为教育技术开发者提供一份可落地、可扩展的参考方案。

huanghm88的专栏 152

openpi 入门教程(一)安装、训练、微调与推理

OpenPI是由物理智能团队发布的机器人开源模型和软件包,包含两种主要模型:基于流的扩散视觉-语言-动作模型(VLA)的π₀模型和基于FAST动作标记器的自回归VLA的π₀-FAST模型。这些模型已在超过10,000小时的机器人数据上进行了预训练,并提供了基础模型检查点,支持开箱即用或根据用户数据集进行微调。OpenPI的实验性质意味着它可能不适用于所有平台,但鼓励研究人员和从业者进行创造性实验。运行这些模型需要至少具备NVIDIA GPU,推荐使用RTX 4090或更高规格的显卡。OpenPI支持在Ubu

2506_90492529的博客 5106

Delphi接口学习

前不久,有位搞软件的朋友给我出了个谜语。谜面是“相亲”,让我猜一软件术语。我大约想了一分钟,猜 出谜底是“面向对象”。我觉得挺有趣,灵机一动想了一个谜语回敬他。谜面是“吻”,也让他猜一软件术 语。一分钟之后,他风趣地说:“你在面向你美丽的对象时,当然忍不住要和她接口!”。我们同时哈哈大 笑起来。谈笑间,似乎我们与自己的程序之间的感情又深了一层。对我们来说,软件就是生活。 第一节 接口的概念 “接口”一词的含义太广泛,容易引起误解。我们在这里所说的接口,不是讨论程序模块化设计中的程序接...

疯流人物 1109

【100分】最长子字符串的长度

题目要求在一个环形字符串中找出字符 ‘o’ 出现了偶数次的最长子字符串长度。这里的字符串是一个环形的,即首尾相连。代码统计了字符串中字符 ‘o’ 的出现次数,并根据其奇偶性返回相应的最长子字符串长度。当 ‘o’ 的数量为偶数时,直接返回字符串长度;当 ‘o’ 的数量为奇数时,返回长度减去 1。给你一个字符串 s,字符串s首尾相连成一个环形 ,请你在环中找出 ‘o’ 字符出现了偶数次最长子字符串的长度。【最长子字符串的长度】

weixin_54707168的博客 896

Delphi下的接口编程

基于Delphi的接口编程入门 为什么使用接口?   举个例子好了:有这样一个卖票服务,电影院可以卖票,歌剧院可以卖票,客运站也可以卖票,那么我们是否需要把电影院、、歌剧院和客运站都设计成一个类架构以提供卖票服务?要知道,连经理人都可以卖票,很显然不适合把经理人也包括到卖票服务的继承架构中,我们需要的只是一个共通的卖票服务。于是,卖票的服务是个接口,电影院、歌剧院什么的只要都遵循这样一个服务

折翼飞翔 1022

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

Delphi接口的底层实现

Delphi接口的底层实现引言       接口是面向对象程序语言中一个很重要的元素,它被描述为一组服务的集合,对于客户端来说,我们关心的只是提供的服务,而不必关心服务是如何实现的;对于服务端的类来说,如果它想实现某种服务,实现与该服务相关的接口即可,它也不必与使用服务的客户端进行过多的交互。这种良好的设计方式已经受到很广泛的应用。    早在Delphi 3的时候就引入了接口的概

colin 7894

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

悟透delphi 第四章 接口

第一章  DELPHI的原子世界第二章  DELPHI与WIN32时空第三章  多线程第四章  接口第五章  包第六章  事件与消息第七章  组织你的模块第八章  探索数据库第九章  多层体系结构第十章  操作界面与操作逻辑第十一章  面向对象数据库基础本书原著李战(leadzen)大牛,由tingsking18整理,本人blog发布的版本经过战哥同意,转载请著名出处和原作者! 第四章

我一路走来--- 4650

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

delphi 接口编程_Delphi编程101中的接口

delphi 接口编程 In Delphi, "interface" has two distinct meanings. In OOP jargon, you can think of an interface as a class with no implementation. In Delphi unit definition interface section is used to dec...

cumao2792的博客 538

Delphi 的接口

Delphi 的接口(1) - 接口的简单解释 简单地说接口就是定义了方法和属性的空架子(术语为方法签名,包括函数和过程),属性本身也是存过程和取函数,即也是方法,在接口定义中所有成员都是默认的PUBLIC,没有数据成员。这些方法由继承它的子类来实现,这个子类只能有一个而且必须有一个父类,却可以有多个父接口。 接口可以连接完全不同的类对某一共同操作的桥梁,比如,“跑”这个操作,如果要用类继承,

herlockkn的专栏 1855

delphi java 接口_从Delphi到Go——接口

由于没有太多编写接口的经验,此处仅简单说明语法。后期对接口有更多认知和经验后再进行详细记录。DelphiDelphi的接口是侵入式接口,并且是单继承的,但类可以同时实现多个接口,类声明时需要显示声明实现了哪些接口。声明type//直接声明IMyInterface1 = interfacefunction Func1: Integer; //函数proc...

weixin_42303795的博客 255

delphi的接口support_学习到的关于Delphi的接口

Delphi的接口,据说是很牛X的东西,总体感觉来说,没有想象的那么好。很多Delphi相关的很牛的技术都没有用过。好吧,其实自己了解也并不多,更不用说很深层次的东西了,讲一讲自己经历的痛苦中得出来的一些东西吧。1. 同一个对象的一种接口的地址都是一样的。这个当初我也是很迷茫,在网上找了不少的资料,书上也基本没有说。说白了就是接口的内存空间的问题,接口的内存空间是在声明接口的时候分配的吗,Delp...

weixin_39640909的博客 165

delphi的接口support_Delphi接口使用实例介绍

对于Object Pascal语言来说,最近一段时间最有意义的改进就是从Delphi3开始支持接口(interface),接口定义了能够与一个对象进行交互操作的一组过程和函数。对一个接口进行定义包含两个方面的内容,一方面是实现这个接口,另一方面是定义接口的客户。一个类能实现多个接口,即提供多个让客户用来控制对象的“表现方式”。正如名字所表现的,一个接口就是对象和客户通信的接口。这个概念像C++中的...

weixin_33250594的博客 299

Delphi 接口使用

2019独角兽企业重金招聘Python工程师标准>>> ...

weixin_34401479的博客 410

Delphi interface 接口 总结

接口的功能类似抽象类, 通常定义一套通用的方法,但是在各实现类中有不同的实现方式。 以下几句来源于网络整理: (1)接口中只有方法、属性,没有字段。所以接口中的属性存取都必须通过方法。 (2)接口中的方法只有声明,没有实现。实现在类中完成。 (3)接口中的方法没有作用域。都是公开的,但是在类中则放到不同作用域。 (4)接口中的方法没有修饰字。可以认为它们都是抽象的。 (5)不能创建接口实例,要使用接口,必须在类中实现,通过类调用接口的方法。 (6)在类中必须声明和实现接口的所有方法。不像类继承中可以选择

944
上一篇: Delphi 灵活运用接口(interface), 隐藏核心代码, 设计低耦合程序.
下一篇: 基于Delphi的接口编程入门
Dcdu
博客等级 码龄21年 44粉丝 33原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值