从你的描述可以判断出,应该是一个图片加文字的,类似于产品目录的一个应用。其实这种方式,应该使用DrawGrid,而不应该用动态生成PANEL,再加LABEL+IMAGE的方式,否则你的速度将无法提高。
大致思路如下:
1、将需要的数据先缓存到内存中,如可能采用你讲的数组,也可以用ClientDataSet,使用ClientDataSet可以将得到的数据直接以数据包的形式放入内存中,可以节省数据包到数组的转换时间
2、在DrawGrid.OnDrawCell事件中根据当前单元格所处的行、列计算出对应的记录号,摘录我自已程序中的源码,你可作为参考
procedure TFrameEditImage.DrawGridCntrDrawCell(Sender: TObject;
ACol,
ARow: Integer;
Rect: TRect;
State: TGridDrawState);
var Bmp:TBitMap;
x,y:Integer;
tpBm:TBookMark;
begin
//计算出当前的图片序号
x:=TDrawGrid(Sender).ColCount;
y:=Arow*x+Acol+1;
try
//取出相应的图片及型号
with utCDSdo
//我的数据是放在utCDS中,你可以根据自已的方法得到数组下标
if Not Active or (y>RecordCount) then
begin
Bmp:=TBitmap.Create;
bmp:=Nil;
end
else
begin
DisableControls;
tpBm:=GetBookMark;
if RecNo<>y then
RecNo:=y;
JpgToBmp(TBlobField(FindField(utSmallField)),Bmp);
//由于我存在CDS中的是JPG格式图片,所以做了一个将JPG转化成BMP的函数
GotoBookmark(tpBM);
FreeBookMark(tpBM);
EnableControls;
end;
// if not utShowImageIndex then
// y:=-1;
MyDrawGridCell(sender,Rect,State,Bmp,y);
Finally
Bmp.free;
end;
end;
3.将文字及图片画到单元格中,以下也是源码,供你参考
Procedure MyDrawGridCell(Sender: TObject;
Rect: TRect;
State: TGridDrawState;
Bmp:TBitmap;
Pos:Integer);
var
BmpRect:TRect;
x,y:Integer;
begin
with TDrawGrid(Sender).Canvas do
begin
Brush.Color := clWhite;
FillRect(Rect);
//清空
// if StrisEmpty(ShowWords) and (Bmp=nil) then
if BMP = Nil then
Exit;
//居中显示图片
BmpRect:=Rect;
// BmpRect.Bottom:=BmpRect.Bottom-TxtHeight;
//预留文字部分空间
x:=(BmpRect.Right-BmpRect.Left-Bmp.Width) div 2;
//宽度居中数据
y:=(BmpRect.Bottom-BmpRect.Top-Bmp.Height) div 2;
//高度居中数据
BmpRect.Top:=BmpRect.Top+y;
BmpRect.Bottom:=BmpRect.Bottom-y;
BmpRect.Left:=BmpRect.Left+x;
BmpRect.Right:=BmpRect.Right-x;
if Bmp <> nil then
begin
Bmp.Transparent := True;
Bmp.TransParentColor := TDrawGrid(Sender).Color;
if gdFocused in State then
begin
Pen.Color:= clBlue;
Rectangle(BmpRect.Left-1, BmpRect.Top -1, BmpRect.Right + 1,BmpRect.Bottom + 1);
end;
CopyRect(BmpRect,Bmp.Canvas,Bmp.Canvas.ClipRect);
end;
//画分隔线
// BmpRect.Bottom:=BmpRect.Bottom+y;
// Rectangle(Rect.Left,BmpRect.Bottom,Rect.Right,BmpRect.Bottom+1);
//写序号
if gdFocused in State then
Font.Color:=clRed
else
Font.Color:=clBlack;
if Pos>0 then
begin
//传递负数表示不显示序号
x:=Rect.Left+1;
y:=Rect.Top+1;
TextOut(x,y,InttoStr(Pos));
end;
//居中写文字
// if TextWidth(ShowWords)>(Rect.Right-Rect.Left) then
//如果文字太大,要显示省略号
// showWords:=Copy(ShowWords,1,(Rect.Right-Rect.Left) div TextWidth('A')-3)+'...';
// x:=Rect.Left+(Rect.Right-Rect.Left-TextWidth(ShowWords)) div 2;
//居中显示
// x:=Rect.Left+(Rect.Right-Rect.Left) div 2;
//居中显示
// y:=BmpRect.Bottom+(TxtHeight-TextHeight(ShowWords)) div 2;
//居中显示
// y:=BmpRect.Bottom+TxtHeight div 2;
//居中显示
if gdFocused in State then
Font.Color:=clBlue
else
Font.Color:=clBlack;
// TextOut(x,y,ShowWords);
end;
end;