StringGrid 的单元格合并,滚动后不正常显示(200分)

  • 主题发起人 主题发起人 我的左脚
  • 开始时间 开始时间

我的左脚

Unregistered / Unconfirmed
GUEST, unregistred user!
我在StringGrid中的OnDrawCell()事件中用代码合并了ACol=0列的单元格,
Arow=1,2,3合并为一个,Arow=4,5,6合并为另一个,依此类推,StringGrid的
RowCount=14,但是,当前Grid中只能看到8行,如果用户不进行滚动,一切显示正常
只要一滚动(上下),Arow=1,2,3的单元格就画成单独的单元了,不知我讲的是否清楚
我好象记得Rect只能处理在屏幕上显示可见的部分,那么不可见的部分如何处理?如果
上下滚动如何处理?那位大侠救我一救!谢谢
 
重画时,对于第一列:
只重画左上角那个可见的单元格:sg.cells(sg.LeftCol,sg.TopRow)
其它单元格什么都不要做。
另外,在合并前,是不是把固定列和线都去掉了。
 
我的意思是滚动之前是三个单元画成一个大格,向下滚动,
当Grid内只看见大格的下三分之一时,作向上滚动的动作,这时,看到的就不是一个大格
了,而是三个小单元,就好像没有相应我的代码一样,不论有线没线都一样。
 
如果只是前三行的格子合并,应该是这样,要看你具体是怎么合并的。
 
我把代码贴上让大家帮忙看一下。
procedure TSummaryRptForm.SummaryRptGridDrawCell(Sender: TObject; ACol,
ARow: Integer; Rect: TRect; State: TGridDrawState);
Var iRect : TRect;
Xi,Yi : Integer;
iStr : String;
begin
//***** Draw Left Column *******
iStr := 'E1';

With TStringGrid(Sender) Do
begin
IF (ACol = 0) and (ARow = 4) Then
begin
Canvas.Brush.Color := clBackground;
Canvas.Font.Color := clWhite;
iRect.Left := CellRect(ACol,ARow - 3).Left;
iRect.Top := CellRect(ACol,ARow - 3).Top;
iRect.Right := CellRect(ACol,ARow).Right;
iRect.Bottom := CellRect(ACol,ARow).Bottom;

Xi := (iRect.Right - iRect.Left - Canvas.TextWidth(iStr)) Div 2;
Yi := (iRect.Bottom + iRect.Top - Canvas.TextHeight(iStr)) Div 2;

Canvas.FillRect(iRect);
Canvas.TextOut(Xi,Yi,iStr);
end;
End;


iStr := 'E2';

With TStringGrid(Sender) Do
begin
IF (ACol = 0) and (ARow = 11) Then
begin
Canvas.Brush.Color := clBackground;
Canvas.Font.Color := clWhite;
iRect.Left := CellRect(ACol,ARow - 6).Left;
iRect.Top := CellRect(ACol,ARow - 6).Top;
iRect.Right := CellRect(ACol,ARow).Right;
iRect.Bottom := CellRect(ACol,ARow).Bottom;

Xi := (iRect.Right - iRect.Left - Canvas.TextWidth(iStr)) Div 2;
Yi := (iRect.Bottom + iRect.Top - Canvas.TextHeight(iStr)) Div 2;

Canvas.FillRect(iRect);
Canvas.TextOut(Xi,Yi,iStr);
end;
End;

iStr := 'E3';

With TStringGrid(Sender) Do
begin
IF (ACol = 0) and (ARow = 14) Then
begin
Canvas.Brush.Color := clBackground;
Canvas.Font.Color := clWhite;
iRect.Left := CellRect(ACol,ARow - 2).Left;
iRect.Top := CellRect(ACol,ARow - 2).Top;
iRect.Right := CellRect(ACol,ARow).Right;
iRect.Bottom := CellRect(ACol,ARow).Bottom;

Xi := (iRect.Right - iRect.Left - Canvas.TextWidth(iStr)) Div 2;
Yi := (iRect.Bottom + iRect.Top - Canvas.TextHeight(iStr)) Div 2;

Canvas.FillRect(iRect);
Canvas.TextOut(Xi,Yi,iStr);
end;
End;

iStr := 'MFG';

With TStringGrid(Sender) Do
begin
IF (ACol = 0) and (ARow = 25) Then
begin
Canvas.Brush.Color := clBackground;
Canvas.Font.Color := clWhite;
iRect.Left := CellRect(ACol,ARow - 10).Left;
iRect.Top := CellRect(ACol,ARow - 10).Top;
iRect.Right := CellRect(ACol,ARow).Right;
iRect.Bottom := CellRect(ACol,ARow).Bottom;

Xi := (iRect.Right - iRect.Left - Canvas.TextWidth(iStr)) Div 2;
Yi := (iRect.Bottom + iRect.Top - Canvas.TextHeight(iStr)) Div 2;

Canvas.FillRect(iRect);
Canvas.TextOut(Xi,Yi,iStr);
end;
End;


iStr := 'OPC';

With TStringGrid(Sender) Do
begin
IF (ACol = 0) and (ARow = 26) Then
begin
Canvas.Brush.Color := clBackground;
Canvas.Font.Color := clWhite;
iRect.Left := CellRect(ACol,ARow - 0).Left;
iRect.Top := CellRect(ACol,ARow - 0).Top;
iRect.Right := CellRect(ACol,ARow).Right;
iRect.Bottom := CellRect(ACol,ARow).Bottom;

Xi := (iRect.Right - iRect.Left - Canvas.TextWidth(iStr)) Div 2;
Yi := (iRect.Bottom + iRect.Top - Canvas.TextHeight(iStr)) Div 2;

Canvas.FillRect(iRect);
Canvas.TextOut(Xi,Yi,iStr);
end;
End;


iStr := 'TD';

With TStringGrid(Sender) Do
begin
IF (ACol = 0) and (ARow = 32) Then
begin
Canvas.Brush.Color := clBackground;
Canvas.Font.Color := clWhite;
iRect.Left := CellRect(ACol,ARow - 5).Left;
iRect.Top := CellRect(ACol,ARow - 5).Top;
iRect.Right := CellRect(ACol,ARow).Right;
iRect.Bottom := CellRect(ACol,ARow).Bottom;

Xi := (iRect.Right - iRect.Left - Canvas.TextWidth(iStr)) Div 2;
Yi := (iRect.Bottom + iRect.Top - Canvas.TextHeight(iStr)) Div 2;

Canvas.FillRect(iRect);
Canvas.TextOut(Xi,Yi,iStr);
end;
End;


iStr := 'QE';

With TStringGrid(Sender) Do
begin
IF (ACol = 0) and (ARow = 33) Then
begin
Canvas.Brush.Color := clBackground;
Canvas.Font.Color := clWhite;
iRect.Left := CellRect(ACol,ARow - 0).Left;
iRect.Top := CellRect(ACol,ARow - 0).Top;
iRect.Right := CellRect(ACol,ARow).Right;
iRect.Bottom := CellRect(ACol,ARow).Bottom;

Xi := (iRect.Right - iRect.Left - Canvas.TextWidth(iStr)) Div 2;
Yi := (iRect.Bottom + iRect.Top - Canvas.TextHeight(iStr)) Div 2;

Canvas.FillRect(iRect);
Canvas.TextOut(Xi,Yi,iStr);
end;
End;

end;
 
Sorry,
TStringGrid(Sender).RowCount = 34;
当前Grid只能显示14行,看其余的就需要用上下滚动。
 
我等会儿一定仔细研究一下,给你答复,暂没时间。
 
这是国为尽管你重载了 DrawCell 默认的绘画还在起作用,
你可以试一下,给 cell[0,2]赋个值,比如 'aa',然后在
DrawCell第一行加上 Exit; ,'aa' 还是显示。

另外一个讨厌的是:有一个“画线”,没法控制,即使让
GridLineWidth为0,如果是在固定列还会很难看,所以
fixedCols也必须设为0。

把线和固定列去掉后,我修改了一下你的代码,是可以起到
合并作用的,但还有一些问题要考虑,比如第一列的前三个
单元格并不总是都显示在屏幕上,当然这些问题都是可以解
决的。

另外,如果没有很多列的话,去掉固定列应该不会成为问题,
线可以重载其它单元的 DrawCell,自己画。

将 GridLineWidth 和 fixedCols 都设为0 ,然后参考下面的
代码,你感觉一下:

procedure TForm1.SummaryRptGridDrawCell(Sender: TObject; ACol,
ARow: Integer; Rect: TRect; State: TGridDrawState);
Var iRect : TRect;
Xi,Yi : Integer;
iStr : String;
begin
//***** Draw Left Column *******
iStr := 'E1';

With TStringGrid(Sender) Do
begin
IF (ACol = 0) and (ARow in [1..3]) Then //有改动
begin
Canvas.Brush.Color := clBackground;
Canvas.Font.Color := clWhite;
iRect.Left := CellRect(ACol,1).Left; //1,3 需要根据显示范围调整
iRect.Top := CellRect(ACol,1).Top; //
iRect.Right := CellRect(ACol,3).Right; //
iRect.Bottom := CellRect(ACol,3).Bottom;//

canvas.Font.Size :=20; //字大一点。
Xi := (iRect.Right - iRect.Left - Canvas.TextWidth(iStr)) Div 2;
Yi := (iRect.Bottom + iRect.Top - Canvas.TextHeight(iStr)) Div 2;

Canvas.FillRect(iRect);
Canvas.TextOut(Xi,Yi,iStr);
end;
End;
exit; //先看上面的效果

另外你可以考虑,派生一个stringgrid ,在派生类中重
载,看是不是还执行默认绘画?
如不满意,我们再探讨!!!!!!!
 
有没有其他方法或思路,不用派生类,完成像EasyGrid中合并单元格的平滑效果?
另,我用了你的方法,(ACol,1) and (ACol,4)代码那一段,画格子可行,但居中
的字总是位置会变,很不爽。
 
那你为什么不用 EasyGrid 呢?
 
我永乐一种纯办法解决了,没办法很急。
jsxjd 泽此讨论先结束,分100 给你,下次有机会在继续。
 
朋友,给个easygrid的源码吧,我想在delphi7下编译一下,谢谢了先
fmwwwcn@yahoo.com.cn
 

Similar threads

回复
0
查看
863
不得闲
D
回复
0
查看
2K
DelphiTeacher的专栏
D
D
回复
0
查看
1K
DelphiTeacher的专栏
D
D
回复
0
查看
1K
DelphiTeacher的专栏
D
后退
顶部