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

xiangtianwen 2004-12-26 02:21:47
各位高人:
怎么才能在StringGrid的Drawcell事件里合并单元格并且在合并的单元格上显示字符呢?
我已经在网上抄袭了一段合并单元格的例子 合并是成功了但是 往合并的单元格上写字符串的时候
怎么没显示啊 !! 偶千思不得其解 望各位江湖老大们帮帮偶这个小弟啊!! 谢谢 谢谢 偶在线。。。。。
...全文
267 10 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
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
  • 打赏
  • 举报
回复
自己顶

2,507

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 数据库相关
社区管理员
  • 数据库相关社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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