// 角色数据合区处理过程
procedure TFrmMain.HumAllone;
var
FHumInfo: THumInfo; // 角色信息结构
FDBRecord, FNewDBRecord: TMirRecord; // 数据库文件操作对象
nIndex, I, nRecordCount: Integer; // 索引、循环计数、记录总数
NewName: string; // 新角色名称
DBHeader: TDBHeader; // 数据库文件头
begin
// 检查主区Hum.DB是否存在
if FileExists(EdtMainHum.Text) then
FDBRecord := TMirRecord.Create(EdtMainHum.Text, fmShareDenyNone)
else begin
Application.MessageBox('主区Hum数据库不存在!', '提示信息', MB_ICONQUESTION);
Exit;
end;
// 如果目标目录存在Hum.DB则删除
if FileExists(EdtSavePath.Text + '\DBServer\FDB\Hum.DB') then
DeleteFile(EdtSavePath.Text + '\DBServer\FDB\Hum.DB');
// 创建新的Hum.DB文件
FNewDBRecord := TMirRecord.Create(EdtSavePath.Text + '\DBServer\FDB\Hum.DB', fmCreate);
try
// 设置记录大小
FNewDBRecord.RecSize := SizeOf(FHumInfo);
try
// 处理主区数据
FDBRecord.RecSize := SizeOf(FHumInfo);
// 读取并写入文件头
FDBRecord.Seek(0, 0);
FDBRecord.Read(DBHeader, SizeOf(DBHeader));
FNewDBRecord.Seek(0, 0);
FNewDBRecord.Write(DBHeader, SizeOf(DBHeader));
nRecordCount := FDBRecord.NumRecs;
FDBRecord.First;
StatusBar1.Panels[0].Text := '正在把主区Hum写入新库';
StatusBar1.Panels[1].Text := '';
Application.ProcessMessages;
// 复制主区所有角色记录
for i := 1 to nRecordCount do begin
FDBRecord.ReadRec(FHumInfo); // 读取一条角色记录
HumList.AddRecord(FHumInfo.sChrName, i); // 添加到角色列表
FNewDBRecord.AppendRec(FHumInfo); // 写入新数据库
// 更新进度条
StatusBar1.Panels[1].Text := '完成:' + inttostr(round((i / nRecordCount) * 100)) + '%';
Application.ProcessMessages;
FDBRecord.NextRec;
end;
finally
FDBRecord.Free;
end;
// 处理从区数据
if FileExists(EdtSlaveHum.Text) then
FDBRecord := TMirRecord.Create(EdtSlaveHum.Text, fmShareDenyNone)
else begin
Application.MessageBox('从库Hum数据库不存在!', '提示信息', MB_ICONQUESTION);
Exit;
end;
try
FDBRecord.RecSize := SizeOf(FHumInfo);
nRecordCount := FDBRecord.NumRecs;
FDBRecord.First;
StatusBar1.Panels[0].Text := '正在把从库Hum写入新库';
StatusBar1.Panels[1].Text := '';
Application.ProcessMessages;
// 处理从区所有角色记录
for i := 1 to nRecordCount do begin
FDBRecord.ReadRec(FHumInfo);
// 检查角色名是否重名
nIndex := HumList.GetIndex(FHumInfo.sChrName);
if nIndex <> -1 then begin // 如果角色名重复
NewName := '';
// 生成新角色名
if CheckName(FHumInfo.sChrName, 14, NewName, 1) then begin
FHumInfo.sChrName := NewName; // 更新角色名
FHumInfo.Header.sName := NewName; // 更新记录头
end else begin
FDBRecord.NextRec;
StatusBar1.Panels[1].Text := '完成:' + inttostr(round((i / nRecordCount) * 100)) + '%';
Continue;
end;
end;
// 检查账号是否在变更列表中
nIndex := AccountChangeList.GetIndex(FHumInfo.sAccount);
if nIndex <> -1 then begin // 如果账号已变更
// 更新为新账号
FHumInfo.sAccount := pTQuickName(AccountChangeList.Objects[nIndex])^.sNewName;
end;
HumList.AddRecord(FHumInfo.sChrName, i); // 添加到角色列表
FNewDBRecord.AppendRec(FHumInfo); // 写入新数据库
// 更新进度条
StatusBar1.Panels[1].Text := '完成:' + inttostr(round((i / nRecordCount) * 100)) + '%';
Application.ProcessMessages;
FDBRecord.NextRec;
end;
// 更新文件头中的角色总数
FDBRecord.Seek(0, 0);
FDBRecord.Read(DBHeader, SizeOf(DBHeader));
DBHeader.nHumCount := FNewDBRecord.NumRecs;
FNewDBRecord.Seek(0, 0);
FNewDBRecord.Write(DBHeader, SizeOf(DBHeader));
finally
FDBRecord.Free;
end;
finally
FNewDBRecord.Free;
end;
end;