DBGrid是否可以支持显示非数据库形式的内存数据?(30分)

  • 主题发起人 主题发起人 TENTODBV
  • 开始时间 开始时间
to TENTODBV
这是我的代码,只是收到StringGrid的行限制。Data[n,7]是一个标志,0:未显示,1:已显示

const Max_Array = 2000000;

type
TForm1 = class(TForm)
StringGrid1: TStringGrid;
Panel1: TPanel;
Button1: TButton;
Edit1: TEdit;
Edit2: TEdit;
procedure StringGrid1TopLeftChanged(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure Button1Click(Sender: TObject);
private
Data: Array [ 0..Max_Array,0..7] of integer;
Procedure ShowAPage(Top: Integer);
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.StringGrid1TopLeftChanged(Sender: TObject);
var
Pos1: Integer;
begin
Pos1 := StringGrid1.TopRow;
Edit1.Text := intToStr(Pos1);
ShowAPage(Pos1);
end;

procedure TForm1.FormCreate(Sender: TObject);
var
i,j: Integer;
xx: Cardinal;
Begin
xx := GetTickCount;
For i:= 1 to Max_Array do
Begin
Data[i,0] := 1 * 7 - 7;
Data[i,1] := 1 * 7 + 1 - 7;
Data[i,2] := 1 * 7 + 2 - 7;
Data[i,3] := 1 * 7 + 3 - 7;
Data[i,4] := 1 * 7 + 4 - 7;
Data[i,5] := 1 * 7 + 5 - 7;
Data[i,6] := 1 * 7 + 6 - 7;
Data[i,7] := 0;
End;
StringGrid1.RowCount := Max_Array;
ShowAPage(1);

Edit2.Text := FloatToStr((GetTickCount - xx) /1000) + '秒';
end;

procedure TForm1.ShowAPage(Top: Integer);
var
i,j: Integer;
begin
For j := 0 to 14 do
Begin
IF Data[Top,7] = 0 THEN
Begin
For i := 0 to 6 do
StringGrid1.Cells[i + 1,Top] := IntToStr(Data[Top,i]);
Data[Top,7] := 1;
End;
Inc(Top);
IF Top > Max_Array THEN Break;
End;
end;
 
还有一种方法可以不受StringGrid的限制,只是自己要编写很多事件代码。方法就是StringGrid永远只显示用户看见的那一页的数据。将Scrollbars = ssNone,新增一个滚动条放在StringGrid来代替StringGrid的滚动条,要写相应的事件代码。
数据定义如下:
Item = record
数据1


数据n
SelectFlag: Boolean //是否选中的标志
end;
Data : Array[0..Max_Array] of Item;
 
to liuchengr
首先谢谢你的回答。关于用StringGrid来显示的方法,单纯的显示功能我自己早已经解决了,而且不受StringGrid行数的限制。只是可惜没能处理好鼠标向下拖动引起翻页,或者是选取多个跨页的不连续的行块时如何记录所选行的序号(要实现这个跨页多选的功能是为了实现“提取选定行”的功能)。
 
这个好解决,我不是在数据定义中增加了一个SelectFlag吗,这个就是为了“提取选定行”而设的啊,如果SelectFlag= True就表示该行是被选中的,否则就是没选中,显示的时候将这个因素加进去就可以了啊。
 
后退
顶部