`
emowuyi
  • 浏览: 1478085 次
文章分类
社区版块
存档分类
最新评论

GDI+ for VCL基础 -- GDI+ 与 VCL

 
阅读更多

陆续写了十几篇关于《GDI+Delphi程序的应用》的文章后,应几个小友来信要求,将我所使用的GDI+for VCL,包括DelphiC++Builder版发布在了csdn的资源下载区。

GDI+ C语言版本同时GDI+ for VCL版本2010.7.10修改版下载地址:http://download.csdn.net/source/2737743

其中的Delphi版与目前网上流通的版本不完全兼容;而C++Builder本来自带有C++版的Gdiplus,但由于与VCL有些冲突,使用起来较麻烦,所以本人参照Delphi版完全重新写了一个供C++Builder使用的VCL版(开源的),本BLOG中的有关GDI+的Delphi例子很容易就移植到C++Builder。

下面就GDI+ for VCL的一些特点作简单介绍:

GDI+是伴随Windows XP系统出现的增强性图形设备接口子系统,除了一整套API外,还提供了几十个C++类和大量的数据类型,同传统的Win32 GDI相比,GDI+不仅优化和扩展了GDI,而且使得使用C/C++开发Windows程序图形界面更容易操作。但是,对于Delphi和C++Builder所共用的VCL来说,由于VCL通过TCanvas、TBitmap和TImage等及其相关的类,把传统的GDI封装的几乎无可挑剔,类似C++的GDI+类,在易操作上就没什么优势可言了。但是,要想把GDI+封装成完全的VCL风格也存在几个问题:
1、正是由于VCL对GDI良好的封装,VCL所有与界面和图形有关的类对GDI存在严重的依赖性,即使GDI+封装成完全的VCL风格,也无法“插足”已有的界面和图形类,充其量只能起到“敲敲边鼓”的辅助作用,所以把GDI+封装成完全的VCL风格意义不大,除非GDI+为主,完全重构原有的界面和图形类;
2、现有大量的C++、.NET有关GDI+的代码移植到Delphi(C++Builser)时,结构修改量太大,而且对于已经熟悉C++或者.NET GDI+的人来说,重新掌握新的VCL风格无疑是痛苦的;
3、GDI+的坐标计量类型有整数和实数2套,如果按VCL风格写,势必要舍弃一套,保留整数型当然是最好的,但这2套类型又都不那么完整,整数型更是个半吊子系统。
鉴于以上原因,无论是目前网上流通的GDI+ for Delphi版本,还是本人改写的GDI+ for VCL,都基本采用了原C++类风格,甚至于.net的GDI+版本也与.net其它类风格不一样,更多的保留了原C++风格(就我个人的看法,不知什么原因,GDI+ for C++版本无论是架构设计,还是代码水平,其实都很差,同C++的STL没法比)。
当然,同网上流通的GDI+ for Delphi版本比,我改写的GDI+ for VCL版本并没有完全照搬原C++代码,兼顾了部分VCL和.NET风格,比如加入了VCL异常、布尔类型和绝大部分枚举和集合类型都采用了VCL风格、增加了.NET风格的Pens和Brushs等全局变量(C++Builder)或者全局函数(Delphi)。
GDI+ for VCL的所有类(不包括TPens和TBrushs)都派生于TGdiplusBase:
TCloneAPI=function(Native:GpNative;varclone:GpNative):TStatus;stdcall;

TGdiplusBase
=class(TObject)
private
FNative:GpNative;
protected
constructorCreateClone(SrcNative:GpNative;clonefunc:TCloneAPI
=nil);
propertyNative:GpNativereadFNativewriteFNative;
public
constructorCreate;
classfunctionNewInstance:TObject;override;
procedureFreeInstance;
override;
end;

原C++的GdiplusBase只是重载了new和delete操作符,分别以GDI+的GdipAlloc和GdipFree替换了原系统默认的内存分配和释放方法,而TGdiplusBase也相应的重载了TObject的NewInstance方法和FreeInstance方法(其实在不重载也能正常运行);

在TGdiplusBase中有个保护的GpNative(指针)类型的成员Native(Delphi中说明为属性,C++builder直接说明为数据成员),供所用派生类使用(原C++类将这个成员分散说明在各个类中),这个数据成员就是Gdiplus.dll内部使用的类指针,GDI+类都是通过对应的内部类指针对Dll Exports函数的调用实现的(假如你讨厌GDI+的类,你完全可以抛开它们而直接使用指针操作原始的Dll Exports函数);

至于TGdiplusBase构造方法CreateClone则是我为了简化派生类的Clone方法所提供的基类保护方法。

GDI+ for VCL定义了一个异常类EGdiplusException:

EGdiplusException=class(Exception)
private
FGdipError:TStatus;
functionGetGdipErrorString:
string;
public
constructorCreateStatus(Status:TStatus);
propertyGdipError:TStatusreadFGdipError;
propertyGdipErrorString:
stringreadGetGdipErrorString;
end;

除各类的析构方法外,其它类方法都使用了异常检查,这使得GDI+ for VCL代码同原C++代码和目前流通的GDI+ for Delphi比,更加方便和健壮,通过使用EGdiplusException.GdipError或者EGdiplusException.GdipErrorString,可以得到GDI+最后一次异常代码或信息。

GDI+ for VCL重新定义了绝大多数数据类型,如将C++风格的常量和枚举类型改为了VCL风格的枚举和集合类型,重构某些数据结构,以提供对VCL数据类型的支持或转换。以Color类为例,改写后的TGpColor:

// Known Color

#defineKnownColorCount141
static const ARGB kcAliceBlue = 0xfff0f8ff;
static const ARGB kcAntiqueWhite = 0xfffaebd7;
(略)

classColor
{
private:

union
{
ARGBFARGB;
struct
{
BYTEFBlue;
BYTEFGreen;
BYTEFRed;
BYTEFAlpha;
};
};
staticTIdentMapEntryKnownColors[];

voidMakeARGB(BYTEa,BYTEr,BYTEg,BYTEb);
voidMakeARGB(BYTEa,Graphics::TColorcolor);
COLORREFGetCOLORREF();
AnsiStringGetKnownName(
void);

public:

Color();
Color(Color
&color);
Color(ARGBargb);
Color(BYTEalpha,ARGBargb);
Color(BYTEr,BYTEg,BYTEb);
Color(BYTEa,BYTEr,BYTEg,BYTEb);
Color(BYTEalpha,Graphics::TColorcolor);
Color(Graphics::TColorcolor);
Color(AnsiStringName,BYTEAlpha
=255);

staticColorFromTColor(BYTEalpha,Graphics::TColorcolor);
staticColorFromTColor(Graphics::TColorcolor);
staticColorFromArgb(ARGBargb);
staticColorFromArgb(BYTEalpha,ARGBargb);
staticColorFromArgb(BYTEr,BYTEg,BYTEb);
staticColorFromArgb(BYTEa,BYTEr,BYTEg,BYTEb);
staticColorFromName(AnsiStringName,BYTEAlpha=255);
staticColorFromCOLORREF(BYTEalpha,COLORREFrgb);
staticColorFromCOLORREF(COLORREFrgb);

boolIsEmpty();
Color
&operator=(Colorc);
Color
&operator=(ARGBc);
booloperator==(Color&c);
booloperator!=(Color&c);

staticARGBStringToARGB(AnsiStringName,BYTEAlpha=255);
staticAnsiStringARGBToString(ARGBargb);

__propertyARGBArgb
={read=FARGB};
__propertyBYTEAlpha
={read=FAlpha};
__propertyBYTEA
={read=FAlpha};
__propertyBYTERed
={read=FRed};
__propertyBYTER
={read=FRed};
__propertyBYTEGreen
={read=FGreen};
__propertyBYTEG
={read=FGreen};
__propertyBYTEBlue
={read=FBlue};
__propertyBYTEB
={read=FBlue};
__propertyCOLORREFRgb
={read=GetCOLORREF};
__propertyAnsiStringName
={read=GetKnownName};

};

typedefColorTGpColor,
*PGpColor;
typedefARGBTARGB,
*PARGB;

不仅提供了对VCL的TColor类型的支持(定义为TGpColor类型的参数可直接传递TColor类型),也提供了对GDI+标准颜色的支持与转换(按标准颜色名称得到标准颜色或者按标准颜色取得名称)。在Delphi中,对应TGpColor的地方一律采用TARGB类型,同时提供了与TGpColor函数成员类似的转换方法:

functionARGBToString(Argb:TARGB):string;
functionStringToARGB(
constS:string;Alpha:BYTE=255):TARGB;
procedureGetARGBValues(Proc:TGetStrProc);
functionARGBToIdent(Argb:Longint;varIdent:
string):Boolean;
functionIdentToARGB(
constIdent:string;varArgb:Longint):Boolean;

functionARGB(r,g,b:BYTE):TARGB;overload;
functionARGB(a,r,g,b:BYTE):TARGB;overload;
functionARGB(a:Byte;Argb:TARGB):TARGB;overload;

functionARGBToCOLORREF(Argb:TARGB):Longint;
functionARGBToColor(Argb:TARGB):Graphics.TColor;
functionARGBFromCOLORREF(Rgb:Longint):TARGB;overload;
functionARGBFromCOLORREF(Alpha:Byte;Rgb:Longint):TARGB;overload;
functionARGBFromTColor(Color:Graphics.TColor):TARGB;overload;
functionARGBFromTColor(Alpha:Byte;Color:Graphics.TColor):TARGB;overload;

GDI+ for VCL还增加了.NET风格的Pens和Brushs等全局变量(C++Builder)或者全局函数(Delphi),不仅提供了141种标准颜色的画笔和画刷,也可使用自定义颜色调用Pens和Brushs的缺省数组(Delphi)或者重载的操作符(C++Builder)形成新的画笔和画刷,大大简化了一般的GDI+编程代码,C++Builder的定义为:

static TGpPens Pens;
static TGpBrushs Brushs;

而Delphi则定义为:

function Pens: TPens;
function Brushs: TBrushs;

你可能注意到上面的类型说明中Delphi和C++Builder类的名称不一样,前者为TGpPens和TGpBrushs,而后者直接写为TPens和TBrushs,这是本人写代码时的一点疏忽,不过对写代码没任何影响。

有关GDI+与VCL的话题就说到这里,下面用Delphi和C++Builder以一个简单相同的例子程序作为本文的结尾。

Delphi代码:

unitmain;

interface

uses
Windows,Messages,SysUtils,Variants,Classes,Graphics,Controls,Forms,
Dialogs,StdCtrls,Buttons,ExtCtrls;

type
TMainForm
=class(TForm)
BitBtn1:TBitBtn;
CbColor:TComboBox;
procedureFormPaint(Sender:TObject);
procedureCbColorDrawItem(Control:TWinControl;Index:Integer;
Rect:TRect;State:TOwnerDrawState);
procedureFormCreate(Sender:TObject);
procedureCbColorChange(Sender:TObject);
private
{Privatedeclarations}
procedureGetKnownColorStr(
consts:string);
public
{Publicdeclarations}
end;

var
MainForm:TMainForm;

implementation

usesGdiplus;

{$R
*.dfm}

procedureTMainForm.CbColorChange(Sender:TObject);
begin
Invalidate;
end;

procedureTMainForm.CbColorDrawItem(Control:TWinControl;Index:Integer;
Rect:TRect;State:TOwnerDrawState);
var
g:TGpGraphics;
r:TGpRect;
begin
g:
=TGpGraphics.Create(CbColor.Canvas.Handle);
try
CbColor.Canvas.FillRect(Windows.TRect(Rect));
r:
=GpRect(Rect.Left,Rect.Top,CbColor.ItemHeight,CbColor.ItemHeight-4);
OffSet(r,
2,2);
g.FillRectangle(Brushs[StringToARGB(CbColor.Items[Index])],r);
g.DrawRectangle(Pens.Black,r);
CbColor.Canvas.TextOut(r.X
+r.Width+5,r.Y,CbColor.Items[Index]);
finally
g.Free;
end;
end;

procedureTMainForm.FormCreate(Sender:TObject);
begin
GetARGBValues(GetKnownColorStr);
CbColor.ItemIndex:
=0;
end;

procedureTMainForm.FormPaint(Sender:TObject);
const
QualityStr:array[
0..4]ofstring=
(
'Default','HighSpeed','HighQuality','GammaCorrected','AssumeLinear');
Alphas:array[
0..3]ofByte=(255,128,64,32);
var
g:TGpGraphics;
font:TGpFont;
kc,bc:TARGB;
i,j:Integer;
begin
//建立与窗口关联的Graphics对象,使用Handle建立在D7中效果很好,可2007不停闪烁
//g:=TGpGraphics.Create(Handle,False);
g:=TGpGraphics.Create(Canvas.Handle);
//建立与本窗口字体关联的Gdiplus字体对象,以下3句都可建立,
//但是第三句显示有点不一样,可能没包括字符集的信息
font:=TGpFont.Create(Canvas.Handle);
//font:=TGpFont.Create(Canvas.Handle,Self.Font.Handle);
//font:=TGpFont.Create(Self.Font.Name,Self.Font.Size,Self.Font.Style);
kc:=StringToARGB(CbColor.Items[CbColor.ItemIndex]);
if(kcand$808080)=$808080thenbc:=kcBlack
elsebc:=kcAliceBlue;
//以下使用内建的Pens和Brushs作图,也可分别使用TGpPen和TGpBrush建立
g.DrawLine(Pens.Brown,120,30,659,30);
g.FillRectangle(Brushs[bc],
120,38,540,200);
//显示纵标题
fori:=0to4do
g.DrawString(QualityStr[i],font,Brushs.Black,
4.0,i*40+48);
//显示横标题
fori:=0to3do
g.DrawString(
'Alpha:'+IntToStr(Alphas[i]),font,Brushs.Black,130.0+i*140,8);
g.DrawString(
'选择显示颜色',font,Brushs.Black,4.0,260.0);
//根据所选颜色和Alpha,用不同的合成品质画色块
fori:=0to3do
begin
forj:=Integer(Low(TCompositingQuality))toInteger(High(TCompositingQuality))do
begin
g.CompositingQuality:
=TCompositingQuality(j);
g.DrawLine(Pens[ARGB(Alphas[i],kc),
20],
130+i*140,j*40+58,230+i*140,j*40+58);
end;
end;
font.Free;
g.Free;
end;

procedureTMainForm.GetKnownColorStr(
consts:string);
begin
CbColor.Items.Add(s);
end;

end.

C++ Builder代码:

//---------------------------------------------------------------------------

#ifndefmainH
#definemainH
//---------------------------------------------------------------------------
#include<Classes.hpp>
#include
<Controls.hpp>
#include
<StdCtrls.hpp>
#include
<Forms.hpp>
#include
<Buttons.hpp>
//---------------------------------------------------------------------------
classTMainForm:publicTForm
{
__published:
//IDE-managedComponents
TBitBtn*BitBtn1;
TComboBox
*CbColor;
void__fastcallCbColorDrawItem(TWinControl*Control,intIndex,TRect&Rect,
TOwnerDrawStateState);
void__fastcallCbColorChange(TObject*Sender);
void__fastcallFormPaint(TObject*Sender);
private://Userdeclarations
void__fastcallGetKnownColorStr(constStrings);
public://Userdeclarations
__fastcallTMainForm(TComponent*Owner);
};
//---------------------------------------------------------------------------
externPACKAGETMainForm*MainForm;
//---------------------------------------------------------------------------
#endif


//---------------------------------------------------------------------------

#include
<vcl.h>
#pragmahdrstop

#include
"main.h"
#include
"Gdiplus.hpp"
//---------------------------------------------------------------------------
#pragmapackage(smart_init)
#pragmaresource"*.dfm"
TMainForm
*MainForm;
//---------------------------------------------------------------------------
__fastcallTMainForm::TMainForm(TComponent*Owner)
:TForm(Owner)
{
GetARGBValues(GetKnownColorStr);
CbColor
->ItemIndex=0;
}
//---------------------------------------------------------------------------
void__fastcallTMainForm::GetKnownColorStr(constStrings)
{
CbColor
->Items->Add(s);
}
//---------------------------------------------------------------------------
void__fastcallTMainForm::CbColorDrawItem(TWinControl*Control,intIndex,
TRect
&Rect,TOwnerDrawStateState)
{
TGpGraphics
*g=newTGpGraphics(CbColor->Canvas->Handle);
try
{
CbColor
->Canvas->FillRect(Rect);
TGpRectr(Rect.Left,Rect.Top,CbColor
->ItemHeight,CbColor->ItemHeight-4);
r.Offset(
2,2);
TGpColorc
=TGpColor::StringToARGB(CbColor->Items->Strings[Index]);
TGpBrush
*b=Brushs[c];
g
->FillRectangle(b,r);
g
->DrawRectangle(Pens.Black,r);
CbColor
->Canvas->TextOutA(r.X+r.Width+5,r.Y,CbColor->Items->Strings[Index]);
}
__finally
{
deleteg;
}
}
//---------------------------------------------------------------------------
void__fastcallTMainForm::CbColorChange(TObject*Sender)
{
Invalidate();
}
//---------------------------------------------------------------------------
void__fastcallTMainForm::FormPaint(TObject*Sender)
{
conststaticStringQualityStr[5]=
{
"Default","HighSpeed","HighQuality","GammaCorrected","AssumeLinear"};
conststaticByteAlphas[4]={255,128,64,32};

//TGpGraphics*g=newTGpGraphics(Handle,false);
TGpGraphics*g=newTGpGraphics(Canvas->Handle);
//建立与本窗口字体关联的Gdiplus字体对象,以下3句都可建立,
//但是第三句显示有点不一样,可能没包括字符集的信息
TGpFont*font=newTGpFont(Canvas->Handle);
//TGpFont*font=newTGpFont(Canvas->Handle,Font->Handle);
//TGpFont*font=newTGpFont(Font->Name,Font->Size,Font->Style);
try
{
TARGBkc
=TGpColor::StringToARGB(CbColor->Items->Strings[CbColor->ItemIndex]);
TARGBbc
=(kc&0x808080)==0x808080?kcBlack:kcAliceBlue;
g
->DrawLine(Pens.Brown,120,30,659,30);
g
->FillRectangle(Brushs[bc],120,38,540,200);
for(inti=0;i<5;i++)
g
->DrawString(QualityStr[i],font,Brushs.Black,4.0,i*40+48);
for(inti=0;i<4;i++)
g
->DrawString("Alpha:"+IntToStr(Alphas[i]),
font,Brushs.Black,
130.0+i*140,8.0);
g
->DrawString("选择显示颜色",font,Brushs.Black,4.0,260.0);
for(inti=0;i<4;i++)
{
for(intj=0;j<5;j++)
{
g
->CompositingQuality=(TCompositingQuality)j;

g
->DrawLine(Pens(TGpColor(Alphas[i],kc),20),
130+i*140,j*40+58,230+i*140,j*40+58);
}
}
}
__finally
{
deletefont;
deleteg;
}
}
//---------------------------------------------------------------------------

运行结果:

通过这个例子,可以进一步了解前面介绍的颜色转换函数的应用、Pens和Brushs的应用;同时也增加对GDI+颜色类型TARGB不同于TColor的感性认识,即对Alpha的了解以及不同的Alphi值在不同的合成品质下的差异;还可掌握TCanvas与GDI+混合使用自绘TComboBox选项的技巧。

2011.6.26:
TGdiplusBase.CreatClone是一个构造方法 由于疏忽,在一些该方法调用语句中,未使用类类型作限定,导致克隆对象错误,应予以修正,以TGpMatrix.Clone为例:

function TGpMatrix.Clone: TGpMatrix;
begin
Result := CreateClone(Native, @GdipCloneMatrix);
end;
改为
Result := TGpMatrix.CreateClone(Native, @GdipCloneMatrix);

已修改过的主单元文件Gdiplus.pas的下载地址:http://download.csdn.net/source/3395894

分享到:
评论

相关推荐

    GDI+ for VCL

    GDI+ for Delphi,GDI+ for C++Builder 原资料Gdiplus for VCL(Delphi and C Builder)的修改版。

    GDI+ for VCL and GDI+ for C (2010.10.7)

    GDI+ for VCL and GDI+ for C语言2010.10.7最新修改版。 如有错误,请反馈,不胜感激!

    GDI+_for_VCL基础

    GDI+是伴随Windows XP系统...但是,对于Delphi和C++Builder所共用的VCL来说,由于VCL通过TCanvas、TBitmap和TImage等及其相关的类,把传统的GDI封装的几乎无可挑剔,类似C++的GDI+类,在易操作上就没什么优势可言了。

    Almdev StyleControls 4.51_Full Source.rar_StyleControls_VCL Styl

    StyleControls is a stable, powerful package (more than 100 components), which uses Classic drawing, system Themes, GDI+ and VCL Styles. This package contains the unique solutions to extend standard ...

    Almediadev StyleControls VCL 5.50 SOURCE

    StyleControls 是一个稳定、强大的包(超过 100 个组件),它使用经典绘图、系统主题、GDI+ 和 VCL 样式。该软件包包含扩展标准 VCL 控件的独特解决方案,还包含许多独特的高级控件,可用于创建具有 Fluent UI Blur ...

    SVGIconImageList:渲染SVG的三个引擎(GDI +,Direct2D或Cairo)和四个组件来简化SVG图像的使用(调整大小,固定颜色,灰度...)

    渲染SVG的三个引擎(GDI +,Direct2D或Cairo)和四个组件来简化SVG图像的使用(调整大小,固定颜色,灰度...) 实际正式版2.2.5(VCL + FMX) 成分 描述 TSVGIconImageCollection是Delphi的SVG图像的集合,以提供...

    DELPHI GDI+

    DELPHI开发的一个VCL曲线控件,用GDI+

    StyleControls_v.4.0_XE2-XE10.2

    StyleControls VCL is a powerfull package of components, which uses Classic drawing, system Themes, GDI+ and VCL Styles. This package contains the unique solutions to extend standard VCL controls and ...

    Delphi GDI+实现半透明异型窗口(使用PNG图片)

    我觉得这个窗体的样子很不错,窗体支持右键菜单,还可以设置窗口置顶和更换PNG图片,原来使用GDI+技术,用PNG就能实现这么漂亮、个性的半透明窗体,也让我对Delphi产生了信心,作者和时间:2008 赵述杰。 运行环境...

    CAD_Import_VCL_6.1.rar_AutoCAD DWG_TsgDXFImage_delphi dwg_object

    CAD Import VCL 6.1 New features: - AutoCAD&Ouml DWG 2007 file format is supported. - AutoCAD&Ouml PROXY (including AEC) entities are supported. - HPGL/HPGL2 file format - Bezier splines are ...

    StyleControls4.53

    StyleControls is a stable, powerful package (more than 100 components), which uses Classic drawing, system Themes, GDI+ and VCL Styles. This package contains the unique solutions to extend standard ...

    TeeChart(.net 图型控件)

    TeeChart Pro VCL/CLX 是一款图表制作的主流工具,自从1997年以来,它的发展经历了与用户的需求反馈不断交互以及不断创新的过程。TeeChart Pro提供了数以百计的2D、3D图形风格、40种数学统计函数,以及不限数量的...

    AlmediaDev-StyleControls-5.60-Full-Source.rar

    StyleControls 是一个强大的(超过 100 个组件)包,它使用经典设计样式、系统主题、GDI + 和 VCL 样式。该包包括将标准 VCL 控件部署为独特解决方案以及许多用于创建现代应用程序的独特和高级控件(UWP 设计)。您...

    StyleControls v4.63

    StyleControls is a stable, powerful package (more than 100 components), which uses Classic drawing, system Themes, GDI+ and VCL Styles. This package contains the unique solutions to extend standard ...

    TMS FlexCel v6.26 Source

    TMS FlexCel for VCL & FireMonkey是一款为本地Excel报告、文件的生成与处理VCL & FireMonkey的强大、全面与灵活的Excel组件包。本源码来源于互联网,请低调使用,不得用于商业用途。 新增: 新增功能:通过...

    White Paper-Integrating FireMonkey Into Your Existing Applications

    We will look at using the new library in Delphi FireMonkey and VCL applications and also with C#. We will cover using the shared library for containing business logic that is shared across ...

    C++builder gif动画函数库

    VCL多线程+GDI+处理gif动画。封装成dll插件调用。

    全源码版本StyleControls - 4.80 FS.rar

    2、支持所有元素和控件中的经典绘图、系统主题和VCL样式 3、控件的集合,它基于GDI+矢量图形(控件可以为不同的元素自动使用样式或自定义颜色) 4、特殊组件,添加按钮,标签在数控领域的风格形式和改善形式的...

    IconFontsImageList:简化“图标字体”使用的组件

    使用GDI +优化的渲染 实际正式版本2.5.1(VCL)和1.7.1(FMX) 成分 描述 TIconFontsImageCollection是Delphi的“图标字体”的集合,以提供IconFontsVirtualImageList的集中图像列表(仅适用于VCL) ...

    TMS Component Pack v8.3.4.0 - Delphi 10.1 Berlin Full Source

    Create modern-looking & feature-rich Windows applications faster with well over 400 components in one money and time saving bundle for Delphi 7, 2007, 2009, 2010, XE, XE2, XE3, XE4, XE5, XE6, XE7, XE8...

Global site tag (gtag.js) - Google Analytics