compfaq Delphi 元件撰写常问问题.docx

上传人:夺命阿水 文档编号:1407263 上传时间:2024-06-15 格式:DOCX 页数:25 大小:45.28KB
返回 下载 相关 举报
compfaq Delphi 元件撰写常问问题.docx_第1页
第1页 / 共25页
compfaq Delphi 元件撰写常问问题.docx_第2页
第2页 / 共25页
compfaq Delphi 元件撰写常问问题.docx_第3页
第3页 / 共25页
compfaq Delphi 元件撰写常问问题.docx_第4页
第4页 / 共25页
compfaq Delphi 元件撰写常问问题.docx_第5页
第5页 / 共25页
点击查看更多>>
资源描述

《compfaq Delphi 元件撰写常问问题.docx》由会员分享,可在线阅读,更多相关《compfaq Delphi 元件撰写常问问题.docx(25页珍藏版)》请在课桌文档上搜索。

1、WolfgangChien,sHomepageDelphi学习笔记-典藏篇Delphi元件撰写常问问题版本:5译者:陈宽达原作者:JohnM.MianOCopyright1996-JohnMiano协助:GlenBoydStefanHoffmeisterRayKonopkaRay1.ischnerMaxNilson最近修改日期:1997年1月1日最近修改章节:6.1译稿更新日期1997年3月3日目次第一部分简介 1.l此份文件的目的为何?第二部份合环境 2.1在合环境中如何找出元件所产生的问题? 2.2如何检视DeIPhi所产生的组合语言码? 2.3我可以在执行时期动态建立元件,但在设计时期就

2、会发生错误。为什麽? 2.4如何撰写一个无法放置到表格上的元件? 2.5在程式码编辑器中快速切换程式区段最简单的方法是什麽? 2.6如何使我的元件在按下滑鼠右键时出现快速功能选单? 2.7为什麽元件在设计时期会出现I/O103的错误? 2.8为什麽元件编辑器不会将元件属性的变动储存起来?第三部分在元件中使用其它元件 3.1如何在元件中加入卷轴元件并让它在设计时期能动作? 3.2如何建立Windovs95式样的卷轴?第四部分BoundControls 4.1哪里可以找得到有关TData1.ink类别的说明文件? 4.2如何得知个dataset中有几笔记录?第五部分VC1. 5.1使用“合环境除错

3、时如何追踪检视VC1.元件的程式码? 5.2我的元件参考到其它元件,如何得到参考元件被消灭的讯息? 5.3什麽是元件讯息? 5.4我的元件得到输入焦点彳菱仍不能接受键盘讯息,为什麽?第六部分其它资讯 6.1有哪些书介绍或讲解如何撰写元件? 6.2有哪些Web站台可以取得撰写元件的资讯?第七部分元件的储存与载入 7.1如何将包含其它物件的物件一起存入DFM档? 7.2如何得知元件是否正从资料流中读出? 7.3如何确定元件的屈性是否被正确地储存?第八部分工具程式 8.1有没有DelPhi版本的YACC及1.EX? 8.2如何秀出JPEG格式图形档?第九部分基本程式设计技巧 9.1如何建立不定数目的

4、物件阵列? 9.2DeIPhi2.O的WinCrt单元到哪去了? 9.3自制元件时该从哪个类别继承?第十部分进阶程式设计技巧 10.1DeIPhi有与C+样的I/OSlream类别吗? 10.2如何取得列举型态变数的文字表示?第十一部分元件虚拟方法 11.1如何得知元件的WineIowhandle是何时建立的? 11.2如何得知是否表格上所有元件都已载入完成? 11.3在哪里绘制元件最适合? 11.4如何改变元件的视窗式样?第十二部分WindowsAPI 12.1元件卷动时闪动的很厉害,如何克服这种情况?.12.2如何重新启动WindOWs? 12.3如何快速大量地更改元件资料?第十三部分控制

5、项边框 13.1为什麽我的元件的Ctl3D属性设为TrUe之彳及,它依然没有3D的边框呢? 13.2如何实作BOrderStyIe屈性?第十四部分控制项式样 14.1当元件重绘时如何防止闪动的情况?第十五部分视窗讯息 15.1为什麽我的元件得不到方向键的讯息? 15.2有没有与ViSUalBaSiCDoEventsJI同样功能的函式?第一部分简介1.1此份文件的目的为何?这份文件的目的是为了解答有关撰写Delphi元件时常见或文件上找不到的问题。我曾经花了一段很长的时间来了解探索TData1.ink类别,这让我觉得应该将撰写元件时常遇到的问题及经验心得写下来,分享给大家。不过我并不能保证写在这

6、份文件里头的解答完全正确。如果你对其中的任何问题有更好的解决方法,或认为有什麽资讯适合放在这份文件里的话,请告知作者。有任何错误或缺漏也欢迎指正。除了再加上更多的问题及解答外,我试著再补充两个部分:1 .进阶程式设计师喜爱的工具:这也许跟元件设计没有直接的关系但至少它们跟DeIPhi有关系。2 .值得参考的文件刊物:由於空间的关系,这份文件不能放置太多的范例程式,因此参考其它文件是十分需要的。这不是一份教材式的文件,我不会做太多条理式的说明,但会试著将最具有参考价值的文献列出。如果你有任何意见或建,欢迎来信告诉我。第二部份合环境2.1 在合环境中如何找出元件所产生的问题?我发现唯一能找出问题的

7、方法只有:1 .在DelPhi”合环境的ToolslOptions对话框的1.ibrary页中将(Compilewithdebuginfoj选项打勾。2 .选ComponentRebuild1.ibrary重新编译元件库。3 .从TurboDebugger中执行Delphio4 .选FilelChangeDir移至包含元件程式码的目录下。如果你的元件发生GPF时就可以检视堆叠然彳爰得知到底是哪些发生问题了。2.2 如何检视Delphi所产生的组合语言码?GlenBoyd的回答:开启登录编辑程式(REGEDn.EXE),接著到HKEY_CURRENT_USERSoftwareBorlandDel

8、phi2.ODebugging下新届一个字电机码EnableCPU,将它的字串值设为11J0此彳菱DeIPhi合环境的View选单下就会多一个CPU选项,它会开启一个视窗来检视目前程式指令的记忆体及组合语言。你可以在侦错时利用单步追踪或其它方法来观察它。2.3 我可以在执行时期动态建立元件,但在设计时期就会发生错误。为什麽?5 .你的元件必须继承自TCOmPOnent类别或其衍生类别。6 .你的元件建构函式及灭构函式宣告必须看起来像这样:constructorCreate(AOwner:TComponent);override;destructorDestroy;override;7 .所有在

9、published区段宣告的栏位型态必须是ordinal、single、double、extended、comp、currencystringsmallset(译注:指元素编号不超过0.31这个范围的集合;平常的集合可容许的范围为0.255)、methodpointer或class其中一种。如果你宣告了其它型态的栏位,Delphi编译器并不会检查出错误。然而当你使用这个元件时依然会得到一个GPF0如果你想让TMyComponent元件可以在设计时期操作,注意下面的宣告会引发十分严重的问题:typeTComplex二recordRealPart:Double;Comp1exPart:Doub1e

10、;end;classTMyComponent=Class(!Component)privateFl:TComplex;publishedpropertyPl:TComplexreadFlwriteFl;end;1.4 如何撰写一个无法放置到表格上的元件?Ray1.ischner的回答:如果你不想让使用者将元件拉曳至表格上的话,使用RegisterNoIcon及RegisterClass程序来注册元件。1.5 在程式码编辑器中快速切换程式区段最简单的方法是什麽?RayKonopka的回答:在探索VC1.原始程式码时,强烈建你最好熟悉程式码编辑器里的书签功能。使用方法很简单:Ctrl-Shift-

11、N,N是从0至9的数字,用来设定一个书签。此彳爰就可以使用Ctrl-N来跳跃至书签处。(译注:使用这项功能真的可以节省你许多来回卷动程式及找寻函式的时间,别迟疑了,快学吧!)1.6 如何使我的元件在按下滑鼠右键时出现快速功能选单?你必须要建立一个元件编辑器。元件编辑器决定了元件在设计时期时对滑鼠键的反应及动作,你可以为元件定义它自己的快速功能选单。建立元件编辑器的步骤大致如下:8 .从TComponentEditor类别继承一个新的类别。9 .改写类别的GetVerbCountGetVerb及EXeCUteVerb方法。10 .在Register程序中使用RegisterComponentEd

12、itor程序来注册此元件编辑器。有关元件编辑器这个主题在DevelopingDelphiComponents这本书中有详尽的解说及资讯。2.7为什麽元件在设计时期会出现110103J的错误?你可能在元件中使用了WriteIn这个程序。2.8为什麽元件编辑器不会将元件属性的变动储存起来?我发现有时自制的元件编辑器不会将元件属性储存起来。设计时期一切正常,但是储存起来再重新读入彳爰就有问题了。原因是你很可能忘了在元件编辑器中呼叫此方法:Designer.Modified;如此一来Delphi才会知道你的元件编辑器更改过属性值了。第三部分在元件中使用其它元件3.1 如何在元件中加入卷轴元件并让它在设

13、计时期能动作?你的卷轴元件类别必须处理CM_DESIGNHITTEST元件讯息才行。TMyScrollBar=class(TScrollBar)procedureCMDesignHitTest(varMessage:TCMDesignHitTest);messagecm_designhittest;end;procedureTNScrolIBar.CMDesignHitTest(varMessage:TCMDesignHitTest);beginMessage.Result:=1;end;你的元件必须以以下方法建立卷轴:TMyScrollBar.Create(nil);而不是TMrScroll

14、Bar.Create(Self);3.2 如何建立WindOWS95式样的卷轴?你必须设定卷轴的页面大小。你可以用以下的程式码来做:procedureSetPageSize(ScrollBar:TScrollBar;PageSize:Integer);varScrollInfo:TScrollInfo;beginScrollInfo.cbSize:=Sizeof(ScrollInfo);ScrollInfo.fMask:=SIF_PAGE;ScrollInfo.nPage:=PageSize;SetscrollInfo(ScrollBar.Handle,SB_CT1.,ScrollInfo,T

15、rue);end;要取得目前页面大小可用如下方法:functionGetpageSize(ScrollBar:TScrollBar):Integer;varScrollInfo:TScrollInfo;beginifHandleAllocatedthenbeginScrollInfo.cbSize:=SizeOf(ScrollInfo);ScrollInfo.fMask:=SIF_PAGE;GetscrollInfo(ScrollBar.Handle,SB_CT1.,ScrollInfo);Result:-ScrollInfo.nPage;end;end;第四部分BoundControls4.

16、1 哪里可以找得到有关TData1.ink类别的说明文件?我可以大胆地说全世界有关TData1.ink的说明文件只有一份,就在这儿: 属性(Property)介绍propertyActive:Boolean(唯读)当此Data1.ink连结至一个已开启的DataSource时会传回True0当Active状态改变时会触发ActiveChanged方法。propertyActiveRecord:Integer(可读写)用来设定或取得Data1.ink缓冲区中目前所指向的记录代码,代码的范围是0.BufferCount-Io使用它来设定记录代码时必须小心不要超过这个范围,否则可能导致不可预期的错误

17、。propertyBufferCount:Integer(可读写)Data1.ink拥有一个资料缓冲区。而BufferCount属性即用来设定或取得缓冲区大小,缓冲区大小决定了一个dataset同时可以显视的资料记录笔数。对大部分的资料感知元件来说,BufferCount的值是1;但对TDataGrid来说,BufferCount代表它的可视列数目。propertyDataSet:TDataSet(唯读)传回此Data1.ink所连结的DataSet0其实就是DataSource.DataSet0propertyDataSource:TDataSource(可读写)传回此Data1.ink所连

18、结的DataSourceopropertyDataSourceFixed:Boolean(可读写)这个属性可用来防止DataSource属性被更改。如果此属性设为True,当我们试著改变DataSource属性时会引发一个例外。propertyEditing:Boolean(唯读)如果Data1.ink正处於编辑状态则传回TrueopropertyReadOnly:Boolean(可读写)设定Data1.ink是否为唯读状态。这个属性并不会影响所连结的DataSet0在唯读状态下这个Data1.ink无法进入编辑状态。propertyRecorclCount:Integer(唯读)传回Data

19、Set的资料记录数目。 方法(Method)介绍functionEdit:Boolean;让所连结的DataSet进入编辑状态。传回值:成功传回TrUe,失败传回FalseprocedureUpdateRecord;我们不直接呼叫这个方法,它是提供其它程式来呼叫的。这个方法只有设定一个旗帜然彳爰呼叫UpdateData方法。 虚拟方法(VirtualMethod)要让TData1.ink物件与元件沟通必须改写下列这些方法:procedureActiveChanged当连结的DataSource开启状态改变时会呼叫此方法。使用Active属性可以得知目前是否为开启状态。procedureChec

20、kBrowseMocle资料库有任何改变之彳度都会先呼叫这个方法。procedureDataSetChanged;当下列任一事件发生时都会呼叫此方法:- 移至DataSet的开头- 移至DataSet的结尾- 在DataSet中插入或新增资料- 删除DataSet的资料- 取消DataSet的编辑- 更新记录如果不想改写这个方法只要在其中呼叫:RecordChanged(nil);procedureDataSetScrolled(Distance:Integer)每当目前记录变更时会呼叫此方法。Distance参数代表缓冲区欲卷动的行数。(其值范围皆在-1.1之间)。使用ActiveRecor

21、d属性可以取得缓冲区中目前所指向的记录。我们无法强制让Data1.ink的缓冲区卷动。procedureFocusControl(Field:TFieldRef)与TField.FocusControl方法相同。procedureEditingChanged当Data1.ink的编辑状态改变时会呼叫此方法。使用Editing属性可以得知Data1.ink是否正处於编辑状态。procedure1.ayoutChanged当DataSet的1.ayOUt改变时会呼叫此方法(例如新增一个column)oprocedureRecordChanged(Field:TField)当下列任一事件发生时都会呼

22、叫此方法:- 目前记录进入编辑状态- 目前记录内容更动procedureUpdateData在一笔记录被更新以前会呼叫此方法。你可以呼叫Abort程序来防止资料库更新。4.2如何得知一个dataset中有几笔记录?TDateSet的RecNo属性可以传回资料记录的数目,但很不幸地它只适用於dBase及Paradox的资料表格。若想得知目前资料记录的编号,可以从TData1.ink类别衍生一个新的类别,然彳爰进行下列步骤: 改写DataSetScrolled方法以取得目前记录是否被卷动。 改写DataSetChanged方法来确认目前记录是否跳至最前面或最彳度面了。接著你可以将这个新类别的物件连

23、结到TDataSource物件上然彳爰就可以随时得知目前的记录编号了。第五部分VC1.5.1 使用合环境除错时如何追踪检视Ve1.元件的程式码?将你想要追踪的VC1.原始程式单元拷贝至存放专案的目录中并重新编译元件库,此彳爰你就可以在那些VC1.单元中追踪检视程式码To5.2 我的元件参考到其它元件,如何得到参考元件被消灭的讯息?MaxNilson的回答:TComponent类别提供了Notification方法。当一个元件被移除时我们可以利用这个方法得到消息以进行适当的反应。你可以参考ComponentWriter,sGuideJ内有关Notification及FreeNotificatio

24、n这两个方法的说明。当你的元件参考到另一个元件,例如,你的元件中有一个TDataSource型态的属性。那你必须改写此元件的Notification方法,在其中检查被移除的元件是否就是本身所参考的元件。预设情况下,当元件被移除时,所有其它在同一个表格上的元件才会收到消息,如果参考元件位於另一个表格上时,你的元件无法得知这件事情。Delphi2.0推出了TDataMOdUIe,参考元件位於另一个表格上的机会大幅增加,所以你应该利用FreeNotification方法来确定当参考元件移除时,你一定可以得到消息。如果你不改写Notification方法来处理参考元件被移除的讯息,这会让DeIPhi合

25、环境陷入十分不稳定的状态。它可能不会立刻当掉,但你也不能再正常地继续其它工作了。下面是一个范例,当你的元件参考其它元件时,千万记得要做以下的处理:TMyComponent=class(TComponent)privateFDataSource:TDataSource;procedureSetDataSource(Value:TDataSource);protectedprocedureNotification(AComponent:TComponent;Operation:!Operation);override;publishedpropertyDataSource:TDataSourcer

26、eadFDataSourcewriteSetDataSource;end;procedureTMyComponent.SetDataSource(Value:TDataSource);beginifValueOFDataSourcethenbeginFDataSource:=Value;/告诉参考元件说,当它被移除时记得通知我一声。ifFDataSourceOnilthenFDataSource.FreeNotification(Self)end;end;procedureTMyComponent.Notification(AComponent:!Component;Operation:TOp

27、eration);begininheritedNotification(AComponent,Operation);/如果被移除的正是参考元件,把FDataSoUrCe栏位清除。if(Operation=opRemove)and(AComponent二FDataSource)thenFDataSource:=nilend;5.3 什麽是元件讯息?元件讯息是什麽?它十分类似WindoWS的视窗讯息,只有一点不同:元件讯息只适用於VC1.元件;而视窗讯息可以用在系统内所有具有windowhandle的控制项或视窗。如果你有一个具有Font属性的元件(例如T1.abel元件),当我们更改它的Font

28、属性时并没有送出视窗讯息(译注:T1.abel元件不是视窗控制项,根本也没有视窗Handle可以让我们传送视窗讯息),但是控制项仍然知道字型改变了所以要重画自己,为什麽?因为我们有元件讯息。元件讯息不可以由虚拟方法来处理,这可能是设计VC1.时的考量,大概是因为不想让虚拟方法表格(VirtualMethodTable)过於庞大的原因。SecretsofDelphi2.0这本书对於所有的元件讯息有十分详尽的解说。接下来我们列出一些比较常见的元件讯息及它们的作用。标示著NotificationOnlyJ的讯息表示送出这个讯息只是为了通知元件某件消息而己,并不传入任何参数而且也不需要传回值。CMAC

29、TIVATE(NotificationOnly)当表格成为焦点视窗时会传给本身这个讯息。CM_CT1.3DCHANGED(NotificationOnly)当控制项的Ctl3D属性更改时会传给本身这个讯息。CMDESIGNHITTEST参数:TCMDesignHitTest传回值:0或1在设计时期当滑鼠移到元件上头时,合环境会送给此元件这个讯息。此讯息的目的用来决定元件在设计时期是否要处理滑鼠讯息。如果传回值是1,合环境就让元件自行处理滑鼠讯息;若传回值是0,则合环境会帮你处理滑鼠讯息。如果传回值永远是1,那麽元件的快速功能选单则永远不会出现;如果元件不处理这个讯息或永远传回0,那此元件在设计

30、时期将无法对滑鼠讯息做任何反应。Cnlfontchanged(Notificationo11iy)控制项的字型改变彳爰送给本身此讯息。cm_fontchange(Notificationo11y)当控制项收到WMFoNTCHANGE视窗讯息时会送给本身这个讯息。CM_PARENTCT1.3DCHANGED(NotificationOnly)当元件父控制项的Ctl3D属性改变或设定新的父控制项时会收到此讯息。Cnlparentcolorchanged(NotificationOnIy)当元件父控制项的Color属性改变或设定新的父控制项时会收到此讯息。cmParentfontchanged(No

31、tificationonly)当元件父控制项的Font属性改变或设定新的父控制项时会收到此讯息。Cnlparentshowhintchanged(NotificationOnly)当元件父控制项的ShowHint属性改变或设定新的父控制项时会收到此讯息。Cmjvininichange参数:TWMwinlniChange传回值:无当控制项收到WMJylNlNICHANGE视窗讯息时会送给本身这个讯息。5.4 我的元件得到输入焦点彼仍不能接受键盘讯息,为什麽?如果你的元件有DragMode属性而且将它设成dmutomatic时,很有可能让你的元件以为它正被拖曳但实际上并没有的情况。在Control

32、s单元中有一个区域变数DragControl指向目前正被拖曳的元件。你遇到的情况很可能就是明明没有拖曳的动作但是DragControl变数却指向你的元件。在TWinCOntrol的WndProc方法中,当DragControl变数指向元件本身时,会忽略所有键盘讯息,这就是原因了!第六部分其它资讯6.1 有哪些书介绍或讲解如何撰写元件?有关撰写元件的标准参考书籍:DevelopingDelphiComponents作者:RayKonopka出版:CoriolisGroup下面这本书并不专注於元件写作,但里面提到许多元件撰写者不可不知的资讯:(SecretsofDelphi2作者:Ray1.isc

33、hner出版:WaiteGroup另外一本元件撰写的好书,它有许多在DevelopingDelphiComponentsj里找不到的资讯:ProgrammingDelphiCustomComponents作者:FredBulback出版:M&TBooks6.2 有哪些Web站台可以取得撰写元件的资讯?全世界最大的DelphiWeb站台DelphiSUPerPageJl(译注:亚洲地区使用者可以就近到位於日本的MirrOrSiIe)我在下面这些站台中找到许多元件的原始程式码: TCmPICOfDeIPhi DeIPhiFreeStUff (译注:IlYoUrDelphiProgrammingR=

34、CountthenraiseException.CreateFmt(,Index(%d)outsiderange1.%d,Index,Count-I);Result:=inheritedItemsIndex;end;procedureT1.istOfMyObject.Add(AObject:TmyObject);begininheritedAdd(AObject);end;9.2 2Delphi2.0的WinCrt单元到哪去了?Delphi2.0并没有WinCrt单元。先别伤心,这是因为我们可以用其它方法来取代它。在ProjectlOptions的1.inker页次中将Generatecons

35、oleapplication选项打开,你就可以像以前使用WinCrt单元一样地写程式了!9.3 自制元件时该从哪个类别继承?vc1.中有一些r自订类别,而且有许多控制项是直接由这些自订类别继承下来的。例如TMemo直接继承自TeUStomMemO类别。这些自订类别写好了所有该控制项所拥有的功能,只是没有将属性公开出来而己。大部分情形下,你应该从那些自订类别继承而不是控制项类别。如果你要从头撰写自己的元件,那麽从TcustomControl类别继承是个不错的主意。撰写出来的元件会具有WindowHandle且可以接受输入焦点。另外根据你的需要也可以从这些类别继承: TGraphicControl

36、:视觉元件,但是没有WindoWhandIe,也不能接受输入焦点。 1Component:不可视元件,你没办法在执行时期看到它。 TWinControl:将已存在的视窗元件包装起来,如WindoWS标准控制项或VBX元件。第十部分进阶程式设计技巧10.1 Delphi有与C+一样的I/OStream类别吗?答案可以说有也可以说没有。DelPhi允许你建立自己的文字档驱动程式,它可以让你使用DeIPhi标准的I/O函式库来处理非标准的I/O,如处理UNIX格式的文字档或处理Socket所取得的资料。虽然没有像C+的I/OStream类别那麽强大但应该也足够一般用途使用了。建立文字档驱动程式的方法

37、在ObjectPascal1.anguageGuideJ中有明述。此外你也可以参考VC1.的Printer单元。DeIPhi有TStream类别,不过是设计用来将物件写入资料流的,不像C+的I/OStream类别那麽具有弹性。10.2 2如何取得列举型态变数的文字表示?使用TyPInfo单元中的GetEnumName函式:typeTMyType二(Valuel,Value2);varTypeValue:TMyType;beginWriteln(GetEnumName(Typeinfo(TMyType),Ord(TypeValue);end;TypInfo单元中还有许多与型别资讯有关的函式。Se

38、cretsofDelphi2.Oj这本书有许多关於TyPlnfO单元的资讯,值得参考。第十一部分元件虚拟方法11.1 如何得知元件的WindoWhandle是何时建立的?控制项的windowhandle是在CreateWnd方法中建立的。如果你想要在建立windowhandle彳爰接著做某些动作那麽你应该改写CreateWnd方法:procedureTMyClass.CreateWnd;begin/现在还没取得windowhandleinheritedCreateWnd;/呼叫inherited以取得windowhandle/在这里撰写你想要执行的动作end;11.2 如何得知是否表格上所有元

39、件都已载入完成?1.oaded方法是在载入完成彳及接著被呼叫的。procedureTMyClass.1.oaded;begininherited1.oaded;/将ComPOnentState中的Cs1.oading状态清除/在这里撰写你想要执行的动作end;11.3 在哪里绘制元件最适合?你应该拦截WMPAINT视窗讯息然彳及利用Canvas来绘制元件。然而VC1.己经帮你拦截好了,你只须改写元件的Paint方法即可。procedureTMyClass.Paint;begin/如果你的元件是己存在的元件继承下来的,那麽必须在这里呼叫inheritedPaintinheritedPaint;/

40、在这里撰写你想要执行的动作end;11.4 如何改变元件的视窗式样?CreateParams方法用来设定元件的视窗式样及其它必须传递至CreateWindowExAPI的参数。要改变元件的视窗式样,例如增加或拿掉元件的垂直卷轴只要改写CreateParams方法:procedureTMyControl.CreateParams(varParams:TCreateParams);begininheritedCreateParams(Params);ifIWantAScrollBarthenParams.Style:=Params.StyleorWS_VSCRO1.1.elseParams.Style:=Params.StyleandnotWS_VSCRO1.1.;end;第十二部分WindowsAPI12.1元件卷动时闪动的很厉害,如何克服这种情况?要卷动元件本身最简单的方法就是改变它的座标然彳及重画元件,但是这方法会导致元件闪动的很厉害。比较好的方法是呼叫ScrollWindow或ScrollWindowExWindowsAPIo闪动的另一个原因可能来自於WM_PAINT及Bleraseb

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 在线阅读 > 生活休闲


备案号:宁ICP备20000045号-1

经营许可证:宁B2-20210002

宁公网安备 64010402000986号