下面,我们来点刺激的:为整个一个书目库的全部书目记录自动加拼音,怎么样?
其实,“自动”加拼音有点言过其实。选择多音字的操作程序还是无法代劳。最多是程序自动循环,避免操作者不停地按“下一记录”按钮手忙脚乱。但这也很有意义啊。
还是在dp2manager中打开编辑相关书目库的dp2circulation_marc_autogen.cs脚本文件。
在Main()函数中适当位置增加一个功能入口:
// 批加拼音
actions.NewItem("批加拼音", "为当前记录以及同库的其他后方记录重新加拼音", "BatchAddPinyin", false);
在MyHost类的适当位置增加一个函数BatchAddPinyin()的代码:
void BatchAddPinyin()
{
int nRet = 0;
Stop stop = new DigitalPlatform.Stop();
stop.Register(this.DetailForm.MainForm.stopManager, true); // 和容器关联
stop.Style = StopStyle.EnableHalfStop;
stop.BeginLoop();
try
{
for (; ; )
{
Application.DoEvents();
if (stop.State != 0)
break;
nRet = AddPinyin(this.PinyinCfgXml);
if (nRet == -1)
break;
nRet = this.DetailForm.DoSaveAll();
if (nRet == -1)
break;
nRet = this.DetailForm.SafeLoadRecord(this.DetailForm.BiblioRecPath, "next");
if (nRet <= 0)
break;
}
}
finally
{
stop.EndLoop();
stop.Unregister();
}
}
代码修改完毕。保存它。然后去试验一下吧。
这个功能是从当前记录位置,顺次处理同一书目库的ID号更大的后面的记录。直到操作者在主窗口的工具条上按停止按钮,或者遇到数据库的最后一条记录被处理完。
代码中的Stop类对象,是用来表达主窗口工具条上的停止按钮的。Stop类对象可以堆叠,多重循环可以堆叠多次。这里就不展开介绍了。
除了为了循环和停止而书写的代码外,实际上加拼音和保存记录的代码都非常简单明了。