⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 wizards_2.htm

📁 对于学习很有帮助
💻 HTM
📖 第 1 页 / 共 2 页
字号:
<html>

<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<title>怎样编写DELPHI向导(二)</title>
</head>

<body bgcolor="#FFFFFF" text="#000000">

<p align="center"><big><big><big>怎样编写DELPHI向导(二)</big></big></big></p>

<p>发信人:&nbsp;strayli&nbsp;(stray),&nbsp;信区:&nbsp;Delphi&nbsp;<br>
标&nbsp;&nbsp;题:&nbsp;How&nbsp;to&nbsp;write&nbsp;Delphi&nbsp;wizard(2)&nbsp;<br>
发信站:&nbsp;BBS&nbsp;水木清华站&nbsp;(Thu&nbsp;Nov&nbsp;&nbsp;5&nbsp;22:01:06&nbsp;1998)&nbsp;<b><font
color="#00FF00">WWW-POST</font></b>&nbsp;<br>
&nbsp;<br>
After&nbsp;we&nbsp;click&nbsp;onthe&nbsp;OK-button&nbsp;to&nbsp;add&nbsp;the&nbsp;generic&nbsp;unit&nbsp;with&nbsp;our&nbsp;GenericExpert&nbsp;&nbsp;<br>
to&nbsp;the&nbsp;DCLUSR30&nbsp;package,&nbsp;we&nbsp;need&nbsp;to&nbsp;confirm&nbsp;that&nbsp;Delphi&nbsp;needs&nbsp;to&nbsp;rebuild&nbsp;the&nbsp;&nbsp;<br>
package:&nbsp; &nbsp;<br>
&nbsp;After&nbsp;the&nbsp;package&nbsp;is&nbsp;rebuilt&nbsp;and&nbsp;installed&nbsp;into&nbsp;the&nbsp;Delphi&nbsp;3&nbsp;IDE&nbsp;again,&nbsp;we&nbsp;&nbsp;<br>
can&nbsp;inspect&nbsp;the&nbsp;Package&nbsp;Editor&nbsp;and&nbsp;see&nbsp;that&nbsp;the&nbsp;generic&nbsp;unit&nbsp;is&nbsp;now&nbsp;part&nbsp;of&nbsp;&nbsp;<br>
it.&nbsp;This&nbsp;simple&nbsp;example&nbsp;already&nbsp;illustrates&nbsp;that&nbsp;packages&nbsp;are&nbsp;not&nbsp;limited&nbsp;to&nbsp;&nbsp;<br>
components,&nbsp;but&nbsp;can&nbsp;contain&nbsp;Wizards&nbsp;as&nbsp;well.&nbsp; 
&nbsp;&nbsp; &nbsp;<br>
When&nbsp;Delphi&nbsp;is&nbsp;done&nbsp;with&nbsp;compiling&nbsp;and&nbsp;linking&nbsp;COMPLIB.DCL&nbsp;or&nbsp;DCLUSR30.DPL,&nbsp;&nbsp;<br>
you&nbsp;can&nbsp;find&nbsp;our&nbsp;first&nbsp;new&nbsp;Wizard&nbsp;in&nbsp;the&nbsp;Help&nbsp;menu:&nbsp; 
&nbsp;&nbsp; &nbsp;<br>
Just&nbsp;select&nbsp;the&nbsp;&quot;Generic&nbsp;Wizard&quot;&nbsp;and&nbsp;it&nbsp;will&nbsp;show&nbsp;the&nbsp;world&nbsp;that&nbsp;it's&nbsp;alive:&nbsp;&nbsp;<br>
&nbsp;As&nbsp;we&nbsp;can&nbsp;see,&nbsp;only&nbsp;the&nbsp;Execute&nbsp;method&nbsp;contains&nbsp;any&nbsp;significant&nbsp;code,&nbsp;and&nbsp;&nbsp;<br>
this&nbsp;will&nbsp;remain&nbsp;so&nbsp;for&nbsp;all&nbsp;Wizards&nbsp;to&nbsp;come.&nbsp;In&nbsp;order&nbsp;to&nbsp;avoid&nbsp;that&nbsp;we&nbsp;have&nbsp;&nbsp;<br>
to&nbsp;print&nbsp;a&nbsp;long&nbsp;listing&nbsp;in&nbsp;this&nbsp;paper&nbsp;for&nbsp;an&nbsp;Wizard&nbsp;where&nbsp;only&nbsp;one&nbsp;method&nbsp;is&nbsp;&nbsp;<br>
relevant,&nbsp;I'll&nbsp;propose&nbsp;the&nbsp;following&nbsp;technique:&nbsp;let's&nbsp;use&nbsp;a&nbsp;table&nbsp;to&nbsp;define&nbsp;&nbsp;<br>
the&nbsp;nine&nbsp;methods,&nbsp;and&nbsp;only&nbsp;specify&nbsp;the&nbsp;Execute&nbsp;method&nbsp;in&nbsp;detail.&nbsp;Our&nbsp;&nbsp;<br>
TGenericExpert&nbsp;would&nbsp;then&nbsp;become&nbsp;the&nbsp;following:&nbsp; 
&nbsp;&nbsp;<br>
TGenericExpert&nbsp; &nbsp;<br>
GetStyle:&nbsp;esStandard&nbsp; &nbsp;<br>
GetIDString:&nbsp;DrBob.TGenericExpert&nbsp; &nbsp;<br>
GetName:&nbsp;Generic&nbsp;Wizard&nbsp; &nbsp;<br>
GetAuthor&nbsp;(win32):&nbsp;Bob&nbsp;Swart&nbsp;(aka&nbsp;Dr.Bob)&nbsp; &nbsp;<br>
GetMenuText:&nbsp;&amp;Generic&nbsp;Wizard...&nbsp; &nbsp;<br>
GetState:&nbsp;[esEnabled]&nbsp; &nbsp;<br>
GetGlyph:&nbsp;0&nbsp; &nbsp;<br>
GetPage&nbsp;(win32):&nbsp;&nbsp;&nbsp; &nbsp;<br>
GetComment:&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;<br>
With&nbsp;only&nbsp;the&nbsp;Execute&nbsp;method&nbsp;outlined&nbsp;in&nbsp;detail&nbsp;(see&nbsp;previous&nbsp;listing).&nbsp;We&nbsp;&nbsp;<br>
will&nbsp;use&nbsp;this&nbsp;notation&nbsp;in&nbsp;the&nbsp;rest&nbsp;of&nbsp;this&nbsp;session.&nbsp; 
&nbsp;</p>

<p>&nbsp;<br>
3.&nbsp;TSysInfoExpert &nbsp;<br>
Instead&nbsp;of&nbsp;just&nbsp;popping&nbsp;up&nbsp;a&nbsp;MessageDlg,&nbsp;we&nbsp;can&nbsp;show&nbsp;any&nbsp;form&nbsp;we'd&nbsp;like.&nbsp;In&nbsp;&nbsp;<br>
fact,&nbsp;this&nbsp;is&nbsp;just&nbsp;were&nbsp;the&nbsp;fun&nbsp;starts.&nbsp;Generally,&nbsp;we&nbsp;can&nbsp;consider&nbsp;our&nbsp;Wizard&nbsp;&nbsp;<br>
to&nbsp;consist&nbsp;of&nbsp;two&nbsp;parts:&nbsp;the&nbsp;Wizard&nbsp;engine&nbsp;and&nbsp;the&nbsp;form&nbsp;interface.&nbsp;We've&nbsp;just&nbsp;&nbsp;<br>
seen&nbsp;how&nbsp;to&nbsp;write&nbsp;the&nbsp;Wizard&nbsp;engine,&nbsp;and&nbsp;we&nbsp;all&nbsp;know&nbsp;how&nbsp;to&nbsp;write&nbsp;form&nbsp;&nbsp;<br>
interfaces,&nbsp;so&nbsp;let's&nbsp;put&nbsp;these&nbsp;two&nbsp;together&nbsp;and&nbsp;write&nbsp;our&nbsp;first&nbsp;&nbsp;<br>
something-more-than-trivial&nbsp;information&nbsp;Wizard.&nbsp;The&nbsp;information&nbsp;that&nbsp;I&nbsp;want&nbsp;&nbsp;<br>
the&nbsp;Wizard&nbsp;to&nbsp;present&nbsp;can&nbsp;be&nbsp;found&nbsp;in&nbsp;the&nbsp;SysUtils&nbsp;unit,&nbsp;and&nbsp;consists&nbsp;of&nbsp;the&nbsp;&nbsp;<br>
country&nbsp;specific&nbsp;informatin&nbsp;regarding&nbsp;currency&nbsp;and&nbsp;date/time&nbsp;formatting&nbsp;&nbsp;<br>
constants.&nbsp;In&nbsp;the&nbsp;on-line&nbsp;help&nbsp;we&nbsp;can&nbsp;find&nbsp;which&nbsp;constants&nbsp;are&nbsp;defined&nbsp;in&nbsp;&nbsp;<br>
SysUtils,&nbsp;but&nbsp;we&nbsp;can't&nbsp;see&nbsp;their&nbsp;value.&nbsp;This&nbsp;is&nbsp;unfortunate,&nbsp;since&nbsp;most&nbsp;of&nbsp;&nbsp;<br>
the&nbsp;time&nbsp;Delphi&nbsp;is&nbsp;of&nbsp;course&nbsp;up-and-running&nbsp;while&nbsp;we're&nbsp;developing,&nbsp;so&nbsp;&nbsp;<br>
SysUtils&nbsp;is&nbsp;active&nbsp;as&nbsp;well&nbsp;(remember:&nbsp;Delphi&nbsp;is&nbsp;written&nbsp;in&nbsp;Delphi!)&nbsp;and&nbsp;&nbsp;<br>
should&nbsp;know&nbsp;about&nbsp;these&nbsp;values.&nbsp; &nbsp;<br>
&nbsp;<br>
So,&nbsp;using&nbsp;the&nbsp;Dialog&nbsp;Expert,&nbsp;we&nbsp;can&nbsp;create&nbsp;a&nbsp;Multipage&nbsp;dialog,&nbsp;using&nbsp;a&nbsp;&nbsp;<br>
TabbedNotebook,&nbsp;and&nbsp;give&nbsp;the&nbsp;three&nbsp;pages&nbsp;the&nbsp;names&nbsp;&quot;Currency&quot;,&nbsp;&quot;Date&quot;&nbsp;and&nbsp;&nbsp;<br>
&quot;Time&quot;.&nbsp;Next,&nbsp;we&nbsp;must&nbsp;drop&nbsp;a&nbsp;label&nbsp;on&nbsp;each&nbsp;of&nbsp;the&nbsp;pages,&nbsp;set&nbsp;autosize&nbsp;for&nbsp;&nbsp;<br>
each&nbsp;label&nbsp;to&nbsp;false,&nbsp;and&nbsp;make&nbsp;them&nbsp;about&nbsp;as&nbsp;big&nbsp;as&nbsp;the&nbsp;entire&nbsp;notebook&nbsp;(so&nbsp;&nbsp;<br>
multiple&nbsp;lines&nbsp;can&nbsp;be&nbsp;viewed).&nbsp;The&nbsp;source&nbsp;code&nbsp;for&nbsp;the&nbsp;form&nbsp;merely&nbsp;consists&nbsp;&nbsp;<br>
of&nbsp;putting&nbsp;the&nbsp;right&nbsp;values&nbsp;on&nbsp;the&nbsp;right&nbsp;places&nbsp;when&nbsp;the&nbsp;form&nbsp;is&nbsp;created&nbsp;(in&nbsp;&nbsp;<br>
the&nbsp;OnCreate&nbsp;handler),&nbsp;so&nbsp;nothing&nbsp;complex&nbsp;at&nbsp;all&nbsp;for&nbsp;the&nbsp;interface&nbsp;side&nbsp;of&nbsp;&nbsp;<br>
the&nbsp;SysInfo&nbsp;Wizard.&nbsp;The&nbsp;engine&nbsp;of&nbsp;TSysInfoExpert&nbsp;is&nbsp;as&nbsp;follows:&nbsp; 
&nbsp;<br>
&nbsp;<br>
&nbsp;<br>
TSysInfoExpert&nbsp; &nbsp;<br>
GetStyle:&nbsp;esStandard&nbsp; &nbsp;<br>
GetIDString:&nbsp;DrBob.TSysInfoExpert&nbsp; &nbsp;<br>
GetName:&nbsp;SysInfo&nbsp;Wizard&nbsp; &nbsp;<br>
GetAuthor&nbsp;(win32):&nbsp;Bob&nbsp;Swart&nbsp;(aka&nbsp;Dr.Bob)&nbsp; &nbsp;<br>
GetMenuText:&nbsp;&amp;SysInfo&nbsp;Wizard...&nbsp; &nbsp;<br>
GetState:&nbsp;[esEnabled]&nbsp; &nbsp;<br>
GetGlyph:&nbsp;0&nbsp; &nbsp;<br>
GetPage&nbsp;(win32):&nbsp;&nbsp;&nbsp; &nbsp;<br>
GetComment:&nbsp;&nbsp;&nbsp; &nbsp;<br>
&nbsp;<br>
The&nbsp;Execute&nbsp;method&nbsp;of&nbsp;the&nbsp;SysInfo&nbsp;Wizard&nbsp;is&nbsp;almost&nbsp;as&nbsp;easy,&nbsp;since&nbsp;all&nbsp;we&nbsp;need&nbsp;&nbsp;<br>
to&nbsp;do&nbsp;is&nbsp;to&nbsp;create,&nbsp;show&nbsp;and&nbsp;free&nbsp;the&nbsp;form&nbsp;with&nbsp;the&nbsp;desired&nbsp;information.&nbsp;&nbsp;<br>
That's&nbsp;it.&nbsp;The&nbsp;source&nbsp;code&nbsp;for&nbsp;the&nbsp;Execute&nbsp;procedure&nbsp;is&nbsp;as&nbsp;follows:&nbsp; 
&nbsp;<br>
&nbsp;<br>
&nbsp;<br>
&nbsp;&nbsp;procedure&nbsp;TSysInfoExpert.Execute; &nbsp;<br>
&nbsp;&nbsp;begin &nbsp;<br>
&nbsp;&nbsp;&nbsp;&nbsp;with&nbsp;TSysInfoForm.Create(nil)&nbsp;do &nbsp;<br>
&nbsp;&nbsp;&nbsp;&nbsp;begin &nbsp;<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ShowModal; &nbsp;<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Free &nbsp;<br>
&nbsp;&nbsp;&nbsp;&nbsp;end &nbsp;<br>
&nbsp;&nbsp;end&nbsp;{Execute}; &nbsp;<br>
&nbsp;<br>
And&nbsp;presto!&nbsp;Our&nbsp;first&nbsp;&quot;useful&quot;&nbsp;Wizard,&nbsp;showing&nbsp;information&nbsp;at&nbsp;design&nbsp;time&nbsp;&nbsp;<br>
that&nbsp;isn't&nbsp;available&nbsp;any&nbsp;other&nbsp;way:&nbsp; &nbsp;<br>
&nbsp;<br>
&nbsp; &nbsp;<br>
This&nbsp;is&nbsp;only&nbsp;the&nbsp;first&nbsp;of&nbsp;many&nbsp;examples&nbsp;where&nbsp;we&nbsp;will&nbsp;see&nbsp;an&nbsp;Wizard&nbsp;engine&nbsp;&nbsp;<br>
that&nbsp;will&nbsp;show&nbsp;an&nbsp;interface&nbsp;form&nbsp;to&nbsp;show&nbsp;(or&nbsp;get)&nbsp;information&nbsp;to&nbsp;the&nbsp;user.&nbsp;&nbsp;<br>
One&nbsp;source&nbsp;of&nbsp;information&nbsp;to&nbsp;provide&nbsp;(or&nbsp;actions&nbsp;to&nbsp;apply)&nbsp;can&nbsp;be&nbsp;obtained&nbsp;&nbsp;<br>
from&nbsp;the&nbsp;so-called&nbsp;toolservices&nbsp;interface&nbsp;Delphi&nbsp;offers&nbsp;us&nbsp;in&nbsp;the&nbsp;&nbsp;<br>
TIToolServices&nbsp;class.&nbsp; &nbsp;<br>
&nbsp;<br>
4.&nbsp;ToolServices &nbsp;<br>
We've&nbsp;seen&nbsp;some&nbsp;generic&nbsp;but&nbsp;in&nbsp;fact&nbsp;pretty&nbsp;much&nbsp;useless&nbsp;Wizard&nbsp;so&nbsp;far.&nbsp;In&nbsp;&nbsp;<br>
order&nbsp;to&nbsp;write&nbsp;truly&nbsp;more&nbsp;useful&nbsp;Wizards,&nbsp;we&nbsp;need&nbsp;to&nbsp;do&nbsp;something&nbsp;special&nbsp;&nbsp;<br>
inside&nbsp;the&nbsp;Execute&nbsp;method,&nbsp;like&nbsp;show&nbsp;a&nbsp;(more)&nbsp;interesting&nbsp;form&nbsp;in&nbsp;which&nbsp;a&nbsp;lot&nbsp;&nbsp;<br>
of&nbsp;things&nbsp;can&nbsp;happen,&nbsp;a&nbsp;bit&nbsp;like&nbsp;we&nbsp;introduced&nbsp;with&nbsp;the&nbsp;TSysInfoExpert. 
&nbsp;<br>
Did&nbsp;you&nbsp;ever&nbsp;feel&nbsp;the&nbsp;need&nbsp;to&nbsp;load&nbsp;some&nbsp;project&nbsp;other&nbsp;than&nbsp;a&nbsp;.DPR&nbsp;file&nbsp;in&nbsp;the&nbsp;&nbsp;<br>
IDE?&nbsp;No?&nbsp;Never&nbsp;written&nbsp;any&nbsp;DLLs&nbsp;in&nbsp;Delphi?&nbsp;Well,&nbsp;I&nbsp;often&nbsp;have&nbsp;the&nbsp;need&nbsp;to&nbsp;&nbsp;<br>
open&nbsp;a&nbsp;.PAS&nbsp;or&nbsp;any&nbsp;file&nbsp;with&nbsp;an&nbsp;extension&nbsp;other&nbsp;than&nbsp;.DPR&nbsp;inside&nbsp;the&nbsp;IDE&nbsp;as&nbsp;&nbsp;<br>
my&nbsp;project.&nbsp;In&nbsp;fact,&nbsp;my&nbsp;need&nbsp;is&nbsp;so&nbsp;big,&nbsp;I&nbsp;want&nbsp;to&nbsp;write&nbsp;an&nbsp;Wizard&nbsp;to&nbsp;help&nbsp;me&nbsp;&nbsp;<br>
in&nbsp;browsing&nbsp;over&nbsp;my&nbsp;disk&nbsp;and&nbsp;directories&nbsp;in&nbsp;search&nbsp;for&nbsp;a&nbsp;certain&nbsp;file&nbsp;to&nbsp;open&nbsp;&nbsp;<br>
as&nbsp;a&nbsp;new&nbsp;project. &nbsp;<br>
But&nbsp;is&nbsp;this&nbsp;possible?&nbsp;To&nbsp;answer&nbsp;this&nbsp;question,&nbsp;we&nbsp;need&nbsp;to&nbsp;take&nbsp;a&nbsp;look&nbsp;at&nbsp;&nbsp;<br>
TOOLINTF.PAS&nbsp;from&nbsp;Delphi&nbsp;1.0,&nbsp;the&nbsp;file&nbsp;that&nbsp;contains&nbsp;the&nbsp;definition&nbsp;of&nbsp;&nbsp;<br>
TIToolServices&nbsp;(the&nbsp;&quot;I&quot;&nbsp;stands&nbsp;for&nbsp;Interface&nbsp;again),&nbsp;which&nbsp;is&nbsp;as&nbsp;follows:&nbsp; 
&nbsp;<br>
&nbsp;<br>
&nbsp;<br>
unit&nbsp;ToolIntf; &nbsp;<br>
interface &nbsp;<br>
uses &nbsp;<br>
&nbsp;&nbsp;WinTypes,&nbsp;VirtIntf; &nbsp;<br>
&nbsp;<br>
Type &nbsp;<br>
&nbsp;&nbsp;TIToolServices&nbsp;=&nbsp;class(TInterface) &nbsp;<br>
&nbsp;&nbsp;public &nbsp;<br>
&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;Action&nbsp;interfaces&nbsp;} &nbsp;<br>
&nbsp;&nbsp;&nbsp;&nbsp;function&nbsp;CloseProject:&nbsp;Boolean;&nbsp;virtual;&nbsp;export;&nbsp;abstract; 
&nbsp;<br>
&nbsp;&nbsp;&nbsp;&nbsp;function&nbsp;OpenProject(const&nbsp;ProjName:&nbsp;string):&nbsp;Boolean;&nbsp;virtual;&nbsp;export;&nbsp;&nbsp;<br>
abstract; &nbsp;<br>
&nbsp;&nbsp;&nbsp;&nbsp;function&nbsp;OpenProjectInfo(const&nbsp;ProjName:&nbsp;string):&nbsp;Boolean;&nbsp;virtual;&nbsp;&nbsp;<br>
export;&nbsp;abstract; &nbsp;<br>
&nbsp;&nbsp;&nbsp;&nbsp;function&nbsp;SaveProject:&nbsp;Boolean;&nbsp;virtual;&nbsp;export;&nbsp;abstract; 
&nbsp;<br>
&nbsp;&nbsp;&nbsp;&nbsp;function&nbsp;CloseFile(const&nbsp;FileName:&nbsp;string):&nbsp;Boolean;&nbsp;virtual;&nbsp;export;&nbsp;&nbsp;<br>
abstract; &nbsp;<br>
&nbsp;&nbsp;&nbsp;&nbsp;function&nbsp;SaveFile(const&nbsp;FileName:&nbsp;string):&nbsp;Boolean;&nbsp;virtual;&nbsp;export;&nbsp;&nbsp;<br>
abstract; &nbsp;<br>

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -