表格控件TDrawGrid的使用方法求助

KevinDLiu 2012-12-05 12:39:49
领导让写一个数据处理程序,我用的是C++ Builder 6。
其中的功能是将一个十六进制文件打开,并将所有的数据显示在一个16列×n行的表格中。
文件中的所有数据已经被我读到一个字符串数组中。
原先用的是TStringGrid控件,用逐个给格子赋值的方法(TStringGrid1->cells[i][j] = Buffer[k])可以实现。但是由于数据量大,运行时速度很慢,而且当行数达到300000行的时候,运行时会显示内存错误。

现换成TDrawGrid方法,打算使用OnDrawGrid事件将数据显示出来。在网上找不到这个组件的资料。
请问各位大神,这个方法怎么使用?
还有,作为一个刚毕业的学生,自学起来还真痛苦,有没有什么好书或者强大点的帮助文档可以推荐的?
...全文
753 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
KevinDLiu 2012-12-05
  • 打赏
  • 举报
回复
引用 2 楼 ccrun 的回复:
本帖最后由 ccrun 于 2012-12-05 14:19:49 编辑 Form上放置一个DrawGrid,两个Button,然后: 头文件中: C/C++ code?123private: // User declarations byte *m_Buffer; // 用来存放文件内容的缓冲 int m_Buff……
如果能指导下C++ Builder怎么入门,还有在写程序时遇到不会的组件时,到哪可以查到资料。小弟感激不尽!
KevinDLiu 2012-12-05
  • 打赏
  • 举报
回复
引用 8 楼 ccrun 的回复:
引用 7 楼 liuqifeng2012 的回复:或者说,重画需要什么事件进行触发呢? 对于DrawGrid来说,如果有窗口挡在它所在的窗体上面以后再挪开的时候,它会自动重绘。或者所在窗口最小化后还原,或者从屏幕边缘挪到屏幕可视区的时候。 在你的需求中,如果读了新文件要在DrawGrid中重新显示新数据,就得手动让它触发一下重绘。
谢谢版主,真的太感谢了,回答地特仔细,打算长期驻扎CSDN论坛~~~膜拜下大神!
ccrun.com 2012-12-05
  • 打赏
  • 举报
回复
引用 7 楼 liuqifeng2012 的回复:
或者说,重画需要什么事件进行触发呢?
对于DrawGrid来说,如果有窗口挡在它所在的窗体上面以后再挪开的时候,它会自动重绘。或者所在窗口最小化后还原,或者从屏幕边缘挪到屏幕可视区的时候。 在你的需求中,如果读了新文件要在DrawGrid中重新显示新数据,就得手动让它触发一下重绘。
KevinDLiu 2012-12-05
  • 打赏
  • 举报
回复
或者说,重画需要什么事件进行触发呢?
KevinDLiu 2012-12-05
  • 打赏
  • 举报
回复
引用 5 楼 ccrun 的回复:
1. DrawGrid1->Canvas->TextRect(Rect, Rect.Left + 4, Rect.top + 2, strText); 在Rect区域内绘制文字strText,左偏移4个像素,上偏移2个像素(空开一点好看而已)。 2. 对于DrawGrid控件来说,要显示的内容发生了变化,但是DrawGrid并不知道的情况下,需要告诉它重绘以响应数……
谢谢版主,在什么情况下,DrawGrid内容变化的时候,它会知道和不知道呢?
ccrun.com 2012-12-05
  • 打赏
  • 举报
回复
1. DrawGrid1->Canvas->TextRect(Rect, Rect.Left + 4, Rect.top + 2, strText); 在Rect区域内绘制文字strText,左偏移4个像素,上偏移2个像素(空开一点好看而已)。 2. 对于DrawGrid控件来说,要显示的内容发生了变化,但是DrawGrid并不知道的情况下,需要告诉它重绘以响应数据的变化。调用DrawGrid的Invalidate方法,就是让其重新绘制。
KevinDLiu 2012-12-05
  • 打赏
  • 举报
回复
引用 2 楼 ccrun 的回复:
本帖最后由 ccrun 于 2012-12-05 14:19:49 编辑 Form上放置一个DrawGrid,两个Button,然后: 头文件中: C/C++ code?123private: // User declarations byte *m_Buffer; // 用来存放文件内容的缓冲 int m_Buff……
谢谢版主的回复, 1、DrawGrid1->Canvas->TextRect(Rect, Rect.Left + 4, Rect.top + 2, strText);这条语句看不懂 2、还有这个DrawGrid1->Invalidate();//重新绘制。TDrawGrid在什么情况下会重新绘制呢?
ccrun.com 2012-12-05
  • 打赏
  • 举报
回复
来个效果图:
ccrun.com 2012-12-05
  • 打赏
  • 举报
回复
Form上放置一个DrawGrid,两个Button,然后:
头文件中:
private:	// User declarations
byte *m_Buffer; // 用来存放文件内容的缓冲
int m_BufferLen; // 缓冲的长度


.cpp文件中:
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
m_BufferLen = 0;

// 初始化DrawGrid
DrawGrid1->DefaultColWidth = 20;
DrawGrid1->ColWidths[0] = 48;
DrawGrid1->DefaultRowHeight = 16;
DrawGrid1->ColCount = 17;
DrawGrid1->RowCount = 21;
}

// ---------------------------------------------------------------------------
void __fastcall TForm1::DrawGrid1DrawCell(TObject *Sender, int ACol,
int ARow, TRect &Rect, TGridDrawState State)
{
String strText;
// 第一行作为标题,用来显示0x0-0xF的索引
if (ARow == 0 && ACol > 0)
{
strText = IntToHex(ACol - 1, 2);
}
// 第一列作为地址段
else if (ACol == 0 && ARow > 0)
{
strText.sprintf("%.5X0", ARow - 1);
}
// 数据以16进制显示
else if (ACol > 0 && ARow > 0)
{
if ((ARow - 1) * 16 + ACol - 1 < m_BufferLen)
strText.sprintf("%.2X", m_Buffer[(ARow - 1) * 16 + ACol - 1]);
else
strText = "";
}
DrawGrid1->Canvas->TextRect(Rect, Rect.Left + 4, Rect.top + 2, strText);
}

// ---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
// 打开一个文件并读入缓冲
FILE *fp = fopen("D:\\ccrun\\111.exe", "rb");
fseek(fp, 0, SEEK_END);
long lFileSize = ftell(fp);
m_Buffer = new byte[lFileSize];
fseek(fp, 0, SEEK_SET);
m_BufferLen = fread(m_Buffer, 1, lFileSize, fp);
fclose(fp);

// 根据读入的字节数,设置DrawGrid的行数(除以16并加上标题行的数量)
DrawGrid1->RowCount = m_BufferLen / 16 + 1;
// 如果不是正好显示为16的倍数行,则多一行
if (m_BufferLen % 16) DrawGrid1->RowCount++;

// 重新绘制DrawGrid上的内容
DrawGrid1->Invalidate();
}

// ---------------------------------------------------------------------------
void __fastcall TForm1::Button2Click(TObject *Sender)
{
// 记的释放缓冲
delete []m_Buffer;
}
KevinDLiu 2012-12-05
  • 打赏
  • 举报
回复
写错了 请教的是OnDrawCell事件的使用。
内容概要:本文介绍了一个基于Python多智能体的作业批改反馈协同辅助系统的设计与实现。系统通过构建多个专业智能体(如题目解析、答案分析、代码审查、评分、反馈生成和审核协调等),实现对多样化作业内容(包括文本、代码、实验报告等)的自动化批改与反馈生成。项目采用模块化架构,涵盖数据接入标准化、任务调度与状态管理、多智能体异步协同、评分与证据建模、反馈生成与质量控制等核心模型。系统强调批改过程的可解释性与教育价值,保留评分依据与错误证据,并支持人工复核与教学数据追溯。通过FastAPI提供接口服务,支持本地运行或集成至在线教学平台。; 适合人群:具备一定Python编程基础,熟悉Web开发、异步编程与数据建模的开发者,尤其是从事教育科技、智能评测系统研发的技术人员或高校研究人员;也适用于希望了解多智能体系统在教育场景中应用的教学设计者。; 使用场景及目标:① 解决传统作业批改效率低、评分不一致、反馈空泛等问题;② 实现多类型作业(如程序设计、论述题、实验报告)的自动化分析与结构化评分;③ 生成具有错误定位、原因分析与改进建议的高质量学习反馈;④ 构建可扩展、可追溯、可集成的教学辅助平台,支持后续接入更多智能体与教学功能; 阅读建议:此资源以实际项目为导向,结合模型设计与代码示例(如Pydantic数据校验、ast代码分析、asyncio异步协同、FastAPI接口等),建议读者结合代码实践,深入理解多智能体协同机制与教育系统工程化实现方法,并可根据具体教学需求进行功能拓展与优化。

604

社区成员

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

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