602
社区成员
发帖
与我相关
我的任务
分享
private: // User declarations
byte *m_Buffer; // 用来存放文件内容的缓冲
int m_BufferLen; // 缓冲的长度
__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;
}