delphi 和 vcl 中的几个问题

geodgehoul 2003-08-20 05:11:24
鼓捣delphi一年多了,以为对delphi 有一定的熟悉了 今天才发现原来什么都不知道,以下应该都是简单问题,但就是没明白,等搞明白了 我散分给大家
1. Application 是在Form单元中声明的Tapplication 型变量,这个东东是在什么
地方实例化的 Application.Initialize 做了些什么事情

2.以下是Tapplication.CreateForm的代码
procedure TApplication.CreateForm(InstanceClass: TComponentClass; var Reference);
var
Instance: TComponent;
begin
Instance := TComponent(InstanceClass.NewInstance);
TComponent(Reference) := Instance;
try
Instance.Create(Self);
except
TComponent(Reference) := nil;
raise;
end;
if (FMainForm = nil) and (Instance is TForm) then
begin
TForm(Instance).HandleNeeded;
FMainForm := TForm(Instance);
end;
end;
2.1 var Reference 没有说明类型是怎么回事 从来没有见过好像也没有哪本书提到过
2.2 Instance := TComponent(InstanceClass.NewInstance) 难道不是实例化了一个Tcomponent对象吗?如果不是那他是干什么的?
2.3 Instance.Create(Self) 这一句该如何解释? 变量不能自己实例化自己啊 不明白
2.4 TComponent(Reference) := Instance; 这个是什么意思啊 ?
...全文
72 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
zjybestzjybest 2003-08-22
  • 打赏
  • 举报
回复
procedure TApplication.CreateForm(InstanceClass: TComponentClass; var Reference);
var
Instance: TComponent;
begin
Instance := TComponent(InstanceClass.NewInstance);
//注意InstanceClass
//实际上是一个类引用,而NewInstance实际上是一个类方法
//类方法在C++中为一个STATIC的函数
//这一句的作用实际上是创造一个指定类的实例
TComponent(Reference) := Instance;
//对无类型的参数强制转直
try
//注意SELF在对象方法中
//强制制订对象的OWNER为APPLICAION
Instance.Create(Self);

except
TComponent(Reference) := nil;
raise;
end;
//第一个调用这个方法 TApplication.CreateForm的创建的窗口为主窗口
//Instance is TForM保证所创建的是一个TFORM的子类才把他做为子窗口
if (FMainForm = nil) and (Instance is TForm) then
begin
TForm(Instance).HandleNeeded;
FMainForm := TForm(Instance);
end;
end;
xtao 2003-08-21
  • 打赏
  • 举报
回复
有关 InitProc  请参考DBTables.pas 的initialization部分代码
sharesky 2003-08-21
  • 打赏
  • 举报
回复
感谢让我开眼界
delphi_xizhousheng 2003-08-20
  • 打赏
  • 举报
回复
老大都说了
我就说头两句
Instance := TComponent(InstanceClass.NewInstance); //创建了一个TComponent实例
TComponent(Reference) := Instance; //将Reference强制转化成该实例,Reference可以理解为TObject类型
ehom 2003-08-20
  • 打赏
  • 举报
回复
1,从字面上理解,它的意思就是初始化,但是仔细看看相关VCL,就知道通常这句什么也不做,一般情况下可以去掉!

procedure TApplication.Initialize;
begin
if InitProc <> nil then TProcedure(InitProc);
end;

因为上面的InitProc一开始等于nil

要用的话在

initialization

区域下写上类似代码即可:
InitProc := @MyInitProc;

MyInitProc是你希望在初始化阶段调用的过程:procedure MyInitProc;

2.1,

确实可以这么用,既然没定义就是无类型啊,所以后面用TComponent()强制转换为了TComponent实例

procedure Test(var i);
begin
ShowMessage(IntToStr(Integer(i)));
end;

Test(n);

自己试试吧

2.2,

NewInstance方法用来分配实例内存,加上TComponent用于返回一个TComponent实例的对象指针

2.3,

Self不是指自己,而是指Application,这里是指明Instance的宿主

2.4,

赋值,因为var Instance: TComponent;,做个类型转换

综合理解,以Application.CreateForm(TForm1, Form1);为例,就是

调用TForm1的方法完成内存分配,把实例的指针返回给Form1,如果还未指定主窗体,把当前窗体设为主窗体
Delphi构建进销存系统——POS系统开发实例》配书盘 1.系统环境要求 Windows98或WinNT4/5或以上版本 MS Access 2000或以上版本 Delphi5.0或以上版本 2. 安装必要的文件和VCL组件包   在硬盘建立一个目录,然后将光盘所有文件拷贝到该目录下,取消所有文件和子目录的只读属性,再进行如下配置(以下所指的$DLEPHI就代表所创建的目录): (1)将$DLEPHI\VCL\PIC\eztw32.dll文件拷贝至Windows的系统目录。 Win9X:一般为$Windows\System\ WinNT:一般为$WinNT\System32\ (2)配置DELPHI IDE环境选项的搜索路径,加入以下几个目录: $DELPHI\UTILITY $DELPHI\VCL $DELPHI\VCL\db_vcl $DELPHI\VCL\dbse $DELPHI\VCL\dsn $DELPHI\VCL\pic $DELPHI\VCL\std $DELPHI\VCL\twn40 配置DELPHI IDE环境选项的库路径,加入以下几个目录: $DELPHI\UTILITY $DELPHI\VCL $DELPHI\VCL\db_vcl $DELPHI\VCL\dbse $DELPHI\VCL\dsn $DELPHI\VCL\pic $DELPHI\VCL\std $DELPHI\VCL\twn40 (3)安装$DELPHI\UTILITY\J_UTL.DPK组件包 (4)按照顺序安装以下组件包: $DELPHI\VCL\TWN40\TWN.DPK $DELPHI\VCL\PIC\PIC.DPK $DELPHI\VCL\STD\STD.DPK $DELPHI\VCL\DB_VCL\DB_VCL.DPK $DELPHI\VCL\DBSE\DBSE.DPK $DELPHI\VCL\DSN\DSN.DPK 3.配置ODBC 使用ODBC管理器创建名为“MICROPOS”和“MICROIVTT”两个MS Access的连接,分别指向$DELPHI\MICROPOS\DATA\POS.MDB和$DELPHI\MICROPOS\DATA\IVTT.MDB 4.打开$DELPHI\MICROPOS\POS.DPR 工程即可 5.本程序使用了jEdit控件,此控件本身的BUG会导致在按下功能键前无法编辑其他内容,建议读者使用其他的控件。 6.本书为引进台湾版权产品,其程序由台湾作者开发,经过我们测试发现POS程序有些问题(主要指日期输入),另外本程序还可能有其他的隐含问题。由此给读者带来的不便,敬请谅解。
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输入的是数字

5,386

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 开发及应用
社区管理员
  • VCL组件开发及应用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧