SetLength的用法问题
问题是这样的,我的一个网络应用程序,需要从服务器端保存用户列表,于是我声明了一个动态数组来保存用户 列表
有用户登录时,就添加一个,有用户下线时就删除一个
TUser=record
UserName:string[20];
Context:TIdContext;
LastTick: Cardinal; //最后一次时钟节拍
end;
OnlineUser:array of TUser;
//添加用户
procedure AddUser(UserData:TUser);
begin
cs.Enter;
//Memo1.Lines.Add('添加用户');
//ShowOnlineUser;
try
try
if High(OnlineUser)=-1 then
SetLength(OnlineUser,2) //第2个参数应该写1或2?
else
SetLength(OnlineUser,High(OnlineUser)+2); //此处+1还是+2?
OnlineUser[High(OnlineUser)]:=UserData;
//SDIForm.WriteLog('添加到在线用户成功');
except
on e:Exception do
SDIForm.WriteLog('添加在线用户失败:'+e.Message)
end;
//ShowOnlineUser;
finally
cs.Leave;
end;
end;
procedure DelUser(UserData:string);
var i:integer;
begin
cs.Enter;
//Memo1.Lines.Add('删除用户');
//ShowOnlineUser;
try
try
for I := 0 to High(OnlineUser) do begin
if OnlineUser[i].UserName=UserData then begin
OnlineUser[i].Context.Connection.Disconnect;
OnlineUser[i]:=OnlineUser[High(OnlineUser)];
SetLength(OnlineUser,High(OnlineUser)-1);
Break;
end;
end;
//SDIForm.WriteLog('删除在线用户成功');
except
on e:Exception do
SDIForm.WriteLog('删除在线用户失败:'+e.Message);
end;
//ShowOnlineUser;
finally
cs.Leave;
end;
end;
//按现在的写法,在调用
for i:=0 to high(OnlineUser) do
onlineuser[i].connection.iohandler.write....//方法时提示越界,应该就是这面那地方的原因
//另外显示用户数据时,假设一个用户在线,总是显示
//0:
//1:user_a
//所以数组元素0应该是空的,所以越办,上面那个设置数组长度应该如何写呢?
procedure ShowOnlineUser;
var i:Integer;
begin
try
cs.Enter;
Memo1.Lines.Add('--------online user--------');
Memo1.Lines.Add('online user length:'+IntToStr(Length(OnlineUser)));
try
for I := 0 to High(OnlineUser) do begin
Memo1.Lines.Add(IntToStr(i)+':'+onlineuser[i].UserName);
end;
except
on e:Exception do
ShowMsg('获得在线列表失败:'+e.Message);
end;
Memo1.Lines.Add('-------------------------');
finally
cs.Leave;
end;
end;