Jump to content


  • Content Count

  • Joined

  • Last visited

  • Days Won


Everything posted by timfrost

  1. timfrost

    VCL Handling of dpi changes - poor performance

    After some of my VCL applications, I find the worst performer for repaints when dragging between different resolution screens is Regedit.
  2. timfrost

    community.embarcadero.com's forums

    It would take a lot of sorting out to make the content useful. When the server failed, I recall that the re-built server always had new message IDs so the threading failed and one had to start again with a full download in Xananews, with whatever content was still on the new server. So there are gaps and many duplications. Xananews has a folder for each newsgroup, with one file (messages.dat) containing all the raw NNTP messages and another (articles.dat) with all the threading data. In the messages folder each message starts with a long 'XMsg' header line so each message can be identified; and I think Xananews has the ability to rebuild the 'articles' file as well as maintain it. Xananews can also export messages into plain text files, each message with full NNTP headers and ending with a '.' (but this needs to be done manually for each newsgroup), or whole newsgroups can be compressed and exported, but you would need to study the Xananews Delphi source to unpack them. Xananews used group folders (named by the user) containing each set of folders with a common prefix. The groups I have vary in size from 46 folders of borland.public newsgroups, down to around 36 of embarcadero.public newsgroups. I have four group folders: the "borland" group is 636MB. The other three folders contain embarcadero.public newsgroups and are respectively 255MB, 427MB and 287MB. Looking in delphi.non-technical (the largest group by message volume) the four group folders run from: 2004.04.02 to 2008.08.07 borland 2008.01.02 to 2018.04.21 embarcadero 2008.08.09 to 2011.01.12 embarcadero 2008.08.09 to 2011.12.22 embarcadero In some of the borland newsgroups, content starts earlier or later than 2004. For example b.p.announce runs from 1997 to 2003. And where the top level groups overlap, they have different sets of newsgroup folders. In the newsgroup folders, where the texts match, the headers and message IDs are different. Some of the borland message.dat files have all-null-byte gaps where Xananews shows the article with missing text. If someone wants to take on this archaeology project, I can ZIP the files and upload them, but I do not have the time to do much more than this! If anyone has done this already, with better organized backups than mine, I have not heard of them.
  3. timfrost

    community.embarcadero.com's forums

    I still have the contents of Borland and Embarcadero newsgroups going back to around 2007, searchable in Xananews. But it is years since I have opened them or searched for anything.
  4. For me, this hardly ever worked in 8.4.1, and it was great, when I first installed 8.4.2, to find it reliable again. Now, it's gone; I will have to experiment removing stuff to see if I can get it back.
  5. It's an improvement on a Trie. The Dr Dobbs article (still on line at https://www.drdobbs.com/database/ternary-search-trees/184410528) claims in their Conclusion, "Ternary search trees are efficient and easy to implement. They offer substantial advantages over both binary search trees and digital search tries. We feel that they are superior to hashing in many applications.". See also:
  6. You still have not said what your use case is. My own need for fast string lookup (and finding either an integer or a pointer), is principally to load once, lookup many times, and I am not too concerned about memory usage or load time. The task usually is to handle up to a couple of hundred strings of about 25 to 200 characters. For this I have long used a ternary search tree, which I first learnt about from Dr Dobbs Journal, April 1998. I adapted the C version for Delphi 1, I think, and by now the lookup supports Unicode strings I cannot post useful timings, because you cannot compare my environment to yours, but I just did a test load of quarter of a million random 64-character strings into the tree in 390ms. The speed of lookup is what matters to me and this is too fast to bother to benchmark it. But those 250k strings (far more than I need in practice) took a tree size of 116MB. Whether this search method would be useful to you depends on how you value load speed and memory against lookup time. Lookup time may not the only thing you should be considering.
  7. timfrost

    50 Years of Pascal

    I am another UCSD Pascal user from about the same time, on my first microcomputer, a North Star Horizon (the model with the wooden case). I still have the CP/M and USCD Pascal disks, manuals, and 'User Manual and Report'; and the computer, but with no VDU to see if it still works. The first software tools I published were for various microcomputer-supported languages (including PL/1) before Lifeboat Associates persuaded me that C was the future. So I gave up Pascal and missed out on TP, only going back to writing in Pascal when Delphi 1 arrived
  8. In the Webinar yesterday, responding to a question about compiler updates/upgrades, I heard Marco say that 'Getit is a bit of a problem because it always uninstalls the old version before installing'. How can anyone defend this approach? What happens when you test the new version and something fails to work? Where is the old source code for you to compare the differences and either fix them or adjust your usage? A component installer should never force an install into the location of the production library; it should always be checked and validated before it is too late to do this.
  9. timfrost

    Visual Control for selecting a date range

    TMS VCL UI Pack has a 'calendar group' component that does exactly this, with three months to a view. I have used it and it works well.
  10. Very interesting topic! I also have been getting 10.4.1 IDE instability, and in 10.4 too. Not quite enough to stop work and try to track it down, but annoying. After reading the start of this topic I looked at my MMX version, and found it was 15.0.29, so I experimentally upgraded to 15.0.32 and the instability and hangs got much worse. I dropped back to 15.0.30 and no IDE problems yet. I run my IDE on a 4k screen at 200%, and dropping to 100% is not an option.
  11. For this sort of question I always used to go to www.efg2.com to find the answer, usually with success. It had code samples for all sorts of graphics and color algorithms. The site has gone now, but if you go to that URL, it has links to the Internet Archive where it can all still be found. A bit slower to navigate now, but perhaps worth a look.
  12. timfrost

    The Case of Delphi Const String Parameters

    We seem to be speaking here only about accidentally modifying the const string from inside the function. And Marco's blog did not mention the word 'thread'. But presumably another thread could cause the same address problem by modifying the string, and the problem would not arise if the function lacked the const and was therefore passed its own copy to read. Or am I overcomplicating this?
  13. timfrost

    madexcept inside a DLL

    I suggest you look instead at : http://help.madshi.net/madExceptDemo.htm
  14. timfrost

    IDGlobalProtocols GmtOffsetStrToDateTime

    If you need to handle time zones all around the world, for users and senders in different time zones, I recommend TZDB from https://github.com/pavkam/tzdb. It is essentially a single PAS file which has all the TZ and DST data and functions you need. There are also other tools, including one to update the source code from the IANA database, which is updated a few times a year. Of course you also need to follow the advice above about how to parse the input! As I have said here before, I suggest tweaking the database extraction tool to exclude all the historical data, which it seems unlikely you will need.
  15. timfrost

    FastMM5. Can't get a log file

    You can call FastMM_ApplyLegacyConditionalDefines if you already have defines in your code to control logging; it will then use them. But there is new, finer, control of the logging for FastMM5 and you can select FastMM_LogToFileEvents as you wish. The extensive documentation in the source describes all this, and there are basic instructions about logging options at https://github.com/pleriche/FastMM5. Someone (but perhaps not from the USA during this holiday season) will no doubt be along help with a more comprehensive answer; I mainly make do with the defaults.
  16. Your logs only show what is coming in, not what is going out, but my guess is that the Indy server rejected the BDAT command (binary data) as invalid. I have never seen one before in the wild, and I see that the RFC1830 that introduced this command in August 1995 marks it as 'experimental'.
  17. timfrost

    Issue with UsesCleaner..

    I have only seen a link to a zip with the EXE/CFG files. If I had known where to find the source I might have worked out what compressed=0 does!
  18. timfrost

    Issue with UsesCleaner..

    It would be much more logical to have an option in UsesCleaner which makes it follow the settings in GExperts formatter. I want to define my formatting preferences in the formatter, which seems to me to be the right way to do it. Why should I have to reformat every unit with my chosen formatter settings (without any option set to match another application, of course) in order to fix the unwanted format changes that the UsersCleaner has made? If I could find the UsesCleaner site and a place for feature requests, I would add one: please add an option to never change unit sequence and never add or delete newlines in the uses section and always retain comments. This would then cover a preference in any formatter to have one unit per line.
  19. timfrost

    Listview control with filtering like File Explorer

    I use TMS TadvStringGrid when I need to do this, but it is not free and not available on its own. It can build the combobox with an entry for every different value in the column, or you can override it to create entries manually such as 1-20. 21-40, >40, and filter them yourself. It puts an icon in the header row which you click on to filter. I am sure that there are other grids available from other vendors with this capability, but I happen to use TMS
  20. Despite the name of this topic I cannot remember seeing any of your code which actually references a UTFstring. If you want an answer to the original question, the 'lazy programmer' solution (and so occasionally mine) is to pass the UTF8 text to the Windows API MultiByteToWideString function with source code 65001 (UTF8). With the normal options, any invalid UTF8 sequences should be returned as Ufffd in the returned Unicode string, and you can walk the result and drop them. This is not the 'proper' way to approach the problem, but it should work.
  21. timfrost

    Project Magician gotcha

    Sent; it is my broken project file which causes it to crash!
  22. timfrost

    Project Magician gotcha

    Does Project Magician support 10.4.1 project files? Or alternatively, is the command-line program supposed to work if I select none of the IDE options? If the answer to both of these is 'yes' I will report a null-pointer exception when running the command-line version to try it.
  23. timfrost

    Best way to prevent multiple instances? Mutex not working

    But lack of SeCreateGlobalPrivilege privilege may cause creation of the Mutex to fail, as was mentioned by the OP.
  24. timfrost

    Best way to prevent multiple instances? Mutex not working

    The very simple Mutex may not work if multiple instances of your application may be running in different accounts, with different credentials, or as a service.
  25. timfrost

    Best way to prevent multiple instances? Mutex not working

    I have tried several components over many years, and the only one that has proved simple and reliable under all circumstances is JclAppinst.pas in the JCL. Many options if you need them but for simply checking that there there is only one instance you need only two lines of code added to your DPR: one supplying a GUID and then a call to JclAppInstances.CheckSingleInstance.