【发布时间】:2011-03-31 14:27:01
【问题描述】:
这是我“试图”实现的目标
我有一个生成密码的功能,然后我将其添加到 TStringList 之后,我应该用这些项目填充 VirtualTreeView,但我没有运气快速到达任何地方。应该如何以正确的方式完成?我还在学习,不是专业人士。
我的密码生成函数:
function Generate(AllowUpper,AllowLower,AllowNumbers,AllowSymbols:Boolean; PassLen:Integer):String;
const
UpperList = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ';
LowerList = 'abcdefghijklmnopqrstuvwxyz';
NumberList = '0123456789';
SymbolList = '!#$%&/()=?@<>|{[]}\*~+#;:.-_';
var
MyList : String;
Index : Integer;
i : Integer;
begin
Result:='';
MyList:='';
//here if the flag is set the elements are added to the main array (string) to process
if AllowUpper then MyList := MyList + UpperList;
if AllowLower then MyList := MyList + LowerList;
if AllowNumbers then MyList := MyList + NumberList;
if AllowSymbols then MyList := MyList + SymbolList;
Randomize;
if Length(MyList)>0 then
for i := 1 to PassLen do
begin
Index := Random(Length(MyList))+1;
Result := Result+MyList[Index];
end;
end;
我是这样称呼它的
procedure TMain.Button3Click(Sender: TObject);
var
i: integer;
StrLst: TStringList;
// Timing vars...
Freq, StartCount, StopCount: Int64;
TimingSeconds: real;
begin
vst1.Clear;
Panel2.Caption := 'Generating Passwords...';
Application.ProcessMessages;
// Start Performance Timer...
QueryPerformanceFrequency(Freq);
QueryPerformanceCounter(StartCount);
StrLst := TStringList.Create;
try
for i := 1 to PassLenEd.Value do
StrLst.Add(Generate(ChkGrpCharSelect.Checked[0],ChkGrpCharSelect.Checked[1],
ChkGrpCharSelect.Checked[2],ChkGrpCharSelect.Checked[3],20));
// Stop Performance Timer...
QueryPerformanceCounter(StopCount);
TimingSeconds := (StopCount - StartCount) / Freq;
// Display Timing... How long it took to generate
Panel2.Caption := 'Generated '+IntToStr(PassLenEd.Value)+' passwords in '+
FloatToStrF(TimingSeconds,ffnumber,1,3)+' seconds';
// Add to VirtualTreeList - here???
finally
StrLst.Free;
end;
end;
我希望我这样做完全错误,我已经尝试了 2 天,如果有人能直接告诉我应该如何去做,那就太好了。
克里斯
【问题讨论】:
-
为什么选择虚拟树列表?这是一个非常复杂的控件?为什么不使用列表视图或其他同样简单的方法?
-
我最初只使用标准的 TListView 和 TAdvListView,但是当添加大量数据时它变得太多,即使使用 BeginUpdate 和 EndUpdate。我正在测试另一个可以在不到 12 秒内生成超过一百万个密码的程序的生成 - 我听说 VirtualTreeView 非常适合这样的事情,我正在努力学习它。
-
@David,您应该发布您的最后一条评论作为答案。两秒钟的代码,它将解决 OP 的问题。
-
@Shamballa 不是您的问题,但如果性能是您的目标,那么在您的日常工作中进行一些简单的更改,我设法在不到一秒的时间内生成了 1,000,000 个密码(不显示)。使用您的确切例程,我的机器大约需要 2.2 秒才能生成相同的 1,000,000 个密码。
-
@Shamballa,其他的......看起来你使用面板来显示消息......为什么不使用标签?