各位高人 怎么才能在StringGrid的Drawcell事件里合并单元格并且在合并的单元格上显示字符呢?急啊!!!

xiangtianwen 2004-12-26 02:21:47
各位高人:
怎么才能在StringGrid的Drawcell事件里合并单元格并且在合并的单元格上显示字符呢?
我已经在网上抄袭了一段合并单元格的例子 合并是成功了但是 往合并的单元格上写字符串的时候
怎么没显示啊 !! 偶千思不得其解 望各位江湖老大们帮帮偶这个小弟啊!! 谢谢 谢谢 偶在线。。。。。
...全文
197 点赞 收藏 10
写回复
10 条回复
xiangtianwen 2005年01月03日
谢谢各位江湖大哥 偶已经解决了该问题 偶使用了EasyGrid 在也不用受StringGrid 的折磨啦
回复 点赞
opalhui 2004年12月27日
可以用一下advstringgrid
回复 点赞
zdq801104 2004年12月27日
//重载 OnTopLeftChange事件,特别是行的合并
procedure TForm1.SGTopLeftChanged(Sender: TObject);
var
d:TStringGrid;
begin
d:=TStringGrid(Sender);
d.Cells[0,1]:=d.Cells[0,1];
d.Cells[0,2]:=d.Cells[0,2];
end;

end.
回复 点赞
zdq801104 2004年12月27日
//重载 OnDrawCell 事件
procedure TForm1.SGDrawCell(Sender: TObject; ACol, ARow: Integer;
Rect: TRect; State: TGridDrawState);
var
r:TRect;
d:TStringGrid;
s:string;
ts:TStrings;
i,n:integer;
fixed:Boolean;
begin
d:=TStringGrid(sender);
if (Acol=2) and (ARow=0) then
begin
r.left:=Rect.left-1-d.colwidths[ACol-1];
r.top:=rect.top-1;
r.right:=rect.right;
r.bottom:=rect.bottom;
s:=d.cells[ACol-1,ARow];
end else
if (Acol=1) and (ARow=0) then
begin
r.left:=Rect.left-1;
r.top:=rect.top-1;
r.right:=rect.right+d.colwidths[ACol+1];
r.bottom:=rect.bottom;
s:=d.cells[ACol,ARow];
end //////////以上列合并
else
if (Acol=0) and (ARow=2) then
begin
r.left:=Rect.left-1;
r.top:=rect.top-1-d.RowHeights[ARow-1];
r.right:=rect.right;
r.bottom:=rect.bottom;
s:=d.cells[ACol,ARow-1];
end else
if (Acol=1) and (ARow=0) then
begin
r.left:=Rect.left-1;
r.top:=rect.top-1;
r.right:=rect.right;
r.bottom:=rect.bottom+d.RowHeights[ARow+1];
s:=d.cells[ACol,ARow];
end ////////以上为行合并
else
begin
r.left:=Rect.left-1;
r.top:=rect.top-1;
r.right:=rect.right;
r.bottom:=rect.bottom;
s:=d.cells[ACol,ARow];
end;

d.Canvas.brush.color:=d.color;
d.canvas.Font.color:=$ff0000;

Fixed:=false;
if (Arow begin
d.Canvas.brush.color:=d.FixedColor;
d.Canvas.Font.color:=$ff00ff;
Fixed:=True;
//d.Canvas.Font.style:=d.Canvas.Font.style+[fsBold];
end;
if gdfocused in state then
begin
d.canvas.Brush.color:=$00ff00;
end;
if fixed then
begin
d.Canvas.Pen.color:=$0;
d.canvas.Rectangle(r);

d.Canvas.Pen.color:=$f0f0f0;
d.Canvas.Pen.Width:=2;
d.canvas.Moveto(r.left+1,r.top+2);
d.canvas.Lineto(r.left+r.right,r.top+2);

d.Canvas.Pen.color:=$808080;
d.Canvas.Pen.Width:=1;
d.canvas.Moveto(r.Left+1,r.bottom-1);
d.canvas.Lineto(r.left+r.right,r.bottom-1);

end else
begin
d.Canvas.Pen.color:=$0;
d.Canvas.Pen.Width:=1;
d.canvas.Rectangle(r);
end;
n:=r.top+4;
ts:=TStringList.Create;
ts.CommaText:=s;
for i:=0 to ts.Count-1 do
begin
d.canvas.Textout(r.left+4,n,ts[i]);
inc(n,d.RowHeights[ARow]);
end;
end;
回复 点赞
kuki84 2004年12月26日
学习
回复 点赞
xiangtianwen 2004年12月26日
怎么没人啊!!!没人会么?失望。。。。。。。。。。。。。
回复 点赞
xiangtianwen 2004年12月26日
效果一般般 但是没办法啊!!偶水平太菜了 不会重写Grid类
回复 点赞
xiangtianwen 2004年12月26日
procedure TForm1.StringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer;
Rect: TRect; State: TGridDrawState);
var
FrameFlags1, FrameFlags2: DWORD;
TmpR:TRect;
Str:String;
begin
if (ACol=0) and (ARow=3) then //第四行第一列
begin
TmpR:=StringGrid1.CellRect(3,3);//把区域扩大到第四行第四列.
Rect.Right:=TmpR.Right;
(Sender as TstringGrid).Canvas.FillRect(Rect);
(Sender as TstringGrid).Canvas.TextOut(rect.Left,Rect.Top+3,'我我');
end;
if (ACol in [1..3]) and (ARow=3) then //如果是第四行第2,3,4列就不画了,因为在第一列已经画了.
Exit;
FrameFlags1 := 0;
FrameFlags2 := 0;
if goFixedVertLine in StringGrid1.Options then
begin
FrameFlags1 := BF_RIGHT;
FrameFlags2 := BF_LEFT;
end;
if goFixedHorzLine in StringGrid1.Options then
begin
FrameFlags1 := FrameFlags1 or BF_BOTTOM;
FrameFlags2 := FrameFlags2 or BF_TOP;
end;
if gdFixed in State then
begin
Str:='Test';
StringGrid1.Canvas.Brush.Color:=StringGrid1.FixedColor;
StringGrid1.Canvas.FillRect(Rect);
DrawEdge(StringGrid1.Canvas.Handle, Rect, BDR_RAISEDINNER, FrameFlags1);
DrawEdge(StringGrid1.Canvas.Handle, Rect, BDR_RAISEDINNER, FrameFlags2);
DrawText(StringGrid1.Canvas.Handle,PChar(Str),Length(Str),Rect,DT_SINGLELINE or DT_VCENTER or DT_CENTER);
end else
begin
Str:=StringGrid1.Cells[acol,arow];
StringGrid1.Canvas.Brush.Color:=StringGrid1.Color;
StringGrid1.Canvas.FillRect(Rect);
DrawEdge(StringGrid1.Canvas.Handle, Rect, BDR_RAISEDINNER, FrameFlags1);
DrawEdge(StringGrid1.Canvas.Handle, Rect, BDR_RAISEDINNER, FrameFlags2);
DrawText(StringGrid1.Canvas.Handle,PChar(Str),Length(Str),Rect,DT_SINGLELINE or DT_VCENTER or DT_CENTER);
end;

end;
回复 点赞
chenchangfu 2004年12月26日
抄袭了一段合并单元格的例子贴出来看看
回复 点赞
xiangtianwen 2004年12月26日
自己顶
回复 点赞
发动态
发帖子
数据库相关
创建于2007-08-02

1209

社区成员

8.8w+

社区内容

Delphi 数据库相关
社区公告
暂无公告