📄 delphifqa.htm
字号:
而这两个运算元的组合就可以做出类似下面的工作: function player_goodness(var MySport: TSport): integer; begin if (MySport is TBasketball) then player_goodness := (MySport as TBasketball).rebound_shots else if (MySport is TFootball) then player_goodness := (MySport as TFootball).total_yardage; end; 其实这段function将其定义成TSport的method而让TBasketball以及TFootball来over- ride要来得好些, 但这样就显示不出RTTI倒底在做什麽了!!不是吗...:-) 5.15 我建立了一个toolbar, 但是我只有icon格式的图像, 而没有bitmap格式的!!我 该怎麽办? 当然最好是您拥有像HiJaak一类的图型格式转换软体来做转换. 但这□则假设您啥都没 有, 只有Windows及Delphi, 那麽就试试下面这些步骤来将icon转成bitmap了: 1.想办法将该icon显示出来, 不管您怎麽做. 2.按Alt-PrintScreen目前工作中的视窗给拷贝到clipboard中. 3.执行小画家(Paintbrush)并且选择Edit|Paste. 4.利用区块选定功能(square selection tool)来框住(highlight)该icon, 在选 择Edit|Copy. 5.选择Options|Image Attributes将工作区(working area)设成32x32点(pixels). 6.再选择Edit|Paste一次. 7.将这个BMP图型存起来吧!! 5.16 若我使用Glyph属性(property), 我该如何知道那一个颜色会变成transparent的 状态? Delphi将左下角的点(pixel)当做是其背景色, 而它也应该以transparent的方式来显示. 没错!!我花了好段时间才将它找出来, 这一点并没有任何的文件有提到, 但若是您有VCL 原始程式的话, 您可以参阅BUTTONS.PAS这个程式. 5.17 我如何让我用Delphi发展的程式对Windows的讯息(messages)做出反应? Chuck Jazdzewski <cjaz@borland.com> 就以WM_WININICHANGED讯息当例子说: 在TForm中宣告一个method, 来使您能够处理WM_WININICHANGED这个讯息: procedure WMWinIniChange(var Message: TMessage); message WM_WININICHANGE; 而其实际本体则如下面所示: procedure TForm1.WMWinIniChange(var Message: TMessage); begin inherited; {.. react to someone mucking with control panel ..} end; "inherited"这个地方很重要. 注意在讯息处理器(message handler)中呼叫它们的 inherited是很特殊的, 因为您并不晓得要从谁那□做inherited. 这是由於讯息处 理器是以讯息号码(message number)来做inherited, 它可能不会有一个可见的 (visible)讯息名称或是就是您所给它的名称, 或是在某些情况, 这个讯息并不存 在(所以在这□您就该呼叫DefaultHandler). 5.18 我如何配置一块大於64Kb的记忆体? Reinier Sterkenburg <sterkenb@pml.tno.nl>说: 答案是: 利用WinProcs unit中的GlobalAlloc以及GlobalLock来做. 新的问题是: 为什麽不能用GlobalAllocPtr来做? 答案是: 我不知道!! 5.19 我能用Delphi发展一个给Windows用的萤幕保护程式(screen saver)吗? Thomas W Wolf <twwolf@cacd.rockwell.com>说: 有人送了封信出来问要如何利用Delphi做萤幕保护程式. a)在project档(*.DPR)中加入'{$D SCRNSAVE <保护器的名称>}在uses之後. b)在main form中, 将BoardIcons中内含的三项属性都设为False; 将BoardStyle设 为bsNone; 在OnActivate中将Left以及Top都设为0; 并将WindowState属性设为 wsMaximize. c)在OnCreate中将Application.OnMessage设给将保护器结束掉的method, 并将 Application.OnIdle设给显示保护画面的method. d)在OnCreate中您需要检查/c及/s这两个命令列参数. 这两个参数用来告诉 Windows是要对保护器做设定, 还是要执行保护器. e)编译这个程式, 并将其档名从.exe改为.scr. 将它放入Windows所在的目录中, 然後您就能从控制台中将它叫出来用. 5.20 我试著要去呼叫(译注: 某个API或function??), 但它却导致系统回应了一个GPF (General Protection Failure). 这是怎麽回事?(本问题语意不明) 这个问题似乎是说因为在呼叫Windows API或不是用Delphi所写出来的DLL(non-Delphi DLLs)时, 因为传入的字串型态是Pascal型态, 而不是null-terminated的型态所造成. 这一点是您在呼叫外部函式却遭到错误时, 首先要检查的地方. 请参考第5.12节以获得 详细的资讯. 5.21 我如何在执行时期(run time)在TTabbedNotebook元件中再增加页次(pages)? 下面这段程式假设有一个叫TabbedNotebook1的TTabbedNotebook元件, 即将加入一个含 有"OK"按键的新页次: procedure whatever_whenever; var NewPage: TTabPage; NewPageNumber: word; NewButton: TButton; begin {产生新的TTabPage物件} NewPage := TTabPage.Create(Application); {将它设为TabbedNotebook1的child} TabbedNotebook1.InsertControl(NewPage); {将新的页次名称加到TabbedNotebook1的Pages属性内; 这样会把新的页次加 到最後面去, 成为最後一页} NewPageNumber := TabbedNotebook1.Pages.Add(`New Page'); TabbedNotebook1.PagesObjects[NewPageNumber] := NewPage; {把按键加到新增的页次上面} NewButton := TButton.Create(Self); (TabbedNotebook1.Pages.Objects[NewPageNumber] as TWinControl) .InsertControl(NewButton); NewButton.Top := 10; NewButton.Height := 30; NewButton.Width := 100; NewButton.Caption := `OK'; end; 5.22 我绘制(painting)了一幅复杂的图形(graphics), 我该如何加速它重绘(redraw- ing)的速度? Steve Teixeira <steixeir@borland.com> 指出: 利用TBitmap元件当作记忆体DC(Device Context), 这样您就可以将Bitmap.Canvas 拷贝到form的Canvas上. 5.23 我该如何隐藏MDI(Multiple Document Interface)的子视窗? Steve Teixeira <steixeir@borland.com> 指出: 您无法将MDI的子视窗隐藏起来. 当您试著把MDI的子视窗隐藏起来的时候, Windows会做出一些奇怪的动作. 所以VCL不允许您这样子做. 5.24 我如何撰写全域性(global)的错误处理器(error handler)? 使用Application.OnException事件. 请参看on-line help内的"Application events"以 获得产生并将事件处理器与该application变数连起来的资讯. 5.25 为什麽我还是会看到例外讯息(exception messages)? 即使是在受保护(protected )的程式段落中? 根据内定的设定, Delphi内建的debugger会在碰到任何例外(exception)的时候中断程式 的执行, 即使这个例外会被程式本身所处理. 这项功能在除错的时候相当好用. 如果您 不想要这项功能, 您可以从Options|Environment中将它关掉. 5.26 我在某个OnKeyPress事件中加入我自己的程式码来拦截(traps)Enter键, 但是 系统却总是发出'哔'声并且/或是启动预设按键(default button)的动作. 我该 如何让它停下来? 这个问题是在於即使是正在执行您自己的事件处理器, 您还是让Enter键不受您程式的管 制, 并且启动Enter键的default动作. 要避免这个情况, 设定key:=0, 这样会送出一个 null按键信号给default处理器. 5.27 我想在执行时期更改某个元件的属性值, 但是要将一个指标(pointer)设给该元 件却不是件简单的事. 有没有什麽简单的方法来存取这个元件? 使用FindComponent库存函式来搜寻它的名称(name). 如果您不要用name来搜寻而要用其 它的属性来搜寻, 只有慢慢从form的Components属性中找了!! ------------------------------ 6.有关发行(distributing)用Delphi写出来的应用程式的问题 6.1 在Delphi□面有没有像VB中"setup wizard"一般的程式? 没有. 但是有一些协力厂商的工具程式可用, 但是Delphi本身并没有驱使这些工具程式 自动产生安装磁片的机制. 当然您也可以用Delphi撰写您自己的setup程式, 但您可就得 完全自行撰写了!!如果您决定要用这些工具程式, 您可以试试Chief's Installer Pro. 您可以从ftp.demon.co.uk这个anonymous ftp的/pub/ibmpc/windows/chief/pro取回 cinstp17.zip回去. 6.2 Delphi所原有的档案中, 有那些是可以附在我的软体中一起转发行出去的(re- distribute)? 如果您使用的是Delphi Desktop版本, 您可以将Borland Database Engine及Report- Smith的run-time版本转发行出去. 当然, 您也可以将您所发展的EXE或DLL档发行出去. Borland则是有一些规定, 例如您的程式必需要有合法的版权声明(如果不是您发展的东 西, 那就是Borland发展的东西) ---- 这似乎表示您不能用Delphi发展public domain 的应用程式. 还有, 如果您要随附Borland Database Engine发行出去, 您被要求必需 将所有相关的驱动程式一起随附出去, 这是因为使用者先前所安装的应用程式或许也使 用了BDE的功能. 如果您拿掉了它们的驱动程式, 将会产生不可预期的後果. 6.3 如果我想将我用Delphi编译完成的执行档(Delphi-compiled EXE file)发行出去 的话, Delphi中有那些档案是我必需一起附随出去的? 没有. 所有的资讯都已编译进了这个EXE档. 当然, 如果您还发展其它额外的程式(如HLP 档, 资料档....等), 或是您用了VBX, 那您就需要将它们一起随附出去. 如果您使用了 VBX, 那麽您还需要随附BIVBX11.DLL一起出去. 如果您的应用程式使用了资料库的功能, 您就需要将Borland Database Engine一起随附 出去. 您可以将您的CD上的两个已事先打包的磁片档案随附出去(它们并没有安装到您的 硬碟上). 而且如果您的应用程式也用到了ReportSmith, 您也要将它的run-time版本随 附出去. 这两样东西就相当地大了!!BDE需要用掉两片磁碟片, 而ReportSmith则要用掉 五片!! 6.4 我想将一个资料库应用软体发行出去, 但我不想强迫使用我的软体的使用者都要建 立BDE(Borland Database Engine)别名(aliases). 我该怎麽做? 最简单的方法就是不要在您的应用程式中使用别名. 所有您能够设与别名的东西, 您都 可以改设定其它的属性值, 或是设定TDatabase物件的Param区来代替. 例如, 您如果要 存取一个Paradox的档案, 您可以将"PATH=d:\dir\path"这一行加到Param集合中, 这样 就可以避免需要使用BDE别名来指定档案所在的目录了.後记:翻译这一类技术文章对弟来说是一大考验. 不仅要仅量将原文中所要表达的讯息传达给各位读者朋友, 亦要在必要时佐以部份的资料或资料来源使各位读者朋友们能够有更清析的了解. 虽然这对弟来说不是件容易的事, 但是翻译完毕之後的成就感还是我最喜欢的感受. 这不仅让我藉著翻译之便而将所有的内容先做了一次概略的认识, 也能将这份资讯以中文的型态呈现在
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -