-
Content Count
1073 -
Joined
-
Last visited
-
Days Won
23
Everything posted by aehimself
-
Way for external app to jump to a unit and position inside the IDE?
aehimself replied to domus's topic in Delphi IDE and APIs
That's a pity. Unfortunately the source of TEditControl and TCustomEditControl is buried somewhere so we can not be sure what it can do, what it will reply to. Worths a try though, maybe... -
Where is the link to register to the forum?
aehimself replied to FPiette's topic in Community Management
And here I thought the chatgpt hype died down already. Got proven wrong yet again š -
Where is the link to register to the forum?
aehimself replied to FPiette's topic in Community Management
Stupid questionā¦ can we integrate SpamAssassin or a similar (automatic) content checking to trigger flagging posts (posters) as spam? -
Way for external app to jump to a unit and position inside the IDE?
aehimself replied to domus's topic in Delphi IDE and APIs
To open a file you can use DDE, which @Attila Kovacs got working some time ago: As for repositioning, you can try to get the handle of the editor control and send a EM_SETSEL message. That would be my approach, that is. -
Resource strings are prefixed with the unit name they are in; so it should be named LocNavigator_pumAutoIns It must be there. Never met any resource string left out by BTM.
-
Parsing Json to retrieve nested record
aehimself replied to bzwirs's topic in Network, Cloud and Web
Including the checks if a specific branch exists or not, you also can use the built-in System.Json unit: Var jo, coinmech: TJSONObject; recenum, tubeenum: TJSONValue; records, tubes: TJSONArray; begin jo := TJSONObject(TJSONObject.ParseJSONValue(Memo1.Text)); If Not Assigned(jo) Then Exit; Try records := jo.GetValue<TJSONArray>('records'); If Not Assigned(records) Then Exit; For recenum In records Do Begin coinmech := recenum.GetValue<TJSONObject>('coin_mech'); If Not Assigned(coinmech) Then Continue; tubes := coinmech.GetValue<TJSONArray>('tubes'); If Not Assigned(tubes) Then Continue; For tubeenum In tubes Do Begin WriteLn('Tube found, ID:' + tubeenum.GetValue<String>('tube_id')); // ... // Add a new record in a MemTable...? End; End; Finally FreeAndNil(jo); End; The code can be siplified significantly but this way you can see what is happening, how TJSONObject handling works. The code above produced the following output: -
Where is the link to register to the forum?
aehimself replied to FPiette's topic in Community Management
Might still be disabledā¦? @Daniel can confirm this. -
get idDrink out of database , based on what is clicked in listbox
aehimself replied to grantful's topic in Databases
While it works, storing and using data in the UI is never a good idea. If one day you want to change the ListBox to something else youāll have to rewrite the whole logic. Iād suggest parsing (deserializing) the JSON into your custom class, filling the ListBox and extracting the ID from there when needed. -
Short answer: never. Long answer: there are always code breaking changes in code or in protocols which will make older applications to be unable to communicate with never versions. This is why - if you really can not upgrade - we are using virtual machines with legacy OS-es hosting legacy applications. As ESXi is free you can also have your āmuseumā built this way but be aware that these legacy systems are usually extremely vulnerable to attacks in todays world.
-
I am using DCPCrypt in 64 bit applications without any issues but I remember that I had to dig for a package as there was one which didnāt compile. Iāll check later today which version Iām using and where exactly I downloaded it from. Edit: ReadMe simply say I'm too using v2 but I cannot find any reference to the sub version number. I still need to confirm this somehow but I think I'm using the SourceForge version. Do you have a code snipplet which fails to compile or it's the package itself? Edit-edit: my archive which has the source is called "dcpcrypt-code-r16-trunk.zip". So I'm pretty sure it's the SourceForge version š
-
Loading A Project (DevExpress Behemoth Installed)
aehimself replied to a topic in Delphi IDE and APIs
Thats very subjective, isnāt it? š DevExpress indeed slows down Delphi - which is perfectly normal as it adds hundreds of components to the palette. But in my experience this only affects the load time of the IDE itself, not the appearance of your first form / unit on the screen! Which one you have an issue with? -
Use TJsonValue.AsString instead of .ToString and your values will be properly converted and dequoted.
-
How to declare an entire set of numbers as a condition
aehimself replied to Willicious's topic in Delphi IDE and APIs
A set has its limitations but can work in some cases. But you also can use Case: Case myInteger Of: 0, 15, 1999, 65535: Begin // DoSomething End; Else Exit; End; -
You simply can iterate through the members of the array, like: Var jval: TJsonValue; jarr: TJsonArray; begin // jarr := myJson.GetValue(ādrinksā) As TJsonArray; for jval in jarr do // ā¦ end; p.s.: sorry, I can not find how to format as code from my phone š
-
Instead of āSELECT * FROM MyTable WHERE ID = 99ā use āSELECT * FROM MyTable WHERE ID = :pIDā, then assign the value 99 for the parameter named pID.
-
Please enter a valid Embarcadero serial number message
aehimself replied to JohnLM's topic in Delphi IDE and APIs
A .dproj file refers to a Delphi project but the error message says itās looking for a C++ builder license. Iām not sure what to do with this information though; is it possible that your file associations are off? You can reset all associations from the Tools menu somewhere, you can give it a try if Delphi is starting up without a project. -
64-bit VCL App hangs for an extended period during termination
aehimself replied to Attila Kovacs's topic in Delphi IDE and APIs
Try updating your external dependencies. I had the very same issue with an older MySQL driver a while ago. -
Minimum code I used is: procedure TForm1.FormCreate(Sender: TObject); Var windowstyle: Integer; appthreadid: Cardinal; cmdhandle: THandle; Begin cmdhandle := FindWindow('ConsoleWindowClass', 'Command Prompt'); // Hide title bars and borders of launched application windowstyle := GetWindowLong(cmdhandle, GWL_STYLE); windowstyle := windowstyle - WS_CAPTION - WS_BORDER - WS_OVERLAPPED - WS_THICKFRAME; SetWindowLong(cmdhandle,GWL_STYLE,windowstyle); // Attach the container applications input thread to the launched ones, so that we receive user input appthreadid := GetWindowThreadProcessId(cmdhandle, nil); AttachThreadInput(GetCurrentThreadId, appthreadid, True); // Docking. Change the parent of the launched application WinApi.Windows.SetParent(cmdhandle, Self.Handle); SendMessage(Self.Handle, WM_UPDATEUISTATE, UIS_INITIALIZE, 0); UpdateWindow(cmdhandle); // Make the docked window fill all the client area of the container SetWindowPos(cmdhandle, 0, 0, 0, Self.ClientWidth, Self.ClientHeight, SWP_NOZORDER); // This prevents the parent control to redraw on the area of its child windows (the launched application) SetWindowLong(Self.Handle, GWL_STYLE, GetWindowLong(Self.Handle, GWL_STYLE) Or WS_CLIPCHILDREN); // SetForegroundWindow(WindowHandle); // SetFocus(WindowHandle); End; This does not take care of resizing the docked window if the form resizes and you also have to keep an eye on if / when your docked application closes. Also it includes no error checking / handling. The result is as expected:
-
PING -t will continue to ping until you manually terminate it (usually Ctrl-C in your window). The code above does what it is told - read until the process ends; but the process will never die due to the -t switch. As your main thread is stuck in this loop you have but a handful of options: - Introduce a counter in the cycle. Exit the repeat-until cycle when the counter reaches a specific amount - Start a secondary thread before the loop, passing the process handle to it. The secondary thread can then kill the process at any time, causing the loop to break - You also can use a timer but you have to inject a message pump in your inner loop - Move this method to a thread and spam it across with "If Self.Terminated Then Exit". Start your thread and kill it any time from your main application with mythread.Terminate I'd go with option 4 as that is going to leave the UI useable during execution.
-
SMComponents does that and their grid comes with many other interesting features while being as simple as possible. It's even free...! I almost ended up replacing my own DBGrid descendant with these when I had enough of tinkering around trying to fix it's issues š
-
TNetHttpRequest.ContentStream Save To File
aehimself replied to egnew's topic in Network, Cloud and Web
Yes, it is exposed as TStream, but internally it's a TMemoryStream if I recall correctly. So yes, typecasting is needed. -
TNetHttpRequest.ContentStream Save To File
aehimself replied to egnew's topic in Network, Cloud and Web
AFFAIK it's a TMemoryStream, so you simply can call ContentStream.SaveToFile. You also can create a separate TFileStream and use .CopyFrom(ContentStream). just make sure position is 0 before calling .CopyFrom. -
Digest Authentication in THttpCli
aehimself replied to Vitao's topic in ICS - Internet Component Suite
In later Delphi versions there's a build in record for this, System.Hash.THashSHA2. If available, you also can use this so it doesn't depend on a DLL. Maybe v10+, I'm not sure though. -
As far as I know FireDac is present in Professional but you only get the sources in Enterprise. Having the sources can help you to debug issues or easily create your own descendants of it's components in case you need to extend functionality. If you need the sources but can not / don't want to upgrade to Enterprise you always can install a 3rd party library like Zeos.