-
Content Count
93 -
Joined
-
Last visited
-
Days Won
2
Everything posted by Berocoder
-
Eventlog show Faulting application name: bds.exe, version: 29.0.53571.9782, time stamp: 0x66d2e9f2 Faulting module name: AttracsComponentsXE12Athens.bpl_unloaded, version: 1.0.0.0, time stamp: 0x6731159b Exception code: 0xc000041d Fault offset: 0x0093958c Faulting process ID: 0x2b50 Faulting application start time: 0x01db33ad2fc10672 Faulting application path: C:\Program Files (x86)\Embarcadero\Studio\23.0\bin\bds.exe Faulting module path: AttracsComponentsXE12Athens.bpl AttracsComponentsXE12Athens.bpl is an own custom package that contain both own components and commercial we bought with source. So in this case eventlog was actually useful.
-
Thanks, will look at eventlog. But honestly Windows eventlog itself is cryptic. It has never shown any valuable information for me...
-
Normally a developer want to use async mode when send emails to make main thread more responsive. But I am in the situation to maintain an old ERP application. We use Delphi 11.3 for that. Currently it use 2 kind of email solutions. - SMTP. This contact an inhouse emailserver - SendGrid https://sendgrid.com There is now a request for a third email solution OutLook Azure from one big customer. So TMS FNC CloudPack component was bought. It was fairly easy to send emails once you get client id, secret etc correct. But the component only use asynchronous design which is correct from architecture point of view. The current code that use email method expect synchronous design. As long as emailing is working my current solution is ok. But there is no way to check and notify user in case of problem. It can be network or other reasons for error. To rewrite it require a major refactoring, that is also risky. So the most pragmatic solution would be to simulate blocking mode with FNC CloudPack if possible. So made 2 public methods in the mailing class. Send and SendWait. Send use asynchronous on places where it is possible and SendWait use synchronous. Current implementation function TATMail.SendCloudMail(const aReceiver, aReplyTo, aCc, aSubject, aBody, aAttachments: string; ACallBack: TEMailCallBack; out AErrorMessage: string): Boolean; var oOutLook: TOutlookEmail; begin oOutLook := TOutlookEmail.Create(aReceiver, aReplyTo, aCc, aSubject, aBody, aAttachments, ACallBack); if not Assigned(ACallBack) then begin while true do begin if oOutLook.Done then break; Application.ProcessMessages; end; TraceLog.Trace('After blocking'); AErrorMessage := oOutLook.fMessage; Result := oOutLook.fSuccess; end else Result := True; // Doesn't matter. None blocking code should never check result. end; I am aware that ProcessMessages is famous for cause random bugs and would prefer to no using it. I see that email component use CheckSynchronize to trigger the callback event. I tested while event.Waitfor(100) <> wrSignaled do begin CheckSynchronize(50); end; I asked similar thing on Stack overflow https://stackoverflow.com/questions/79094352/how-can-i-convert-code-to-synkron-in-delphi And @Dalija Prasnikar suggested that. But CheckSynchronize is supposed to run in the background thread not in main thread ? Could be some misunderstanding. Anyway it didn't work. So I search for a solution in main thread that cooperate well when backgroud thread is calling CheckSynchronize. There is also some code on pastebin https://pastebin.com/EXsf4ywP Only as illustration. It won't compile
-
Simulate blocking mode to send Email
Berocoder replied to Berocoder's topic in Network, Cloud and Web
@Remy Lebeau thanks for the code with WaitForMultipleObjects. I might try that later π -
Simulate blocking mode to send Email
Berocoder replied to Berocoder's topic in Network, Cloud and Web
I find a solution now. I have not done much of thread-handling before Here are the modified code: function TATMail.SendCloudMail(const aReceiver, aReplyTo, aCc, aSubject, aBody, aAttachments: string; ACallBack: TEMailCallBack; out AErrorMessage: string): Boolean; var oOutLook: TOutlookEmail; begin oOutLook := TOutlookEmail.Create(aReceiver, aReplyTo, aCc, aSubject, aBody, aAttachments, ACallBack); if not Assigned(ACallBack) then begin // Simulate blocking while oOutLook.EventSignal.WaitFor(100) = wrTimeout do begin CheckSynchronize(50); end; AErrorMessage := oOutLook.fMessage; Result := oOutLook.fSuccess; end else Result := True; // Doesn't matter. None blocking code should never check result. end; I made 2 important changes 1. Call SetEvent in the event that is called by FNC mailcomponent after mail was sent. I somehow thought that this happen automatically. 2. In while loop compare with wrTimeOut instead of "<> wrSignaled". But when I think about it now maybe not so important... -
Wrote a blog today how to use interfaces to remove uses in a unit. https://berocoder.blogspot.com/.../how-to-remove... Code for project https://github.com/bero/InterFaceWithGUI
-
Hi I want to know if anyone actually can debug a Delphi console program reliable? My setup is latest Delphi 12.1 on a Window 10 running in KVM. Host is Ubuntu 24.04. Sometimes it works to singlestep source but most of the time IDE just freeze and I have to kill itπ I know 2 other developers with same experience as mine. I just don't understand how testing works at Embarcadero. This kinds of bugs must be catched before release! My report here https://embt.atlassian.net/servicedesk/customer/portal/1/RSS-1415
-
Sourcecode for BOLD published at GitHub
Berocoder replied to Markus Kinzler's topic in Community Management
I am a member of that team using Delphi 11.3 now if someone is interested to know more about BoldI can tell more π -
Builtin Refactoring in Delphi is bad. I think we all agree that MMX Explorer works better. Have there ever been any talk with Embarcadero about use MMX Explorer instead? There is a link https://www.facebook.com/groups/137012246341854/permalink/7883294345046900/ that discuss replace builtin refactoring. Any license problems?
-
Interesting, thanks for sharing!
-
Do you need an ARM64 compiler for Windows?
Berocoder replied to Lars Fosdal's topic in Cross-platform
I assume those Delphi developers that using a Mac M1, M2 or M3 would be happy if Embarcadero would recompile Delphi IDE and compiler to Windows ARM. What is the potential problem with that ? -
Peganza and pascal expert is great products. I use them both in my daily work to ensure quality!
-
What code to you prefer and why? Alternative 1 if aMessageType = 'EXPREG' then DecodeExportReg(vDoc, aCdn, aRequestCorrelation, aMessageText) else if aMessageType = 'EXPACC' then DecodeExportAcc(vDoc, aCdn, aRequestCorrelation, aMessageText) else if aMessageType = 'EXPERR' then DecodeExportErr(vDoc, aCdn, aRequestCorrelation, aMessageText) else if aMessageType = 'EXPREL' then DecodeExportRel(vDoc, aCdn, aRequestCorrelation, aMessageText) else if aMessageType = 'EXPREF' then DecodeExportRef(vDoc, aCdn, aRequestCorrelation, aMessageText) else if aMessageType = 'EXPREQ' then DecodeExportReq(vDoc, aCdn, aRequestCorrelation, aMessageText) else if aMessageType = 'EXPINF' then DecodeExportInf(vDoc, aCdn, aRequestCorrelation, aMessageText) else if aMessageType = 'EXPREJ' then DecodeExportRej(vDoc, aCdn, aRequestCorrelation, aMessageText) else if aMessageType = 'EXPCLA' then DecodeExportCla(vDoc, aCdn, aRequestCorrelation, aMessageText) else if aMessageType = 'EXPCON' then DecodeExportCon(vDoc, aCdn, aRequestCorrelation, aMessageText) else if aMessageType = 'EXPAME' then DecodeExportAme(vDoc, aCdn, aRequestCorrelation, aMessageText) else if aMessageType = 'EXPIRJ' then DecodeExportIrj(vDoc, aCdn, aRequestCorrelation, aMessageText) else if aMessageType = 'EXPARJ' then DecodeExportArj(vDoc, aCdn, aRequestCorrelation, aMessageText) else if aMessageType = 'EXPHRT' then DecodeExportHrt(vDoc, aCdn, aRequestCorrelation, aMessageText) Alternative 2 var Index := IndexStr(aMessageType, ['EXPREG', 'EXPACC', 'EXPERR', 'EXPREL', 'EXPREF', 'EXPREQ', 'EXPINF', 'EXPCLA', 'EXPCON', 'EXPAME', 'EXPIRJ', 'EXPARJ', 'EXPHRT']); case Index of 0: DecodeExportReg(vDoc, aCdn, aRequestCorrelation, aMessageText); 1: DecodeExportAcc(vDoc, aCdn, aRequestCorrelation, aMessageText); 2: DecodeExportErr(vDoc, aCdn, aRequestCorrelation, aMessageText); 3: DecodeExportRel(vDoc, aCdn, aRequestCorrelation, aMessageText); 4: DecodeExportRef(vDoc, aCdn, aRequestCorrelation, aMessageText); 5: DecodeExportReq(vDoc, aCdn, aRequestCorrelation, aMessageText); 6: DecodeExportInf(vDoc, aCdn, aRequestCorrelation, aMessageText); 7: DecodeExportRej(vDoc, aCdn, aRequestCorrelation, aMessageText); 8: DecodeExportCla(vDoc, aCdn, aRequestCorrelation, aMessageText); 9: DecodeExportCon(vDoc, aCdn, aRequestCorrelation, aMessageText); 10: DecodeExportAme(vDoc, aCdn, aRequestCorrelation, aMessageText); 11: DecodeExportIrj(vDoc, aCdn, aRequestCorrelation, aMessageText); 12: DecodeExportArj(vDoc, aCdn, aRequestCorrelation, aMessageText); 13: DecodeExportHrt(vDoc, aCdn, aRequestCorrelation, aMessageText); end; Regards Roland Bengtsson
-
In our big ERP application we have always compiled it with Optimization off in compiler settings to production. Delphi 10.4 is used but plan is to switch to 11.3 during summer. With our biggest customer the volumes has increased and the application can sometimes feel slow. So I tried to compile it with Optimization on as that is a cheap way to increase performance. Everything seems to work fine. But there is one thing. Exceptions are logged to a textfile. Callstack/Stacktrace are also logged. We use JCL for that. It works fine before but now I see sometimes callstacks make no sense anymore. Obviously I suspect Optimization for that. So curious how other developers handle this case ? Is there other components like EurekaLog that handle optimization better and still can generate a reliable callstack ? Or maybe we have to choose between better performance or reliable callstack ? Regards Roland Bengtsson
-
I would prefer alternative 2. But you are right that it is error prone on change as it is harder to read. And as David said using enum would be best choice. Currently alternative 1 is used so I think I leave it as is for now π
-
Or Ctrl + Alt + y with MMX formatter installed. It is a bit easier for fingers π
-
Ok go to FastMM5.pas line 144 {.$Include FastMM5.inc} // Enable to turn on log leaks to file Remove dot and it works π
-
Thanks for the hint. I had the exact same problem
-
Thanks for the hint. I had the exact same problem
-
I am a bit confused of TestInsight. I am using version 1.2.0.1 with Delphi 11.2. I have marked my testproject Discover tests find 34 I mark 2 tests and run selected with Shift+Alt+F9 Now the strange case. I mark 2 new tests in skipped and run again with Shift+Alt+F9. The 2 already successful seems to run. Duration change. But not the new tests. I expect to see 4 success and 30 skipped now Now I uncheck the 2 tests at top and leave only 2 selected tests and run with Shift+Alt+F9. It seems to be ignored and none tests was executed. Did I do anything wrong or have I found a bug ? /Roland
-
Hi, I am using latest delphi with all patches. Delphi 11 Version 28.0.46141.0937 When I debug my application by singlestep code with F7 or F8 sooner or later I cannot continue. IDE is still responsive but programcounter hang and singlestep code have no effect. I have seen this problem before also with previous 10.4. Anyone with similar experience ? What can I do as workaround except to restart my application and try again. It seems to be completely random...
-
32-bit target big VCL desktop application for Windows.
-
Ok, I have a Scroll lock key on my keyboard. I can try that next time it happens. I hope there is a bugreport on this on https://quality.embarcadero.com
-
Ok, but I don't understand what you mean. My F-keys works find outside Delphi in this case. What is a "Lock" key ?
-
Ask for comments to improve this code
Berocoder posted a topic in Algorithms, Data Structures and Class Design
This is the code for Supports method. I know the name is bad, SysUtils.Supports is different. But we use this on thousands of places. Too late to change now. Now I also use Pascal Analyzer. That give a warning STW10 Out parameter is read before set (STW10) This section lists out parameters that are read before set in the procedure. https://www.peganza.com/PALHelp/clip0211.png And yes it is correct. First line TObject(ResObj) := nil; Read the out parameter before set it. ResObj have no class in parameter. Reason is that we want to send any subclass derived from TBoldObject. If I set type to TObject that would not work any more. Any suggestion how I can remove the warning and still preserve the implementation ? {: Casting between two objects derived from two different classes Resobj must inherit from aObject @param aObject The object to cast from @param aClass The class to cast to @ResObj The resulting object @return True if successful otherwise false} function Supports(const aObject: TObject; const aClass: TClass; out ResObj): Boolean; overload; begin TObject(ResObj) := nil; if aObject is aClass then begin if not ((aObject is TBoldObject) and (aObject as TBoldObject).BoldObjectIsDeleted) then TObject(ResObj) := aObject; end; result := TObject(ResObj) <> nil; end; Example of usage var myInvoice: TInvoice; // This inherit TBoldObject if Supports(myclass.somelink, TInvoice, myInvoice) begin // code that use myInvoice end;