procedure TWrits.BMakeClick(Sender: TObject);
var
BName, SName, SFile: String;
begin
if CurrentTemplate = '' then Showmessage('请先选择一个要制作的文书!')
else
begin
BName := '';
BName := GetBroadName(CurrentTemplate);
if BName = '' then BName := CurrentTemplate;
if BName = CurrentTemplate then SName := '' else SName := RightStr(CurrentTemplate, Length(CurrentTemplate) - Length(BName) - 2);
SFile := ExePath + 'Writ/Templates/' + BName;
if not FileExists(SFile + '.WRS') then Showmessage('该文书:“' + BName + '”模板不存在!必须先制作好模板,才能用模板制成文书。')
else if Application.MessageBox('点击“确定”以继续制作此文书。', '制成文书', Mb_yesno + Mb_IconQuestion) = idyes then
begin
Broad.M.Lines.LoadFromFile(SFile + '.WRS');
if SName = '' then MakeSpace
else
begin
try Broad.IniSub.Free; except end;
Broad.IniSub := Tinifile.Create(SFile + '.Sub');
if not Broad.IniSub.SectionExists(SName) then
begin
if Application.MessageBox(PChar(' 文书模板存在,但对应的子模板不存在,如需制成有对应子模板设定项目的文书,请先建立并设定该子模板。' + #10 + ' 是否制成空文书?'), '子模板不存在', Mb_yesno + Mb_IconInformation) = idyes then MakeSpace;
end
else CreateSub(BName, SName);
end;
end;
end;
end;
//我用BName表示模板文件名,SName表示子该模板的一个子模板名称,方便阅读注释一下。
这里主要调用了一个CreateSub(BName, SName);过程,也就是找到模板并存在对应子模板的情况下的过程,如下:
procedure TWrits.CreateSub(BName, SName: String);
var
I, J, SubS: Integer;
BooG: Boolean;
S: String;
begin
//打开并读取子板各属性
try Broad.IniSubProperty.Free; except end;
Broad.IniSubProperty := Tinifile.Create(ExePath + 'Writ/Templates/' + BName + '.Sbp');
SubS := Broad.IniSubProperty.ReadInteger(SName, 'S', 16);
BooG := Broad.IniSubProperty.ReadBool(SName, 'G', false);
if BooG then SGoods := InputBox('有关财物', '该文书指向的有关财物: ', '');//打开物窗
if (SGoods = '') and BooG then
begin
Showmessage('有财物指向的文书必须输入相关财物。');
Abort;
end;
Broad.DetailCount := 0;
for I := Broad.M.Lines.Count - 1 downto 0 do
begin
S := Broad.M.Lines.Strings;
if LeftStr(S, 4) = '<!--' then
begin
for J := 4 to Length(S) do
begin
if MidStr(S, J, 3) = '-->' then
Break;
end;
S := MidStr(S, 5, J - 5);
S := Broad.IniSub.ReadString(SName, S, '');
Broad.M.Lines.Strings := RightStr(Broad.M.Lines.Strings, Length(Broad.M.Lines.Strings) - J - 2);//把头注释去掉
if (NotCaseScript(LowerCase(LeftStr(S, 4)))) or (Main.CurrentName > '') then
begin
AppWantReturn := 1;
try StrCut.ExeScript(S, '');
finally DoScript(I, SubS, S, BName);//内容已在MValue里,要逐行处理
end;
end;
end;
end;
I := Broad.IniBroads.ReadInteger(BName, 'allwaysdel', 0);
if Broad.DetailCount > I then Broad.DetailCount := Broad.DetailCount - I;
BeforeP(BName, SName, SubS);
try Broad.IniSubProperty.Free; except end;
end;
//这里再说明一下ExeScript过程是在之前最基础的过程中在另一个StrCut窗体中建的一个专门处理特定格式的文本的过程,通过调试和在其他地方应用,应该没问题:它的功能比如将“{cm}当事人基本情况”转换为txt文件中标注“当事人基本情况”所在的整个段落。
//DoScript(I, SubS, S, BName)比较关键,很可能问题就在此,它的功能是将ExeScript处理后所得的结果比如“当事人基本情况”(在StrCut.MValue中)填到txt文本中对应位置,并打开一个完成txt文件修改之前的小窗口(该窗口在确实之前还有小部分修改工作)。
//该小窗口无论确定还是关闭都不会发生问题,而在多次点击“制作”按钮,也就是多次调用了BMakeClick(Sender: TObject);过程,就会发生错误,错误时常不同,除了上述一程错误,另一种也是关于内存的提示,还有一种严重错误就是直接退出程序。而我进行的都是一模一样的操作。