Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- // 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.
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement