不借助任何三方组件,利用TStringGrid完成了一个可伸缩的表格,这里给出伸展代码。有兴趣者可完成收缩和重画部分。
//结构体及自定义函数部分
//---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop
#include "Unt_StringGrid_EC.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TMain *Main;
TStringList *Lines;
struct FieldInfo
{
int CurrentIdx;
AnsiString CurrentField;
int ID; /* 0——NoSub
1——HasSub
2——IsSub*/
AnsiString NextField;
} FldInfo[MAX_PATH];
int ECRowCount, //动态记录总行数
gbl_Col, //动态记录当前列索引
gbl_Row; //动态记录当前行索引
bool Selected;
//---------------------------------------------------------------------------
__fastcall TMain::TMain(TComponent* Owner)
: TForm(Owner)
{
Lines = new TStringList;
ECRowCount = 0;
}
//---------------------------------------------------------------------------
bool __fastcall TMain::IsSubList(AnsiString TargetReceive)
{
bool IsSub = false;
char *FirstField = new char[MAX_PATH];
FirstField = TargetReceive.c_str();
while(*FirstField != '\0')
{
if (*FirstField == '*')
{
IsSub = true;
break;
}
else
FirstField ++;
}
delete FirstField;
FirstField = NULL;
return IsSub;
}
//---------------------------------------------------------------------------
void __fastcall TMain::Decode_Spread(char *TargetDecoded,int CurrentID, int ID,
int FlashRowCount)
{
/********************************************************************
TargetDecoded : 结构体中目标待解析字符串
CurrentID : 结构体中目标待解析字符串索引
ID : 结构体中目标待解析字符串属性标识
FlashRowCount : StringGrid总行数
********************************************************************/
/*-------------------------------------------------------------------
解码
-------------------------------------------------------------------*/
AnsiString AsArray[10]; //此处的范围可以修改
int Count = 0,cnt = 0; //'cnt'用于处理字符间多个空格的情况
StringGridEC->RowCount = 1;
StringGridEC->RowCount = FlashRowCount;
while (*TargetDecoded != '\0')
{
if (*TargetDecoded != ' ')
{
AsArray[Count] += *TargetDecoded;
cnt = 0;
}
else
{
cnt ++;
if (cnt <= 1)
Count ++;
}
TargetDecoded ++;
}
StringGridEC->ColCount = Count + 1;
/*-------------------------------------------------------------------
分配
-------------------------------------------------------------------*/
if (ID == 0 || ID == 1)
{
if (ID == 0)
{
for (int ridx = StringGridEC->RowCount - 1;ridx < StringGridEC->RowCount;ridx ++)
for (int cidx = 0;cidx < StringGridEC->ColCount;cidx ++)
StringGridEC->Cells[cidx][ridx] = AsArray[cidx];
}
else
{
for (int ridx = StringGridEC->RowCount - 1;ridx < StringGridEC->RowCount;ridx ++)
for (int cidx = 0;cidx < StringGridEC->ColCount;cidx ++)
{
if (cidx == 0)
StringGridEC->Cells[cidx][ridx] = "+" + AsArray[cidx];
else
StringGridEC->Cells[cidx][ridx] = AsArray[cidx];
}
}
}
else
{
for (int cidx = 0;cidx < StringGridEC->ColCount;cidx ++)
StringGridEC->Cells[cidx][CurrentID] = AsArray[cidx];
}
}