-
Content Count
2510 -
Joined
-
Last visited
-
Days Won
127
Everything posted by Anders Melander
-
I might very well be wrong; I don't know enough about GDPR to say otherwise and I should probably keep my mouth shut about the topic. However, I do have some experience with GDPR having worked at medical device- and a pharmacy POS suppliers, with direct access to client/patient data. Only people who had been given permission to act as an agent of the user/customer were allowed to access user data. My point was not that the screenshot wasn't a GDPR violation but that it wasn't much different from the rest of the bug report. I agree; If the application just gathers data (screenshot or not) and sends it of without user consent to a third-party, which haven't been given permission to act as an agent of the user, then yes, there's definitely potential for a violation. But if the end-user is given opportunity to review the data then I believe it's their problem. With madExcept it's possible to have the user review the bug report data, and the screenshot if there is one, before it is sent. I can't remember if EurekaLog has a similar feature.
-
How to get the version of Delphi that the App is built with?
Anders Melander replied to Ian Branch's topic in General Help
...and still not relevant to the OPs request -
I don't think they understand what GDPR is about. Sending the screenshot would not be any different from sending a call stack or whatever else is in the bugreport. How the receiver treats the data is where GDPR becomes relevant.
-
Ah... Me neither 🙂
-
Don't you have the source?
-
How to get the version of Delphi that the App is built with?
Anders Melander replied to Ian Branch's topic in General Help
If you contact a developer I'm sure they can figure out a way to translate this, uniquely identifying number, to a string value of your choice. -
How to get the version of Delphi that the App is built with?
Anders Melander replied to Ian Branch's topic in General Help
You can use the CompilerVersion constant. See system.pas The question really is: Why do you need this information at all? The users doesn't need it and supposedly you yourself know which version you used... -
Buying a mini pc to install Delphi
Anders Melander replied to Alberto Paganini's topic in Tips / Blogs / Tutorials / Videos
I can't really recommend anything with regard to KVM switches as I haven't used one in ages. But don't buy cables that are longer than what you need 🙂 Make a mockup of the whole setup and then measure the required lengths. Cables that are too long can make a mess of even the best designed system. My own system consists of a desktop PC, a laptop (connected to a docking station via Thunderbolt 4), two monitors and a single wired keyboard and Bluetooth mouse. I mostly just use the docking station for charging the laptop and then use remote desktop to connect to it from my desktop system. Both monitors have multiple inputs so I have them both connected to both the desktop and the docking station and if I want to I can then switch the active input on the monitors between the two systems. The keyboard and mouse I have to switch manually. All in all a bit cumbersome so I rarely do it this way. -
Install package : NAME NOT FOUND in ProcessMonitor
Anders Melander replied to alogrep's topic in VCL
Dependency Walker is really old and isn't really up to the task anymore. We used to be able to run Delphi in Dependency Walker and have it trace the loading of DLLs but on my system it just hangs forever when loading bds.exe. I guess there are simply too many dependencies. It also appears that it doesn't know about the rules modern versions of Windows uses to locate and load DLLs. I think your best bet is to use Process Monitor to see which DLLs (or BPLs) it's looking for but can't find. Remember to filter on bds.exe and stop the trace once the error occurs. The two files you listed doesn't matter. Forget about those. For example in my Delphi I have the design-time package GR32_D290 installed. GR32_D290 depends on the run-time package GR32_R290. If I now delete (or rename) GR32_R290 I get the following when I start Delphi: and I get this in Process Monitor: bds.exe FASTIO_NETWORK_QUERY_OPEN C:\Users\Public\Documents\Embarcadero\Studio\23.0\Bpl\GR32_D290.bpl FAST IO DISALLOWED bds.exe IRP_MJ_CREATE C:\Users\Public\Documents\Embarcadero\Studio\23.0\Bpl\GR32_D290.bpl SUCCESS Desired Access: Read Attributes, Disposition: Open, Options: Open Reparse Point, Attributes: n/a, ShareMode: Read, Write, Delete, AllocationSize: n/a, OpenResult: Opened ...etc... followed by a lot of: bds.exe FASTIO_NETWORK_QUERY_OPEN D:\Development\Embarcadero\Studio\23.0\bin\GR32_R290.bpl NAME NOT FOUND bds.exe FASTIO_NETWORK_QUERY_OPEN C:\Windows\SysWOW64\GR32_R290.bpl FAST IO DISALLOWED bds.exe IRP_MJ_CREATE C:\Windows\SysWOW64\GR32_R290.bpl NAME NOT FOUND Desired Access: Read Attributes, Disposition: Open, Options: Open Reparse Point, Attributes: n/a, ShareMode: Read, Write, Delete, AllocationSize: n/a bds.exe FASTIO_NETWORK_QUERY_OPEN C:\Windows\System\GR32_R290.bpl FAST IO DISALLOWED bds.exe IRP_MJ_CREATE C:\Windows\System\GR32_R290.bpl NAME NOT FOUND Desired Access: Read Attributes, Disposition: Open, Options: Open Reparse Point, Attributes: n/a, ShareMode: Read, Write, Delete, AllocationSize: n/a bds.exe FASTIO_NETWORK_QUERY_OPEN C:\Windows\GR32_R290.bpl FAST IO DISALLOWED bds.exe IRP_MJ_CREATE C:\Windows\GR32_R290.bpl NAME NOT FOUND Desired Access: Read Attributes, Disposition: Open, Options: Open Reparse Point, Attributes: n/a, ShareMode: Read, Write, Delete, AllocationSize: n/a ...etc... I.e. one NAME NOT FOUND for each entry in the search path. -
You are inspecting the value of j too early; It hasn't been assigned a value yet. The debugger stops on the breakpoint at the location just before code is executed. Not after the code has been executed. If you step one line into the loop then j will have been assigned the initial value.
-
Any Delphi library for setting E-Core and P-Core Affinity for a process?
Anders Melander replied to wxinix's topic in Windows API
https://github.com/graphics32/graphics32/blob/e38452f2eeb1dd234cf6dae91edee51488453602/Source/GR32_System.pas#L146 // Set process affinity to exclude efficiency cores function SetPerformanceAffinityMask(Force: boolean = False): boolean; procedure RestoreAffinityMask; -
First of all, I can confirm that this happens. I'm responding to this old post because I just had to deal with this problem myself; Our product has had this bug for many years but it was low priority and none of the attempts to fix it had any success. Anyway, when calling BeginDrag(False): The drag isn't started until the mouse movement exceeds the configured threshold. The drag image is displayed immediately. #1 is as excepted and documented. #2 is a bug in the VCL and it's been there for decades. The way one would normally use BeginDrag(False) is from within a OnMouseDown event handler. Since the drag image is shown immediately, before a drag is detected or not, it means that simply clicking on the drag source will display the drag image and then immediately hide it again. Clearly not the intention. Like the VCL docking code, the dragdrop code is so convoluted that I imagine that the Embarcadero engineers would rather find a new job than try to fix it. Instead they changed the documentation so it's now unclear when the image is shown. In the end the only way to solve this is to avoid BeginDrag(False) and implement the start-drag logic manually. This means: Capturing the mouse. Monitoring mouse messages for mouse-up and mouse-move and detect movement beyond the drag threshold. Monitoring keyboard messages for the [Esc] key. Start the drag, regardless of movement, if the mouse stays down for 500mS. Luckily Windows provides us with a function that does all this for us: DragDetect Unfortunately DragDetect has some side-effects (and a few bugs of its own). Notably it eats the mouse-up message (WM_LBUTTONUP et al.). For us this was a problem because it meant that the control that was clicked (if it was indeed a click and not a drag) didn't get to handle mouse-up. In our case the control was a DevExpress grid and without the mouse-up message it became impossible to get a cell into edit-mode by clicking on it with the mouse; Not acceptable. So what to do? Well, I finally remembered that I had solved a similar problem, many, many years ago and, long story short, the solution is to use the DragDetectPlus function from the Drag and Drop Component Suite. procedure TMyForm.SomeControlMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); begin if (Button <> mbLeft) then exit; // Various additional logic to determine if we should initiate a drag goes here... // Initiate a drag (* Doesn't work; Drag image is shown immediately SomeControl.BeginDrag(False); *) (* Doesn't work; DragDetect eats WM_LBUTTONUP if DragDetect(SomeControl.Handle, ClientToScreen(Point(X, Y))) then SomeControl.BeginDrag(True); *) // This works; DragDetectPlus doesn't eat WM_LBUTTONUP if DragDetectPlus(SomeControl.Handle, ClientToScreen(Point(X, Y))) then SomeControl.BeginDrag(True); end; With this solution the drag is only started, and the drag image is only shown, when and if the mouse is moved (or the time expires) - and the mouse-up event is left in the message queue.
-
It is. Just make sure throttling is disabled in the BIOS so the CPU runs at full speed all the time. Otherwise it will try conserve energy by throttling the CPU when it thinks you don't need performance.
-
My old car consumed 7 liters of diesel per 100 km. The new one only uses 3.5 liters of diesel per 100 km. There must be something wrong with the engine... If your whole system was 100% CPU bound, and able to utilize all cores without any contention, then there would be something to talk about - but it isn't. There's also RAM, disk, bus and controller performance to take into account. As we have tried to explain, you need to look at the amount of work being done and not the CPU %. You can use the system performance monitor if you really want to find out what your system is doing and what, if anything, is preventing it from running at 100% CPU. But you will have to read up on a lot system internals in order to know what to look at and how to interpret the data. Doing what exactly?
-
Buying a mini pc to install Delphi
Anders Melander replied to Alberto Paganini's topic in Tips / Blogs / Tutorials / Videos
A customized Windows from China (if that's where the system is from)... That right there would be enough for me to wipe it. I can't speak for Lars, but before Space Karen took the title, I Bezos was a bit of a real life Bond villain (okay he still is, but it's nothing compared to Elon). There are still a lot of ethical problems with how Amazon treat their work force and their suppliers. And then there's the recent Washington Post debacle. These idiots just can't stay likable. That said, Amazon's return policy and customer service is second to none and it's the only place where I can get English language books in hardcover for a reasonable price (I'm in Denmark). Fair enough but like everything else (except maybe death), the only way to overcome that is to try it and learn from the experience. But I can understand if you'd rather use your time and energy on something else. I think the last system I bought ready-made, apart from laptops, had a 80386 processor and 16Mb RAM. I've built a few lemons along the way but it's been a while since the last one. By the way, one thing that you should do when looking at a new system is compare the CPU with the one in your existing system. Although a new system most likely has a newer CPU it might not be faster than what you have now. For example the processors in the two systems you listed are mobile processors optimized for low power consumption (it has a nominal clock speed of 0.7 GHz!), while your existing system likely has a desktop processor which likely is optimized for performance. https://www.cpubenchmark.net/cpu.php?cpu=Intel+N100&id=5157 -
ANN: DocInsight 2025 Public Beta Release and Licensing Migration
Anders Melander replied to baoquan.zuo's topic in Delphi Third-Party
😕 -
Throttling makes the CPU run slower, not run less. You can't measure performance by looking at the task manager. Measure the amount of work being done instead.
-
TextToShortcut is the problem here, if you can call it that. It compares the shortcut text against some resourcestrings ("Shift+", "Ctrl+", etc.) and if those resourcestrings have been translated then the shortcut strings must also be translated. As far as I can tell (contrary to what I claimed above), if the OP isn't translating anything, then there should be no problem. I would test to make sure, though.
-
The text is what get stored in the DFM. The actual shortcut is created from that and stored at run-time in the Objects pointer list: function TShortCutList.Add(const S: String): Integer; begin Result := inherited Add(S); Objects[Result] := TObject(TextToShortCut(S)); end;
-
Buying a mini pc to install Delphi
Anders Melander replied to Alberto Paganini's topic in Tips / Blogs / Tutorials / Videos
It's a very nice system but the refurbished ones I have been able to find are a bit expensive for what you get. I couldn't find any with more than 8Gb RAM although the max is 16Gb. -
Secondary shortcuts are stored as strings in a TStringList so if whatever translation tool you are using supports TStringList then it can be localized. edit: I can see that the SO post you linked already explains all this and it wasn't what you asked about. My guess is that, yes, if the users locale is German then English shortcuts won't work. It pretty easy to test for your self; Just change the UI language in Windows.
-
Buying a mini pc to install Delphi
Anders Melander replied to Alberto Paganini's topic in Tips / Blogs / Tutorials / Videos
This might sound crazy, but hear me out 🙂 Buy: A nice Mini-PC mainboard with integrated graphics. A CPU, some RAM, NVMe SSD. The smallest fanless PSU that meets the power requirements of the above. Put it all in cardboard box (or whatever). Remember to make some holes for airflow. Profit! You can do this really cheap and I can testify, from personal experience, that it is a possible setup. I once worked on a system a bit like this for six months. I didn't implement the luxury version with the cardboard box though. Instead I just placed the mainboard (which was full AT size) on a wooden breadboard and bolted all the components to it. Why did I do this, you ask? Well, my wife had a meltdown over something related to time spent with her vs. time coding (Women, pfft! 🙄 Amiright?) and completely smashed my full tower case with a rolling pin, I shit you not. Anyway, of course you still have to decide on the specs for the components but you will have to figure that out for yourself. It's impossible to give any clear recommendations as the specs will depend on what and how you use the system. Just get the best you can within your budget. -
Buying a mini pc to install Delphi
Anders Melander replied to Alberto Paganini's topic in Tips / Blogs / Tutorials / Videos
How does that address "I am thinking of buying a mini PC"? -
Simole threads providing progress info
Anders Melander replied to uligerhardt's topic in RTL and Delphi Object Pascal
Okay, so I would recommend that you simply start with the RTL TThread. Mainly because it appears that you have no prior threading experience (or you probably wouldn't have asked in the first place) and it would be best to learn the basics before trying something more advanced. Threading might seem easy but it's actually really difficult if you don't know and understand the many things that can go wrong. I would also avoid the various 3rd party threading libraries, even though I'm sure they can do some nice things, so you don't introduce external dependencies and get locked in to their way of doing things. Once you know a bit more you can make an educated decision about which way to go. The PPL was introduced in XE7 but I think it took a while for it to become reliable(ish). I stayed clear of all the versions between XE2 and Delphi 10 so I don't have first-hand experience with those versions. These days I seldom use TThread directly. Most of my thread tasks are short lived so they benefit from the TTask thread pool (and TTask is just so much nicer to use). -
You might be right but that's not the impression I get from the topics posted.