Delphi中VCL库的原架构师Chuck Jazdzewski回忆Delphi 1的开发原则

1995年2月14日情人节。

我坐在Moscone中心正厅的前排。灯光刚刚变暗,人群中一片寂静。数千人突然全神贯注地注视着舞台。照相机熄灭,发出预料中的杂音。然后,安德斯(Anders)(注:Delphi和C#设计师)上台并开始演示。

我之前或之后从未经历过类似的经历。我既紧张又兴奋。我们建立了每个人的期望,我希望我们不会令他们失望。

显然我们没有。似乎在每一个功能上,安德斯(Anders)都表现出人们的欢呼,而当安德斯(Anders)表明Delphi本身就是一个Delphi开发的应用程序时,我们受到了热烈的欢迎。我知道我们做了出色的事。我将永远为之骄傲。

是的!我们度过了一个令人惊叹的夜晚,用了大约2年开发时间。那是我花所有时间最多的一个版本,比我们原先计划的要花一年多的时间,但是我们完成了,感觉非常非常好。

好了,快完成了。Delphi的第一个版本要等到14日的两周后的3月1日才发布,而我们仍处于最终批准该产品的阶段,但我们尚未完成。有几个“构建中止”错误需要修复,而我记得,马克·库西纳(Marc Cousineau)是最后一个站着的人。他错过了那天晚上。我们在那里想念他,但他拿了最后几发子弹,所以我们其他人都可以玩得开心。谢谢马克!

我们怎么知道我们选择的功能是正确的?我们怎么知道我们完成了?

构建产品的最大挑战通常不是做什么,而是弄清楚您不必做什么。在可以构建的所有功能中,应该构建哪个?哪些可以等待,哪些不能等待?即使在'95,也就是Windows '95发生翻天覆地变化的6个月之前,Windows API仍然庞大而复杂。我们应该包装API的哪些部分,我们应该忽略哪些部分?

我们所做的就是应用80/20规则,或者据我后来了解到,这被称为帕累托原理。将其应用到Windows API之类的东西意味着在80%的时间中大约只有20%的API被使用。这意味着我们不必包装所有东西,只需要找出那20%。或者,正如安德斯(Anders)喜欢说的那样,我们需要争取最大的收益。

但是,20%的时间使用的其他80%的API呢?我们知道两件事。首先,我们永远没有时间将其全部包装。我们没有人,也无法跟上像微软这样多产的公司生产产品的包装纸。其次,无法编写价值不超过80%的应用程序。这导致了原理,

  • 使简单的事情变得简单。
  • 使困难的事情成为可能。

该原则在实践中最直接的示例是具有该  Graphics 单位的单位  TCanvas 及其相关类。Graphics 包裹基础Windows API句柄的所有  类均通过适当命名的Handle 属性公开该句柄  。对于高级封装,这在当时是独一无二的。允许用户使用该手柄进行几乎任何操作,并且基础对象将相应地进行调整。我和Anders花费了大量时间来实现这一目标;使容易的事情变得容易,而使困难的事情变得可能。 TCanvas 使用 DC很简单,公开我们使用的基础句柄使我们无法包装调用API。您可以看到在整个VCL中都应用了此原理,暴露了底层的句柄以使困难的事情变为可能,颈椎枕即使这样做并非易事。

如前所述,我们有意使VCL可扩展。我们没有人来包装所有东西,而是希望我们的用户能够构建或购买创建应用程序所需的组件。允许使用与编写其余应用程序时相同的语言来编写组件,这意味着我们为特定于应用程序的封装大大降低了门槛。

我们从1993年初开始使用Delphi,后来在那个冬天的某个时候被锁定并加载了版本。实际上,我们花了很长时间才获得了看起来像Delphi的东西并开始运行。我记得我们在1993年7月向一群工程师进行的演示,向他们展示了当时的情况。它包括组件面板,表单设计器和基本编辑器,甚至还包括我们后来称为双向编辑的东西。

编辑器实际上只是一个  TEdit 非常初级的人员!到了七月,不仅是我和安德斯了。我们决定取消有关Borland Pascal 8.0的工作,而完全专注于Delphi。Allen Bauer和Alex Shtaygrud开始从事调试器和编辑器的工作(解释为什么使用TEdit),而Dave Scofield开始使我的IDE挑毛病  看起来更美观。具有讽刺意味的是,开发人员在其大部分职业生涯中都在构建UI库和框架,却无法创建外观精美的UI来挽救生命。

会议结束后,我记得一位软件开发工程师说我们应该立即发货并立即发货!我们受到鼓舞,但知道我们为使Delphi 1进入可发布状态付出了很多努力。欢迎加入Delphi知识局QQ群:32422310

ListView 排序 Stringgrid内使用回车键代替Tab键 TListBox内显示分栏 TListBox每一行显示交互的颜色 TMemo内光标位置根据鼠标移动 TMemo自动卷动 TRichEdit卷到特定位置 TRxRichEdit内插入图像 TStringGrid插入、删除一行 TStringGrid保存和装载 TTreeview控件显示粗体节点 TWebBrowser调用“查找”对话框 为Listview栏添加双击事件 为工具栏的TToolButton设置新的索引 仅通过Classname创建和管理任意窗体 从RichEdit取Rtf格式 从TListBox拖放项目到TRichEdit 从一个TRichedit复制格式Rtf文本到其它 使用CustomSort方法排序TListView 使用DBGrid字段队列同步列标题队列 使用Interfaces和TInterfaceList 使用TRichEdit存储大于64K数据 使用代码移动StringGrid的行和列 使用圆形角显示控件 使用类名显示窗体 保存 装载TCheckListbox值 保存和装载TListView 保存和装载TTreeView 允许TDBGrid栏调整大小但防止移动 克隆控件 克隆窗体 列出控件的所有属性和事件 创建可编辑ListBox 删除Listbox的所有选定项目 删除stringlist重复项目 删除TStringGrid的列 动画窗体 取ComboBox List句柄 取TListview内所有选定项目 取TShellListView选定文件的路径 取列举值的名称 在combobox实现autocomplete 在DBGrid使用回车键改变到下一个段 在listbox内列出所有目录、文件和驱动器 在Listbox内显示水平滚动条 在memo实现UNDO 在RichEdit内搜索文本并选择它 在StringGrid内使用Combobox作为编辑器 在StringGrid单元画不同颜色 在TComboBox显示栏 在TComboBox内绘制位图 在TDateTimePicker内显示星期几 在TFileListBox内显示多列 在TListBox创建彩色项目 在TListBox内拖拽 在TListbox内绘制位图 在TListview内执行二进制搜索 在TListView内拖拽多个项目 在TListView列创建进度条 在TMemo内查看和编辑MS-DOS文本 在TPageControl拖拽Tabs 在TPrintDialog上放置定制控件 在TRichEdit内使用上标和下标 在TRichEdit内使用超链接 在TRichEdit内文本使用不同的下划线样式 在TRichedit内设置段落行距 在TStringGrid内删除一行 在TStringGrid实现OnColumnClick事件 在自己的控件显示信息 复制Listbox项目到剪贴板 失效TTreeview的tooltips 定制TDateTimePicker的格式 居控件 屏蔽在EditBox内按回车键的都都声 强制在TEdit内输入 排序StringGrid 搜索和替换RichEdit文本 搜索和选定TListBox的项目 改变TDBGrid的DefaultRowHeight 改变TRichEdit内选定文本的背景颜色 改变TStringGrid内选定单元的颜色 改变标准对话框 改变状态栏字体样式 改变窗体上所有控件的属性 改变进度条颜色 根据StringGrid列内容自动调整大小 根据列排序TStringGrid 检查Stringgrid指定单元示范选定 检查TMemo能否取消操作 检查TreeView是否完全展开或折叠 检查TStringGrid是否有滚动条 添加接口对象到list 清空StringGrid的所有单元 移动listbox项目 移动TListView项目 移动TRichEdit内光标到指定位置 聚焦TDBGrid某些单元 自动打开TDateTimePicker 自定义Memo边界 获取TRichEdit鼠标指针下面的字 访问TRadioGroup的控件 调整TComboBox下拉列表的宽度 转换Editbox的首字符为大写 转换TEdit每个词的首字母为大写 输出TStringGrid到TListView 运行时创建TButtons队列 运行时创建控件 运行时创建菜单项 运行时替换控件 返回TTreeView内字符串路径 防止在TEdit内剪贴、复制、粘贴 防止用户调整TListView栏大小 限制TEdit的输入 隐藏TListView滚动条 隐藏最小化MDI子窗口 颜色Combo Box 验证TEdit输入的是数字
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值