// See also: http://pastebin.com/WBYbtbSn - "how to always create ZIP/ELP file"
// See also: http://pastebin.com/3irtZ3iU - "how to save/capture ZIP/ELP file"
// Zipped bug report (.elp) is created only for sending.
// Therefore, only send code has access to zipped bug report.
// It's not created if no sending is used.
// This means that if we want to capture/save this file - then we can only do this from send code.
// Consider using "Save a ZIP file copy in case of send failure" and "Copy log text in case of send error" options
// (see: http://www.eurekalog.com/help/eurekalog/advanced_page.php )
// instead of this code.
uses
ActiveX,
ETypes, ESend, ESysInfo, EModules;
type
// Create a new "send engine".
// It will be dummy that will perform no actual sending.
// Instead - it will save all files attachments to folder.
TSaveToFile = class(TELUniversalSender)
private
procedure Dummy(Sender: TObject);
public
function SendMessage: TResponse; override;
end;
{ TSaveToFile }
function TSaveToFile.SendMessage: TResponse;
procedure CopyBugReport(const AFileName: String);
var
X: Integer;
TargetPath: String;
begin
// Copy primary attachment (.elp bug report)
Win32Check(CopyFile(PChar(AttachedFiles[0]), PChar(AFileName), False));
if AttachedFiles.Count = 1 then
Exit;
// Copy all remaining files attachments to some folder.
// Usually there is only one file (.elp), but it can be several files - depends on your project options and your customization code
TargetPath := ExtractFilePath(AFileName);
for X := 1 to AttachedFiles.Count - 1 do
Win32Check(CopyFile(PChar(AttachedFiles[X]), PChar(TargetPath + ExtractFileName(AttachedFiles[X])), False));
end;
var
SaveDialog: TSaveDialog;
TargetFile: string;
TargetExt: string;
NeedToUninitialize: Boolean;
begin
Finalize(Result);
FillChar(Result, SizeOf(Result), 0);
try
if AttachedFiles.Count = 0 then
begin
// We should not really get there, this is just fail-safe check
Result.SendResult := srNoExceptionInfo;
Exit;
end;
// Ask where to save bug report
// Send is performed in background thread by default (use options to change that)
// We need to initialize COM for use in modern file dialogs (Vista+)
NeedToUninitialize := Succeeded(CoInitialize(nil));
try
SaveDialog := TSaveDialog.Create(nil);
try
TargetFile := ExtractFileName(AttachedFiles[0]); // usually this is primary bug report file
TargetExt := ExtractFileExt(TargetFile); // can be .el or .elp - depends on your options
SaveDialog.Title := 'Save Bug Report';
SaveDialog.InitialDir := GetFolderPersonal; // "My Documents"
SaveDialog.FileName := TargetFile;
SaveDialog.DefaultExt := TargetExt;
SaveDialog.Filter := 'Bug Reports|*' + TargetExt + '|All Files|*.*';
SaveDialog.FilterIndex := 0;
SaveDialog.Options := [ofOverwritePrompt,ofHideReadOnly,ofPathMustExist,ofNoReadOnlyReturn,ofEnableSizing,ofDontAddToRecent];
// Assigning OnIncludeItem, OnShow or OnClose will turn off Vista dialogs (which requires COM)
// Classic dialogs do not require COM
if not NeedToUninitialize then
SaveDialog.OnClose := Dummy;
if SaveDialog.Execute then // <- this may fail without COM initialization - depends on your IDE and OS
CopyBugReport(SaveDialog.FileName);
finally
FreeAndNil(SaveDialog);
end;
finally
if NeedToUninitialize then
CoUninitialize;
end;
// Indicate that "send" was a success.
Result.SendResult := srSent;
except
on E: Exception do
begin
// Indicate that "send" was a failure.
Result.SendResult := srUnknownError;
if E is EOSError then
Result.ErrorCode := Integer(EOSError(E).ErrorCode);
Result.ErrorMessage := E.Message;
end;
end;
end;
procedure TSaveToFile.Dummy(Sender: TObject);
begin
// Do nothing
end;
initialization
// Register our class to be used by EurekaLog
RegisterSender(TSaveToFile);
// Set our sender as the one and only - this is important
CurrentEurekaLogOptions.SenderClasses := TSaveToFile.ClassName;
// Change "Send" button to "Save" button in all dialogs
CurrentEurekaLogOptions.CustomizedTexts[mtMSDialog_SendButtonCaption] := 'Save Report';
CurrentEurekaLogOptions.CustomizedTexts[mtMSDialog_NoSendButtonCaption] := 'Don''t Save';
CurrentEurekaLogOptions.CustomizedTexts[mtDialog_SendMessage] := 'Save this report into file';
end.
Comments
0 B
|👍
/👎
0 B
|👍
/👎