StringGrid行上的循环滚动问题(200分)

Y

ykjiang

Unregistered / Unconfirmed
GUEST, unregistred user!
我使用StringGrid空件在程序里做了一个报警信息窗口,StringGrid.RowCount:=100;当我的报警信息
条数超过100条,如101条时,我希望能自动化将StringGrid 的第1行的信息删除,第2行的信息
自动放置到第1行上,以此类推,将最新的第101条信息放置到第100行上,同样,以后产生
的每一条信息始终在第100行上,依次将较早的信息从StringGrid中推出.
最好是使用StringGrid来完成.
谢谢!!!
 
100个循环,后一行写到前一行上
 
for i:=99 downto 1 do
begin
grid.cells[1,i] := grid.cells[1,i-1];
end;
grid.cells[100,i]:='Last error';
 
procedure AddMessage(S:String);
Var
I:Integer;
b:Boolean;
begin
b:=False;

For I:=0 to StringGrid.RowCount-1 do
begin
if StringGrid.Cells[0,I]='' then
begin
Break;//.假设为空则跳出选换并纪录位置
b:=True;
end;
end;

if b then //.标准操作
begin
StringGrid.Cells[0,I]:=s; //.赋值
...其他操作
end else //.溢出操作
begin
For I:=0 to StringGrid.RowCount-2 do //.只操作到倒数第二行
begin
StringGrid.Cells[0,I]:=StringGrid.Cells[0,I+1]; //.后一行向前一行赋值
end;

StringGrid.Cells[0,StringGrid.RowCount-1]:=S;//.最后一行
end;
end;
 
对亚,就是循环赋值,没有什么好的办法
StringGrid不像listbox/listview,删除一行,下面的行可以自动上移
 
TStringGrid有了个存放Cells数据的属性
如果你从TStringGrid的父类再派生出一个TStringGrid的兄弟(用TDrawGrid也不错)
你就有权力来维护这个数据属性了。
 
其实很简单,派生一个类:
TMyStringGrid = class(TStringGrid);
公开一个保护成员函数:MoveRow。
然后,在你的应用中,如果发现当前操作行已经到达 100 时,
MoveRow(1, 100),然后,直接在第 100 行写入你的数据就行了!
既不要再增加行,也不要移动数据,多省事!

OK?
 
顶部