Jump to content

Lars Fosdal

Administrators
  • Content Count

    3577
  • Joined

  • Last visited

  • Days Won

    121

Everything posted by Lars Fosdal

  1. https://quality.embarcadero.com/browse/RSP-31084
  2. program SydnetExceptionsReRaise; {$APPTYPE CONSOLE} uses System.SysUtils; function LogExceptionFunc(const E: Exception): string; begin Result := E.Message; Writeln('Func Log + ' + E.Message); end; procedure LogExceptionProc(const E: Exception); begin Writeln('Proc Log + ' + E.Message); end; procedure Test1_OK; begin try try raise Exception.Create('This is a raised Exception'); except on E: Exception do begin LogExceptionProc(E); raise; end; end; except on E: Exception do begin Writeln('Test 1 ', E.ClassName, ': ', E.Message); end; end; end; procedure Test2_OK; var lMessage: string; begin try try raise Exception.Create('This is a raised Exception'); except on E: Exception do begin lMessage := LogExceptionFunc(E); raise; end; end; except on E: Exception do begin Writeln('Test 2 ', E.ClassName, ': ', E.Message); end; end; end; procedure Test3_Fail; begin try try raise Exception.Create('This is a raised Exception'); except on E: Exception do begin LogExceptionFunc(E); raise; end; end; except on E: Exception do begin Writeln('Test 3 ', E.ClassName, ': ', E.Message); end; end; end; begin try try Test1_OK; Test2_OK; Test3_Fail; except on E: Exception do begin Writeln('Unexpected ',E.ClassName, ': ', E.Message); end; end; finally Write('Press Any Key'); ReadLn; end; end. Here you go. No joke.
  3. If you expand it with the examples that actually works - it would be sufficient for a QP, IMO.
  4. Interestingly, the two following changes eliminates the AV on raise. Either, change LogException to a procedure procedure LogException(const E: Exception); begin Writeln('Log + ' + E.Message); //Logging('Blah blah' + Result, 'Exceptions'); FYI end; or assign the result to a variable: on E: Exception do begin lMessage := LogException(E); // AV in Sydney, OK i Berlin // LogExceptionEx(E, lMessage); // OK raise; end; It does look like a compiler problem. Is there a QP report?
  5. Lars Fosdal

    a pair of MM test

    Clearly, it is based on jokes alone.
  6. I guess injecting a deprecated statement for the old class could be an option - or is that too brutal.
  7. Lars Fosdal

    Any news about the Delphi Roadmap

    @Jim McKeeth should kick some shins to have a new roadmap produced.
  8. Lars Fosdal

    check if App Minimized

    if WinApi.Windows.IsIconic(Application.MainForm.Handle) then begin // Log something end; https://docs.microsoft.com/en-gb/windows/win32/api/winuser/nf-winuser-isiconic?redirectedfrom=MSDN
  9. I can't remember why not - prolly because Numlock was the first to spring to mind. Anyways, I've been using this for years now, and never experienced any adverse side effects.
  10. Have any of you seen something similar to this? Delphi 10.3.3
  11. Well, it sort of forced my hand in switching to 10.4.1 a little ahead of time. Going live on new version to day. Oh, such fun to reconfigure all the build scripts 😛
  12. Sounds like an excellent suggestion!
  13. Much annoying. Very bug. 😛 https://quality.embarcadero.com/browse/RSP-30576
  14. Doh! Ref. https://blogs.embarcadero.com/ide-plugins-in-rad-studio-10-4-1/ The solution was to use GetIt to uninstall 1.6.1 and install 1.6.2.
  15. Lars Fosdal

    Add test to Stringgrid

    There is an extra fee for solving homework problems, isn't there?
  16. Thread split off from if Data.TryGetValue(aId, vNewData) then vNewData.DataName := aName; else begin vNewData := TDataRec.Create; vNewData.DataId := aId; vNewData.DataName := aName; Data.Add(aId, vNewData); end; @Stefan Glienke - What is the best container for random lookup access for records?
  17. Lars Fosdal

    Best Practices for FireDAC FetchMode/RecordCount Settings

    Indexing and doing index maintenance is crucial to maintain performance. If the queries can be done completely free form, that will be a challenge. IMO, there are few settings to FireDAC that really affects the performance once the query has been passed to the server.
  18. In my experience, it is far easier to use classes when you need to modify contents. I wish it weren't so, and it can be worked around - but then usually with pointer references, and at that point (pun intended), I might as well be doing objects and maintain type safety and support polymorphism.
  19. I am trying to improve my tendency to spin off a discussion in a thread focused on something else, so here we are. To reiterate, my preference for classes over records with regards to generics, is that read-only generics for records works perfectly for its use, but when you need to update the content in the record, it becomes a very different exercise. You either need to have structure specific methods to change the record field values, or you must copy the entire record, modify it, and the copy it back. The first option wreaks havoc on reuse, and the second option can become a performance bottleneck if the record is large. Even more so, if the record is multidimensional, containing records with arrays of records. The same kind of change in a multidimensional class, is trivial in comparison. @David Heffernan - hence my "the amount of reuse" argument.
  20. We also know that the two need to be handled differently when it comes to changing their contents.
  21. Lars Fosdal

    On the use of Interposers

    I splitted this thread off this
  22. Lars Fosdal

    What is wrong with TStringList

    Splitted off the Interposer discussion.
×