在设计或者打印预览时,如果设置了FileName,可能反而出错。
procedure TfrxReport.ShowPreparedReport; var WndExStyles: Integer; begin FPreviewForm := nil; if FPreview <> nil then begin FPreview.Init(Self, FPreviewPages); //进入 // FPreview.FReport := Self; // FPreview.FPreviewPages := FPreviewPages; // if not FPreview.Init then // FPreview.AddPreviewTabOrSwitch(Report, '', '', False); end else begin FPreviewForm := TfrxPreviewForm.Create(Application); with TfrxPreviewForm(FPreviewForm) do begin Preview.FReport := Self; Preview.FPreviewPages := FPreviewPages;
function TfrxPreview.Init(aReport: TfrxReport; aPrevPages: TfrxCustomPreviewPages): Boolean; begin Result := False; if FCalledFromPreview Then Exit; Report := aReport; PreviewPages := aPrevPages; if FInitialized then if EachReportInTab then begin AddPreviewTabOrSwitch(Report, '', '', False); Exit; end; if Parent is TfrxPreviewForm then FPreviewForm := TForm(Parent); FWorkspace.PreviewPages := PreviewPages; FThumbnail.PreviewPages := PreviewPages; TextFound := False; FWorkspace.FLastFoundPage := 0; LastFoundRecord := -1; FAllowF3 := False; if not FInitialized then begin if Report.FileName <> '' then AddPreviewTab(Report, ExtractFileName(Report.FileName)) //这里 else AddPreviewTab(Report, Report.ReportOptions.Name); end else begin
function ExtractFileName(const FileName: string): string; var I: Integer; begin I := LastDelimiter(PathDelim + DriveDelim, FileName);//这里 Result := Copy(FileName, I + 1, MaxInt); end;
function LastDelimiter(const Delimiters, S: string): Integer; var P: PChar; begin Result := Length(S); P := PChar(Delimiters); while Result > 0 do begin if (S[Result] <> #0) and (StrScan(P, S[Result]) <> nil) then//这里 Exit; Dec(Result); end; end;
奇怪的是单独 调用
ExtractFileName ,LastDelimiter
不会报错。