急!生成双色球110万多组合,如何快速显示到Grid 中?(100分)

  • 主题发起人 主题发起人 mxq888
  • 开始时间 开始时间
如果要求速度快, 绝对不能用数据库DB的方式, 因为DB都要作些额外的处理. 要用自己定义的数据结构, 用内存+文件的方式处理.

cxGrid中有一非绑定数据库的方法可以参考.
 
to unjiang:是啊~[:D]
To zhlu谢谢你的建议~
 
用 ListView 的 Virtual 方式最快
 
还没有好?
昨天不是说了吗
我这个生成算法不知是否正确
数量有1100000,随便写了一下
但是显示肯定很快

匆忙写的代码,吃饭了

unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ComCtrls;

type
TBall = record
X1, X2, X3, X4, X5, X6, Y: Byte;
end;

TBallArray = array [0..1100000] of TBall;

TForm1 = class(TForm)
Button1: TButton;
ListView1: TListView;
procedure Button1Click(Sender: TObject);
procedure ListView1Data(Sender: TObject; Item: TListItem);
private
{ Private declarations }
public
v: TBallArray;
end;

var
Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var
i, j, k, l, m, n, q: Integer;
c: Integer;
begin
c := 0;
for i := 1 to 33 do
begin
for j := 2 to 33 do
begin
for k := 3 to 33 do
begin
for l := 4 to 33 do
begin
for m := 5 to 33 do
begin
for n := 6 to 33 do
begin
for q := 1 to 16 do
begin
v[c].X1 := i;
v[c].X2 := j;
v[c].X3 := k;
v[c].X4 := l;
v[c].X5 := m;
v[c].X6 := n;
v[c].Y := q;
Inc(c);
if c > 1100000 then
Break;
end;
if c > 1100000 then
Break;
end;
if c > 1100000 then
Break;
end;
if c > 1100000 then
Break;
end;
if c > 1100000 then
Break;
end;
if c > 1100000 then
Break;
end;
if c > 1100000 then
Break;
end;

ListView1.Items.Count := 1100000;
ListView1.Refresh;
end;

procedure TForm1.ListView1Data(Sender: TObject; Item: TListItem);
begin
if Item.Index > 1100000 then
Exit;
with Item do
begin
Caption := IntToStr(v[Item.Index].X1);
SubItems.Add(IntToStr(v[Item.Index].X2));
SubItems.Add(IntToStr(v[Item.Index].X3));
SubItems.Add(IntToStr(v[Item.Index].X4));
SubItems.Add(IntToStr(v[Item.Index].X5));
SubItems.Add(IntToStr(v[Item.Index].X6));
SubItems.Add(IntToStr(v[Item.Index].Y));
end;
end;

end.


object Form1: TForm1
Left = 192
Top = 140
Width = 696
Height = 480
Caption = 'Form1'
Color = clBtnFace
Font.Charset = DEFAULT_CHARSET
Font.Color = clWindowText
Font.Height = -11
Font.Name = 'MS Sans Serif'
Font.Style = []
OldCreateOrder = False
PixelsPerInch = 96
TextHeight = 13
object Button1: TButton
Left = 584
Top = 8
Width = 75
Height = 25
Caption = 'Button1'
TabOrder = 0
OnClick = Button1Click
end
object ListView1: TListView
Left = 8
Top = 16
Width = 553
Height = 409
Columns = <
item
end
item
end
item
end
item
end
item
end
item
end
item
end>
OwnerData = True
TabOrder = 1
ViewStyle = vsReport
OnData = ListView1Data
end
end
 
To:zealothasu
你的方法确实很快啊,在我的机器上几乎感觉不到用了时间,我有点怀疑是不是1100000个啊,呵呵![:D]只是遗憾的是,我不想用listview控件,因为用它不好在其上块复制,删除等,我希望是象dbgrid样式的表格控件,[:(]。。不过里面有些东西我会学习的,非常感谢你了!!!
能不能写个用DBgrid显示的代码?同时要生成一个文件的我就完全可以用了,
再次感谢
 
直接用StringGrid,再加一个上下翻页的动作就行了。

procedure TForm1.Button2Click(Sender: TObject);
var
Rlt:BBA;
T:DWord;
i: integer;
begin
T:=GetTickCount;
Rlt:=CNM(SpinEdit1.Value,SpinEdit2.Value);

for i:=0 to 100 do
begin
StringGrid1.Cells[0, i] := IntToStr(Rlt[0]);
StringGrid1.Cells[1, i] := IntToStr(Rlt[1]);
StringGrid1.Cells[2, i] := IntToStr(Rlt[2]);
StringGrid1.Cells[3, i] := IntToStr(Rlt[3]);
StringGrid1.Cells[4, i] := IntToStr(Rlt[4]);
StringGrid1.Cells[5, i] := IntToStr(Rlt[5]);
end;

Label1.Caption:=IntToStr(High(Rlt)+1)+'Time:'+FloatToStr((GetTickCount-T)/1000)+' s';
end;
 
复制,删除完全在自己掌握之中,只是你不懂得怎么处理而已。其实就是直接从数组中删除
当然我是为了方便才使用了数组,
dbgrid在显示数据库的数据才比较好,但是你没发现很难看?
我现在开发都不用感知控件。

listview和stringgrid不是同一个等级的东西
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
D
回复
0
查看
2K
DelphiTeacher的专栏
D
D
回复
0
查看
2K
DelphiTeacher的专栏
D
D
回复
0
查看
1K
DelphiTeacher的专栏
D
后退
顶部