Jump to content

chkaufmann

Members
  • Content Count

    145
  • Joined

  • Last visited

Everything posted by chkaufmann

  1. chkaufmann

    32bit vs 64bit

    We are in the discussion if we should switch our application from 32bit to 64bit. Basically it seems to work fine under 64bit, however I'm not sure, if there may be some problems regarding resource usage. Our main customer runs the application on an RDP Terminal Server. So my concern is, if this is relevant because a 64bit application always uses more RAM compared to the 32bit version. Christian
  2. A TObject has an InstanceSize of 8 bytes. I searched the internet to understand why. 4 bytes would make sence (pointer to the classtype or whatever). All I find are old postings about this change back in 2009, but is this still valid for the current version? And if the second pointer is available for object locking, can somebody point me to an explanation for this. To be honest, I did not really understand how this works. Currently I use a "Spring.Lock" in all my objects for thread synchronization, but maybe this is not necessary and I could use the built in lock feature of TObject? Christian
  3. chkaufmann

    New TForm - Defaults

    When I create a new form (File - New - VCL Form) font and size is always like this: Font.Height = -11 Font.Name = 'Tahoma' but I would like to have it like this: Font.Height = -12 Font.Name = 'Segoe UI' Is there a simple way to achieve this? I remember, that I saw a sample with an IDE expert for this, but is there no way to set this default in the IDE or "per project"? Christian
  4. chkaufmann

    32bit vs 64bit

    I have no memory issues anymore since I solved these with other changes in the code. Maybe I'm too old, but personally I think, because there is need to change I would stay with 32bit. But others in our team think we should change to 64bit because this is the technology of today. Therefore I try to collect objective arguments (pros and cons). Christian
  5. And what about using a TLightweightMREW for each of my objects compared to TMonitor and Spring.Lock? I probably need this to have a reentrant version of the lock: https://www.thedelphigeek.com/2021/02/readers-writ-47358-48721-45511-46172.html Christian
  6. When I read https://www.delphitools.info/2013/06/06/tmonitor-vs-trtlcriticalsection/, then I should not use TMonitor. Is this still the case? Is there another simpler solution to lock an object in order to avoid that multiple threads change an internal value. Locktime will be very short and conflicts probably happen very rarely.
  7. I have to solve some "out of memory" problems during an import in my application. My application is still 32bit and when I check the memory in the process explorer, it's not 100% clear for me, which values are critical. Here are my questions: - What is an easy way to see the number of objects of each class during debugging? Do I have to build something on my own? Can I get this info for records as well? - Is it worth to switch the application to 64bit? - For 32bit, which values in the Process Explorer are critical and what are the maximum values during runtime that will be save? Thanks for any hints and tips here. Christian
  8. chkaufmann

    Memory Management with many objects

    Thanks, this works. But for objects only. Is there a general way to count the number of a "record" instance as well? Christian
  9. Hi, I use FastMM5 in a unit for logging, however I don't want this unit/code to be compiled into my IDE package. Is there a predefined constant for an IFDEF to see if my unit is compiled in an application or into a package? Or do I have to create my own constant for this? Christian
  10. chkaufmann

    Memory Management with many objects

    I wanted to try your code, but I just realized that madCodeHook unit is not part of madExcept. So is there another way or code sample to hook these functions globaly? Christian
  11. chkaufmann

    Conditional Define for Packages

    This is not what I need. I need a constant so I can exclude code (and put some dummy code) when the unit goes to the package. Christian
  12. I create a handler where I want to subscribe / unsubscribe consumers: type TBSEvent<T> = reference to procedure(const obj: T); IBSRemoteMessageController = interface ['{1C7ECC50-3CA2-41A0-B230-0E9FE4CF9BE4}'] procedure Subscribe(AHandler: TBSEvent<IBSRemoteMessage>); procedure Unsubscribe(AHandler: TBSEvent<IBSRemoteMessage>); end; Now in my implementation of IBSRemoteMessageController I keep a list of these events. Unfortunately it looks like when I try to Unsubscribe() I get a different pointer even if I pass the same method. The only solution I see here is, that I return a key with the Subscribe() method and then pass this key to Unsubscribe(). Or is there a different solution for this problem? Regards Christian
  13. chkaufmann

    THTTPCommandType - PATCH

    I'm about to build a REST API using a TIdHTTPServer. Now even in the latest version of Indy the command PATCH is not listed in THTTPCommandType. Is there a reason for that? Or should a just use PUT for all update requests? To be honest when I read in the internet about the differences for PUT, PATCH and POST there are no unique opinions. So maybe I just use POST do add items and PUT for any updates (partial and complete). Regards Christian
  14. chkaufmann

    TPopupMenu with group headers

    Hi, I would like to add group headers in a TPopupmenu. So I can create things like this: Are there any properties I didn't find yet in the standard VCL? Or can I do that with some additional methods in a TPopupMenu subclass? Christian
  15. Hi, on my computer I have Kaspersky install by default and I cannot change that. I cannot even change any of the settigs, it's all under control of the system administrators. They already added my major application (EXE file) as exception under "Trusted applications" but I still have the feeling it takes forever after compiling until linking is done and my application started. Personally I would like to stop Kaspersky completely, but no chance for that. So is there another setting that should be changed on a developer machine? Regards Christian
  16. chkaufmann

    Cyrillic characters in URL

    I use a TIdHTTPServer and have problems with decoding GET variables. The url in the browser looks like this (contains cyrillic characters): Then in the RequestInfo the UnparsedParam and the QueryParams have the value 'search=%D0%90%D0%BD%D1%82%D0%BE%D0%BD&language=ru' In DecodeAndSetParams this is parsed but I don't get the correct results: The request comes from the browser and I didn't change any properties. So I'm not sure how to proceed. I think Indy uses the wrong encoding but I'm not aware, where I can change that? And will all browser use the same encoding? Or do I have to Parse the QueryParams myself? Christian
  17. chkaufmann

    Cyrillic characters in URL

    So this fix will be with the Indy version that comes with Delphi 11? Christian
  18. chkaufmann

    Cyrillic characters in URL

    I think, I found the answer myself now: https://stackoverflow.com/questions/24861793/indy-http-server-url-encoded-request When I add this code, my search string is correct. So probably nothing changed here since 2014. Christian
  19. Hi, I use ExtractHeaderFields() from Web.HttpApp when I parse a post upload. With the following value for "Content" (containing special german characters) this function fails: 'form-data; name="File1"; filename="Test1MitäÄ-Umlaut.pdf"' I get this error: System.SysUtils 33477 TEncoding.GetString System.NetEncoding 1007 TURLEncoding.Decode Web.HTTPApp 2108 ExtractHeaderFields Now I'm not sure if the input is wrong or if I have to use a different function to parse the content of this header (Content-Disposition:). Thanks for any help. Christian
  20. chkaufmann

    ExtractHeaderFields with special characters

    I use Delphi 10.4.2 and the Indy library coming with the default installation. I found that I can set the "Decode" parameter of ExtractHeaderFields() to false, then it works fine. Christian
  21. chkaufmann

    ExtractHeaderFields with special characters

    Ok, the request that comes with this malformed Content-Disposition is created by another Delphi application where I use Indy components. The code looks like this: mPartStream := TIdMultiPartFormDataStream.Create; postDataStream := mPartStream; FHttp.Request.ContentType := mPartStream.RequestContentType; for ix := 0 to FPostNames.Count -1 do begin if FPostFiles[ix].IsNull then mPartStream.AddFormField(FPostNames[ix], FPostValues[ix], 'UTF-8').ContentTransfer := '8bit' else mPartStream.AddFile(FPostNames[ix], FPostFiles[ix].PathName, FPostContentTypes[ix]); end; FPostFiles[ix].PathName is the Windows path of a file. Should I encode it on my side? Or do I have to set another parameter to ensure correct encoding? Christian
  22. chkaufmann

    IDE Memory Usage

    I'm still working with Delphi 10.4.2 and I noticed, that there are two processes DelphiLSP.exe and both take a lot of memory. In addition there is bds.exe which isn't small either. Is this "by default" or can I change that with changing any of my options? Christian
  23. chkaufmann

    TPopupMenu with group headers

    Both "problems" are solved by setting Enabled=False for the group header item. Like this the color never changes and clicks on it are ignored. Christian
  24. chkaufmann

    TPopupMenu with group headers

    Thanks for all hints. I created a subclass of TMenuItem and did an override of the AdvancedDrawItem method. In addition I set Enabled=False. Themes are not support, but I don't have that anyway in my application. But so far it looks fine: procedure TMenuGroupItem.AdvancedDrawItem(ACanvas: TCanvas; ARect: TRect; State: TOwnerDrawState; TopLevel: Boolean); begin ACanvas.Brush.Color := TColors.Silver.Lighten(50); ACanvas.FillRect(ARect); ACanvas.Font.Color := TColors.SysWindowText; ACanvas.TextRect(ARect, ARect.Left + 3, ARect.Top + 3, StripHotkey(Caption)); end; Christian
  25. I have a generic method that requires an enumeration type and a value in this enumeration. Right now my function definition looks like this: procedure Foo(ASetType: PTypeInfo; ADefault: Integer); This works fine. With GetTypeData() I can extract what I need (number of elements in enumeration). However, in the usage of this function I have to add TypeInfo() and Ord() each time: type TSet1 = (a11, a12, a13); TSet2 = (a21, a22, a23) then I can call: Foo(TypeInfo(TSet1), Ord(a12)); Foo(TypeInfo(TSet2, Ord(a23)); My question is, how to define the two parameters in order to avoid the TypeInfo() and the Ord() each time? Christian
×