VCL控件,事件指定的问题

wg961423 2012-08-15 01:47:50
如题,按老妖的文章:如何自画ListView的Item(XP效果) http://www.ccrun.com/article.asp?i=656&d=qdc7kg 上的,可以指定,但当CrnDrawListViewItem定义为全局时(因为有好多Form和Frame都要用到这个),却无法通过编译,这是为什么啊?

Unit1.h:

void __fastcall CrnDrawListViewItem(TCustomListView *Sender,
TListItem *Item, TRect &Rect, TOwnerDrawState State)
{
//老妖的文章里是定义在TForm1的private里的
//void __fastcall TForm1::CrnDrawListViewItem(TCustomListView *Sender,TListItem *Item, TRect &Rect, TOwnerDrawState State)
}


Unit1.cpp

__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
ListView1->OwnerDraw = true;
ListView1->RowSelect = true;
ListView1->ReadOnly = true;
ListView1->OnDrawItem =(TLVDrawItemEvent)&CrnDrawListViewItem;
}

报错内容为:
[BCC32 Error] Unit1.cpp(18): E2031 Cannot cast from 'void (_fastcall *)(TCustomListView *,TListItem *,TRect &,TOwnerDrawState)' to 'TLVDrawItemEvent'
Full parser context
Unit1.cpp(13): parsing: _fastcall TForm1::TForm1(TComponent *)
...全文
155 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
ccrun.com 2012-08-15
  • 打赏
  • 举报
回复
最简单的方法就是我在7楼说的,将函数放在一个DataModule中即可,其他单元共用这个数据模块。
ccrun.com 2012-08-15
  • 打赏
  • 举报
回复
myevent需要在.h文件中用extern声明,然后在.cpp中定义就可以了。
wg961423 2012-08-15
  • 打赏
  • 举报
回复
又试了一下,把struct TMyevent myevent;移到unit1去,就可以了
wg961423 2012-08-15
  • 打赏
  • 举报
回复
用ksrsoft的方法可以实现,但在2010里会报下面的警告,这个要如何解决呢?

[ILINK32 Warning] Warning: Public symbol '_myevent' defined in both module E:\PROJECTS\DEBUG\UNIT1.OBJ and E:\PROJECTS\DEBUG\UNIT2.OBJ
缘中人 2012-08-15
  • 打赏
  • 举报
回复
新建一个单元文件,写上类和函数的定义,然后其他单元引用此即可。其他单元进行赋值,
看这个例子
unit2是公共单元

---h文件
#ifndef Unit2H
#define Unit2H
#include <Classes.hpp>
#include <Controls.hpp>
#include <StdCtrls.hpp>
#include <Forms.hpp>
#include <Dialogs.hpp>
//---------------------------------------------------------------------------
struct TMyevent
{
public:
int a;
void __fastcall Button1Click(TObject *Sender);

};

struct TMyevent myevent;
#endif

----cpp文件


#pragma hdrstop

#include "Unit2.h"

#pragma package(smart_init)

void __fastcall TMyevent::Button1Click(TObject *Sender)
{
ShowMessage("hellO");
}



unit1调用


#include <vcl.h>
#pragma hdrstop

#include "Unit1.h"
#include "Unit2.h"
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
}

void __fastcall TForm1::FormCreate(TObject *Sender)
{
Button1->OnClick = myevent.Button1Click;
}
ccrun.com 2012-08-15
  • 打赏
  • 举报
回复
VCL的事件处理函数必须是一个类成员函数。楼主可以考虑把绘制的函数放在一个DataModule的public中,然后各个Form包含了DataModule的头文件以后,就可以使用这个事件处理函数了。
wg961423 2012-08-15
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 的回复:]

引用 2 楼 的回复:

我是直接写在.h里的,但引用时报错。

不是把事件函数定义成全局函数,而是在每个事件函数引用全局函数
[/Quote]

有N多个Form,每个Form里有1到2个ListView啊,这要改死了啊。
wg961423 2012-08-15
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 的回复:]

先放到TForm1的public里试试。
因为public所以外部也可以访问到。
赋值的时候
....=Form1->CrnDrawListViewItem;
[/Quote]

目前的情况是:程序改为了EXE+BPL的方式,所以CrnDrawListViewItem是写在公共BPL包里的,公共BPL包里全是全局定义,没有Form,所以。。。
dataxdata 2012-08-15
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 的回复:]

我是直接写在.h里的,但引用时报错。
[/Quote]
不是把事件函数定义成全局函数,而是在每个事件函数引用全局函数
缘中人 2012-08-15
  • 打赏
  • 举报
回复
先放到TForm1的public里试试。
因为public所以外部也可以访问到。
赋值的时候
....=Form1->CrnDrawListViewItem;
wg961423 2012-08-15
  • 打赏
  • 举报
回复
我是直接写在.h里的,但引用时报错。
dataxdata 2012-08-15
  • 打赏
  • 举报
回复
当需要共享一个函数的时候,可以定义一个全局函数,然后在每个相关控件的事件函数中引用这个函数
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中输入的是数字
QReportMaker是一个自动生成QuickRep报表的VCL控件包,适用于数据表打印、表单、票据打印、文档打印及自绘的报表打印,包含TQMPrintDataSet、TQMPrintEhGrid、TQMPrintDBGrid、TQMPrintStringGrid、TQMPrintControl、TQMPrintRichText、TQMPrintQuickRep等组件,可以在Delphi5,6,7和C++Builder5,6中使用。1.快速制作报表,只需要指定所需打印的控件就基本完成了报表的制作。 2.提供丰富的页面设置功能,所有设置都可以保存,包括: >>常规的纸张高、宽、边距、方向设置; >>提供打印栏数设置,支持多栏打印; >>可设置整个报表的颜色模式、色彩浓度; >>提供横向压缩、扩展到一页的功能,也可以对报表按比例整体缩放; >>其他设置:报表页面居中,整体改变字体等。 3.提供简洁、朴素且功能齐全的打印预览界面。 4.提供页眉、页脚、表头、注脚、报表标题、子标题、公司微标等设置。 5.提供多种参数、变量,如页码{#PageNumber}、自定义参数,你甚至可以直接取控件的属性值,如{Label1.Caption}。 6.在设计期就可以将报表绘制到QuickRep上(如果你用QuickRep做过报表一定会觉得这个功能很神奇)。 7.运行期可设置数据列的属性(是否显示、列宽、对齐方式),这些设置同样可以保存。 8.提供数据列(Columns)的多种设置,如格式化、是否隐藏零等,在字段属性中还可以使用QuickRep的函数及表达式。 9.支持多重表头打印,可轻松设置成套打报表、统计类报表、英文报表等多种格式的数据报表。 10.提供多种语言版本,英文、中文简体、中文繁体版。
本产品对于那些没有指定Left、Top、Height和Width参数,或者以上属性没有和大小重新调整关联的第三方控件,也同样能够使用,如:表格中的单元格以及Spread应用程序。在这些情况下,您可以在通过在ExitResize事件指定控件或者字体尺寸,来实现对它们的大小重新调整。具体情况,您可以参考本产品自带的示例程序。 产品征特如下所示: 自动调整窗体中所有的控件以及字体的大小。 本产品的使用非常方便,您只需要简单地把ResizeKit控件放入窗体,不需要重新设计或者添加任何的代码。 使用本产品,您可以创建窗体大小与屏幕解析度无关的应用程序。 您可以指定窗体的最大以及最小尺寸。 您可以指定窗体的初始化位置。 您也可以将窗体中的某些控件和字体不参与大小重新调整。 运行时免专利使用费(royalty-free)许可,不限制您的应用程序发布数量。 由于本产品的ActiveX组件基于活动模板库(ATL),所以它运行速度快、轻量级。 本产品的VCL组件拥有统一的.EXE扩展名,所以应用程序可以分布于同一简单单元。 适用于大多数的第三方控件产品,而无需添加任何附加代码。 包含有一系列的属性、方法和事件,允许您自定义大小重新调整过程 产品中包含了一些自带的示例程序。

13,825

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder相关内容讨论区
社区管理员
  • 基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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