控件qq透明皮肤怎么弄

qq透明皮肤怎么弄  时间:2021-01-26  阅读:()

1555555555555667778910111213141515151517181818181819212223232424293535353535目录目录目录重要提醒为什么要移除Delphi/VCL的支持多注意包中的README.
md文件LCL组件或LCL对象的生命周期线程/协程中访问/操作UI一定要安装Lazarus吗如果需要安装Lazarus,步骤为:go版本>=1.
15需要注意的事为什么没提供linux32bit和linuxarm的预编译二进制永远不会做的事目前不会做的事liblcl源代码为什么项目中不存在go.
mod文件后期待增加的组件入门必读初衷项目的起源项目的现状态为什么要自己做学习govcl是否需要懂Pascal语言优/缺点其他Go版本建议已测试的各个系统平台情况初次使用步骤使用方法,三步走步骤一:获取govcl代码步骤二:编写代码步骤三:复制对应的二进制GoVCL开发APP规范前言规范一、main.
go二、TForm对应的impl文件UI的布局使用TPanel进行布局LCL对象的生命周期FPC/Delphi都为手动管理内存,所以习惯于自动管理内存的朋友请特别留意.
每个类都带有Free方法,用于释放Create(Go中已经将Create变为以New开头的函数了,比如:NewButton)所分配的内存.
这里举几个例子进行下说明:支持的事件事件详细支持的组件列表对象指针问题说明(重要)常见于位置应用场景示例1常数类型值:示例2指针类型值:目录1/1523737373939393940444647484950515252565759596263646465666768696969707171717172737475767677798182838484协程中操作UI组件(重要)正确的操作方式错误的操作方式自动关联事件事件命名规则:原理:注意res2goLazarusIDE插件利用LazarusIDE完成Windows可执行文件的图标、Manifest、版本信息修改(需要res2go插件1.
0.
4及以上版本),应用程序标题(1.
0.
7以上版本).
利用LazarusIDE完成窗口顺序和指定某些窗口不在初始时创建利用LazarusIDE完成Go的编译和运行.
运行时传入命令参数到目标利用LazaursIDE完成Windows下移除可执行文件的控制台窗口.
利用LazarusIDE完成GOOS和GOARCH修改.
利用LazarusIDE完成去除调试信息和符号安装LazarusIDE前往Lazarus官网下载页面,下载对应版本的IDE:Lazarus2.
0.
10不能安装spata插件解决方法使用Lazarus设计界面将GoVCL自定义组件安装到LazarusIDE中自定义组件列表:事件上需要注意的事情关于git拉取gitee上的govcl项目将liblcl打包到可执行文件内用此方法前,请确认liblclbinres与govcl代码是否一致,最好两者都更新为最新版本.

此方法只支持windows及Linux,macOS因为没有必要,所以不需要这种方式此方法与内存中加载dll不一样,是首次运行时会在临时文件目录创建一个名为liblcl/{crc32}/liblcl.
{ext}的文件在Windows上相对来说,也有被杀毒软件干掉的风险使用方法,如果使用了go.
mod则可以忽略第一步,因为线上我已经上传了新版本.
关于内存中加载liblcl(不推荐)不推荐用此方法,将来可能会删除这些代码.
推荐使用将dll打包到可执行文件中用此方法前,请确认liblcl与govcl代码是否一致,最好两者都更新为最新版本.

从内存中加载dll的几个步骤:libvcl和liblcl区别liblcllibvcl(已弃用)何时使用libvcl何时使用liblcl自定义加载指定路径liblclDPI相关对象的强制转换与比较所有govcl示例基本组件Lazarus-LCL组件WIKI常见属性常见事件常见方法对象默认方法go中组件对象继承组件TForm目录2/152868689919293949595959599103104105106107108109110110110110110113113117117125125127127127128129130131131132132138138138140140141142142144147148实例类ApplicationScreenMouseClipboardPrinter实例类说明FAQ关于自己扩展组件说明目前暂时废弃go代码部分pascal代码部分自行编译liblcl关于界面美化问题跨平台编译问题liblcl字符编码ListView等控件操作时闪烁问题减小go编译出的可执行文件大小关于GoVCLDesignergfm文件格式文件格式文件作用将gfm文件还原为lfm文件如何提取原来lfm中的组件到设计器中package包说明winWindefrtl函数typescolorscolors.
goconsts.
gotypes.
goenums.
gokeys虚拟键vcl函数_变量系统平台macOSAPP打包Linux窗口不能居中linux桌面图标生成WindowsIcon及manifest文件集成默认的资源包XP下关闭时uxtheme.
dll错误对话框解决方法去掉黑框(cmd窗口)目录3/152149150151151无法链接syso文件问题运行错误其他Go源码、liblcl中命名规则目录4/152govcl已于2.
0版本中移除了对Delphi/VCL的支持,只专注于Lazarus/LCL的跨平台方案.
https://z-kit.
cc/about.
html好些个包中都有README.
md文件,如需要了解此包,最好先看一看再用.
所有LCL对象都为手动管理,没有GC,没有引用计数.
详情参考"LCL对象生命周期".
所有UI组件都是非线程/协程安全的,当需要异步更新时,请使用ThreadSync来同步显示到UI上.

这不是必须的,根据自己的需求决定:这不是必须的,根据自己的需求决定:1、如果你要自己编译liblcl则需要.
2、如果你想用Lazarus的设计器来设计界面则需要.
3、除以上2点之外,都不需要安装.
1、安装LazarusIDE2、res2goLazarusIDE插件注:这步如果不需要拖放设计则不需要安装了(群文件内有视频教程演示这个插件的使用方法).

3、将GoVCL自定义组件安装到LazarusIDE中注:如果没有用到这几个自定义组件则无需安装(群文件内有视频演示).
4、Lazarus界面合并功能注:如果不喜欢分离式的界面,可以参考这个合并IDE窗口注:如果从2开始遇到安装时错误,请参考是否为Lazarus2.
0.
10不能安装spata插件解决方法所示的.
如果你使用go>=1.
15编译Windows可执行文件,则必须则必须使用-buildmode=exe编译选项,不然会有错误.
因为liblcl不支持ASLR.
问:为什么不支持ASLR答:不知道freepascal如何支持这个,目前没找到方法.
精力有限,目前维护4个ARCH的就已经够费精力的了,再加两个顶不住,反正源码和编译方法都摆那的,自己编译就行了.

永远不会加入Lazarus数据库相关的组件,加入了就意味着失去了Go原有的东西,还不如用Lazarus算了.

不考虑支持Android和iOS.
不考虑加入图表(Chart)相关的组件.
不考虑加入报表(Report)相关的组件.
不考虑加入SynEdit系列组件.
以上组件数量过多,属性、方法、事件过多,也过于复杂,都是些第三方控件,不适用于标准库以上组件数量过多,属性、方法、事件过多,也过于复杂,都是些第三方控件,不适用于标准库源码位于:https://github.
com/ying32/liblcl重要提醒重要提醒为什么要移除Delphi/VCL的支持为什么要移除Delphi/VCL的支持多注意包中的多注意包中的README.
md文件文件LCL组件或LCL对象的生命周期LCL组件或LCL对象的生命周期线程/协程中访问/操作UI线程/协程中访问/操作UI一定要安装Lazarus吗一定要安装Lazarus吗如果需要安装Lazarus,步骤为:如果需要安装Lazarus,步骤为:go版本>=1.
15需要注意的事go版本>=1.
15需要注意的事为什么没提供linux32bit和linuxarm的预编译二进制为什么没提供linux32bit和linuxarm的预编译二进制永远不会做的事永远不会做的事目前不会做的事目前不会做的事liblcl源代码liblcl源代码重要提醒5/152liblcl是基于FreePascal+Lazarus的GUI库,导出的接口全部以标准的c方式,数据类型也只使用了基本的,更多详细信息可以前往https://github.
com/ying32/liblcl查看,里面存放了liblcl原理的一部分(用c语言示例的)先前确实有过go.
mod文件,后来因为无法拉取就删除了,gomodule方式不并适合我这个项目,因为我这不单单只这一方面,还会涉及到我的一些生产工具,以及用户兼容性等问题.
那时候麻烦的不光是govcl的用户,我也跟着要处理这些麻烦事,而且还不一定能很好处理因为gomodule造成的问题.
与其这样还不如维持原样.
当然用gomodule拉取,比如手动指定为github.
com/ying32/govclv2.
0.
8+incompatible,其中版号替换为最新版.
简单看了下gomodule的一些说明,不是很明白,既然go.
mod中指定了拉取的版本,为何还要通过变动包名方式.
.
.
.
.

控件控件控件说明控件说明增加的概率增加的概率TDirectoryEditTEdit+TButton+TOpenDialog组合控件99%TDividerBevel中间是文字,两边有分割线的99%TListFilterEditTEdit+TButton组合,指定目标TListBox后,输入文字可直接过滤TListBox项目99%TListViewFilterEditTEdit+TButton组合,指定目标TListView后,输入文字可直接过滤TListView项目99%TTreeFilterEditTEdit+TButton组合,指定目标TTreeView后,输入文字可直接过滤TTreeView项目99%TEditButtonTEdit+TButton组合50%TCheckComboBox带下拉checkbox的combobox50%为什么项目中不存在go.
mod文件为什么项目中不存在go.
mod文件后期待增加的组件后期待增加的组件重要提醒6/152GoVCL(中文全称:Go语言可视化组件库;英文全称:GoLanguageVisualComponentLibrary)项目最初来源于自己的gofmx实验项目,当初做gofmx项目遇到了些问题,后来不知道怎么的就放弃了.
时隔8个多月后想起来试试移植VCL,一开始并没有打算做完整的,只是实验下,偶然间解决了之前做gofmx的遇到的问题,然后就一发不可收拾,捡起以前gofmx的生成器改为govcl的,一路也不是这么顺畅,踩坑很多.
慢慢的随着各种需求又加入了基于LCL组件的跨平台方案、独立的GOVCLUI设计器等.
从项目发布到现已经三年了,涵盖了LazarusLCL大部分的标准组件,完善度也越来越高.
依靠Lazarus使得govcl变得简单易用,稳定性也不差(2.
0版本后将不再支持Delphi/VCL了).
入门必读入门必读初衷初衷项目的起源项目的起源入门必读7/152因为基本上没有进行推广,知名度太低,除了最开始在OSC上发了些后就很少再发过相关,一直都默默的更新,也懒得去做宣传了.

项目的现状态项目的现状态入门必读8/152现在开源的goUI库也不少,自己也尝试简单使用过go-qt、lxn/walk、andlabs/ui、go-sciter等,但都不如意,缺失的太多.
有些处在停止更新,有些二进制依赖太多太臃肿、有些组件太少、有些非原生、有些不易使用等等各种问题.
基于这些原因我决定自己造个轮子.
govcl的目标为简单+小巧+原生.
为什么要自己做为什么要自己做入门必读9/152不需要懂Pascal语言不需要懂Pascal语言,仅仅只需要了解控件的使用方法和相关的属性及事件之类的.
除非你需要修改liblcl的源代码才会涉及到Pascal语言.

除非你需要修改liblcl的源代码才会涉及到Pascal语言.
学习govcl是否需要懂Pascal语言学习govcl是否需要懂Pascal语言入门必读10/152优点UI库小,用UPX压缩下也就1M-2M大小的,无依赖,简单,特别是加上使用可视化的设计器或者res2go工具能快速生成UI,免去了手动创建的烦恼.
控件多,属性多,事件多,对于一些工具开发足以.
缺点因为UI库全是原生组件,那么要做到像DirectUI那样的就是很麻烦的事了,所以这算是govcl现在的一大遗憾吧.
一些比较简单的美化界面还是相对容易做到.
优/缺点优/缺点入门必读11/152现Release中提供了一些各个平台的预编译的二进制,主要是用来测试的(正式请自己编译).

现Release中提供了一些各个平台的预编译的二进制,主要是用来测试的(正式请自己编译).

二进制包括:liblcl-win32、liblcl-win64、liblcl-linux64、liblcl-macOS64-cocoa.
至于为什么没有linux-32、linux-arm主要是不想折腾编译环境了,想要的可以自己解决.
其他其他入门必读12/152当前开发基于go1.
9.
2版本,从govcl1.
2.
0开始,最低只支持go1.
9.
v1.
2.
0之前的已测在go1.
5也可编译运行另外由于govcl项目太大已经不适合使用go32位的编译器了编译代码了,建议使用go64位的编译器编译,否则在编译的时候就容易造成内存溢出.
另外由于govcl项目太大已经不适合使用go32位的编译器了编译代码了,建议使用go64位的编译器编译,否则在编译的时候就容易造成内存溢出.
govcl主要代码已经达到13万多行,例程差不多3万行,libvcl+liblcl+res2go约20多万行.

govcl主要代码已经达到13万多行,例程差不多3万行,libvcl+liblcl+res2go约20多万行.

Go版本建议Go版本建议入门必读13/152系统系统已经测试系统版本已经测试系统版本说明说明WindowsWindowsXP、Windows7、Window10如果WindowsXP下关闭时错误的话,主要是因为uxtheme.
dll引起的,相关解决方法见FAQ中的LinuxUbuntu16.
04、LinuxMint17.
1、LinuxMint19、Deepin15.
5、ElementaryOSMacOSmacOS10.
12、10.
13注:从macOS10.
14后不再支持32位应用,Lazarus从2.
0开始已经转向cocoa库了,目前使用的还算可以.
Raspberrypi已测试的各个系统平台情况已测试的各个系统平台情况入门必读14/152goget-ugithub.
com/ying32/govcl注:也可用gomodule方式拉取,在go.
mod中配置如:github.
com/ying32/govclv2.
0.
8+incompatible,其中的版本号替换为最新版本.
方法一(使用Lazarus设计界面.
推荐):packagemainimport(//如果你使用自定义的syso文件则不要引用此包_"github.
com/ying32/govcl/pkgs/winappres""github.
com/ying32/govcl/vcl")typeTMainFormstruct{*vcl.
TFormBtn1*vcl.
TButton}typeTAboutFormstruct{*vcl.
TFormBtn1*vcl.
TButton}var(mainForm*TMainFormaboutForm*TAboutForm)funcmain(){vcl.
Application.
Initialize()vcl.
Application.
SetMainFormOnTaskBar(true)vcl.
Application.
CreateForm(&mainForm)vcl.
Application.
CreateForm(&aboutForm)vcl.
Application.
Run()}//--TMainFormfunc(f*TMainForm)OnFormCreate(sendervcl.
IObject){}func(f*TMainForm)OnBtn1Click(sendervcl.
IObject){aboutForm.
Show()}//--TAboutFormfunc(f*TAboutForm)OnFormCreate(sendervcl.
IObject){}func(f*TAboutForm)OnBtn1Click(sendervcl.
IObject){vcl.
ShowMessage("Hello!
")}方法一需要配合UI设计器或者res2go工具使用.
方法一需要配合UI设计器或者res2go工具使用.
初次使用步骤初次使用步骤使用方法,三步走使用方法,三步走步骤一:获取govcl代码步骤一:获取govcl代码步骤二:编写代码步骤二:编写代码初次使用步骤15/152方法二(纯代码,仿照FPC类的方式.
):packagemainimport(//如果你使用自定义的syso文件则不要引用此包_"github.
com/ying32/govcl/pkgs/winappres""github.
com/ying32/govcl/vcl")typeTMainFormstruct{*vcl.
TFormBtn1*vcl.
TButton}typeTAboutFormstruct{*vcl.
TFormBtn1*vcl.
TButton}var(mainForm*TMainFormaboutForm*TAboutForm)funcmain(){vcl.
Application.
Initialize()vcl.
Application.
SetMainFormOnTaskBar(true)vcl.
Application.
CreateForm(&mainForm)vcl.
Application.
CreateForm(&aboutForm)vcl.
Application.
Run()}//--TMainFormfunc(f*TMainForm)OnFormCreate(sendervcl.
IObject){f.
SetCaption("Hello")f.
Btn1=vcl.
NewButton(f)f.
Btn1.
SetParent(f)f.
Btn1.
SetBounds(10,10,88,28)f.
Btn1.
SetCaption("Button1")f.
Btn1.
SetOnClick(f.
OnButtonClick)}func(f*TMainForm)OnButtonClick(sendervcl.
IObject){aboutForm.
Show()}//--TAboutFormfunc(f*TAboutForm)OnFormCreate(sendervcl.
IObject){f.
SetCaption("Hello")f.
Btn1=vcl.
NewButton(f)//f.
Btn1.
SetName("Btn1")f.
Btn1.
SetParent(f)f.
Btn1.
SetBounds(10,10,88,28)f.
Btn1.
SetCaption("Button1")f.
Btn1.
SetOnClick(f.
OnButtonClick)}func(f*TAboutForm)OnBtn1Click(sendervcl.
IObject){vcl.
ShowMessage("Hello!
")}方法三(纯代码.
不推荐方式):初次使用步骤16/152//不推荐了,所以不给出了Windows:根据编译的二进制是32还是64位的,复制对应的"liblcl.
dll"到当前可执行文件目录或系统环境路径下.

Go环境变量:GOARCH=amd64386GOOS=windowsCGO_ENABLED=0Linux:复制"liblcl.
so"当前可执行文件目录(也可复制liblcl.
so到/usr/lib/(32位liblcl.
so)或者/usr/lib/x86_64-linux-gnu/(64位liblcl.
so)目录中,作为公共库使用).
Go环境变量:GOARCH=amd64GOOS=linuxCGO_ENABLED=1MacOS:复制"liblcl.
dylib"当前可执行文件目录(MacOS下注意:需要自行创建info.
plist文件),或者参考:MacOS上应用打包Go环境变量:GOARCH=amd64GOOS=darwinCGO_ENABLED=1注:这里的当前可执行文件目录指的是你当前编译的项目生成的可执行文件位置.
步骤三:复制对应的二进制步骤三:复制对应的二进制初次使用步骤17/152主要是提供一个规范的写法,samples目录中的后期的大多数都是按照规范去写的,只有一些较早的没有规范化.

1、作为一个UI程序,逻辑上main包为主,其他包为辅的方式去编写代码.
不要想着在其他包中直接调用main包中的东西.

2、UI必须在主线程中运行,不能使用任何其他方式将UI的初始和创建放在其他协程中运行.
换句话说,所有UI的初始和创建都只能在main函数中完成,并且不能用协程去操作这块.
3、在控件事件上应尽量避免使用匿名函数,不要贪图方便,应尽量使用类方法的形式.

4、TForm的方法函数,self变量命名不应该与全局命名相同,应该尽量使用简短的命名,比如:(f*TForm1).
5、当其他包想要传递数据给UI时,应该在其他包中导出相关接口,然后在main包中的相应位置初始他们(在项目例子的rproxy中就有相关的).

//比如//pkg1包packagepkg1var(Callback1func(msgstring))funcxxx(){ifCallback1==nil{return}for{Callback1("message")}}//main包packagemainimport"pkg1"funcmain(){//这里只是说明方法.
//在合适的位置初始化这个pkg1.
Callback1pkg1.
Callback1=xxx}funcxxx(msgstring){//这里接收数据,根据实际情况传递到某处.
}注:main.
go一般采用自动生成的即可,无特殊要求不要在里面写其它代码.
一些初始化的代码都应该放在相应的TForm初始化事件OnFormCreatemain.
go一般采用自动生成的即可,无特殊要求不要在里面写其它代码.
一些初始化的代码都应该放在相应的TForm初始化事件OnFormCreate中.
整个main.
go保持简洁少量的代码.
中.
整个main.
go保持简洁少量的代码.
如(一般无特殊要求整个main.
go文件内容就如下代码):packagemainimport("github.
com/ying32/govcl/vcl"_"github.
com/ying32/govcl/pkgs/winappres")funcmain(){GoVCL开发APP规范GoVCL开发APP规范前言前言规范规范一、main.
go一、main.
goGoVCL开发APP规范18/152vcl.
Application.
Initialize()vcl.
Application.
SetMainFormOnTaskBar(true)vcl.
Application.
CreateForm(&Form1)vcl.
Application.
CreateForm(&Form2)vcl.
Application.
Run()}或者:packagemainimport("github.
com/ying32/govcl/vcl"_"github.
com/ying32/govcl/pkgs/winappres")funcmain(){vcl.
RunApp(&Form1,&Form2)}再或者:packagemainimport("github.
com/ying32/govcl/vcl"_"github.
com/ying32/govcl/pkgs/winappres")funcmain(){vcl.
RunApp(&Form1,func(){//dosomething.
.
.
},&Form2,func(){//dosomething.
.
.
})}impl(impl指的implementation,即实现部分代码)后缀的文件名一般是首次自动生成的Form事件操作或者自定义的内容.

如需要在TForm初始后初始一些自定义的变量或者方法之类的.
TForm1Fields一般是对应的私有变量放置处,名字是与当前类对应的,命名规则为类名+Fields.
packagemainimport"github.
com/ying32/govcl/vcl"//::private::typeTForm1Fieldsstruct{//在这里定义你的变量isInitbooltitlestring}func(f*TForm1)OnFormCreate(sendervcl.
IObject){//一般在这里初始化自己的东东f.
isInit=falsef.
title="我是一个标题"f.
SetCaption(f.
title)}func(f*TForm1)OnFormClick(sendervcl.
IObject){f.
isInit=true二、TForm对应的impl文件二、TForm对应的impl文件GoVCL开发APP规范19/152f.
title="222222"f.
SetCaption(f.
title)}GoVCL开发APP规范20/152Lazarus中可视控件的布局大多数都默认的是绝对定位,一般没有像QT那种横向,竖向的布局思想(但是Lazarus中有些容器控件带有ChildSizing属性,可以对子控件做出一些类似横向、竖向的布局).
所有的可视控件都拥有一个Align属性,用来自动调整控件大小的,可以说是Lazarus的一种布局方式吧.
更多请前往例程中的"layout"查看.

与控件位置大小相关的方法有Left、SetLeft、Top、SetTop、Width、SetWidth、Height、SetHeight、SetBounds、ClientRect.

Align(layout例子有演示)Align是一个枚举类型,所有的值我在go中我按Lazarus中的定义为://见types包const(AlNone=iota+0//不进行自动调整,大多数控件默认值AlTop//居于顶部,仅SetHeight有效AlBottom//居于底部,仅SetHeight有效AlLeft//居于左边,仅SetWidth有效AlRight//居于右边,仅SetWidth有效AlClient//填充客户区域,无法手动调整控件大小AlCustom//自定义,这个很少用,需要的可以用OnAlignPosition事件,详细用法见layout例子.
)如:使用时直接调用Control.
SetAlign(types.
AlTop),即可使用控件居于父控件的顶部,并自动调整Top,Left,Right的值.
BorderSpacing(layout例子有演示)通过此属性可以另外调整控件的边距Anchors(layout例子有演示)锚点属性,相对于某一控件的位置Anchors属性为一个集合类型,有akLeft,akTop,akRight,akBottom,可多选,一般默认的为akLeft,akTop.
他的作用是,比如一个Button当Align设置为alNone时,我想这个控件居于右边并且不想改变控件的大小,这时可以将其设置为akTop,akRight.
当父窗口尺寸发生变化时会自动调整到设计模式的位置.
与其相关的属性和方法://methodsfuncAnchorToNeighbour(ASideTAnchorKind,ASpaceint32,ASiblingIControl)//当前控件的位置以ASide位于ASibling控件ASide偏移ASpace(右边).
funcAnchorParallel(ASideTAnchorKind,ASpaceint32,ASiblingIControl)//当前控件位置以ASide以ASibling的ASide位置偏移(左边)ASpace.
UI的布局UI的布局UI的布局21/152funcAnchorHorizontalCenterTo(ASiblingIControl)//置于指定控件的横向中心funcAnchorVerticalCenterTo(ASiblingIControl)//置于指定控件的纵向中心.
funcAnchorSame(ASideTAnchorKind,ASiblingIControl)//2.
0.
6版本开始支持此接口.
funcAnchorAsAlign(ATheAlignTAlign,ASpaceint32)funcAnchorClient(ASpaceint32)//propertysfuncAnchorSide(AKindTAnchorKind)*TAnchorSidefuncAnchorSideLeft()*TAnchorSidefuncAnchorSideTop()*TAnchorSidefuncAnchorSideRight()*TAnchorSidefuncAnchorSideBottom()*TAnchorSideChildSizing(simaplecalc例子有演示)容器类控件所拥有的,用于对子控件的一些布局方面的调整.
.
.
比如,横向,坚向排列等等.
.
.
.

一般情况下布局方面都选择使用TPanel作为布局的容器,比如说想实现一个"上-左-客户区"的布局,这里就需要2-3个TPanel,这里使用3个TPanel来演示,将3个TPanel的Align属性分别设置为alLeft,alTop,alClient就可实现.
注意控件的创建顺序哦,详情看例程中的"layout".
使用TPanel进行布局使用TPanel进行布局UI的布局22/1521、继承自TComponent的,当Owner不为nil时,其Owner会在销毁时同时销毁它.
//指定Owner,Owner可为自己的Parent或者Root,//一般Delphi/Lazarus从dfm/lfm中构建UI时指定的为Root,即TForm实例.
//button的Owner指定了mainForm,//那么此时在mainForm销毁前会自动调用button.
Free()button:=vcl.
NewButton(mainForm)//Application.
CreateForm因为CreateForm方法为内部所封装,//Owner已经自动指定了TApplication的实例,所不需要手动调用Free方法,//除非需求中提前销毁某个窗口.
mainForm:=Application.
CreateForm()2、继承自TComponent的,当Owner为nil时//不指定Owner//button的Owner为nil,需要手动调用button.
Free()方法进行释放.
//一般只有继承自TComponent的才拥有Owner.
button:=vcl.
NewButton(nil)button.
Free()3、子控件(TControl)位于容器控件(TWinControl(也就控件的Parent不为nil时))//当pnl主动调用`Free`时,`btn`控件也会被销毁pnl:=NewPanel(mainForm)pnl.
SetParent(mainForm)btn:=NewButton(mainForm)btn.
SetParent(pnl)pnl.
Free()//此时不管btn的owner是谁,都会被销毁4、不是继承自TComponent,v2.
0.
6开始可尝试开启-tagsfinalizerOn,这样就不需要调用Free了//此类全都需要手动调用实例的Free方法.
ico:=vcl.
NewIcon()ico.
Free()bmp:=vcl.
NewBitmap()bmp.
Free()mem:=vcl.
NewMemoryStream()mem.
Free()注:以上都为自己手动创建的对象才需要维护生命周期.
原有对象中的属性或者方法返回的一个对象,一般情况下由原对象负责生命周期.

LCL对象的生命周期LCL对象的生命周期FPC/Delphi都为FPC/Delphi都为手动管理内存手动管理内存,所以习惯于自动管理内存的朋友请特别留意.
每个类都带有Free方法,用于释放,所以习惯于自动管理内存的朋友请特别留意.
每个类都带有Free方法,用于释放Create(Go中已经将Create变为以New开头的函数了,比如:NewButton)所分配的内存.
这里举几个例子进行下说明:Create(Go中已经将Create变为以New开头的函数了,比如:NewButton)所分配的内存.
这里举几个例子进行下说明:LCL对象的生命周期23/152事件的类型定义请看https://gitee.
com/ying32/govcl/blob/master/vcl/events.
go//事件参数中的类型参考types包中的类型.
//sender对象源,啥是对象源,举个例子,button1.
click;响应onclick事件,事件参数中的sender即为对象源也就button1//公共的通知事件方法,像单击、鼠标进入、鼠标离开、双击等等//sender对象源typeTNotifyEventfunc(senderIObject)//TUpDown按钮的上、下按钮调节事件//sender对象源//button哪个按钮typeTUDClickEventfunc(senderIObject,buttonTUDBtnType)//TForm独有的关闭事件//sender为对象源//action可指定关闭的动作typeTCloseEventfunc(senderIObject,action*TCloseAction)//TForm关闭事件,会发生在OnClose之前//sender对象源//canClose可以决定阻止关闭窗口typeTCloseQueryEventfunc(senderIObject,canClose*bool)//菜单的改变事事件//sender对象源//source源菜单对//rebuild是否重构造typeTMenuChangeEventfunc(senderIObject,source*TMenuItem,rebuildbool)//TLinkLabel连接被点击事件//sender对象源//link当前点击的连接//linkType点击的连接类型,限windowsvista之上的系统typeTSysLinkEventfunc(senderIObject,linkstring,linkTypeTSysLinkType)//TApplication异常捕获事件,可在此事件中捕获vcl中的所有异常//sender为对象源,//e为异常信息对象,一般只用e.
Message()获取消息内容typeTExceptionEventfunc(senderIObject,e*Exception)//键盘按键事件//sender为对象源//key为按键码//shift表示控制按键状态typeTKeyEventfunc(senderIObject,key*Char,shiftTShiftState)//键盘按键事件//sender为对象源//key为按键typeTKeyPressEventfunc(senderIObject,key*Char)//鼠标按下或者抬起事件//sender为对象源//button中鼠标当前按下的按钮(左,中,右)键//shift为控制键状态//x,y为鼠标坐标,相对坐标,以当前控件0,0起typeTMouseEventfunc(senderIObject,buttonTMouseButton,shiftTShiftState,x,yint32)//鼠标移动事件//sender为对象源//shift为控制键状态//x,y为鼠标移动坐标,以当前控件0,0起typeTMouseMoveEventfunc(senderIObject,shiftTShiftState,x,yint32)支持的事件支持的事件事件详细事件详细支持的事件24/152//鼠标滚轮滚动事件//sender为对象源//shift为控制//wheelDelta滚动长度,分正负//x,y滚动时鼠标的位置//handled是否处理typeTMouseWheelEventfunc(senderIObject,shiftTShiftState,wheelDelta,x,yint32,handled*bool)//TListBox自绘事件//control对象源//index项目索引//aRect绘制区域//state绘制状态typeTDrawItemEventfunc(controlIControl,indexint32,aRectTRect,stateTOwnerDrawState)//TMenuItem自绘事件//sender对象源//aCanvas菜单对象画布//selected是否选择typeTMenuDrawItemEventfunc(senderIObject,aCanvas*TCanvas,aRectTRect,selectedbool)//TListView柱头单击事件//sender对象源//column当前点击的column对象typeTLVColumnClickEventfunc(senderIObject,column*TListColumn)//TListView柱头右键单击事件//sender对象源//column当前点击的column对象//point右键点击的坐标typeTLVColumnRClickEventfunc(senderIObject,column*TListColumn,pointTPoint)//TListView项目选择事件//sender为对象源//item选择的项目对象//selected是否选中typeTLVSelectItemEventfunc(senderIObject,item*TListItem,selectedbool)//TListViewcheckbox选中/取消选中事件//sender对象源//item选择的项目对象typeTLVCheckedItemEventfunc(senderIObject,item*TListItem)//TListView排序比较事件//sender对象源//item1待比较项目1//item2待比较项目2//data调用传入的数据,限windows,vcl//compare反回比较数据,小于0,等于0,大于0的数据typeTLVCompareEventfunc(senderIObject,item1,item2*TListItem,dataint32,compare*int32)//TListView项目改变事件//sender对象源//item改变的项目对象//change改变的类型,文字,图像,状态typeTLVChangeEventfunc(senderIObject,item*TListItem,changeTItemChange)//TListView通知事件//sender对象源//item通知的对象typeTLVNotifyEventfunc(senderIObject,item*TListItem)//TListView高级自绘项目事件//sender对象//aRect绘制区域//stage//defaultDraw是否默认绘制,默认为truetypeTLVAdvancedCustomDrawEventfunc(sender*TListView,aRectTRect,stageTCustomDrawStage,defaultDraw*bool)//TListView高级自绘项目事件//sender对象源支持的事件25/152//item当前被绘制的项目对象//state当前项目状态//stage//defaultDraw是否默认绘制,默认为truetypeTLVAdvancedCustomDrawItemEventfunc(sender*TListView,item*TListItem,stateTCustomDrawState,StageTCustomDrawStage,defaultDraw*bool)//TListView高级自绘子项目事件//sender对象源//item被绘制的项目对象//subItem绘制的子项目索引//state项目绘制状态//stage//defaultDraw是否默认绘制,默认为truetypeTLVAdvancedCustomDrawSubItemEventfunc(sender*TListView,item*TListItem,subItemint32,stateTCustomDrawState,stageTCustomDrawStage,defaul//TTreeView排序事件//sender对象源//node1待比较的节点1//node2待比较的节点2//data为调用函数传入的,可为指针等//compare返回比较大小,大于0,等于0,小于0的整型typeTTVCompareEventfunc(senderIObject,node1,node2*TTreeNode,dataint32,compare*int32)//TTreeView节点展开事件//sender对象源//node当前展开的节点对象typeTTVExpandedEventfunc(senderIObject,node*TTreeNode)//TTreeView节点改变事件//sender对象源//node当前改变的节点对象typeTTVChangedEventfunc(senderIObject,node*TTreeNode)//TTreeView自绘事件//sender对象源//aRect绘制区域//stage绘制状态//defaultDraw是否默认绘制,默认为truetypeTTVAdvancedCustomDrawEventfunc(sender*TTreeView,aRectTRect,stageTCustomDrawStage,defaultDraw*bool)//TTreeView高级自绘项目事件//sender对象源//node当前绘制节点//state绘制状态//stage//paintImages是否绘制图像//defaultDraw是否默认绘制,默认为truetypeTTVAdvancedCustomDrawItemEventfunc(sender*TTreeView,node*TTreeNode,stateTCustomDrawState,stageTCustomDrawStage,paintImages,defaultD//TPageControl获取图像索引事件//sender对象源//tabIndex绘制的tab索引//imageIndex返回的图像索引typeTTabGetImageEventfunc(senderIObject,tabIndexint32,imageIndex*int32)//ToolBar自绘事件//sender对象源//aRect绘制区域坐标//stage//defaultDraw是否使用默认绘制,默认为truetypeTTBAdvancedCustomDrawEventfunc(sender*TToolBar,aRectTRect,stageTCustomDrawStage,defaultDraw*bool)//ToolBar高级自绘事件,限windows,//sender对象源//button当前绘制的button对象,//state绘制状态//stage//flags绘制标识//defaultDraw是否默认绘制,默认为truetypeTTBAdvancedCustomDrawBtnEventfunc(sender*TToolBar,button*TToolButton,stateTCustomDrawState,stageTCustomDrawStage,flags*TTBCustomDraw支持的事件26/152//TForm文件拖放事件//sender对象源//aFileNames一个文件名数组typeTDropFilesEventfunc(sender*TObject,aFileNames[]string)//窗口约束调整大小事件//sender对象源//minWidth最小宽度//minHeight最大高度//maxWidth最大宽度//maxHeight最大高度typeTConstrainedResizeEventfunc(senderIObject,minWidth,minHeight,maxWidth,maxHeight*int32)//帮助F1吧//command命令//Data//callHelp能否使用帮助typeTHelpEventfunc(commanduint16,dataTHelpEventData,callhelp*bool)bool//快捷键事件//msg消息//handled是否响应typeTShortCutEventfunc(msg*TWMKey,handled*bool)//上下文件弹出事件,也就一般右键//sender对象源//mousePos鼠标位置//handled是否响应typeTContextPopupEventfunc(senderIObject,mousePosTPoint,handled*bool)//拖放完成//sender对象源//source拖放源//x坐标//y坐标//state状态//accept是否接受typeTDragOverEventfunc(sender,sourceIObject,x,yint32,stateTDragState,accept*bool)//拖放下落//sender对象源//source拖放源//x坐标//y坐标typeTDragDropEventfunc(sender,sourceIObject,x,yint32)//启动拖放//sender对象源//dragObject拖放对象typeTStartDragEventfunc(senderIObject,dragObject*TDragObject)//结束拖放//sender对象源//target目标源//x坐标//y坐标typeTEndDragEventfunc(sender,targetIObject,x,yint32)//停靠下落//sender对象源//source目标源//x坐标//y坐标typeTDockDropEventfunc(senderIObject,source*TDragDockObject,x,yint32)//停靠完成//sender对象源//source停靠源支持的事件27/152//x坐标//y坐标//state拖放状态//accept是否接受typeTDockOverEventfunc(senderIObject,source*TDragDockObject,x,yint32,stateTDragState,accept*bool)//解除停靠//sender对象源//client客户源//newTarget新的目标//allow是否允许typeTUnDockEventfunc(senderIObject,client*TControl,newTarget*TControl,allow*bool)//启动停靠//sender对象源//dragObject源typeTStartDockEventfunc(senderIObject,dragObject*TDragDockObject)//获取位置信息,停靠相关//sender对象源//dockClient//influenceRect//mousePos//canDocktypeTGetSiteInfoEventfunc(senderIObject,dockClient*TControl,influenceRect*TRect,mousePosTPoint,canDock*bool)//鼠标滚轮键按下或者抬起事件//sender对象源//shift状态//mousePos鼠标位置//handled是否继承typeTMouseWheelUpDownEventfunc(senderIObject,shiftTShiftState,mousePosTPoint,handled*bool)//消息循环,仅windows,libvcl//msgWindows消息//handled是否继承处理typeTMessageEventfunc(msg*TMsg,handled*bool)//----grid//表格单元移动事件//sender源对象//FromIndex源单元格索引//ToIndex目标单元格索引typeTMovedEventfunc(senderIObject,fromIndex,toIndexint32)//表格自绘事件//sender源对象//aCol列索引//aRow行索引//aRect单元格矩形大小//state绘制状态支持的事件28/152现支持组件和非组件类列表:自定义组件:我自己编写的自定义组件+第三方组件:我自己重新封装的第三方控件支持的组件列表支持的组件列表支持的组件列表29/152组件组件(控件)(控件)是是否否可可视视说明说明平台限制平台限制LazarusLazarusWikiWikiTApplication否应用程序服务类,整个程序中有有一个实例,默认创建TForm是窗口容器TButton是按钮访问TEdit是单行文本编辑TMainMenu否主菜单管理TPopupMenu否弹出式菜单管理TMemo是多行文本编辑器TCheckBox是复选框TRadioButton是单选按钮TGroupBox是分组框TLabel是标签TListBox是列表框TComboBox是组合框TPanel是面板,一般来用布局TImage是图像显示TLinkLabel是超链接标签(自定义组件)TSpeedButton是按钮,图像式的,自绘的那种TSplitter是分割器TRadioGroup是单选按钮分组框TStaticText是标签,跟TLabel差不多TColorBox是颜色选择组合框TColorListBox是颜色选择列表框TTrayIcon否托盘管理Windows、MacOS、部分Linux(已测试LinuxMint17.
1、19、Deepin可使用)支持的组件列表30/152TOpenDialog否系统打开文件对话框TSaveDialog否系统保存文件对话框TColorDialog否系统颜色对话框TFontDialog否系统字体对话框TPrintDialog否系统打印对话框TOpenPictureDialog否系统打开图片对话框TSavePictureDialog否系统保存图片对话框TSelectDirectoryDialog否系统打开目录对话框liblclTRichEdit是富文本框2.
0.
2版本后的liblcl(windows,linux,macOS[未完全])(自定义组件+第三方组件)TTrackBar是滑块条TImageList否icon图像列表管理,一般做图标列表组件TUpDown是上下调节的按钮TProgressBar是进度条TDateTimePicker是时间选择器TMonthCalendar是日历选择器TListView是高级列表框TTreeView是树形列表TStatusBar是状态条,底部的TToolBar是工具条,顶部的TPageControl是分页控件管理,类似于TabControlTTabSheet是分页控件(TPageControl的子控件,设计器中TPageControl右键就能添加)TControl是控件基类支持的组件列表31/152TActionList否动作管理器TToolButton是工具条按钮TPaintBox是绘图框TTimer否计时器组件TShape是形状TBevel是边TScrollBox是滚动框TScrollBar是滚动条TCheckListBox是复选列表框TGauge是自绘的一种进度条(自定义组件+第三方组件)TImageButton是四态图像控件(自定义组件)TFindDialog否查找对话框TReplaceDialog否替换对话框TPrinterSetupDialog否打印机设置对话框TPageSetupDialog否页面设置对话框windows、linuxTStringGrid是常规字符串表格TDrawGrid是可自定义绘制表格TValueListEditor是键值表格THeaderControl是眉页控件TLabeledEdit是标签编辑框TFlowPanel是流线性布局面板TCoolBar是酷我条支持的组件列表32/152***TTaskbar否windows任务栏新特性,这个已经不作组件用了,在pkgs包里有用纯go写的windows,win7+TMiniWebview是一个简单的浏览器组件,目的只在于嵌入显示,目前不打算做太多功能.
(自定义组件)windows(IE内核,默认为7.
0内核,可通过SetIEVersion方法修改内核版本,具体取决于目标计算机上所安装的IE版本)、linux(需要libwebkitgtk-1.
0.
so支持)、macOS(macOS自带的webkit内核)TComboBoxEx是一个TComboBox的增强TFrame是类似于TForm的一个容器TXButton是类似于颜色+图片按钮(自定义组件)TCheckGroup是复选框分组liblcl,2.
0.
3+TToggleBox是类似于复选框的东西liblcl,2.
0.
3+类类说明说明特定平台限制特定平台限制DelphiWikiDelphiWikiLazarusWikiLazarusWikiTIconico图标类TBitmapBMP图片类TMemoryStream内存流类TFont字体类TStrings字符管理类,虚拟TStringList字符管理类TBrush画刷类TPen画笔类TMenuItem菜单项目类TPicture图片类TTreeNodesTTreeView节点管理TTreeNodeTTreeView子项目类TScreen屏幕信息类TMouse鼠标信息类TListColumnsTListView列管理TListItemsTListView子项管理TListItemTListView子项目类TListColumnTListView列类TCollectionItem某此的基类TStatusPanels状态条面板管理类TStatusPanel状态条面板TCanvas画布类TObject基类TPngImagePng图片类TJPEGImageJPG图片类TGIFImageGIF图片类支持的组件列表33/152TIniFileIni文件操作类TRegistry注册表操作类TClipboard剪切板操作类TMonitor监视器类TList指针List,不需要使用TGraphic图形基类TComponent组件基类THeaderSection与HeaderControl有关的THeaderSections与HeaderControl有关的TBoundLabel与TLabeledEdit有关的TCoolBands与TCoolBar有关的TCoolBand与TCoolBar有关的TPrinter打印机操作类支持的组件列表34/152对于类指针问题需要说明下:TStringList.
AddObject//添加func(s*TStringList)AddObject(Sstring,AObjectIObject)int32TComboBox.
AddItem//添加func(c*TComboBox)AddItem(Itemstring,AObjectIObject)TListBox.
AddItem//添加func(l*TListBox)AddItem(Itemstring,AObjectIObject)获取//获取func(s*TStringList)Objects(Indexint32)*TObject比如一个ComBoBox在添加列表项目数据时,我将添加的这一项与某个值或对象做关联,此时就用上这种方法了.

cbb:=vcl.
NewComboBox(f)cbb.
SetParent(f)cbb.
Items().
AddItem("值1",vcl.
AsObject(120))cbb.
Items().
AddItem("值2",vcl.
AsObject(220))cbb.
Items().
AddItem("值3",vcl.
AsObject(220))//获取fmt.
Println(cbb.
Items().
Objects(0).
Instance())//120fmt.
Println(cbb.
Items().
Objects(1).
Instance())//220fmt.
Println(cbb.
Items().
Objects(2).
Instance())//320//上面关联的是一个整型值,传入cbb对象后不会被go的GC销毁,所以直接强制就可以了,相当于Delphi中TObject(120)的写法,属于变通做法.
/*伪造变通法:obj:=vcl.
AsObject(120)这里obj实际的实例是不存在的,只是为了应对类型转换做法,obj.
Instance()==120,这时类的实例地址为伪造的120cbb.
Items().
AddItem("fff",obj)这里传入对象后内部会调用CheckPtr将obj的Instance值(也就是120这个值)取出来传给cbb底层对象.
cbb.
Items().
Objects(0).
Instance()//此时取出来的值就是120*/如果传入go对象的指针是种危险的方式,所以要小心使用,不推荐用,要用的话也要防止被GC.

如果传入go对象的指针是种危险的方式,所以要小心使用,不推荐用,要用的话也要防止被GC.

typeTTest1struct{Val1stringVal2int}对象指针问题说明(重要)对象指针问题说明(重要)常见于位置常见于位置应用场景应用场景示例1常数类型值:示例1常数类型值:示例2指针类型值:示例2指针类型值:对象指针问题说明(重要)35/152cbb:=vcl.
NewComboBox(f)cbb.
SetParent(f)obj1:=&TTest1{"aaaaa",120}obj2:=&TTest1{"bbbbb",220}obj3:=TTest1{"ccccc",320}cbb.
Items().
AddItem("值1",vcl.
AsObject(unsafe.
Pointer(obj1)))cbb.
Items().
AddItem("值2",vcl.
AsObject(unsafe.
Pointer(obj2)))cbb.
Items().
AddItem("值3",vcl.
AsObject(unsafe.
Pointer(uintptr(&obj3))))//获取obj1:=(*TTest1)(cbb.
Items().
Objects(0).
UnsafeAddr())obj2:=(*TTest1)(cbb.
Items().
Objects(1).
UnsafeAddr())obj3:=(*TTest1)(cbb.
Items().
Objects(2).
UnsafeAddr())fmt.
Println(obj1)//aaaaa120fmt.
Println(obj2)//bbbbb220fmt.
Println(obj3)//ccccc320//上面关联的是一个指针,此时为了应对于go的GC销毁问题,在传入的时候使用AsXXXX这个函数,取值时使用UnsafeAddr.

//在go中如果不使用unsafe.
Pointer则很有可能会被GC释放掉,但也有内存泄露的危险.
具体看情况操作了.

对象指针问题说明(重要)36/152Lazarus中的所有可视的UI组件都非非线程或协程安全的.
所以在协程中操作UI组件都必须使用vcl.
ThreadSync来同步到主线程(UI线程)中执行.
否则会随机产生AV错误或者其他莫名的错误.
示例一gofunc(){vcl.
ThreadSync(func(){f.
Button.
SetCaption("Hello.
")fmt.
Println(f.
Button.
Caption())vcl.
ShowMessage("11111")})}()示例二gofunc(){//协程中进行http请求,resp,err:=http.
Get("https://github.
com")iferr!
=nil{return}deferresp.
Body.
Close()bs,err:=ioutil.
ReadAll(resp.
Body)iferr!
=nil{return}//整个操作完成后,显示到UI上时使用vcl.
ThreadSync切换到主线程中执行.
vcl.
ThreadSync(func(){f.
Memo1.
SetText(string(bs))}))()示例一gofunc(){//这样不定时的造成AV错误,也会内存泄漏f.
Button.
SetCaption("Hello.
")fmt.
Println(f.
Button.
Caption())}()示例二gofunc(){resp,err:=http.
Get("https://github.
com")iferr!
=nil{return}deferresp.
Body.
Close()bs,err:=ioutil.
ReadAll(resp.
Body)iferr!
=nil{return}//这样就会造成AV错误,而且不定时的,也会内存泄漏f.
Memo1.
SetText(string(bs)))()协程中操作UI组件(重要)协程中操作UI组件(重要)正确的操作方式正确的操作方式错误的操作方式错误的操作方式协程中操作UI组件(重要)37/152注:AV错误指的是协程中操作UI组件(重要)38/152这里主要是利用反射来关联事件,就可以简化相关代码.
On+组件名+事件,TForm特殊性,固定为名称为Form(TFrame的固定为Frame).
例如窗口建完后:func(f*TForm1)OnFormCreate(sendervcl.
IObject)又如按钮:func(f*TForm1)OnButton1Click(sendervcl.
IObject)首次会收集Form以On开头的事件方法,然后根据组件名称提取出事件的类型,再通过事件类型查找某个组件中的SetOn+eventType方法.
多个组件共享同一个事件:typeTMainFormstruct{*vcl.
TFormButton1*vcl.
TButtonButton2*vcl.
TButton`events:"OnButton1Click"`Button3*vcl.
TButton`events:"OnButton1Click,OnButton1Resize"`}//这样只自动关联了Button1的事件,但此时我想将此事件关联到Button2,Button3上//常规的做法就是Button2.
SetOnClick(f.
OnButton1Click)//现在提供一种新的方式,这种方式应对于res2go转换后不自动共享事件问题.

func(f*TMainForm)OnButton1Click(sendervcl.
IObject){}自动关联事件如果是一个无resource实例(纯代码创建的)构建的,则只能关联TForm跟TApplication.
原因是其他组件没有实例化.

自动关联事件自动关联事件事件命名规则:事件命名规则:原理:原理:注意注意自动关联事件39/152注:本插件与res2go命令行工具属于互斥产品,二选一既可注:本插件与res2go命令行工具属于互斥产品,二选一既可res2goLazarusIDE插件res2goLazarusIDE插件res2goLazarusIDE插件40/152MacOS下要注意的事项:MacOS下要注意的事项:一、Lazarus现在编译后的不会在原来的目录,而是会编译到~/.
lazarus/bin目录中,需要复制编译好的lazarus二进制替换原来/Library/Lazarus/目录中的.
二、因为MacOS一些特殊原因(环境变量问题),目前在IDE中只能设计,编译的话要在res2go选项中设置go的路径,如果用了GOPATH可能编译不通过.
res2goLazarusIDE插件41/152插件基于Lazarus2.
0.
10,如不能编译,请确认是否版本一致插件基于Lazarus2.
0.
10,如不能编译,请确认是否版本一致1、群文件或者github下载插件源码包https://github.
com/ying32/res2go-ide-plugin2、双击"res2goplugin.
lpk"文件3、点击"Use"后面的下拉箭头,选择"Install"4、此时弹出重编译Lazarus对话框,点击"Yes",等待编译完成.
5、新建一个Lazarus工程,进入"Project->ProjectOptions.
.
.
->ProjectOptions->res2go"res2goLazarusIDE插件42/1526、上面完成后,以后每次保存Lazarus项目则会生成对应的"go"文件.
保存分为2种:1、Save只会保存当前编辑器的,比如:lfm文件,pas文件.
2、SaveAll保存工程中所有已修改的,未修改的不会被保存,比如:lfm文件,pas文件,lpr文件.

注:1、如果未转换出对应的窗口,可能是原来的文件未被修改,所以不会有这个动作,只有被修改后才会成功转换,因为已经不再读取lfm文件进行注:1、如果未转换出对应的窗口,可能是原来的文件未被修改,所以不会有这个动作,只有被修改后才会成功转换,因为已经不再读取lfm文件进行转换了.
2、res2go设置界面的语言会根据IDE当前的语言选择,IDE设置的中文则显示中文,反之显示英文.

转换了.
2、res2go设置界面的语言会根据IDE当前的语言选择,IDE设置的中文则显示中文,反之显示英文.

res2goLazarusIDE插件43/1521、进入"Project->ProjectOptions.
.
.
->ProjectOptions"应用程序图标、Manifest修改,选择Application版本信息修改,选择VersionInfo利用LazarusIDE完成Windows可执行文件的图标、Manifest、版本信息修改(需要res2go插件利用LazarusIDE完成Windows可执行文件的图标、Manifest、版本信息修改(需要res2go插件1.
0.
4及以上版本),应用程序标题(),应用程序标题(1.
0.
7以上版本).
).
res2goLazarusIDE插件44/152以上修改后,下次以上修改后,下次SaveAll时会转换生成时会转换生成386及及amd64的资源的资源res2goLazarusIDE插件45/1521、进入"Project->ProjectOptions.
.
.
->ProjectOptions->Forms"利用LazarusIDE完成窗口顺序和指定某些窗口不在初始时创建利用LazarusIDE完成窗口顺序和指定某些窗口不在初始时创建res2goLazarusIDE插件46/152方法一、点击图中IDE工具栏按钮方法二、点击MenuBar->Run->Complie或者MenuBar->Run->Build等等(相应的快捷键也是生效的).
利用LazarusIDE完成Go的编译和运行.
利用LazarusIDE完成Go的编译和运行.
res2goLazarusIDE插件47/152方法一、点击图中IDE工具栏按钮下拉箭头,选择RunParamemters.
.
.
在Commandlineparamseters中填入参数.
方法二、点击MenuBar->Run->RunParamemters.
.
.
在Commandlineparamseters中填入参数.
运行时传入命令参数到目标运行时传入命令参数到目标res2goLazarusIDE插件48/152MenuBar->Project->ProjectOptions.
.
.
->CompilerOptions->ConfigandTarget选中Win32guiapplication,下次编译时就不会有命令行窗口了.
利用LazaursIDE完成Windows下移除可执行文件的控制台窗口.
利用LazaursIDE完成Windows下移除可执行文件的控制台窗口.
res2goLazarusIDE插件49/152MenuBar->Project->ProjectOptions.
.
.
->CompilerOptions->ConfigandTarget->Targetplatform,如果都为默认则使用当前Go的默认值,反之使用这里面的.
利用LazarusIDE完成利用LazarusIDE完成GOOS和和GOARCH修改.
修改.
res2goLazarusIDE插件50/152MenuBar->Project->ProjectOptions.
.
.
->CompilerOptions->Debugging.
利用LazarusIDE完成去除调试信息和符号利用LazarusIDE完成去除调试信息和符号res2goLazarusIDE插件51/152根据需求下载对应版本的LazarusIDE:注:在Windows下如果不需同时编译x86和x64的liblcl则不需要下载注:在Windows下如果不需同时编译x86和x64的liblcl则不需要下载Addons标识的.
标识的.
安装LazarusIDE安装LazarusIDE前往前往Lazarus官网下载页面Lazarus官网下载页面,下载对应版本的IDE:,下载对应版本的IDE:安装LazarusIDE52/152Windows根据自己的选择选择一个.
注:文件名带有根据自己的选择选择一个.
注:文件名带有cross的只是的只是Addons包,不是完整的IDE安装包,只做设计器用只需要下载不带包,不是完整的IDE安装包,只做设计器用只需要下载不带cross名称的.
名称的.
安装LazarusIDE53/152Linux根据自己的linux发布版本,选择对应的版本,我用LinuxMint19x64,所以我下载的根据自己的linux发布版本,选择对应的版本,我用LinuxMint19x64,所以我下载的LazarusLinuxamd64DEB(64Bits).
.
需要下载3个文件:安装顺序为fpc-laz->fpc-src->lazarusproject.
安装LazarusIDE54/152macOS注:macOS下应该总是选择注:macOS下应该总是选择LazarusmacOSx86-64(64Bits),原因是macOS10.
15开始不支持x86的了.
,原因是macOS10.
15开始不支持x86的了.
需要下载3个文件:安装顺序为fpc->fpc-src->lazarusIDE.
安装LazarusIDE55/152因为Lazarus2.
0.
10中的fpc自带有sparta中的泛型,造成与之冲突,所以官方没有合并且没有修改.

进入Lazarus安装目录,比如:F:\lazarus\components\sparta\mdi双击sparta_mdi.
lpk文件.
右键删除sparta_Generices包.
点击Compile测试是否正常编译.
编译正常则回到原来的使用Lazarus设计界面.
注:如原来几个安装包都安装了还是没有出现,则全部卸载三个插件编译再添加再编译.

注:如原来几个安装包都安装了还是没有出现,则全部卸载三个插件编译再添加再编译.

Lazarus2.
0.
10不能安装spata插件解决方法Lazarus2.
0.
10不能安装spata插件解决方法Lazarus2.
0.
10不能安装spata插件解决方法56/152注:Lazarus默认的IDE是分离式的,如果不喜欢这种风格可以通过重新编译来达到,适用于Lazarus2.
0.
8或之前的,Lazarus2.
0.
10后出现编译错误,原因为因为sparta_DockedFormEditor这个引起的,Lazarus官方的说明是合并冲突造成,所以2.
0.
10中就不要用这个了,或者参考Lazarus2.
0.
10不能安装spata插件解决方法中所示的方法解决这个问题,遇到这个错误要么完全卸载后重装,要么卸载sparta_DockedFormEditor插件后Cleanall再重编译.
方式为:进入Package菜单选择Install/UninstallPackages.
.
.
在Availableforinstallation中双击AnchorDockingAnchorDockingDsgnsparta_DockedFormEditor然后SaveandrebuildIDE.
注:如果是覆盖安装,需要先在Tools->Configure"BuildLazarus".
.
.
选中"Cleanall",然后"SaveSettings",再开始上面的步骤.
使用Lazarus设计界面使用Lazarus设计界面使用Lazarus设计界面57/152LazarusIDE区域说明使用Lazarus设计界面58/152TImageButton(四态图按钮控件)TGauge(图形进度条,支持几种样式)TLinkLabel(超链接标签)TRichEdit(富文本框)TXButton(主要是用颜色控制不同状态+背景图类的按钮)TMiniWebview(简易的浏览器组件)将GoVCL自定义组件安装到LazarusIDE中将GoVCL自定义组件安装到LazarusIDE中自定义组件列表:自定义组件列表:将GoVCL自定义组件安装到LazarusIDE中59/1521、安装LazarusIDE,可以参考安装Lazarus,如果已安装则可以跳过此步.
2、下载liblcl源代码.
3、根据liblcl源代码中的"编译引导"编译一次liblcl(如果你安装的64的Lazarus就编译64位的liblcl,如果是安装的32位的Lazarus就编译32位的liblcl,记得一定要编译一次liblcl(因为有个地方不想麻烦,所以才一定需要编译一次)记得一定要编译一次liblcl(因为有个地方不想麻烦,所以才一定需要编译一次),否则会无法安装).

4、在liblcl源码中找到mylazpkgs.
lpk这个文件,双击打开.
5、点击"Use->Install"6、此时弹出重编译Lazarus对话框,点击"Yes".
7、等待编译完成后,在LazarusIDE的组件选项卡中就会出现"GoVCL"选项卡.
以上正常安装完后,就可以直接将组件拖放设计了.
以上正常安装完后,就可以直接将组件拖放设计了.
将GoVCL自定义组件安装到LazarusIDE中60/152将GoVCL自定义组件安装到LazarusIDE中61/152一般情况下不推荐使用匿名函数传入,比如://不推荐使用这种方式.
button1.
SetOnClick(func(sendervcl.
IObject){})而应使用"结构"中的方法,如:button1.
SetOnClick(f.
OnButton1Click)func(f*TForm1)OnButton1Click(sendervcl.
IObject){}另外需要注意共享事件,如:另外需要注意共享事件,如:注:共享事件都会指向同一个函数,如需分清是哪个组件响应的,应该通过参数中的sender来确认或操作.
第一种情况button1.
SetOnClick(f.
OnButtonClick)button2.
SetOnClick(f.
OnButtonClick)func(f*TForm1)OnButtonClick(sendervcl.
IObject){//此时要操作对应的按钮应该是通过sender来操作btn:=vcl.
AsButton(sender).
.
.
.
}第二种情况有些人喜欢用匿名函数解决(当然这是不推荐的)就有了下面的情况:fori:=0;iTrue/PM取值参考:DPI相关DPI相关DPI相关73/152对象与对象之前的转换通过默认的函数As,如TButton的AsButton,TLabel的AsLabel等等.
.
.
.
如:func(f*TMainForm)OnButton1Click(sendervcl.
IObject){//已知sender实际为TButton类型//则使用TButton的转换btn:=vcl.
AsButton(sender)}两个对象的比较ifvcl.
EqualsObject(obj1,obj2){}对象的强制转换与比较对象的强制转换与比较对象的强制转换与比较74/152链接:https://github.
com/ying32/govcl/tree/master/samples所有例子都是在三个平台经过测试通过的(Windows10x64、LinuxMint19、macOS10.
13.
6)(有些有平台限制,具体参考samples中的README.
md).
所有govcl示例所有govcl示例所有govcl示例75/152组件的一些介绍,里面可以跳转到每个组件属性的详细介绍(往后面"Seealso"部分找到同名的进去看就是属性详细介绍)(英文)http://wiki.
freepascal.
org/LCL_ComponentsLCL组件属性详细介绍(英文)https://lazarus-ccr.
sourceforge.
io/docs/lcl/index.
html基本组件基本组件Lazarus-LCL组件WIKILazarus-LCL组件WIKI基本组件76/152常见属性(带Set的为设置,如:SetName("aaaa"),获取则为Name())属性名(前缀为Set表示设置,无Set则表示获取)属性名(前缀为Set表示设置,无Set则表示获取)属性的类型说明属性的类型说明说明说明Namestring控件名称,每个控件在同一个窗口(TForm)中独有的Captionstring标题,部分可视控件拥有Leftint32控件相对父容器Left边距离Topint32控件相对父容器Top边距离Widthint32控件自身宽度Heightint32控件自身高度AlignTAlign控件对齐试,大部分可视控件拥有Textstring部分文本编辑器控件拥有Visiblebool可视控件拥有的,控制控件的可视Enabledbool可视控件拥有,控制控件的启用/禁用状态Hintstring鼠标悬停提示,大部分可视控件拥有ShowHintstring控制是否显示提示Tagint一般无作用,算是一个userdata,随便放吧Owner*TComponent组件的所有者ComponentCountint32自身子组件总数Components[]*TComponent自身子组件遍历数组ClassNamestring控件类名Action*TAction有些控件拥有,用于关联一些事件属性(比如,一个按钮事件,一个菜单事件,一个ToolButton事件共用同一个Action)AnchorsTAnchors控件布局相关DoubleBufferedbool使用双缓冲机制绘制,一般只有TWinControl拥有ParentFontbool使用父容器字体设ParentShowHintbool使用父容器属性控提示显示PopupMenu*TPopupMenu控件弹出菜单,关联后,鼠标右键自动弹出TabOrderint16控件Tab按键顺序TabStopbool是否响应控件的Tab顺序停留WordWrapbool文字自动折行处理ControlCountint32控件总数,只有TWinControl控件有此属性Controls[]*TControl子控件数组,TWinControl才有此属性HandleHWND控件句柄,TWinControlParentWindowHWND父窗口句柄BoundsRectTRect边界矩形ClientRectTRect客户区矩形Parent*TControl设置此控件的Parent,用于指定此控件显示在哪个父容器之上常见属性常见属性基本组件77/152CursorTCursor控件光标样式,可见types中的光标常量Canvas*TCanvas画布Font*TFont字体相关设置KeyPreviewboolTForm独有,一般用于全局优先在TForm中捕获相关键盘事件Icon*TIconico设计,一般像Application,TForm,TTrayIcon有,也有其它组件有ModalResultTModalResult应用场景,比如使用ShowModal窗口后,将对应按钮设计相关的Modal后,窗口关闭后可接收相关结果值.
如自定义一个MessageBox,有yes,no和close三种,分别设置后可连相关代码都不需要写.
基本组件78/152事件(如OnClick调用时使用SetOnClick),有些事件在事件(如OnClick调用时使用SetOnClick),有些事件在LCL下是不生效的LCL下是不生效的事件说明事件说明OnClick鼠标左键单击事件,大部分可视控件拥有OnEnter焦点进入控件OnExit焦点退出控件OnKeyDown控件响应键盘按键按下OnKeyUp控件响应键盘按键抬起OnMouseDown控件响应鼠标按下OnMouseEnter鼠标进入控件OnMouseLeave鼠标退出控件OnMouseMove鼠标在控件移动事件OnMouseUp鼠标抬起事件OnClose某个窗口关闭事件,视情况,一般TForm用的多OnCloseQueryTForm关闭时处理,优先于TForm的OnCloseOnDblClick控件的双击事件OnHide控件隐藏时事件OnShow控件显示时事件OnPaint控件绘制事件,一般在这里使用Canvas绘制自己的OnResize控件大小发生变化OnExecute常用于TAction的执行事件OnUpdate常用于TAction的更新事件OnCreate窗口创建完成事件OnDestroy窗口的析构事件OnDropFiles窗口文件拖放OnConstrainedResize窗口或者控件大小约束OnContextPopup上下文件弹出事件OnDragOver拖放完成OnDragDrop拖放下落OnStartDrag开始拖放OnEndDrag结束拖放OnDockDrop停靠下落OnDockOver停靠完成OnUnDock解除停靠OnStartDock开始停靠OnMouseWheel鼠标中键滚动OnGetSiteInfo停靠信息获取OnMouseWheelUp鼠标中键抬起OnMouseWheelDown鼠标中键按下OnWndProc窗口消息循环,类似于OnMessage,但可以跨平台,相关消息定义位于types/messages包常见事件常见事件基本组件79/152OnAlignPosition当子控件的Align设置为types.
AlCustom时,会触发父容器的OnAlignPosition事件,在里面可以自定义一些位置基本组件80/152方法名方法名说明说明仅限控件仅限控件平台限制平台限制Hide隐藏控件是Show显示控件是ToString输出控件信息,取决于这个控件FindComponent通过组件名查询自身子组件HasParentbool是否有父类Free释放此组件Invalidate要求重新绘制是Repaint要求重绘是Realign重新对齐是BringToFront调整控件顺序到最前是Perform向控件发送一个wm消息是Refresh要求重新刷新控件是SendToBack调整控件顺序到最后是Assign复制一个对象,视情况,有些并没有实现此方法Equals同另一个对象比较GetHashCodeHashCodeLoadFromStream从流加载SaveToStream保存到流LoadFromResourceName从资源中通过资源名加载WindowsLoadFromResourceID从资源中通过资源id加载WindowsLoadFromFile从文件加载SaveToFile保存到文件常见方法常见方法基本组件81/152说明说明举列举列New(className)新建一个对象NewForm,新建一个TForm对象As(className)新建一个XXX对象来自已存在的实例Form:=AsForm(obj.
Instance())或者AsForm(obj)Free释放对象obj.
Free()Instance对象实例指针obj.
Instance()IsValid对象实例指针是否有效obj.
IsValid()Is判断对象继承自obj.
Is().
Control()对象默认方法对象默认方法基本组件82/152基类接口IObject所有可视/非可视组件类接口IComponent所有可视控件类接口IControl所有容器控件类接口IWinControlIObjectIComponentIControlIWinControlTFormgo中组件对象继承go中组件对象继承基本组件83/152Windows的窗口Close关闭窗口Hide隐藏窗口Print调用打印机,并将当前窗口绘制到打印机画布上SetFocus设置焦点Show显示窗口ShowModal以模态形式显示窗口CanFoucs是否可以获取焦点Focused是否已获得焦点Invalidate使区域无效Realign重新对齐Repaint重绘要求ScaleBy缩放SetBounds设置位置及大小Update更新BringToFront控件前置HasParent是否有父容器Perform发送一个消息Refresh刷新界面SendToBack控件置后FindComponent根据名称查找当前子组件对象GetNamePathAssign复制对象,具体要看此对象有没有实现此方法ClassName获取对象类名Equals比较对象Align对齐SetAlign设置对齐AlphaBlend是否已启用透明混合SetAlphaBlend启用透明混合AlphaBlendValue当前透明混合值SetAlphaBlendValue设置透明混合值AutoSize是否已自动大小SetAutoSize设置自动大小BorderIcons标题栏图标SetBorderIcons设置标题栏按钮(最大化,小最化,关闭,等等)BorderWidth边框宽度SetBorderWidth设置边框宽度Caption窗口标题SetCaption设置窗口标题ClientHeight窗口客户区高,不含边框,标题栏,菜单栏大小SetClientHeight设置窗口区高ClientWidth窗口客户区宽SetClientWidth设置窗口客户区宽Color背景颜色SetColor设置背景颜色TransparentColor透明颜色SetTransparentColor设置透明颜色TransparentColorValue透明颜色值SetTransparentColorValue设置透明颜色值DoubleBuffered双缓冲机制组件组件TFormTForm基本组件84/152SetDoubleBuffered设置双缓冲机制Enabled窗口启用SetEnabled设置窗口启用ParentFontSetParentFont是否使用父容器字体FontSetFont字体管理对象FormStyleSetFormStyle设置窗口边框样式HeightSetHeight窗口高度,含边框跟标题栏之类的IconSetIcon标题栏图标管理对象KeyPreviewSetKeyPreview全局窗口优先处理键盘事件MenuSetMenu窗口主菜单PopupMenuSetPopupMenu弹出菜单PositionSetPosition窗口位置设置或获取ShowHintSetShowHint设置显示鼠标悬停提示VisibleSetVisible获取或者设置窗口可视WidthSetWidth获取或者设置窗口宽度,含边框,标题栏AllowDropFilesSetAllowDropFiles获取或设置窗口是否接受文件拖放OnDropFiles为响应事件基本组件85/152Lazarus中管理窗口程序的类实例.
Application由Lazarus在单元initialization和finalization时自动构造和析构.

常用方法:Initialize初始始应用程序相关设置,必要写的vcl.
Application.
Initialize()Run开始整个程序的消息循环,直到收到WM_QUIT或者主窗口收到WM_CLOSE退出循环,并结束程序vcl.
Application.
Run()RunApp一个简化的函数.
vcl.
RunApp(&form1,&from2)CreateForm创建并返回一个新的TGoForm实例//TApplication.
CreateForm一般不建议使用NewForm,而优先使用CreateForm或者使用对应的NewXXX(),如NewForm1()用法一-//直接返回,不推荐使用//mainForm:=vcl.
Application.
CreateForm()mainForm:=vcl.
Application.
CreateForm()mainForm.
SetOnClick(func(sendervcl.
IObject){vcl.
ShowMessage("msg")})用法二-//无资源加载,只会绑定窗口的事件,不会绑定子组件事件//vcl.
Application.
CreateForm(&mainForm)typeTMainFormstruct{*vcl.
TForm}varmainForm*TMainFormvcl.
Application.
CreateForm(&mainForm)func(f*TMainForm)OnFormCreate(sendervcl.
IObject){fmt.
Println("FormCreate")}func(f*TMainForm)OnFormClick(sendervcl.
IObject){vcl.
ShowMessage("click")}用法三-//无资源加载时在OnFormCreate//vcl.
Application.
CreateForm(&mainForm)typeTMainFormstruct{*vcl.
TFormBtn1*vcl.
TButton}实例类实例类ApplicationApplication实例类86/152varmainForm*TMainFormvcl.
Application.
CreateForm(&mainForm)func(f*TMainForm)OnFormCreate(sendervcl.
IObject){fmt.
Println("FormCreate")f.
Btn1=vcl.
NewButton(f)f.
Btn1.
SetParent(f)f.
Btn1.
SetOnClick(f.
OnBtn1Click)}func(f*TMainForm)OnFormClick(sendervcl.
IObject){vcl.
ShowMessage("click")}func(f*TMainForm)OnBtn1Click(Sendervcl.
IObject){vcl.
ShowMessage("Btn1Click")}用法四-//从资源文件中填充子组件,并绑定所有事件//不推荐使用了用法五-//从字节中填充子组件,并绑定所有事件//不推荐使用了MainFormOnTaskbar、SetMainFormOnTaskbar获取或者设置主窗口是否显示在任务栏上,一般默认写Truefmt.
Println(vcl.
Application.
MainFormOnTaskbar())vcl.
Application.
SetMainFormOnTaskbar(true)ProcessMessages处理消息,当某主线程中发生阻止时会造成整个消息循环阻止,UI无响应,所以在阻止中,比如循环中加上ProcessMessages可解决UI无响应问题.
vcl.
Application.
ProcessMessages()Terminate结束应用程序,发出WM_QUIT消息vcl.
Application.
Terminate()ExeName获取当前运行的应用程序文件名,含路径fmt.
Println(vcl.
Application.
ExeName())Icon,SetIcon获取或者设置应用程序的图标,一般默认会在程序资源中找名为MAINICON的ico资源作为应用程序图标.

//手动指定ico:=vcl.
NewIcon()deferico.
Free()//LoadFromResourceID(rtl.
MainInstance(),3)//3为资源中的id,具体要根据自己生成的.
syso文件中定义的idico.
LoadFromFile("xxx.
ico")vcl.
Application.
SetIcon(ico)//或者vcl.
Application.
Icon().
SetHandle(win.
LoadIcon(rtl.
MainInstance(),3))//又或vcl.
Application.
Icon().
SetHandle(win.
LoadIcon2(rtl.
MainInstance(),"MAINICON"))//双或实例类87/152vcl.
Application.
Icon().
LoadFromFile("ico.
ico")Title,SetTitle获取或者设置应用程序标题fmt.
Println(vcl.
Application.
Title())vcl.
Application.
SetTitle("我是标题")SetScaled,暂时废弃有关dpi的绽放vcl.
Application.
SetScaled(true)SetIconResId,不推荐使用设置App全局icon.
从资源中加载,具体看rsrc后的id,仅windowsvcl.
Application.
SetIconResId(3)ScaleForCurrentDpi//用于使用纯代码创建的窗口缩放,所有组件创建完后调用F.
ScaleForCurrentDpi()实例类88/152与屏幕相关的API.
Screen由Lazarus在单元initialization和finalization时自动构造和析构.

常用方法:以像素为单位以像素为单位Width当前屏幕宽度fmt.
Println(vcl.
Screen.
Width())Height当前屏幕高度fmt.
Println(vcl.
Screen.
Height())MonitorCount监视器总数,多显示器情况fmt.
Println(vcl.
Screen.
MonitorCount())Monitors获取指定索引监视器fmt.
Println(vcl.
Screen.
Monitors(0))FormCount获当前app的Form总数fmt.
Println(vcl.
Screen.
FormCount())Forms获当前app的Form索引fmt.
Println(vcl.
Screen.
Forms(0))桌面相关api,包含任务栏桌面相关api,包含任务栏DesktopHeight桌面高度fmt.
Println(vcl.
Screen.
DesktopHeight())DesktopLeft桌面左边位置fmt.
Println(vcl.
Screen.
DesktopLeft())DesktopTop桌面顶边位置fmt.
Println(vcl.
Screen.
DesktopTop())DesktopWidth桌面的宽度ScreenScreen实例类89/152fmt.
Println(vcl.
Screen.
DesktopWidth())工作区域,不包含任务栏工作区域,不包含任务栏WorkAreaHeight工作区域高度fmt.
Println(vcl.
Screen.
WorkAreaHeight())WorkAreaLeft工作区域位置fmt.
Println(vcl.
Screen.
WorkAreaLeft())WorkAreaTop工作区域顶边位置fmt.
Println(vcl.
Screen.
WorkAreaTop())WorkAreaWidth工作区域的宽度fmt.
Println(vcl.
Screen.
WorkAreaWidth())Fonts获取当前系统字体列表fonts:=vcl.
Screen.
Fonts()fori:=0;i/msrdp.
这里演示的包名为msrdp.
2、在msrdp目录下新建一个init.
go文件,并写入:packagemsrdpimport"github.
com/ying32/govcl/vcl"//初始funcinit(){vcl.
RegisterExtEventCallback(eventCallback)}3、在msrdp目录下新建一个callback.
go文件,并写入:packagemsrdpimport"github.
com/ying32/govcl/vcl"//要注册的事件回调funceventCallback(fninterface{},getValfunc(idxint)uintptr)bool{switchfn.
(type){caseTMsRdpClient9NotSafeForScriptingOnDisconnected:fn.
(TMsRdpClient9NotSafeForScriptingOnDisconnected)(vcl.
ObjectFromInst(getVal(0)),int32(getVal(1)))default:}returnfalse}4、在msrdp目录下新建一个importdef.
go文件,并写入:packagemsrdpimport"github.
com/ying32/govcl/vcl/api"//默认var(libvcl=api.
GetLibVcl()addEventToMap=api.
GetaddEventToMapFn())5、在msrdp目录下新建一个events.
go文件,并写入(根据实际需求,如果没有事件也可不写):packagemsrdpimport(.
"github.
com/ying32/govcl/vcl")typeTMsRdpClient9NotSafeForScriptingOnDisconnectedfunc(senderIObject,discReasonint32)6、导入你自己的方法,如:importAuto.
gopackagemsrdpvar(//TMsRdpClient9NotSafeForScriptingmsRdpClient9NotSafeForScripting_Create=libvcl.
NewProc("MsRdpClient9NotSafeForScripting_Create")msRdpClient9NotSafeForScripting_Free=libvcl.
NewProc("MsRdpClient9NotSafeForScripting_Free")FAQ96/152msRdpClient9NotSafeForScripting_SetBounds=libvcl.
NewProc("MsRdpClient9NotSafeForScripting_SetBounds")msRdpClient9NotSafeForScripting_CanFocus=libvcl.
NewProc("MsRdpClient9NotSafeForScripting_CanFocus")msRdpClient9NotSafeForScripting_ContainsControl=libvcl.
NewProc("MsRdpClient9NotSafeForScripting_ContainsControl")msRdpClient9NotSafeForScripting_ControlAtPos=libvcl.
NewProc("MsRdpClient9NotSafeForScripting_ControlAtPos")msRdpClient9NotSafeForScripting_DisableAlign=libvcl.
NewProc("MsRdpClient9NotSafeForScripting_DisableAlign")//.
.
.
.
.
//.
.
.
.
.
)7、编写导入的实现方法,如:importFuncsAuto.
gopackagemsrdpimport("unsafe".
"github.
com/ying32/govcl/vcl/types".
"github.
com/ying32/govcl/vcl/api")TMsRdpClient9NotSafeForScriptingfuncMsRdpClient9NotSafeForScripting_Create(objuintptr)uintptr{ret,msRdpClient9NotSafeForScripting_Create.
Call(obj)returnret}funcMsRdpClient9NotSafeForScripting_Free(objuintptr){msRdpClient9NotSafeForScripting_Free.
Call(obj)}funcMsRdpClient9NotSafeForScripting_SetBounds(objuintptr,ALeftint32,ATopint32,AWidthint32,AHeightint32){msRdpClient9NotSafeForScripting_SetBounds.
Call(obj,uintptr(ALeft),uintptr(ATop),uintptr(AWidth),uintptr(AHeight))}funcMsRdpClient9NotSafeForScripting_CanFocus(objuintptr)bool{ret,msRdpClient9NotSafeForScripting_CanFocus.
Call(obj)returnDBoolToGoBool(ret)}funcMsRdpClient9NotSafeForScripting_ContainsControl(objuintptr,Controluintptr)bool{ret,msRdpClient9NotSafeForScripting_ContainsControl.
Call(obj,Control)returnDBoolToGoBool(ret)}funcMsRdpClient9NotSafeForScripting_ControlAtPos(objuintptr,PosTPoint,AllowDisabledbool,AllowWinControlsbool,AllLevelsbool)uintptr{ret,msRdpClient9NotSafeForScripting_ControlAtPos.
Call(obj,uintptr(unsafe.
Pointer(&Pos)),GoBoolToDBool(AllowDisabled),GoBoolToDBool(AllowWinCoreturnret}8、生成一个伪类,如:msrdpclient9notsafeforscripting.
gopackagemsrdpimport(.
"github.
com/ying32/govcl/vcl/types".
"github.
com/ying32/govcl/vcl""unsafe")typeTMsRdpClient9NotSafeForScriptingstruct{IWinControlinstanceuintptrptrunsafe.
Pointer}FAQ97/152funcNewMsRdpClient9NotSafeForScripting(ownerIComponent)*TMsRdpClient9NotSafeForScripting{m:=new(TMsRdpClient9NotSafeForScripting)m.
instance=MsRdpClient9NotSafeForScripting_Create(CheckPtr(owner))m.
ptr=unsafe.
Pointer(m.
instance)returnm}funcMsRdpClient9NotSafeForScriptingFromInst(instuintptr)*TMsRdpClient9NotSafeForScripting{m:=new(TMsRdpClient9NotSafeForScripting)m.
instance=instm.
ptr=unsafe.
Pointer(inst)returnm}funcMsRdpClient9NotSafeForScriptingFromObj(objIObject)*TMsRdpClient9NotSafeForScripting{m:=new(TMsRdpClient9NotSafeForScripting)m.
instance=CheckPtr(obj)m.
ptr=unsafe.
Pointer(m.
instance)returnm}funcMsRdpClient9NotSafeForScriptingFromUnsafePointer(ptrunsafe.
Pointer)*TMsRdpClient9NotSafeForScripting{m:=new(TMsRdpClient9NotSafeForScripting)m.
instance=uintptr(ptr)m.
ptr=ptrreturnm}func(m*TMsRdpClient9NotSafeForScripting)Free(){ifm.
instance!
=0{MsRdpClient9NotSafeForScripting_Free(m.
instance)m.
instance=0m.
ptr=unsafe.
Pointer(uintptr(0))}}func(m*TMsRdpClient9NotSafeForScripting)Instance()uintptr{returnm.
instance}func(m*TMsRdpClient9NotSafeForScripting)UnsafeAddr()unsafe.
Pointer{returnm.
ptr}func(m*TMsRdpClient9NotSafeForScripting)IsValid()bool{returnm.
instance!
=0}funcTMsRdpClient9NotSafeForScriptingClass()TClass{returnMsRdpClient9NotSafeForScripting_StaticClassType()}func(m*TMsRdpClient9NotSafeForScripting)SetBounds(ALeftint32,ATopint32,AWidthint32,AHeightint32){MsRdpClient9NotSafeForScripting_SetBounds(m.
instance,ALeft,ATop,AWidth,AHeight)}func(m*TMsRdpClient9NotSafeForScripting)CanFocus()bool{returnMsRdpClient9NotSafeForScripting_CanFocus(m.
instance)}func(m*TMsRdpClient9NotSafeForScripting)ContainsControl(ControlIControl)bool{returnMsRdpClient9NotSafeForScripting_ContainsControl(m.
instance,CheckPtr(Control))}func(m*TMsRdpClient9NotSafeForScripting)ControlAtPos(PosTPoint,AllowDisabledbool,AllowWinControlsbool,AllLevelsbool)*TControl{returnControlFromInst(MsRdpClient9NotSafeForScripting_ControlAtPos(m.
instance,Pos,AllowDisabled,AllowWinControls,AllLevels))}func(m*TMsRdpClient9NotSafeForScripting)DisableAlign(){MsRdpClient9NotSafeForScripting_DisableAlign(m.
instance)}FAQ98/152func(m*TMsRdpClient9NotSafeForScripting)EnableAlign(){MsRdpClient9NotSafeForScripting_EnableAlign(m.
instance)}func(m*TMsRdpClient9NotSafeForScripting)FindChildControl(ControlNamestring)*TControl{returnControlFromInst(MsRdpClient9NotSafeForScripting_FindChildControl(m.
instance,ControlName))}func(m*TMsRdpClient9NotSafeForScripting)FlipChildren(AllLevelsbool){MsRdpClient9NotSafeForScripting_FlipChildren(m.
instance,AllLevels)}func(m*TMsRdpClient9NotSafeForScripting)Focused()bool{returnMsRdpClient9NotSafeForScripting_Focused(m.
instance)}func(m*TMsRdpClient9NotSafeForScripting)HandleAllocated()bool{returnMsRdpClient9NotSafeForScripting_HandleAllocated(m.
instance)}func(m*TMsRdpClient9NotSafeForScripting)InsertControl(AControlIControl){MsRdpClient9NotSafeForScripting_InsertControl(m.
instance,CheckPtr(AControl))}func(m*TMsRdpClient9NotSafeForScripting)Invalidate(){MsRdpClient9NotSafeForScripting_Invalidate(m.
instance)}func(m*TMsRdpClient9NotSafeForScripting)PaintTo(DCHDC,Xint32,Yint32){MsRdpClient9NotSafeForScripting_PaintTo(m.
instance,DC,X,Y)}func(m*TMsRdpClient9NotSafeForScripting)RemoveControl(AControlIControl){MsRdpClient9NotSafeForScripting_RemoveControl(m.
instance,CheckPtr(AControl))}func(m*TMsRdpClient9NotSafeForScripting)Realign(){MsRdpClient9NotSafeForScripting_Realign(m.
instance)}//.
.
.
//.
.
.
pascal代码部分pascal代码部分FAQ99/152注:libvcl导出函数调用约定为注:libvcl导出函数调用约定为stdcall,而liblcl中则为,而liblcl中则为extdecl,,extdecl实际为一个宏定义,当为Windows时使用实际为一个宏定义,当为Windows时使用stdcall当为Linux或者macOS当为Linux或者macOS时使用时使用cdecl.
.
pascal部分一共有5个默认的inc文件,以UserDefine开头,分别为:UserDefineComponents.
inc包含你的组件inc文件,比如:MsRdpClient9NotSafeForScripting.
inc//在这里引入你的组件inc文件.
//比如://{$IMsRdpClient9NotSafeForScripting.
inc}//.
.
.
//.
.
.
{$IMsRdpClient9NotSafeForScripting.
inc}UserDefineComponentsClass.
inc提供给设计器寻找类使用.
//在这里引入你的组件资源构建时的类的inc文件.
//AddComponentClass(TButton);//AddComponentClass(TEdit);//.
.
.
//.
.
.
AddComponentClass(TMsRdpClient9NotSafeForScripting);UserDefineComponentUses.
inc你的组件引用了哪些单元//在这里引入你的组件uses单元名inc文件,就是说你使用那个组件需要use哪个单元.

//比如://Forms,//Buttons,//.
.
.
MSTSCLib_TLB,UserDefineEventsDeclaration.
inc你的事件申明部分inc文件.
//在这里引入你的你的事件申明inc文件.
//比如://{$IMsRdpClient9NotSafeForScriptingEventsImplement.
inc}//.
.
.
//.
.
.
//那么MsRdpClient9NotSafeForScriptingEventsImplement.
inc里面是些啥呢//就是下面这类东西//////classprocedureUpDownOnClick(Sender:TObject;Button:TUDBtnType);//{$IMyEventsDeclaration.
inc}UserDefineEventsImplement.
inc你的事件实现部分inc文件.
//在这里引入你的你的事件实现部分的inc文件.
//比如://{$IMsRdpClient9NotSafeForScriptingEventsDeclaration.
inc}//.
.
.
//.
.
.
//那么MsRdpClient9NotSafeForScriptingEventsImplement.
inc里面是些啥呢//就是下面这类东西//classprocedureTEventClass.
UpDownOnClick(Sender:TObject;Button:TUDBtnType);//begin//SendEvent(Sender,@TEventClass.
UpDownOnClick,[Sender,Ord(Button)]);FAQ100/152//end;////{$IMyEventsImplement.
inc}额外的两个事件定义文件(如果你使用了事件功能,就可以按以下来写):MyEventsDeclaration.
inc事件明声部分//TMsRdpClient9NotSafeForScriptingOnDisconnectedclassprocedureOnDisconnected(ASender:TObject;discReason:Integer);MyEventsImplement.
inc事件实现部分//TMsRdpClient9NotSafeForScriptingOnDisconnectedclassprocedureTEventClass.
OnDisconnected(ASender:TObject;discReason:Integer);beginSendEvent(ASender,@TEventClass.
OnDisconnected,[ASender,discReason]);end;FAQ101/152导出函数,如:MsRdpClient9NotSafeForScripting.
incfunctionMsRdpClient9NotSafeForScripting_Create(AOwner:TComponent):TMsRdpClient9NotSafeForScripting;stdcall;beginResult:=TMsRdpClient9NotSafeForScripting.
Create(AOwner);end;procedureMsRdpClient9NotSafeForScripting_Free(AObj:TMsRdpClient9NotSafeForScripting);stdcall;beginAObj.
Free;end;procedureMsRdpClient9NotSafeForScripting_SetBounds(AObj:TMsRdpClient9NotSafeForScripting;ALeft:Integer;ATop:Integer;AWidth:Integer;AHeight:IntegerbeginAObj.
SetBounds(ALeft,ATop,AWidth,AHeight);end;functionMsRdpClient9NotSafeForScripting_CanFocus(AObj:TMsRdpClient9NotSafeForScripting):LongBool;stdcall;beginResult:=AObj.
CanFocus;end;//.
.
.
.
//.
.
.
exportsMsRdpClient9NotSafeForScripting_Create,MsRdpClient9NotSafeForScripting_Free,MsRdpClient9NotSafeForScripting_SetBounds,MsRdpClient9NotSafeForScripting_CanFocus,MsRdpClient9NotSafeForScripting_ContainsControl,MsRdpClient9NotSafeForScripting_ControlAtPos,MsRdpClient9NotSafeForScripting_DisableAlign,MsRdpClient9NotSafeForScripting_EnableAlign,MsRdpClient9NotSafeForScripting_FindChildControl,MsRdpClient9NotSafeForScripting_FlipChildren,MsRdpClient9NotSafeForScripting_Focused,//.
.
.
//.
.
.
以上处理好后将所有inc文件或者pas目录复制到libvcl/liblcl目录下,然后重新编译libvcl/liblcl即可.

以上处理好后将所有inc文件或者pas目录复制到libvcl/liblcl目录下,然后重新编译libvcl/liblcl即可.

FAQ102/152请参考项目中的说明:https://github.
com/ying32/liblcl自行编译liblcl自行编译liblclFAQ103/152govcl是使用的系统原生界面,样式跟随系统而定.
有些朋友可能想实现DirectUI相关的,很遗憾,没有.

如果是在Windows上有可能是你没有使用manifest文件,默认就是windows经典样式,当然就难看了.

这里给出几种解决方法吧:1、Windows上可以调用winapi自绘,或者可以尝试第三方的外挂式皮库Skin++、SkinMagic、USkin、SkinSharp.
2、放弃此UI库,换个吧.
关于界面美化问题关于界面美化问题FAQ104/152可在任意一平台进行开发,当要发布对应平台时需要到目标平台进行编译.

因为linux与macOS下用到了cgo,所以需要到目标平台进行编译(windows平台除外,可以在linux或者macOS下编译出windows应用).

跨平台编译问题跨平台编译问题FAQ105/152这里的说明仅针对Windows上的使用,其它操作系统不影响.
liblcl则使用UTF-8编码.
在win包中定义了GoStr,CStr作为转化,根据情况在调用WindowsAPI时适时使用.
liblcl字符编码liblcl字符编码FAQ106/152这个问题一般开启对应控件的双缓冲机制即可.
单个ListView开启ListView.
SetDoubleBuffered(true)//仅仅只当前开启的ListView有效.
开启当前窗口全局双缓冲MainForm.
SetDoubleBuffered(true)//此时所有控件都将使用双缓冲机制.
ListView等控件操作时闪烁问题ListView等控件操作时闪烁问题FAQ107/152-s:去掉符号信息.
-w:去掉DWARF调试信息.
gobuild-i-ldflags="-s-w"此操作大约可以减少50%左右的,但用一此操作大约可以减少50%左右的,但用一-s参数后会造成原来的错误之类的信息无法具体化参数后会造成原来的错误之类的信息无法具体化减小go编译出的可执行文件大小减小go编译出的可执行文件大小FAQ108/152旧版GoVCL设计器早就停止更新了,新版的也放弃开发了,取而代之的为res2goIDE插件.
关于GoVCLDesigner关于GoVCLDesignerFAQ109/152gfm文件格式目前分为2种1、早期的为自定义加密的格式(目前已经废弃),res2go已经删除此选项.

2、为原Lazarus的二进制资源格式,res2go默认输出格式.
1、如果是使用Lazarus设计器+res2go生成的,且不强制指定从文件加载gfm文件,则没啥用.

2、提供给GoVCL专用设计器的二次编辑文件,即gfm格式.
govcl2.
0.
5版本源码中的res2go提供了一个隐藏功能:govcl2.
0.
5版本源码中的res2go提供了一个隐藏功能:2.
0.
5版本中需要修改下res2go的源码,如下图,改为这样:2.
0.
5版本中需要修改下res2go的源码,如下图,改为这样:res2go-tolfm#将当前目录下的gfm文件全部转为lfm文件1、用文本编辑器打开lfm文件,将第一个object关键字开始到第二个object关键字之前的内容全部删除,如下图,删除红框中的:gfm文件格式gfm文件格式文件格式文件格式文件作用文件作用将gfm文件还原为lfm文件将gfm文件还原为lfm文件如何提取原来lfm中的组件到设计器中如何提取原来lfm中的组件到设计器中FAQ110/1522、删除lfm文件中最后一个end关键字,如下图:3、检查下首尾有没有空行,如果有需要删除掉,保证这个文件中没有空行,如下图:4、Ctrl+A全选内容,Ctrl+C复制内容,然后回到Lazarus设计器中,新建一个空白的窗口,单击空白窗口,让窗口获得焦点,然后Ctrl+V粘贴,此时因为有可能用GoVCLIDE生成的gfm文件中有些组件在LazarusIDE中是没有的,所以选择Continueloading,如下图:FAQ111/1525、完成后如需要调整窗口的属性,可以参考之前删除掉的那段设置下新窗口的属性.

FAQ112/152vcl包含Lazarus标准组件中的大部分i18n一个简单的多国语言扩展包apiDLL函数申明与重新包装,一般情况下尽量不要去直接调用api内的函数.
memorydllWindows下的32bit内存dll加载包.
rtl包含Lazarus中Set类型操作、内存操作等其它函数version包含一个跨平台的系统版本信息获取.
bitmapGo的image与LCLimage对象相互转换.
locales本地化库中的默认资源包.
zh_CN默认的中文资源包.
packagepackage包说明包说明package113/152win包含windows下的常量、函数、类型定义errcode包含windows下GetLastError返回的错误代码含义package114/152types包含类型定义、枚举定义、常量colors颜色定义keys虚拟键定义messages窗口消息常量定义package115/152pkgs扩展包macappMacOS下app打包工具libname自定义加载动态连接库skinhskinsharp皮肤扩展接口winappres包含了一个默认的syso文件wke一个简单的wke浏览器封封装,只支持windows32bitminiblink一个miniblink浏览器组件的包装(有些还有问题)package116/152windows下独有的:windows下独有的:IsWow64判断当前进程是否运行在64上fmt.
Println(win.
IsWow64())winwinWindefWindefpackage117/152IsWow64Process检测进程是否运行在64位下ifwin.
IsWow64Process(win.
GetCurrentProcess()){}package118/152GetCurrentProcess返回当前进程伪句柄fmt.
Println(win.
GetCurrentProcess())package119/152GetSelfModuleHandle获取自身模块实例句柄fmt.
Println(win.
GetSelfModuleHandle())package120/152GetModuleHandleW获取指定模块句柄,只有模块加载后才能获取到fmt.
Println(win.
GetModuleHandleW("xxx.
dll"))package121/152LoadIconW从实例资源中加载iconfmt.
Println(win.
LoadIconW(win.
GetSelfModuleHandle(),1))package122/152MessageBoxW消息框,第三个参数值参见win包中的const.
go中MessageBoxs标识win.
MessageBoxW(0,"text","caption",0)package123/152GetClientRect获取指定窗口句柄的客户区矩形r:=win.
GetClientRect(hWnd)ResourceToBytes查找指定实例中指定名称、指定类型资源,并返回资源字节OpenInExplorer在资源管理器中定位文件RunAsAdministrator以管理员权限运行一个程序IsAdministrator判断当前进程是否以Administrator权限运行中package124/152Move内存操作,相当于c中的memcpyMainInstanceExe自身实例,比如在获取资源中的数据时就需要用到,限windowswin.
LoadIconW(rtl.
MainInstance(),1)TextToShortCut将字符串转为ShortCut类型rtl.
TextToShortCut("Ctrl+A")ShortCutToText将ShortCut类型转为字符串SysOpen打开,windows下调用ShellExecute//windowsrtl.
SysOpen("http://www.
xxx.
com")rtl.
SysOpen("c:\")rtl.
SysOpen("c:\xxx.
exe")//linuxormacOSrtl.
SysOpen("https://wwww.
xxx.
com")rtl.
SysOpen("file:///xxx.
png");ExtractFilePath提取文件名的路径,带"\"的rtl.
ExtractFilePath("C:\\aaa\\bbb\\aaa.
text")output:C:\aaa\bbbb\FileExists判断文件是否存在ExtractFileExt获取文件扩展名ExtractFileName获取一个文件名GetFileNameWithoutExt获取一个无扩展的文件名Combine合并LibVersion共8位,2位2位的,如:$01020100表示1.
2.
1.
0LibAbout2.
0.
2版本之后的api,liblcl的关于信息.
MainThreadId2.
0.
2版本之后的api,返回主线程IDCurrentThreadId2.
0.
2版本之后的api,返回当前线程IDCreateURLShortCut限Windows,创建一个url的快捷方式rtl.
CreateURLShortCut("C:\\aaa\\bbb\\","govcl","https://github.
com/ying32/govcl")CreateShortCut限Windows,创建一个快捷方式rtl.
CreateShortCut("C:\\Users\\administrator\\Desktop\\","govcl",os.
Args[0]rtlrtl函数函数package125/152//orrtl.
CreateShortCut("C:\\Users\\administrator\\Desktop\\","govcl",os.
Args[0],"","Descriptiontext","-a-b")InitGoDll2.
0.
3版本之后的api,用于go的dll中使用govcl,具体参考samples/Windows/nppPluginspackage126/152Lazarus中颜色预定义值Lazarus中的颜色表,Lazarus中的TColor与一般HTML的RGB有点不一样,反过来的以BGR表示.

RGB将r,g,b转为RGB颜色RGBToBGR将RGB颜色转为Lazarus的BGR颜色typestypescolorscolorscolors.
gocolors.
gopackage127/152定义着MessageBoxorMessageDlg返回值consts.
goconsts.
gopackage128/152一些类型定义types.
gotypes.
gopackage129/152里面定义着Lazarus中的枚举类型和集合类型.
enums.
goenums.
gopackage130/152这里定义了一些虚拟按键值,以windows为准keyskeys虚拟键虚拟键package131/152DEBUG全局变量,默认为false,在CreateForm之前设置值方可生效,开启后,一般在OnFormCreate事件上发生错误后可以打印完整的堆栈信息.
vclvcl函数_变量函数_变量package132/152ShowMessage显示一个消息框vcl.
ShowMessage("消息")package133/152ShowMessageFmt显示一个消息框vcl.
ShowMessageFmt("消息=%d",1)package134/152MessageDlg显示一个消息框,消息框,Buttons为按钮样式,祥见types.
TMsgDlgButtonsifvcl.
MessageDlg("是否退出",types.
MtInformation,types.
MbYes,types.
MbNo)==types.
MrYes{//}vcl.
MessageDlg("是否退出",types.
MtInformation,types.
MbYes,types.
MbNo)package135/152SelectDirectory1选择目录,弹出一个选择目录对话框,老版本样式ifok,dir:=vcl.
SelectDirectory1(0);ok{fmt.
Println("选择的目录为:",dir)}package136/152SelectDirectory2选择目录,弹出一个选择目录对话框ifok,dir:=vcl.
SelectDirectory2("标题了","C:/",false);ok{fmt.
Println("选择的目录为:",dir)}ThreadSync切换至主线程中运行指定代码,主要用于协程中UI的访问vcl.
ThreadSync(func(){fmt.
Println("这里的代码将会在主线程中运行")})InputBox输入对话框,参考例程sysdialogInputQuery输入对话框,参考例程sysdialogRunApp简化运行.
EqualsObject比较两个对象package137/152MacOS上的应用与linux、Windows的打包方式不一样.
需要生成MacOS下app专有格式目录及文件,而且不在app包中运行的会造成输入控件,如TEdit,TMemo等被转发到终端上.
macapp包是一个快捷打包工具,只要导入此包即可生成MacOS下的app.
在main包中导入,必须第一个被导入的包,根据go包导入规则,同一包按文件名从小到大执行顺序,创建一个最小名起始的文件,如:0.
go文件,在里面写入以下:第一种方式,此包会每次将新编译的可执行文件复制到指定位置下再运行packagemain//注意,编写此包的初衷只是为了开发时测试使用,正式的请不要使用此包,请手动将生成的可执行文件复制到对应文件夹.

import_"github.
com/ying32/govcl/pkgs/macapp"(未编写代码,后续做)第二种方式,此包只会在第一次运行时创建一个软链到指定目录下,链接指向当前可执行文件,然后运行packagemainimport_"github.
com/ying32/govcl/pkgs/macapp/debug"先将liblcl.
dylib复制到先将liblcl.
dylib复制到$GOPATH/bin目录中,运行时打包工具会自动复制此目录的目录中,运行时打包工具会自动复制此目录的liblcl.
dylib到目标的到目标的xxx.
app/Contents/MacOS/目录.
目录.
MacOSApp目录结构举例:govcl.
app|----Contents|----MacOS|----govcl//二进制文件|----liblcl.
dylib//核心UI库|----PkgInfo//|----info.
plist//非常重要的文件|----Resources//资源目录|----govcl.
icns//图标info.
plist文件格式:NSAppTransportSecurityNSAllowsArbitraryLoadsCFBundleDevelopmentRegionzh_CNCFBundleExecutablegovclCFBundleNamegovclCFBundleIdentifierying32.
govclCFBundleInfoDictionaryVersion6.
0CFBundlePackageTypeAPPL系统平台系统平台macOSmacOSAPP打包APP打包系统平台138/152CFBundleSignatureprojCFBundleShortVersionString0.
1CFBundleVersion1CSResourcesFileMappedCFBundleIconFilegovcl.
icnsCFBundleDocumentTypesCFBundleTypeRoleViewerCFBundleTypeExtensions*CFBundleTypeOSTypesfolddisk****NSHighResolutionCapableNSHumanReadableCopyrightcopyright2017-2018ying32.
com系统平台139/152这个问题还不知道,计算出来的值都是对的,但就是不能应用,原因未明.

可以使用f.
ScreenCenter()设置.
LinuxLinux窗口不能居中窗口不能居中系统平台140/152linux桌面图标是一个xxx.
desktop的文本文件,格式为(以lazarus的图标为例),具体的百度找找:[DesktopEntry];名称Name=Lazarus;注释Comment=LazarusIDE;可执行文件可以是/usr/sbin/xxx%f启动参数相当于windows批处理中的%0之类的Exec=startlazarus%f;是否终端,可视界面的填falseTerminal=false;类型,固定吧,没了解过Type=Application;图标Icon=lazarus.
png;这个应该可以不填,就是应用的分类Categories=Application;IDE;Development;GTK;GUIDesigner;;这个不太清楚StartupWMClass=Lazarus;mime类型,似乎可不填吧MimeType=text/x-pascal;text/lazarus-project-source;text/lazarus-project-information;text/lazarus-form;text/lazarus-resource;text/lazarus-package;text/lazarus-pa;关键字,这个不太懂是啥,似乎也不用填Keywords=editor;Pascal;IDE;FreePascal;fpc;Design;Designer;[Property::X-KDE-NativeExtension];这个不知道了.
.
Type=QString;这个应该是注册关联的文件类型吧,猜想.
.
.
.
Value=.
pas;这个估计也可以省掉吧.
没试过X-Ubuntu-Gettext-Domain=desktop_kdelibslinux桌面图标生成linux桌面图标生成系统平台141/152仅限于windows仅限于windows如果使用了res2goLazarusIDE插件,则可以直接在IDE中设置图标,Manifest,版本信息,参考如果使用了res2goLazarusIDE插件,则可以直接在IDE中设置图标,Manifest,版本信息,参考res2goLazarusIDE插件res2goLazarusIDE插件,注:需要插件,注:需要插件1.
0.
4及以上版本和gnu工具链中的windres(一般情况下lazarus自带有这个)WindowsWindowsIcon及manifest文件集成Icon及manifest文件集成系统平台142/152使用mingw64或mingw32中的windres.
exe位于位于github.
com\ying32\govcl\Tools\winRes目录中有现成的模板.
目录中有现成的模板.
系统平台143/152注:一个go工程中,只能有一个.
syso文件,如果采用自定义的,则不能再导入winappres包//不带uac的import_"github.
com/ying32/govcl/pkgs/winappres"//带uac的import_"github.
com/ying32/govcl/pkgs/winappres/uac"默认的资源包默认的资源包系统平台144/152准备好rc文件,rc文件格式为资源脚本每一行一个,格式为资源名资源格式文件名.
如govcl.
rc里面放置以下内容.
1MANIFEST"your.
manifest"MAINICONICON"your.
ico"1VERSIONINFOFILEVERSION1,1,1,0PRODUCTVERSION1,1,1,0FILEOS0x4FILETYPE0x1BEGINBLOCK"StringFileInfo"BEGINBLOCK"040904B0"BEGINVALUE"CompanyName","ying32"VALUE"FileDescription","govcl"VALUE"FileVersion","1.
1.
1.
1"VALUE"InternalName","govcl"VALUE"LegalCopyright","Copyright(C)ying32.
AllRightsReserved.
"VALUE"OriginalFilename","govcl.
exe"VALUE"ProductName","govcl"VALUE"ProductVersion","1.
1.
1.
1"ENDENDBLOCK"VarFileInfo"BEGINVALUE"Translation",0x0409,0x04B0ENDEND注:MANIFEST必须资源名必须为1,manifest文件格式见方法二中的.
如果资源中存在一个名为"MAINICON"的图标资源,则会默认加载为application图标.
使用windres.
exe编译为syso文件x86windres.
exe-iapp.
rc-odefaultRes_windows_386.
syso-Fpe-i386x64windres.
exe-iapp.
rc-odefaultRes_windows_amd64.
syso-Fpe-x86-64注:在rc脚本中也可以放置其它格式的,具体网上找rc文件格式的说明.
然后将生成的文件复制到你的工程目录下manifest文件内容如需要请求管理员权限,只需要将level="asInvoker"改为level="requireAdministrator"True/PM-->系统平台146/152方法一、增加以下代码即可屏蔽vcl.
Application.
SetOnException(func(sendervcl.
IObject,e*vcl.
Exception){})方法二、删除manifest文件中的一段恢复成windows经典样式的界面会有点难看,可以考虑使用样式替代.
以上两种方法任选一XP下关闭时uxtheme.
dll错误对话框解决方法XP下关闭时uxtheme.
dll错误对话框解决方法系统平台147/152在编译时加上参数-ldflags="-Hwindowsgui",比如gobuild-i-ldflags="-Hwindowsgui"去掉黑框(cmd窗口)去掉黑框(cmd窗口)系统平台148/152不要编译单个go源文件,这样go编译器就不会去寻找相关的资源文件了.
无法链接syso文件问题无法链接syso文件问题系统平台149/1521、下面这类错误都是没有找到库,请将相应平台的库放到当前目录或者环境变量中.

"faildtoloadlibvcl.
dll:Thespecifiedmodulecouldnotbefound",错误码panic:runtimeerror:invalidmemoryaddressornilpointerdereference[signal0xc0000005code=0x0addr=0x8pc=0x4fecb9]goroutine1[running]:gitee.
com/ying32/govcl/vcl.
(*TApplication).
Initialize(0x0)E:/GOPATH/src/gitee.
com/ying32/govcl/vcl/application.
go:75+0x19main.
main()运行错误运行错误系统平台150/152这个主要是想给以后为本项目做代码贡献准备的.
所有命名规则基本按ObjectPascal命名,个别除外吧,鉴于Go只有首字母大小写区别,所以相关大写变为小写.

DiyVM:50元/月起-双核,2G内存,50G硬盘,香港/日本/洛杉矶机房

DiyVM是一家比较低调的国人主机商,成立于2009年,提供VPS主机和独立服务器租用等产品,其中VPS基于XEN(HVM)架构,数据中心包括香港沙田、美国洛杉矶和日本大阪等,CN2或者直连线路,支持异地备份与自定义镜像,可提供内网IP。本月商家最高提供5折优惠码,优惠后香港沙田CN2线路VPS最低2GB内存套餐每月仅50元起。香港(CN2)VPSCPU:2cores内存:2GB硬盘:50GB/R...

Gigsgigscloud($9.8)联通用户优选日本软银VPS

gigsgigsCloud日本东京软银VPS的大带宽配置有100Mbps、150Mbps和200Mbps三种,三网都走软银直连,售价最低9.8美元/月、年付98美元。gigsgigscloud带宽较大延迟低,联通用户的好选择!Gigsgigscloud 日本软银(BBTEC, SoftBank)线路,在速度/延迟/价格方面,是目前联通用户海外VPS的最佳选择,与美国VPS想比,日本软银VPS延迟更...

paypal$10的代金券,选购美国VPS

paypal贝宝可撸$10的代金券!这两天paypal出了活动,本次并没有其他的限制,只要注册国区的paypal,使用国内的手机号和62开头的银联卡,就可以获得10美元的代金券,这个代金券购买产品需要大于10.1美元,站长给大家推荐几个方式,可以白嫖一年的VPS,有需要的朋友可以看看比较简单。PayPal送10美元活动:点击直达活动sfz与绑定卡的号码可以重复用 注册的邮箱,手机号与绑的银联卡必须...

qq透明皮肤怎么弄为你推荐
天气预报哪个好用哪个最准确分小时的那种天气预报app,哪个准确方便使用杀毒软件哪个好什么杀毒软件比较好呢??传奇类手游哪个好什么传奇类手游好玩不坑钱?浏览器哪个好用哪款浏览器好用苹果手机助手哪个好苹果手机助手哪个好用些谁知道车险哪个好购买车险哪家好qq空间登录器怎样直接登录QQ空间qq空间登录不上为什么我的qq空间登不上去yy空间登录玩空间游戏怎样1直是正在登录中360云查杀怎样使用360木马云查杀
apache虚拟主机 政务和公益机构域名注册管理中心 java主机 美国便宜货网站 tk域名 论坛空间 e蜗牛 e蜗 linux空间 帽子云 免费防火墙 独享主机 免费asp空间申请 lamp是什么意思 群英网络 netvigator 新疆服务器 cdn加速 studentmain 热云 更多